PDA

View Full Version : una mano per il fortran 77


thotgor
13-05-2005, 12:20
chi mi da una mano a convertire questo programma in fortran 90 a fortran 77?


Program gittata
!Programma per il calcolo della distanza percorsa da un proiettile
!sparato con una velocit iniziale ed un angolo theta rispetto al suolo.

IMPLICIT NONE

! Dichiarazione dei parametri
REAL, PARAMETER :: gradi_rad = 0.01745329 ! Da gradi a rad

! Dichiara le variabili
REAL :: gravity = -9.81 ! Accelerazione di gravità (m/s*s)
INTEGER :: max_degrees ! Angolo di massima gittata (gradi)
REAL :: max_range ! Massima gittata alla velocità vO (metri)
REAL :: range ! Gittata con un dato angolo (metri)
REAL :: radian ! Angolo iniziale (in radianti)
INTEGER :: theta ! Angolo iniziale (in gradi)
REAL :: v0 ! Velocità del proiettile (in m/s)


! Inizializza le variabili.
max_range = 0.
max_degrees = 0
v0 = 20.

! Calcolo ciclico per ogni angolo.
loop: DO theta = 0, 90

! Angolo in radianti.
radian = real (theta) * gradi_rad

! Calcola la gittata in metri
range = (-2.* v0**2 / gravity) * sin(radian) * cos(radian)

! Visualizza il valore della gittata per questo angolo.
WRITE (*,*) 'THETA= ' , theta, ' gradi; Gittata = ', range, ' metri '
! Confronta la gittata corrente con la gittata massima precedente.
! Se la gittata corrente è maggiore, salva il suo valore
! e l'angolo corrispondente.
IF ( range > max_range ) THEN
max_range = range
max_degrees = theta
END IF
END DO loop
! Lascia una riga vuota e visualizza la gittata massima
! e l'angolo corrispondente.
WRITE (*,*) ''
WRITE (*,*) 'Gittata massima = ', max_range, ' a' , max_degrees, ' gradi'

END PROGRAM


Grazie, vi giuro!

peter2
18-07-2005, 22:18
così dovrebbe andare...


Program gittata
!Programma per il calcolo della distanza percorsa da un proiettile
!sparato con una velocit iniziale ed un angolo theta rispetto al suolo.

IMPLICIT NONE

! Dichiarazione dei parametri
PARAMETER (gradi_rad = 0.01745329) ! Da gradi a rad

! Dichiara le variabili
REAL gravity ! Accelerazione di gravità (m/s*s)
INTEGER max_degrees ! Angolo di massima gittata (gradi)
REAL max_range ! Massima gittata alla velocità vO (metri)
REAL range ! Gittata con un dato angolo (metri)
REAL radian ! Angolo iniziale (in radianti)
INTEGER theta ! Angolo iniziale (in gradi)
REAL v0 ! Velocità del proiettile (in m/s)

gravity = -9.81

! Inizializza le variabili.
max_range = 0.
max_degrees = 0
v0 = 20.

! Calcolo ciclico per ogni angolo.
DO theta = 0, 90

! Angolo in radianti.
radian = float(theta) * gradi_rad

! Calcola la gittata in metri
range = (-2.* v0**2 / gravity) * sin(radian) * cos(radian)

! Visualizza il valore della gittata per questo angolo.
WRITE (*,*) 'THETA= ' , theta, ' gradi; Gittata = ', range, ' metri '
! Confronta la gittata corrente con la gittata massima precedente.
! Se la gittata corrente è maggiore, salva il suo valore
! e l'angolo corrispondente.
IF ( range.GT.max_range ) THEN
max_range = range
max_degrees = theta
ENDIF
ENDDO
! Lascia una riga vuota e visualizza la gittata massima
! e l'angolo corrispondente.
WRITE (*,*)
WRITE (*,*) 'Gittata massima = ', max_range, ' a' , max_degrees, ' gradi'

stop
end

Ziosilvio
19-07-2005, 14:30
Dunque dunque dunque... il Fortran 77 attribuisce un significato speciale alle colonne: le prime 5 sono per il numero di riga, la sesta per l'indicatore di prosecuzione di riga, quelle da 7 a 72 per il codice... i commenti sono su una riga sola che comincia con una "C" alla prima colonna... vediamo...
program gittata
c
c Programma per il calcolo della distanza percorsa da un proiettile
c sparato con una velocit iniziale ed un angolo theta rispetto al suolo.
c
implicit none
c
c Dichiarazione dei parametri
c gradi_rad = conversione da gradi a radianti
c gravity = accelerazione di gravita'
c
real gradi_rad,gravity
parameter (gradi_rad=0.01745329,gravity=-9.81)
c
c Dichiarazione delle variabili
c max_degrees = angolazione massima, in gradi
c theta = angolo iniziale, in gradi
c max_range = gittata massima alla velocita' v0, in metri
c range = gittata con un angolo dato, in metri
c radian = angolo iniziale, in radianti
c v0 = velocita' iniziale, in m/s
c
integer max_degrees,theta
real max_range,range,radian,v0
c
c Inizializzazione variabili
c
max_range=0
max_degrees=0
v0=20
c
c Calcolo ciclico per ogni angolo
c
do 10 theta=0,90
c
c Angolo in radianti.
c
radian=theta*gradi_rad
c
c Calcola la gittata in metri
c
range=((-2.* v0**2)/gravity)*sin(radian)*cos(radian)
c
c Visualizza il valore della gittata per questo angolo.
c
write(*,*) 'Theta= ',theta,' gradi; Gittata= ',range,' metri'
c
c Confronta la gittata corrente con la gittata massima precedente.
c Se la gittata corrente è maggiore, salva il suo valore
c e l'angolo corrispondente.
c
if (range.gt.max_range) then
max_range=range
max_degrees=theta
endif
10 continue
c
c Lascia una riga vuota e visualizza la gittata massima
c e l'angolo corrispondente.
write(*,*) ''
write(*,*) 'Gittata massima = ', max_range, ' a' , max_degrees, ' gradi'
c
c Fine programma
c
stop
end
Come avrai notato, gli operatori di confronto hanno una sintassi diversa; inoltre, se ricordo bene, come strutture di controllo ci sono solo if, goto, e for (con una sintassi simile a quella del goto).
Se trovo una guida sul Web, te la segnalo.