Operacje wejÅ›cia/wyjÅ›cia 1 Operacje wejÅ›cia/wyjÅ›cia Instrukcje wejÅ›cia i wyjÅ›cia umożliwiajÄ… przekazywanie informacji miÄ™dzy komputerem a użytkownikiem programu. PozwalajÄ… okreÅ›lić odpowiedz na trzy pytania: ·ð CO? lista wejÅ›cia: zmienne; kolejne zmienne sÄ… oddzielane przecinkiem; lista wyjÅ›cia: zmienne lub stae ; kolejne elementy listy sÄ… oddzielane przecinkiem; ·ð SKD / DOKD? urzÄ…dzenie standardowe symbolizowane gwiazdkÄ…: wejÅ›cie - klawiatura, wyjÅ›cie - monitor. plik plik wewnÄ™trzny (zmienna tekstowa) ·ð W JAKI SPOSÓB? format: gwiazdka symbolizuje tzw. format swobodny. W przypadku instrukcji READ jest to najczęściej wystarczajÄ…ce i najwygodniejsze. W przypadku instrukcji WRITE (lub PRINT) osiÄ…gniÄ™cie czytelnego i przejrzystego wydruku czÄ™sto wymaga zastosowania redagowania formatowanego. ·ð CO? lista wejÅ›cia: zmienne; kolejne zmienne sÄ… oddzielane przecinkiem; lista wyjÅ›cia: zmienne lub stae ; kolejne elementy listy sÄ… oddzielane przecinkiem; PrzykÅ‚ady: READ(*,*) a,b,c READ(*,*) n, (x(i),i=1,n) READ(*,*) (x(i), y(i), i=1,n) READ(*,*) a(1,:) WRITE(*,*) 'wartosc ',125 WRITE(*,*) a,b,c WRITE(*,*) (i, x(i), y(i), i=1,n) WRITE(*,*) 'Suma elementow z przekatnej: ',sum ·ð W JAKI SPOSÓB? - Formaty Redagowanie formatowane może być stosowane zarówno w odniesieniu do instrukcji wejÅ›cia jak i wyjÅ›cia. Tu omówimy instrukcjÄ™ wyjÅ›cia (WRITE lub PRINT) z uwagi na fakt, że czytanie najczęściej odbywa siÄ™ z wykorzystaniem formatu swobodnego. WiÄ™kszość informacji jest aktualna również w odniesieniu do instrukcji READ. Redagowanie formatowane umożliwia Å›cisÅ‚e zdefiniowanie postaci (liczba znaków, liczba znaków po kropce dziesiÄ™tnej, itd.) wyprowadzanych wartoÅ›ci. Definiowanie odbywa siÄ™ poprzez wskazanie w instrukcji wyjÅ›cia wzorca redagowania. Wskazanie wzorca redagowania Wskazanie wzorca redagowania może nastÄ…pić poprzez: ·ð Umieszczenie wzorca redagowania ujÄ™tego w apostrofy ' lub '' w instrukcji WRITE ewentualnie poprzedzonego sÅ‚owem kluczowym FMT=: WRITE (*,'(wzorzec redagowania)') ..... WRITE (*,FMT='(wzorzec redagowania)') ..... ·ð Wykorzystanie zmiennej tekstowej, której wartoÅ›ciÄ… jest wzorzec redagowania: CHARACTER (LEN=80):: WZORZEC CHARACTER (LEN=30), PARAMETER:: WZOR='(wzorzec redagowania)' ...... WZORZEC='(wzorzec redagowania)' Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16 Operacje wejÅ›cia/wyjÅ›cia 2 ..... WRITE(*,WZORZEC) ...... PRINT WZOR, ....... ·ð Wykorzystanie etykiety, takiej samej, jakÄ… opatrzona jest specyfikacja FORMAT, definiujÄ…ca wzorzec redagowania: WRITE(*,20).... PRINT 30,..... 20 FORMAT (wzorzec redagowania) ..... 30 FORMAT (wzorzec redagowania) Uwagi: ·ð Specyfikacja FORMAT może wystÄ…pić w dowolnym miejscu programu. ·ð Do tej samej specyfikacji FORMAT może odnosić siÄ™ dowolna liczba instrukcji wejÅ›cia/wyjÅ›cia. ·ð Szczególnym przypadkiem wzorca redagowania jest gwiazdka *, oznaczajÄ…ca format swobodny. Wzorzec redagowania Wzorzec redagowania definiuje budowÄ™ rekordu. Rekordem nazywa siÄ™ pewnÄ… elementarnÄ… porcjÄ™ informacji. W przypadku instrukcji wyjÅ›cia rekord odpowiada jednemu wierszowi wydruku. Wzorzec redagowania jest Å›ciÅ›le powiÄ…zany z listÄ… wyjÅ›cia - i poÅ‚Ä…czenie tych elementów okreÅ›la postać rekordu wyjÅ›ciowego. Wzorzec redagowania może zawierać: ·ð opisy pól danych ·ð opisy pomocnicze ·ð opisy grupowe Kolejne elementy wzorca redagowania sÄ… oddzielane przecinkami. Opisy pól danych Opis pola zawiera informacjÄ™ o typie wyprowadzanej wartoÅ›ci, dÅ‚ugoÅ›ci zajmowanego przez niÄ… pola oraz sposobie zapisu. Poniżej bÄ™dÄ… wykorzystane nastÄ™pujÄ…ce oznaczenia: w caÅ‚kowita dÅ‚ugość pola d liczba cyfr części uÅ‚amkowej liczby m minimalna liczba wypisanych cyfr e liczba cyfr wykÅ‚adnika r liczba powtórzeÅ„ opisu pola we wzorcu wartoÅ›ci INTEGER rIw, rIw.m wartoÅ›ci REAL rFw.d rEw.d oraz rEw.dEe wartoÅ›ci CHARACTER rA lub rAw wartoÅ›ci LOGICAL rLw Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16 Operacje wejÅ›cia/wyjÅ›cia 3 Uwagi: ·ð JeÅ›li caÅ‚kowita dÅ‚ugość pola jest niewystarczajÄ…ca, to wtedy wartoÅ›ci liczbowe nie zostanÄ… wypisane (zamiast liczby pojawiÄ… siÄ™ gwiazdki), natomiast wartoÅ›ci tekstowe zostanÄ… obciÄ™te. ·ð Część uÅ‚amkowa liczby zostanie zaokrÄ…glona do dokÅ‚adnoÅ›ci zadanej poprzez wartość d. ·ð JeÅ›li caÅ‚kowita dÅ‚ugość pola jest dÅ‚uższa w porównaniu z dÅ‚ugoÅ›ciÄ… zajmowanÄ… przez wypisywanÄ… wartość, to nastÄ™puje wyrównanie do prawej strony. PrzykÅ‚ad: program formaty implicit none integer::i=-123, j=123 real::a=1.123 double precision:: d=12.d1 character (len=3)::ala='ALA' ! write(*,'(i5,1x,i6.5)') i,i ! -123 -00123 write(*,'(i2)') i ! zbyt krotki opis pola ! ** write(*,'(2i5)') i, j ! -123 123 write(*,'(f6.2, f8.4, e11.4, e12.2e4)')a,a,a,a ! 1.12 1.1230 0.1123E+01 0.11E+0001 write(*,'(f6.2, f8.4, e11.4, e12.2e4)')d,d,d,d ! 120.00120.0000 0.1200E+03 0.12E+0003 write(*,'(a)') ala !liczba znakow zgodna z dlugoscia wypisywanej wartosci ! ALA write(*,'(a10)') ala ! ALA write(*,'(a2)') ala ! AL end program formaty Uwagi: ·ð Elementy listy wyjÅ›cia sÄ… kojarzone z kolejnymi opisami pól we wzorcu redagowania. Wymagana jest zgodność typów elementów listy wyjÅ›cia i typów opisów pól. Brak zgodnoÅ›ci powoduje wystÄ…pienie bÅ‚Ä™du wykonania programu i przerwanie jego dziaÅ‚ania. ·ð Istotne sÄ… relacje miÄ™dzy caÅ‚kowitÄ… dÅ‚ugoÅ›ciÄ… pola w a liczbÄ… znaków przeznaczonych na reprezentacjÄ™ części uÅ‚amkowej liczby lub mantysy d. Należy również uwzglÄ™dnić miejsce na kropkÄ™ dziesiÄ™tnÄ… oraz znak minus. W zwiÄ…zku z tym: w opisie pola Fw.d: w-d>2 w opisie pola Ew.d: w-d>6 (wykÅ‚adnik zajmuje 4 pozycje, plus znak na kropkÄ™ dziesiÄ™tnÄ…, zero oraz znak minus) ·ð Liczby wypisywane zgodnie z opisem Ew.d sÄ… przeksztaÅ‚cane do postaci Ä…0.ddddÏð10n, bez wzglÄ™du na oryginalnÄ… postać. Opisy pomocnicze Opisy pomocnicze zawierajÄ… dodatkowe informacje o strukturze rekordu. Nic nie zostaje wypisane, ale zmienione zostaje poÅ‚ożenie, w którym zostanie wypisany kolejny element rekordu. nX wstawienie n odstÄ™pów (spacji) 'zzz' wypisanie ciÄ…gu znaków (staÅ‚ej tekstowej) Tc przemieszczenie do pozycji c TLc przemieszczenie o c pozycje w lewo Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16 Operacje wejÅ›cia/wyjÅ›cia 4 TRc przemieszczenie o c pozycje w prawo / przejÅ›cie do nowego wiersza. Opisy wystÄ™pujÄ…ce po znaku / sÄ… realizowane w kolejnym wierszu wydruku. PrzykÅ‚ad: write(*,'(T10,a,T6,a)') 'AAA','BBB' ! BBB AAA ! warto porównać kolejność! write(*,'(a,3x,a,5x,'koniec') 'AAA','BBB' ! AAA BBB koniec Opisy grupowe Dowolny ciÄ…g opisów pól i opisów pomocniczych może zostać ujÄ™ty w nawiasy oraz dodatkowo poprzedzony staÅ‚Ä… caÅ‚kowitÄ…, której wartość definiuje liczbÄ™ kolejnych powtórzeÅ„ wzorca ujÄ™tego w nawiasy. Liczba opisów pól we wzorcu a liczba elementów w liÅ›cie wyjÅ›cia ·ð Nie wymaga siÄ™ aby liczba elementów listy wyjÅ›cia byÅ‚a taka sama jak liczba opisów pól we wzorcu redagowania. ·ð JeÅ›li liczba elementów listy wyjÅ›cia jest mniejsza od liczby opisów pól to proces wypisywania jest kontynuowany aż do wyczerpania listy wyjÅ›cia. JeÅ›li miÄ™dzy ostatnim wykorzystanym opisem pola a opisem, dla którego 'zabraknie' elementu listy wyjÅ›cia znajdujÄ… siÄ™ opisy pomocnicze, to zostanÄ… one zinterpretowane. ·ð JeÅ›li liczba elementów listy wyjÅ›cia jest wiÄ™ksza od liczby opisów pól (wzorzec jest 'za krótki'), to po wykorzystaniu wszystkich opisów znajdujÄ…cych siÄ™ we wzorcu nastÄ™puje: -PrzejÅ›cie do kolejnego wiersza wydruku; -Wypisywanie kolejnych elementów listy wyjÅ›cia wedÅ‚ug zasady: - JeÅ›li we wzorcu formatu nie wystÄ™pujÄ… opisy grupowe, to wzorzec jest interpretowany od poczÄ…tku. - JeÅ›li we wzorcu wystÄ™pujÄ… opisy grupowe, to wzorzec jest interpretowany tylko wedÅ‚ug tego opisu grupowego, którego nawias zamykajÄ…cy znajduje siÄ™ najbardziej z prawej strony. Ewentualne powtórzenia opisu grupowego sÄ… również uwzglÄ™dnione. PrzykÅ‚ad: program formaty implicit none integer::i integer,dimension(15):: a=(/(i,i=1,15)/) write (*,20) (a(i),i=1,15) 20 format(2(2x,i3),3x,'***',2(2x,'*',i4)) end program formaty Wynik dziaÅ‚ania programu: 1 2 *** * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * Uwaga: We wzorcu redagowania nie mogÄ… wystÄ…pić zmienne. Natomiast można 'dynamicznie' tworzyć wzorce formatu poprzez generowanie zmiennych tekstowych, o wartoÅ›ciach wykorzystywanych jako wzorce formatu. Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16 Operacje wejÅ›cia/wyjÅ›cia 5 ·ð SKD / DOKD? OkreÅ›lenie skÄ…d bÄ™dÄ… wczytywane dane oraz dokÄ…d bÄ™dÄ… wypisywane wyniki odbywa siÄ™ poprzez zdefiniowanie urzd zenia logicznego (ang. logical unit). UrzÄ…dzenia sÄ… oznaczane za pomocÄ… liczb dodatnich z przedziaÅ‚u od 1 do (najczęściej) 100, przy czym górna wartość zależy od kompilatora. READ([UNIT=] urzÄ…dzenie, [FMT=] wzorzec redagowania) ..... WRITE([UNIT=] urzÄ…dzenie, [FMT=] wzorzec redagowania) ..... W praktyce urzÄ…dzenie oznacza: ·ð urzÄ…dzenie standardowe symbolizowane gwiazdkÄ… *: wejÅ›cie - klawiatura, wyjÅ›cie - monitor. READ(UNIT=*,*) .... READ(*,*).... Szczególna postać instrukcji READ czytajÄ…cej z klawiatury: READ wzorzec formatu, .... Analogicznie: WRITE(UNIT=*,*) .... WRITE(*,*).... Szczególna postać instrukcji wypisujÄ…cej na monitor: PRINT wzorzec formatu, .... ·ð plik OdwoÅ‚anie siÄ™ do pliku w instrukcji READ lub WRITE wymaga 'otwarcia pliku' poprzez zastosowania instrukcji OPEN. Instrukcja OPEN sÅ‚uży to 'podÅ‚Ä…czenia' konkretnego pliku do urzÄ…dzenia logicznego. OPEN([UNIT=] numer urzÄ…dzenia, FILE=nazwa pliku) PrzykÅ‚ad: .... OPEN(10, FILE='DANE.DAT') OPEN(15,FILE='WYNIKI') READ(10,*) A, B, C READ(10,*) D,E,F CLOSE(10) .... WRITE(15,*) 'Wyniki' .... CLOSE(15) Uwaga: ·ð Podczas wykonywania programu może być otwartych w tym samym czasie wiele plików, ale z danym urzÄ…dzeniem logicznym może być powiÄ…zany tylko jeden plik. ·ð nazwa pliku to staÅ‚a lub zmienna tekstowa. Zmienna tekstowa umożliwia dynamiczne definiowanie pliku podczas dziaÅ‚ania programu. ·ð 'ZamkniÄ™cie' pliku i 'zwolnienie' urzÄ…dzenia logicznego nastÄ™puje w wyniku wykonania instrukcji: CLOSE (numer urzÄ…dzenia) ·ð Zawartość pliku z danymi musi być 'zgodna' z instrukcjami z niego czytajÄ…cymi. Na przykÅ‚ad w powyższym przykÅ‚adzie wartość odpowiadajÄ…ca zmiennej d musi znajdować siÄ™ w innym (kolejnym) wierszu niż rekord, w którym znajduje siÄ™ zmienna c. Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16 Operacje wejÅ›cia/wyjÅ›cia 6 ·ð plik wewnÄ™trzny (zmienna tekstowa) Jako urzÄ…dzenie w instrukcjach READ oraz WRITE mogÄ… wystÄ…pić zmienne tekstowe. Umożliwia to 'przepisanie' wartoÅ›ci liczbowych na zmienne tekstowe i odwrotnie, co niekiedy jest bardzo pożyteczne. Wystarczy przypomnieć skomplikowane czynnoÅ›ci programistyczne sÅ‚użące do przedstawienia staÅ‚ej tekstowej '1234' (na przykÅ‚ad) jako liczby. Wykorzystanie plików wewnÄ™trznych uÅ‚atwia dynamiczne generowanie wzorców formatów oraz nazw plików zawierajÄ…cych liczby, bowiem w obydwu przypadkach niezbÄ™dna jest konwersja wartoÅ›ci liczbowych na teksty. PrzykÅ‚ad: program plik_wewnetrzny implicit none character (len=5):: tekst='12345' character (len=80):: bufor integer :: liczba write (unit=*,FMT=*) 'tekst: ',tekst read (tekst,*) liczba write(*,*) 'to juz jest liczba: ',liczba,liczba/2 liczba=liczba/2 write(bufor,*) liczba write(*,*) 'a to jest tekst ',bufor end program plik_wewnetrzny Wyniki dziaÅ‚ania programu: tekst: 12345 to juz jest liczba: 12345 6172 a to jest tekst 6172 Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16 Operacje wejÅ›cia/wyjÅ›cia 7 WiÄ™cej o... Zarówno instrukcje READ i WRITE, jak i instrukcja OPEN, dysponujÄ… dużą liczbÄ… opcjonalnych argumentów, o których do tej pory nie wspomniano, a które znacznie rozszerzajÄ… ich możliwoÅ›ci. Poniżej krótko o tych zagadnieniach. Uwaga: ·ð W instrukcjach READ, WRITE oraz OPEN muszÄ… wystÄ…pić pierwsze dwa ustalenia. PozostaÅ‚e ustalenia sÄ… opcjonalne. ·ð Nawiasy < > użyte sÄ… tylko symbolicznie w celu wyróżnienia odpowiednich fragmentów i nie pojawiajÄ… siÄ™ w instrukcji. READ([UNIT=], [FMT=],& IOSTAT=, ERR=, END=, EOR=, ADVANCE=,& REC=, SIZE=) lista wejÅ›cia gdzie: qð [UNIT=] :numer urzÄ…dzenia logicznego lub * w przypadku czytania z urzÄ…dzenia standardowego. SÅ‚owo kluczowe UNIT= może zostać pominiÄ™te jeÅ›li urzÄ…dzenie logiczne wystÄ™puje jako pierwsze ustawienie instrukcji READ. qð FMT= :staÅ‚a tekstowa zawierajÄ…ca wzorzec redagowania, zmienna tekstowa, której wartoscia jest wzorzec redagowania, etykieta wskazujÄ…ca na specyfikacjÄ™ FORMAT lub *, jeÅ›li obowiÄ…zuje format swobodny. JeÅ›li format jest definowany jako drugie z kolei ustawienie instrukcji READ, to sÅ‚owo kluczowe FMT= może być pominiÄ™te. qð IOSTAT= :wskazuje na zmiennÄ…, która przechowywać bÄ™dzie kod powrotu wykonania instrukcji. Wartość 0 kodu powrotu oznacza poprawne wykonanie instrukcji READ, wartość ujemna oznacza, że napotkano znak koÅ„ca pliku, zaÅ› wartość dodatnia oznacza, że nastapiÅ‚ bÅ‚Ä…d. qð ERR= :etykieta instrukcji, do której zostanie przeniesione sterowanie w przypadku wystÄ…pienia bÅ‚edu czytania. qð END= :etykieta instrukcji, do której zostanie przeniesione sterowanie w przypadku napotkania znaku koÅ„ca pliku. Opcja dostÄ™pna tylko dla instrukcji READ. qð ADVANCE= :okreÅ›la czy instrukcja READ powinna powodować rozpoczÄ™cie nowego rekordu. WartoÅ›ciÄ… domyÅ›lnÄ… jest ADVANCE='YES', czyli rozpoczÄ™cie nowego rekordu. Podanie ADVANCE='NO' sprawia, że nie nastÄ™puje przejÅ›cie do kolejnego rekordu, ale uwaga, użycie tej opcji jest dozwolone tylko dla plików o dostÄ™pie sekwencyjnym oraz przy jawnie zdefiniowanym formacie (nie jest dozwolony format swobodny). qð EOR= :etykieta instrukcji, do której zostanie przeniesione sterowanie w przypadku napotkania znaku koÅ„ca rekordu. Opcja dostÄ™pna tylko dla instrukcji READ i tylko wtedy, gdy obowiÄ…zuje ustawienie ADVANCE='NO'. qð REC= :okreÅ›la numer rekordu w przypadku plików o dostÄ™pie bezpoÅ›rednim. qð SIZE= :po wykonaniu instrukcji READ podana w tej opcji zmienna bÄ™dzie zawierać liczbÄ™ przeczytanych znaków. Opcja dostÄ™pna tylko dla instrukcji READ i tylko wtedy, gdy obowiÄ…zuje ustawienie ADVANCE='NO'. Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16 Operacje wejÅ›cia/wyjÅ›cia 8 WRITE([UNIT=], [FMT=],& IOSTAT=, ERR=, ADVANCE=,& REC=) lista wyjÅ›cia gdzie: qð [UNIT=] :numer urzÄ…dzenia logicznego lub * w przypadku pisania na urzÄ…dzenie standardowe. SÅ‚owo kluczowe UNIT= może zostać pominiÄ™te jeÅ›li urzÄ…dzenie logiczne wystÄ™puje jako pierwsze ustawienie instrukcji WRITE. qð FMT= :staÅ‚a tekstowa zawierajÄ…ca wzorzec redagowania, zmienna tekstowa, której wartoscia jest wzorzec redagowania, etykieta wskazujÄ…ca na specyfikacjÄ™ FORMAT lub *, jeÅ›li obowiÄ…zuje format swobodny. JeÅ›li format jest definowany jako drugie z kolei ustawienie instrukcji WRITE, to sÅ‚owo kluczowe FMT= może być pominiÄ™te. qð IOSTAT= :wskazuje na zmiennÄ…, która przechowywać bÄ™dzie kod powrotu wykonania instrukcji. Wartość 0 kodu powrotu oznacza poprawne wykonanie instrukcji WRITE. qð ERR= :etykieta instrukcji, do której zostanie przeniesione sterowanie w przypadku wystÄ…pienia bÅ‚edu pisania. qð ADVANCE= :okreÅ›la czy instrukcja WRITE powinna powodować rozpoczÄ™cie nowego rekordu. WartoÅ›ciÄ… domyÅ›lnÄ… jest ADVANCE='YES', czyli rozpoczÄ™cie nowego rekordu. Podanie ADVANCE='NO' sprawia, że nie nastÄ™puje przejÅ›cie do kolejnego rekordu, ale użycie tej opcji jest dozwolone tylko dla plików o dostÄ™pie sekwencyjnym oraz przy jawnie zdefiniowanym formacie (nie jest dozwolony format swobodny). qð REC= :okreÅ›la numer rekordu w przypadku plików o dostÄ™pie bezpoÅ›rednim. OPEN([UNIT=], FILE=, ERR=,& STATUS=, ACCESS=, ACTION=,& RECL=) qð [UNIT=] :podaje numer, poprzez który nastÄ…pi odwoÅ‚anie do pliku. Nie można podać numeru, który już jest w użyciu. qð FILE= :podanie nazwy pliku, który zostanie utożsamiony z urzÄ…dzeniem logicznym. qð ERR=