Cím: Számítástechnikai rovat (3)
Füzet: 1976/december, 216 - 221. oldal  PDF  |  MathML 

A szöveg csak Firefox böngészőben jelenik meg helyesen. Használja a fenti PDF file-ra mutató link-et a letöltésre.

Az októberi számban a következő feladatot tűztük ki.
Feladat. Készítsünk programot, amely kinyomtat egy sakktáblát úgy, hogy azon a fekete négyzeteket X betűkkel töltjük ki. Egy négyzet egy sorban hat karakterpozícióból álljon, és egymás alatt négy ilyen sor legyen. A 6-szor 4 karakter alkot egy négyzetet. A sakktábla a papírlap közepére kerüljön.
A feladatnak egy lehetséges megoldása az alábbi. A sakktábla a kikötés értelmében soronként 48 karakterből áll és 32 ilyen sor kerül egymás alá. Tudjuk, hogy soronként 128 karakter nyomtatható és egy lapon 72 sor fér el. Hogy a lap közepére kerüljön a tábla, ezért a 21. sorban kezdjük el a nyomtatást és a sorban az első karakterek a 41. pozícióra kerülnek. Ezek alapján a program

 

MASTER SAKKWRITE (3,10)WRITE (3,11)  10FORMAT (1H1,20(/))  11FORMAT (4(4(40X,4(12HXXXXXX  )/),FORMAT  4(40X,4(12H  )/) XXXXXX)/)))STOPEND  
 

(A második FORMAT utasítás a programlapon egy sorba írandó, itt csak helyszűke miatt törtük meg két sorba.)
A feladat látszólag bonyolult nyomtatási képét egy igen egyszerű programmal valósítottuk meg. Ha valaki DO utasítást is használt, attól a program még lehet hibátlan, de a végrehajtás ideje így hosszabb.
A rövid programírásra az adott lehetőséget, hogy a nyomtatandó karaktereket eleve meg tudtuk adni, azok nem képezték számítás tárgyát. Ezzel lezártuk a részünkre szükséges specifikációk tárgyalását.
 

3.4. Belső ciklus a WRITE-ban
 

Tekintsük a következő feladatot:
 

Kiszámíttatjuk és kinyomtatjuk a 2x3+3y3-4x2y-5xy2+6x2-7y2+ +8xy-9x+10y+11 kétváltozós harmadfokú polinom helyettesítési értékeit két tizedesjegy pontossággal a
-3x+3
és
-6y+6
értékhatárok között, miközben a lépésközök:
Δx=0,2ésΔy=1.
A két változó értékének változtatása mellett a helyettesítési értékek egy számtáblázatban, ún. mátrixban helyezhetők el. A feladat szerint x összesen 31, y összesen 13 értéket kap. A táblázatban tehát 13-szor 31 adat lesz. Nyilván célszerű a táblázatot a papírra úgy nyomtatni, hogy az oszlopok száma legyen 13 és a soroké 31. Ha 13 szám van egy sorban, akkor egy adat legfeljebb 9 karakterpozíción helyezkedhet el. Az áttekinthetőség érdekében két szám között legalább egy karakterpozíciót kell üresen hagyni, emiatt egy adat legfeljebb 8 pozíción helyezkedhet el. Figyelembe véve az előjel, a tizedespont és a két tizedes jegy helyét, az egész rész legfeljebb négy értékes jegyet tartalmazhat. Kérdéses, hogy a számítandó értékek elférnek-e egy ilyen mezőben. Ezt természetesen előre nem tudhatjuk, és ilyen esetekre a programozónak megfelelő becsléseket kell tudnia tenni. Mi azonban a bonyolultság csökkentése érdekében most előre közöljük, hogy jelen esetben ez nem okoz gondot. A kívánt nyomtatási kép tehát kialakítható.
 

A programot két részből állítjuk össze. Az első részben betöltjük a Z(I, J) mátrixba (kétdimenziós tömbbe) az adatokat. A program másik részében kinyomtatjuk a mátrixot. A számítási és a nyomtatási részt általában célszerű különálló programrészekben megírni, mert ezzel a gép kihasználása gazdaságosabb, a program végrehajtásának ellenőrzése könnyebb.
 

A blokkdiagramot az 1. ábrán láthatjuk. Ezen, a DO ciklusokat nagy, köralakú blokkok jelképezik.
 

 

