Ricerca max e min in un vettore
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
procedura min
procedura man
Infine mi fa inserire 2n volte i dati, facendo cosi mi da i valori corretti.
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
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.
Ciao vict85, si ho fatto diversi tentativi varie volte, ho risolto poco prima.
Ora sembra che vada bene. Riporto il code
main
procedure massimo
procedure minimo
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
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

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.