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

Hasonló dokumentumok
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.

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

A C programozási nyelv VI. Parancssori argumentumok File kezelés

A feladat. A főprogram

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

ELTE SAP Excellence Center Oktatóanyag 1

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata

Az első fájlos program

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés

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

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

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

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

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

Táblázatok fontosabb műveletei 1

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Demográfiai modellek (folytatás)

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

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

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

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

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

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

PASzSz. Dr. Kotsis Domokos

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

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

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

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

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

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

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

INFORMATIKAI ALAPISMERETEK

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

NAGYPONTOSSÁGÚ EGÉSZ-ARITMETIKA TARTALOM

Operációs rendszerek gyak.

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

6. A Pascal nyelv utasításai

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

Programozási alapismeretek 2009/2010

Delphi programozás I.

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

1. Alapok. Programozás II

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Algoritmizálás és adatmodellezés 2. előadás

1. numere.txt n (1 n 10000) n növekvő kilenc a) Pascal/C++ Például: NUMERE.TXT

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Maximum kiválasztás tömbben

Programozás alapjai 6. előadás. Wagner György Általános Informatikai Tanszék

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

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

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Algoritmusok helyességének bizonyítása. A Floyd-módszer

INFORMATIKA javítókulcs 2016

Elemi alkalmazások fejlesztése I. Olvassunk be egy fájlból egész számokat egy tömbbe. Keressük meg a tömb valamely

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

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

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

INFORMATIKAI ALAPISMERETEK

3. Gyakorlat Ismerkedés a Java nyelvvel

Programozás 6. Dr. Iványi Péter

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

7. gyakorlat. Fájlkezelés IO haladó Függvények haladó

BASH SCRIPT SHELL JEGYZETEK

2018, Funkcionális programozás

Neumann János Tehetséggondozó Program Gráfalgoritmusok II.

14. Mediánok és rendezett minták

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

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Adatszerkezetek I. 1. előadás

INFORMATIKAI ALAPISMERETEK

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

Bánsághi Anna 2014 Bánsághi Anna 1 of 35

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

HÁZI FELADAT PROGRAMOZÁS I. évf. Fizikus BSc. 2009/2010. I. félév

Megoldott feladatok. Informatika

A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat:)!

Bevezetés a programozásba I.

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

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós szeptember 27. Széchenyi István Egyetem, Gy r

hiányzott szeptemberben vagy A tanuló nem hiányzott szeptemberben szöveget

Funkcionális Nyelvek 2 (MSc)

Programozás BMEKOKAA146. Dr. Bécsi Tamás 3. előadás

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

Programozási nyelvek Java

10. gyakorlat Struktúrák, uniók, típusdefiníciók

INFORMATIKAI ALAPISMERETEK

Programozás C nyelven (10a. ELŐADÁS) Sapientia EMTE

OOP I. Egyszerő algoritmusok és leírásuk. Készítette: Dr. Kotsis Domokos

1. feladat Készítse el szövegszerkesztővel, majd mentse osztály.txt néven a következő tartalmú szöveges fájlt:

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

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Haladó DBMS ismeretek 1

Informatika terméktervezőknek

INFORMATIKAI ALAPISMERETEK

Mentsd el code file-t kektura.cs néven, illetve kiterjesztéssel! Másold be a kektura.csv állományt a Projects munkamappa megfelelő almappájába!

Mintavételes szabályozás mikrovezérlő segítségével

Átírás:

Feladat: Az Összegfokozatos listázás téma 2. gyakorlata Az alábbi szerkezetű file beolvasása és kilistázása 1. lapozottan "józanésszel", 2. úgy, hogy a típusfinomítással komolyabban élünk (azaz ne használjuk ki, hogy az ElemKi figyeli a kiírt sorok számát), 3. az egy tanszéken dolgozók kiférjenek egy lapra (a tanszék nyitórekorddal együtt) Ef: nincs tanszék, ahol többen dolgoznának, mint a képernyősorok száma-2 ("-2" = fejsor + sorszámot tartalmazó lábléc) 4. minden szervezeti egységet egy ún. összegző rekorddal kiegészítve, és fenntartva az együttmaradás feltételét. Ef: olyan, hogy megvalósítható legyen... File-szerkezet: 1. szint: EGYETEM szintkód, név, rektori hivatal cím, tel.szám karok 2. szint: KAR szintkód, név, dékáni hivatal cím, tel.szám tanszékek (tanszéki egységek) 3. szint: TANSZÉKEK szintkód, név, tanszékcím, tel.szám dolgozók 4. szint: DOLGOZÓ szintkód, név, lakcím, tel.szám, fizetés,... Feltételezés: A file strukturálisan helyes, nem üres: legalább 1 dolgozó van. Megjegyzés: A file csupa azonos típusú elemből áll. Ezért a struktúra nyitó elemek kiegészülnek "tartalom nélküli" mezőkkel, amelyeket esetleg föl lehet használni az összegfokozatok utólagos tárolására. Reprezentáció: Input Type TSzint=(Dolgozo,Tanszek,Kar,Egyetem,Ures); Const KSzint:Array [TSzint] of String=(' ','T','K','E','');kiirandó szintkodh=1; nevh=28; cimh=26; telh=9; fizuh=6; kiíráshossz Type TElem=Record szintkod:tszint; nev:string[nevh]; cim:string[cimh]; tel:string[telh]; fiz:longint; Type TFile=File of TElem; 1

