|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Padova
Messaggi: 5905
|
[Fortran] Indovinello
Chi sa già la risposta è pregato di non rispondere, gli altri provino a indovinare l'output di questo banalissimo programma:
Codice:
program test implicit none integer i,j,k i=1 j=3 do k = i,j write(*,*) k end do write(*,*) k end |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 307
|
non conosco il fortran però mi butto:
1 2 3 3 ho indovinato? |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Padova
Messaggi: 5905
|
No, magari fosse come dici te, non avrei perso un sacco di tempo per scoprirlo...
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 307
|
ah beh, allora ci stai ingannando!! avevi detto "banalissimo"
P.S.: che brutta sintassi il fortran, non invidio i fisici! (che nella mia università studiano fortran) |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
Provo anch'io dai...
1 3 3 oppure 1 1 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 307
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
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 |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Padova
Messaggi: 5905
|
write(*,*) serve solo per stampare a video, nulla di esotico
comunque non avete indovinato
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
Quote:
Quindi teoricamente scrive il valore di K (il contatore) ad ogni ciclata (deduco siano 2, da 1 a 3). Sbaglio?
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Padova
Messaggi: 5905
|
Quote:
k k k k no, scrive 3 numeri, i primi 3 li ha indovinati kurts ma l'ultimo è quello interessante |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
Quote:
Quindi 1 3 3 dici? L'ultimo... è quel write (*,*) k fuori dal ciclo. Bisogna sapere come il linguaggio gestisce le variabili..
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Padova
Messaggi: 5905
|
Quote:
Esatto, il problema è proprio qua, la soluzione è poco intuitiva |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
Lo so, avevo spiegato malissimo!
Quote:
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)
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Padova
Messaggi: 5905
|
Quote:
Vi do la soluzione? |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Padova
Messaggi: 5905
|
1
2 3 pi greco scherzo 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ì... Codice:
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
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Quote:
|
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Padova
Messaggi: 5905
|
appunto, è Fortran, io volevo tradurre la subroutine da Fortran a Python
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:43.




















