Az első tömbös program

Hasonló dokumentumok
Az első program. 1. Első lépés A feladat Specifikáció Algoritmus Kód Második lépés...

Az első fájlos program

Programozási alapismeretek 3. előadás

Maximum kiválasztás tömbben

Algoritmizálás és adatmodellezés tanítása 1. előadás

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Dokumentáció az 1. feladatsorhoz (egyszerű, rövidített kivitelben)

NAGYPONTOSSÁGÚ EGÉSZ-ARITMETIKA TARTALOM

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozási alapismeretek 1. előadás

Informatika terméktervezőknek

A C# programozási nyelv alapjai

8. gyakorlat Pointerek, dinamikus memóriakezelés

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

A feladat címe, rövid emlékeztetje

AZ ADATSZERKEZETES BEADANDÓ FELADAT ÉRTÉKELÉSI SZEMPONTJAI

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Szerző Lővei Péter LOPSAAI.ELTE IP-08PAEG/25 Daiki Tennó

Feltételezés: A file strukturálisan helyes, tanszékenként nem üres, de az adott listázási feladatban kikötött számút nem haladja meg.

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Java II. I A Java programozási nyelv alapelemei

ALGORITMIKUS SZERKEZETEK ELÁGAZÁSOK, CIKLUSOK, FÜGGVÉNYEK

Programozási tételek általánosítása 2. Szlávi Péter 2015

Programozási nyelvek (ADA)

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

Bevezetés a programozásba I.

Programozási alapismeretek 2009/2010

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

Java II. I A Java programozási nyelv alapelemei

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Programozás I. gyakorlat

INFORMATIKAI ALAPISMERETEK

Programozás alapjai 9.Gy: Struktúra 2.

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Programozási nyelvek (ADA)

Közismereti informatika 2.zh T-M szakirány

Az Összegfokozatos listázás téma 2. gyakorlata

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

INFORMATIKAI ALAPISMERETEK

DOKUMENTÁCIÓ KÉSZÍTETTE: Naszári László I. évf. levelező Informatika tanári szak 2003.

Operációs rendszerek. 9. gyakorlat. BASH recap, reguláris kifejezések UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Programozás alapjai. 5. előadás

SZÁMÍTÓGÉPI GRAFIKA VÁGÁS

