Zmienne indeksowane

21
Zmienne indeksowane Zmienne indeksowane albo tablice można w FORTRANie specyfikować na 2 sposoby: 1. DIMENSION nazwa([n1:] m1,[n2:] m2,…,[nx:] mx) 2. typ nazwa([n1:] m1,[n2:] m2,…,[nx:] mx) gdzie (n1<m1), (n2<m2),… są parami granicznymi czyli zakresami danego indeksu. Zawsze trzeba podać górną granicę indeksu natomiast jeżeli nie poda się dolnej jest ona przyjmowana za 1. Pary graniczne muszą być stałymi lub zmiennymi całkowitymi; można używać liczb ujemnych (wygoda w stosunku co C). Specyfikacja DIMENSION zakłada, że typ zmiennej/stałej nazwa został zadeklarowany wcześniej albo jest zadeklarowany domyślnie zgodnie z regułą pierwszej litery nazwy. Zmiennych jako par granicznych można użyć tylko wtedy, gdy są one parametrami podprogramu lub funkcji (nigdy w programie głównym)

description

Zmienne indeksowane. Zmienne indeksowane albo tablice można w FORTRANie specyfikować na 2 sposoby: DIMENSION nazwa ([ n1 :] m1 ,[ n2 :] m2 ,…,[ nx :] mx ) typ nazwa ([ n1 :] m1 ,[ n2 :] m2 ,…,[ nx :] mx ) - PowerPoint PPT Presentation

Transcript of Zmienne indeksowane

Page 1: Zmienne indeksowane

Zmienne indeksowane

Zmienne indeksowane albo tablice można w FORTRANie specyfikować na 2 sposoby:

1. DIMENSION nazwa([n1:] m1,[n2:] m2,…,[nx:] mx)

2. typ nazwa([n1:] m1,[n2:] m2,…,[nx:] mx)

gdzie (n1<m1), (n2<m2),… są parami granicznymi czyli zakresami danego indeksu. Zawsze trzeba podać górną granicę indeksu natomiast jeżeli nie poda się dolnej jest ona przyjmowana za 1. Pary graniczne muszą być stałymi lub zmiennymi całkowitymi; można używać liczb ujemnych (wygoda w stosunku co C).

Specyfikacja DIMENSION zakłada, że typ zmiennej/stałej nazwa został zadeklarowany wcześniej albo jest zadeklarowany domyślnie zgodnie z regułą pierwszej litery nazwy.

Zmiennych jako par granicznych można użyć tylko wtedy, gdy są one parametrami podprogramu lub funkcji (nigdy w programie głównym)

Page 2: Zmienne indeksowane

Przykłady deklaracji zmiennych indeksowanych:

PARAMETER (Max_ATOM=1000)CHARACTER*16 NAZWADIMENSION INDEKS(100),XYZ(3,0:Max_ATOM),

& NAZWA(0:MAX_ATOM)

Deklarujemy najpierw 100-elementową tablicę INDEKS, której elementy mają indeksy od 1 do 100 włącznie. Jeżeli nie zadeklarujemy typu to domyślnie jest ona typu INTEGER . Następnie deklarujemy dwuwymiarową tablicę XYZ (domyślnie REAL), gdzie pierwszy indeks przyjmuje wartości od 1 do 3 włącznie a drugi od 0 do wartości stałej Max_ATOM oraz tablicę tekstową NAZWA, której typ trzeba zadeklarować explicite.

Inny sposób (równoczesna deklaracja typu i tablicy):

INTEGER INDEKS(100)REAL XYZ(3,0:Max_ATOM)CHARACTER*16 NAZWA(0:MAX_ATOM)

Page 3: Zmienne indeksowane

Elementy tablicy są ułożone kolumnami (kolejność leksykograficzna)

A(1,1) A(1,2) A(1,3) A(1,4) A(1,5)

A(2,1) A(2,2) A(2,3) A(2,4) A(2,5)

A(3,1) A(3,2) A(3,3) A(3,4) A(3,5)

A(4,1) A(4,2) A(4,3) A(4,4) A(4,5)

A(5,1) A(5,2) A(5,3) A(5,4) A(5,5)

DIMENSION A(5,5) A(1,1)

A(2,1)

A(3,1)

A(4,1)

A(5,1)

A(1,2)

…….

A(4,5)

A(5,5)

Page 4: Zmienne indeksowane

Odwołania do tablic

Przypisanie do elementu tablicy:

A(I,J)=1.0d0

Wykorzystanie wartości elementu tablicy

DROGA=SQRT(X(I)**2+Y(I)**2+Z(I)**2)

PRINT *,X(I),Y(I),Z(I)

