zajecia_2012_01_11

advertisement
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
Download