View Full Version : [Fortran] Indovinello
Chi sa già la risposta è pregato di non rispondere, gli altri provino a indovinare l'output di questo banalissimo programma:
program test
implicit none
integer i,j,k
i=1
j=3
do k = i,j
write(*,*) k
end do
write(*,*) k
end
Forse sarà che sono noob, ma ciò mi lascia basito...
non conosco il fortran però mi butto:
1
2
3
3
ho indovinato?
non conosco il fortran però mi butto:
1
2
3
3
ho indovinato?
No, magari fosse come dici te, non avrei perso un sacco di tempo per scoprirlo...
ah beh, allora ci stai ingannando!! avevi detto "banalissimo":D
P.S.: che brutta sintassi il fortran, non invidio i fisici! (che nella mia università studiano fortran)
wingman87
13-11-2009, 20:25
Provo anch'io dai...
1
3
3
oppure
1
1
Provo anch'io dai...
1
3
3
oppure
1
1
umh... spiega spiega, non capisco :confused:
wingman87
13-11-2009, 21:08
umh... spiega spiega, non capisco :confused:
Premetto che non conosco fortran. Dopo aver escluso la tua soluzione per il primo ho pensato: k deve assumere i valori i e j, quindi 1 e 3 e poi all'uscita dal ciclo vale ancora 3.
Per la seconda invece ho pensato: è un do ma senza condizioni (non conoscendo la sintassi del fortran) quindi fa la prima assegnazione k=1, stampa 1 e poi esce dal ciclo e stampa di nuovo 1.
Ora però mi verrebbe da dire anche
3
3
perché potrebbe assegnare a k i ma subito dopo j e sovrascriverla...
Comunque l'ho buttata lì... sinceramente non capisco neanche a cosa serva quel (*,*) nel write
write(*,*) serve solo per stampare a video, nulla di esotico
comunque non avete indovinato :ciapet:
write(*,*) serve solo per stampare a video, nulla di esotico
comunque non avete indovinato :ciapet:
Scrive K per il numero di cicli in do, ... da quel che ricordo 1,3 sono i valori iniziali e finali da porre nel contatore (K).
Quindi teoricamente scrive il valore di K (il contatore) ad ogni ciclata (deduco siano 2, da 1 a 3).
Sbaglio? :D
Scrive K per il numero di cicli in do, ... sbaglio? :D
cioè? intendi così?
k
k
k
k
no, scrive 3 numeri, i primi 3 li ha indovinati kurts ma l'ultimo è quello interessante :D
cioè? intendi così?
k
k
k
k
no, scrive 3 numeri, i primi 3 li ha indovinati kurts ma l'ultimo è quello interessante :D
Ovvio che non stampa le K ma il valore che prende... da 1 a 3... (quindi se mi dici che stampa tre numeri considera anche la terza posizione nello stato del ciclo :))
Quindi 1 3 3 dici?
L'ultimo... è quel write (*,*) k fuori dal ciclo.
Bisogna sapere come il linguaggio gestisce le variabili..
Ovvio che non stampa le K ma il valore che prende... da 1 a 3...
Hai editato, prima non avevo capito
L'ultimo... è quel write (*,*) k fuori dal ciclo.
Bisogna sapere come il linguaggio gestisce le variabili..
Esatto, il problema è proprio qua, la soluzione è poco intuitiva
Hai editato, prima non avevo capito
Lo so, avevo spiegato malissimo!
Esatto, il problema è proprio qua, la soluzione è poco intuitiva
Non so come alloca le variabili il linguaggio.
Secondo me o resta a (null) è dichiarato ma non ha un valore di riferimento, o assume l'ultimo valore del ciclo (3)... o non lo so. Io punto alla prima (null)
Secondo me o resta a (null) è dichiarato ma non ha un valore di riferimento, o assume l'ultimo valore del ciclo (3)... o non lo so. Io punto alla prima (null)
Nè (null) nè 3 :D
Vi do la soluzione?
Nè (null) nè 3 :D
Vi do la soluzione?
SPARA :D
wingman87
13-11-2009, 21:47
no, scrive 3 numeri, i primi 3 li ha indovinati kurts ma l'ultimo è quello interessante :D
Ah ok, io mi ero concentrato sul do... Beh, visto che 'sto do funziona tipo un ciclo for all'uscita k potrebbe valere 4 e quindi stampare 4.
1
2
3
pi greco
:O
scherzo :D
1
2
3
4
E ora, secondo indovinello.
Secondo voi, quanto ci ho messo io, niubbo che programma in Python da una decina di giorni e che conosce poco il Fortran e soprattutto era all'oscuro di questo arcano mistero, a tradurre questa subroutine da Fortran a Python???????
Tenete conto bisogna sistemare tutti gli indici perchè Python inizia a contare da 0, Fortran da 1 e perchè Python non elabora l'ultimo valore nel ciclo, mentre Fortran sì...
subroutine kersh(iout,nequ,nterm,ia,ja,sysmat,prec)
implicit none
integer iout,nequ,nterm
integer ia(nequ+1),ja(nterm)
integer i,j,k,kk,k1,i1,j1,k2
real*8 prec(nterm),sysmat(nterm)
real*8 a,zero
parameter (zero=0.0)
do k=1,nterm
prec(k) = zero
end do
do kk=1,nequ-1
k = ia(kk)
a = sysmat(k) - prec(k)
if(a.le.zero) then
write(iout,100) k,a
write(iout,101) prec(ia(kk-1))
a = (prec(ia(kk-1)))**2
end if
prec(K) = sqrt(a)
i = ia(kk) + 1
j = ia(kk+1) - 1
do k1 = i,j
prec(k1) = (sysmat(k1)-prec(k1))/prec(k)
end do
do k2 = i,j-1
j1 = ia(ja(k2))
prec(j1) = prec(j1) + prec(k2)**2
i1 = k2 + 1
j1 = j1 + 1
do while(j1.lt.ia(ja(k2)+1).and.i1.le.j)
if(ja(j1).eq.ja(i1)) then
prec(j1) = prec(j1) + prec(k2)*prec(i1)
i1 = i1 + 1
j1 = j1 + 1
else if (ja(j1).lt.ja(i1))then
j1 = j1 + 1
else if (ja(j1).gt.ja(i1))then
i1 = i1 + 1
end if
end do
end do
if(j.ge.i)
1 prec(ia(ja(j))) = prec(ia(ja(j))) + prec(k2)**2
end do
k = ia(nequ)
a = sysmat(k)-prec(k)
if(a.le.zero) then
write(iout,100) nequ ,a
write(iout,101) prec(ia(nequ-1))
a = (prec(ia(nequ-1)))**2
end if
prec(k) = sqrt(a)
return
100 format('*** Subroutine Kersh: diagonal',
1 ' element <= zero at position: ',I5,2X,E16.5)
101 format('***** using previous diagonal value: ',E16.8)
end
wingman87
13-11-2009, 21:54
1
2
3
pi greco
:O
:eek:
Ci sono cascato... burlone! :D
1
2
3
pi greco
:O
scherzo :D
1
2
3
4
E ora, secondo indovinello.
Secondo voi, quanto ci ho messo io, niubbo che programma in Python da una decina di giorni e che conosce poco il Fortran e soprattutto era all'oscuro di questo arcano mistero, a tradurre questa subroutine da Fortran a Python???????
Tenete conto bisogna sistemare tutti gli indici perchè Python inizia a contare da 0, Fortran da 1 e perchè Python non elabora l'ultimo valore nel ciclo, mentre Fortran sì...
subroutine kersh(iout,nequ,nterm,ia,ja,sysmat,prec)
implicit none
integer iout,nequ,nterm
integer ia(nequ+1),ja(nterm)
integer i,j,k,kk,k1,i1,j1,k2
real*8 prec(nterm),sysmat(nterm)
real*8 a,zero
parameter (zero=0.0)
do k=1,nterm
prec(k) = zero
end do
do kk=1,nequ-1
k = ia(kk)
a = sysmat(k) - prec(k)
if(a.le.zero) then
write(iout,100) k,a
write(iout,101) prec(ia(kk-1))
a = (prec(ia(kk-1)))**2
end if
prec(K) = sqrt(a)
i = ia(kk) + 1
j = ia(kk+1) - 1
do k1 = i,j
prec(k1) = (sysmat(k1)-prec(k1))/prec(k)
end do
do k2 = i,j-1
j1 = ia(ja(k2))
prec(j1) = prec(j1) + prec(k2)**2
i1 = k2 + 1
j1 = j1 + 1
do while(j1.lt.ia(ja(k2)+1).and.i1.le.j)
if(ja(j1).eq.ja(i1)) then
prec(j1) = prec(j1) + prec(k2)*prec(i1)
i1 = i1 + 1
j1 = j1 + 1
else if (ja(j1).lt.ja(i1))then
j1 = j1 + 1
else if (ja(j1).gt.ja(i1))then
i1 = i1 + 1
end if
end do
end do
if(j.ge.i)
1 prec(ia(ja(j))) = prec(ia(ja(j))) + prec(k2)**2
end do
k = ia(nequ)
a = sysmat(k)-prec(k)
if(a.le.zero) then
write(iout,100) nequ ,a
write(iout,101) prec(ia(nequ-1))
a = (prec(ia(nequ-1)))**2
end if
prec(k) = sqrt(a)
return
100 format('*** Subroutine Kersh: diagonal',
1 ' element <= zero at position: ',I5,2X,E16.5)
101 format('***** using previous diagonal value: ',E16.8)
end
Ma solo a me non sembra Python? :what:
Ma solo a me non sembra Python? :what:
appunto, è Fortran, io volevo tradurre la subroutine da Fortran a Python
appunto, è Fortran, io volevo tradurre la subroutine da Fortran a Python
Ah scusa :sofico: Che figuraccia, mi ritiro :D
scusa perché è strano?
quello che fa è questo
k = 1, k <= 3? si, allora stampa 1
k = 2, k <= 3? si, allora stampa 2
k = 3, k <= 3? si ,allora stampa 3
k = 4, k <= 3? no, allora vai avanti (ma k vale sempre 4!)
funziona così in qualsiasi linguaggio di programmazione avente questo tipo di costrutti. In python immagino tu fossi abituato ad usare la sintassi "for k in range(1,4)" ma in c, c++, java, php, ecc, ecc funziona esattamente come nell'esempio da te riportato :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.