Feladat. Bemenő adatok. Bemenő adatfájlok elvárt formája. Berezvai Dániel 1. beadandó/4. feladat április 13. Például (bemenet/pelda.

Algoritmizálás + kódolás C++ nyelven és Pascalban

1. Jelölje meg az összes igaz állítást a következők közül!

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Delphi programozás III.

INFORMATIKAI ALAPISMERETEK

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Törley Gábor PROGRAMOZÁSI NYELVEK, KÖRNYEZETEK KIFEJEZŐEREJÉNEK VIZSGÁLATA

Webprogramozás szakkör

S z á m í t ó g é p e s a l a p i s m e r e t e k

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Adatbázis rendszerek Gy: Algoritmusok C-ben

INFORMATIKAI ALAPISMERETEK

Delphi programozás I.

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II.

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

A Pascal programozási nyelvben minden programnak a következő szerkezete van:

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések. 1. Mi a programozás?

BASH script programozás II. Vezérlési szerkezetek

A PROGRAMOZÁS ALAPJAI 3. Készítette: Vénné Meskó Katalin

ABB Teach Pendant programozás segédlet

7. gyakorlat Sorozatok, Fájlkezelés

Ábrák készítése. a dokumentációhoz. Szlávi Péter

Algoritmizálás, adatmodellezés tanítása 1. előadás

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

Demográfiai modellek

Rendezések. A föltöltés nemcsak az r-re vonatkozik, hanem az s-re is. Ez használható föl a további rendezések

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Algoritmizálás, adatmodellezés tanítása 6. előadás

Szövegek C++ -ban, a string osztály

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

AZ ADATSZERKEZETES BEADANDÓ FELADAT ÉRTÉKELÉSI SZEMPONTJAI

I. ALAPALGORITMUSOK. I. Pszeudokódban beolvas n prim igaz minden i 2,gyök(n) végezd el ha n % i = 0 akkor prim hamis

Programozás alapjai 8.Gy: Program struktúra

ELEMI PROGRAMOZÁSI TÉTELEK

Occam 1. Készítette: Szabó Éva

10. gyakorlat Tömb, mint függvény argumentum

PROGRAMOZÁS tantárgy. Gregorics Tibor egyetemi docens ELTE Informatikai Kar

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

PASzSz. Dr. Kotsis Domokos

Programozás II. 2. Dr. Iványi Péter

A JavaScript főbb tulajdonságai

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

A C programozási nyelv III. Pointerek és tömbök.

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Átírás:

Az első tömbös program Tartalom 1. Első lépés... 2 1.1. A feladat... 2 1.2. Specifikáció... 2 1.3. Algoritmus... 2 1.4. Kód... 3 2. Második lépés... 5 2.1. A feladat... 5 2.2. Specifikáció... 5 2.3. Algoritmus... 5 2.4. Kód... 6 3. Harmadik lépés... 7 3.1. A feladat... 7 3.2. Specifikáció... 7 3.3. Algoritmus... 7 3.4. Kód... 7 4. Negyedik lépés... 8 4.1. A feladat... 8 4.2. Specifikáció... 8 4.3. Algoritmus... 9 4.4. Kód... 9 1

Több lépésben oldunk meg néhány, egymásra épülő feladatot, hogy könnyen legyen felfedezhető minden algoritmikus és Pascal nyelvi elem tudnivalói. Folytatjuk Az első program gyakorlat 1 feladatát. Hasznos lesz egy másik környezettel is megismerkednünk. Egy olyannal, amely túllép a konzolos világon, s így szervesebben illeszkedik a fejlettebb operációs rendszerekhez. Ilyen keretrendszer a Geany 2. Sajnos ma még (2010 szeptemberében) a sok előny mellett egy szépséghibájával számolnunk kell: nem építhető bele nyomkövető rendszer. Tehát ez az IDE közreműködni képes (igényesen) a programszerkesztésben, a fordításban és a futtatásban, de a nyomkövetésre egyelőre egyéni technikákat kell bevetni (pl. a feltételes fordítást). 1. Első lépés 1.1. A feladat Hány (befejezett) óra, perc és másodperc telt el éjféltől? Képernyőtörléssel, billentyűre várakozással. Címkiírás felül, középre. Adjuk meg a napi dátumot, és mondjuk meg, milyen nap van; igényesen, azaz mi a nap neve! Készítsünk programozás szempontjából hatékonyabb megoldást, mint Az első program gyakorlaton! (L. ElsoProgramB.pdf 4.2. fejezetében!) Építsük a sorozat fogalmára, illetve annak egy speciális fajtájára, a tömbre. Olyan adatszerkezetre, amely több, azonos típusú elemet foglal egy szerkezetbe, és az elemei kiválasztását az indexeire hivatkozva lehet megoldani. Az indexek (leggyakrabban) természetes számok. 1.2. Specifikáció A hatékonyító ötlet most már a specifikáción is látszani fog. Az ötlet: egy konstans sorozat, amely az algoritmizálás és majdan a kódolás során tömbként konkretizálódik. Ebben soroljuk föl a napneveket. Tehát, bár a specifikáció bemeneti részében foglal helyett, beolvasni nem kell! Viszont az kétségtelen, az algoritmus szempontjából bemeneti adatként funkcionál. Be: Ó,P,M N [a pillanatnyi idő óra:perc:másodperc alakban, amelyet az operációs rendszer szolgáltat] É,H,N,HN N [a mai dátum év.hó.nap.hét napja alakban, amelyet az operációs rendszer szolgáltat] Konstans napnév S 7 =( Vasárnap, Hétfő, Kedd, Szerda, Csütörtök, Péntek, Szombat ) Ki: ÉÓ,ÉP,ÉM N [az éjféltől eltelt órák, percek és másodpercek száma] É,H,N N [a dátum] NAP [a hét napjának neve] Ef: Uf: ÉO=Ó ÉP=60*Ó+P ÉM=60*(60*Ó+P)+M É =É H =H N =N NAP=napNév HN 1.3. Algoritmus A specifikációból az algoritmusra térve döntünk a konstans sorozat ábrázolásáról: legyen ez tömb! Ez azt jelenti, hogy két típust kell rögzítenünk: az egyik az indexek intervallumát, a másik az elemek minéműségét határozza meg. Indexeljük a tömböt úgy, hogy a lehető legjobban illeszkedjék a majdani, a napsorszámot szolgáltató eljáráshoz, azaz 0..6. Az indexelés műveletének szintaxisa: tömbazonosító(index-kifejezés), tehát a specifikációbeli alulindexe- 1 2 http://people.inf.elte.hu/szlavi/lc/elsoprogramb/elsoprogramb.pdf Ingyenesen letölthető: http://www.geany.org/. 2

léstől eltértünk. Ha a korábbi változatban a kimenő változókra (ÉO, ÉP, ÉM) vonatkozó értékadás helyett rögvest kiírtuk a képernyőre, akkor azt most a NAP-ra vonatkozólag is megtehetjük: Program TömbösProgram_A: Változó Ó,P,M:Egész ÉÓ,ÉP,ÉM:Egész É,H,N,HN:Egész Nap:Szöveg Konstans cim:szöveg='a ma eltelt idő' napnév:tömb(0..6:szöveg)= ( vasárnap,, szombat ) Idő(Ó,P,M) ÉÓ:=Ó; ÉP:=60*ÉÓ+P; ÉM:=60*ÉP+M Ki:ÉÓ,ÉP,ÉM Dátum(É,H,N,HN) Nap:=napNév(HN) Ki:É,H,N,Nap Program vége. A nap neveket felsoroló napnév konstans tömb deklarálása, értékkel ellátása. A napnév most egy egyszerű tömbelem-hivatkozással elérhető. 1.4. Kód Összesen annyi a kódolási megjegyezni való, hogy a Pascalban az indexkifejezést [, ] jelek közé kell írni, s nem (, ) közé. Program TombosProgram_A; Uses Dos,Crt; Var O,P,M,m100:Word; EO,EP:Word; EM:LongInt; E,H,N,HN:Word; Nap:String; Const cim:string='a ma eltelt idő'; napnev:array [0..6] of String= ('vasárnap','hétfő','kedd','szerda', 'csütörtök','péntek','szombat'); ClrScr; Writeln(cim:40+(Length(cim) Div 2)); GetTime(O,P,M,m100); EO:=O; EP:=60*EO+P; EM:=60*EP+M; Writeln('Óra:',EO,' perc:',ep, ' másodperc:',em); GetDate(E,H,N,HN); Nap:=napNev[HN]; Write('A mai nap:',e,'.',h,'.',n, ' ',Nap); ReadKey; End. A napok neveit tartalmazó napnev konstans tömb deklarálása, értékkel ellátása. A HN függvényében a megfelelő nap átmásolása a tömbből, a Napba. Pillantsunk rá, miként fest ez a Geany környezetben! [1. ábra] Merészen azt állítom, hogy a mi céljainknak megfelelő használathoz a látvány elegendő, további magyarázatokat nem igényel. 3

M E Mt Á I 1. ábra: A Geany GUI 3 -IDE 4 (Integrált Fejlesztői Környezet). M: menüsor; E: eszközpaletta; Mt: munkaterület; Á: állapot és segéd ablak; I: a információs ablak (pl. szerkesztési, nyelvi). A látványhoz egy megjegyzést kell fűznöm: ha a Geany környezetben egy FP-ben megírt programot fejlesztünk tovább, akkor mint a képen látható tapasztalhatjuk a konzolos és a Windows-ablakos alkalmazások eltérő karakterkódolását. Lásd pl. a megjegyzések ékezetes betűit! Elkerülhetjük ezt, ha a beolvasáskor a tovább dolgozandó fájl Geany ikonra ráhúzás kényelmes megoldása helyett a karakterkódolás beállításával bonyolított megnyitást választjuk. [2. ábra] 3 4 http://hu.wikipedia.org/wiki/grafikus_felhaszn%c3%a1l%c3%b3i_fel%c3%bclet http://en.wikipedia.org/wiki/integrated_development_environment 4

2. ábra: A megnyitás finom hangolása a Geanyben: a bal oldali ábra mutatja a megnyitásablak alapállapotát. Ezen nyissuk ki a További beállításokat. A jobb oldali ábrán a Kódolás megadása felnyíló menüből a Közép-európai (IBM852) -t választottuk ki. Ezután már helyes kódolással olvassa be az FP-ben begépelt Pascal fájlt. 2. Második lépés 2.1. A feladat Ugyanaz, mint előbb. Készítsünk programozás szempontjából átláthatóbb, perspektivikusabb megoldást: (paraméterezett) alprogramokkal (eljárásokkal, függvényekkel) fogalmazzuk újra. 2.2. Specifikáció Nincs feladatmódosítás, ugyanaz a specifikáció. 2.3. Algoritmus Két olyan tevékenység van az imént írt programban, amelyet sok leendő programba is elhelyezhetünk majd: a tiszta lappal kezdés (képernyőtörlés + címkiírás), billentyűre várás. Az első egy olyan alprogram, amely megkívánja azt, hogy éppen mit írjon ki a képernyő tetejére, azaz paramétert kíván. A másodikhoz nem kívánkozik paraméter. Ezeket korábban algoritmizálás szempontjából érdektelennek minősítettük, most hadd foglalkozzunk velük mégis. Ezeket képzeletben kiemeljük régi helyükről, s mint a törzsüket beágyazzuk egy-egy környezetüktől viszonylagos függetlenséget biztosító eljárásba: ÚjLap-ba, BillreVár-ba. A program elkészítésnél kövessük a felülről-lefelé programtervezés elvét, azaz legelőször a megoldás legfelsőbb szintjét formalizáljuk, amelyben máris felhasználunk számos (most kettő) olyan alprogramot, amelyek funkciójával és felhasználás szintaktikájával tisztában vagyunk, de a pontos belsejüket még nem ismerjük. Majd az algoritmizálást ezekkel folytatjuk ugyanezzel a gondolatmenettel. Program TömbösProgram_B: Változó Ó,P,M:Egész ÉM,ÉP,ÉM:Egész É,H,N,HN:Egész Nap:Szöveg Konstans cim:szöveg='a ma eltelt idő' napnév:tömb(0..6:szöveg)= ( vasárnap,, szombat ) 5

ÚjLap(cím) Idő(Ó,P,M) ÉÓ:=Ó; ÉP:=60*ÉÓ+P; ÉM:=60*ÉP+M Ki:ÉÓ,ÉP,ÉM Dátum(É,H,N,HN) Nap:=napNev(HN) Ki:É,H,N,Nap BillreVár Program vége. Tabula rasa a képernyőre vonatkozólag. Billentyűre várakozás. Az alábbi algoritmusok valójában olyan mélységbe ereszkednek le, amely szokatlan az algoritmusok világában. Hogy lássuk, miként lehet eljárásokat deklarálni az algoritmikus nyelvünkben, és mit is jelent a felülről-lefelé elv alkalmazása, ezért kivételesen foglalkozunk az egyébként csak a kódolás során megoldandó kérdésekkel. Eljárás ÚjLap(Konstans c:szöveg): KépTörlés Ki:c [középre igazítva] Eljárás vége. Eljárás BillreVár: Be: [nincs echozás, nincs változó] Eljárás vége. Az eljárás fejsora: az eljárás neve, és paraméterei. A c szöveg paraméter az eljárásban nem változik meg, ezért konstans. Az eljárás törzse. Az eljárás idáig tart. Az eljárás fejsora: az eljárás neve, paramétere nincs. Az eljárás törzse: billentyű lenyomásra vár (hogy melyiket nyomják le, az nem érdekes, ezért nincs változó). Az eljárás idáig tart. 2.4. Kód A Pascal kódolásnál legfontosabb újság, hogy az alprogramok helye nem a fő program mögött van, hanem a globális adatok deklarációi után. Program TombosProgram_B; Uses Dos,Crt; Var O,P,M,m100:Word; EO,EP:Word; EM:LongInt; E,H,N,HN:Word; Nap:String; Const cim:string='a ma eltelt idő'; napnev:array [0..6] of String= ('vasárnap','hétfő','kedd','szerda', 'csütörtök','péntek','szombat'); Procedure Ujlap(Const c:string); ClrScr; Writeln(c:40+(Length(c) Div 2)); End; Procedure BillreVar; ReadKey; End; Az UjLap eljárás deklarálása. A BillreVar eljárás deklarálása. 6

ÚjLap(cim); GetTime(O,P,M,m100); P:=60*O+P; M:=60*P+M; Writeln('Óra:',O,' perc:',p, 'másodperc:',m); GetDate(E,H,N,HN); Nap:=napNev[HN]; Writeln('A mai nap:',e,'.',h,'.',n, ' ',Nap); BillreVar; End. Az UjLap eljárás hívása. A BillreVar eljárás hívása. 3. Harmadik lépés 3.1. A feladat Ugyanaz, mint előbb. Készítsünk újrafelhasználható megoldást, így megint a perspektivikusságot növeljük: az előbb deklarált eljárásokat különítsük el egy fájlba, amit a későbbi programjaikba pusztán a fájlra történő hivatkozással tehát újragépelés nélkül! ültethetünk be. 3.2. Specifikáció Nincs feladatmódosítás, ugyanaz a specifikáció. 3.3. Algoritmus Nincs feladatmódosítás, ugyanaz az algoritmus. 3.4. Kód A következő lépéseket kell végrehajtanunk: 1. A két eljárást (általában az elkülönítendő, összefüggő programdarabot) átemeljük az FP/ Geany erre a célra frissen megnyitott 5 paneljába/ablakába. 2. Kommentekkel kiegészítjük a programdarab elejét: mik találhatók itt, milyen szintaxist követnek, esetleg elő- és utófeltételeket. 3. Kimentjük jellegzetes névvel és célszerűen a Pascal szempontjából torzóságra utaló kiterjesztéssel. Pl. AltRutinok.inc. 4. A kiemelt programdarab helyére egy hivatkozást illesztünk, amely az imént mentett fájlra utal. Ez utasítja majd a fordítóprogramot arra, hogy ide képzelve azt a programdarabot, amelyet a megadott fájlban talál, fordítsa le az egészet. Tehát ez esetben ténylegesen nem cél az (sőt!), hogy az elkülönített fájlban teljes Pascal program legyen, csak az, hogy a megfelelő helyre beillesztve szintaktikusan helyes legyen. Az include-álandó fájl (AltRutinok.inc) tartalma: (* Általános rutinok: * UjLap(Const c:string) * BillreVar Import: * ClrScr -- Crt unit * ReadKey -- Crt unit *) Az exportált fogalmak rövid leírása. Az importált fogalmak felsorolása. 5 File menücsoport New pontja: [Alt+F]/[N]. 7

Procedure Ujlap(Const c:string); ClrScr; Writeln(c:40+(Length(c) Div 2)); End; Procedure BillreVar; ReadKey; End; Az exportált fogalma önmagukban szintaktikusan helyes megadása. Arra persze ügyelni kell, hogy ez a különálló fájl a fő fájllal azonos könyvtárban legyen, vagy ha célszerűség miatt az ilyen programdarabkákat külön könyvtárban gyűjtjük (pl. a F:\Pascal\SajatRutinok\-ban), akkor a rá hivatkozáskor a fájl neve előtt az elérési útja is szerepeljen (pl. F:\Pascal\SajatRutinok\AltRutinok.inc). és végül a befogadó program: Program TombosProgram_C; Uses Dos,Crt; Var O,P,M,m100:Word; EO,EP:Word; EM:LongInt; E,H,N,HN:Word; Nap:String; Const cim:string='a ma eltelt idő'; napnev:array [0..6] of String= ('vasárnap','hétfő','kedd','szerda', 'csütörtök','péntek','szombat'); {$i AltRutinok.inc} ÚjLap(cim); GetTime(O,P,M,m100); EO:=O; EP:=60*EO+P; EM:=60*EP+M; Writeln('Óra:',EO,' perc:',ep, ' másodperc:',em); GetDate(E,H,N,HN); Nap:=napNev[HN]; Writeln('A mai nap:',e,'.',h,'.',n, ' ',Nap); BillreVar; End. Az AltRutinok.inc fájljára hivatkozás, amely most ezzel a programmal azonos könyvtárban található. 4. Negyedik lépés 4.1. A feladat Az alapfeladatot egészítsük egy újjal: a mai nap hányadik napja az évnek? 4.2. Specifikáció A feladat megoldásához a programnak eleve tudnia kell a hónapok hosszát. Ezt egy konstans tömbben fogjuk megadni. Újdonság egy összetettebb számítás (szummázás), és egy meggondolást igénylő függvény (SzökőÉv?) bevezetése. 8

TombosProgramB Be: Ó,P,M ℕ [a pillanatnyi idő óra:perc:másodperc alakban, amelyet az operációs rendszer szolgáltat] É,H,N,HN ℕ [a mai dátum év.hó.nap.hét napja alakban, amelyet az operációs rendszer szolgáltat] Konstans napnév 6=( Vasárnap, Hétfő, Kedd, Szerda, Csütörtök, Péntek, Szombat ) Konstans hóhossz ℕ12=(31,28,31,30,31,30,31,31,30,31,30,31) Ki: ÉÓ,ÉP,ÉM ℕ [az éjféltől eltelt órák, percek és másodpercek száma] É,H,N ℕ [a dátum] NAP [a hét napjának neve] NDb ℕ [ennyiedik napja az évnek] Ef: Uf: ÉO=Ó ÉP=60*Ó+P ÉM=60*(60*Ó+P)+M H 2 H>2 H>2 É =É NDb= (i(1..h-1) hóhosszi +N SzökőÉv?(É) NDb= (i(1..h-1) hóhosszi +N+1 SzökőÉv?(É) NDb= (i(1..h-1) hóhosszi +N H =H N =N NAP=napNévHN Def: SzökőÉv?:ℕ SzökőÉv?(E):=(E Mod 400)=0 (E Mod 4)=0 (E Mod 100) 0 4.3. Algoritmus Algoritmikus nehézsége a szummás kifejezés kiszámításának van. Ehhez szükséges egy ún. számlálós ciklus -ra, amely igényel egy ciklusváltozót. Program TömbösProgram_D: Változó Ó,P,M:Egész ÉM,ÉP,ÉM:Egész É,H,N,HN:Egész Nap:Szöveg NDb,i:Egész Konstans cim:szöveg='a ma eltelt idő' napnév:tömb(0..6:szöveg)= ('vasárnap',,'szombat') hóhossz:tömb(1..12:egész)=(31,28, 31,30,31,30,31,31,30,31,30,31) ÚjLap(cím) Idő(Ó,P,M) ÉÓ:=Ó; ÉP:=60*ÉÓ+P; ÉM:=60*ÉP+M Ki:ÉÓ,ÉP,ÉM Dátum(É,H,N,HN) Nap:=napNev(HN) Ki:É,H,N,Nap NDb:=0 Ciklus i=1-től H-1-ig NDb:=NDb+hóHossz(i) Ciklus vége NDb:=NDb+N [Szökő-év figyelembe vétele:] Ha H>2 akkor Ha ((E Mod 400)=0) vagy ((E Mod 4)=0) és ((E Mod 100) 0) akkor NDb:=NDb+1 Elágazás vége Ki:NDb BillreVár Program vége. NDb:napok száma, i:ciklus változó A hónapok napjainak számát felsoroljuk egy konstans tömbben. A napszámlálás. A SzökőÉv? függvény törzsének közvetlen beillesztésével.... a finomítások... 4.4. Kód Kódolási újság a számlálós ciklus Pascal megfelelője: a For-ciklus. 9

Program TombosProgram_D; Uses Dos,Crt; Var O,P,M,m100:Word; EO,EP:Word; EM:LongInt; E,H,N,HN:Word; nap:string; NDb,i:Word; Const cim:string='a ma eltelt idő'; napnev:array [0..6] of String= ('vasárnap','hétfő','kedd','szerda', 'csütörtök','péntek','szombat'); hohossz:array [1..12] of Word=(31,28, 31,30,31,30,31,31,30,31,30,31); {$i AltRutinok.inc} ÚjLap(cim); GetTime(O,P,M,m100); EO:=O; EP:=60*EO+P; EM:=60*EP+M; Writeln('Óra:',EO,' perc:',ep, ' másodperc:',em); GetDate(E,H,N,HN); Nap:=napNev[HN]; Writeln('A mai nap:',e,'.',h,'.',n, ' ',Nap); NDb:=0; For i:=1 to H-1 do NDb:=NDb+hoHossz[i]; NDb:=NDb+N; {Szökő-év figyelembe vétele:} If H>2 then If ((E Mod 400)=0) or ((E Mod 4)=0) and ((E Mod 100)<>0) then NDb:=NDb+1; End; Writeln(NDb,'. napja az évnek'); BillreVar; End. NDb:napok száma, i:ciklus változó A hónapok napjainak számát felsoroljuk egy konstans tömbben. A napszámlálás. Házi feladatként alkosson logikus eljárásokat a fenti feladat algoritmusa/kódja alapján! Azaz bontsa föl a programot értelmesen definiálható részfeladatokat megoldó (paraméteres) eljárásokra, függvényekre, majd ezek felhasználásával fogalmazza újra a főprogramot! Végül deklarálja ezeket az önálló eljárásokat, függvényeket. A módosított algoritmust azután kódolja is! 10