Pagina 1 di 1

Ricerca max e min in un vettore

MessaggioInviato: 17/01/2019, 16:58
da 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

Codice:
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

Codice:
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

Codice:
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.

Re: Ricerca max e min in un vettore

MessaggioInviato: 18/01/2019, 14:50
da 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.

Re: Ricerca max e min in un vettore

MessaggioInviato: 18/01/2019, 16:30
da galles90
Ciao vict85, si ho fatto diversi tentativi varie volte, ho risolto poco prima.
Ora sembra che vada bene. Riporto il code

main
Codice:
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
Codice:
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
Codice:
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

Re: Ricerca max e min in un vettore

MessaggioInviato: 18/01/2019, 17:51
da 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.