Tartalmukat az 1. ábrán részletesen szöveggel Írtuk ki, de a továbbiakban már csak a DO utasítás megfelelő részét írjuk majd bele, pl. J=1,13 stb. Az ábrán a Z(I, J) mátrix értékadásánál a feladatban adott polinomot röviden f(x,y)-nal jelöltük.
 

A blokkdiagram alapján a program pl. ilyen lehet:
 

MASTER PKETDIMENSION Z(31,13)X=-3.0DO 1 I=1,31Y=-6.0DO 2 J=1,13Z(I,J)=X*(X*(2*X-4*Y+6)-9)+Y*(Y*  (3*Y-5*X-7)+8*X+10)+11  2Y=Y+1  1X=X+0.2DO 3 I=1,31  3WRITE (3,9) Z (I,1), Z(I,2), Z(I,3), Z(I,4), Z(I,5) Z(I,6)WRITE(3,9)Z(I,7), Z(I,8), Z(I,9), Z(I,10), Z(I,11), Z(I,12), Z(I,13)  9FORMAT (9X, 13F9.2)STOPEND
 


A WRITE utasítás után álló hosszú lista kényelmetlen a sok írás miatt, és egy programsorban el sem fér (mi is két sorba törtük meg a helyszűke miatt). Ezért bemutatunk egy újabb lehetőséget, a WRITE utasításba épített ciklust. Ennek formája a következő:
 

  3WRITE (3,9)(Z(I,J), J=1,13)
 


Az így felírt utasítás hatására az egy sorba eső elemek kerülnek kinyomtatásra oly módon, hogy I értéke állandó marad, J értéke 1-től 13-ig növekszik. I értéke természetesen a DO ciklus minden egyes menetében emelkedik. Ennek bemutatására szolgálhat az 1. ábra. Megjegyezzük azonban, hogy az 1.a és 1.b ábrákon látható WRITE blokk nem használatos, csak itt rajzoltuk meg a könnyebb elképzelhetőség érdekében.
 

 

Gyakorlatban a nyomtatási blokkba csak a WRITE Z (I, j) beírása történik, és a programblokkban nem tüntetjük fel a nyomtatás technikai megszervezését.
Van azonban arra is mód, hogy az egész mátrix nyomtatását egy utasítással hajtsuk végre. Ha programunkat módosítjuk és az 1-es címkéjű utasítástól kezdve az alábbi módon írjuk:
 

  1X=X+0.2  3WRITE (3,9) ((Z(I,J), J=1,13), 1=1,31)  9FORMAT (31(9X,13F9.2/))STOPEND
 


akkor a WRITE-ba építhető ciklusokat ebben a feladatban teljes mértékben kihasználtuk. A FORMAT belső zárójelében foglaltak szerint történik egy‐egy sor nyomtatása, itt azonban már elő kell írni a sorváltást is. Ennek a szemléltetésére szolgálhat az 1.b ábrán bemutatott blokk.
 

Feladat:
 

Vizsgáljuk meg, hogy miként változik az előző példában adott polinom teljes értéktáblázata, ha valamennyi együtthatójának értékét egyidejűleg azok 150%-ára növeljük.
Kinyomtatandó az eredeti polinom értéktáblázata, a megnövelt együtthatójú polinom értéktáblázata, valamint a megnövelt együtthatójú polinom értéktáblázatának és az eredeti polinom értéktáblázatának különbsége.
 

Ehhez magyarázatul a következőt fűzzük:
 

Az eredeti feladat egy olyan eredménymátrixot szolgáltatott, melynek 31 sora és 13 oszlopa volt. Jelöljük most ezt a táblázatot így:
 
[a1,1a1,2...............a1,12a1,13a2,1a2,2...............a3,12a2,13a30,1a30,2...............a30,12a30,13a31,1a31,2...............a31,12a31,13]=[ai,j]31×13
 


Általános szokás, hogy az első index a sort, a második az oszlopot jelöli. A mátrixokat nagy szögletes zárójelbe szoktuk írni. A mátrix mellett jobb oldalt annak egy egyszerűsített jelölése látható, melyben i és j futóindexek, ahol
1i31és1j3.
A kitűzött feladatban (az együtthatók növelése miatt) új eredményeket is kapunk. Jelöljük most ezek mátrixát így:
[bi,j]31×13.
A feladat a "táblázatok különbségének'', azaz a különbségmátrixnak a kinyomtatását is előírja. Ezt a különbséget részletesen így írjuk fel:
[b1,1-a1,1...............b1,13-a1,13b2,1-a2,1...............b2,13a2,13b30,1-a30,1...............b30,13-a30,13b31,1-a31,1...............b31,13-a31,13]=[bi,j-ai,j]31×13