Page 5: Zmienne indeksowane

Kolejność dyrektyw i instrukcji w segmencie

Segment główny Podprogram Funkcja

[PROGRAM nazwa]

IMPLICIT…

Deklaracje stałych

Deklaracje zmiennych

Deklaracje funkcji lokalnych

Instrukcje

END

SUBROUTINE nazwa(parametry)

IMPLICIT…

Deklaracje stałych

Deklaracje zmiennych

Deklaracje funkcji lokalnych

Instrukcje

RETURN

END

typ FUNCTION nazwa(parametry)

IMPLICIT…

Deklaracje stałych

Deklaracje zmiennych

Deklaracje funkcji lokalnych

Instrukcje

nazwa=…

RETURN

END

Page 6: Zmienne indeksowane

Czytanie i pisanie zredagowane

Dla wygody zakładamy, że urządzeniem wyjścia jest ekran (*).

Niedbałe redagowanie wydruku; druga “gwiazdka” oznacza tzw. format swobodny:

WRITE(*,*) “ZMIENNA=“,X

albo

PRINT *,X

.

Aby wydruk uporządkować, wprowadzamy format pisania listy zmiennych/stałych.

Page 7: Zmienne indeksowane

Używanie “gwiazdki” w instrukcjach WRITE i PRINT powoduje poza tym następujące niedogodności:

1. Nie mamy wpływu na format pisanej liczby co powoduje, że wydruk jest nieestetyczny a często nieczytelny.

2. Linia wydruku zaczyna się od drugiej kolumny. Jest to zaszłość ze starego FORTRANu, gdzie pierwszy znak formatu pełnił funkjcę znaku sterującego a standardowym znakiem sterującym była spacja.

3. Zakończenie instrukcji WRITE lub PRINT powoduje automatyczne przejście do nowej linii. Staje się to problemem gdy chcemy zaprogramować wydruk tabelki której wiersze zawierają różną liczbę pól.

Page 8: Zmienne indeksowane

Specyfikacja formatu poprzez dyrektywę FORMAT: stary styl.

WRITE(*,100) X

100 FORMAT(8HZMIENNA=,F10.5)

Albo tak:

100 FORMAT(‘ZMIENNA=‘,F10.5)

Nowy styl: format wbudowany w instrukcję WRITE albo PRINT:

WRITE(*,‘(8HZMIENNA=,F10.5)’) X

WRITE(*,‘(“ZMIENNA=“,F10.5)’) X

PRINT ‘(“ZMIENNA=“,F10.5)’,X

Page 9: Zmienne indeksowane

Ogólna postać specyfikacji formatu

n1P1,n2P2,,…,nxPx

Gdzie Pi jest opisem (deskryptorem) pola lub grupy pól wzorca a ni krotnością jego występowania

Każdy opis może zawierać jedną lub wiele specyfikacji wydruku, stałe tekstowe (stałe Holleritha) oraz znaki sterujące (np. przejście do nowej linii, przesunięcie do określonej kolumny, itp.).

Page 10: Zmienne indeksowane

Zestawienie powtarzalnych opisów pól. Kolorem czerwonym zaznaczono opisy niezbędne w użyciu.

INTEGER REAL REAL DOUBLE

PRECI-SION

REAL CHARAC-TER

LOGI-CAL

I F E D G A L

Iw Fw Ew Dw Gw Aw Lw

Iw.m Fw.m Ew.m Dw.m Gw.m

O Ew.m.e Dw.m.e Gw.m.e

Ow Ew.mEe Dw.mEe Gw.mEe

Ow.m

Z

Zw

Zw.m

Page 11: Zmienne indeksowane

Iw (rzadziej Iw.m) - wzorzec wydruku stałej/zmiennej całkowitej o szerokości w, włączając w to znak liczby. Łańcuch jest wyrównywany do prawej; jeżeli chcemy mieć od lewej dopełnienie zerami do m znaków stosujemy drugą z podanych specyfikacji. Jeżeli wydruk nie mieści się w w znakach są drukowane gwiazdki.

Przykład:

IA=53WRITE(‘(I4)’) IA

53WRITE(‘(I4.4)’) IA

0053

IA=100000WRITE(‘(I4)’) IA

****

Page 12: Zmienne indeksowane

Fw.m - liczba rzeczywista w reprezentacji stałoprzecinkowej o w cyfrach przed i m po kropce dziesiętnej. Jeżeli długość łańcucha jest mniejsza niż m, wydruk jest wyrównywany do prawej strony a jeżeli przekracza w drukowane są gwiazdki. Pierwsza pozycja odpowiada znakowi liczby. Puste miejsca po kropce dziesiętnej są dopełniane zerami.

