Elementi di base del linguaggio Fortran
Transcript
Elementi di base del linguaggio Fortran
Elementi di base del linguaggio Fortran Paolo Bison Fondamenti di Informatica Ingegneria Meccanica Università di Padova A.A. 2008/09 Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.1 Linguaggio F sottoinsieme del Fortran 90 solo costrutti “moderni” senza duplicazioni sintassi descritta da BNFa a le produzioni relative al linguaggio F presenti in questi appunti sono tratte da “BNF Syntax of the FT M Programming Language”,Copyright (C) 1996 by Imagine1, Inc. Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.2 Evoluzione storica 1954 primo sviluppo presso IBM 1958 Fortran II con procedure, funzioni e common 1962 IBM introduce Fortran IV 1978 Fortran 77, standard ANSI ANSI X.39-1978, che introduce costrutti per la programmazione strutturata 1991 Fortran 90, standard ISO 1539:1991, che introduce ulteriori miglioramenti (ricorsione, strutture dinamiche) 1993 Proposta di standardizzazione HPF (High Performance Fortran) per il calcolo parallelo 1995 Fortran 95, standard ISO/IEC 1539-1:1997 Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.3 Formato sorgente formato libero del Fortran 90 insieme dei caratteri alfanumerici (a ... z, A ... Z, 0 ... 9) ().=,$%:<>?_"! una istruzione per linea (max 132 caratteri) commento ! fino a fine linea Fortran90 & concatenazione di linee ; separazione di istruzioni Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.4 Simboli singoli/concatenazioni di caratteri non alfanumerici * ** / == parole chiave (keywords) simboli costituiti da lettere (if, do, ...) riservate in F identificatori R304 name is letter [ alphanumeric-character ] ... R302 alphanumeric-character is letter or digit or underscore R303 underscore is _ Constraint:The maximum length of a name is 31 characters. Constraint:The last character of a name shall not be _ . Constraint:Names may be in mixed upper and lower case, however all references to the names shall use the same case convention. Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.5 Programma unità di programmazione sintassi R201 is R202 is or R1101 is R1102 is R1103 is program program-unit [ program-unit ] ... program-unit main-program module main-program program-stmt [ use-stmt ] ... [ intrinsic-stmt ] ... [ other-type-declaration-stmt ] ... [ execution-part ] end-program-stmt program-stmt PROGRAM program-name end-program-stmt END PROGRAM program-name Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.6 programma minimo program mini end program mini Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.7 Sezione esecutiva - 1 istruzioni sintassi R208 is R215 is or or or or execution-part [ executable-construct ] ... executable-construct action-stmt case-construct do-construct if-construct where-construct Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.8 Sezione esecutiva - 2 sintassi R216 is or or or or or or or or or or or or or or or or or or action-stmt allocate-stmt assignment-stmt backspace-stmt call-stmt close-stmt cycle-stmt deallocate-stmt endfile-stmt exit-stmt inquire-stmt nullify-stmt open-stmt pointer-assignment-stmt print-stmt read-stmt return-stmt rewind-stmt stop-stmt write-stmt Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.9 Stop terminazione esplicita del programma sintassi R840 stop-stmt is STOP program mini stop end program mini Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.10 Print visualizzazione del valore di espressioni sintassi R911 is R913 is or R915 is R420 is print-stmt PRINT format [ , output-item-list ] format char-expr * output-item expr char-literal-constant " [ rep-char ] ... " Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.11 Espressioni - 1 sintassi R723 expr is [ expr defined-binary-op ] level-5-expr .. . R713 R714 level-4-expr is [ level-3-expr rel-op ] level-3-expr rel-op is == or /= or < or <= or > or >= .. . Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.12 Espressioni - 2 sintassi (cont.) R706 R707 R709 R710 .. .R703 R701 add-operand is [ add-operand mult-op ] mult-operand level-2-expr is [ [ level-2-expr ] add-op ] add-operand mult-op is * or / add-op is + or level-1-expr is [ defined-unary-op ] primary primary is constant or variable . . . or ( expr ) costanti intere Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.13 Stampa numeri ! ! printnum.f90 ! stampa dei numeri a terminale ! program printnum print *,3,8,0 end program printnum Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.14 Stampa espressioni ! ! printexp.f90 ! stampa il valore di una espressione ! program printexp print *,5 + 3 / 2 end program printexp Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.15 Variabile individuata attraverso un identificatore associata univocamente ad un tipo linguaggio tipizzato esplicita dichiarazione del tipo associato alla variabile Fortran 90 - implicit none Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.16 Tipo elemento del linguaggio che definisce: un insieme di valori un insieme di operatori applicabili a tali valori notazione per le costanti usato per caratterizzare variabili e espressioni compatibilità/conversioni tra tipi Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.17 Dichiarazione di tipo sintassi R501 is R502 is or or or or or R504 is R505 is type-declaration-stmt type-spec [ , attr-spec ] ... :: entity-decl-list type-spec INTEGER [ kind-selector ] REAL [ kind-selector ] CHARACTER char-selector COMPLEX [ kind-selector ] LOGICAL [ kind-selector ] TYPE ( type-name ) entity-decl object-name [ initialization ] initialization = initialization-expr Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.18 Integer sottoinsieme finito degli interi I operatori + - * / ** costanti sequenza di cifre (es. 300 -234 ) rappresentazione finita min=-2147483648 max=2147483647 es. integer :: a,b=45,d d+b*89 Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.19 Istruzione di assegnazione sintassi R735 assignment-stmt is variable = expr compatibilità di tipo tipo espressione deve corrispondere al tipo associato alla variabile Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.20 assign ! ! assign.f90 ! esempi di istruzioni di assegnazione ! program assign integer :: a,b,c=30 a=c; b=a*56-c*7; c=a>b ! e’ corretta? print *,a,b,c end program assign Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.21 Lettura sintassi lettura R909 is or read-stmt READ ( io-control-spec-list ) [ input-item-list ] READ format [ , input-item-list ] input-item-list lista di variabili separate da , test sui valori letti Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.22 piu ! ! piu.f90 ! ! calcola la somma di due numeri ! program piu integer :: m,n,s read *,m,n s = m+n print *,s end program piu Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.23 Strutture di controllo struttura sequenziale block struttura di selezione if struttura iterativa do Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.24 block sequenza di istruzioni sintassi R801 is block [ executable-construct ] ... esempio a=b+c print *,a Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.25 if selezione/condizionale sintassi R802 is R803 is R804 is R805 is R806 is if-construct if-then-stmt block [ else-if-stmt block ] ... [ else-stmt block ] end-if-stmt if-then-stmt IF ( logical-expr ) THEN else-if-stmt ELSEIF ( logical-expr ) THEN else-stmt ELSE end-if-stmt ENDIF corrisponde al if then else Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.26 esempi if if (i>5) then print *,i end if if (k==l) then x = k*3 else x = l*3 end if if a > 6 then ! ? a=a*a end if if (i>5) then; print *,i; end if if (a==0) then k = k+1 else if (b==0) then k=0 else k=1 end if end if Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.27 piuabs ! piuabs.f90 ! ! somma al primo numero il valore assoluto ! del secondo program piuabs integer :: m,n,s read *,m,n if (n>0) then s = m+n else s = m-n end if print *,s end program piuabs Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.28 do ciclo iterativo sintassi R817 do-construct is do-stmt block end-do R818 do-stmt is [ do-name : ] DO [ loop-control ] R821 loop-control is int-variable = int-expr, int-expr [ , int-expr ] R824 end-do is ENDDO [ do-name ] int-variable non può essere modificata nel block Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.29 semantica do senza loop-control ciclo infinito con loop-control do var = exp1, exp2, [exp3] block end do if c’è la expr3 then inc ← expr3 else inc ← 1 cnt ← MAX((exp2 - exp1 + inc)/inc,0)a var ← exp1 while cnt 6= 0 block cnt ← cnt -1 var ← var+ inc a cnt è 0 se exp1 > exp2 e exp3 >0 oppure exp1 < exp2 e exp3 <0 Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.30 Esempi DO do print *,3 end do do i=1,10 print *,i end do do k=20,10,-2 print *,k end do Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.31 moltiplicazione ! multi.f90 ! calcolo di m x n come addizioni ripetute ! program multi integer :: m,n,ris read *,m,n if (m<0) then; stop; endif if (n<0) then; stop; endif ris=0 do i=1,n ris=ris+m end do print *,ris end program multi Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.32 Fattoriale n! = ( n(n − 1)(n − 2) · · · 2 · 1 n > 0 1 n=0 Ciclo che moltiplica tutti i numeri tra n e 1 1 × n × (n − 1) × (n − 2) × · · · × 2 Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.33 Programma fattoriale ! fatt.f90 ! calcola fattoriale di n ! program fatt integer :: i,n,r read *,n if (n<0) then; stop; endif r = 1 do i = 2,n r= r*i end do print *,r end program fatt Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.34 Terminazione DO • CYCLE - passa all’iterazione successiva - sintassi: R834 is cycle-stmt CYCLE [ do-name ] • EXIT - termina il ciclo DO - sintassi: R835 is exit-stmt EXIT [ do-name ] Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.35 DO come while while P do S do ′ if (P ) then exit end if S end do ′ P è la negazione di P ′ se P=cnt > 0 P =cnt <= 0 Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.36 somma_n ! somma_n.f90 ! somma i primi n numeri positivi ! program somma_n integer :: i,n,s read *,n if (n<1) then; stop; end if s = 0 ; i=1 do if (i>n) then; exit; end if s = s + i i = i + 1 end do print *,s end program somma_n Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.37 somma_npari ! somma_npari.f90 ! somma i primi n numeri pari ! program somma_npari integer :: i,n,s read *,n if (n<1) then; stop; end if s = 0; i=1 do if (i>2*n) then; exit; end if if ((i-(i/2)*2)==0) then s = s + i end if i = i+1 end do print *,s end program somma_npari Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.38 somma_npari variante ! somma_npari_var.f90 ! somma i primi n numeri pari ! variante con istr. cycle program somma_npari integer :: i,n,s read *,n if (n<1) then; stop; end if s = 0 do i = 1,2*n if ((i-(i/2)*2)!=0) then; cycle; end if s = s + i end do print *,s end program somma_npari Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.39 Massimo Comun Divisore - 1 Dati due numeri m,n > 0 trovare MCD metodo 1 Sia m ≥ n, con ciclo da 2 a n si verifica quali sono i numeri che dividono esattamente sia m che n. Il MCD è il massimo di tali numeri. Nota: un numero è divisibile per un altro se il resto della divisione è zero. Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.40 programma MCD 1 ! calcola massimo comun divisore ! algoritmo 1 - max dei divisori comuni tra 0 e n program mcd1 integer :: i,m,n,mcd,tmp read *,n,m if (m<1) then; stop; endif if (n<1) then; stop; endif if (m < n) then tmp = m; m = n; n = tmp end if mcd = 1; i = 1 do if (i>n) then; exit ;end if if ((m-(m/i)*i)==0) then if ((n-(n/i)*i)==0) then if (i > mcd) then mcd = i end if; end if; end if i= i+1 end do print *,mcd end program mcd1 Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.41 Massimo Comun Divisore - 2 metodo 2 - Metodo di Euclide Dato m ≥ n, qualunque numero che divide sia m che n divide anche il resto della divisione m/n m = qn + r m - qn = r ≥ 0 qm k - qqn k = r k(qm - qqn ) = r Si calcola il resto r di m/n. Se tale resto è zero n è il MCD, altrimenti n e r diventano m e n e si riapplica il passo precedente. Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.42 programma MCD 2 ! mcd2.f90 ! calcola massimo comun divisore ! algoritmo 2 - metodo di Euclide program mcd2 integer :: r,m,n,tmp read *,n,m if (m<1) then; stop; endif if (n<1) then; stop; endif if (m < n) then tmp = m; m = n; n = tmp end if r = m-(m/n)*n do if (r == 0) then exit end if m = n; n = r; r = m-(m/n)*n end do print *,n end program mcd2 Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.43 Massimo Comun Divisore - 3 metodo 3 - Metodo di Euclide (senza divisione) Se m=n il MCD è m, altrimenti se m >n m diventa m-n altrimenti è n che diventa n - m, e si ricontrolla l’eventuale uguaglianza di m con n Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.44 programma MCD 3 ! mcd3.f90 ! calcola massimo comun divisore ! algoritmo 3 - metodo di Euclide (senza divisione) program mcd3 integer :: m,n read *,n,m if (m<1) then; stop; endif if (n<1) then; stop; endif do if (m == n) then; exit; end if if (m > n) then m = m - n else n = n - m end if end do print *,m end program mcd3 Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.45 numero primo ! primo.f90 ! dato n stampa T se e’ primo, F altrimenti ! program primo integer :: n,r,div read *,n if (n<1) then; stop; endif div=n / 2 r = n-(n/div)*div do if (r == 0) then ; exit; end if div=div-1 r = n-(n/div)*div end do print *,div==1 end program primo Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.46
Documenti analoghi
Elementi di Fortran 90
Nel Fortran alle variabili non dichiarate esplicitamente
viene assegnato un tipo implicito che dipende dalla
prima lettera del nome della variabile:
- I, J, K, L, M e N => la variabile è di tipo in...
Appunti di FORTRAN 77
per tener conto delle tante importanti estensioni del FORTRAN 66 fiorite
in quegli anni e anche del fatto che nel frattempo erano nati altri linguaggi,
fra cui il C, che erano decisamente avanti ri...