PDA

View Full Version : [Fortran] Indovinello


Devil!
13-11-2009, 19:10
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...

kurts
13-11-2009, 20:13
non conosco il fortran però mi butto:
1
2
3
3

ho indovinato?

Devil!
13-11-2009, 20:18
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...

kurts
13-11-2009, 20:21
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

kurts
13-11-2009, 20:36
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

Devil!
13-11-2009, 21:22
write(*,*) serve solo per stampare a video, nulla di esotico

comunque non avete indovinato :ciapet:

vhost87
13-11-2009, 21:30
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

Devil!
13-11-2009, 21:33
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

vhost87
13-11-2009, 21:34
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..

Devil!
13-11-2009, 21:36
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

vhost87
13-11-2009, 21:39
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)

Devil!
13-11-2009, 21:40
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?

vhost87
13-11-2009, 21:41
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.

Devil!
13-11-2009, 21:48
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

ndakota
13-11-2009, 22:29
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:

Devil!
13-11-2009, 22:31
Ma solo a me non sembra Python? :what:

appunto, è Fortran, io volevo tradurre la subroutine da Fortran a Python

ndakota
13-11-2009, 22:38
appunto, è Fortran, io volevo tradurre la subroutine da Fortran a Python

Ah scusa :sofico: Che figuraccia, mi ritiro :D

Torav
13-11-2009, 22:40
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