Output: Const MaxLapHossz=100; egy-egy lapnyi maximum ennyi sorból állhat Type TKepernyo= képernyő (Pascal) TMemo (Lazarus) TTabSheet (Lazarus) Text Var lapszam,sor:byte; a megnyitott lapok, az aktuális lapra kiírt sorok száma Implementáció: osszfok.inc legalapabb alap rutinjai ebben találhatók a lényeg szemponjából kevésbé fontos általános konstansok, változók, eljárások, függvények. Például: Procedure ElemKi kiír egy elemet a fejléchez igazodva (izlésesen), ügyel a lapra kiírt sorok számára TKepernyo-től függően más és más megoldás Procedure Lapoz, ami lapot töröl, és fejlécet ír ki, sor-t nulláz TKepernyo-től függően más és más megoldás Procedure BillreVar, ami billentyű-lenyomásra vár TKepernyo-től függően más és más megoldás (pl. a lapot megfelelő számú üres sorral tölt föl) Procedure Megnyit file-t, megfelelő módon Procedure General adatfile-t a fenti szerkezetben Procedure Lezar file-t Procedure Inic, ami inicalizálja a kiírást (a Lapoz-on túliak) TKepernyo-től függően más és más megoldás Listázó rutinok: 1. simalista -- egyszerü, lapozott listázás (természetes) virtuális típus bevezetésével 2. maskentlista -- (általánosítható) virtuális típus bevezetésével (útban a tanszékenkénti listázás felé) 3. tanszekenkentlista -- listázás 'tanszék dologozói együtt maradásával' feltétellel 4. osszfokozatoslista -- az előbbi listázás megfejelése az egységeket szintenként lezáró ún. összfokozati elemekkel (tanszék esetén a lezáró elem az egység együttmaradó része) Procedure simalista; (* Virtuális típusok: Input: TBeLap=TFile BeNyit,BeVége?,BeOlvas,BeZár (A reprezentáció egyszerüsége miatt: * BeNyit=Megnyit, * BeVége?=Eof, * BeOlvas=Read, * BeZár=Lezar) Output: TKiLap="Rekord"(sor:Egész,képernyö:TKépernyö) KiNyit,KiIr,KiZár (A reprezentáció egyszerüsége miatt: * KiNyit=inic + lapoz, Pirossal szedem, amik output-reprezentációfüggők. a képernyőn lévő sorok aktuális száma 2

* KiIr=ElemKi (lapozásra ügyelve kiír), * KiZár=ha kell, lap alja) *) Típus-reprezentációk: Var elem:telem; f:tfile; lapszam,sor:byte; <-- Globális Típus-implementációk: Procedure KiNyitoutput:TKiLap; Inic; Lapoz; KiNyit Procedure KiZaroutput:TKiLap; If sor>0 then LapAlja; KiZar A megoldás: Listaz Megnyit(f,Olvasas); Lapozoutput; While not Eof(f) do Read(f,elem); ElemKi(output,elem); Lezar(f); KiZaroutput EndListaz; (* ----------------------------------------------------------------- *) Procedure maskentlista; (* Virtuális típusok: Input: TBeLap=Rekord(db:Egész, sorok:tömb(1..maxlaphossz:telem)) BeNyit,BeVége?,BeOlvas,BeZár * BeNyit=Megnyitas+belap-puffer inicializálás, * BeVége?=Eof, * BeOlvas=puffernyi olvasás, * BeZár=Lezar) Output: TKiLap="Rekord"(sor:Egész,képernyö:TKépernyö) KiNyit,KiIr(beLap-puffer!),KiZár * KiNyit=inic, * KiIr=lapoz + belap-puffer kiírása + lap alja * KiZár=Lezár *) Típus-reprezentációk: Type TBeLap=Record db:byte; sorok:array [1..MaxLapHossz] of TElem; Var egylap:tbelap; f:tfile; 3

