Zmienne indeksowane

Post on 12-Jan-2016

78 views 0 download

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

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)

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)

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)

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)

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

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.

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.

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

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.).

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

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

****

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

**********

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.

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

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

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

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.

/ - 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

$ - 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

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(*,*)

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

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