PDA

View Full Version : Problema stupido fortran scolastico


Vul
19-09-2013, 16:48
Allora, devo fare un programma in linguaggio fortran che faccia una sommatoria da un numero a ad un numero b di numeri naturali dove i numeri glieli do io.

Esempio la sommatoria da 3 a 7 dovrebbe venire: 3+4+5+6+7 = 25

Il programma che ha fatto un mio collega, ma non viene è il seguente


program sommatoria fra due numeri
integer i
write (*,*) 'inserire due numeri a e b (con b>a)'
read (*,*) a,b
S=a
do i=a+1,b
S=S+1
enddo
write (*,*) 'la somma dei numeri compresi fra a e b è',S
pause
end


Il programma non funziona e onestamente non mi è nemmeno chiaro come funzioni l'indicizzazione.

[Kendall]
19-09-2013, 17:17
Allora, devo fare un programma in linguaggio fortran che faccia una sommatoria da un numero a ad un numero b di numeri naturali dove i numeri glieli do io.

Esempio la sommatoria da 3 a 7 dovrebbe venire: 3+4+5+6+7 = 25

Il programma che ha fatto un mio collega, ma non viene è il seguente


program sommatoria fra due numeri
integer i
write (*,*) 'inserire due numeri a e b (con b>a)'
read (*,*) a,b
S=a
do i=a+1,b
S=S+1
enddo
write (*,*) 'la somma dei numeri compresi fra a e b è',S
pause
end


Il programma non funziona e onestamente non mi è nemmeno chiaro come funzioni l'indicizzazione.

Il Fortran l'ho fatto milioni di anni fa, però il problema in questo caso è dell'algoritmo.
Guada la riga che ti ho messo in evidenza: lui in realtà per ogni valore dell'intervallo preso in considerazione non va a sommare il valore stesso (come il concetto di sommatoria prevede) ma va a incrementare semplicemente di 1 il valore di S.
Quella riga deve essere sostituita con questa:

S = S + i

Vul
19-09-2013, 17:22
wow, che schiappa che sono.

Ma la cosa bella non era il mio amico che aveva sbagliato ma io che ho letto un 1 al posto di una i....

vendettaaaaa
19-09-2013, 19:20
wow, che schiappa che sono.

Ma la cosa bella non era il mio amico che aveva sbagliato ma io che ho letto un 1 al posto di una i....
Scrivere con una formattazione degli spazi da cristiani avrebbe aiutato ad evitare questo strafalcione (e aiuterà in futuro a evitarne a palate, soprattutto visto che il FORTRAN è un linguaggio in cui i tipi delle variabili sono controllati MOLTO debolmente).

program sommatoria fra due numeri
integer i

write(*,*) 'inserire due numeri a e b (con b > a)'
read(*,*) a, b

S = a
do i = a + 1, b
S = S + i
enddo

write(*,*) 'la somma dei numeri compresi fra a e b è', S
pause

end
Consiglio uno stile simile: ben indentato, spazi tra gli operatori, con line break tra le parti di codice in cui si fanno compiti differenti.

Vul
19-09-2013, 20:45
grazie :)

Shirov
22-09-2013, 12:55
Però fatto così, con un ciclo do, mi pare una roba fortemente inefficente... se la somma riguardasse decine di milioni di numeri è troppo lento... normalmente la somma dei numeri da 1 a n si calcola con:

(n * (n + 1)) / 2

(es: la somma dei numeri da 1 a 6 non si fa come 1 + 2 + 3 + 4 + 5 + 6 ma (6 * 7) / 2)
quindi non è difficile arrivare ad una soluzione più efficiente anche ponendo di partire da un valore diverso da 1....

Storti
22-09-2013, 16:18
Penso che in questo caso lo scopo fosse trovare l'algoritmo più che la formula.

Vul
23-09-2013, 00:27
Si infatti, sono solo esercitazioni per farci imparare.

andythesniper
27-09-2013, 12:44
@shivor credo che la soluzione più efficace sia

(n_iniziale + n_finale) * ((n_finale - n_iniziale + 1) / 2)