Ricerca max e min in un vettore

galles90
Buonasera,

sto provando a realizzare un algoritmo in fortran, il quale mi deve restituire il massimo e il minimo di un vettore A.
Riporto il code sia del programma chiamante, e sia delle singole procedure per determinare il massimo e il minimo del vettore A.

In verità ho provato l'algoritmo, alternando le chiamate, nel senso che, ho escluso in primo momento call massimo e facendo rimanere call minimo cosi facendo ho notato che l'algoritmo funziona, poi facendo il viceversa, ho notato che l'algoritmo continua a funzionare per cui presumo che il problema sia dovuto ad un errore di sintassi o di costrutto, spero che qualcuno mi dia un'indicazione su come procedere.

Algoritmo chiamante

program mainricercamassimominimo
integer:: n
real:: a(100),h(100),c,l
read*, n
call minimo (n,a,c)
call massimo (n,h,l)
print*,c,l
end


procedura min

subroutine minimo (m,b,f)
real:: b(m)
integer:: i,m
do i=1,m
read*, b(i)
num=b(i)
if(num<f) then
f=num
end if
end do 
end


procedura man

subroutine massimo (m,b,f)
real:: b(m)
integer:: i,m
do i=1,m
read*, b(i)
num=b(i)
if(num>f) then
f=num
end if
end do 
end 



Infine mi fa inserire 2n volte i dati, facendo cosi mi da i valori corretti.

Risposte
vict85
Non capisco perché inserisci i dati due volte. Dovresti inserire i dati nel main (o in una subroutine separata) e nelle due subrouting di massimo e minimo solo calcolare i valori.

galles90
Ciao vict85, si ho fatto diversi tentativi varie volte, ho risolto poco prima.
Ora sembra che vada bene. Riporto il code

main
program mainricercamassimominimo
!ricerca del massimo e del minimo in un vettore di lunghezza 'n'!
!dichiarazione delle variabili!
integer:: n
real:: a(100),p,k
!lunghezza vettore!
print*, 'ordine vettore'
read*, n
!lettura degli elementi !
do i=1,n
read*, a(i)
end do 
!Si fissano due elementi generici per confrontarli! 
p=a(1)
k=a(n)
!procedura!
call minimo (n,a,p)
call massimo (n,a,k)
!stampa!
print*, 'minimo vettore e massimo vettore'
print*, 'min=',p,'max=',k
end


procedure massimo
subroutine massimo (m,b,z)
integer:: i
real:: b(m)
do i=1,m-1
if(b(i)>z) then
z=b(i)
end if 
end do
end


procedure minimo
subroutine minimo (m,b,z)
integer:: i
real:: b(m)
do i=1,m-1
if(b(i)<z) then
z=b(i)
end if 
end do
end


Ora l'algoritmo sembra funzionare, sto leggendo su internet i tempi di esecuzione di un algoritmo, non mi è molto chiara questa nozione, mi potresti dare quale dritta ? Inoltre è possibile raffinare i tempi per questo algoritmo, cioè si potrebbe renderlo migliore ?

Non sono molto pratico su questa materia, quindi non so nemmeno se la domanda è posta bene.. capiscimi :smt023

vict85
Non sono pratico di fortran. Insomma lo capisco abbastanza da sapere quello che stai facendo ma non molto di più. Dal punto di vista dell'algoritmo non puoi fare di meglio: per trovare il minimo devi come minimo comparare il risultato con ogni altro elemento dell'array. Pertanto l'algoritmo è O(n). Stessa cosa per il massimo. Volendo puoi calcolare minimo e massimo in un solo passaggio, ma non mi preoccuperei molto.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.