|
|
|
![]() |
|
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: 2774
|
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: 2774
|
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: 2774
|
|
![]() |
![]() |
![]() |
#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: 2774
|
|
![]() |
![]() |
![]() |
#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: 14:33.