lapszam,sor:byte; <-- Globális Típus-implementációk: Procedure BeNyit(Var f:tfile); Megnyit(f,Olvasas); BeNyit Procedure BeOlvas(Var f:tfile ;Var egylap:tbelap); egylap.db:=0; While Not Eof(f) and (egylap.db<laphossz-2) do Inc(egyLap.db); Read(f,egyLap.sorok[egyLap.db]); BeOlvas Procedure KiNyitoutput:TKilap; Inic; KiNyit Procedure KiIrVar képenyő:tképernyő, Var egylap:tbelap; Var i:integer; Lapoz;//a fejléc kiírása For i:=1 to egylap.db do ElemKi(képernyö,egyLap.sorok[i]); nem használom ki, hogy figyeli a sorok számát LapAlja;//a lábléc kiírása KiIr Procedure KiZaroutput:TKiLap; //most semmi fontos KiZar A megoldás: maskentlista Benyit(f); KiNyitoutput; While not Eof(f) do BeOlvas(f,egyLap); KiIrképernyö,egyLap; Lezar(f); KiZaroutput EndmaskentLista; (* ----------------------------------------------------------------- *) Procedure tanszekenkentlista; (* Virtuális típusok: Input: bemeneti egység vagy egy tanszék összes dolgozója a nyitóval vagy valami más elem a bementi eleme határát csak előreolvasási technikával TKépernyő-től függő, hiszen, ha a lapalja egy láblécet (is) jelent, akkor azt is bele kell számítani a laphosszba. A füles lap esetén ilyenre nincs szükség, tehát ott ez nem jelent többlet sort. 2, mert 1 fejléc + 1 lábléc 4

tudjuk megtalálni TBeEgyseg=Rekord(db:Egész, e:telem [az elöreolvasott], sorok:tömb(1..maxtszdolg+1:telem)) Elöfeltétel => MaxTszDolg+1=MaxLapHossz BeNyit,BeVége?,BeOlvas,BeZár * BeNyit=Megnyitas + elöreolvasás * BeVége?=Eof, * BeOlvas=egységolvasás elöreolvasással, * BeZár=Lezar) Output: TKiLap="Rekord"(sor:Egész,képernyö:TKépernyö) KiNyit,KiIr(belap-puffer!),KiZár * KiNyit=Inic + lapoz, * KiIr=ha nem fér ki => lap alja + puffer inicializálása + lapoz belap-puffer kiírása+sor-állítás * KiZár=ha kell, lap alja *) Típus-reprezentációk: Type TBeEgyseg=Record db:byte; e:telem;az elöreolvasott sorok:array [1..LapHossz] of TElem; Var egytanszek:tbeegyseg; f:tfile; lapszam,sor:byte; <-- Globális Típus-implementációk: Procedure BeNyit(Var f:tfile); Ef: NOT Eof(f) Megnyit(f,fN,Olvasas); Read(f,egyTanszek.e);//előreolvasás Procedure BeOlvas(Var f:tfile ;Var egytanszek:tbelap); Ef: NOT Eof(f) AND e=elöreolvasott elem egytanszek.db:=1; egytanszek.sorok[1]:=egytanszek.e; Read(f,egyTanszek.e); While Not Eof(f) and (egytanszek.e.szintkod=dolgozo) do Inc(egyTanszek.db); egytanszek.sorok[egytanszek.db]:=egytanszek.e; Read(f,egyTanszek.e); Uf: Eof(f) => egytanszek[1..egytanszek.db]+e=egy egység AND NOT Eof(f) => e=következő dolgozó elem If Eof(f) then Inc(egyTanszek.db); egytanszek.sorok[egytanszek.db]:=egytanszek.e; egytanszek.e:=urestelem; Uf: egytanszek[1..egytanszek.db]=egy egység AND Eof(f) => e=üres AND NOT Eof(f) => e=következő dolgozó elem 5

Procedure KiNyitoutput:TKilap; Ef: a fájlnak legalább egy eleme van, így legalább egy lap kell Inic; Lapoz; //KiNyit Procedure KiIrVar képernyö:tképernyö, Var egytanszek:tbelap; Var i:integer; If sor+egytanszek.db+1lábléc>=laphossz then//nem fér rá az akt. lapra LapAlja;//a lap "véglegesítése", lezárása Lapoz; //új lap kezdése For i:=1 to egytanszek.db do ElemKi(képernyö,egyTanszek.sorok[i]); nem használom ki, hogy figyeli a sorok számát, csak, hogy kiírja és a sor-t növeli egytanszek.db:=0; Procedure KiZaroutput:TKiLap; If sor>0 then LapAlja; A megoldás: TanszekenkentLista BeNyit(f); KiNyitoutput; While not Eof(f) do BeOlvas(f,egyTanszek); KiIrképernyö,egyTanszek; Lezar(f); KiZaroutput; EndTanszekenkentLista; (* ----------------------------------------------------------------- *) procedure osszfokozatoslista(const fn:string); (* Virtuális típusok: Input: bemeneti egység vagy egy tanszék összes dolgozója a nyitóval vagy valami más elem a bementi eleme határát csak előreolvasási technikával tudjuk megtalálni TBeEgyseg=Rekord(db:Egész, elemek:tömb(1..maxtszdolg+1:telem), e:telem [az elöreolvasott]) Elöfeltétel => MaxTszDolg+1=LapHossz BeNyit,BeVége?,Beolvas,Bezár * BeNyit=Megnyitas+beLap-puffer inicializálás+elöreolvasás * BeVége?=Eof, * BeOlvas=egységolvasás elöreolvasással, * BeZár=Lezar Output: TKiLap="Rekord"(sor:Egész,képernyö:TKépernyö), KiNyit,KiIr(beLap-puffer!),KiZár 6