A programhoz tartozó blokkdiagramot itt nem közöljük. A programban deklarálnunk kell három darab kétdimenziós és két darab egydimenziós tömböt. A Z tömb az eredeti polinom, a V tömb a növelt együtthatójú polinom értéktáblázatát és a W tömb a különbségmátrixot fogja tartalmazni. Az A tömb az eredeti együtthatókat, a B pedig a 150%-ra megnövelt együtthatókat tartalmazza. A program elején kihasználjuk, hogy az együtthatók abszolút értékei egyesével növekednek, amit az A tömb betöltésénél láthatunk. A polinomot tartalmazó értékadó utasítást a helyszűke miatt két sorra bontottuk fel.
Érdekessége a programnak, hogy ugyanaz a FORMAT utasítás három WRITE utasításhoz tartozik. A programban meglehetős kényelmetlen, hogy lényegében ugyanezt a polinomot tartalmazó két értékadó utasítást úgy kellett felírni, hogy mindegyikben kiírtuk az egész polinomot. Következő számunkban látni fogjuk, hogy ilyen esetekben hogy tudjuk egyszerűbbé tenni a programírást.
Ezek után a program az alábbi:
 

MASTER PHARDIMENSION Z(31,13), V(31,13), W(31,13), A(10), B(10)R=2.0DO 4 K=1,10A(K)=RB(K)=1.5*A(K)  4R=R+1X=-3.0DO 1 I=1,31Y=-6.0DO 2 J=1,13Z(I,J)=X*(X*(A(1)*X-A(3)*Y+A(5))-A(8))Z(I,J)=Z(I,J)+Y*(Y*(A(2)*Y-A(4)*X-A(6))+A(7))  *X+A(9))Z(I,J)=+A(10)V(I,J)=X*(X*(B(1)*X-B(3)*Y+B(5))-B(8))V(I,J)=V(I,J)+Y*(Y*(B(2)*Y-B(4)*X-B(6))+B(7))*X+B(9))V(I,J)=+B(10)W(I,J)=V(I,J)-Z(I,J)  2Y=Y+1  1X=X+0.2WRITE (3,3)  3FORMAT(1H1//10X,25HEREDETI EERTEKTAABLAAZAT)WRITE(3,9)((Z(I,J), J=1,13), I=1,13)WRITE(3,5)  5FORMAT(1H1//10X,32H150%-OSAN NOEVELT EGYUET-HATOOVAL)WRITE(3,9)((V(I,J), J=1,13), I=1,31)WRITE(3,6)  6FORMAT(1H1//10X,19HKUELOEBSEG MATRIX)WRITE(3,9)((W(I,J), J=1,13), I=1,31)  9FORMAT(//31 (9X,13F9.2/))STOPEND
 

Feladat
 

1. A Számítástechnikai Rovat 1. sz. feladatát, melyben egy sorban kellett kinyomtatni a természetes számokat, ismételjük meg a következő kikötésekkel:
 

a) a számok 91-től növekedjenek egyesével,
 

b) a program WRITE utasításba épített ciklussal készüljön.
 

2. a) Készítsünk programot, amely a
2x3-4y3+6x2-8xy+10y-12
polinomnak három tizedesjegy pontossággal kinyomtatja a helyettesítési értéktáblázatát a
-1x+1és-12y+12
határok között, Δx=0,2 és Δy=0,5 lépésközök mellett.
b) Bővítsük e feladatot úgy, hogy a fenti mátrixon kívül nyomtassa még annak a polinomnak a helyettesítési értéktáblázatát, melyet az adott polinomból úgy nyerünk, hogy valamennyi együttható értékét egyidejűleg 1-gyel csökkentjük.
Ezután nyomtassa még ki a program azt a mátrixot, mely százalékban kifejezve megmutatja, hogy a csökkentett együtthatóval képzett helyettesítési értékek az eredeti polinom helyettesítési értékeinek hány százalékai. Vegyük figyelembe, hogy az eredeti polinom helyettesítési értékei között 0 is lehet.
Ehhez az anyagrészhez tartozó utalás LV: 225. oldalon és 265. oldalon található.
 

A feladatokat a következő címre küldjék a megoldók:
 

MÜM Számítástechnika Intézet
 Gergely János
 1089 BudapestMMMM
 Reguly Antal u. 57‐59.