16. Formázási lehetõségek a beolvasásnál és kiiratásnál (A Format parancs)

Eddig mi többnyire az ún.kötetlen formázást alkalmaztuk. Ez alapértelmezett szabályokat alkalmazott, mind a bemenet, mind a kimenet különféle típusaira. Azonban gyakran kivánunk egyéni, különleges I/O formátumot alkalmazni, például hány tizedesjegyet tekintsünk egy valós számnál. Erre van a format utasítás, melyet mind a bemenetre, mind a kimenetre is alkalmazhatunk

A format utasítás szintaktikája

      write(*, label) változók listái
 cimke format formázási kód
A format alkalmazását szemlélteti az alábbi kis példa. Tegyük fel, hogy van egy egész változónk, amit 4 karakteres alakban illetve egy valós számunk, amit fixpontos kiírással és 3 tizedesjeggyel kívánunk kinyomtatni.
      write(*, 900) i, x
  900 format (I4,F8.3)
A formázási cimke (900) megválasztása tetszõleges. Az elterjedt gyakorlat az, hogy a formázási cimke számot mindig megasabbnak választják, mint a többi utasításokét. A format utasítás mögötti zárójelben lévõ kódok utalnak a formázás alakjára. Ebben az esetben az I4 jelenti a 4 karakter hosszúságú egész számot, míg az F8.3 jelöli a fixpontos 8 karakter hosszúságú valós számot, melybõl 3 karakter a tizedesjegyeké.

A format utasítás a program bármelyik részében elõfordulhat. Két programozási stílus is van: az egyik a format utasítást azonnal a read/write parancsok mögé írja, a másik a format parancsot egy helyre összegyüjtve, a (szub)program végén jeleníti meg.

Alapvetõ formázási kódok

A leggyakoribb format kódok az alábbiak:
   A - szöveg
   D - pontosabb valós szám, exponenciális alak (normált alak)
   E - valós szám, exponenciálos alak (normált alak)
   F - valós szám, fixpontos formátum
   I - egész
   X - horizontális ugrás (space=szóköz)
   / - vertikális ugrás (új sor)
Az F (és a D és E) kódok általános alakja Fw.d ahol w a szám hosszúságát (karaktereinek számát), d pedig egy egész szám, mely a tizedeshelyek számát adja meg.

Egész számoknál csak a szám hosszúságát kell megadni, tehát a szintakszis Iw. Ehhez hasonló a szöveges formátumnál is megadható a hosszúság (Aw), de ezt ritkán tüntetik fel.

Ha egy szám vagy szöveg nem tölti ki a teljes (elõre megadott) mezõt, akkor üres helyekkel egészíti ki a program. Általában hiányos a szöveget jobbról egészíti ki, de vannak olyan fordítók is, amik máshogy járnak el.

Szóközökre az nX kódot hasznáják. Ez n szóközt jelent. Ha n -et elhagyjuk, akkor azt n=1 -nek értelmezi (azaz egy szóköz).. Vertikális ugrásokra (új sor kezdésre) a / (törtvonal) jelölést alkalmazzuk. Minden ilyen törtvonal egy-egy új sort jelent. Fontos megjegyeznünk, hogy alapértelmezettként minden read vagy write utasítás egy ilyen új sorkezdéssel zárul. (Ebben a Fortran és a C között eltérés van.)

Néhány példa

Tekintsük az alábbi Fortran program részletet:
      x = 0.025
      write(*,100) 'x=', x
  100 format (A,F)
      write(*,110) 'x=', x
  110 format (A,F5.3)
      write(*,120) 'x=', x
  120 format (A,E)
      write(*,130) 'x=', x
  130 format (A,E8.1)
amit, ha lefutattjuk, akkor a kimenet az alábbi lesz:
x=      0.0250000
x=0.025
x=  0.2500000E-01
x= 0.3E-01
Érdemes megnézni, hogy a Fortran hogyan helyezi el az egyes eredményeket, illetve azt, hogy alapértelmezettként 14 karakter széles helyet hagy egy való számnak. A Fortran kerekítési szabályai: 0-4 és közötti számot lefelé, az 5-9 közötti értéket fölfelé kerekíti.

Ebben a példában minden egyes write utasításhoz, különféle formázási utasítást használtunk. Természetesen lehet, egyfajta formátumot több I/O utasításhoz is rendelni. Pont ebben rejlik a format parancs elõnye. Például egy táblázat elemeinek nyomtatásánál a sorokat egyfajta formátumban kivánjuk megjeleníteni, ilyenkor is praktikus a format utasítás.

A format parancs összevonása a read/write utasítással

Ahelyett, hogy egy különálló format utasítással adjuk meg az alakot, beépíthetjük közvetlenül az I/O parancsba is, az alábbi módon:
      write (*,'(A, F8.3)') 'A valasz x = ', x
ami ugyazt jelenti, mint a következõ: :
 
      write (*,990) 'A valasz x = ', x
  990 format (A, F8.3)
Néha a szöveges formátumot is megadjuk a format utasítással, ekkor ez a megoldás is ugyanazt adja, mint a fenti kettõ:
      write (*,999) x
  999 format ('A valasz x = ', F8.3)

Ciklusok és ismétlõdõ számítások

Most tekintsünk egy kicsit bonyolultabb esetet it. Tegyük fel, hogy van egy kétdimenziós, egész elemekbõl álló tömbünk, melynek csak balfelsõ 5*10-es részmátrixot kívánjuk kinyomtatni, 5 sorban tizesével.
      do 10 i = 1, 5
         write(*,1000) (a(i,j), j=1,10)
   10 continue
 1000 format (I6)
Két ciklusunk van, egy explicit, ami a sorokon szalad végig, és egy implicit, mely az oszlopokon (j index).

Gyakran egy format utasítás ismétlõdésekbõl állhat, például:

  950 format (2X, I3, 2X, I3, 2X, I3, 2X, I3)
De erre is van egy összevont írásmód:
  950 format (4(2X, I3)) 
Lehetséges az is, hogy megengedjük az ismétlést, anélkül, hogy feltüntetnénk hányszor is kéne ismételnünk. Tegyük föl, hogy van egy vektorunk, aminek az elsõ 50 elemét kívánjuk kinyomtatni, tizesével megjelenítve. Egy lehetséges megoldás:
      write(*,1010) (x(i), i=1,50)
 1010 format (10I6)
Ez a format parancs 10 szám kinyomtatását jelenti. De mi a write utasítással 50 szám kiírását akarjuk elérni, tehát miután kinyomtatta az elsõ 10 darab számot, "visszaugrik" és kinyomtatja a következõ tizet, majd még ezt háromszor megismétli.

Implicit do ciklusokat alkalmazhatunk sokdimenziós ( 3 fölött) esetekre is, de mi inkább kerüljük a használatát, mivel túlzottan elbonyolítja a programunkat és megnehezíti a megértését. A fent tekintett példa egy egyszerû esete volt ennek, a sokdimenziós problémák sokkal összetettebbek.

 

Copyright © 1995-7 by Stanford University. All rights reserved.

Fordították: Seres András Tamás és Szalai Szilvia (ELTE-TTK)


[Tovább] [Tartalomjegyzék]