* KiNyit=Inic + lapoz, * KiIr=ha nem fér ki => lap alja + lapoz belap-puffer kiírása + sor-állítás * KiZár=ha kell, lap alja Megjegyzés: Input, Output közt történik a beolvasott "egység" transzformációja, azaz a megfelelő számú lezáró, összegző rekord hozzátétele *) Típus-reprezentációk: Type TBeEgyseg=Record db:byte; elemek:array [1..MaxLapHossz] of TElem; e:telem;az elöreolvasott Var egytanszek:tbeegyseg; osszfok:array [TSzint] of TElem; f:tfile; lapszam,sor:byte; <-- Globális i,ig:tszint; Típus-implementációk: Procedure BeNyit(Var f:tfile); Megnyit(f,fN,Olvasas); Read(f,egyTanszek.e); //Elöreolvasás:egyetem BeNyit Procedure BeOlvas(Var f:tfile ;Var egytanszek:tbelap); Ef: a fájl szintaktikailag helyes AND NOT Eof(f) AND e=elöreolvasott vmilyen szintü nyitó elem Var i:tszint; egytanszek.db:=0; For i:=egytanszek.e.szintkod downto Tanszek do Inc(egyTanszek.db); egytanszek.e.fiz:=0;//nyitó elem fizu-ja 0-zandó egytanszek.elemek[egytanszek.db]:=egytanszek.e; osszfok[i]:=egytanszek.e; Read(f,egyTanszek.e);//elöreolvasás Uf: egytanszek.e=elöreolvasott dolgozó egy tanszék beolvasása, elkönyvelése: While Not Eof(f) and (egytanszek.e.szintkod=dolgozo) do Inc(egyTanszek.db); egytanszek.elemek[egytanszek.db]:=egytanszek.e; Inc(osszFok[Tanszek].fiz,egyTanszek.e.fiz); Read(f,egyTanszek.e); Uf: Eof(f) => egytanszek[1..egytanszek.db]+e=egy egység AND NOT Eof(f) => e=következö nem dolgozó elem If Eof(f) then Inc(egyTanszek.db); egytanszek.elemek[egytanszek.db]:=egytanszek.e; Inc(osszFok[Tanszek].fiz,egyTanszek.e.fiz); egytanszek.e:=urestelem; 7

//If Eof Uf: egytanszek[1..egytanszek.db]=egy egység AND Eof(f) => e=ürestelem AND NOT Eof(f) => e=következö nem dolgozó elem BeOlvas Procedure KiNyitVar képernyö:tképernyö; Inic; Lapoz; KiNyit Procedure KiIrVar képernyö:tképernyö, Var egytanszek:tbelap; Var i:integer; If sor+egytanszek.db+1lábléc>laphossz then LapAlja; Lapoz; For i:=1 to egytanszek.db do ElemKi(képernyö,egyTanszek.elemek[i]); nem használom ki, hogy figyeli a sorok számát, csak, hogy kiírja és a sor-t növeli KiIr Procedure KiZaroutput:TKiLap; If sor>0 then LapAlja; A megoldás: beginosszfokozatoslista BeNyit(f); KiNyitképernyö; az osszfok-transzformáció előkészítése: For i:=dolgozo to Egyetem do osszfok[i]:=urestelem; While not Eof(f) do Beolvasás: BeOlvas(f,egyTanszek); "Feldolgozás" = zárórekord(ok) hozzávétele: If Eof(f) then ig:=egyetem else ig:=egytanszek.e.szintkod; For i:=tanszek to ig do Inc(egyTanszek.db); egytanszek.elemek[egytanszek.db]:=osszfok[i]; Inc(osszFok[Succ(i)].fiz,osszFok[i].fiz);//összfokozat göngyölítés osszfok[i]:=urestelem; Kiírás: Kiirképernyö,egyTanszek; Lezar(f); KiZarképernyö; end;//osszfokozatoslista 8