1 / 21

Zmienne indeksowane

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 )

rania
Download Presentation

Zmienne indeksowane

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Zmienne indeksowane • Zmienne indeksowane albo tablice można w FORTRANie specyfikować na 2 sposoby: • DIMENSION nazwa([n1:] m1,[n2:] m2,…,[nx:] mx) • typnazwa([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)

  2. Przykłady deklaracji zmiennych indeksowanych: PARAMETER (Max_ATOM=1000) CHARACTER*16 NAZWA DIMENSION 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)

  3. Elementy tablicy są ułożone kolumnami (kolejność leksykograficzna) DIMENSION A(5,5)

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

  5. Kolejność dyrektyw i instrukcji w segmencie

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

  7. Używanie “gwiazdki” w instrukcjach WRITE i PRINT powoduje poza tym następujące niedogodności: • Nie mamy wpływu na format pisanej liczby co powoduje, że wydruk jest nieestetyczny a często nieczytelny. • 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. • 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.

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

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

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

  11. 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=53 • WRITE(‘(I4)’) IA • 53 • WRITE(‘(I4.4)’) IA • 0053 • IA=100000 • WRITE(‘(I4)’) IA • ****

  12. 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.2 • WRITE(*,’(F10.5)’) X • -321.20000 • X=1.1E60 • WRITE(*,’(F10.5)’) X • **********

  13. 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.56 • Y=-0.000088888 • WRITE(*,’(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.

  14. 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 kota • WRITE(‘(A)’) TEKST • Ala ma kota

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

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

  17. nX – n spacji. • Przykład: • I=1 • X=-0.85 • WRITE(*,’(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.

  18. / - przesunięcie do nowej linii (występuje bez przecinka). • Przykład: • X=10.0 • Y=20.0 • WRITE(*,’(F10.5/F10.5)’) X,Y • 10.00000 • 20.00000

  19. $ - 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.0 • WRITE(*,’(F5.1)’) X • Wartosc X wynosi 10.0 • Jakbyśmy nie uzyli “$” w pierwszej istrukcji WRITE mielibyśmy: • Wartosc X wynosi • 10.0

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

  21. DO implikowane może być zagłębione: WRITE(*,’(8F10.5)’) ((A(I,J),J=1,10),I=1,10)

More Related