Przykład:

X=-321.2WRITE(*,’(F10.5)’) X

-321.20000

X=1.1E60WRITE(*,’(F10.5)’) X

**********

Page 13: Zmienne indeksowane

Ew.mEe albo (częściej) Ew.m - liczba rzeczywista w reprezentacji zmiennoprzecinkowej mieszcząca się na w polach i zawierająca m cyfr po kropce dziesiętnej (standardowo przed kropką nie ma żadnej) oraz e cyfr wykładnika (jeżeli e nie jest podane to wynosi 2). Pierwsze pole jest zarezerwowane na znak liczby.

Przykład:

X=1234.56Y=-0.000088888WRITE(*,’(E15.10)’) X

0.1234560E+04-0.8888800E-04

Dw.mEe (Dw.m) - jak Ew.m.Ee tylko dla podwójnej precyzji (oprócz estetyki jest bez znaczenia).

Gw.mEe (Gw.m) - jak Ew.m.Ee tylko sam określa precyzję liczby.

Page 14: Zmienne indeksowane

Lw – stała logiczna zapisana na w polach (zawsze albo T albo F, które pojawia się na ostatniej pozycji).

Przykład:L = .TRUE.WRITE(*,’(L2)’) L

T

Aw lub A - łańcuch tekstowy o maksymalnie w znakach; wydruk jest wyrównywany do prawej strony. Jeżeli w pomijamy to zostanie mu przypisana rzeczywista długość tekstu.

Przykład:TEKST=‘Ala ma kota’WRITE(‘(A16)’) TEKST

Ala ma kotaWRITE(‘(A)’) TEKST

Ala ma kota

Page 15: Zmienne indeksowane

Opisy niepowtarzalne; ich ciąg ma postać łańcucha “s1s2…sn”. Kolorem czerwonym zaznaczono opisy niezbędne.

nH stała Holleritha

$ pozostawanie w bieżącej linii

/ nowa linia

: wyrównanie do kolumny poprzedniej linii

B, BN, Bz interpretacja niewiodących spacji

kP, kR przesuwanie kropki dziesiętnej (współczynnik skali)

S, SU, SP, SS pisanie lub nie początkowego plusa

T, nT, TLn, TRn tabulatory

nX wprowadzanie spacji

Page 16: Zmienne indeksowane

Przykład zastosowania czynnika skalującego

X=1234.56

Y=0.1234

WRITE(*,’(1PE15.10,0PF10.5)’) X,Y

1.23456E+03 0.12340

Skalowanie należało zniwelować, bo inaczej obowiązywałoby dla drugiego deskryptora (stałoprzecinkowego) i program wydrukowałby liczbę 10 razy większą:

WRITE(*,’(1PE15.10,F10.5)’) X,Y 1.23456E+03 1.2340

Page 17: Zmienne indeksowane

nX – n spacji.

Przykład:I=1X=-0.85WRITE(*,’(I5, F5.2)’) I,X

1-0.85

WRITE(*,’(I5,2X,F5.2)’) I,X 1 -0.85

Tn - przesunięcie do kolumny n.TLn – przesunięcie o n znaków w lewo.TRn – przesunięcie o n znaków w prawo.

Page 18: Zmienne indeksowane

/ - przesunięcie do nowej linii (występuje bez przecinka).

Przykład: X=10.0Y=20.0WRITE(*,’(F10.5/F10.5)’) X,Y

10.00000 20.00000

Page 19: Zmienne indeksowane

$ - na końcu wzorca oznacza, że następna instrukcja WRITE lub PRINT będzie kontynuowała bieżącą linię (standardowo WRITE i PRINT działają jak writeln w Pascalu albo jak printf(“%wzorzec\n”,lista) w C.

Przykład:WRITE(*,‘(A,$)’) “Wartosc X wynosi”X=10.0WRITE(*,’(F5.1)’) X

Wartosc X wynosi 10.0

Jakbyśmy nie uzyli “$” w pierwszej istrukcji WRITE mielibyśmy:

Wartosc X wynosi

10.0

Page 20: Zmienne indeksowane

Czytanie/pisanie tablic poprzez DO implikowane

DIMENSION A(10)

DO I =1,10

A(I)=I+0.0

ENDDO

WRITE(*,’(10F10.5)’) (A(I),I=1,10)

Jest to równoważne instrukcji:

DO I =1,10

WRITE(*,’(F10.5,$)’) A(I)

ENDDO

WRITE(*,*)

Page 21: Zmienne indeksowane

DO implikowane może być zagłębione:

WRITE(*,’(8F10.5)’) ((A(I,J),J=1,10),I=1,10)