| 
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. |