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
(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 és értékhatárok között, miközben a lépésközök: 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,13⋮⋮a30,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 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: 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,13⋮⋮b30,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 polinomnak három tizedesjegy pontossággal kinyomtatja a helyettesítési értéktáblázatát a 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. |