Materiały do ćwiczeń fortran


Materiały do ćwicze z programowania w Fortranie 77
v. 4.1.1
Andrzej Eilmes
Zakład Metod Obliczeniowych Chemii UJ
Kraków 2005, 2006
0. Wyja nienia
0.1. Czym ten tekst nie jest?
Poni szy tekst nie jest podr cznikiem programowania w Fortranie, czy innym j zyku, ani
podr cznikiem algorytmów, czy metod numerycznych.
0.2. Czym ten tekst jest?
Jest on prób skrótowego zebrania podstawowych informacji potrzebnych studentowi III roku
chemii do zaliczenia kursu programowania w j z. Fortran. W zasadzie omawia on standard
j zyka znany jako Fortran 77, z drobnymi, powszechnie przyj tymi rozszerzeniami poza
standard.
0.3. Notacja
Kod programu w Fortranie oraz pojedyncze polecenia b d ce cz ci j zyka zapisywane s
czcionk o stałej szeroko ci. Pochylony krój pisma sygnalizuje ogóln nazw lub ogólny
zapis wyra enia.
Fortran przestrzega pewnych reguł odno nie rozło enia polece w linii (p. 1.2), w
przedstawianych przykładach kolumny tekstu nie s odliczane; przy próbie zaprogramowania
przykładu nale y zadbać o odpowiednie spozycjonowanie tekstu.
2
1. Pierwsze kroki
1.1. Jak zapisać i uruchomić program w Fortranie 77?
Do zapisu programu w j zyku Fortran u ywamy nast puj cych symboli: liter alfabetu
łaci skiego (a-z), cyfr (0-9) oraz znaków:
+ - * / $ = ( ) , : .  (apostrof) !
(znak ! jako rozszerzenie niestandardowe, lecz w praktyce akceptowane przez wszystkie
kompilatory)
Inne znaki mog pojawić si w stałych tekstowych. Z wyj tkiem stałych tekstowych du e i
małe litery s uto samiane a znaki odst pu s pomijane.
Poprawny identyfikator obiektu (nazwa) w Fortranie 77 jest ci giem znaków składaj cym si
z liter i cyfr, zaczynaj cym si od litery. Du e i małe litery s uto samiane, odst py s
pomijane, zatem wszystkie poni sze nazwy:
$OD PD NRWD
DODPD.R7$
$ODP DNRWD
s równowa ne.
Kod ródłowy programu w Fortranie mo emy zapisać w dowolnym edytorze tekstowym, pod
warunkiem, e nie dodaje on do zapisywanego tekstu dodatkowych znaków. Wygodnie jest
u ywać jednego z programów rozpoznaj cych składni j zyka, np. HPDFV czy QHGLW.
Plik z zapisanym kodem ródłowym powinien mieć rozszerzenie wskazuj ce na jego
zawarto ć, czyli .f , .for, lub .f77, np. RND] I
Aby napisać kod ródłowy programu, uruchamiamy odpowiedni edytor, np. wydaj c w linii
polece rozkaz
QHGLW RND] I
Parametrem tego polecenia jest nazwa edytowanego pliku ( w naszym przypadku RND] I).
Dzi ki dodaniu symbolu & na ko cu b dziemy mogli wydawać w linii polece dalsze
rozkazy (kompilacja) bez zamykania okna edytora. Kod ródłowy nale y zapisać na dysku (w
przypadku edytora QHGLW poleceniem )LOH 6DYH).
Przed uruchomieniem programu niezb dna jest jego kompilacja, czyli przetłumaczenie na
zestaw instrukcji procesora danej maszyny (kod wykonywalny).
Pod systemami operacyjnymi Unix/Linux kompilator Fortranu 77 zwykle nazywa si I ,
parametrem jego wywołania jest nazwa (nazwy) plików, które nale y przetłumaczyć.
Aby skompilować program RND] I, mo emy zatem wydać w linii polece terminala
polecenie
I RND] I
Je li kompilacja przebiegnie bezbł dnie, na dysku zostanie zapisany kod wykonywalny pod
nazw D RXW . Mo emy go uruchomić wydaj c polecenie
D RXW
Aby utworzyć plik wykonywalny o okre lonej nazwie, polecenie I uzupełniamy o
parametr ąR , po którym podajemy dan nazw pliku wykonywalnego:
I Ä…R QD]ZDBSOLNXBZ\NRQ\ZDOQHJR QD]ZDBSOLNXB UyGáRZHJR
3
W naszym przypadku wygl dać mo e to nast puj co:
I Ä…R RND] [ RND] I
W wyniku zadziałania tego polecenia program zawarty w pliku RND] I zostanie
skompilowany a kod wykonywalny zapisany w pliku RND] [ (rozszerzenie tej nazwy mo e
być dowolne lub mo e go nie być wcale; tu u yli my rozszerzenia .x dla zaznaczenia, e
chodzi o plik wykonywalny (eXecutable)). Skompilowany w ten sposób program
uruchomimy poleceniem:
RND] [
1.2. Jak pisać kod programu w Fortranie 77?
Kod ródłowy programu w Fortranie 77 składa si z instrukcji czynnych i dyrektyw (zwanych
czasem instrukcjami biernymi). Instrukcje koduj polecenia wykonywane podczas działania
programu, natomiast dyrektywy zawieraj informacje dotycz ce interpretacji instrukcji
wykorzystywane przez kompilator podczas tłumaczenia kodu ródłowego.
Program fortranowski składa si z oddzielnych jednostek  segmentów. W ka dym programie
musi być dokładnie jeden segment główny  od niego rozpoczyna si działanie programu.
Dodatkowe segmenty (podprogramy) mog (lecz nie musz ) wyst pić w miar potrzeby.
Wszystkie dyrektywy obowi zuj ce w danym segmencie musz znale ć si na jego pocz tku
przed pierwsza instrukcj wykonywaln .
W standardzie Fortran 77 kod programu zapisuje si umieszczaj c instrukcje i dyrektywy w
kolejnych wierszach (po jednej w wierszu) w kolumnach 1-72.
Wła ciw tre ć instrukcji, czy dyrektywy zapisujemy w kolumnach 7-72. Znaki zapisane w
kolumnie 73 i dalszych mog być przez kompilator zignorowane, co mo e stać si ródłem
bł dów (np. przez pomini cie cz ci wyra enia).
Je li w kolumnie 1 wyst pi znak c, C lub *, to wiersz ten jest traktowany jako wiersz
komentarza a jego zawarto ć nie jest przez kompilator analizowana. Dodatkowo komentarz
mo na wprowadzić w dowolnym wierszu umieszczaj c w nim znak !. Cz ć wiersza na lewo
od ! jest wtedy traktowana jako instrukcja programu, cz ć na prawo od !  jako komentarz.
(Uwaga: u ycie wykrzyknika do zaznaczania komentarza jest rozszerzeniem w stosunku do
standardu fortranu 77)
W kolumnach 1-5 mo e pojawić si liczba całkowita dodatnia (bez znaku), b d ca tzw.
etykiet linii. Pozwala ona na przekazanie sterowania do linii o okre lonej etykiecie; wi cej
informacji na ten temat podane zostanie podczas omawiania instrukcji skoku.
Je li w kolumnie 6 znajduje si spacja lub 0 (zero), to wiersz ten jest traktowany jako odr bna
instrukcja. Je li znajdzie si tam inny znak, to linia ta jest traktowana jako kontynuacja
poprzedniej. Wiersz komentarza nie mo e być kontynuowany. Wiersz kontynuacji nie mo e
mieć etykiety.
1.3. Zapiszmy najprostszy program fortranowski.
Ka dy segment programu musi ko czyć si instrukcj HQG. Jest to instrukcja ko cz ca prac
danego segmentu (w przypadku segmentu głównego prac całego programu) a jednocze nie
podczas kompilacji stanowi dla kompilatora dyrektyw zaznaczaj c koniec segmentu.
4
Przed ko cz c segment główny instrukcj HQG mo e wyst pić instrukcja VWRS
zatrzymuj ca program. Umieszczenie jej tam nie jest w Fortranie 77 obowi zkowe  jest ona
implikowana przez instrukcj HQG ko cz c segment główny. Oprócz tego instrukcja VWRS
mo e pojawić si w kodzie programu w dowolnym miejscu. Jej wykonanie ko czy prac
programu.
Na pocz tku segmentu głównego mo e (lecz nie musi) pojawić si dyrektywa
SURJUDP QD]ZD
gdzie QD]ZD to poprawna fortranowska nazwa nadana danemu programowi (patrz 1.1). Nie
musi mieć ona nic wspólnego (choć dla wygody powinna) z nazw pliku, w którym został
zapisany kod programu.
Mo e zatem wygl dać nast puj co:
SURJUDP RND] GREU]H
Poni sza instrukcja jest nieprawidłowa:
SURJUDP RND] I ]OH
poniewa w nazwie nie mo e wyst pić kropka.
Dyrektywa ta mo e być pomini ta (kompilator i bez niej jest w stanie rozpoznać pocz tek
segmentu głównego)
Mo emy zatem zapisać kod prostego programu fortranowskiego:
SURJUDP RND]
VWRS
HQG
Jak wspomnieli my powy ej, instrukcja VWRS przed ko cowym HQG nie jest potrzebna (w
zwi zku z czym zazwyczaj nie jest u ywana), dlatego nasz program mo e wygl dać
nast puj co:
SURJUDP RND]
HQG
Poniewa dyrektyw SURJUDP mo na pomin ć, ostatecznie otrzymujemy najkrótszy
poprawny program w Fortranie 77:
HQG
Program ten jest bezbł dny, tym niemniej po uruchomieniu natychmiast sko czy prac nie
daj c adnych efektów swojej działalno ci.
Skło my go zatem do wypisania jakiego komunikatu dodaj c instrukcj ZULWH:
SURJUDP RND]
ZULWH Å›:LWDP\ Å›
HQG
5
Instrukcj ZULWH omówimy szczegółowo pó niej, na tym etapie wystarczy wiedzieć, e:
- gwiazdki w nawiasach oznaczaj wypisanie tekstu na standardowe wyj cie (ekran) w sposób
niezredagowany (bez okre lenia, jak wydruk ma wygl dać)
- tekst w apostrofach to stała tekstowa, która b dzie wypisana przez instrukcj ZULWH
W wyniku zadziałania powy szego programu powinni my zobaczyć na monitorze tekst
Witamy !
Zadanie:
 Zepsuj kod powy szego programu robi c jaki bł d (przekr caj c które ze słów,
wstawiaj c zł nazw programu, usuwaj c który nawias, apostrof lub gwiazdk , usuwaj c
instrukcj HQG). Sprawd , jaka b dzie reakcja kompilatora.
6
2. Jak obliczyć warto ć prostego wyra enia?
2.1. Typy
W Fortranie stałe i zmienne s okre lonego typu  okre laj cego jak reprezentowane s w
pami ci maszyny. W ród typów podstawowych j zyka na tym etapie interesować nas b d
typy numeryczne: LQWHJHU (całkowity), UHDO (rzeczywisty) i FRPSOH[ (zespolony). Inne
typy to FKDUDFWHU (znakowy) i ORJLFDO (logiczny).
W przypadku typów numerycznych mo emy dodatkowo okre lić, ile bajtów (1 bajt = 8
bitów) przeznaczone jest na zapisanie w pami ci danej stałej lub zmiennej.
W szczególno ci liczby całkowite mog być zapisane z u yciem 2 lub 4 bajtów, liczby
rzeczywiste z u yciem 4 lub 8 bajtów a do zapisu liczby zespolonej (b d cej par liczb
rzeczywistych) potrzeba 8 lub 16 bajtów.
Rodzaj typu mo emy wi c okre lić podaj c jego nazw i ewentualnie specyfikuj c długo ć
(po symbolu patrz uwaga ni ej), np.
LQWHJHU
LQWHJHU
LQWHJHU
UHDO
UHDO
UHDO
FRPSOH[
FRPSOH[
Typ rzeczywisty długi (UHDO ) jest nazywany typem podwójnej dokładno ci (GRXEOH
SUHFLVLRQ).
Je li nie okre limy długo ci typu UHDO czy LQWHJHU, najcz ciej domy lnie przyjmuje si ,
i jest to typ 4-bajtowy (czyli LQWHJHU jest równowa ne LQWHJHU a UHDO odpowiada
UHDO ).
Uwaga: specyfikacja długo ci przez *GOXJRVF, jest niestandardowym rozszerzeniem, powy ej
podana została jego interpretacja najcz ciej u ywana na maszynach typu PC.
2.2. Stałe
Zapisem stałej całkowitej jest ci g cyfr dziesi tkowych, poprzedzony znakiem (znak + mo e
być pomini ty), bez separatora dziesi tnego, np.
7
Na wi kszo ci architektur dopuszczalny zakres liczb całkowitych to [-32768, 32767] dla
liczb LQWHJHU i [-2147483648, 2147483647] dla liczb LQWHJHU .
Stał rzeczywist mo emy zapisać jako liczb rzeczywist z kropk jako separatorem
dziesi tnym, lub liczb rzeczywist z wykładnikiem. Zerow cz ć całkowit albo zerow
cz ć ułamkow (ale nie obie jednocze nie) mo na pomin ć. Cz ci wykładnicz stałej
rzeczywistej jest stała całkowita (ze znakiem lub bez) podana po literze ( (dla UHDO ) lub
' (dla GRXEOH SUHFLVLRQ).
Przykładowe zapisy stałych rzeczywistych:


H (czyli 1  10 )
( (czyli 2  10 )
H (jak wy ej)


G (czyli -1.12  10 )

' (czyli 4  10 )
H (czyli 1  10 )
Stałe rzeczywiste zapisane bez u ycia H lub G s typu UHDO (czyli w praktyce najcz ciej
UHDO .
Nale y pami tać, e w Fortranie typ odnosi si do sposobu reprezentacji danych w pami ci a
nie do przynale no ci do odpowiedniego zbioru w sensie definicji matematycznej, np. stała 2
oznacza liczb całkowit (bez cz ci ułamkowej) a stała 2.0 liczb rzeczywist (z zerow
cz ci ułamkow ).
Zakres liczb rzeczywistych zale y od konkretnej architektury komputera i stosowanej
reprezentacji liczb rzeczywistych. Ogólnie mo na stwierdzić tylko tyle, e dla liczb UHDO
zakres ten nie jest mniejszy ni dla typu UHDO a ilo ć miejsc znacz cych
zapami tywanych dla liczby UHDO jest wi ksza ni dla UHDO .
Działania na liczbach całkowitych s dokładne (2+2 jest równe dokładnie 4), natomiast w
przypadku liczb rzeczywistych wynik działania jest przybli ony (2.0+2.0 mo e być równe
4.000001).
2.3. Zmienne, specyfikacja typów zmiennych
Zmienna reprezentuje w programie Fortranowskim wielko ć okre lonego typu; warto ć
zmiennej mo e być modyfikowana w trakcie działania programu. Zmienna jest
identyfikowana przez swoj nazw (zasady tworzenia nazw  patrz 1.1).
Poni sze nazwy zmiennych s poprawne:
[ DOSKD VORLN ] SL M SLSRO SROHNROD
8
Poni sze nie (dlaczego?)
[ SROHNRáD GZD L SRO
Zmienne mog być dowolnego z typów omówionych wy ej.
Typ zmiennej mo na okre lić na trzy sposoby:
a) przez jawn specyfikacj na pocz tku segmentu programu
Specyfikacja ta polega na podaniu nazwy typu oraz listy (oddzielonych przecinkami) nazw
zmiennych, którym chcemy nadać ten typ, np.
LQWHJHU OLF]ED Q N
UHDO U SL SROH
FRPSOH[ FDOND
FKDUDFWHU QD]ZLVNR
Ostatnia specyfikacja mówi, i zmienna QD]ZLVNR jest typu tekstowego, o długo ci 20
znaków.
b) przy pomocy dyrektywy LPSOLFLW
Dyrektywy LPSOLFLW (je li wyst puj ) musz znale ć si na pocz tku segmentu, przed
innymi specyfikacjami.
Dyrektywa ta ma postać
LPSOLFLW W\S OLVWD
gdzie W\S to okre lenie typu a OLVWD zawiera oddzielone przecinkami litery (np. a) lub zakresy
liter (np. a-h) uszeregowane alfabetycznie. Oznacza ona, i zmienne o nazwach
zaczynaj cych si na litery wyst puj ce na li cie b d miały przypisany podany typ (chyba,
e z jawnych specyfikacji typu opisanych w punkcie a) wynika co innego).
Przykład:
Dyrektywy
LPSOLFLW LQWHJHU L N O
UHDO D F R
FRPSOH[ ]
oznaczaj , i zmienne o nazwach zaczynaj cych si na litery i,j,k,l b d całkowite
dwubajtowe, o nazwach zaczynaj cych si na a,b,c,o  rzeczywiste 8-bajtowe, a zmienne o
nazwach zaczynaj cych si na z  zespolone, 16-bajtowe (je li jawnie nie za damy inaczej)
c) w przypadku, gdy typu zmiennej nie mo na okre lić na podstawie jawnej specyfikacji typu
lub dyrektyw LPSOLFLW, obowi zuje nast puj ca reguła pierwszej litery nazwy:
9
- zmienne o nazwach zaczynaj cych si na litery od i do n s całkowite (LQWHJHU) (na PC
najcz ciej 4-bajtowe)
- zmienne o nazwach zaczynaj cych si na pozostałe litery alfabetu (a-h,o-z) s rzeczywiste
(UHDO) (na PC najcz ciej 4-bajtowe).
Aby ustalić jakiego typu ma być dana zmienna, stosujemy reguły (a), (b) i (c) w powy szej
kolejno ci ko cz c sprawdzanie w momencie znalezienia odpowiedzi (tzn. najwa niejsza jest
jawna specyfikacja typu (a); w przypadku jej braku sprawdza si dyrektywy LPSOLFLW (b) a
w ostatniej kolejno ci stosuje si reguł pierwszej litery nazwy (c))
Przykład:
Je li w segmencie programu u yto nast puj cych dyrektyw:
SURJUDP ]PLHQQH
LPSOLFLW UHDO N W X
LPSOLFLW LQWHJHU D M
LPSOLFLW GRXEOH SUHFLVLRQ [ \
LPSOLFLW FRPSOH[ ]
LQWHJHU WUDZD DQQD EODG
UHDO NXUD SROH SURPLHQ
UHDO ]RUUR
to u yte w tym segmencie zmienne b d nast puj cych typów (w nawiasie podano, z której
reguły to wynika):
WUDZD Ä… LQWHJHU MDZQD VSHF\ILNDFMD
WHVW UHDO G\UHNW\ZD LPSOLFLW
SROH UHDO MDZQD VSHF\ILNDFMD
NXUD UHDO MDZQD VSHF\ILNDFMD
NURZD UHDO G\UHNW\ZD LPSOLFLW
DQQD LQWHJHU MDZQD VSHF\ILNDFMD
MDMNR LQWHJHU G\UHNW\ZD LPSOLFLW
LQQD LQWHJHU OLWHUD QD]Z\
GU]HZR UHDO OLWHUD QD]Z\
EXGD UHDO OLWHUD QD]Z\
EODG LQWHJHU MDZQD VSHF\ILNDFMD
]RUUR UHDO MDZQD VSHF\ILNDFMD GRP\ OQD GáXJR ü
]RUUR FRPSOH[ G\UHNW\ZD LPSOLFLW
QRZD LQWHJHU OLWHUD QD]Z\
[ UHDO G\UHNW\ZD LPSOLFLW GRXEOH SUHFLVLRQ L
UHDO WR QD 3& V\QRQLP\
Zapominanie o regułach przydzielania typów zmiennych prowadzi do bł dów w programie.
Z tego powodu cz sto stosowana jest nast puj ca postać dyrektywy LPSOLFLW (jest to
wtedy pierwsza i jedyna taka dyrektywa w segmencie):
LPSOLFLW QRQH
10
Oznacza ona, e wszystkie zmienne w segmencie musz być jawnie zadeklarowane z
wyspecyfikowaniem typu (w przeciwnym wypadku kompilator zgłasza bł d). Oprócz
zmniejszenia ilo ci pomyłek wynikaj cych z zapominania o regułach fortranu, cz ciowo
zabezpiecza ona tak e przed bł dami wynikaj cymi z omyłkowego przekr cenia nazwy
zmiennej. Powy sza składnia dyrektywy LPSOLFLW jest rozszerzeniem poza standard f77.
Inn cz sto stosowan w programach obliczeniowych dyrektyw jest:
LPSOLFLW UHDO D K R ]
Powoduje ona, i wszystkie zmienne, które na podstawie reguły pierwszej litery nazwy
miałyby typ UHDO b d teraz UHDO (chyba, e jawnie za damy dla konkretnej
zmiennej czego innego).
Przypomnijmy jeszcze raz, e wszystkie specyfikacje typów zmiennych musz pojawić si
przed pierwsz czynn instrukcj w segmencie.
2.4. Wyra enia
Wyra enie składa si ze stałych, zmiennych i wywoła funkcji poł czonych operatorami i
ewentualnie pogrupowanych za pomoc nawiasów.
Funkcje omówione zostan bardziej szczegółowo w dalszej cz ci tekstu, tutaj podajemy
jedynie podstawowe informacje.
Do funkcji odwołujemy si przez jej nazw , argument(y) funkcji podajemy w nawiasach ()
oddzielaj c przecinkami (je li jest wi cej ni jeden).
Na tym etapie wymie my nazwy paru u ytecznych dla nas funkcji wewn trznych (b d cych
cz ci j zyka)(zestawienie funkcji wewn trznych znajduje si w Uzupełnieniu A):
DEV  warto ć bezwzgl dna
VTUW  pierwiastek kwadratowy
ORJ  logarytm naturalny
H[S  funkcja wykładnicza
VLQ FRV WDQ  funkcje trygonometryczne (argument w mierze Å‚ukowej)
DVLQ DFRV DWDQ  funkcje odwrotne do VLQ FRV WDQ
Wszystkie wymienione wy ej funkcje maj jeden argument wywołania, np.
ORJ VLQ [ FRV $OSKD H[S VTUW
Z wyj tkiem funkcji DEV wszystkie wymienione wy ej nie dopuszczaj argumentu
całkowitego, zatem np. wywołanie VTUW jest nieprawidłowe.
Operatory arytmetyczne to:
operator dodawania i odejmowania
operator mno enia i dzielenia
operator pot gowania
Powy sze operatory s u ywane jako operatory dwuargumentowe, tzn. w wyra eniach postaci
11
DUJXPHQW RSHUDWRU DUJXPHQW
np. [ .
Oprócz tego operatory + i  mog wyst pić przed jednym argumentem, wtedy argument
stoj cy przed operatorem przyjmuje si jako równy 0, np.
$ jest równowa ne $
; jest równowa ne ;
Podczas obliczania warto ci wyra enia arytmetycznego przestrzega si reguł wykonywania
operacji w kolejno ci:
obliczanie warto ci funkcji, pot gowanie, (mno enie i dzielenie), (dodawanie i odejmowanie)
Kolejno ć t mo na zmienić u ywaj c nawiasów okr głych ( ). W przypadku konieczno ci
u ycia kilku poziomów nawiasów u ywa si tylko nawiasów okr głych, np.
D E F
Dla operatorów o jednakowym priorytecie obowi zuje kolejno ć  z lewa na prawo , z

wyj tkiem pot gowania, które wykonuje si  od prawej do lewej (czyli [ \ to [ ).
adnego operatora nie mo na pomin ć (zatem mamy [ a nie [), dwa operatory nie
mog wyst pować obok siebie pod rz d (zatem [ a nie [ )
Przykłady wyra e arytmetycznych:
[
FRV [ (pojedyncza stała, zmienna lub wywołanie funkcji to te wyra enie
arytmetyczne)
D E
F G DOSKD EHWD
[ \
FRV [ ]
ORJ VTUW (wywołania funkcji mog si zagnie d ać)
[
Przy zapisie wyra e nale y zwracać uwag na kolejno ć wykonywania oblicze .


Np. zapis [ to [ , natomiast [ to po prostu x/3.
D D
Podobnie zapis jako D E F jest niepoprawny (oznacza bowiem F )
EF E
Poprawny zapis to D E F lub D E F
2.5. Instrukcja przypisania
Jedn z najcz ciej u ywanych w Fortranie instrukcji jest instrukcja przypisania.
12
Ma ona postać:
]PLHQQD Z\UD HQLH
Podczas wykonania instrukcji przypisania najpierw oblicza si warto ć wyra enia po prawej
stronie znaku = a nast pnie warto ć ta zostaje przypisania zmiennej stoj cej po lewej stronie
znaku =.
Przykłady instrukcji przypisania:
Q
[ \
] FRV [ \
Nale y zwrócić uwag na fakt, i znak = w instrukcji przypisania nie jest operatorem relacji
równo ci. Instrukcje
[ \
i
\ [
nie s równowa ne. Po wykonaniu pierwszej z nich zmienne [ i \ b d miały tak warto ć,
jak pocz tkowo miała zmienna \; po wykonaniu drugiej obie zmienne maj warto ć równ
pocz tkowej warto ci zmiennej [.
Zmienna mo e wyst pić po obu stronach instrukcji przypisania. W takim przypadku
wyra enie po prawej oblicza si dla starej warto ci zmiennej, a nast pnie podstawia do
zmiennej now warto ć, np.
Q
Q Q Q
Powy sza instrukcja nie jest zapisem równo ci, a zmian warto ci zmiennej Q: po jej

wykonaniu Q b dzie równe (3 + 3 +1).
Po lewej stronie instrukcji przypisania mo e wyst pić jedynie nazwa zmiennej; u ycie stałej
czy wyra enia jest tam niedopuszczalne, np.:
[ ]OH
[ \ WH] ]OH
2.6. Konwersja typów
Omawiaj c wyra enia i instrukcj przypisania nie zajmowali my si dot d kwesti typów
stałych i zmiennych pojawiaj cych si w wyra eniach. Obecnie czas uzupełnić wiadomo ci
na ten temat.
13
W przypadku funkcji typ argumentu i wyniku zale y od konkretnej funkcji. Na przykład
logarytmowanie mo emy zrealizować przy pomocy nast puj cych funkcji:
nazwa typ argumentu typ wyniku
DORJ UHDO UHDO
GORJ UHDO UHDO
FORJ FRPSOH[ FRPSOH[
W Fortranie 77 istniej tzw. nazwy grupowe funkcji, np. ORJ dla funkcji logarytmicznej.
Przy ich u yciu typ wyniku (i dokładno ć oblicze ) zale y od typu argumentu, np. wynik
obliczenia ORJ b dzie typu UHDO a wynik ORJ G typu UHDO .
Pozwala to stosować nazwy funkcji takie, jak wymienione w p. 2.4.
Dla ustalenia typu wyniku powstałego po działaniu operatora arytmetycznego stosujemy
hierarchi typów (od najni szego do najwy szego):
LQWHJHU LQWHJHU UHDO UHDO FRPSOH[ FRPSOH[
Zasada ustalania typu wyniku jest nast puj ca: je li oba argumenty operatora s jednakowego
typu, to wynik b dzie tego samego typu. Je li typ argumentów jest ró ny, to typ ni szy
zostaje skonwertowany na wy szy i wynik b dzie tego typu (wy szego).
Konwersja ta polega na dodaniu zerowej cz ci ułamkowej przy przej ciu z LQWHJHU do
UHDO, dodaniu miejsc znacz cych (wypełnionych zerami) przy przej ciu z UHDO do
UHDO , dodaniu zerowej cz ci urojonej odpowiedniego typu (UHDO lub UHDO ) przy
konwersji na liczb zespolon .
Przykład: Załó my, e zmienne L M s typu LQWHJHU , [ \ typu UHDO a W typu
UHDO
w wyra eniu L obie cz ci składowe s typu LQWHJHU i taki te b dzie wynik
w wyra eniu [ M warto ć M zostanie skonwertowana z typu LQWHJHU do UHDO ,
wynik b dzie typu UHDO
w wyra eniu W [ wynik b dzie UHDO ([ zostaje skonwertowane do UHDO )
podczas obliczania wyra enia W [ L najpierw L zostanie skonwertowane do UHDO w
celu obliczenia iloczynu [ L, nast pnie wynik tego mno enia podniesiony do typu UHDO i
taki b dzie typ ko cowego wyniku.
Z faktu, i jednakowy typ argumentów operatora oznacza taki sam typ wyniku, wynikaj
istotne konsekwencje dotycz ce działa na liczbach całkowitych.
Na przykład wynik dzielenia liczb całkowitych jest całkowity, zostaje zatem zachowana
tylko jego cz ć całkowita równa 0. Podobnie jest te równe 0 (całkowite). W
przypadkach tych nast puje odrzucenie cz ci ułamkowej (a nie zaokr glenie), zatem
wynikiem dzielenia jest te 0 (całkowite).
W podanym przypadku zmian typu wyniku mo emy wymusić zmieniaj c typ
któregokolwiek argumentu, zatem wynikiem działa , , b dzie
0.333333
14
Sposobu tego nie mo na zastosować do wyra enia typu L M (L M jest niepoprawne); w tym
przypadku pomocne s funkcje konwersji typów (LQW na całkowity, UHDO na rzeczywisty 4-
bajtowy, GEOH na UHDO i FPSO[ na zespolony); w naszym przykładzie mo emy zapisać
UHDO L M otrzymuj c w wyniku 0.3333333.
Pozostaje teraz ustalić, co stanie si je li typ wyra enia po prawej stronie instrukcji
podstawienia b dzie inny ni typ zmiennej stoj cej po lewej stronie. W takim przypadku
dokonywana jest konwersja prawej strony na odpowiedni typ. Podniesienia wyniku do typu
stoj cego wy ej w hierarchii odbywa si w sposób opisany wy ej, konwersja na typ
znajduj cy si w hierarchii ni ej polega na odrzuceniu zb dnej cz ci urojonej liczby,
nadmiarowych cyfr znacz cych b d cz ci ułamkowej liczby (redukcja odbywa si przez
obci cie, a nie zaokr glenie).
Przykłady:
Załó my, e zmienne maj typy wynikaj ce z konwencji pierwszej litery nazwy.
W wyniku wykonania instrukcji
L
M
[ L M
zmienna [ przyjmie warto ć 3.0 (rzeczywiste) poniewa M jest równe 1 (całkowite)
Przy wykonaniu instrukcji
[
\
M [ \
iloraz po prawej stronie instrukcji podstawienia zostanie obliczony jako 1.5 i skonwertowany
do 1 w celu zapisania w zmiennej całkowitej.
2.7. Jeszcze troch informacji o instrukcjach czytania i pisania...
W rozdziale 1.3 u yli my instrukcji ZULWH do wypisania pojedynczej stałej tekstowej.
Instrukcji tej mo emy podać list wyra e oddzielonych przecinkami (w szczególno ci mog
to być stałe, zmienne, wywołania funkcji); podczas wykonywania instrukcji warto ci wyra e
s obliczane i wyprowadzane na ekran.
Na przykład instrukcja
ZULWH Å›[ Å› [ Å› FRV [ Å› FRV [
wypisze na ekranie w jednym wierszu kolejno: tekst x= , aktualn warto ć zmiennej [ , tekst
cos(x)= oraz warto ć funkcji cos(x) obliczon dla aktualnej warto ci zmiennej [.
Nietrudno zauwa yć, i potrzebujemy instrukcji pozwalaj cej na podanie programowi
warto ci zmiennych b d cych danymi. U ycie w tym celu instrukcji podstawienia typu
[ ZDUWR ü jest niecelowe, poniewa dowolna zmiana danych wymagaÅ‚aby edycji kodu
ródłowego programu i powtórnej kompilacji.
15
Nasz problem rozwi zuje instrukcja UHDG. U ywa ona listy zmiennych oddzielonych
przecinkami, podczas wykonania oczekuje na podanie kolejnych warto ci i przypisuje je
kolejnym zmiennym na li cie. Np.
UHDG [ \ Q
podczas wykonania programu przypisze trzy podawane z klawiatury liczby kolejno
zmiennym [ \ oraz Q. Parametr oznacza, i czytanie odbywa si z klawiatury w
sposób  swobodny tzn. nie wymagaj cy szczególnego redagowania danych. Dane mo na
podać w jednym wierszu oddzielaj c je przecinkami lub znakami tabulacji i ko cz c wiersz
naci ni ciem klawisza enter, lub podawać kolejno naciskaj c enter po wpisaniu ka dej liczby.
Na li cie instrukcji UHDG mog znale ć si jedynie zmienne; nie mog tam wyst pić stałe,
wywołania funkcji czy wyra enia (nie b d ce pojedynczymi zmiennymi).
Przy swobodnym czytaniu danych mo na podać liczb całkowit (np. 2) w momencie, gdy
program oczekuje na wczytanie warto ci zmiennej rzeczywistej (zostanie uzupełniona zerow
cz ci ułamkow ). W przypadku odwrotnym (podanie liczby rzeczywistej, gdy program
próbuje wczytać warto ć zmiennej całkowitej) wygenerowany zostanie komunikat o bł dzie.
Podczas wykonywania instrukcji UHDG program oczekuje na podanie danych bez adnych
innych efektów. Korzystne jest zatem poprzedzić instrukcj UHDG odnosz c si do
klawiatury instrukcj ZULWH wy wietlaj c odpowiedni komunikat dla u ytkownika, np.:
ZULWH śSRGDM ZDUWRVF [ś
UHDG [
U ycie w wyra eniu zmiennej, której wcze niej nie nadano warto ci przez instrukcj UHDG
lub instrukcj przypisania spowoduje u ycie warto ci przypadkowo znalezionej w pami ci
komputera, zatem wynik te b dzie przypadkowy.
2.8. ... i mo emy co obliczyć.
Napiszmy program obliczaj cy pole koła na podstawie zadanego promienia.
Potrzebujemy zmiennej rzeczywistej przechowuj cej warto ć promienia (wczytamy t
warto ć z klawiatury). Zmienne przechowuj ce warto ci stałej p oraz pole koła te musz być
rzeczywiste.
Wybierzmy zatem nazwy zmiennych:
r  promie koła
pi  warto ć pi
p  pole koła
Pozostaje kwestia okre lenia warto ci zmiennej pi. Miło nicy utworów typu  NWR ] ZROL L
P\ OL VSDPL WDü SL ]HFKFH F\IU\ WHQ ]GRáD ustal , i jest to ok. 3.1415926535, tym niemniej
nie gwarantuje to u ycia tylu cyfr znacz cych, ile przechować mo e zmienna danego typu.
Obliczmy wi c pi np. z równo ci:
p = 4arctg(1)
(pami tać nale y o nazwie funkcji arctg w Fortranie i typie argumentu).
16
Podejmijmy jeszcze decyzj o jawnym specyfikowaniu zmiennych i ostatecznie mamy nasz
przykładowy program:
SURJUDP SROHNROD
LPSOLFLW QRQH
UHDO U SL S QLH ]DOXMP\ VRELH GRNODGQRVFL
ZULWH śSRGDM SURPLHQ NRODś
UHDG U
SL DWDQ G
S SL U
ZULWH śSROH NROD Z\QRVL ś S
HQG
Poniewa instrukcji ZULWH mo emy podać wyra enie, nasz program mógłby te wygl dać
nast puj co:
SURJUDP SROHNROD
LPSOLFLW QRQH
UHDO U
ZULWH śSRGDM SURPLHQ NRODś
UHDG U
ZULWH śSROH NROD Z\QRVL ś DWDQ G U
HQG
Zadanie:
Napisz program obliczaj cy pole i obj to ć kuli na podstawie jej promienia.
17
3. Podejmowanie decyzji w programie
3.1. Relacje i wyra enia logiczne
Jak wspomnieli my w rozdziale poprzednim, w Fortranie wyst puje typ logiczny
(ORJLFDO). Wyra enia logiczne mog przyjmować dwie warto ci: WUXH i IDOVH
(kropki s cz ci zapisu stałej)  prawda i fałsz.
Najcz ciej u ywanymi elementami wyra e logicznych s relacje. Przyjmuj one warto ci
prawda lub fałsz w zale no ci od warto ci porównywanych wyra e . Operator relacji działa
na dwa argumenty numeryczne lub na dwa argumenty znakowe (tym przypadkiem nie
b dziemy si teraz zajmować):
DUJXPHQW RSHUDWRUBUHODFML DUJXPHQW
Wynikiem takiej operacji jest jedna z dwu warto ci logicznych.
Operatory relacji u ywane w Fortranie to:
JW. - wi ksze
JH - wi ksze lub równe
OW - mniejsze
OH - mniejsze lub równe
HT - równe
QH - ró ne
Argumenty arytmetyczne poł czone operatorem relacji mog być ró nych typów; w takim
przypadku nast puje konwersja typów zgodnie z regułami opisanymi w r. 2.6.
Przykładowe zapisy relacji:
JW (czyli 2 > 3)
QH (czyli 2 Ä… 3)
[ JH (czyli x Ë 0)
Q P HT Q (czyli n+m = 5n+1)
Oczywi cie warto ć logiczna pierwszej z tych relacji to IDOVH a drugiej WUXH ;
warto ci logiczne pozostałych zale od aktualnych warto ci zmiennych [, Q i P.
Wyra enie logiczne w Fortranie mo e składać si ze stałych logicznych, zmiennych i funkcji
typu logicznego oraz relacji poł czonych operatorami logicznymi.
W Fortranie 77 mamy nast puj ce operatory logiczne:
QRW - zaprzeczenie
DQG - koniunkcja (iloczyn logiczny)
RU - alternatywa (suma logiczna)
HTY - równowa no ć
QHTY - nierównowa no ć
18
Z wyj tkiem QRW operatory te s dwuargumentowe, tzn. u ywane s w wyra eniach typu:
S RSHUDWRU T
Poni ej zestawione zostały wyniki tej operacji w zale no ci od warto ci logicznej S i T.
S T DQG RU HTY QHTY
WUXH WUXH WUXH WUXH WUXH IDOVH
WUXH IDOVH IDOVH WUXH IDOVH WUXH
IDOVH WUXH IDOVH WUXH IDOVH WUXH
IDOVH IDOVH IDOVH IDOVH WUXH IDOVH
Jednoargumentowy operator QRW zmienia warto ć logiczn wyra enia, przed którym stoi
na przeciwn .
Priorytet działania operatorów logicznych (kolejno ć wykonywania operacji) maleje w
kolejno ci: QRW , DQG , RU , (równocenne HTY i QHTY ). W razie potrzeby
kolejno ć wykonywania oblicze mo na zmienić przy pomocy nawiasów ( ). W przypadku
operatorów o jednakowym priorytecie obliczenia wykonuje si od lewej do prawej.
Obliczanie warto ci wyra enia logicznego mo e być przerwane w momencie, kiedy znana
jest jego warto ć, np. obliczanie cz ci składowych wyra enia typu:
Z\UD]HQLH RU Z\UD]HQLH RU Z\UD]HQLH RU Z\UD]HQLH
mo e zostać przerwane, kiedy napotka si pierwsze wyra enie prawdziwe (bo wtedy
wiadomo ju , e cała alternatywa jest prawdziwa).
Przy obliczaniu warto ci wyra enia logicznego operacje wykonuje si w kolejno ci:
obliczenie wyra e arytmetycznych, obliczenie warto ci relacji, działanie operatorów
logicznych.
Przykład:
Je li zmienna x ma warto ć 1.0, zmienna y warto ć 2.5, a WHVW jest zmienn typu
logicznego, to warto ć wyra enia
[ JW \ DQG [ OW RU QRW \ JH wynosi IDOVH
po podstawieniu warto ci logicznych relacji jest ono bowiem równowa ne wyra eniu
(nawiasami zaznaczono kolejno ć operacji przy uwzgl dnieniu priorytetu operatorów
logicznych):
WUXH DQG IDOVH RU QRW WUXH
czyli IDOVH RU IDOVH
za instrukcja
WHVW [ OW \ QHTY IDOVH
nadaje zmiennej WHVW warto ć WUXH .
19
3.2. Porównywanie warto ci typów rzeczywistych
Ze wzgl du na sko czon reprezentacj typów rzeczywistych w j zyku Fortran, warto ci tych
typów obarczone s pewnym bł dem. Co wi cej, pewnym (dodatkowym) bł dem obarczony
jest te wynik ka dej operacji arytmetycznej wykonywanej na tych warto ciach.
Wskutek tego dwie liczby, które byłyby sobie równe, gdyby obliczenia nie były obci one
bł dami reprezentacji, mog nie być równe w przypadku przeprowadzania oblicze na
warto ciach typów rzeczywistych. Analogicznie, dwie liczby które ró niłyby si od siebie
nieznacznie w przypadku przeprowadzenia dokładnych oblicze , mog być równe sobie, gdy
obliczenia przeprowadzamy na warto ciach typów rzeczywistych.
Powoduje to, e u ywanie operatora równo ci (.HT.) i nierówno ci (.QH.) do porównania
dwóch warto ci typu rzeczywistego, jakkolwiek dopuszczalne składniowo, stanowi zwykle
bł d logiczny w programie. Poniewa bł d ten wynika ze specyficznych wła ciwo ci relacji
równo ci/nierówno ci, nie dotyczy on innych relacji pomi dzy warto ciami typów
rzeczywistych.
Problem ten nie wyst puje w przypadku porównywania warto ci typów całkowitych.
Zauwa my, e sprawdzanie, czy dwie warto ci rzeczywiste s sobie równe, to na ogół złe
postawienie problemu. Warto ci te bowiem zwykle reprezentuj wielko ci, które w praktyce
mo emy zmierzyć tylko z pewn sko czon dokładno ci , np. długo ć, mas , temperatur ,
g sto ć elektronow , itp. Wobec tego zamiast pytać, czy dwie wielko ci rzeczywiste s
równe, powinni my zapytać, czy ró nica pomi dzy nimi jest tak mała, e mo emy j
zaniedbać. Zatem, je eli z rozwa enia fizycznych uwarunkowa problemu wynika, e dwie


wielko ci ró ni ce si np. o 1  10 mo na uznać za praktycznie równe, to zamiast relacji:
[ HT \
zapiszemy
DEV [ \ OW G
(u yli my funkcji zwracaj cej warto ć bezwzgl dn , gdy nie wiemy z góry, jaki jest znak
ró nicy).
3.3. Instrukcja blokowa LI
Wiedz c jak ustalić warto ć logiczn wyra enia, mo emy zastosować t wiedz do
podejmowania decyzji w programie.
Je li w zale no ci od prawdziwo ci pewnych warunków logicznych zmieniaj si czynno ci,
które powinien wykonać program, mo emy posłu yć si blokow instrukcj LI. Jej ogólna
postać to:
20
LI (ZDUXQHN) WKHQ
FL J LQVWUXNFML
HOVH
FL J LQVWUXNFML
HQG LI
(dopuszczalna jest pisownia HQG LI i HQGLI )
W powy szym schemacie ZDUXQHN oznacza wyra enie logiczne (w szczególno ci mo e to być
relacja). Je li jest ono prawdziwe, to wykonywany jest FL J LQVWUXNFML (tzw. blok if). Je li
wyra enie jest fałszywe, to wykonywany jest FL J LQVWUXNFML (tzw. blok else). W obu
przypadkach nast pnie wykonywana jest instrukcja nast puj ca po HQGLI.
Przykład:
LI [ \ JW WKHQ
]
HOVH
]
HQGLI
ZULWH ]
W wyniku wykonania powy szej instrukcji na ekranie komputera pojawi si liczba 2.5 je li
suma [ \ była wi ksza od 0 albo liczba  2.5 je li suma [ \ była mniejsza lub równa 0.
Zwróć uwag na wci cie instrukcji bloków if i else (przesuni cie w prawo). Nie jest ono
wymagane, jednak zaleca si stosowanie wci ć w instrukcjach blokowych, gdy poprawia to
czytelno ć kodu.
Cz ć HOVH mo na pomin ć  konstrukcja wygl da wtedy nast puj co:
LI (ZDUXQHN) WKHQ
FL J LQVWUXNFML
HQG LI
&L J LQVWUXNFML jest wykonywany, gdy warunek jest spełniony, w przeciwnym wypadku
przechodzi si od razu do instrukcji nast puj cej po HQGLI.
21
Instrukcje blokowe LI mog być zagnie d one  jak w przykładzie:
LI [ JW WKHQ
ZULWH Å›[ ZLHNV]H RG Å›
HOVH
LI [ OW WKHQ
ZULWH Å›[ PQLHMV]H RG Å›
HOVH
ZULWH Å›[ URZQH Å›
HQGLI
HQGLI
W przykładzie tym cz ć HOVH zewn trznej instrukcji LI jest wykonywana, gdy x jest
mniejsze lub równe 0, st d u ycie drugiej instrukcji LI do sprawdzenia, z któr z tych
mo liwo ci mamy do czynienia.
Zadanie: wykorzystuj c powy szy szkielet dwu instrukcji blokowych LI, napisz program,
który policzy pierwiastki rzeczywiste równania kwadratowego o zadanych współczynnikach
a,b,c lub stwierdzi, e pierwiastki rzeczywiste nie istniej .
3.4. Logiczna instrukcja LI
Popatrzmy na przykład zast pienia warto ci zmiennej [ jej warto ci bezwzgl dn (w
rzeczywisto ci u yliby my do tego funkcji DEV):
LI [ OW WKHQ
[ [
HQGLI
Zauwa my, e mamy do wykonania tylko jedn instrukcj i to tylko w przypadku, gdy
warunek jest spełniony (dlatego pomini ta została cz ć HOVH instrukcji).
W takiej sytuacji mo emy posłu yć si logiczn instrukcj LI w postaci
LI ZDUXQHN LQVWUXNFMD
Je li ZDUXQHN jest spełniony, wykonywana jest wyst puj ca po nim LQVWUXNFMD, w przeciwnym
wypadku przechodzi si do instrukcji w nast pnym wierszu.
Zauwa brak słów WKHQ i HQGLI. Tylko niektóre instrukcje s dopuszczalne jako
LQVWUXNFMD w powy szym schemacie; w szczególno ci mog to być instrukcja przypisania,
instrukcje UHDG, ZULWH, JRWR (patrz p. 3.5), VWRS, wywołanie procedury (patrz punkt 7.3)
.
Nasz przykład mogliby my zatem zapisać w bardziej zwartej postaci:
LI [ OW [ [
22
3.5. Bezwarunkowa instrukcja skoku JR WR
W dotychczas omawianych przykładach poszczególne instrukcje wykonywane były w
kolejno ci, w jakiej zostały zapisane w kodzie ródłowym. Fortran oferuje instrukcj skoku
bezwarunkowego pozwalaj cego zmienić t kolejno ć poprzez przeniesienie sterowania do
instrukcji opatrzonej odpowiedni etykiet .
Etykiet stanowi stała całkowita bez znaku zapisana w kolumnach od 1-5 (patrz p. 1.2).
Etykiety dodajemy tylko tam, gdzie jest to niezb dne  nie ma obowi zku etykietowania
wszystkich linii kodu. Przypomnijmy jeszcze (p. 1.2), e wiersz kontynuacji nie mo e być
etykietowany. Etykieta nie jest w aden sposób zwi zana z numerem wiersza, w którym si
znajduje  nic nie stoi na przeszkodzie, aby 127 linia kodu miała etykiet np. 14. Wygodne
jest jednak umieszczanie etykiet w kolejno ci rosn cej, co ułatwia znalezienie konkretnej
etykiety w kodzie ródłowym. Pomocne jest tak e nadawanie etykiet rosn cych o wi cej ni 1
(na ogół stosuje si krok 10, tzn. 10, 20, 30...), co umo liwia na dalszym etapie pisania
programu wstawienie nowej etykiety pomi dzy dwie ju istniej ce przy zachowaniu ich
uporz dkowania.
Instrukcja skoku ma nast puj c postać:
JR WR HW\NLHWD
(dopuszczalna jest pisownia JR WR lub JRWR). W wyniku wykonania tej instrukcji
nast puje przeniesienie sterowania do instrukcji opatrzonej HW\NLHW .
Przykład:
LPSOLFLW QRQH
UHDO [
ZULWH śSRGDM OLF]EHś
UHDG [
LI [ OW WKHQ
ZULWH śSRGDOHV OLF]EH XMHPQD NRQF]H SUDFHś
VWRS
HQGLI
ZULWH VTUW [
JRWR
HQG
Program ten wypisuje na ekranie pierwiastki kwadratowe liczb kolejno podawanych z
klawiatury i ko czy prac po podaniu liczby ujemnej (wykonane zostan wtedy instrukcje
zawarte w bloku instrukcji LI). Instrukcja JRWR słu y w tym przypadku do powrotu do
pocz tku sekwencji powtarzanych instrukcji. Jak widać, instrukcja VWRS mo e być u yta w
dowolnym miejscu do zatrzymania programu.
23
Nale y zauwa yć, e u ywanie instrukcji JR WR wymaga na ogół u ycia tak e instrukcji LI,
w przeciwnym wypadku albo cz ć instrukcji nie zostanie nigdy wykonana:
SURJUDP OHQLZ\
LPSOLFLW QRQH
LQWHJHU Q
Q
JRWR
M
LQVWUXNFMH Z WHM F] FL SURJUDPX QLJG\ QLH E G Z\NRQDQH
M
ZULWH Q
HQG
albo program wpadnie w nieko cz c si p tl :
SURJUDP QHYHUHQGLQJ
ZULWH ś3DQVWZRZD ,QVSHNFMR 3UDF\ UDWXM ś
ZULWH śQLH SR]ZDODMD PL ]DNRQF]\F SUDF\ ś
ZULWH
JRWR
HQG
Stosuj c instrukcje JR WR łatwo mo na uzyskać całkowicie nieczyteln struktur programu.
Z tego powodu ze skoku nale y korzystać tylko w razie konieczno ci.
Zadanie: Zmodyfikuj tak program z p. 2.8 (obliczanie pola koła o zadanym promieniu), aby
u ytkownik mógł podawać nast pne warto ci U; program powinien sko czyć prac po
podaniu przez u ytkownika ujemnego promienia koła.
24
4. Organizacja oblicze cyklicznych
4.1. Cykl typu  podczas gdy
Implementacja algorytmów wymaga cz sto zaprogramowania powtarzaj cych si czynno ci.
Z punktu widzenia organizacji programu, tego typu powtórzenia mo emy podzielić na dwie
grupy:
1) Ilo ć powtórze nie jest z góry znana  powtarzać cykl instrukcji musimy tak długo, jak
długo s spełnione pewne warunki. Ten typ omówimy w niniejszym podrozdziale.
2) Ilo ć powtórze jest z góry zadana  tego typu powtórzenia realizujemy przy pomocy
instrukcji p tli (p. 4.2).
W standardzie Fortranu 77 odczuwa si dotkliwy brak znanej z innych j zyków
programowania instrukcji typu  podczas gdy ... powtarzaj (instrukcja ta wchodzi w skład
nowszych wersji j zyka). Realizacj tego typu cyklu prowadzi si zatem przy u yciu
instrukcji LI oraz instrukcji skoku JR WR, np. organizuj c obliczenia w sposób nast puj cy:
HW\NLHWD LQVWUXNFMD
FL J LQVWUXNFML
LI (ZDUXQHN) WKHQ
JRWR HW\NLHWD
HQGLI
Na ko cu ci gu powtarzanych instrukcji sprawdzany jest ZDUXQHN powtarzania oblicze . Je li
jest prawdziwy, wykonuje si skok do pierwszej z powtarzanych instrukcji, w przeciwnym
wypadku wykonywane zostan instrukcje po HQGLI. Nale y zauwa yć, i działanie
powtarzanych instrukcji musi powodować po pewnej ilo ci powtórze zmian warto ci
logicznej warunku instrukcji LI, w przeciwnym wypadku program wpadnie w niesko czon
p tl .
Mo na te zauwa yć, e w opisanym przykładzie zamiast instrukcji blokowej LI ... HQGLI
mo na u yć logicznej instrukcji LI:
LI (ZDUXQHN) JRWR HW\NLHWD
skracaj c zapis.

Przykład: Dodatni pierwiastek równania [ = F mo na wyznaczyć iteracyjnie, przyjmuj c
jak startow warto ć x a nast pnie obliczaj c kolejne przybli enia:
Ä…
1 F
[ ª ²
= [ +
ª ²
2 [
½ Õ
Ci g obliczanych warto ci d y do F .
25
Spróbujmy zaprogramować ten algorytm, startuj c z 1 jako pierwszego przybli enia i
prowadz c obliczenia tak długo, jak długo dwa kolejne przybli enia ró ni si o wi cej ni
pewn zadan warto ć e. Nie potrafimy z góry powiedzieć, ile iteracji b dziemy musieli
wykonać.
Potrzebne dane to zatem F i e.
Zauwa my, e nie musimy w programie pami tać wszystkich obliczanych kolejno warto ci 
do sprawdzenia warunku wystarczy nam znajomo ć przedostatniej (oznaczmy j [) i ostatniej
(oznaczmy j [Q).
Nasz program mo e wi c wygl dać nast puj co:
SURJUDP SLHUZ
LPSOLFLW QRQH
UHDO F HSV [ [Q
ZULWH śSRGDM SLHUZLDVWNRZDQD OLF]EH L GRNODGQRVFś
UHDG F HSV
[
[Q [ F [
ZULWH [Q
LI DEV [Q [ JW HSV WKHQ
[ [Q
JRWR
HQGLI
ZULWH śF ś F
ZULWH śZDUWRVF SLHUZLDVWND ] Fś
ZULWH Å›] LWHUDFML Å› [Q Å› ] IXQNFML Å› VTUW F
HQG
W ród szeregu powtarzanych instrukcji umie cili my instrukcj ZULWH wypisuj c aktualnie
obliczone przybli enie, aby móc obserwować zbie no ć. W warunku instrukcji LI badamy
warto ć bezwzgl dn ró nicy dwu ostatnich przybli e , poniewa nie wiemy z góry, jaki jest
jej znak. Je li warunek jest spełniony (czyli mamy kontynuować iteracje), to ostatnio
obliczon warto ć ([Q) przypisujemy zmiennej [ i powracamy do instrukcji opatrzonej
etykiet 10, aby uzyskać nast pne przybli enie. Zatem po ka dym wykonaniu instrukcji 10,
zmienna [Q zawiera ostatnie a zmienna [  przedostatnie obliczone przybli enie pierwiastka
z F.
Przy podawaniu ko cowego wyniku wypisali my dla porównania warto ć dokładn obliczon
przy pomocy standardowej funkcji Fortranu. Nale y te zwrócić uwag na to, i je li dwie
kolejno obliczone przybli enia ró ni si o mniej ni e, to wcale nie musi st d wynikać, i
ró nica w stosunku do warto ci dokładnej te jest mniejsza ni e.
Zadanie. Zmodyfikuj program tak, aby móc zmieniać startowe przybli enie pierwiastka (w
naszym programie było równe 1, niezale nie od F). Zbadaj, jak wpływa ono na zbie no ć.
26


Zbadaj, czy program daje poprawne wyniki dla du ych (np. 10 ) i małych (np. 10 ) F. Je li
nie, zastanów si , czy potrafisz zaproponować jak poprawk .
4.2. Instrukcja GR
Drugim przypadkiem oblicze cyklicznych jest sytuacja, w której znamy z góry ilo ć
powtórze . Przykładem mo e być wypisanie tabeli warto ci funkcji w zadanym przedziale,
czy obliczenie sumy liczb od 1 do 1.
Mo emy wtedy skorzystać z instrukcji GR, maj cej postać:
GR ]PLHQQD = ZBSRF], ZBNRQF, VNRN
(LQVWUXNFMH)
HQG GR
]PLHQQD oznacza tutaj nazw tzw. zmiennej steruj cej.
ZBSRF], ZBNRQF i VNRN s wyra eniami arytmetycznymi (w szczególno ci mog to być stałe
lub nazwy zmiennych)
Je li VNRN jest równy 1, to mo na go pomin ć.
Konstrukcja z HQG GR jest ponadstandardowym (tym niemniej zaimplementowanym w
praktycznie ka dym współczesnym kompilatorze) rozszerzeniem Fortranu 77.
Wykonanie p tli przebiega nast puj co (jest to opis praktycznych skutków działania, a nie
technicznej realizacji p tli):
Pocz tkowo zmienna steruj ca ]PLHQQD przyjmuje warto ć pocz tkow ZBSRF]. Sprawdzany
jest nast pnie warunek, czy wykonywać instrukcje p tli, tzn. czy ]PLHQQD jest nie wi ksza od
warto ci ko cowej ZBNRQF, je li VNRN jest dodatni, albo czy ]PLHQQD jest nie mniejsza od
ZBNRQF, je li VNRN jest ujemny. Je li warunek jest spełniony, to wykonywany jest ci g
instrukcji mi dzy GR a HQGGR (dopuszczalna pisownia z odst pem lub bez). Nast pnie
warto ć zmiennej steruj cej ]PLHQQD zmienia si o VNRN i warunek sprawdza si ponownie. W
momencie, kiedy warunek nie jest spełniony, działanie p tli ko czy si i wykonywana jest
instrukcja nast pna po HQGGR.
Instrukcje wewn trz p tli nie mog powodować zmiany warto ci zmiennej steruj cej.
Niedozwolona jest instrukcja skoku JRWR powoduj ca skok z zewn trza p tli do jej rodka.
Przykłady:
a)
GR L
È
HQGGR
Instrukcje w p tli b d wykonane 5 razy (zmienna steruj ca L przyjmie kolejno warto ci
1,2,3,4 i 5). Poniewa skok jest równy 1, wi c mo na go pomin ć:
27
GR L
È
HQGGR
b)
GR NN
È
HQGGR
Instrukcje w p tli b d wykonane 3 razy (zmienna steruj ca N przyjmie kolejno warto ci 10,
14, 18).
c)
GR OLF]QLN
È
HQGGR
Instrukcje w p tli b d wykonane 5 razy (zmienna steruj ca OLF]QLN przyjmie kolejno
warto ci 20, 15, 10, 5, 0).
d)
GR M
È
HQGGR
Instrukcje w p tli b d wykonane tylko 1 raz (zmienna steruj ca M przyjmie warto ć 10).
e)
GR M
È
HQGGR
Instrukcje w p tli nie b d wykonane ani razu (bo warunek wykonywania p tli jest
niespełniony ju na starcie: warto ć pocz tkowa jest wi ksza od ko cowej przy dodatnim
skoku).
Aatwo zauwa yć, e VNRN nie mo e być równy 0.
P tle mog si zagnie d ać (wtedy musz mieć ró ne zmienne steruj ce):
Q
GR L Q
GR M
HQGGR
HQGGR
28
Szybciej wykonywana jest p tla wewn trzna. Zatem w powy szym przykładzie w trakcie
przebiegu p tli zewn trznej dla L = 1 zostanie 3 razy wykonana p tla wewn trzna (dla M
równego kolejno 1, 3 i 5). Podobnie b dzie dla kolejnych wykona p tli zewn trznej (dla L
równego 2, 3 i 4).
Jakkolwiek standard Fortranu 77 dopuszcza, aby zmienna steruj ca p tl lub wyra enia
ZBSRF], ZBNRQF lub VNRN były rzeczywiste, to ze wzgl du na specyfik oblicze na liczbach
rzeczywistych najlepiej potraktować t mo liwo ć jako kuriozalny  wypadek przy pracy
podczas definiowania standardu i u ywać jedynie zmiennych i wyra e całkowitych. W
przeciwnym wypadku nie mo na być pewnym, ile razy p tla zostanie wykonana.
4.3. Przykłady wykorzystania p tli GR

1) Zróbmy tabel warto ci funkcji z = x y dla x i y zmieniaj cych si w przedziałach od  1
do 1 z krokiem 0.1
Aby w p tli móc u ywać całkowitej warto ci kroku, przeskalujmy jej granice i skok, tzn.
organizujmy p tl od  10 do 10 z krokiem 1. Musimy wtedy uwzgl dnić przeskalowanie przy
obliczaniu funkcji, (podzielić warto ć argumentu przez 10):
SURJUDP WDEHOND
LPSOLFLW QRQH
LQWHJHU L[ L\
UHDO [ \
GR L[
[ L[
GR L\
\ L\
ZULWH Å›[ Å› [ Å› \ Å› \ Å› ] Å› [ \
HQGGR
HQGGR
HQG
Zadanie. W powy szym przykładzie wiedzieli my z góry, jak przeskalować zmienne, aby
móc u ywać całkowitych warto ci do indeksowania p tli. Zmodyfikuj program tak, aby
u ytkownik mógł podać granice zmienno ci x i y oraz krok (kroki).
Wskazówka: Je li zmienna rzeczywista x ma zmieniać si od xp do xk z krokiem xs, to
mo emy zapisać nast puj c konstrukcj p tli:
GR L Q[
[ [S L [V
HQGGR
Zastanów si , jak ze znajomo ci [S, [N i [V wyznaczyć warto ć Q[ potrzebn do
zorganizowania tej p tli. Pomocna mo e być funkcja QLQW zwracaj ca najbli sz liczb
całkowit (np. QLQW jest równe 5).
29
2) Obliczmy sum kolejnych liczb całkowitych od 1 do 1.
Program mo e wygl dać nast puj co:
SURJUDP VXPDOLF]E
LPSOLFLW QRQH
LQWHJHU L V Q
ZULWH śSRGDM 1ś
UHDG Q
V
GR L Q
V V L
HQGGR
ZULWH śVXPD OLF]E RG GR ś Q ś Z\QRVL ś V
HQG
W powy szym programie zmienna V przechowuje warto ć sumy, dlatego przed rozpocz ciem
sumowania musi zostać wyzerowana. P tla do przebiega po kolejnych liczbach naturalnych
od 1 do N. Przy ka dym przebiegu p tli suma jest zwi kszana o kolejn liczb (tzn. L).
Zadania. Napisz program, który policzy sum kwadratów kolejnych liczb naturalnych od 1
do N.
Napisz program, który policzy silni zadanej liczby. Co nale y zrobić ze zmienn
przechowuj c warto ć iloczynu przed rozpocz ciem wykonywania p tli? Sprawd , jakie
wyniki daje program dla Q = 12, 13, 14, 15, 17. Takie zachowanie przy przekroczeniu zakresu
dopuszczalnych liczb całkowitych jest normalne  wynika z własno ci arytmetyki na tych
liczbach. Zmie wobec tego typ zmiennej przechowuj cej warto ć silni na UHDO i
sprawd , dla jak du ego Q mo esz obliczyć Q! Zrób to samo dla zmiennej typu UHDO .
Dla jeszcze wi kszych Q pozostaje obliczanie log Q! . Napisz odpowiedni program.
30
5. Tablice
5.1. Deklaracje tablic
Tablica jest uporz dkowanym zbiorem obiektów tego samego typu opatrzonych wspóln
nazw . Poszczególne obiekty składowe wskazujemy za pomoc indeksów. W zale no ci od
ilo ci indeksów b dziemy mieć tablice jedno- (odpowiednik wektorów), dwu- (odpowiednik
macierzy) lub wi cej wymiarowe. Typ elementu tablicy mo e być jednym z typów j zyka
Fortran, mo emy wi c mieć tablice o elementach całkowitych, rzeczywistych, logicznych, itp.
Przed u yciem tablice musz być zadeklarowane.
Deklarator tablicy ma postać:
QD]ZD(]DNUHV ,]DNUHV ,...)
gdzie QD]ZD to nazwa przydzielana tablicy a ]DNUHV , ]DNUHV , ... okre laj zakresy
zmienno ci poszczególnych indeksów. Zakresów tych podaje si tyle, ile indeksów chcemy
u ywać do numerowania elementów tablicy (maksymalnie mo e być ich 7).
=DNUHV zapisujemy w sposób nast puj cy: JG:JJ , gdzie JG to dolny zakres indeksu, a JJ 
górny. Je eli nie podano zakresu dolnego (wtedy nie zapisuje si te dwukropka), to
domy lnie przyjmuje si go jako równy 1.
JG i JJ musz być wyra one przez stałe całkowite
Deklarator tablicy (lub list deklaratorów oddzielonych przecinkami) mo na u yć:
- po specyfikacji typu zmiennej (zadeklarowany zostaje wtedy rozmiar tablicy i typ jej
elementów)
- po specyfikacji GLPHQVLRQ (wtedy deklaruje si tylko rozmiar tablicy, do okre lenia jej
typu stosuje si standardowe reguły  patrz 2.3)
Przykłady:
UHDO [ \
GLPHQVLRQ [
UHDO W[ W\
LQWHJHU OLF]QLNL
Zadeklarowano:
- tablic \ o elementach rzeczywistych indeksowanych dwoma indeksami zmieniaj cymi si
od 1 do 2 i od 1 do 5
- jednowymiarow tablic [ o elementach rzeczywistych indeksowanych od 0 do 100
- dwuwymiarow tablic W[ o elementach typu UHDO ; indeksy zmieniaj si od 10 do 20
i od 1 do 10
- trójwymiarow tablic W\ o elementach typu UHDO ; wszystkie trzy wska niki zmieniaj
si od 1 do 3
- jednowymiarow tablic OLF]QLNL o elementach całkowitych numerowanych od 1 do 20
31
5.2. Elementy tablic
Element tablicy zwany jest cz sto zmienn indeksowan . Odwołanie do konkretnego
elementu tablicy polega na podaniu nazwy tablicy i warto ci indeksów okre laj cych ten
element. Warto ci te podaje si jako wyra enia całkowite; musi ich być tyle, ile wymiarów
tablicy zadeklarowano.
Przykłady u ycia elementów tablic zadeklarowanych w p. 5.1:
UHDG [ [
\ \ W\
DOSKD DFRV [
ZULWH OLF]QLNL OLF]QLNL
Kolejno ć rozmieszczenia elementów tablicy w pami ci komputera odpowiada najszybszej
zmianie indeksu pierwszego, potem drugiego, itd.
Na przykład elementy tablicy
UHDO WDE
umieszczone s w pami ci w kolejno ci
WDE WDE WDE WDE WDE WDE WDE
WDE WDE
(Mówimy cz sto, e tablice dwuwymiarowe zapami tywane s kolumnami).
5.3. Przykład u ycia tablic
Wektor w przestrzeni 1-wymiarowej okre lamy przez podanie jego 1 składowych:
r
[ = ([ , [ ,K, [ )
Długo ć wektora mo emy obliczyć ze wzoru:


r

[ =
Ç[


Napiszmy program, który dla zadanego 1 wczyta składowe wektora (zapami tuj c je jako
elementy jednowymiarowej tablicy) i policzy jego długo ć.
Pojawia si tu cz sty problem dotycz cy u ycia tablic w Fortranie 77. Otó przy deklaracji
wymiarów tablic musimy u yć stałych. Tymczasem cz sto (jak w omawianym przykładzie)
nie wiemy z góry, ilu elementów tablicy b dziemy potrzebować. Trzymaj c si standardu 77
nie mo emy napisać programu tak, aby najpierw zapytał o rozmiar tablicy, a pó niej umie cił
w pami ci komputera tablic o danych rozmiarach.
Rozwi zaniem tego problemu jest deklaracja rozmiarów tablic z nadmiarem (tzn.
najwi kszych, jakich mo emy potrzebować) a nast pnie u ywanie tylko tylu elementów, ile
potrzebujemy podczas konkretnego uruchomienia programu.
32
W naszym przypadku załó my, e nie b dziemy potrzebować wi cej ni 100 składowych
wektora. Tablic zadeklarujemy zatem tak, aby pomie ciła maksymalnie 100 elementów.
Nast pnie program dowie si , ile wynosi 1 w konkretnym przypadku i tylu elementów
b dziemy u ywać.
SURJUDP ZHNWRUHN
LPSOLFLW QRQH
UHDO [ GOXJRVF
LQWHJHU L Q
ZULWH śSRGDM LORVF VNODGRZ\FK ZHNWRUDś
UHDG Q
ZULWH śSRGDZDM NROHMQR VNODGRZH ZHNWRUDś
GR L Q
UHDG [ L
HQGGR
GOXJRVF
GR L Q
GOXJRVF GOXJRVF [ L
HQGGR
GOXJRVF VTUW GOXJRVF
ZULWH śGOXJRVF ZHNWRUD ś GOXJRVF
HQG
Pierwsza p tla wczytuje kolejno 1 liczb zapami tuj c je jako kolejne elementy tablicy x.
Druga p tla sumuje kwadraty składowych, zatem po zako czeniu jej działania zmienna
GOXJRVF przechowuje kwadrat długo ci  dopiero w nast pnej instrukcji zostaje obliczony
pierwiastek z sumy kwadratów.
Zadanie. 1) Rozbuduj program tak, aby przeczytał składowe dwu wektorów, policzył ich
iloczyn skalarny oraz ich długo ci a nast pnie k t mi dzy wektorami.
2) Powy szy przykład (tak e po rozbudowie z pkt. 1) mo na napisać tak, aby w ogóle nie
u ywał tablic. Zastanów si , jak to zrobić.
3) Program działa poprawnie, dopóki podana przez u ytkownika ilo ć składowych nie
przekracza 100. Dodaj do programu zabezpieczenie, które przy podaniu zbyt du ego 1 nie
dopu ci do kontynuacji oblicze (i wypisze u ytkownikowi stosowny komunikat).
5.4. Implikowana instrukcja GR
Załó my, e w naszej walce z tablicami doszli my do etapu u ycia tablic dwuwymiarowych
(odpowiednik macierzy). Zobaczmy, jak mogliby my wczytać elementy takiej tablicy:
33
LPSOLFLW QRQH
UHDO [
LQWHJHU QZ QN L M
ZULWH śSRGDM LORVF ZLHUV]\ L NROXPQ PDFLHU]\ś
UHDG QZ QN
ZULWH śSRGDZDM SRMHG\QF]R HOHPHQW\ PDFLHU]\ś
GR L QZ
GR M QN
UHDG [ L M
HQGGR
HQGGR
W powy szym przykładzie u ytkownik programu musi podawać po kolei elementy tablicy
(wierszami)  naciskaj c enter po wpisaniu ka dej liczby. Nie jest to sposób wygodny.
Znacznie lepiej byłoby, gdyby mo na było podawać całe wiersze macierzy. Pomóc mo e w
tym tzw. implikowana instrukcja GR (dopuszczalna tylko w ramach instrukcji UHDG lub
ZULWH). Instrukcja ta ma postać:
(OLVWD, ]PLHQQD = ZBSRF] ZBNRQF VNRN)
/LVWD to lista obiektów do wypisania/wczytania przez instrukcj ZULWH UHDG; ]PLHQQD,
ZBSRF], ZBNRQF, VNRN maj takie samo znaczenie, jak w instrukcji GR.
Instrukcja UHDG lub ZULWH powtórzy czytanie lub wypisywanie obiektów z listy tyle razy,
ile wynika z warto ci wyra e okre laj cych p tl .
W naszym przypadku mogliby my zapisać
GR L QZ
UHDG [ L M M QN
HQGGR
Wewn trzna p tla GR została zast piona przez GR implikowane w instrukcji UHDG. Poniewa
skok jest równy 1, został pomini ty w zapisie p tli.
Dane mo na teraz podawać wierszami (po QN danych w wierszu).
Analogicznie mo e wygl dać implikowane GR w instrukcji ZULWH.
GR L QZ
ZULWH [ L M M QN
HQGGR
Ka da instrukcja ZULWH wypisze QN elementów, tzn. cały wiersz macierzy.
Implikowanym do mogliby my zast pić tak e p tl po zmiennej L:
ZULWH [ L M M QN L QZ
(zwróć uwag na zagnie d enia nawiasów).
34
Taka konstrukcja oznaczałaby jednak wypisanie wszystkich elementów tablicy
dwuwymiarowej w jednym wierszu  co nie jest chyba zbyt rozs dne.
W instrukcji ZULWH lub UHDG mo na u yć nazwy tablicy, bez podania konkretnego jej
elementu, np.:
UHDO [
UHDG [
ZULWH [
W takim przypadku wypisywane (wczytywane) s wszystkie elementy tablicy (tyle, ile
wynika z deklaracji rozmiarów, czyli w naszym przypadku 20  20 = 400 ), w kolejno ci w
jakiej rozmieszczone s w pami ci komputera (patrz 5.2).
Zadanie. Napisz program, który przeczyta dwie macierze prostok tne (o zadanych
rozmiarach) i policzy ich sum . Wykorzystaj implikowane GR do
wprowadzania/wyprowadzania danych.
35
6. Operacje wej cia/wyj cia. U ywanie plików zewn trznych.
W rozdziale tym uzupełnimy wiadomo ci o instrukcjach czytania i drukowania w Fortranie.
Nie b dziemy jednak omawiać wszystkich mo liwych parametrów tych instrukcji
ograniczaj c si do minimum pozwalaj cego w praktyce zrealizować wi kszo ć typowych
operacji.
6.1. Lista sterowania instrukcji UHDG ZULWH
Ogólna postać instrukcji czytania UHDG i instrukcja drukowania ZULWH to
UHDG (OLVWDBVWHURZDQLD) OLVWDBL R
ZULWH (OLVWDBVWHURZDQLD) OLVWDBL R
OLVWDBVWHURZDQLD to lista parametrów steruj cych wykonaniem instrukcji
OLVWDBL R to lista wczytywanych/wypisywanych obiektów
Na li cie sterowania mog pojawiać si oddzielane przecinkami specyfikatory, poni ej
omówimy cztery z nich.
Kolejno ć specyfikatorów na li cie jest dowolna, ka dy z nich mo e si pojawić tylko raz.
1) Specyfikator urz dzenia (obowi zkowy):
XQLW = Q
Argument Q oznacza numer u ywanego urz dzenia. Mo e to być nieujemne wyra enie
całkowite lub oznaczaj ca standardowe wej cie/wyj cie (czyli najcz ciej
klawiatur /monitor). U ycie argumentu innego ni gwiazdka omówimy w p. 6.3.
Je li specyfikator ten nast puje jako pierwszy element listy sterowania, to cz ć  XQLW=
mo na pomin ć.
2) Specyfikator formatu:
IPW = I
I mo e być znakiem , numerem etykiety instrukcji IRUPDW, stał tekstow lub nazw
zmiennej tekstowej zawieraj cej tzw. wzorzec redagowania. Parametr ten pozwala okre lić
sposób redagowania wczytywanych/wypisywanych znaków. oznacza redagowanie
domy lne (tzw. format swobodny). Pozostałe mo liwo ci omówimy w p. 6.2.
Je li specyfikator formatu wyst puje na li cie sterowania jako drugi to cz ć  IPW= mo na
pomin ć (wtedy nale y pomin ć tak e  XQLW= ).
Przykład: instrukcja
UHDG XQLW IPW [
oznacza czytanie zmiennej x w sposób niezredagowany z urz dzenia oznaczonego numerem
11. Równowa nie mo emy zapisać:
UHDG [
36
(bo XQLW to pierwszy a IPW  drugi argument).
W tym momencie jasne jest ju , co oznaczała u ywana przez nas dot d postać instrukcji
UHDG i ZULWH:
UHDG ....
ZULWH ....
- był to skrócony zapis instrukcji:
UHDG XQLW IPW ....
ZULWH XQLW IPW ....
oznaczaj cych niezredagowane wczytywanie/wypisywanie informacji z u yciem
standardowych urz dze .
3 i 4) Specyfikatory akcji po bł dzie lub wykryciu ko ca danych maj postać odpowiednio:
HUU HW\NLHWD
i
HQG HW\NLHWD
Oznaczaj , e po wykryciu bł du operacji wej cia/wyj cia lub wykryciu ko ca danych przy
wczytywaniu, sterowanie zostanie przeniesione do instrukcji opatrzonej HW\NLHW .
Przykład:
MDNLH LQVWUXNFMH
UHDG HUU [
GDOV]D F] ü SURJUDPX
VWRS
ZULWH śQLHSRSUDZQH GDQH SRGDM MHV]F]H UD]ś
JRWR
HQG
W przypadku bł du przy podawaniu danych (np. wpisaniu o zamiast 0) program wykona
instrukcj opatrzon etykiet 9000 i powróci do próby czytania danych (bez u ycia
specyfikatora HUU w takim przypadku program zako czyłby prac z komunikatem o bł dzie).
Zwróć uwag , e instrukcje obsługi bł dów umieszczone s na ko cu programu, a przed nimi
umieszczono instrukcj zatrzymania programu VWRS. Gdyby jej tam nie było, instrukcja
opatrzona etykiet 9000 byłaby wykonana zawsze (powoduj c powrót do instrukcji 10 i
nieko cz c si p tl ).
W p. 6.3 zobaczymy przykładowe u ycie specyfikatora HQG.
37
6.2. Specyfikacja formatu
Porcja danych (pewien ci g znaków) przetwarzany przez instrukcj ZULWH lub UHDG to tzw.
rekord logiczny. Nie musi on koniecznie odpowiadać rekordowi fizycznemu, np. przy
wypisywaniu danych jeden rekord logiczny mo e pojawić si na ekranie jako kilka wierszy
(rekordów fizycznych). Specyfikacja formatu podaje, jak interpretować zawarto ć
przetwarzanego rekordu.
Nie b dziemy tu omawiać wszystkich szczegółów specyfikacji formatu. W szczególno ci nie
b dziemy zajmować si redagowaniem danych podczas wczytywania (z wyj tkiem
zmiennych tekstowych). Odpowiada to u ywaniu jako specyfikacji formatu w instrukcji
UHDG. Pozwala to u ytkownikowi na pewn swobod podczas podawania danych. Zmuszenie
go do umieszczania danych w okre lonych kolumnach na ogół doprowadzi do bł dów
wynikaj cych z nieuwagi.
Redagowanie danych ma dla nas wi ksze znaczenie przy wypisywaniu wyników, pozwalaj c
dopasować wygl d wydruku do naszych potrzeb.
Sposób redagowania przetwarzanych danych okre lamy przez podanie tzw. wzorca
redagowania. Ma on postać
( OLVWDBGHVNU\SWRUyZ )
Wzorzec ten mo emy podać:
- w instrukcji IRUPDW opatrzonej etykiet podan przy specyfikacji formatu
- w stałej tekstowej
- jako zawarto ć zmiennej tekstowej
Na li cie deskryptorów podajemy opisy pól oddzielone separatorami. Przecinek słu y jedynie
do oddzielania poszczególnych elementów listy. Znak / oznacza przej cie do nast pnego
rekordu.
Podajmy znaczenie cz ciej u ywane oznacze pól:
LZ  liczba całkowita w polu o szeroko ci Z znaków
IZ G  liczba rzeczywista w polu o szeroko ci Z znaków z G cyframi po kropce
HZ G  liczba rzeczywista w zapisie wykładniczym w polu o szeroko ci Z znaków z G
cyframi po kropce
HZ GHF  liczba rzeczywista w zapisie wykładniczym w polu o szeroko ci Z znaków
z G cyframi po kropce, z wykładnikiem zapisanym przy u yciu F cyfr
OZ  warto ć logiczna w polu o szeroko ci Z znaków
DZ  ła cuch Z znaków
Oznaczenie pól mo e być poprzedzone liczb naturaln podaj c ilo ć powtórze . Nawiasy
okr głe oznaczaj powtarzanie cz ci opisu (patrz ni ej).
Przy wyprowadzaniu liczba dosuwana jest do prawej kraw dzi pola. Je li ilo ć niezb dnych
do wyprowadzenia znaków jest wi ksza od szeroko ci pola, wyprowadzone zostan gwiazdki.
Przy wyprowadzaniu danych kolejne elementy listy wyj cia wypisywane s w sposób zadany
przez kolejne pola wzorca redagowania. Je li wyczerpano list pól we wzorcu a na li cie
wyj cia pozostały jeszcze jakie obiekty, wyprowadzany jest nowy rekord. Je li w zapisie
wzorca nie u yto dodatkowych nawiasów, to jego interpretacj zaczyna si od pocz tku, w
przeciwnym wypadku powtarzana jest cz ć zawarta w nawiasach.
38
Przykład:
Wzorzec L I opisuje pole o szeroko ci 4 znaków do wyprowadzenia liczby
całkowitej i 3 pola o szeroko ci 10 znaków ka de do wyprowadzenia liczb rzeczywistych (z 5
cyframi po kropce) .
Wzorzec L H H opisuje pole o szeroko ci 4 znaków do wyprowadzenia liczby
całkowitej i pole o szeroko ci 14 znaków do wyprowadzenia liczby rzeczywistej w zapisie
wykładniczym (z 5 cyframi po kropce i 2 cyframi wykładnika). Ta ostatnia cz ć b dzie w
razie potrzeby powtarzana.
Wynikiem wykonania programu:
FKDUDFWHU Z]RU]HF
Q
[
[
[ H
ZULWH Å› L I Å› Q [ [ [
ZULWH Q [ [ [
IRUPDW L H H
Z]RU]HF Å› H Å›
ZULWH Z]RU]HF [ [ [
HQG
b dzie utworzenie nast puj cego wydruku:
(
(
(
( (
(
W pierwszej instrukcji ZULWH wzorzec redagowania podali my w stałej tekstowej, w
przypadku drugiej instrukcji podali my etykiet instrukcji IRUPDW zadaj cej ten wzorzec, w
trzeciej wzorzec został zapisany w zmiennej tekstowej (ten ostatni sposób pozwoliłby nam na
modyfikacj wzorca w czasie działania programu).
Poniewa zawarto ć zmiennej [ nie mie ci si w polu o zadanej specyfikacji, zostały
wypisane gwiazdki.
Druga instrukcja ZULWH wyprowadziła liczb całkowit i liczb rzeczywist (warto ć
zmiennej [ ). W tym momencie lista pól we wzorcu została wyczerpana a na li cie wyj cia
pozostały jeszcze [ i [ . Wyprowadzany jest wobec tego nast pny rekord a interpretacj
listy pól zaczyna si powtarzać od nawiasu.
W trzeciej instrukcji ZULWH nie ma nawiasu oznaczaj cego cz ć powtarzan , zatem
interpretacj wzorca zaczyna si za ka dym razem od pocz tku  czyli od znaku /
oznaczaj cego przej cie do nowego rekordu  st d puste linie na wydruku.
39
Zwróć uwag na ró nic w działaniu opisów pól H i H H .
Przy wczytywaniu b d wypisywaniu tekstów u ywa si cz sto okre lenie pola w postaci D
dla oznaczenia ła cucha znaków. Przy wczytywaniu jego długo ć odpowiada długo ci
podanego ci gu znaków, przy wypisywaniu zadeklarowanej długo ci zmiennej.
Je li zmienna WHNVW została zadeklarowana jako zmienna tekstowa o pojemno ci 10
znaków:
FKDUDFWHU WHNVW
to instrukcja
UHDG Å› D Å› WHNVW
umie ci podany z klawiatury ci g znaków w zmiennej o nazwie WHNVW.
Instrukcja
ZULWH Å› D Å› WHNVW
wypisze za 10 znaków (tyle zadeklarowano).
We wzorcu redagowania mog pojawić si jeszcze opisy pól typu: [ lub śWHNVWś. Nie
odpowiadaj im adne elementy na li cie wyj cia. Specyfikacja [ opisuje spacj (czyli [
spowoduje wypisanie 5 znaków odst pu). Drugi opis oznacza wypisanie stałej tekstowej
zawartej w apostrofach. Nale y zauwa yć, e w przypadku zadawania wzorca poprzez stał
tekstow , wewn trzne apostrofy musz być podwójne (patrz 8.1):
ZULWH [
IRUPDW Å›[ Å› I
ale
ZULWH ś śś[ śś I ś [
6.3. U ycie plików zewn trznych
Jak dot d wszystkie dane wprowadzali my z klawiatury a wyniki wypisywali my na ekran.
Przy wi kszej ilo ci danych/wyników nie jest to wygodna metoda. W takim przypadku
woleliby my wczytać dane z pliku (być mo e zapisanym przez inny program obsługuj cy
aparatur pomiarow , być mo e utworzony przez u ytkownika w edytorze tekstu); podobnie
wyniki tak e mogłyby trafić do pliku dyskowego (który potem mo na analizować).
Aby u ywać pliku do zapisu/odczytu danych, powinni my go wcze niej otworzyć. Słu y do
tego polecenie RSHQ :
RSHQ XQLW QU ILOH QD]ZD
QU definiuje numer urz dzenia, QD]ZD to wyra enie tekstowe (w szczególno ci stała lub
zmienna tekstowa) podaj ce nazw pliku (poprawn w systemie operacyjnym działaj cym na
komputerze). Zapis  XQLW  mo na pomin ć, je li QU podajemy jako pierwszy parametr.
Polecenie RSHQ powoduje otwarcie pliku o podanej nazwie i przypisaniu mu numeru QU . W
dalszej cz ci programu odwołujemy si do tego pliku przez podanie numeru urz dzenia.
W szczególno ci QU mo emy podać jako argument specyfikatora XQLW w instrukcji UHDG lub
ZULWH. Czytanie/pisanie b dzie si wtedy odbywało z/do pliku, któremu przypisali my dany
numer urz dzenia.
40
Po wykonaniu wszystkich operacji wej cia/wyj cia z danym plikiem mo emy go zamkn ć
poleceniem
FORVH QU
QU oznacza numer urz dzenia przypisany danemu plikowi.
Przykład:
FKDUDFWHU QD]ZD
ZULWH śSRGDM QD]ZH SOLNX Z\QLNRZHJRś
UHDG Å› D Å› QD]SO
RSHQ XQLW ILOH śGDQH GDWś
RSHQ ILOH QD]SO
(...)
UHDG Q
(...)
ZULWH [ \
FORVH
FORVH
HQG
W powy szym przykładzie u yli my pliku z danymi o nazwie GDQH GDW i przypisali my
mu numer 11 ( XQLW  mogliby my pomin ć). Wyniki wypisywane s do pliku o numerze
12, nazwa tego pliku jest podawana przez u ytkownika i przechowywana w zmiennej QD]SO.
Nie omawiamy tu wszystkich szczegółów działania instrukcji RSHQ. W formie, jak
opisali my, instrukcja ta otworzy istniej cy na dysku plik o podanej nazwie lub utworzy
nowy, pusty, je li plik o tej nazwie jeszcze nie istniał. Oczywiste jest, e plik, z którego
czytamy dane, musi wcze niej istnieć. Nale y te zauwa yć, e wykonanie instrukcji ZULWH
do pliku, który ju wcze niej istniał na dysku, skasuje jego poprzedni zawarto ć.
W przypadku u ycia formatu swobodnego podczas czytania
UHDG QU
mamy pewn mo liwo ć manewru przy przygotowywaniu pliku z danymi. Otó ka da
instrukcja UHDG zaczyna wczytywanie kolejnego wiersza. Je li ilo ć danych w wierszu nie
wyczerpie listy zmiennych, to czytanie odbywa si z kolejnego wiersza, np. niech x b dzie
tablic jednowymiarow , wtedy instrukcja
UHDG [ L L
b dzie czytać z urz dzenia (pliku) oznaczonego numerem 11 kolejne elementy tablicy (w
sumie 10). W pliku mog być zapisane w jednym wierszu, w dwu wierszach po 5 elementów,
w 3 wierszach po 3 i jednym z 1 elementem, z dodatkowymi pustymi wierszami
oddzielaj cymi  jak nam jest wygodnie.
Kilka porad:
1) Próba czytania lub pisania z urz dzenia, którego wcze niej nie otwarto, nie spowoduje
bł du. W takim przypadku zostanie otwarty plik o nazwie zale nej od systemu operacyjnego
i kompilatora; najcz ciej jest to IRUW QU, gdzie QU to numer urz dzenia.
41
2) Urz dzenia o numerach mniejszych lub równych 10 bywaj zarezerwowane do
specyficznych celów (np. 5 obsługuje standardowe wej cie a 6 standardowe wyj cie). Próba
otwarcia lub zamkni cia tych urz dze mo e dawać nietypowe efekty. Aby unikn ć takich
problemów, najlepiej u ywać numerów urz dze wi kszych od 10.
3) Oczywiste jest, e w przypadku czytania z pliku poprzedzanie instrukcji UHDG instrukcj
ZULWH w rodzaju
ZULWH śSRGDM GDQHś
nie ma sensu  na tym etapie u ytkownik nie mo e ju z tej informacji skorzystać, bo
powinien był przygotować plik z danymi przed uruchomieniem programu. Sensowne jest
natomiast napisanie osobnej instrukcji podaj cej u ytkownikowi jak przygotować plik z
danymi.
4) Cz sto spotykamy si z przypadkiem, w którym mamy plik zawieraj cy seri danych o
nieznanej długo ci. Chcemy czytać wszystkie dane, do momentu napotkania ko ca pliku. W
tym celu wykorzystujemy specyfikator HQG w instrukcji UHDG.
Przykład: Mamy plik pomiar.dat zawieraj cy dwie kolumny z danymi  pary warto ci x i y
(maksymalnie 1000). Chcemy wczytać je do tablic o nazwach x i y.
LPSOLFLW QRQH
UHDO [ \
LQWHJHU L Q
RSHQ ILOH śGDQH GDWś
L
UHDG HQG [ L \ L
L L
JRWR
Q L
(GDOV]D F] ü SURJUDPX)
Zmienna L przechowuje indeks aktualnie czytanego elementu tablicy. Po poprawnym
wczytaniu pary liczb i zostaje zwi kszone o 1 a nast pnie instrukcja JRWR powoduje powrót
do czytania kolejnej pary liczb. W momencie, kiedy podczas czytania osi gni ty zostanie
koniec pliku, sterowanie zostanie przeniesione do instrukcji opatrzonej etykiet 20. Instrukcja
ta oblicza ilo ć wczytanych par liczb i zachowuje j w zmiennej Q. Poniewa licznik L
zwi kszany był przed czytaniem a ostatnia instrukcja czytania si nie powiodła (bo sko czył
si plik), Q jest mniejsze od L o 1.
42
7. Podprogramy
7.1. Podział programu na segmenty
Ka dy bardziej zło ony program mo emy podzielić na mniejsze wyodr bnione jednostki
(podprogramy). Ich u ywanie pozwala na uzyskanie bardziej czytelnej struktury programu,
unikni cie zb dnych powtórze , ułatwienie testowania programu (podprogramy mo na
testować niezale nie). Oprócz tego podprogramy ułatwiaj budow du ych programów dzi ki
mo liwo ci  składania ich z cz ci.
W rozdziale tym zajmiemy si głownie podprogramami typu funkcji i procedur w postaci
odr bnych segmentów.
Segmenty programu mog być zapisane w pliku ródłowym w dowolnej kolejno ci, mog być
te umieszczone w ró nych plikach (wtedy podczas kompilacji nale y podać nazwy
wszystkich plików)
W Fortranie pewne nazwy maj zasi g globalny (obowi zuj w całym programie). Dotyczy to
nazw segmentu głównego, funkcji i procedur. Z kolei nazwy zmiennych s lokalne:
obowi zuj jedynie w obr bie segmentu, w którym zostały u yte lub zadeklarowane. Ta sama
nazwa u yta w ró nych segmentach oznacza ró ne obiekty. Dyrektywy (deklaracje typów czy
tablic) maj zasi g lokalny  obowi zuj jedynie w segmencie, w którym zostały u yte.
7.2. Segmenty typu IXQFWLRQ
Segmenty typu funkcji (IXQFWLRQ) realizuj w Fortranie obliczanie funkcji definiowanej
przez u ytkownika. Funkcja zwraca jako efekt swojego działania pewn warto ć, warto ć jest
jednego z typów u ywanych w Fortranie.
Segment taki rozpoczyna si od instrukcji IXQFWLRQ w postaci
W\S IXQFWLRQ QD]ZDBIXQ OLVWDBDUJXPHQWyZ
gdzie W\S to okre lenie typu warto ci funkcji
QD]ZDBIXQ to nazwa definiowanej funkcji
OLVWDBDUJXPHQWyZ zawiera oddzielone przecinkami argumenty funkcji, tzw. parametry
formalne, mo e te być pusta, je li funkcja nie wymaga podania argumentów
Okre lenie typu funkcji w instrukcji IXQFWLRQ mo na pomin ć, wtedy do okre lenia typu
stosuje si reguły z p. 2.3.
Po instrukcji function nast puje ci g instrukcji słu cych do znalezienia warto ci funkcji.
W ród nich przynajmniej raz musi znale ć si instrukcja przypisania:
QD]ZDBIXQ = Z\UD HQLH
nadaj ca funkcji warto ć zadan wyra eniem po prawej stronie znaku =
Na ko cu segmentu definiuj cego funkcj (jak na ko cu ka dego segmentu) musi znale ć si
instrukcja HQG . Jej wykonanie ko czy prac segmentu i przenosi sterowanie do segmentu
43
wywołuj cego, zwracaj c warto ć funkcji nadan ostatnio wykonan instrukcj przypisania
typu QD]ZDBIXQ = ...
Niezale nie od instrukcji HQG w podprogramie mo e wyst pić instrukcja
UHWXUQ
Jej wykonanie ma taki sam skutek jak wykonanie instrukcji HQG. Instrukcji UHWXUQ
u ywamy, je li w jakim przypadku nie ma potrzeby wykonywania wszystkich instrukcji
segmentu. Instrukcji tych mo e w segmencie być wiele; oczywi cie wykonana zostanie tylko
jedna.
Zdefiniowan w postaci segmentu funkcj u ywa si tak samo, jak funkcje standardowe
Fortranu przez podanie nazwy funkcji i w nawiasach listy jej argumentów (s to tzw.
parametry aktualne).
Ilo ć i typ parametrów aktualnych (przy wywołaniu funkcji) musi być zgodny z ilo ci i
typem parametrów formalnych (definiuj cych funkcj ). Mog to być zmienne, stałe lub
bardziej zło one wyra enia odpowiedniego typu  z ograniczeniem omówionym ni ej.
Je li w trakcie wykonywania instrukcji definiuj cych funkcj zmieniono warto ć zmiennej
wyst puj cej na li cie parametrów formalnych, to po przekazaniu sterowania do segmentu
wywołuj cego zmianie ulegnie warto ć odpowiedniego parametru aktualnego. Wynika st d
wniosek, e je li funkcja zmienia warto ć którego z argumentów, to przy jej wywołaniu
parametrem aktualnym przekazywanym jako warto ć tego argumentu mo e być tylko
zmienna a nie stała lub wyra enie. Nale y te zauwa yć, e na ogół nie oczekujemy, e
funkcja modyfikuje swoje argumenty, zatem takich rozwi za nale y u ywać jedynie w
przypadku kiedy rzeczywi cie jest to niezb dne (korzy ci b d wi ksze ni skutki
zmniejszenia czytelno ci programu).
Przykład: funkcja obliczaj ca sum kwadratów kolejnych liczb naturalnych od 1 do zadanej
liczby.
IXQFWLRQ VXPDNZ P
LPSOLFLW QRQH
LQWHJHU VXPDNZ L P
VXPDNZ
GR L P
VXPDNZ VXPDNZ L L
HQGGR
HQG
i program wywołuj cy t funkcj :
LPSOLFLW QRQH
LQWHJHU VXPDNZ Q
ZULWH śSRGDM Qś
UHDG Q
ZULWH śVXPD NZDGUDWRZ RG GR ś Q ś Z\QRVL ś VXPDNZ Q
HQG
44
Zwróćmy uwag na par szczegółów:
- Musieli my okre lić, e nasza funkcja jest typu LQWHJHU w segmencie funkcji i w
programie głównym (bo deklaracje obowi zuj tylko w obr bie segmentu).
- Typ funkcji okre lili my przy pomocy deklaracji w obr bie segmentu; alternatywnie
mogliby my zapisać:
LQWHJHU IXQFWLRQ VXPDNZ P
- W definicji funkcji u yli my zmiennej P do oznaczenia granicy sumowania (parametr
formalny). W momencie wywołania funkcji jako parametr aktualny u yta została zmienna Q.
Jej warto ć została przekazana do funkcji i u yta tam, gdzie w przepisie wyst powała nazwa
P.
- Program główny nie wie nic o zmiennej L wyst puj cej w segmencie funkcyjnym. W
zwi zku z tym równie dobrze mogliby my zapisać nasz program nast puj co:
LPSOLFLW QRQH
LQWHJHU VXPDNZ Q L
ZULWH śSRGDM Qś
UHDG Q
L VXPDNZ Q
ZULWH śVXPD NZDGUDWRZ RG GR ś Q ś Z\QRVL ś L
HQG
W obu segmentach zmienna o nazwie L jest wykorzystana do innych celów L nie ma adnego
zwi zku pomi dzy nimi.
W opisanym przykładzie wywołanie:
Q VXPDNZ
jest poprawne (przypisze zmiennej Q warto ć sumy kwadratów liczb od 1 do 20), natomiast
Q VXPDNZ
ju nie (niezgodno ć typów parametrów formalnych i aktualnych)
7.3. Segmenty typu VXEURXWLQH
Innym typem podprogramu jest procedura. Opisuje ona ci g czynno ci do wykonania,
natomiast w przeciwie stwie do funkcji nie ma przypisanej warto ci.
Segment definiuj cy procedur zaczyna si od instrukcji VXEURXWLQH:
VXEURXWLQH QD]ZDBVXE(OLVWDBDUJXPHQWyZ)
QD]ZDBVXE to nazwa procedury a znaczenie OLVW\ DUJXPHQWyZ jest takie samo, jak w
przypadku funkcji.
Nale y zwrócić uwag , e procedurze VXEURXWLQH nie mo na przypisać typu, nielegalna
jest te instrukcja podstawienia warto ci pod QD]ZDBVXE.
Procedur wywołuje si instrukcj FDOO:
FDOO QD]ZDBVXE(OLVWDBSDUDPHWUyZBDNWXDOQ\FK)
45
Zako czenie pracy procedury i przekazanie sterowania do segmentu wywołuj cego nast puje
po wykonaniu instrukcji HQG umieszczonej na ko cu segmentu VXEURXWLQH albo instrukcji
UHWXUQ.
Zasady przekazywania argumentów do procedury s takie same, jak w przypadku funkcji.
Warto jednak zauwa yć, e w przeciwie stwie do funkcji, modyfikowanie przez procedur
warto ci swoich argumentów jest naturalne  w ten sposób do segmentu wywołuj cego
przekazywane s wyniki działania procedury.
Zobaczymy przykład procedury zamieniaj cej warto ci swoich argumentów:
VXEURXWLQH VZDS D E
LPSOLFLW QRQH
UHDO D E WPS
WPS E
E D
D WPS
HQG
Zauwa , e do zamiany warto ci zmiennych D i E potrzebujemy zmiennej tymczasowej, która
przez chwil przechowa warto ć jednej ze zmiennych (do wymiany zawarto ci dwu pełnych
szklanek potrzebujemy trzeciej pustej).
Program wywołuj cy nasz procedur mo e mieć postać:
LPSOLFLW QRQH
UHDO F G
F
G
FDOO VZDS F G
ZULWH śF ś F ś G ś G
HQG
Po jego wykonaniu stwierdzimy, e wypisana warto ć zmiennej F b dzie równa 5.0 a warto ć
G b dzie 10.0 . Jak widać, nazwy zmiennych b d cych parametrami aktualnymi nie maj nic
wspólnego z nazwami parametrów formalnych.
Poni sze wywołanie procedury jest niepoprawne:
FDOO VZDS
- poniewa procedura modyfikuje warto ci argumentów, parametry aktualne musz być
zmiennymi.
46
U ycie procedur jest naturalne tam, gdzie wynikiem wykonywanych operacji jest wi cej ni
jedna warto ć (nie mog być zatem zwrócone jako pojedyncza warto ć funkcji).
W przypadku funkcji i procedur w Fortranie 77 niedozwolona jest rekursja (u ycie wywołania
funkcji lub procedury w jej definicji) zarówno jawna (np. definicja funkcji A odwołuje si do
funkcji A), jak i niejawna (np. definicja funkcji A odwołuje si do funkcji B, z kolei w
definicji funkcji B pojawia si odwołanie do funkcji A).
7.4. Tablice jako parametry formalne
Je li parametrem formalnym funkcji lub procedury jest zmienna, to na li cie parametrów
aktualnych mo emy u yć w jej miejscu zmiennej lub pojedynczego elementu tablicy (lub
stałej albo wyra enia je li warto ć tego argumentu nie jest modyfikowana). Parametrem
formalnym mo e być te tablica. W tym przypadku na li cie argumentów podajemy tylko jej
nazw , natomiast wymiary musimy zadeklarować w obr bie podprogramu w sposób opisany
w p. 5.1, np.:
VXEURXWLQH WDEOLFH D E
LPSOLFLW QRQH
LQWHJHU D E
(zadeklarowano, e D i E s jednowymiarowymi tablicami o 20 elementach całkowitych).
Przy deklaracji tablic b d cych parametrami formalnymi mo na u yć zmiennych, pod
warunkiem, e zmienne te wyst puj na li cie parametrów formalnych podprogramu, np.:
VXEURXWLQH WDE [ \ P Q
UHDO [ Q \ P Q
Przy wywołaniu procedury przekazujemy odpowiednie warto ci Q i P. Ostatni wymiar tablicy
b d cej parametrem formalnym mo e te być podany jako , oznacza to deklarowanie tylu
elementów tablicy, aby wypełnić przekazan do podprogramu tablic aktualn .
Na li cie parametrów aktualnych przy wywołaniu podprogramu w miejscu odpowiadaj cym
argumentowi b d cemu tablic mo emy u yć nazwy tablicy, albo konkretnego jej elementu.
W pierwszym przypadku do podprogramu zostaje przekazany adres jaki w pami ci komputera
przypisany jest pocz tkowemu elementowi tablicy, w drugim  adres elementu u ytego w
wywołaniu. Poło enia dalszych elementów tablicy podprogram ustala na podstawie jej
deklaracji i typu elementów (odliczaj c poło enia kolejnych elementów w pami ci). U ycie
zatem w wywołaniu konkretnego elementu tablicy oznacza danie podprogramowi dost pu
tylko do jej cz ci (bez elementów poprzedzaj cych w pami ci ten przekazywany).
Oznacza to, e podprogram mo e u ywać tablicy o innych wymiarach ni zadeklarowana w
segmencie wywołuj cym, byle tylko ilo ć jej elementów nie była wi ksza ni obszar tablicy
przekazany do podprogramu.
Omówmy teraz istotny problem przy przekazywaniu do podprogramów tablic o wi cej ni
jednym wymiarze. Otó , jak wspomnieli my w rozdziale 5, z reguły deklarujemy tablice  z
nadmiarem a nast pnie u ywamy tylko cz ci jej elementów. W takim przypadku naturalne
jest przekazanie tej informacji do podprogramu i zadeklarowanie tablicy z u yciem
przekazanych rozmiarów, np. w programie głównym deklarujemy tablic o wymiarze 5 5:
47
UHDO [
stwierdzamy nast pnie, e w danym przypadku potrzebujemy tylko tablicy 3 3 (czyli
u ywamy elementów od [ do [ i przekazujemy t informacj przy wywołaniu
podprogramu:
Q
FDOO PDW [ Q
w którym tablica została zadeklarowana z u yciem zmiennej b d cej parametrem formalnym:
VXEURXWLQH PDW [ Q
UHDO [ Q Q
Pozornie wszystko jest w porz dku: w programie głównym zadeklarowano tablic 5 5,
u ywamy jej jak tablicy 3 3 (tzn. dziewi ciu elementów), w podprogramie te b dzie
u ywana jako tablica 3 3 (która mie ci si na obszarze 5 5).
Problem polega na tym, e elementy tablicy s inaczej numerowane w programie głównym i
podprogramie. Przypomnijmy, e elementy tablicy zapisane s w pami ci komputera po kolei,
tak, e najszybciej zmienia si pierwszy indeks.
Program główny ma zadeklarowan tablic 5 5, zatem jej elementy s rozmieszczone w
pami ci w sposób nast puj cy:
x(1,1) x(2,1) x(3,1) x(4,1) x(5,1) x(1,2) x(2,2) x(3,2) x(4,2) x(5,2) itd...
Z kolei podprogram otrzymał informacj o poło eniu pierwszego elementu tablicy (x(1,1)) i
poczynaj c od niego odlicza sobie 9 elementów tablicy 3 3:
x(1,1) x(2,1) x(3,1) x(1,2) x(2,2) x(3,2) x(1,3) x(2,3) x(3,3)
Jak widać, zgadza si tylko numeracja elementów x(1,1), x(2,1) i x(3,1). Elementowi
oznaczonemu x(1,2) w programie głównym odpowiada x(3,2) w podprogramie, z kolei x(1,2)
w podprogramie odpowiada element x(4,1) w programie głównym.
Nietrudno dostrzec, e kłopotów takich nie ma w przypadku tablic jednowymiarowych.
Jak mo na poradzić sobie z tym problemem?
1) Mo na zadeklarować tablice  na sztywno u ywaj c w segmencie wywołuj cym i
podprogramie takich samych rozmiarów. Oznacza to jednak, e podprogram b dzie mniej
uniwersalny, zatem sposób mo na zastosować, kiedy te wymiary rzeczywi cie s niezmienne
(np. w programie obliczaj cym transformacje geometryczne w przestrzeni trójwymiarowej
macierze transformacji s tablicami 3 3 i tak mo na je deklarować we wszystkich
segmentach).
2) Do podprogramu mo na przekazać tak e informacj o wymiarze tablicy zadeklarowanym
w segmencie wywołuj cym. W naszym przykładzie:
UHDO [
Q
FDOO PDW [ Q
48
Podprogram za deklarowałby tablic w sposób nast puj cy:
VXEURXWLQH PDW [ Q P
UHDO [ P P
W tym przypadku deklaracja wymiaru tablicy w podprogramie odbywa si z wykorzystaniem
jej rozmiaru zadeklarowanego w programie głównym (przekazanego jako trzeci argument),
zatem elementy tablicy b d numerowane tak samo w segmencie głównym jak i
podprogramie. Drugi argument słu y za do przekazania informacji ilu z tych elementów
u ywać.
3) Zauwa my, e nasz problem polega tylko na ró nej numeracji elementów tablicy. Poza tym
wszystko jest w porz dku  tablica deklarowana w podprogramie mie ci si na obszarze
tablicy zadeklarowanej w segmencie głównym. Dopóki zatem w segmencie głównym nie
spróbujemy odwołać si do konkretnego elementu tablicy wszystko b dzie w porz dku.
Wniosek: wszelkie operacje na elementach tablicy (np. czytanie) wykonujmy w
podprogramach, w których deklaracje b d takie same, jak w podprogramie PDW. Wobec tego
numeracja elementów we wszystkich tych podprogramach b dzie taka sama (choć ró na ni
w programie głównym).
Aby np. przeczytać tablic [ z klawiatury wywołajmy procedur
FDOO F]\WDM [
zdefiniowan nast puj co:
VXEURXWLQH F]\WDM [ Q
UHDO [ Q Q
GR L Q
UHDG [ L M M Q
HQGGR
HQG
Procedura ta ma tablic [ opisan tak samo, jak procedura PDW, zatem elementy tablicy s
numerowane identycznie.
7.5. Instrukcja funkcji
Zwi zana z podprogramami jest instrukcja funkcji pozwalaj ca w obr bie danego segmentu
zdefiniować prost funkcj . Definicja taka umieszczana jest na pocz tku segmentu, po
deklaracjach a przed pierwsz instrukcj wykonywaln . Ma ona postać:
QD]ZDBIXQNFML(OLVWDBDUJXPHQWyZ) = Z\UD HQLH
Na li cie argumentów mog znale ć si tylko zmienne.
Typ funkcji wynika z reguł opisanych w rozdziale 2.3.
W definicji funkcji mo na u yć funkcji zdefiniowanych wcze niej, natomiast rekursja jest
niedozwolona.
49
Przykład:



Na pocz tku segmentu zdefiniowano funkcj H :
LPSOLFLW QRQH
UHDO H[ \ [ \ D E F
H[ \ [ \ H[S [ [ \ \
W segmencie tym mo liwe b d jej wywołania w rodzaju:
F H[ \ D E
ZULWH H[ \
50
8. Operacje na tekstach
8.1. Stałe, zmienne znakowe, wycinki
W poprzednich rozdziałach spotykali my si ze stałymi i zmiennymi tekstowymi. W
bie cym rozdziale uzupełnimy te informacje.
Stał tekstow jest ci g znaków uj ty w apostrofy; apostrofy te nie s cz ci stałej. Je li stała
znakowa ma zawierać apostrof, kodujemy go przy pomocy dwu znaków apostrofu.
Przykłady stałych tekstowych:
Å›$OD PD NRWDÅ›
Å›.RW PD SFKá\Å›
ś[śś\ś
Ta ostatnia stała to x y . W stałych tekstowych mo emy u yć znaków, które nie nale do
alfabetu Fortranu.
Zmienne znakowe przechowuj ci gi znaków. Deklaracja zmiennych znakowych ma postać:
FKDUDFWHU OLVWDBQD]ZB]PLHQQ\FK
DÅ‚ugo ć zmiennej specyfikuje si dodaj c GáXJR ü do nazwy zmiennej, albo globalnie jako
GáXJR ü po sÅ‚owie FKDUDFWHU (i wtedy odnosi si ona do wszystkich nazw w tym wierszu,
którym jawnie nie podano innej długo ci). Je li nie podano długo ci, to zmienna jest
jednoznakowa:
FKDUDFWHU RGS
FKDUDFWHU QD]ZD GOXJDQD]
długo ci zmiennych RGS, QD]ZD i GOXJDQD] to odpowiednio 1,10 i 50 znaków.
Mo liwe jest tak e deklarowanie tablic typu znakowego, np. deklaracja
FKDUDFWHU LPLH QD]ZLVNR
mówi, e tablica LPLH przechowuje 100 tekstów o długo ci 20 znaków, a tablica QD]ZLVNR
100 tekstów po 30 znaków.
Fortran umo liwia odwoływanie si do wycinków zmiennych znakowych przez podanie
nazwy zmiennej i zakresu pozycji tworz cych wycinek:
QD]ZD ]S ]N
gdzie QD]ZD to nazwa zmiennej, a ]S i ]N s wyra eniami całkowitymi. ]S to pozycja lewego
ko ca wycinka (je li nie jest podana, to ]S jest równe 1), ]N to pozycja prawego ko ca
wycinka (je li nie jest podana, to oznacza wycinek do ko ca zmiennej).
51
Przykład: dla zmiennej:
DEHFDGOR śDEFGHIJKś
wycinki maj warto ci:
DEHFDGOR to  cd
DEHFDGOR to  e
DEHFDGOR to  abcd
DEHFDGOR to  fgh
DEHFDGOR to  abcdefgh
Wycinki tablic znakowych podajemy w postaci:
QD]ZD LQGBHO ]S ]N
(w pierwszej parze nawiasów podajemy indeks(y) elementu tablicy; w drugiej zakres
wycinka).
8.2. Operacje na tekstach
Jak ju wspomnieli my, przy wprowadzaniu lub wyprowadzaniu zmiennych tekstowych
u ywamy specyfikatora pola D : np.
FKDUDFWHU QD]ZD
UHDG Å› D Å› QD]ZD
Instrukcja przypisania dla wyra e znakowych ma postać
QD]ZD = Z\UD HQLH
gdzie QD]ZD to zmienna tekstowa, element tablicy tekstowej lub wycinek
Wyra enie znakowe po prawej stronie instrukcji przypisania konstruuje si ze stałych,
zmiennych, elementów tablic, wycinków i wywoła funkcji znakowych z ewentualnym
wykorzystaniem nawiasów i operatora konkatenacji.
Operator konkatenacji zapisywany jako (dwa slash e) Å‚ czy dwa Å‚a cuchy znakowe,
mi dzy którymi jest zapisany, np. wynikiem działania
śDEFś śHIJś
jest ła cuch znaków śDEFGHIś.
Po yteczn funkcj operuj c na zmiennych znakowych w Fortranie 77 jest funkcja LQGH[.
Funkcja ta wywołana w postaci LQGH[ Z Z , gdzie Z i Z to ła cuchy znaków, zwraca
warto ć całkowit b d c pozycj pocz tku pierwszego wyst pienia ła cucha Z w ła cuchu
Z (albo 0, je li nie wyst puje).
Np. po wykonaniu fragmentu programu:
52
FKDUDFWHU ]GDQLH
]GDQLH Å›$V WR $OL SLHVÅ›
L LQGH[ ]GDQLH śNRWś
L LQGH[ ]GDQLH śSLHVś
L b dzie równe 0 (bo tekst śNRWś nie wyst puje w ła cuchu znaków ś$V WR $OL
SLHVś), a L b dzie równe 11 (bo pocz tek ła cucha śSLHVś znajduje si na 11 pozycji
przeszukiwanego tekstu).
Do porównywania warto ci znakowych mo na wykorzystać operatory relacji znane z
rozdziału 3.1, z tym, e z wyj tkiem operatorów HT i QH wynik zale y od
uporz dkowania znaków w konkretnej implementacji. Na przykład standardowo litery
alfabetu Å‚aci skiego uporz dkowane s alfabetycznie a cyfry od 0 do 9, ale nie wiadomo, czy
litery maj wyst pować przed cyframi, czy po (ten drugi przypadek ma miejsce dla kodów
ASCII). W szczególno ci nale y pami tać, e polskie litery na pewno nie b d w
uszeregowaniu zbioru znaków na oczekiwanych miejscach, zatem przy sortowaniu
alfabetycznym tekstów zawieraj cych polskie znaki nie mo na wykorzystać operatorów
j zyka Fortran (trzeba napisać własne funkcje do porównywania tekstów).
53
9. Ró ne informacje
9.1. Instrukcja SDUDPHWHU
W programach pewne stałe wykorzystywane s wielokrotnie, np. pewne wymiary pewnych
tablic s ze sob powi zane. Je li stałe takie s wpisane w programie jawnie, trudno przy
modyfikacji programu znale ć wszystkie ich wyst pienia a tak e zauwa yć wszystkie
powi zania mi dzy nimi. Pomocna jest w takim przypadku instrukcja SDUDPHWHU,
pozwalaj ca zdefiniować nazw stałej. Ma ona postać:
SDUDPHWHU (OLVWDBSU]\SLVD )
OLVWDBSU]\SLVD składa si oddzielonych przecinkami definicji w postaci:
QD]ZD = Z\UD HQLH
przyporz dkowuj cych QD]ZLH warto ć stałego Z\UD HQLD. W wyra eniach mo emy u yć
nazw, którym nadano warto ć wcze niejszymi instrukcjami SDUDPHWHU. Nazwy
zdefiniowane przez SDUDPHWHU obowi zuj tylko w obr bie danego segmentu programu.
Przykład wykorzystania instrukcji SDUDPHWHU:
LPSOLFLW QRQH
LQWHJHU QPD[ QPD[
SDUDPHWHU QPD[ QPD[ QPD[
UHDO [ QPD[ QPD[ \ QPD[ [\ QPD[ QPD[
W sytuacji tej widać wyra nie, jakie zale no ci wyst puj pomi dzy wymiarami tablic, np. e
drugi wymiar tablicy [\ ma być dwa razy wi kszy ni pierwszy. W przypadku deklaracji
UHDO [\
mogliby my tylko próbować si tego domy lać.
Stałej zdefiniowanej przez SDUDPHWHU mo emy u yć w dalszej cz ci programu, np. przy
sprawdzeniu, czy nie przekroczono pojemno ci tablicy, albo w wywołaniu podprogramu.
Zauwa my, e przy modyfikacji programu wystarczy jedynie zmiana warto ci w instrukcji
SDUDPHWHU, co zapobiega pomyłkom.
9.2. Bloki wspólne
W wielu przypadkach do podprogramu musimy przekazać wiele zmiennych. Lista
argumentów staje si w takim przypadku niewygodnie długa. Nie mo emy niestety poł czyć
tych obiektów w struktur opisywan jedn nazw , poniewa standard Fortranu 77 nie daje
takiej mo liwo ci.
W takich przypadkach cz sto stosuje si komunikacj pomi dzy podprogramami przy
pomocy bloków wspólnych. S to wyró nione obszary pami ci, do których dost p maj
wszystkie podprogramy, którym przekazano informacj o organizacji bloku wspólnego.
Deklaracja bloku wspólnego ma postać
FRPPRQ QD]ZD OLVWDB]PLHQQ\FK
54
Na OL FLHB]PLHQQ\FK umieszcza si oddzielone przecinkami nazwy zmiennych wchodz cych
w skład bloku o podanej QD]ZLH. Jeden blok wspólny w programie mo e być bez nazwy,
wtedy znaki w jego specyfikacji mo na pomin ć.
Deklaracja danego bloku musi wyst pić we wszystkich segmentach, które maj mieć do niego
dost p. Zmienne zawarte w bloku wspólnym s globalne, zatem ich zmiana przez jeden z
podprogramów b dzie widoczna w innych. Jest to zatem alternatywny sposób przekazywania
danych/wyników do/z podprogramów.
Przykład:
W segmencie głównym zamieszczono deklaracj :
LPSOLFLW QRQH
UHDO [ \ W[ W\
LQWHJHU L[ L\
FRPPRQ L[ L\
FRPPRQ GDWD \ W[ W\
A w podprogramach deklaracje:
VXEURXWLQH SLHUZV]D
LQWHJHU L[ L\
FRPPRQ L[ L\
i
VXEURXWLQH GUXJD [
UHDO [ \ W[ W\
FRPPRQ GDWD \ W[ W\
Zdefiniowano dwa bloki wspólne. Jeden bez nazwy, zawiera dwie zmienne całkowite, dost p
do niego ma procedura o nazwie SLHUZV]D. Drugi blok, o nazwie GDWD, zawiera
stuelementow tablic rzeczywist i dwie pojedyncze zmienne rzeczywiste. Dost p do niego
ma procedura o nazwie GUXJD. Oprócz tego do tej procedury przekazywana jest pojedyncza
zmienna rzeczywista przy pomocy zwykłego mechanizmu.
Stosowanie bloków wspólnych prowadzi do zaciemnienia struktury programu, poprzez
ukrycie powi za pomi dzy segmentami (z samego tylko wywołania podprogramu nie
jeste my si w stanie zorientować, które zmienne modyfikuje). Z tego powodu nale y unikać
u ywania tego mechanizmu.
9.3. Dyrektywa LQFOXGH
Pewne deklaracje musz powtórzyć si w ró nych segmentach programu, np. instrukcje
SDUDPHWHU, deklaracje tablic, czy bloków wspólnych. W takim przypadku przy modyfikacji
tych deklaracji w jednym segmencie musimy dokonać zmian we wszystkich pozostałych.
Nietrudno wtedy o przeoczenie lub pomyłk .
Pomocne jest w takim przypadku zapisanie powtarzaj cych si deklaracji, czy instrukcji w
osobnym pliku na dysku i poinformowanie kompilatora, aby podczas kompilacji wstawił ten
55
plik w odpowiednie miejsce kodu. SÅ‚u y do tego dyrektywa LQFOXGH (niestandardowe, lecz
powszechnie stosowane rozszerzenie):
LQFOXGH śQD]ZDś
gdzie QD]ZD to nazwa pliku. Podczas kompilacji zawarto ć pliku zostaje wstawiona w
odpowiednie miejsce kodu.
Przykład: w wielu segmentach w programie chcemy zadeklarować dwie tablice
jednowymiarowe, druga ma być dwa razy wi ksza od pierwszej. Zapisujemy zatem do pliku o
nazwie np.  dekl.inc odpowiednie deklaracje:
SDUDPHWHU QP QP QP
UHDO [ QP [ QP
i we wszystkich podprogramach, w miejscu, w którym maj si one pojawić wstawiamy
dyrektyw :
LQFOXGH śGHNO LQFś
Je li teraz b dziemy musieli zmienić rozmiar tablic, poprawimy dane w instrukcji
SDUDPHWHU w pliku  dekl.inc i przekompilujemy program. Nie musimy ju pracowicie
poprawiać deklaracji we wszystkich programach.
Wykorzystanie SDUDPHWHU i LQFOXGH pozwala zredukować ilo ć bł dów przy
modyfikacji programów składaj cych si z wielu segmentów, dlatego ich stosowanie jest
godne polecenia.
9.4. Dyrektywy H[WHUQDO i LQWULQVLF
Parametrem formalnym funkcji lub procedury mo e być nazwa funkcji lub procedury. Nazwa
ta musi pojawić si w segmencie wywołuj cym w deklaracji H[WHUQDO lub LQWULQVLF
(informujemy w ten sposób kompilator, i dany parametr oznacza podprogram a nie
zmienn ).
Dyrektyw LQWULQVLF stosujemy dla funkcji wewn trznych (zdefiniowanych w standardzie
j zyka). Ma ona postać:
LQWULQVLF OLVWDBQD]Z
gdzie OLVWDBQD]Z to lista oddzielonych przecinkami nazw funkcji wewn trznych (nale y u yć
nazw specyficznych, nie grupowych).
Dla procedur i funkcji zdefiniowanych jako segmenty (czyli zewn trznych) stosujemy
dyrektyw H[WHUQDO:
H[WHUQDO OLVWDBQD]Z
gdzie OLVWDBQD]Z to lista oddzielonych przecinkami nazw procedur i/lub funkcji
zewn trznych.
56
Przykład. Załó my, e napisali my funkcj FDOND obliczaj c numerycznie całk z zadanej
funkcji w przedziale od D do E (podzielonym na Q cz ci):
IXQFWLRQ FDOND IXQ D E Q
UHDO FDOND IXQ D E ID IE
LQWHJHU Q
ID IXQ D ZDUWRVF IXQNFML Z SXQNFLH D
IE IXQ E ZDUWRVF IXQNFML Z SXQNFLH E
(GDOV]D F] ü NRGX IXQNFML)
Mamy te napisan funkcj FRVVLQ obliczaj c funkcj cos([)sin([):
IXQFWLRQ FRVVLQ [
UHDO FRVVLQ [
FRVVLQ FRV [ VLQ [
HQG
Wtedy program obliczaj cy warto ci całek oznaczonych funkcji sin(x), cos(x) i ich iloczynu
w zadanym przedziale mo e wygl dać nast puj co:
UHDO FRVVLQ D E
LQWHJHU Q
H[WHUQDO FRVVLQ
LQWULQVLF VLQ FRV
ZULWH śSU]HG]LDO FDONRZDQLD L LORVF SRG]LDORZś
UHDG D E Q
ZULWH śFDOND ] VLQ [ ś FDOND VLQ D E Q
ZULWH śFDOND ] FRV [ ś FDOND FRV D E Q
ZULWH śFDOND ] FRV [ VLQ [ ś FDOND FRVVLQ D E Q
HQG
Funkcje VLQ i FRV s funkcjami wewn trznymi, zatem w stosunku do nich u ywamy
dyrektywy LQWULQVLF. Dla zewn trznej funkcji FRVVLQ stosujemy dyrektyw
H[WHUQDO.
U ycie w tre ci funkcji FDOND parametru formalnego b d cego nazw funkcji zapewnia
ogólno ć tej funkcji  tok oblicze jest niezale ny od funkcji, któr całkujemy.
Zadanie. Dopisz brakuj c cz ć funkcji FDOND (np. stosuj c całkowanie metod trapezów).
57
10. Przykładowe programy z wykorzystaniem podprogramów
bibliotecznych
W rozdziale tym zobaczymy, jak konstruować własne programy wykorzystuj c podprogramy
biblioteczne.
10.1. Wykorzystanie funkcji generuj cej liczby pseudolosowe
W wielu przypadkach, szczególnie przy programowaniu symulacji, musimy wygenerować w
programie ci g liczb losowych. Teoretycznie program działaj cy przecie w sposób ci le
deterministyczny ci gu takiego wyprodukować nie mo e. W praktyce zadowalamy si
ci gami liczb pseudolosowych  jakkolwiek generowane s deterministycznie (przy pomocy
funkcji daj cych dostatecznie  chaotyczne warto ci) to spełniaj wymagane przez nas testy
dotycz ce losowo ci. Tym niemniej przy u yciu bardziej wyrafinowanych testów
mogliby my stwierdzić odchylenia od pełnej przypadkowo ci. Pami tać tak e nale y, e
generatory liczb pseudolosowych maj okresy powtarzalno ci  po wyprodukowaniu
dostatecznie wielu liczb ich ci g zaczyna si powtarzać. Nietrudno si domy lić, i generator
liczb pseudolosowych jest tym lepszy, im bardziej wyrafinowane testy losowo ci spełnia
produkowany przez niego ci g liczb i im dłu szy jest okres powtórze .
U ycie generatora liczb pseudolosowych zobaczymy na przykładzie funkcji UDQ
pochodz cej z ksi ki  Numerical Recipes .
Rzeczywista funkcja UDQ ma jeden argument całkowity LVHHG. Przy pierwszym
wywołaniu funkcji powinna to być liczba ujemna. Warto ć ta słu y do inicjalizacji generatora
(ró ne warto ci startowe LVHHG powoduj wygenerowanie ró nych ci gów). Przy kolejnych
wywołaniach funkcji u ywamy takiej warto ci LVHHG, jaka została ustawiona przez funkcj
UDQ (UDQ jest przykładem funkcji modyfikuj cej warto ć swego argumentu).
Warto ć funkcji UDQ to liczba rzeczywista z przedziału otwartego od 0 do 1. Liczby te
generowane s według równomiernego rozkładu prawdopodobie stwa (tzn. ka da warto ć z
tego przedziału jest jednakowo prawdopodobna).
Napiszmy program, który wygeneruje ci g liczb o podanej długo ci. Liczby powinny być
losowane równomiernie z przedziału (a,b)  zatem musimy przeskalować warto ci zwracane
przez funkcj UDQ .
Program powinien te umo liwić zadanie pocz tkowej warto ci LVHHG (aby my mogli
generować ró ne ci gi liczb).
58
Przykładowy program mo e wygl dać nast puj co:
SURJUDP UDQWHVW
LPSOLFLW QRQH
LQWHJHU Q L LVHHG
UHDO D E UDQ [ Z
ZULWH śSRGDM D L Eś
UHDG D E
ZULWH śLOH OLF]E ORVRZDF" ś
UHDG Q
ZULWH śSRGDM LVHHG ś
UHDG LVHHG
LI LVHHG JW LVHHG LVHHG
[ UDQ LVHHG
Z E D
RSHQ ILOH śUDQGRP GDWś
GR L Q
[ D Z UDQ LVHHG
ZULWH [
HQGGR
FORVH
HQG
Pierwsze wywołanie UDQ to inicjalizacja generatora, dalszych u ywamy do
wyprodukowania danej sekwencji liczb.
Poniewa podprogram UDQ b dzie (na ogół) znajdował si w innym pliku ni napisany
przez nas program główny, musimy podczas kompilacji podać nazwy wszystkich plików
zawieraj cych segmenty naszego programu, np. zakładaj c, e plik UDQWHVW I zawiera
program główny, a UDQ I kod funkcji:
I Ä…R UDQWHVW [ UDQWHVW I UDQ I
Zadanie. Przetestuj działanie programu generuj c serie liczb o ró nej długo ci i tworz c przy
pomocy jakiego programu do obróbki danych (np. Xmgrace) histogramy ich rozkładu.
Wyniki powinny być zbli one do przykładu na poni szym rysunku, gdzie przedstawiono
histogramy dla serii 20000 (krzywa br zowa) i 1000000 (krzywa czarna) liczb losowanych w
przedziale (5; 15). Przy tworzeniu histogramu podzielono ten przedział na 100 cz ci, zatem
w idealnym przypadku w ka dym przedziale powinien znale ć si 1 % wszystkich liczb.
Widać, e przy zwi kszaniu próbki zbli amy si do tego wyniku.
59
10.2. Rozwi zywanie układu równa liniowych (teoria)
Układ 1 równa liniowych z 1 niewiadomymi mo emy zapisać nast puj co:
D [ + D [ +K+ D [ = E
D [ + D [ +K+ D [ = E
,
M
D [ + D [ +K + D [ = E
czyli w postaci macierzowej
Aóx = b,
D L D E
« á « á
à ł à ł
gdzie A = à M O M ł to macierz współczynników w równaniach, b = à M ł to wektor
à ł à ł
à à ł
ŹD L D ł ŹE ć
ć
[
« á
à ł
kolumnowy prawych stron równa (znany) a x = à M ł to kolumnowy wektor zmiennych
à ł
à ł
Ź[ ć
wyst puj cych w równaniach (poszukiwany).
60

Nietrudno zauwa yć, e znaj c macierz odwrotn do A, czyli A łatwo (teoretycznie)
otrzymujemy szukane rozwi zanie:

x = A ób
W praktyce znalezienie rozwi zania w ten sposób jest niewykonalne numerycznie wymaga
bowiem obliczania wyznaczników. Tymczasem ilo ć mno e potrzebna do obliczenia
wyznacznika macierzy 1 1 jest rz du 1!, czyli bardzo szybko ro nie wraz ze wzrostem
wymiaru rozwi zywanego układu.
Rozwi zanie układu równa znajduje si wykorzystuj c metod eliminacji Gaussa.
Zauwa my, e dodaj c stronami do równa 1 do 1-1 równanie ostatnie pomno one przez
odpowiednie współczynniki otrzymamy równania, w których nie wyst puje zmienna [ .
Post puj c analogicznie mo emy wyeliminować zmienn [ z równa 1 do 1-2, itd.
Ostatecznie przekształcamy macierz A do postaci:
 0 0 0
« á
à ł
à 0 0ł
à ł ,
à ł
   0
à ł
à   ł
Ź ć
w której wszystkie niezerowe elementy znajduj si na i pod główn przek tn . Mówimy, e
macierz A sprowadzili my do postaci trójk tnej dolnej. Nietrudno teraz z pierwszego
równania obliczyć [ , podstawiaj c obliczone [ do równania drugiego obliczyć [ , itd.
Zauwa my, e operacje, jakie musieli my wykonać, aby sprowadzić A do postaci trójk tnej
dolnej nie zale od wektora prawych stron równa b. Oznacza to, e niewiele wi kszym
wysiłkiem b dziemy mogli rozwi zać nie jeden a wiele układów równa opisanych t sam
macierz A, a ró ni cych si tylko prawymi stronami.
Dla porz dku powiedzmy jeszcze, jak rozwi zywanie układu równa liniowych wykorzystać
do obliczenia wyznacznika lub macierzy odwrotnej.
Przypu ćmy, e dla zadanej macierzy A rozwi zali my 1 układów równa o prawych
stronach
1 0 0
« á « á « á
à ł à ł à ł
Ã0Å‚ Ã1Å‚ Ã0Å‚


à ł à ł à ł
b = , b = , ... , b = a otrzymane wektory rozwi za x , x , ... ,x
à ł à ł à ł
M M M
à ł à ł à ł
Ã0Å‚ Ã0Å‚ Ã1Å‚
Ź ć Ź ć Ź ć
ustawili my obok siebie, jako kolumny macierzy 1 1. Nietrudno zauwa yć, e otrzymana

macierz to A .
Operacje, jakie wykonywali my sprowadzaj c macierz do postaci trójk tnej dolnej (mno enie
wierszy przez liczb , dodawanie wierszy stronami) nie zmieniaj jej wyznacznika. Jest on
zatem taki sam, jak wyznacznik otrzymanej macierzy trójk tnej dolnej. Ten za łatwo
obliczyć jako iloczyn elementów na głównej przek tnej. W praktyce eliminacj zmiennych
dokonuje si niekoniecznie w kolejno ci, w jakiej zostały ponumerowane. Zmiana kolejno ci
61
odpowiada zamianie dwu wierszy macierzy (czyli zmienia znak jej wyznacznika). Oznacza
to, e w praktyce musimy jeszcze wiedzieć, czy ilo ć takich zmian była parzysta, czy
nieparzysta, aby pomno yć iloczyn elementów na przek tnej przez 1 lub  1.
10.3. Rozwi zywanie układu równa liniowych (program)
Przy rozwi zywaniu układu równa liniowych wykorzystamy powszechnie stosowane w
algebrze liniowej biblioteki LAPACK (Linear Algebra PACKage) i BLAS (Basic Linear
Algebra Solutions). Biblioteki te w wersji binarnej s dost pne z
http://www.netlib.og/lapack/, stamt d te mo na uzyskać kody ródłowe podprogramów.
Potrzebny nam podprogram to procedura GJHVY. Na podstawie podr cznika albo opisu
zawartego w kodzie podprogramu ustalamy jego argumenty:
68%5287,1( '*(69 1 15+6 $ /'$ ,3,9 % /'% ,1)2
Q  zmienna całkowita podaj ca wymiar układu równa
QUKV  zmienna całkowita podaj ca ilo ć prawych stron, dla których chcemy rozwi zać
układ
D  dwuwymiarowa tablica podwójnej dokładno ci przechowuj ca współczynniki równa .
Zwróćmy uwag na fakt, e tablica ta nie b dzie na ogół w programie zadeklarowana o
rozmiarach Q Q (patrz ni ej)
OGD  zmienna całkowita okre laj ca pierwszy wymiar tablicy D (tak, jak został
zadeklarowany w segmencie, z którego wywoływana jest procedura)
LSLY  jednowymiarowa tablica całkowita maj ca co najmniej Q elementów
E - dwuwymiarowa tablica podwójnej dokładno ci o wymiarach Q  QUKV przechowuj ca w
kolejnych kolumnach współczynniki prawych stron kolejnych układów równa
OGE  zmienna całkowita okre laj ca pierwszy wymiar tablicy E (tak, jak został
zadeklarowany w segmencie, z którego wywoływana jest procedura)
LQIR  zmienna całkowita
Przed wywołaniem podprogramu musimy zapisać w tablicy D współczynniki układu równa a
w tablicy E warto ci prawych stron rozwi zywanych układów oraz zadbać o ustawienie
poprawnych warto ci parametrów przekazywanych jako QUKV, OGD i OGE.
Po zako czeniu pracy podprogramu, zmienna LQIR przyjmuje warto ć 0, je li nie wyst piły
problemy, lub warto ć ró n od 0 w przeciwnym wypadku. Je li praca procedury przebiegła
pomy lnie to tablica D zawiera postać trójk tn doln wyj ciowej macierzy, kolejne kolumny
macierzy zapisanej w tablicy E to rozwi zania układu dla kolejnych prawych stron a tablica
LSLY zawiera informacje o przestawianiu wierszy macierzy przy eliminacji. Nam wystarcz
dane zwrócone w tablicy E.
Zobaczmy wobec tego, jak mo e wygl dać kod programu korzystaj cego z procedury
GJHVY:
62
SURJUDP XUOLQ
LPSOLFLW QRQH
LQWHJHU QP[
SDUDPHWHU QP[
LQWHJHU Q P LSLY QP[ LQIR L
UHDO D QP[ QP[ E QP[ QP[
FDOO F]\WDM D E Q P QP[
FDOO GJHVY Q P D QP[ LSLY E QP[ LQIR
LI LQIR HT WKHQ
FDOO Z\SLV] E Q P QP[
HOVH
ZULWH śSUREOHP\ś
HQGLI
HQG
Zało yli my, e nasz układ równa b dzie rozmiaru co najwy ej 20  20 (warto ć stałej
QP[). Zmienne Q i P przechowuj aktualny wymiar naszego układu i ilo ć prawych stron.
Zmienne te i tablice D i E s czytane przez podprogram F]\WDM, którym zajmiemy si za
chwil .
Jako warto ci parametrów formalnych Q i QUKV musimy zatem posłać do podprogramu
zmienne Q i P. Natomiast jako argumenty OGD i OGE okre laj ce pierwszy (tzw. wiod cy)
wymiar tablic D i E podajemy warto ć u yt w deklaracji, czyli QP[.
Dla przejrzysto ci czytanie danych i wypisywanie wyników delegowali my do
podprogramów F]\WDM i Z\SLV], które teraz napiszemy:
VXEURXWLQH F]\WDM D E Q P QP[
LPSOLFLW QRQH
LQWHJHU Q P QP[ L M
UHDO D QP[ QP[ E QP[ QP[
RSHQ ILOH śURZQ GDWś
UHDG Q P
GR L Q
UHDG D L M M Q
HQGGR
GR L Q
UHDG E L M M P
HQGGR
FORVH
HQG
63
VXEURXWLQH Z\SLV] E Q P QP[
LPSOLFLW QRQH
LQWHJHU Q P QP[ L M
UHDO E QP[ QP[
RSHQ ILOH śURZQ UHVś
GR L Q
ZULWH E L M M P
HQGGR
HQG
Rozwi zania naszych układów równa zawarte s w tablicy E, dlatego tylko j wypisujemy.
Zadanie. Na podstawie kodu podprogramu F]\WDM ustal, jak w pliku  rown.dat maj być
zapisane dane. Jak nale y czytać plik wynikowy?
Pozostaje jeszcze skompilować nasz program.
Je li mamy zainstalowane biblioteki BLAS i Lapack, to nie potrzebujemy kodów ródłowych
procedur, musimy natomiast za dać od kompilatora doł czenia do naszego programu
podprogramów z tych bibliotek (potrzebujemy BLAS-a, poniewa jest wykorzystywany przez
Lapack-a). Słu y do tego parametr ąO, po którym (bez spacji) podajemy nazw danej
biblioteki: OQD]ZDELE
W naszym przypadku (zakładaj c najcz ciej u ywane nazwy bibliotek, czyli EODV i
ODSDFN) skompilujemy program poleceniem:
I Ä…R XUOLQ [ XUOLQ I Ä…OODSDFN OEODV
W pewnych przypadkach mo emy nie mieć dost pu do binarnej wersji biblioteki. Wtedy
mo emy ze strony www.netlib.org ci gn ć kody ródłowe procedur (nale y pobrać tak e
wszystkie podprogramy u ywane przez GJHVY). Zawsze jednak lepiej jest spróbować znale ć
binarn wersj biblioteki.
Zadanie. Przerób program tak, aby wczytywał tylko macierz A o wymiarze n n i obliczał jej
macierz odwrotn . Zauwa , e wymaga to skonstruowania jednostkowej macierzy B (jedynki
na przek tnej, reszta elementów to zera) i przekazania jej jako macierz n prawych stron
układu. Po zadziałaniu procedury GJHVY macierz B b dzie zawierać macierz odwrotn do A
(patrz 10.2)
64
Uzupełnienie A  tabela funkcji wewn trznych Fortranu 77
Do wielu funkcji mo na odwołać si przez podanie nazwy grupowej: u yta zostanie wtedy
funkcja odpowiednia do typu argumentów.
Oznaczenia typów stosowane w tabeli: L  LQWHJHU, U  UHDO, G  GRXEOH
SUHFLVLRQ, F  FRPSOH[, O  ORJLFDO, FKDU  pojedynczy znak, FKDU  Å‚a cuch
znaków
Nazwa Ilo ć typ
opis
grupowa specyficzna argumentów argumentu wyniku
L L
LQW U L
konwersja na typ
LQW LIL[ 1 U L
całkowity
LGLQW G L
F L
UHDO L U
IORDW L U
konwersja na typ
UHDO 1 U U
rzeczywisty
VQJO G U
F U
L G
U G konwersja na typ
GEOH 1
G G podwójnej dokładno ci
F G
L F
konwersja na typ
U F zespolony (patrz
FPSO[ 1 lub 2
G G wyja nienie pod
F F tabelk )
konwersja znaku na
LFKDU 1 FKDU L
kod
FKDU 1 L FKDU konwersja kodu na
znak
DLQW U U obci cie cz ci
DLQW 1
GLQW G U ułamkowej
DQLQW U U
DQLQW 1 najbli sza całkowita
GQLQW G G
QLQW U L
QLQW 1 najbli sza całkowita
LGQLQW G L
LDEV L L
DEV U U
DEV 1 moduł
GDEV G G
FDEV F U
PRG L L
reszta z dzielenia D
PRG DPRG 2 U U
przez D
GPRG G G
65
LVLJQ L L przeniesienie znaku:
VLJQ VLJQ 2 U U
|D | dla D Ë 0
GVLJQ G G - |D | dla D < 0
LGLP L L ró nica dodatnia:
GLP GLP 2 U U D -D dla D > D
GGLP G G
0 dla D Ę D
GSURG 2 U U D * D
PD[ L L
PD[ DPD[ U U
GPD[ G G warto ć maksymalna
Ë 2
DPD[ L U
PD[ U L
PLQ L L
PLQ DPLQ U U
GPLQ G G warto ć minimalna
Ë 2
DPLQ L U
PLQ U L
OHQ 1 FKDU L długo ć w znakach
LQGH[ 2 FKDU L pozycja D w D
DLPDJ 1 F U cz ć urojona
FRQMJ 1 F F liczba sprz ona
VTUW U U
pierwiastek
VTUW GVTUW 1 G G
kwadratowy
FVTUW F F
H[S U U
H[S GH[S 1 G G funkcja wykładnicza
FH[S F F
DORJ U U
ORJ GORJ 1 G G logarytm naturalny
FORJ F F
DORJ U U
ORJ 1 logarytm dziesi tny
GORJ G G
VLQ U U
VLQ GVLQ 1 G G sinus
FVLQ F F
FRV U U
FRV GFRV 1 G G cosinus
FFRV F F
WDQ U U
WDQ 1 tangens
GWDQ G G
DVLQ U U
DVLQ 1 arcus sinus
GDVLQ G G
DFRV U U
DFRV 1 arcus cosinus
GDFVRV G G
DWDQ U U
DWDQ 1 arcus tangens
GDWDQ G G
66
DWDQ U U
DWDQ 2 arcus tangens z D /D
GDWDQ G G
VLQK U U
VLQK 1 sinus hiperboliczny
GVLQK G G
FRVK U U
FRVK 1 cosinus hiperboliczny
GFRVK G G
WDQK U U
WDQK 1 tangens hiperboliczny
GWDQK G G
OJH
OJW funkcje porównania
2 FKDU O
OOH leksykograficznego
OOW
Funkcja FPSO[ mo e mieć:
1 argument  wtedy nast puje jego przekształcenie na typ FRPSOH[ przez dodanie zerowej
cz ci urojonej (chyba, e argument był typu FRPSOH[  nie jest wtedy konwertowany)
2 argumenty (jednakowego typu)  wynikiem przekształcenia jest liczba zespolona o cz ci
rzeczywistej równej pierwszemu argumentowi i cz ci zespolonej równej drugiemu z
argumentów
67


Wyszukiwarka

Podobne podstrony:
Materiały do ćwiczeń 1 fortran
Materialy do cwiczenia 8
Ćw Materiały do ćwiczeń z elektrotechniki
PG materiały do ćwiczeń testy
BAL materiały do ćwiczeń
Materiały do cwiczenia nr 11
Fwd materialy?ukacyjne do cwiczen z rachunkowosci ?zNazwy1
Materiały do ćwiczeń z geologii te co umieć
Materiały do cwiczenia 11
Materiały do ćwiczeń projektowych cz 1 Wodociągi
material do cwiczen
material do cwiczen1
MATERIALY DO CWICZENIA BIOLOGIA CYTOMETR
material do cwiczen 3
CHROMATOGRAFIA JONOWA materialy do cwiczen

więcej podobnych podstron