32. Operacje wejścia/wyjścia – write, read Pełna składnia instrukcji write, read jest następująca: write(unit=n,fmt=f,iostat=zmienna_całkowita,) lista_wyjścia gdzie: unit=n specyfikator urządzenia (* urządzenia domyślne: monitor, klawiatura) fmt’f specyfikator formatu (* format swobodny) iostat=zmienna_całkowita specyfikator zmiennej przechowującej kod błędu 33. Specyfikacja formatu Definiowanie formatowania wypisywanej listy obiektów odbywa się przy pomocy wzorca redagowania. Domyślne (swobodne) formatowanie oznaczane jest symbolem *. Wzorzec redagowania możemy podać: - w instrukcji format - w stałej tekstowej, - jako zawartość zmiennej tekstowej Wzorzec składa się z pól służących do definiowania formatu, w jakim ma ją być np. wypisane obiekty na liście wyjścia. Najczęściej używane pola to: iw liczba całkowita w polu o szerokości w znaków np. i3 żeby wypisać liczbę 100, i4 żeby wypisać -100 fw.d liczba rzeczywista w polu o szerokości w znaków z d cyframi po kropce UWAGA, kropka w cyfrze liczy się jako 1 znak, 1 miejsce powinno być także zarezerwowane liczby na znak np. f4.1 do wypisania -0.1 ew.dec liczba rzeczywista w zapisie wykładniczym w polu o szerokości w znaków z d cyframi po kropce, z wykładnikiem zapisanym przy użyciu c cyfr. aw wypisanie łańcucha w znaków wx wypisanie łańcucha w spacji ‘tekst’ wypisanie tekstu znajdującego się pomiędzy apostrofami Zapis każdego z powyższych pól może być poprzedzony liczbą całkowitą, podającą ilość powtórzeń danego pola, np. 2i3 dwa pola, każde o długości 3 znaków, do wypisywania liczb całkowitych. 24 Przy wypisywaniu liczba jest dosuwana do prawej krawędzi pola, jeżeli ilość niezbędnych do wypisania znaków jest mniejsza od ilości znaków zadeklarowanych w polu, np. pole Liczba do wypisanie ekran i3 100 100 i3 10 10 i3 1 1 Jeżeli liczba znaków niezbędnych do wypisania liczby na ekran jest większa niż długość pola to wypisywane są gwiazdki, np. pole Liczba do wypisanie ekran i3 100 100 i3 1000 *** i3 10 10 Przykłady: wypisywanie liczb całkowitych: program pr75 implicit none integer::i,k i=100 k=200 write(*,*) 'Wypisanie zmiennych: i, k w formacie swobodnym' write(*,*) i,k write(*,*) write(*,*) 'Wypisanie zmiennych: i, k w formacie zredagowanym' 10 format (i3,1x,i3) write(*,10) i,k i=10 k=20 write(*,10) i,k !obserwujemy wyrownywanie liczb do prawej strony i=1 k=2 write(*,10) i,k !obserwujemy wyrownywanie liczb do prawej strony i=1000 write(*,10) i,k ! jezeli liczba jest wieksza niz pole , na wydruku gwiazdki end 25 Wypisywanie liczb rzeczywistych: program pr76 implicit none real::x,y x=-0.1 y=-10.01 write(*,*) 'Wypisanie zmiennych: x, y w formacie swobodnym' write(*,*) x,y write(*,*) write(*,*) 'Wypisanie zmiennych: x, y w formacie zredagowanym' 20 format (f4.1,1x,f6.2) write(*,20) x,y y=0.01 write(*,20) x,y !dosuwanie do prawej krawedzi pola y=0.001 30 format (f4.1,1x,e8.1e2) ! y wypisywane w postaci wykladniczej write(*,30) x,y write(*,'(f4.1,1x,e8.1e2)') x,y !wzorzec formatu bezposrednio w instrukcji write end Wypisywanie liczb i tekstów: program pr77 implicit none integer::i,k real::x,y i=100 k=200 write(*,40) "i = ",i," k = ",k 40 format (a4,i3,a5,i3) !definicja formatu w dowolnym miejscu w programie 50 format (a,i3,a,i3) !dl pol tekstowych zostanie dostosowana do dl tekstu write(*,50) "i = ",i," k = ",k write(*,50) "i = ",i," a teraz druga zmienna, k = ",k 60 format (2(a,i3)) ! format pol w nawiasie zostanie powtorzony dwa razy write(*,60) "i = ",i," a teraz druga zmienna, k = ",k 70 format ('i = ',i3,' k = ',i3) !teksty zdefiniowane w formacie write(*,70) i,k end 26 34. Ćwiczenie - napisz program (pr78.f90), który wczyta do tabeli 5 liczb rzeczywistych i następnie wypisze je w postaci „tablica(i) = x”, gdzie i to liczba całkowita (1 cyfra), a x liczba rzeczywista, wypisywana z dokładnością do drugiego miejsca po przecinku. 35. Zapis i odczyt danych z pliku W specyfikatorze urządzenia symbol gwiazdki /write(*,…./ oznacza urządzenie domyślne ekran (instrukcja write) lub klawiatura (instrukcja read). Jeżeli chcemy dane zapisać do pliku lub z niego odczytać, musimy połączyć zewnętrzny plik z jednostka logiczną reprezentowana w programie jako specyfikator urządzenia open(specyfikator_urządzenia, file=’nazwa_pliku’, status=’stan’) Plik może mieć następujący status: new - plik nie istnieje na dysku, i zostanie utworzony old - plik o tej nazwie już istnieje na dysku unknown - jeżeli plik o tej nazwie istnieje to przy zapisie zostanie nadpisana jego zawartość, jeżeli plik nie istnieje to zostanie utworzony write(specyfikator_urządzenia,*) …. read(specyfikator_urządzenia,*) …. Po odczycie/zapisie danych z/do pliku należy go odłączyć, następującą instrukcją: close(specyfikator_urządzenia) program pr79 implicit none integer::i,j real,dimension(5)::tablica do i=1,5 write(*,'(a,i1,a)') 'Podaj ',i,' element tablicy z dokl do 2 miejsca:' read(*,*) tablica(i) enddo write(*,*) 27 write(*,*) 'Wypisanie elementow tablicy na ekran:' do i=1,5 write(*,'(i1,1x,f7.2)') i,tablica(i) enddo write(*,*) write(*,*) 'Zapis elementow tablicy do pliku wyniki.dat' open(1,file='wyniki.dat',status='unknown') do i=1,5 write(1,'(i1,1x,f7.2)') i,tablica(i) enddo close(1) write(*,*) write(*,*) 'Wczytanie wartosci z pliku wyniki.dat i wypisanie ich na ekran' open(1,file='wyniki.dat',status='old') do i=1,5 read(1,'(i1,1x,f7.2)') j,tablica(j) write(*,'(i1,1x,f7.2)') j,tablica(j) enddo close(1) end 36. Ćwiczenia -napisz program (pr80.f90), który wczyta do tablicy „tab1” 4 liczby rzeczywiste, obliczy wartości ich drugich potęg i wyniki zapisze w tablicy „tab2” /tablica do przechowywania 4 liczb rzeczywistych/. Następnie program ma wyświetlić zawartość tablicy „tab2” w formacie zredagowanym i zapisać dane do pliku tab2.dat - napisz program (pr81.f90), który wczyta do tablicy „tab11” 5 liczb rzeczywistych, następnie w nowej tablicy „tab12” /tablica do przechowywania 3 liczb rzeczywistych/ w pierwszej pozycji umieści sumę liczb z tablicy „tab11”, w drugiej pozycji umieści wartość maksymalną z tablicy „tab11”, a w trzeciej pozycji umieści wartość minimalną z tablicy „tab11”. Następnie program ma zapisać wartości z tablicy „tab12” do pliku o nazwie tab12.dat 28 37. „Do implikowane” Używamy do wczytywania bądź wypisywania elementów tablicy, zamiast używać standardowej pętli „do” Standardowa pętla do „do implikowane” …. …… do i=1,5 wite(*,*)'Podaj elementy tablicy' write(*,*) 'Podaj ',i,' element tablicy:' read(*,*) (tablica(i), i=1,5) read(*,*) tablica(i) enddo …… ….. write(*,*) ‘W tablicy znajdują się’ do i=1,5 write(*,*) (tablica(i), i=1,5) write(*,*) tablica(i) …… enddo …… program pr82 IMPLICIT NONE real,dimension(5)::tablica integer::i !wczytuje elementy tablicy do i=1,5 write(*,*) 'Podaj ',i,' element tablicy:' read(*,*) tablica(i) enddo write(*,*) write(*,*) 'Wypisanie elementow tablicy przy pomocy petli do' do i=1,5 write(*,*) tablica(i) enddo write(*,*) write(*,*) 'Wypisanie elementow tablicy przy pomocy do implikowane' write(*,*) (tablica(i), i=1,5) 29 write(*,*) write(*,*) 'Wczytanie nowych elementow tablicy przy pomocy do implikowane' read(*,*) (tablica(i), i=1,5) write(*,*) write(*,*) 'Kolejne wypisanie elementow tablicy przy pomocy do implikowane' write(*,*) (tablica(i), i=1,5) end 38. Ćwiczenia - napisz program (pr83.f90), który wczyta do tablicy 3 liczby całkowite i następnie wypiszę elementy tablicy; proszę wykonać wczytywanie i wypisywanie elementów tablicy przy pomocy konstrukcji „do implikowane” 30