Documente Academic
Documente Profesional
Documente Cultură
Fortran
i
Machine Translated by Google
Fortran
Despre Tutorial
Fortran a fost dezvoltat inițial de o echipă de la IBM în 1957 pentru calcule științifice.
Evoluțiile ulterioare au transformat-o într-un limbaj de programare de nivel înalt. În acest tutorial, vom învăța
conceptele de bază ale Fortran și codul său de programare.
Public
Acest tutorial este conceput pentru cititorii care doresc să învețe elementele de bază ale Fortran.
Cerințe preliminare
Acest tutorial este conceput pentru începători. O cunoaștere generală a limbajelor de programare pentru computer
este singura condiție prealabilă pentru a profita la maximum de acest tutorial.
Tot conținutul și graficele publicate în această carte electronică sunt proprietatea Tutorials Point (I) Pvt. Ltd.
Utilizatorului acestei cărți electronice îi este interzis să refolosească, să rețină, să copieze, să distribuie sau să
republice orice conținut sau o parte din conținutul acestei cărți electronice în orice mod, fără acordul scris al
editorului.
Ne străduim să actualizăm conținutul site-ului și tutorialele noastre cât mai în timp util și cât mai precis posibil, cu
toate acestea, conținutul poate conține inexactități sau erori. Tutoriale Punctul (I)
Pvt. Ltd. nu oferă nicio garanție cu privire la acuratețea, actualitatea sau integralitatea site-ului nostru web sau a
conținutului acestuia, inclusiv acest tutorial. Dacă descoperiți erori pe site-ul nostru web sau în acest tutorial, vă
rugăm să ne anunțați la contact@tutorialspoint.com
i
Machine Translated by Google
Fortran
Cuprins
ii
Machine Translated by Google
Fortran
iii
Machine Translated by Google
Fortran
iv
Machine Translated by Google
Fortran
v
Machine Translated by Google
Fortran
vi
Machine Translated by Google
Fortran, așa cum este derivat din Formula Translating System, este un limbaj de programare imperativ, de uz general. Este
folosit pentru calculul numeric și științific.
Fortran a fost dezvoltat inițial de IBM în anii 1950 pentru aplicații științifice și de inginerie. Fortran a condus mult timp
această zonă de programare și a devenit foarte popular pentru calculul de înaltă performanță, deoarece.
Acesta suportă:
• Programare structurată
• Programarea matricei
• Programare modulară
• Programare generică
• Programare concomitentă
• Dezvoltat inițial pentru calcule științifice, avea suport foarte limitat pentru șirurile de caractere și alte structuri necesare
pentru programarea de uz general.
• Cea mai veche versiune încă folosită este Fortran IV și Fortran 66.
• Cele mai frecvent utilizate versiuni astăzi sunt: Fortran 77, Fortran 90 și Fortran 95.
1
Machine Translated by Google
2
Machine Translated by Google
Fortran
În timpul instalării, g95 este adăugat automat la variabila PATH dacă selectați opțiunea „RECOMANDAT”. Aceasta
înseamnă că puteți pur și simplu deschide o nouă fereastră de linie de comandă și tastați „g95” pentru a afișa
compilatorul. Găsiți mai jos câteva comenzi de bază pentru a începe.
Comanda Descriere
g95 -c h1.f90 h2.f90 h3.f90 Compilează mai multe fișiere sursă. Dacă totul merge bine,
fișierele obiect h1.o, h2.o și h3.o sunt create
g95 -o hello h1.f90 h2.f90 h3.f90 Compilează mai multe fișiere sursă și le conectează
împreună la un fișier executabil numit „hello”
Mai multe fișiere sursă și obiect pot fi specificate simultan. Fișierele Fortran sunt indicate prin nume care se termină
în „.f”, „.F”, „.for”, „.FOR”, „.f90”, „.F90”, „.f95”, „.F95”, „. f03" și ".F03".
Pot fi specificate mai multe fișiere sursă. Fișierele obiect pot fi specificate, de asemenea, și vor fi legate pentru a
forma un fișier executabil.
3
Machine Translated by Google
Un program Fortran este format dintr-o colecție de unități de program, cum ar fi un program principal, module și subprograme
sau proceduri externe.
Fiecare program conține un program principal și poate sau nu conține alte unități de program. Sintaxa programului principal
este următoarea:
program program_name
! declarații de tip
! instrucțiuni executabile
program addNumbers
! Declarații de tip
real :: a, b, rezultat
! Declarații executabile
a = 12,0
b = 15,0
rezultat = a + b
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
4
Machine Translated by Google
Fortran
• Toate programele Fortran încep cu programul de cuvinte cheie și se termină cu programul de încheiere a
cuvintelor , urmat de numele programului.
• Instrucțiunea implicită none permite compilatorului să verifice dacă toate tipurile de variabile sunt declarate
corect. Trebuie să utilizați întotdeauna implicit none la începutul fiecărui program.
• Comentariile în Fortran sunt începute cu semnul exclamării (!), deoarece toate caracterele de după acesta (cu
excepția unui șir de caractere) sunt ignorate de compilator.
• Indentarea liniilor de cod este o bună practică pentru a menține un program lizibil.
• Fortran permite atât litere mari, cât și litere mici. Fortran nu ține seama de majuscule, cu excepția literalelor șir.
Bazele
Setul de caractere de bază al Fortran conține:
• cifrele 0 ... 9
Jetoanele sunt formate din caractere din setul de caractere de bază. Un token poate fi un cuvânt cheie, un identificator, o
constantă, un literal șir sau un simbol.
Identificator
Un identificator este un nume folosit pentru a identifica o variabilă, o procedură sau orice alt element definit de
utilizator. Un nume în Fortran trebuie să respecte următoarele reguli:
5
Machine Translated by Google
Fortran
Cuvinte cheie
Cuvintele cheie sunt cuvinte speciale, rezervate limbii. Aceste cuvinte rezervate nu pot fi folosite ca identificatori sau
nume.
modul final de interfață termina programul final select sfâr itul subrutinei
Unde In timp ce
6
Machine Translated by Google
Fortran
7
Machine Translated by Google
Fortran oferă cinci tipuri de date intrinseci, cu toate acestea, puteți obține și propriile tipuri de date. Cele
cinci tipuri intrinseci sunt:
• Tipul întreg
• Tip real
• Tip complex
• Tip logic
• Tipul de caracter
Tip întreg
Tipurile întregi pot conține numai valori întregi. Următorul exemplu extrage cea mai mare valoare care
poate fi păstrată într-un număr întreg obișnuit de patru octeți:
program testingInt
întreg :: largeval
imprimare *, uriaș(largeval)
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
2147483647
Rețineți că funcția huge() oferă cel mai mare număr care poate fi deținut de tipul de date întreg specific.
De asemenea, puteți specifica numărul de octeți folosind specificatorul de tip . Următorul exemplu
demonstrează acest lucru:
program testingInt
integer(kind=2) :: shortval
integer(kind=4) :: longval
8
Machine Translated by Google
Fortran
integer(kind=8) :: verylongval
integer(kind=16) :: veryverylongval
!întreg implicit
întreg :: defval
imprimare *, imens(scurtval)
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
32767
2147483647
9223372036854775807
170141183460469231731687303715884105727
2147483647
Tip real
Stochează numerele în virgulă mobilă, cum ar fi 2.0, 3.1415, -100.876 etc.
În mod tradițional, există două tipuri reale diferite, tipul real implicit și tipul dublu de precizie.
Cu toate acestea, Fortran 90/95 oferă mai mult control asupra preciziei tipurilor de date reale și întregi prin
kindspecifier, pe care îl vom studia în capitolul despre Numere.
9
Machine Translated by Google
Fortran
diviziunea programului
real :: p, q, realRes
întreg :: i, j, intRes
! Atribuirea de valori
p = 2,0
q = 3,0
i=2
j=3
realRes = p/q
intRes = i/j
print *, realRes
print *, intRes
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
0,666666687
Tip complex
Acesta este folosit pentru stocarea numerelor complexe. Un număr complex are două părți, partea reală și partea
imaginară. Două unități de stocare numerice consecutive stochează aceste două părți.
10
Machine Translated by Google
Fortran
Tip logic
Există doar două valori logice: .adevărat. iar .fals.
Tip de caracter
Tipul de caractere stochează caractere și șiruri. Lungimea șirului poate fi specificată prin specificatorul len. Dacă nu
este specificată lungimea, aceasta este 1.
De exemplu,
Tastare implicită
Versiunile mai vechi de Fortran permiteau o caracteristică numită tastare implicită, adică nu trebuie să declarați
variabilele înainte de utilizare. Dacă o variabilă nu este declarată, atunci prima literă a numelui ei va determina tipul
acesteia.
Numele de variabile care încep cu i, j, k, l, m sau n sunt considerate a fi pentru variabile întregi, iar altele sunt variabile
reale. Cu toate acestea, trebuie să declarați toate variabilele, deoarece este o bună practică de programare. Pentru
asta începeți programul cu declarația:
11
Machine Translated by Google
O variabilă nu este altceva decât un nume dat unei zone de stocare pe care programele noastre o pot manipula. Fiecare
variabilă ar trebui să aibă un tip specific, care determină dimensiunea și aspectul memoriei variabilei; intervalul de
valori care poate fi stocat în acea memorie; și setul de operații care pot fi aplicate variabilei.
Numele unei variabile poate fi compus din litere, cifre și caracterul de subliniere.
Un nume în Fortran trebuie să respecte următoarele reguli:
Pe baza tipurilor de bază explicate în capitolul anterior, următoarele sunt tipurile de variabile:
Tip Descriere
Declarație variabilă
Variabilele sunt declarate la începutul unui program (sau subprogram) într-o declarație de tip.
12
Machine Translated by Google
Fortran
De exemplu,
întreg :: total
real :: mediu
complex :: cx
logic :: gata
total = 20000
medie = 1666,67
făcut = .adevărat.
De asemenea, puteți utiliza funcția intrinsecă cmplx, pentru a atribui valori unei variabile complexe:
cx = cmplx (x, y) ! cx = x + yi
Exemplu
! declararea variabilelor
întreg :: total
real :: mediu
complex :: cx
logic :: gata
!atribuirea de valori
total = 20000
medie = 1666,67
făcut = .adevărat.
13
Machine Translated by Google
Fortran
Tipărire *, total
Tipărire *, medie
Tipărire *, cx
Imprimare *, gata
Imprimare *, mesaj
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
20000
1666.67004
(3,00000000, 5,00000000)
T
14
Machine Translated by Google
Constantele se referă la valorile fixe pe care programul nu le poate modifica în timpul execuției sale. Aceste
valori fixe sunt numite și literale.
Constantele pot fi din oricare dintre tipurile de date de bază, cum ar fi o constantă întreagă, o constantă
flotantă, o constantă de caractere, o constantă complexă sau un literal șir. Există doar două constante
logice: .adevărat. iar .fals.
Constantele sunt tratate la fel ca variabilele obișnuite, cu excepția faptului că valorile lor nu pot fi modificate
după definirea lor.
• Constante literale
• Constante numite
Tip Exemplu
Constantele numite trebuie declarate la începutul unui program sau al unei proceduri, la fel ca o declarație
de tip variabilă, indicând numele și tipul acesteia. Constantele numite sunt declarate cu atributul parametru.
De exemplu,
15
Machine Translated by Google
Fortran
Exemplu
program gravitationalDisp
! acceleratie gravitationala
! declarație variabilă
real :: s ! deplasare
real :: t ! timp
! atribuirea de valori
t = 5,0
u = 50
! deplasare
s=u * t - g * (t**2) / 2
! ieșire
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Timp = 5,00000000
Deplasare = 127,374992
16
Machine Translated by Google
Un operator este un simbol care îi spune compilatorului să efectueze anumite manipulări matematice sau
logice. Fortran oferă următoarele tipuri de operatori:
• Operatori aritmetici
• Operatori logici
Operatori aritmetici
Următorul tabel prezintă toți operatorii aritmetici acceptați de Fortran. Presupunem ca variabila A deține 5
și variabila B deține 3 atunci:
-
Operator de scădere, scade al doilea operand din primul. A - B va da 2
*
Operator de multiplicare, înmulțește ambii operanzi. A * B va da 15
**
Operator de exponențiere, ridică un operand la puterea celuilalt. A ** B va da 125
Exemplu
Încercați următorul exemplu pentru a înțelege toți operatorii aritmetici disponibili în Fortran:
program aritmeticOp
! declarație variabilă
17
Machine Translated by Google
Fortran
întreg :: a, b, c
! atribuirea de valori
a=5
b=3
! Exponentiatie
c=a ** b
! ieșire
! Multiplicare
c=a *b
! ieșire
! Divizia
c = a/b
! ieșire
! Plus
c=a+b
! ieșire
! Scădere
c=a-b
! ieșire
18
Machine Translated by Google
Fortran
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
c = 125
c = 15
c=1
c=8
c=2
Operatori Relaționali
Următorul tabel prezintă toți operatorii relaționali suportați de Fortran. Presupunem ca variabila A deține 10
și variabila B deține 20, atunci:
== .echiv. Verifică dacă valorile a doi operanzi sunt egale sau nu, (A == B) nu este
dacă da atunci condiția devine adevărată. adevărat.
/= .ne. Verifică dacă valorile a doi operanzi sunt egale sau nu, (A != B) este
dacă valorile nu sunt egale atunci condiția devine adevărat.
adevărată.
> .gt. Verifică dacă valoarea operandului din stânga este mai (A > B) nu este
mare decât valoarea operandului din dreapta, dacă da adevărat.
atunci condiția devine adevărată.
< .lt. Verifică dacă valoarea operandului din stânga este mai (A < B) este
mică decât valoarea operandului din dreapta, dacă da adevărată.
atunci condiția devine adevărată.
>= .GE. Verifică dacă valoarea operandului din stânga este mai (A >= B) nu este
mare sau egală cu valoarea operandului din dreapta, adevărat.
dacă da atunci condiția devine adevărată.
<= .le. Verifică dacă valoarea operandului din stânga este mai (A <= B) este
mică sau egală cu valoarea operandului din dreapta, adevărată.
dacă da atunci condiția devine adevărată.
Exemplu
19
Machine Translated by Google
Fortran
Încercați următorul exemplu pentru a înțelege toți operatorii logici disponibili în Fortran:
program logicalOp
! declarație variabilă
logic :: a, b
! atribuirea de valori
a = .adevărat.
b = .fals.
! modificarea valorilor
a = .fals.
b = .adevărat.
20
Machine Translated by Google
Fortran
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Operatori logici
Operatorii logici din Fortran lucrează numai pe valori logice .true. iar .fals.
Următorul tabel prezintă toți operatorii logici suportați de Fortran. Să presupunem că variabila A este valabilă. iar
variabila B deține .fals. atunci: ,
Operator Descriere Exemplu
.și. Denumit operator logic AND. Dacă ambii operanzi sunt diferiti de (A și B) este fals.
zero, atunci condiția devine adevărată.
.sau. Numit Operator logic SAU. Dacă oricare dintre cei doi operanzi (A sau B) este adevărată.
este diferit de zero, atunci condiția devine adevărată.
.nu. Numit Operator logic NOT. Utilizați pentru a inversa starea logică !(A .și. B) este adevărat.
a operandului său. Dacă o condiție este adevărată, operatorul
logic NOT va deveni fals.
.echiv. Denumit Operator ECHIVALENT logic. Folosit pentru a verifica (A .echiv. B) este falsă.
echivalența a două valori logice.
21
Machine Translated by Google
Fortran
.neqv. Numit Operator logic NEECHIVALENT. Folosit pentru a verifica (A .neqv. B) este adevărată.
neechivalența a două valori logice.
Exemplu
Încercați următorul exemplu pentru a înțelege toți operatorii logici disponibili în Fortran:
program logicalOp
logic :: a, b
! atribuirea de valori
a = .adevărat.
b = .fals.
! modificarea valorilor
a = .fals.
b = .adevărat.
22
Machine Translated by Google
Fortran
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
De exemplu, x = 7 + 3 * 2; aici, lui x i se atribuie 13, nu 20, deoarece operatorul * are o prioritate mai mare decât +, așa
că mai întâi se înmulțește cu 3*2 și apoi se adună în 7.
Aici, operatorii cu cea mai mare prioritate apar în partea de sus a tabelului, cei cu cea mai mică prioritate apar în
partea de jos. În cadrul unei expresii, operatorii cu prioritate mai mare vor fi evaluați mai întâi.
23
Machine Translated by Google
Fortran
**
Exponentiatie De la stânga la dreapta
Exemplu
Încercați următorul exemplu pentru a înțelege prioritatea operatorului în Fortran:
prioritate programOp
! declarație variabilă
întreg :: a, b, c, d, e
! atribuirea de valori
a = 20
b = 10
c = 15
d=5
e = (a + b) * c/d ! ( 30 * 15 ) / 5
24
Machine Translated by Google
Fortran
e = ((a + b) * c) / d ! (30 * 15 ) / 5
e = a + (b * c) / d; ! 20 + (150/5)
"
print *, "Valoarea lui a + (b * c) / d este: , e
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
25
Machine Translated by Google
Structurile de luare a deciziilor necesită ca programatorul să specifice una sau mai multe condiții care
urmează să fie evaluate sau testate de program, împreună cu o declarație sau instrucțiuni care
urmează să fie executate, dacă condiția este determinată a fi adevărată și, opțional, alte instrucțiuni
care urmează să fie executate dacă condiția este determinată a fi falsă.
Mai jos este forma generală a unei structuri tipice de luare a deciziilor găsită în majoritatea limbajelor
de programare:
Afirmație Descriere
Dacă... atunci... altfel construi O instrucțiune if... then poate fi urmată de o instrucțiune
opțională else, care se execută atunci când expresia logică este
falsă.
26
Machine Translated by Google
Fortran
selectează construcția cazului O instrucțiune select case permite ca o variabilă să fie testată pentru
egalitate față de o listă de valori.
construct imbricat select Puteți utiliza o declarație select case în interiorul altei declarații select
case case.
O instrucțiune if... then constă dintr-o expresie logică urmată de una sau mai multe instrucțiuni și
terminată cu o instrucțiune end if .
Sintaxă
Cu toate acestea, puteți da un nume blocului if , apoi sintaxa instrucțiunii named if ar fi, cum ar fi:
Dacă expresia logică este evaluată la adevărat, atunci blocul de cod din interiorul instrucțiunii if...then
va fi executat. Dacă expresia logică se evaluează ca fals, atunci va fi executat primul set de cod după
încheierea instrucțiunii if .
27
Machine Translated by Google
Fortran
Diagrama fluxului
Exemplul 1
program ifProg
întreg :: a = 10
28
Machine Translated by Google
Fortran
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Exemplul 2
Acest exemplu demonstrează un bloc numit if :
program markGradeA
! atribuie note
note = 90,4
tipăriți *, „Grad A”
termina daca gr
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Nota A
O instrucțiune if... then poate fi urmată de o instrucțiune opțională else, care se execută atunci când expresia logică
este falsă.
Sintaxă
Sintaxa de bază a unei declarații if… then… else este:
declarație(e)
altfel
alte_declarații
sfâr itul dacă
29
Machine Translated by Google
Fortran
Cu toate acestea, dacă dați un nume blocului if , atunci sintaxa instrucțiunii denumite if-else ar fi, cum ar fi:
. . .
altfel
!altă declarație(e)
. . .
Dacă expresia logică este evaluată la adevărat, atunci blocul de cod din interiorul instrucțiunii if...then va
fi executat, în caz contrar blocul de cod din blocul else va fi executat.
Diagrama fluxului
Exemplu
program ifElseProg
implicit nici unul
! declarația variabilelor locale
întreg :: a = 100
30
Machine Translated by Google
Fortran
altfel
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Un construct de instrucțiune if poate avea unul sau mai multe constructe opționale else-if . Când condiția if eșuează, se
execută else-if imediat urmată . Când și ele -if eșuează, succesorul ei else-if (dacă există) este executată și așa mai departe.
Opțional else este plasat la sfârșit și este executat atunci când niciuna dintre condițiile de mai sus nu este adevărată.
• else trebuie să fie întotdeauna plasat la sfârșitul construcției și ar trebui să apară o singură dată.
Sintaxă
Sintaxa unei instrucțiuni if...else if...else este:
[Nume:]
! blocul 1
! blocul 2
! blocul 3
altfel
31
Machine Translated by Google
Fortran
! blocul 4
Exemplu
programul ifElseIfElseProg
întreg :: a = 100
dacă( a == 10 ) atunci
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
32
Machine Translated by Google
Fortran
Imbricat If Construct
Puteți utiliza o declarație if sau else if în interiorul altei declarații if sau else if .
Sintaxă
Sintaxa pentru o instrucțiune if imbricată este următoarea:
if(expresie_logică 2)atunci
Exemplu
programul nestedIfProg
33
Machine Translated by Google
Fortran
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Sintaxă
Sintaxa pentru constructul select case este următoarea:
caz (selector1)
! niste afirmatii
...
caz implicit
...
• Expresia logică utilizată într-o instrucțiune select ar putea fi expresie logică, de caractere sau
întreagă (dar nu reală).
• Puteți avea orice număr de declarații de caz într-un select. Fiecare caz este urmat de valoarea cu care
trebuie comparat și poate fi expresie logică, de caractere sau întreagă (dar nu reală) și determină
ce instrucțiuni sunt executate.
• Expresia constantă pentru un caz trebuie să fie de același tip de date ca și variabila
în select și trebuie să fie o constantă sau un literal.
• Când variabila care este selectată pe, este egală cu un caz, următoarele afirmații
acel caz se va executa până când se ajunge la următoarea instrucțiune de caz.
• Blocul implicit caz este executat dacă expresia din select case (expresie) nu se potrivește cu niciunul
dintre selectori.
34
Machine Translated by Google
Fortran
Diagrama fluxului
Exemplul 1
program selectCaseProg
caz ('A')
print*, "Excelent!"
caz („B”)
35
Machine Translated by Google
Fortran
caz („C”)
print*, "Bravo"
caz ('D')
caz („F”)
caz implicit
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Nota ta este B
caz (scăzut:înalt)
Exemplul 2
program selectCaseProg
întreg :: mărci = 78
caz (91:100)
print*, "Excelent!"
36
Machine Translated by Google
Fortran
caz (81:90)
caz (71:80)
print*, "Bravo!"
caz (61:70)
caz (41:60)
caz (:40)
caz implicit
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Foarte bine!
Sintaxă
selectați cazul (a)
caz (100)
37
Machine Translated by Google
Fortran
caz (200)
final select
Exemplu
programul nestedSelectCase
! definirea variabilei locale
întreg :: a = 100
întreg :: b = 200
caz (100)
caz (200)
final select
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
38
Machine Translated by Google
9. Fortran Bucle
Fortran
Poate exista o situație în care trebuie să executați un bloc de cod de mai multe ori. În general, instrucțiunile sunt
executate secvențial: prima instrucțiune dintr-o funcție este executată prima, urmată de a doua și așa mai departe.
Limbajele de programare oferă diverse structuri de control care permit căi de execuție mai complicate.
O instrucțiune buclă ne permite să executăm o instrucțiune sau un grup de instrucțiuni de mai multe ori, iar
următoarea este forma generală a unei instrucțiuni buclă în majoritatea limbajelor de programare:
Fortran oferă următoarele tipuri de construcții de bucle pentru a gestiona cerințele de buclă.
Faceți clic pe următoarele link-uri pentru a verifica detaliile acestora.
face bucla Acest construct permite ca o declarație sau o serie de declarații să fie efectuată în mod
iterativ, în timp ce o condiție dată este adevărată.
bucla do while Repetă o instrucțiune sau un grup de instrucțiuni în timp ce o anumită condiție este
Adevărat. Testează condiția înainte de a executa corpul buclei.
bucle imbricate Puteți utiliza una sau mai multe bucle în interiorul oricărei alte bucle
construi.
39
Machine Translated by Google
Fortran
face Loop
Construcția buclă do permite ca o declarație, sau o serie de instrucțiuni, să fie efectuată iterativ, în timp ce o condiție
dată este adevărată.
Sintaxă
! declarație(e)
…
Unde,
• pasul este incrementul, dacă acesta este omis, atunci variabila var este mărită cu
unitate
De exemplu:
! calculează factoriali
face n = 1, 10
nfact = nfact * n
Diagrama fluxului
• Pasul inițial este executat mai întâi și o singură dată. Acest pas vă permite să declarați și să inițializați orice
variabile de control al buclei. În cazul nostru, variabila var este inițializată cu valoarea start.
• În continuare, se evaluează starea. Dacă este adevărat, corpul buclei este executat. Dacă este fals, corpul
buclei nu se execută și fluxul de control sare la următoarea instrucțiune imediat după buclă. În cazul
nostru, condiția este ca variabila var să atingă valoarea finală stop.
40
Machine Translated by Google
Fortran
• După ce corpul buclei se execută, fluxul de control sare înapoi la instrucțiunea de increment.
Această instrucțiune vă permite să actualizați variabila de control al buclei var.
• Starea este acum evaluată din nou. Dacă este adevărat, bucla se execută și procesul se repetă
(corpul buclei, apoi pasul de incrementare și apoi din nou condiția). După ce condiția devine falsă,
bucla se termină.
Exemplul 1
Acest exemplu tipărește numerele de la 11 la 20:
program printNum
implicit nici unul
! definiți variabile
întreg :: n
face n = 11, 20
41
Machine Translated by Google
Fortran
tipar*, n
sfâr itul face
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
11
12
13
14
15
16
17
18
19
20
Exemplul 2
Acest program calculează factorialii numerelor de la 1 la 10:
factorial de program
! definiți variabile
întreg :: nfact = 1
întreg :: n
! calculează factoriali
face n = 1, 10
nfact = nfact * n
! imprima valorile
42
Machine Translated by Google
Fortran
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
do-while Loop
Repetă o declarație sau un grup de afirmații în timp ce o anumită condiție este adevărată. Testează condiția
înainte de a executa corpul buclei.
Sintaxă
Diagrama fluxului
43
Machine Translated by Google
Fortran
Exemplu
factorial de program
! definiți variabile
întreg :: nfact = 1
întreg :: n = 1
! calculează factoriali
n=n+1
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
2 1
3 2
4 6
5 24
6 120
7 720
8 5040
9 40320
10 362880
11 3628800
44
Machine Translated by Google
Fortran
Bucle imbricate
Puteți folosi una sau mai multe bucle în interiorul oricărei alte bucle. De asemenea, puteți pune etichete pe
bucle.
Sintaxă
iloop: face i = 1, 3
print*, "i:", i
jloop: face j = 1, 3
kloop: face k = 1, 3
Exemplu
programul nestedLoop
întreg:: i, j, k
iloop: face i = 1, 3
jloop: face j = 1, 3
kloop: face k = 1, 3
45
Machine Translated by Google
Fortran
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
(i, j, k): 1 1 3
(i, j, k): 1 2 1
(i, j, k): 1 2 2
(i, j, k): 1 2 3
(i, j, k): 1 3 1
(i, j, k): 1 3 2
(i, j, k): 1 3 3
(i, j, k): 2 1 1
(i, j, k): 2 1 2
(i, j, k): 2 1 3
(i, j, k): 2 2 1
(i, j, k): 2 2 2
(i, j, k): 2 2 3
(i, j, k): 2 3 1
(i, j, k): 2 3 2
(i, j, k): 2 3 3
(i, j, k): 3 1 1
(i, j, k): 3 1 2
(i, j, k): 3 1 3
(i, j, k): 3 2 1
(i, j, k): 3 2 2
Fortran acceptă următoarele declarații de control. Faceți clic pe următoarele link-uri pentru a verifica detaliile
acestora.
Control Descriere
Afirmație
Ieșire Dacă instrucțiunea de ieșire este executată, bucla este ieșită, iar execuția
programului continuă la prima instrucțiune executabilă
46
Machine Translated by Google
Fortran
ciclu Dacă se execută o instrucțiune de ciclu, programul continuă la începutul următoarei iterații.
Declarație de ieșire
Instrucțiunea Exit termină bucla sau instrucțiunea select case și transferă execuția instrucțiunii imediat după bucla sau
select.
Diagrama fluxului
Exemplu
programul nestedLoop
întreg:: i, j, k
iloop: face i = 1, 3
jloop: face j = 1, 3
kloop: face k = 1, 3
47
Machine Translated by Google
Fortran
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
(i, j, k): 1 1 1
(i, j, k): 1 1 2
(i, j, k): 2 1 1
(i, j, k): 2 1 2
(i, j, k): 3 1 1
(i, j, k): 3 1 2
Declarație de ciclu
Declarația ciclului face ca bucla să săriască restul corpului său și să retesteze imediat starea acesteia
înainte de a reitera.
Diagrama fluxului
Exemplu
48
Machine Translated by Google
Fortran
ciclu de program_exemplu
întreg :: i
fac i = 1, 20
dacă (i == 5) atunci
ciclu
sfâr itul dacă
imprimare*, i
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
10
11
12
13
14
15
16
17
18
19
20
49
Machine Translated by Google
Fortran
Declarație Stop
Dacă doriți să înceteze execuția programului, puteți introduce o instrucțiune stop.
Exemplu
program stop_example
întreg :: i
fac i = 1, 20
dacă (i == 5) atunci
Stop
sfâr itul dacă
imprimare*, i
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
50
Machine Translated by Google
• Tipul întreg
• Tip real
• Tip complex
Tip întreg
Tipurile întregi pot conține numai valori întregi. Următorul exemplu extrage cea mai mare valoare care ar
putea fi păstrată într-un număr întreg obișnuit de patru octeți:
program testingInt
întreg :: largeval
imprimare *, uriaș(largeval)
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
2147483647
Vă rugăm să rețineți că funcția huge() oferă cel mai mare număr care poate fi deținut de tipul de date
întreg specific. De asemenea, puteți specifica numărul de octeți folosind specificatorul de tip . Următorul
exemplu demonstrează acest lucru:
program testingInt
integer(kind=2) :: shortval
integer(kind=4) :: longval
integer(kind=8) :: verylongval
51
Machine Translated by Google
Fortran
integer(kind=16) :: veryverylongval
!întreg implicit
întreg :: defval
imprimare *, imens(scurtval)
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
32767
2147483647
9223372036854775807
170141183460469231731687303715884105727
2147483647
Tip real
Stochează numerele în virgulă mobilă, cum ar fi 2.0, 3.1415, -100.876 etc.
În mod tradițional, existau două tipuri reale diferite: tipul real implicit și tipul cu precizie dublă .
Cu toate acestea, Fortran 90/95 oferă mai mult control asupra preciziei tipurilor de date reale și întregi prin
specificatorul de tip , pe care îl vom studia în scurt timp.
diviziunea programului
real :: p, q, realRes
52
Machine Translated by Google
Fortran
întreg :: i, j, intRes
! Atribuirea de valori
p = 2,0
q = 3,0
i=2
j=3
realRes = p/q
intRes = i/j
print *, realRes
print *, intRes
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
0,666666687
Tip complex
Acesta este folosit pentru stocarea numerelor complexe. Un număr complex are două părți: partea reală și partea
imaginară. Două unități de stocare numerice consecutive stochează aceste două părți.
Funcția generică cmplx() creează un număr complex. Produce un rezultat care are părți reale și imaginare cu precizie unică,
indiferent de tipul argumentelor de intrare.
programul createComplex
întreg :: i = 10
real :: x = 5,17
print *, cmplx(i, x)
53
Machine Translated by Google
Fortran
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
(10,0000000, 5,17000008)
programul ComplexArithmatic
complex :: x, y, z
x = (7, 8);
y = (5, -7)
X *
scrie (*),*) i * y
z=x+y
z=x-y
z=x *
y
*
tipăriți *, "z = x y = ", z
z=x/y
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
(9,00000000, 91,0000000)
z = x + y = (12,0000000, 1,00000000)
z = x - y = (2,00000000, 15,0000000)
z=x *
y = (91,0000000, -9,00000000)
z = x / y = (-0,283783793, 1,20270276)
54
Machine Translated by Google
Fortran
64 9.223.372.036.854.774.807 (2**63)–1
32 2.147.483.647 (2**31)–1
Următorul tabel afișează numărul de biți, cea mai mică și cea mai mare valoare și precizia pentru numerele reale.
Numărul Cea mai mare valoare Cea mai mică valoare Precizie
de biți
gama de programePrecizie
real:: x, y, z
x = 1,5e+40
y = 3,73e+40
z=x *
y
imprimare *, z
55
Machine Translated by Google
Fortran
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
x = 1,5e+40
principal.f95:5.12:
y = 3,73e+40
gama de programePrecizie
real:: x, y, z
x = 1,5e+20
y = 3,73e+20
z=x *
y
imprimare *, z
z = x/y
imprimare *, z
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Infinit
0,402144760
gama de programePrecizie
real:: x, y, z
x = 1,5e-30
y = 3,73e-60
56
Machine Translated by Google
Fortran
z=x *
y
imprimare *, z
z = x/y
imprimare *, z
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
y = 3,73e-60
Se execută programul....
$demo
0,00000000E+00
Infinit
Specificatorul de tip
În programarea științifică, de multe ori trebuie să cunoaștem gama și precizia datelor platformei hardware pe care se
lucrează.
Funcția intrinsecă kind() vă permite să interogați detaliile reprezentărilor de date ale hardware-ului înainte de a rula un
program.
program kindCheck
întreg :: i
real :: r
complex :: cp
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
57
Machine Translated by Google
Fortran
Numărul întreg 4
Real 4
Complexul 4
program checkKind
întreg :: i
real :: r
caracter*1 :: c
logic :: lg
complex :: cp
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Numărul întreg 4
Real 4
Complexul 4
Personajul 1
logic 4
58
Machine Translated by Google
Limba Fortran poate trata caracterele ca un singur caracter sau șiruri adiacente.
Caracterele pot fi orice simbol luat din setul de caractere de bază, adică din litere, cifre zecimale, liniuță și 21 de caractere
speciale.
Caracterul de tip de date intrinsec stochează caractere și șiruri. Lungimea șirului poate fi specificată prin specificatorul
len . Dacă nu este specificată lungimea, aceasta este 1. Puteți trimite caractere individuale într-un șir referindu-se după
poziție; caracterul cel mai din stânga este în poziția 1.
Declarație de caracter
De exemplu,
raspuns = 'N'
sex = 'F'
program salut
caracter(len=6) :: titlu
caracter(len=25)::salutări
prenume = 'Rowan'
nume = „Atkinson”
59
Machine Translated by Google
Fortran
print *, salutări
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Concatenarea personajelor
program salut
caracter(len=6) :: titlu
caracter(len=40):: nume
caracter(len=25)::salutări
prenume = 'Rowan'
nume = „Atkinson”
nume = titlu//prenume//prenume
print *, salutări
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
60
Machine Translated by Google
Fortran
Func ie Descriere
scanare (șir, caractere) Căută „șirul” de la stânga la dreapta (cu excepția cazului în care
back=.true.) pentru prima apariție a oricărui caracter conținut în „chars”.
Returnează un număr întreg care indică poziția acelui caracter sau
zero dacă niciunul dintre caracterele din „caractere” nu a fost găsit.
verifica (șir, caractere) Scanează „șirul” de la stânga la dreapta (cu excepția cazului în care
back=.true.) pentru prima apariție a oricărui caracter care nu este conținut în „chars”.
Returnează un număr întreg care indică poziția acelui caracter sau
zero dacă au fost găsite doar caracterele din „caractere”.
repeat(string,ncopy) Returnează un șir cu lungime egală cu „ncopy” ori lungimea lui „string” și care
conține „ncopy” copii concatenate ale „string”
61
Machine Translated by Google
Fortran
Exemplul 1
Acest exemplu arată utilizarea funcției index :
program testingChars
întreg :: i
i=index(text,'caracter')
dacă (i /= 0) atunci
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Exemplul 2
Acest exemplu demonstrează utilizarea funcției de tăiere :
program salut
caracter(len=6) :: titlu
caracter(len=25)::salutări
title = „Domn.”
prenume = 'Rowan'
nume = „Atkinson”
62
Machine Translated by Google
Fortran
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Exemplul 3
Acest exemplu demonstrează utilizarea funcției achar
program testingChars
personaj:: cap
întreg:: i
face i=65, 90
ch = achar(i)
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
65 A
66 B
67 C
68 D
69 E
70 F
71 G
72 H
73 eu
74 J
75 K
76 L
63
Machine Translated by Google
Fortran
77 M
78 N
79 O
80 p
81 Î
82 R
83 S
84 T
85 U
86 V
87 W
88 X
89 Y
90 Z
Func ie Descriere
lle(char, char) Compară dacă primul caracter este lexical mai mic sau egal cu
al doilea
lge(char, char) Compară dacă primul caracter este mai mare sau egal lexical cu al doilea
lgt(char, char) Compară dacă primul caracter este mai mare din punct de vedere lexical decât al
doilea
llt(char, char) Compară dacă primul caracter este mai mic din punct de vedere lexical decât al doilea
Exemplul 4
Următoarea funcție demonstrează utilizarea:
64
Machine Translated by Google
Fortran
program testingChars
implicit nici unul
caracter:: a, b, c
a = 'A'
b = 'a'
c = 'B'
dacă(lgt(a,b)) atunci
altfel
dacă(lgt(a,c)) atunci
altfel
dacă(llt(a,b)) atunci
dacă(llt(a,c)) atunci
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
65
Machine Translated by Google
Limba Fortran poate trata caracterele ca un singur caracter sau șiruri adiacente.
Un șir de caractere poate avea o lungime de doar un caracter sau chiar poate avea lungimea zero. În Fortran, constantele
de caractere sunt date între o pereche de ghilimele duble sau simple.
Caracterul de tip de date intrinsec stochează caractere și șiruri. Lungimea șirului poate fi specificată prin specificatorul
len. Dacă nu este specificată lungimea, aceasta este 1. Puteți trimite caractere individuale într-un șir referindu-se după
poziție; caracterul cel mai din stânga este în poziția 1.
Declarație șir
Declararea unui șir este aceeași ca și alte variabile:
De exemplu,
program salut
caracter(len=6) :: titlu
caracter(len=25)::salutări
title = „Domn.”
prenume = 'Rowan'
nume = „Atkinson”
66
Machine Translated by Google
Fortran
print *, salutări
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Concatenarea șirurilor
Operatorul de concatenare // concatenează șiruri.
program salut
caracter(len=6) :: titlu
caracter(len=40):: nume
caracter(len=25)::salutări
title = „Domn.”
prenume = 'Rowan'
nume = „Atkinson”
nume = titlu//prenume//prenume
print *, salutări
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
67
Machine Translated by Google
Fortran
Extragerea subșirurilor
În Fortran, puteți extrage un subșir dintr-un șir prin indexarea șirului, dând începutul și sfârșitul subșirului într-o pereche
de paranteze. Acesta se numește specificator de extindere.
Următorul exemplu arată cum să extrageți subșirul „world” din șirul „hello world”:
program subString
caracter(len=11)::bună ziua
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Lume
Exemplu
Următorul exemplu utilizează funcția date_and_time pentru a da șirul de dată și oră. Folosim specificatorii de extindere
pentru a extrage separat informațiile despre anul, data, luna, ora, minutele și secunda.
program datatime
! mm = lună și dd = zi
68
Machine Translated by Google
Fortran
an = dateinfo(1:4)
luna = dateinfo(5:6)
zi = dateinfo(7:8)
Când compilați și executați programul de mai sus, acesta oferă informații detaliate despre dată și oră:
Luna: 08
Ziua: 03
Minutul: 58
Al doilea: 35.466
69
Machine Translated by Google
Fortran
Tăierea șirurilor
Funcția de tăiere preia un șir și returnează șirul de intrare după eliminarea tuturor spațiilor libere.
Exemplu
program trimString
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Funcția de ajustare ia un șir și îl returnează prin eliminarea spațiilor de sfârșit și adăugându-le ca spații de
început.
Exemplu
program salut
caracter(len=6) :: titlu
caracter(len=40):: nume
caracter(len=25):: salutări
70
Machine Translated by Google
Fortran
prenume = 'Rowan'
nume = „Atkinson”
nume = adjustl(titlu)//adjustl(prenume)//adjustl(nume)
print *, salutări
nume = adjustr(titlu)//adjustr(prenume)//adjustr(nume)
print *, salutări
nume = trim(titlu)//trim(prenume)//trim(nume)
print *, salutări
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Exemplu
71
Machine Translated by Google
Fortran
program salut
caracterul(len=30) :: myString
character(len=10) :: testString
testString = 'test'
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
72
Machine Translated by Google
Matricele pot stoca o colecție secvențială de dimensiuni fixe de elemente de același tip. O matrice este folosită pentru
a stoca o colecție de date, dar este adesea mai util să ne gândim la o matrice ca la o colecție de variabile de același tip.
Toate tablourile constau din locații de memorie contigue. Cea mai joasă adresă corespunde primului element și cea
mai înaltă adresă ultimului element.
Matricele pot fi unidimensionale (cum ar fi vectorii), bidimensionale (ca matricele) și Fortran vă permite să creați
tablouri de până la 7 dimensiuni.
Declararea Arrays
Matricele sunt declarate cu atributul dimension .
De exemplu, pentru a declara o matrice unidimensională numită număr, de numere reale care conțin 5 elemente,
scrieți,
Elementele individuale ale tablourilor sunt referite prin specificarea subindicelor lor. Primul element al unui tablou are
un indice de unu. Matricea numere conține cinci variabile reale – numere (1), numere (2), numere (3), numere (4) și
numere (5).
73
Machine Translated by Google
Fortran
Atribuirea de Valori
Puteți fie să atribuiți valori membrilor individuali, cum ar fi,
numere(1) = 2,0
face i=1,5
numere(i) = i * 2,0
sfâr itul face
Elementelor de matrice unidimensionale li se pot atribui direct valori folosind un simbol de mână scurtă,
numit constructor de matrice, cum ar fi,
Vă rugăm să rețineți că nu sunt permise spații între paranteze „( „și bara oblică „/”
Exemplu
program arrayProg
numere(i) = i * 2,0
sfâr itul face
!afiseaza valorile
fac i = 1, 5
face j = 1, 3
matricea(i, j) = i+j
74
Machine Translated by Google
Fortran
!afiseaza valorile
face i=1,3
face j = 1, 3
!afiseaza valorile
fac i = 1, 5
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
2,00000000
4,00000000
6,00000000
8,00000000
10,0000000
1,50000000
75
Machine Translated by Google
Fortran
3.20000005
4,50000000
0,899999976
7.19999981
Termen Sens
Rank Este numărul de dimensiuni pe care le are o matrice. De exemplu, pentru matricea numită matrice, rangul este 2, iar
pentru matricea numită numere, rangul este 1.
Extindere Este numărul de elemente de-a lungul unei dimensiuni. De exemplu, numerele matricei au extensia 5, iar matricea
numită matrice are extensia 3 în ambele dimensiuni.
Formă Forma unui tablou este o matrice întregă unidimensională, care conține numărul de elemente (întinderea) din
fiecare dimensiune. De exemplu, pentru matricea matrice, forma este (3, 3), iar numerele matricei este (5).
mărimea Este numărul de elemente pe care le conține o matrice. Pentru matricea matrice, este 9, iar pentru numerele
matrice, este 5.
programul arrayToProcedure
întreg :: i
apelați printArray(myArray)
76
Machine Translated by Google
Fortran
! variabile locale
întreg :: i
fac i = 1, 5
a(i) = i
sfâr itul face
subrutina printArray(a)
întreg::i
fac i = 1, 5
Tipăriți *, a(i)
sfâr itul face
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
În exemplul de mai sus, subrutinele fillArray și printArray pot fi apelate numai cu matrice cu dimensiunea 5. Cu toate
acestea, pentru a scrie subrutine care pot fi folosite pentru matrice de orice dimensiune, le puteți rescrie folosind
următoarea tehnică:
programul arrayToProcedure
77
Machine Translated by Google
Fortran
întreg :: i
interfata
întreg :: i
întreg, dimensiune(:) :: a
întreg :: i
! variabile locale
întreg :: i, arraySize
do i = 1, arraySize
a(i) = i
sfâr itul face
78
Machine Translated by Google
Fortran
subrutina printArray(a)
integer::i, arraySize
do i = 1, arraySize
Tipăriți *, a(i)
sfâr itul face
Vă rugăm să rețineți că programul folosește funcția size pentru a obține dimensiunea matricei.
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
10
Secțiuni de matrice
Până acum ne-am referit la întreaga matrice, Fortran oferă o modalitate ușoară de a trimite mai multe elemente,
sau o secțiune a unei matrice, folosind o singură instrucțiune.
Pentru a accesa o secțiune matrice, trebuie să furnizați limitele inferioare și superioare ale secțiunii, precum și un
pas (increment), pentru toate dimensiunile. Această notație se numește triplet asubscript:
79
Machine Translated by Google
Fortran
Atunci când nu sunt menționate limite inferioare și superioare, acesta este implicit în limitele pe care le-ați declarat,
iar valoarea pasului este implicită la 1.
program arraySubsection
real, dimensiune(10) :: a, b
b(2:10:2) = 3,9
b(1:9:2) = 2,5
!afi a
do i = 1, asize
Tipăriți *, a(i)
do i = 1, bsize
Tipăriți *, b(i)
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
5,00000000
5,00000000
5,00000000
5,00000000
5,00000000
80
Machine Translated by Google
Fortran
5,00000000
5,00000000
0,00000000E+00
0,00000000E+00
0,00000000E+00
2,50000000
3,90000010
2,50000000
3,90000010
2,50000000
3,90000010
2,50000000
3,90000010
2,50000000
3,90000010
• Reducere
• Anchetă
• Constructii
• Reforma
• Manipulare
• Localizare
Func ie Descriere
81
Machine Translated by Google
Fortran
Exemplu
Următorul exemplu demonstrează produsul punctual:
programul arrayDotProduct
real, dimensiune(5) :: a, b
do i = 1, asize
a(i) = i
sfâr itul face
do i = 1, bsize
b(i) = i*2
sfâr itul face
do i = 1, asize
Tipăriți *, a(i)
sfâr itul face
do i = 1, bsize
Tipăriți *, b(i)
sfâr itul face
Imprimare*, produs_punct(a, b)
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
82
Machine Translated by Google
Fortran
1,00000000
2,00000000
3,00000000
4,00000000
5,00000000
2,00000000
4,00000000
6,00000000
8,00000000
10,0000000
110,000000
Exemplu
Următorul exemplu demonstrează multiplicarea matricei:
programul matMulProduct
întreg, dimensiune(3,3) :: a, b, c
întreg :: i, j
fac i = 1, 3
face j = 1, 3
a(i, j) = i+j
fac i = 1, 3
face j = 1, 3
imprimare*, a(i, j)
fac i = 1, 3
83
Machine Translated by Google
Fortran
face j = 1, 3
b(i, j) = i*j
fac i = 1, 3
face j = 1, 3
imprimare*, b(i, j)
c = matmul(a, b)
fac i = 1, 3
face j = 1, 3
imprimare*, c(i, j)
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
84
Machine Translated by Google
Fortran
20
40
60
26
52
78
32
64
96
Reducere
Următorul tabel descrie funcțiile de reducere:
Func ie Descriere
Returnează o valoare logică care indică dacă toate relațiile din mască
toate (mască, dim) sunt .adevărate., împreună cu doar dimensiunea dorită dacă este dat al doilea
argument.
Returnează o valoare logică care indică dacă orice relație din mască
orice (mască, dim) este .adevărată., împreună cu doar dimensiunea dorită dacă este dat al doilea
argument.
85
Machine Translated by Google
Fortran
Returnează cea mai mare valoare din tabloul matrice, dintre cele care se
supun relației din masca al treilea argument, dacă este dată aceea,
maxval(matrice, dim, mască)
împreună cu doar dimensiunea dorită dacă este dat al doilea argument
dim.
Returnează cea mai mică valoare din tabloul matrice, dintre cele care se
supun relației din masca al treilea argument, dacă este dată aceea,
minval (matrice, dim, mască)
împreună cu doar dimensiunea dorită dacă este dat al doilea argument
DIM.
Exemplu
Următorul exemplu demonstrează conceptul:
program arrayReduction
real, dimensiune(3,2) :: a
Tipăriți *, orice(a>5)
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
86
Machine Translated by Google
Fortran
Exemplu
Următorul exemplu demonstrează conceptul:
program arrayReduction
Imprimare *, maxval(a)
Tipărire *, minval(a)
Tipăriți *, suma(a)
Imprimare *, produs(a)
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
33,0000000
12,0000000
121,000000
47900160.0
Anchetă
Următorul tabel descrie funcțiile de interogare:
Func ie Descriere
alocat (matrice) Este o funcție logică care indică dacă matricea este alocată.
lbound(array, dim) Returnează limita inferioară a dimensiunii pentru matrice. Dacă dim (dimensiunea) nu este dat ca
argument, obțineți un vector întreg, dacă dim este inclus, obțineți valoarea întreagă cu
exact acea limită de dimensiune inferioară, pentru care ați cerut.
87
Machine Translated by Google
Fortran
dimensiune (matrice, dim) Returnează numărul de elemente dintr-o matrice. Dacă dim nu este specificat
și numărul de elemente din dimensiunea relevantă dacă dim este inclus.
Exemplu
Următorul exemplu demonstrează conceptul:
program arrayInquiry
real, dimensiune(3,2) :: a
Imprimare *, forma(a)
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
32
Constructie
Următorul tabel descrie funcțiile de construcție:
88
Machine Translated by Google
Fortran
Func ie Descriere
89
Machine Translated by Google
Fortran
Exemplu
Următorul exemplu demonstrează conceptul:
program arrayConstruction
real :: a(:,:)
logic :: a(:,:)
(/ 2, 3 /) )
fsursă = remodelare( (/ -35, -23, -18, -28, -26, -39 /), &
(/ 2,3 /) )
apelați write_array(tsource)
apelați write_array(fsource)
apelați write_l_array(mască)
real :: a(:,:)
90
Machine Translated by Google
Fortran
întoarcere
logic :: a(:,:)
întoarcere
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
TFF
FTF
Reformează
Următorul tabel descrie funcția de remodelare:
Func ie Descriere
91
Machine Translated by Google
Fortran
Exemplu
Următorul exemplu demonstrează conceptul:
programul arrayReshape
implicit nici unul
interfata
subrutina write_matrix(a)
real, dimensiune(:,:) :: a
sfârșitul subrutinei write_matrix
interfață finală
real, dimensiune (1:9) :: b = (/ 21, 22, 23, 24, 25, 26, 27, 28, 29 /)
real, dimensiune (1:16) :: pad1 = (/ -1, -2, -3, -4, -5, -6, -7, -8 și
c = remodelare( b, (/ 3, 3 /) )
apelați write_matrix(c)
apelează write_matrix(d)
apelați write_matrix(e)
apelează write_matrix(f)
92
Machine Translated by Google
Fortran
apelați write_matrix(g)
apelați write_matrix(h)
subrutina write_matrix(a)
real, dimensiune(:,:) :: a
scrie(*,*)
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
93
Machine Translated by Google
Fortran
Manipulare
Funcțiile de manipulare sunt funcții de schimbare. Funcțiile de schimbare returnează neschimbată forma unui tablou, dar
mută elementele.
Func ie Descriere
cshift(matrice, shift, dim) trebuie să fie un număr întreg scalar între 1 și n (unde n este egal
cu rangul matricei). Argumentul shift este un număr întreg scalar
sau o matrice întregă de rang n-1 și aceeași formă ca și tabloul, cu
excepția dimensiunii dim (care este eliminată din cauza rangului
inferior). Prin urmare, diferite secțiuni pot fi deplasate în diferite
direcții și cu un număr diferit de poziții.
94
Machine Translated by Google
Fortran
Exemplu
Următorul exemplu demonstrează conceptul:
programul arrayShift
real, dimensiune(1:6) :: x, y
scrie(*,10) a
x = cshift ( a, shift = 2)
scrie(*,10) x
scrie(*,10) y
x = eoshift ( a, deplasare = 2)
scrie(*,10) x
scrie(*,10) y
95
Machine Translated by Google
Fortran
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Exemplu
Următorul exemplu demonstrează transpunerea unei matrice:
program matrixTranspose
interfata
subrutina write_matrix(a)
întreg, dimensiune(:,:) :: a
interfață finală
întreg, dimensiune(3,3) :: a, b
întreg :: i, j
fac i = 1, 3
face j = 1, 3
a(i, j) = i
apelați write_matrix(a)
b = transpune(a)
96
Machine Translated by Google
Fortran
apelați write_matrix(b)
subrutina write_matrix(a)
întreg, dimensiune(:,:) :: a
scrie(*,*)
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
222
333
Matrice transpusă:
123
123
123
Locație
Func ie Descriere
Returnează poziția celui mai mare element din tabloul matrice, dacă masca
este inclusă numai pentru cei care îndeplinesc condițiile din masca, poziția
maxloc (matrice, mască)
este returnată și rezultatul este un vector întreg.
97
Machine Translated by Google
Fortran
Returnează poziția celui mai mic element din tabloul matrice, dacă masca este
inclusă numai pentru cei care îndeplinesc condițiile din masca, poziția este
minloc (matrice, mască)
returnată și rezultatul este un vector întreg.
Exemplu
Următorul exemplu demonstrează conceptul:
program arrayLocation
Imprimare *, maxloc(a)
Imprimare *, minloc(a)
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
98
Machine Translated by Google
O matrice dinamică este o matrice a cărei dimensiune nu este cunoscută în momentul compilării, dar va fi
cunoscută în momentul execuției.
De exemplu,
Rangul matricei, adică dimensiunile trebuie menționat, totuși, pentru a aloca memorie unui astfel de tablou,
folosiți funcția de alocare .
aloca ( darray(s1,s2) )
După ce matricea este utilizată, în program, memoria creată trebuie eliberată folosind funcția deallocate
dealocare (darray)
Exemplu
Următorul exemplu demonstrează conceptele discutate mai sus.
program dynamic_array
întreg :: s1, s2
întreg :: i, j
citește*, s1, s2
! aloca memorie
aloca (darray(s1,s2))
face i = 1, s1
face j = 1, s2
darray(i,j) = i*j
99
Machine Translated by Google
Fortran
dealocare (darray)
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
darray (1 , 1) = 1,00000000
darray (1 , 2) = 2,00000000
darray (1 , 3) = 3,00000000
darray (1 , 4) = 4,00000000
darray (2 , 1) = 2,00000000
darray (2 , 2) = 4,00000000
darray (2 , 3) = 6,00000000
darray (2 , 4) = 8,00000000
darray (3 , 1) = 3,00000000
darray (3 , 2) = 6,00000000
darray (3 , 3) = 9,00000000
darray (3 , 4) = 12,0000000
Declarația de date poate fi utilizată pentru inițializarea mai multor matrice sau pentru inițializarea
secțiunii de matrice.
Exemplu
Următorul exemplu demonstrează conceptul:
program dataStatement
100
Machine Translated by Google
Fortran
date a /7,8,9,10,11/
date b(2,:)/2,2,2/
date b(3,:)/3,3,3/
date (c(i),i=2,10,2)/5*2/
face j = 1, 5
imprimare*, a(j)
sfâr itul face
do i = lbound(b,1), ubound(b,1)
face j = 1, 10
imprimare*, c(j)
sfâr itul face
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Matricea A:
7
10
11
Matricea B:
111
222
333
101
Machine Translated by Google
Fortran
Matricea C:
4
Instrucțiunea where vă permite să utilizați unele elemente ale unui tablou într-o expresie, în funcție de
rezultatul unei anumite condiții logice. Permite executarea expresiei, pe un element, dacă condiția dată este
adevărată.
Exemplu
Următorul exemplu demonstrează conceptul:
program whereStatement
întreg :: a(3,5), i ,j
fac i = 1,3
face j = 1, 5
a(i,j) = ji
sfâr itul face
102
Machine Translated by Google
Fortran
unde(a<0)
a=1
în altă parte
a=5
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Matricea A:
01234
-1 0 1 2 3
-2 -1 0 1 2
Matricea A:
5 5 555
15 555
11555
103
Machine Translated by Google
Fortran vă permite să definiți tipuri de date derivate. Un tip de date derivat se mai numește și structură și
poate consta din obiecte de date de diferite tipuri.
Tipurile de date derivate sunt folosite pentru a reprezenta o înregistrare. De exemplu, dacă doriți să urmăriți
cărțile dvs. într-o bibliotecă, este posibil să doriți să urmăriți următoarele atribute despre fiecare carte:
• Titlu
• Autor
• Subiect
• ID carte
tastați tip_nume
declarații
tipul de capăt
tip Books
caracter(len=50) :: titlu
caracter(len=50) :: autor
caracter(len=150) :: subiect
întreg :: book_id
O structură de tip Books poate fi creată într-o declarație de tip, cum ar fi:
tip(Carti) :: carte1
104
Machine Translated by Google
Fortran
book1%title = „Programare C”
book1%book_id = 6495407
Exemplu
Următorul program ilustrează conceptele de mai sus:
programul derivDataType
!declara ie de tip
tip Books
caracter(len=50) :: titlu
caracter(len=50) :: autor
caracter(len=150) :: subiect
întreg :: book_id
tip(Carti) :: carte1
tip(Carti) :: carte2
book1%title = „Programare C”
book1%book_id = 6495407
book2%book_id = 6495700
105
Machine Translated by Google
Fortran
Tipărire *, carte1%titlu
Tipărire *, carte1%autor
Tipărire *, carte1%subiect
Print *, book1%book_id
Tipărire *, carte2%titlu
Tipărire *, carte2%autor
Tipărire *, carte2%subiect
Print *, book2%book_id
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Programare C
Nuha Ali
Tutorial de programare C
6495407
Facturare Telecom
Zara Ali
Matrice de structuri
De asemenea, puteți crea matrice de tip derivat:
list(1)%book_id = 6495407
106
Machine Translated by Google
Fortran
programul derivDataType
!declara ie de tip
tip Books
caracter(len=50) :: titlu
caracter(len=50) :: autor
caracter(len=150) :: subiect
întreg :: book_id
list(1)%book_id = 6495407
list(2)%book_id = 6495700
Print *, list(1)%title
Print *, list(1)%author
Imprimare *, listă(1)%subiect
Print *, list(1)%book_id
Print *, list(1)%title
Print *, list(2)%author
Imprimare *, listă(2)%subiect
107
Machine Translated by Google
Fortran
Print *, list(2)%book_id
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Programare C
Nuha Ali
Tutorial de programare C
6495407
Programare C
Zara Ali
108
Machine Translated by Google
În majoritatea limbajelor de programare, o variabilă pointer stochează adresa de memorie a unui obiect. Cu toate
acestea, în Fortran, un pointer este un obiect de date care are mai multe funcționalități decât doar stocarea adresei
de memorie. Conține mai multe informații despre un anumit obiect, cum ar fi tipul, rangul, extinderea și adresa de
memorie.
real, indicator, dimensiune (:) :: pra ! pointer către o matrice reală 1-dim
real, indicator, dimensiune (:,:) :: pra2 ! pointer către o matrice reală cu 2 dim
program pointerExample
întreg, indicator :: p1
aloca (p1)
p1 = 1
Tipărire *, p1
p1 = p1 + 4
Tipărire *, p1
109
Machine Translated by Google
Fortran
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Ar trebui să goliți spațiul de stocare alocat prin instrucțiunea deallocate atunci când nu mai este necesar și să
evitați acumularea de spațiu de memorie neutilizat și inutilizabil.
Ținte și Asociere
O țintă este o altă variabilă normală, cu spațiu rezervat pentru ea. O variabilă țintă trebuie declarată cu
atributul țintă .
program pointerExample
întreg, indicator :: p1
întreg, țintă :: t1
p1 => t1
p1 = 1
Tipărire *, p1
Tipărire *, t1
p1 = p1 + 4
Tipărire *, p1
Tipărire *, t1
t1 = 8
Tipărire *, p1
Tipărire *, t1
110
Machine Translated by Google
Fortran
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
• Nedefinit
• Asociat
• disociat
În programul de mai sus, am asociat pointerul p1, cu ținta t1, folosind operatorul =>. Funcția asociată testează
starea de asociere a unui pointer.
Nullify nu golește țintele, deoarece ar putea exista mai mult de un pointer care să indice aceeași țintă. Cu toate
acestea, golirea indicatorului implică și anularea.
Exemplul 1
Următorul exemplu demonstrează conceptele:
program pointerExample
întreg, indicator :: p1
întreg, țintă :: t1
întreg, țintă :: t2
p1 => t1
p1 = 1
Tipărire *, p1
Tipărire *, t1
p1 = p1 + 4
Tipărire *, p1
Tipărire *, t1
111
Machine Translated by Google
Fortran
t1 = 8
Tipărire *, p1
Tipărire *, t1
anulează (p1)
Tipărire *, t1
p1 => t2
Imprimare *, asociat(p1)
Tipărire *, p1
Tipărire *, t2
p1 = 10
Tipărire *, p1
Tipărire *, t2
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
952754640
952754640
112
Machine Translated by Google
Fortran
10
10
Vă rugăm să rețineți că de fiecare dată când rulați codul, adresele de memorie vor fi diferite.
Exemplul 2
program pointerExample
întreg, indicator :: a, b
întreg, țintă :: t
întreg :: n
t= 1
a => t
t=2
b => t
n=a+b
Tipăriți *, a, b, t, n
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
2224
113
Machine Translated by Google
Am văzut până acum că putem citi date de la tastatură utilizând instrucțiunea read * și, respectiv, afișam
rezultatul pe ecran folosind instrucțiunea print* . Această formă de intrare-ieșire este I/O în format liber și
se numește intrare-ieșire direcționată pe listă .
Cu toate acestea, I/O formatat vă oferă mai multă flexibilitate în ceea ce privește transferul de date.
Unde,
• lista-variabile este o listă a variabilelor care trebuie citite de la tastatură sau pe care trebuie scrise
ecran
Specificația formatului definește modul în care sunt afișate datele formatate. Este format dintr-un șir, care
conține o listă de descriptori de editare între paranteze.
Un descriptor de editare specifică formatul exact, de exemplu, lățimea, cifrele după virgulă zecimală etc.,
în care sunt afișate caracterele și numerele.
De exemplu:
Tipăriți „(f6.3)”, pi
114
Machine Translated by Google
Fortran
asteriscuri.
115
Machine Translated by Google
Fortran
Simbol Descriere
c Numărul coloanei
r Repet count – numărul de ori pentru a utiliza un descriptor sau un grup de descriptori
116
Machine Translated by Google
Fortran
Exemplul 1
programul printPi
pi = 3,141592653589793238
Tipăriți „(f6.3)”, pi
Tipăriți „(f10.7)”, pi
Tipăriți „(f20.15)”, pi
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
3.142
3.1415927
3.141592741012573
0,3142E-01
Exemplul 2
program printName
citește *,prenume
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat: (presupunem că utilizatorul introduce
numele Zara)
Zara
117
Machine Translated by Google
Fortran
Exemplul 3
program formatedPrint
tipăriți „(i6)”, k
tipăriți „(i6.3)”, k
tipăriți „(3i10)”, n, k, i
tipăriți „(i10,i3,i5)”, n, k, i
tipăriți „(a15)”,str
tipăriți „(f12.3)”, d
tipăriți „(e12.4)”, c
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
45
045
300789 45 2
300789 45 2
Punct de tutoriale
123.457
0,1279E-08
n = 300789 d = ******
118
Machine Translated by Google
Fortran
Declarația de format
Instrucțiunea de format vă permite să amestecați și să potriviți caractere, întregi și rezultate reale într-o singură
instrucțiune. Următorul exemplu demonstrează acest lucru:
program produsDetalii
întreg :: id
real :: greutate
nume = 'Ardupilot'
id = 1
greutate = 0,08
tipăriți 100
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
Ardupilot 1 0,08
119
Machine Translated by Google
În ultimul capitol, ați văzut cum să citiți și să scrieți date pe terminal. În acest capitol veți studia funcționalitățile de
intrare și ieșire ale fișierelor furnizate de Fortran.
Puteți citi și scrie în unul sau mai multe fișiere. Declarațiile OPEN, WRITE, READ și CLOSE vă permit să realizați acest
lucru.
Înainte de a utiliza un fișier, trebuie să deschideți fișierul. Comanda de deschidere este folosită pentru a deschide
fișiere pentru citire sau scriere. Cea mai simplă formă a comenzii este:
Specificator Descriere
Numărul unității u poate fi orice număr în intervalul 9-99 și indică fișierul, puteți alege
[UNITATE=] u orice număr, dar fiecare fișier deschis din program trebuie să aibă un număr unic
Este identificatorul de stare I/O și ar trebui să fie o variabilă întreagă. Dacă instrucțiunea
IOSTAT= ios open are succes, atunci valoarea ios returnată este zero, altfel o valoare diferită de zero.
ERR = greșeală Este o etichetă la care sare controlul în cazul oricărei erori.
Acesta arată starea anterioară a fișierului. Un șir de caractere și poate avea una dintre cele
STARE = sta trei valori NEW, OLD sau SCRATCH. Un fișier scratch este creat și șters atunci când este închis
sau programul se termină.
Este modul de acces la fișiere. Poate avea oricare dintre cele două valori, SECVENTIAL sau
ACCES = acc
DIRECT. Valoarea implicită este SECVENTIAL.
120
Machine Translated by Google
Fortran
FORM= frm Oferă starea de formatare a fișierului. Poate avea oricare dintre cele două valori
FORMATTED sau UNFORMATTED. Valoarea implicită este NEFORMATATE
După ce fișierul a fost deschis, acesta este accesat prin instrucțiuni de citire și scriere. Odată terminat, ar
trebui să fie închis folosind declarația close .
închidere ([UNIT=]u[,IOSTAT=ios,ERR=err,STATUS=sta])
Exemplu
Acest exemplu demonstrează deschiderea unui fișier nou pentru scrierea unor date în fișier.
real, dimensiune(100) :: x, y
real, dimensiune(100) :: p, q
întreg :: i
! date
face i=1.100
x(i) = i * 0,1
închide (1)
121
Machine Translated by Google
Fortran
Când codul de mai sus este compilat și executat, acesta creează fișierul data1.dat și scrie valorile matricei x și y în el.
Și apoi închide fișierul.
Au următoarea sintaxă:
Specificatorul END=s este o etichetă de instrucțiune în care programul sare când ajunge la sfârșitul fișierului.
Exemplu
Acest exemplu demonstrează citirea și scrierea într-un fișier.
În acest program citim din fișier, l-am creat în ultimul exemplu, data1.dat, și îl afișam pe ecran.
real, dimensiune(100) :: x, y
real, dimensiune(100) :: p, q
întreg :: i
! date
face i=1.100
x(i) = i * 0,1
face i=1.100
închide (1)
122
Machine Translated by Google
Fortran
face i=1.100
inchidere(2)
face i=1.100
Când codul de mai sus este compilat și executat, acesta produce următorul rezultat:
0,100000001 5,54589933E-05
0,200000003 4,41325130E-04
0,300000012 1,47636665E-03
0,400000006 3,45637114E-03
0,500000000 6,64328877E-03
0,600000024 1,12552457E-02
0,699999988 1,74576249E-02
0,800000012 2,53552198E-02
0,900000036 3,49861123E-02
1.00000000 4.63171229E-02
1.10000002 5.92407547E-02
1.20000005 7.35742599E-02
1.30000007 8.90605897E-02
1,39999998 0,105371222
1,50000000 0,122110792
1,60000002 0,138823599
1,70000005 0,155002072
1,80000007 0,170096487
1,89999998 0,183526158
123
Machine Translated by Google
Fortran
2,00000000 0,194692180
2,10000014 0,202990443
2,20000005 0,207826138
2,29999995 0,208628103
2,40000010 0,204863414
2,50000000 0,196052119
2,60000014 0,181780845
2,70000005 0,161716297
2,79999995 0,135617107
2,90000010 0,103344671
3.00000000 6.48725405E-02
3.10000014 2.02930309E-02
3.20000005 -3.01767997E-02
3.29999995 -8.61928314E-02
3,40000010 -0,147283033
3,50000000 -0,212848678
3,60000014 -0,282169819
3,70000005 -0,354410470
3,79999995 -0,428629100
3,90000010 -0,503789663
4,00000000 -0,578774154
4,09999990 -0,652400017
4,20000029 -0,723436713
4,30000019 -0,790623367
4,40000010 -0,852691114
4,50000000 -0,908382416
4,59999990 -0,956472993
4,70000029 -0,995793998
4,80000019 -1,02525222
4,90000010 -1,04385209
5,00000000 -1,05071592
5,09999990 -1,04510069
5,20000029 -1,02641726
5,30000019 -0,994243503
5,40000010 -0,948338211
5,50000000 -0,888650239
124
Machine Translated by Google
Fortran
5,59999990 -0,815326691
5,70000029 -0,728716135
5,80000019 -0,629372001
5,90000010 -0,518047631
6,00000000 -0,395693362
6,09999990 -0,263447165
6,20000029 -0,122622721
6.30000019 2.53026206E-02
6,40000010 0,178709000
6,50000000 0,335851669
6,59999990 0,494883657
6,70000029 0,653881252
6,80000019 0,810866773
6,90000010 0,963840425
7,00000000 1,11080539
7,09999990 1,24979746
7.20000029 1.37891412
7.30000019 1.49633956
7,40000010 1,60037732
7,50000000 1,68947268
7,59999990 1,76223695
7,70000029 1,81747139
7,80000019 1,85418403
7,90000010 1,87160957
8,00000000 1,86922085
8.10000038 1.84674001
8.19999981 1.80414569
8.30000019 1.74167395
8.40000057 1.65982044
8,50000000 1,55933595
8,60000038 1,44121361
8.69999981 1.30668485
8,80000019 1,15719533
8,90000057 0,994394958
9,00000000 0,820112705
9,10000038 0,636327863
125
Machine Translated by Google
Fortran
9,19999981 0,445154816
9,30000019 0,248800844
9.40000057 4.95488606E-02
9,50000000 -0,150278628
9,60000038 -0,348357052
9,69999981 -0,542378068
9,80000019 -0,730095863
9,90000057 -0,909344316
10,0000000 -1,07807255
126
Machine Translated by Google
O procedură este un grup de instrucțiuni care efectuează o sarcină bine definită și pot fi invocate din programul
dumneavoastră. Informațiile (sau datele) sunt transmise programului apelant, procedurii ca argumente.
• Func ii
• Subrutine
Func ie
O funcție este o procedură care returnează o singură cantitate. O funcție nu ar trebui să-și modifice argumentele.
Cantitatea returnată este cunoscută sub denumirea de valoare a funcției și este indicată de funcție
Nume.
Sintaxă:
Sintaxa unei funcții este următoarea:
[declarații executabile]
Următorul exemplu demonstrează o funcție numită area_of_circle. Calculează aria unui cerc cu raza r.
program calling_func
real :: a
a = zona_cercului(2.0)
Imprimare *, a
127
Machine Translated by Google
Fortran
! rezultatul funcției
! argumente false
real :: area_of_circle
! variabile locale
real :: r
real :: pi
pi = 4 * atan (1,0)
zona_cercului = pi * r**2
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
12,5663710
Opțiunea rezultatului
Dacă doriți ca valoarea returnată să fie stocată sub alt nume decât numele funcției, puteți utiliza opțiunea rezultat .
[declarații executabile]
128
Machine Translated by Google
Fortran
Subrutină
O subrutină nu returnează o valoare, totuși își poate modifica argumentele.
Sintaxă
numele subrutinei (arg1, arg2, ....)
[declarații executabile]
Următorul exemplu demonstrează definirea și utilizarea unui schimb de subrutine, care modifică valorile argumentelor sale.
program calling_func
real :: a, b
a = 2,0
b = 3,0
129
Machine Translated by Google
Fortran
real :: x, y, temp
temp = x
x=y
y = temp
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
a = 2,00000000
b = 3,00000000
a = 3,00000000
b = 2,00000000
program calling_func
real :: x, y, z, disc
x= 1,0
130
Machine Translated by Google
Fortran
y = 5,0
z = 2,0
Imprimare *, disc
! argumente false
(out) :: d
d = b * b - 4,0 * A * c
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
17,0000000
Proceduri recursive
Recursiunea apare atunci când un limbaj de programare vă permite să apelați o funcție în cadrul aceleiași funcții. Se numește
apel recursiv al funcției.
Când o procedură se autoapelează, direct sau indirect, se numește procedură recursivă. Ar trebui să declarați acest tip de
proceduri precedând cuvântul recursiv înainte de declararea acestuia.
131
Machine Translated by Google
Fortran
Următorul este un exemplu, care calculează factorial pentru un număr dat folosind o procedură recursivă:
program calling_func
întreg :: i, f
i = 15
f = myfactorial(15)
Tipărire *, f
! argumente false
întreg :: fac
caz (0:1)
fac = 1
caz implicit
132
Machine Translated by Google
Fortran
Proceduri interne
Când o procedură este conținută într-un program, se numește procedură internă a programului. Sintaxa pentru care
conține o procedură internă este următoarea:
program program_name
! declarații de tip
! instrucțiuni executabile
. . .
con ine
! proceduri interne
. . .
program mainprog
real :: a, b
a = 2,0
b = 3,0
con ine
real :: x, y, temp
temp = x
x=y
133
Machine Translated by Google
Fortran
y = temp
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
a = 2,00000000
b = 3,00000000
a = 3,00000000
b = 2,00000000
134
Machine Translated by Google
Un modul este ca un pachet în care vă puteți păstra funcțiile și subrutinele, în cazul în care scrieți un program foarte
mare, sau funcțiile sau subrutinele dvs. pot fi folosite în mai multe programe.
• Declararea variabilelor care pot fi puse la dispoziție în cadrul oricăror rutine pe care le alegeți.
• Importarea unui modul în întregime, pentru utilizare, într-un alt program sau subrutină.
numele modulului
[declarații de declarație]
folosește numele
• Variabilele declarate într-o parte a specificațiilor de modul, sunt globale pentru modul.
135
Machine Translated by Google
Fortran
• Variabilele declarate într-un modul devin variabile globale în orice program sau
rutină în care este utilizat modulul.
• Instrucțiunea use poate apărea în programul principal sau în orice altă subrutină sau modul care utilizează rutinele
sau variabilele declarate într-un anumit modul.
Exemplu
Următorul exemplu demonstrează conceptul:
constantele modulului
con ine
subrutina show_consts()
program module_example
utilizați constante
x = 2,0
raza = 7,0
ePowerx = e ** X
aria = pi * raza**2
apelați show_consts()
136
Machine Translated by Google
Fortran
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Pi = 3,14159274
e = 2,71828175
Cu toate acestea, puteți controla accesibilitatea codului modulului folosind atributele private și public . Când declarați o
variabilă sau subrutină ca fiind privată, aceasta nu este disponibilă în afara modulului.
Exemplu
Următorul exemplu ilustrează conceptul:
În exemplul anterior, am avut două variabile de modul, e și pi. Să le facem private și să observăm rezultatul:
constantele modulului
con ine
subrutina show_consts()
program module_example
utilizați constante
137
Machine Translated by Google
Fortran
x = 2,0
raza = 7,0
ePowerx = e ** X
aria = pi * raza**2
apelați show_consts()
Când compilați și executați programul de mai sus, acesta dă următorul mesaj de eroare:
ePowerx = e ** X
principal.f95:19.13:
aria = pi * raza**2
Deoarece e și pi, ambele sunt declarate private, programul module_example nu mai poate accesa aceste variabile.
constantele modulului
con ine
subrutina show_consts()
138
Machine Translated by Google
Fortran
funcția ePowerx(x)result(ePx)
real::x
real::ePx
ePx = e ** X
aria funcțieiCerc(r)rezultat(a)
real::r
real::a
a = pi * r**2
program module_example
utilizați constante
apelați show_consts()
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
Pi = 3,14159274
e = 2,71828175
139
Machine Translated by Google
Funcțiile intrinseci sunt câteva funcții comune și importante care sunt furnizate ca parte a limbajului Fortran. Am discutat
deja câteva dintre aceste funcții în capitolele Arrays, Characters și String.
• Func ii numerice
• Func ii matematice
• Funcții de caracter
• Funcții amabile
• Func ii logice
• Funcții de matrice.
Am discutat despre funcțiile matricei în capitolul Arrays. În secțiunea următoare oferim scurte descrieri ale tuturor acestor
funcții din alte categorii.
Funcții numerice
Func ie Descriere
Trunchiază o parte fracționară a lui A spre zero, returnând un număr real, întreg.
AINT (A [, KIND])
140
Machine Translated by Google
Fortran
ANINT (A [, KIND]) Returnează o valoare reală, cel mai apropiat număr întreg sau număr întreg.
Returnează cel mai mic număr întreg mai mare sau egal cu numărul A.
PLAFON (A [, FEL])
Acesta oferă cel mai mare număr întreg mai mic sau egal cu numărul A.
ETAJ (A [, KIND])
141
Machine Translated by Google
Fortran
Exemplu
program numericFunctions
! definiți constante
! definiți variabile
real :: a, b
complex :: z
! valorile pentru a, b
a = 15,2345
b = -20,7689
scrie (*),*) 'etaj (a): ',etaj (a),' etaj (b): ',etaj (b)
z = cmplx(a, b)
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
aint(b): -20,0000000
z: (15,2344999, -20,7688999)
142
Machine Translated by Google
Fortran
Funcții matematice
Func ie Descriere
143
Machine Translated by Google
Fortran
Exemplu
Următorul program calculează poziția orizontală și verticală x și respectiv y a unui proiectil după un timp, t:
program projectileMotion
! definiți constante
!defini variabile
real :: a, t, u, x, y
!valori pentru a, t și u
a = 45,0
t = 20,0
u = 10,0
a=a * pi / 180,0
x=u * cos(a) * t
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
x: 141,421356 y: -1818,57861
144
Machine Translated by Google
Fortran
Func ie Descriere
EPSILON (X) Returnează numărul care este aproape neglijabil în comparație cu unul.
Cu alte cuvinte, returnează cea mai mică valoare, astfel încât REAL( 1.0, KIND(X)) +
EPSILON(X) nu este egal cu REAL( 1.0, KIND(X)).
Func ie Descriere
CEL MAI APROPIAT (X, S) Acesta returnează cel mai apropiat număr de procesor diferit în direcția
dată
145
Machine Translated by Google
Fortran
Func ie Descriere
146
Machine Translated by Google
Fortran
Funcții de caracter
Func ie Descriere
INDEX (ȘIR, Returnează poziția de pornire cea mai din stânga (cea mai din
SUBȘIR [, ÎNAPOI]) dreapta dacă BACK este .TRUE.) a SUBSTRING în cadrul șirului.
147
Machine Translated by Google
Fortran
Returnează indexul celui mai din stânga (cel mai din dreapta dacă
SCANARE (ȘIR, SET [, ÎNAPOI]) BACK este .TRUE.) al șirului de caractere care aparțin lui SET sau 0 dacă
nu aparține niciunul.
Funcții amabile
Func ie Descriere
Funcția logică
Func ie Descriere
LOGIC (L [, KIND]) Convertiți între obiecte de tip logic cu parametri de tip diferit
148
Machine Translated by Google
Am discutat deja că, în versiunile mai vechi de Fortran, existau două tipuri reale : tipul real implicit și tipul cu precizie
dublă .
Cu toate acestea, Fortran 90/95 oferă mai mult control asupra preciziei tipurilor de date reale și întregi prin tipul
specific.
Atributul Bun
Diferite tipuri de numere sunt stocate diferit în interiorul computerului. Atributul kind vă permite
să specificați modul în care un număr este stocat intern. De exemplu,
real, fel = 2 :: a, b, c
real, fel = 4 :: e, f, g
întreg, fel = 2 :: i, j, k
întreg, fel = 3 :: l, m, n
În declarația de mai sus, variabilele reale e, f și g au mai multă precizie decât variabilele reale a, b și c. Variabilele
întregi l, m și n pot stoca valori mai mari și pot avea mai multe cifre pentru stocare decât variabilele întregi i, j și k.
Deși acest lucru depinde de mașină.
Exemplu
program kindSpecifier
real(tip = 4) :: a, b, c
real(tip = 8) :: e, f, g
întreg (tip = 2) :: i, j, k
întreg (tip = 4) :: l, m, n
fel_a = fel(a)
fel_i = fel(i)
kind_e = fel(e)
fel_l = fel(l)
149
Machine Translated by Google
Fortran
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
De exemplu, funcția intrinsecă bit_size(i) specifică numărul de biți utilizați pentru stocare. Pentru numerele
reale, funcția intrinsecă precizie(x) , returnează numărul de cifre zecimale de precizie, în timp ce funcția
intrinsecă range(x) returnează intervalul zecimal al exponentului.
Exemplu
programul getSize
implicit nici unul
real (tip = 4) :: a
real (tip = 8) :: b
întreg (tip = 2) :: i
întreg (tip = 4) :: j
150
Machine Translated by Google
Fortran
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
precizia realului(4) = 6
precizia realului(8) = 15
intervalul real(4) = 37
intervalul real(8) = 307
exponent maxim al real(4) = 128
exponent maxim al real(8) = 1024
exponent minim al real(4) = -125
exponent minim al real(8) = -1021
biți în număr întreg (2) = 16
biți în număr întreg (4) = 32
• select_int_kind (r)
Funcția selected_real_kind returnează un număr întreg care este valoarea parametrului tip tip
necesară pentru o precizie zecimală dată p și un interval de exponent zecimal r. Precizia zecimală
este numărul de cifre semnificative, iar intervalul exponentului zecimal specifică cel mai mic și cel mai
mare număr reprezentabil. Intervalul este astfel de la 10-r la 10+r.
De exemplu, selected_real_kind (p = 10, r = 99) returnează valoarea tip necesară pentru o precizie de
10 zecimale și un interval de cel puțin 10-99 până la 10+99.
Exemplu
151
Machine Translated by Google
Fortran
programul getKind
implicit nici unul
întreg:: i
Când compilați și executați programul de mai sus, acesta produce următorul rezultat:
152
Machine Translated by Google
Există diverse instrumente și biblioteci Fortran. Unele sunt gratuite, iar altele sunt servicii cu plată.
• EISPACK
• RUPA
• LINPACK
• MINPACK
• PACHET DE NOI
• SPECFUN
• STARPAC
• Re ete numerice
153
Machine Translated by Google
Stilul de programare se referă la respectarea unor reguli în timpul dezvoltării programelor. Aceste bune practici
oferă în programul dvs. valori precum lizibilitatea și lipsa de ambiguitate.
• Lizibilitatea
! buclă de la 1 la 10
face i=1,10
Cu toate acestea, dacă calculați coeficientul binomial și aveți nevoie de această buclă pentru nCr, atunci
un comentariu ca acesta va fi util:
face i=1,10
• Coduri de auto-verificare pentru a se asigura că nu vor exista erori numerice precum împărțirea la zero,
rădăcina pătrată a unui număr real negativ sau logaritmul unui număr real negativ.
• Includerea codurilor care asigură că variabilele nu iau valori ilegale sau în afara intervalului,
adică validarea intrărilor.
real :: x
x = sin(y) + 1,0
z = sqrt(x)
sfâr itul dacă
154
Machine Translated by Google
Un program de depanare parcurge codul și vă permite să examinați valorile din variabile și alte obiecte de date în timpul
execuției programului.
Punctele de întrerupere specifică unde trebuie să se oprească programul, în special după o linie critică de cod.
Execuțiile programului după ce variabilele sunt verificate la un punct de întrerupere.
Punctele de supraveghere sunt punctele în care este nevoie să fie verificate valorile unor variabile, în special după o
operație de citire sau scriere.
Debuggerul gdb
Depanatorul gdb, depanatorul GNU vine cu sistemul de operare Linux. Pentru sistemul X Windows, gdb vine cu o interfață
grafică și programul se numește xxgdb.
Comanda Scop
Execută numai următoarea linie a codului sursă, fără a intra în niciun apel de funcție
Următorul
Executați următoarea linie de cod sursă pasând într-o funcție în cazul unui apel de funcție.
Etapa
155
Machine Translated by Google
Fortran
Debuggerul dbx
Există un alt depanator, dbx debugger, pentru Linux.
Comanda Scop
opriți în [proc] Se oprește execuția atunci când este introdus un proces de procedură
Execută numai următoarea linie a codului sursă, fără a intra în niciun apel de funcție.
Următorul
Executați următoarea linie de cod sursă pasând într-o funcție în cazul unui apel de funcție.
Etapa
156