View Full Version : Problema stupido fortran scolastico
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
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.
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....
Penso che in questo caso lo scopo fosse trovare l'algoritmo più che la formula.
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)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.