Szekvenciális inputfájl felsorolása

Hasonló dokumentumok
Programozás Minta programterv a 2. házi feladathoz 1.

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

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1.

EAF II Feladat dokumentáció IV. feladat 4. házi feladathoz

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1. Készítette: Gregorics Tibor

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

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

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

Programozási tételek újrafelhasználása

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

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

Programozás Minta programterv a 1. házi feladathoz 1.

OAF Gregorics Tibor: Minta dokumentáció a 4. házi feladathoz 1. Feladat. Megoldás

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Felhasználó által definiált adattípus

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök. Adatfolyamok Hibalehetőségek

Bevezetés a programozásba I.

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

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

Maximum kiválasztás tömbben

Bevezetés a programozásba. 8. Előadás: Függvények 2.

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

117. AA Megoldó Alfréd AA 117.

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

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

Pénzügyi algoritmusok

Informatika terméktervezőknek

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

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

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

1. Alapok. Programozás II

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

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

Bevezetés a programozásba I.

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Alkalmazott modul: Programozás 2. előadás. Procedurális programozás: adatfolyamok, adatsorok kezelése

Programozási feladatok megoldása visszavezetéssel egy osztály-sablon könyvtárra támaszkodva 1

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

Programozási alapismeretek 2009/2010

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Bevezetés a C++ programozásba

ö ű é é é é é é ü é é é é ű é é ü é é é é é ó ó é Í é í é é é é ó ö é ö ö ö ó é é í é é é é Ő é é é ü ü é é é ö ö ö é ü é é í é ó ü é é ü é ó é ó ó é

Í Á ő é é é é é ő é ő é ő é Í Á Ú Á Á é ő é ő é é é é é ű é é é é é é é é Á é é é é é ú ú é é é é é é é ú é é é é é é é é é é é ő é é é é é é é é ű é

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

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

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

A C# programozási nyelv alapjai

OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat. Elemzés 1

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

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

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

4. Öröklődés. Programozás II

Programozási tételek újrafelhasználható osztálysablon könyvtára

500. CC Megoldó Alfréd CC 500.

2018, Funkcionális programozás

Pénzügyi algoritmusok

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

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

Objektumorientált programozás C# nyelven III.

Programozás C++ -ban 2007/1

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

Fejlett programozási nyelvek C++ Iterátorok

Programozás C++ -ban

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

Programozás II gyakorlat. 4. Öröklődés

Torna. A torna.csv UTF-8 kódolású állományban soronként egy versenyző eredményeit tároljuk. Az adatokat pontosvessző választja el egymástól.

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

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

Bevezetés a programozásba I 7. gyakorlat. C++: szövegkezelés, szekvenciális fájlkezelés. Szövegkezelés Karakterkezelés

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

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

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

ö ö ö ö ö ö ö ü ö ü ö ű ö ú ü ű ö ü Í ö ú ü ü ű ö ú ü Á ü

ő ö ő ú ő ö ö ő ó ő ö ü ú ö ö ó ő ö ü ó ó ó ó ő ő ő ó ó ú ő ü ő ö ö ó ü ö ö ő ű ö ö ő ú ú ó ö ő ű ö ó

é ú é é é é é é é é é é é é ú é ö é é é ö Ő é é é ú é é é é é é é é ö é é é ö é Ö é é ö é ö é é é ű é ö ö é ö é é ö ö é é ö ö é ö é Ö é ú é é é é é é

ó ú ú ü ú ő ó ő ő ó ó ó ö ó ü ő ó ő ö ü ü ó ö ő É ó ö ö ö ó ó ö ü ü ö ü ó ó ő ó ü ó ü ü ö ö É ú ó ó ö ú ö ü ü ó ó ó ü Á ö ö ü ó ö ó ö ö ö ö ó ó ö ó ó

Ö Ö Ú Ó Ö ű Ő Ő ű ű Ü Ő Ó Ő

é ö é Ö é é ő í ó í é ő ö ú é ó é ő ü ü é ó ö é é ó é é ö é ő í é é ő é é ö é ű ö é í ó é é í ö í ó í ó é é ö ó í ó ó í ó é é ö ő í ó ó í ó ü é í ü

ö ö ó ú ö ö ú ü ó ö ö Í ö ö ö ü ó ö ö ú ú ö ü ó ü ó ü ö ú ü ó ü ö ó Á Á ö ü ú ó ö ü ü ö ó ü ü Á ü ö ü ö ü ö ö ö ü ö ú ö ö ö ü ú ö ú ö ű ú ú ü ö ó ö ö

í ó ő í é ö ő é í ó é é ó é í é é í é í íí é é é í é ö é ő é ó ő ő é ö é Ö ü é ó ö ü ö ö é é é ő í ő í ő ö é ő ú é ö é é é í é é í é é ü é é ö é ó í é

É Í ü ú É ü ő ő ő ő ú ő ú ü ü ő ü ú ü ű ú ú ü ü Í ü ű ő ő É ő

ú ú ü ü Á ú ú ü ű ű ú ü ü ü ü

ő ö ő ű ó ö ó ű Í Ö Ö Á Í Ó Ö Ü É Ö Ö Ö Á Á Ö É Á Ö

Í Í Í Ü Ó Ó Ö Á Ü Ü Ó Ü Ü Ó Ö Í É Ö

ü ö ú ö ú ü ö ü Á Ó ö ö ö ö ú ü ú ü ü ú ú ö ö ü ü ú ü ü ö ö ű ö ü ü ü ü ö ö

ű í ú ü ü ü ü ü Ó í ü í í í É Á

ú ü ü ú Ö ú ü ü ü ü ü ú ü ú ü ű Í ü ü ű ü ű Ó ü Ü ű ú ú Á ü ű ű ü ü Ö ü ű ü Í ü ü

ö ö Ö ó ó ö ó ó ó ü ö í ü ú ó ó í ö ö ö ó ö ü ú ó ü ö ü ö ö Ö ü ö ö Ö ó

É ö Ű ő ű ő ő ű ű

í Ó ó ó í ó ó ó ő í ó ó ó ó

Í Í Ó ű Ü Ó Ó Ü ü Ö Í Ü Í Í ú Ö Ó Í ú ú Ö Ó É Í ű ú

Ü ü Ü Ö Ó ö ü ö Ó Ú Ó ü Ó ö ö Á ö ö ö ö ü

ő ő ő ő ú É ü ú ú ű ú ű ő ő ő ő Á Á ü ő É É É É É É Á Ú Á Á ő ő ő ő ő É Á Á Á ő ő ő Á ü ő ő ü

Ö Ö ű ű ű Ú Ú ű ű ű Ú ű

ő ő ő ő ő ő ú ő ü Á ü ü ő ő ő ő ő ő ő ő ő ő Ö Ó ő ő ő Ö ő ő ő

ú ú ö ö ü ü ü ü ű ü ü

Átírás:

Szekvenciális inputfájl felsorolása

Szekvenciális inputfájl felsorolása Egy x:infile(e) szekvenciális inputfájl (amely szerkezetileg egy sorozat) elemeit az st,e,x:read művelet (e:e, st:status={abnorm, norm ) segítségével sorolhatjuk fel. A felsorolás műveletei: first() ~ st, e, x : read next() ~ st, e, x : read current() ~ e end() ~ st=abnorm st, e, x : read st = norm e st, e, x : read A felsorolás az előre olvasási stratégiára épül: először olvasunk, majd ezután megvizsgáljuk, hogy sikerült-e az olvasás. Ha igen, a beolvasott elemet feldolgozzuk. A specifikációban a felsorolást az e x szimbólummal jelölhetjük. Gregorics Tibor: Objektumelvű programozás 2

Kollatálási feladatok A gyakorlatban sokszor találkozunk olyan feladatokkal, amikor sorozatokból sorozatokat kell előállítani. Ha ezek a sorozatok például szöveges állományokban találhatók (vagy esetleg konzolon keresztül érhetők el), akkor a bemenő sorozatokat szekvenciális inputfájlként, a kimenőket szekvenciális outputfájlként érdemes kezelni. A leggyakoribb ilyen kollatálási feladatok: másolás illetve elemenkénti átalakítás (például riport készítés) kiválogatás szétválogatás összefuttatás Ezekben a feladatokban az a közös, hogy mindegyiket az összegzés programozási tételére vezethetjük vissza, és ehhez a szekvenciális inputfájl felsorolását használjuk kivéve az összefuttatást, mert az egyedi felsorolást kíván. Gregorics Tibor: Objektumelvű programozás 3

Összegzés kollatáláshoz Általános összegzés A : t:enor(e), s:h Ef : t = t 0 Uf: s = e t0 f(e) s := 0 t.first() t.end() s := s+f(t.current()) t.next() f :E H +:H H H 0 H Speciális összegzés: kollatálás A : x:infile(e), y:outfile(f) Ef : x = x 0 Uf: y = e x0 f(e) Összegzés: t:enor(e) ~ y := y f(e) x:infile(e) st,e,x : read H,+,0 ~ F*,, <> y := <> st,e,x : read st=norm y : write(f(e)) st,e,x : read f :E F* :F* F* F* <> F* Gregorics Tibor: Objektumelvű programozás 4

1.Feladat Alakítsunk át egy ékezeteket tartalmazó szöveget (amely egy karakteres szekvenciális inputfájl) ékezet nélkülire! A : x:infile(char), y:outfile(char) Ef : x = x 0 Uf: y = ch x0 <átalakít(ch)> ahol átalakít : Char Char és átalakít(ch) = Összegzés: t:enor(e) ~ x:infile(char) st,ch,x : read e ~ ch f(e) ~ <átalakít(ch)> H,+,0 ~ Char*,, <> y := < > st, ch, x : read st = norm y : write(átalakít(ch)) st, ch, x : read Gregorics Tibor: Objektumelvű programozás 5

Szürkedoboz tesztelés vázlata Az összegzés teszteléséhez vizsgálni kell a felsorolót (más felsorolós programozási tételekhez hasonlóan) felsorolás hossza szerint: 0, 1, 2, illetve több elem felsorolása felsorolás eleje, vége szerint: összegzésnél ez 2 eltérő elem felsorolásával már ellenőrizhető a terheléses teszt most nem túl érdekes, hiszen csak az inputfájl méretével azonos outputfájlt hozhatunk létre Ezeken kívül ellenőrizni kell a konverziót. a felsoroló hossza szerint: 0, 1, 2, illetve több karaktert tartalmazó input (másolás) az átalakítás szerint: x = <áéíöőúüű> y = <aeioouuu> x = <aeioouuu> y = <aeioouuu> x = <bsmnz> y = <bsmnz> x = <Hazádnak rendületlenül > Gregorics Tibor: Objektumelvű programozás 6

C++ A C++ nyelv is előre olvasási stratégiát alkalmaz a fájlolvasáshoz. A karakterenkénti olvasást leíró st, ch, x : read művelet megvalósításai: x >> ch x.get(ch) Ez az elválasztó jeleket (white space) nem olvassa be, hanem átlépi azokat, kivéve, ha kikapcsoljuk ezt az automatizmust (x.unsetf(ios::skipws)). Ez minden karaktert (elválasztó jeleket is) beolvas. A C++ nyelvben az st==norm vizsgálatot a!x.eof() helyettesíti. Sokszor azonban biztonságosabb a!x.fail() használata, amely nemcsak a fájl végének elérése miatti sikertelen olvasást jelzi, hanem mindenféle sikertelen olvasást (a fájl nincs helyesen kitöltve, hiányzik a legutolsó elem után a sorvége jel). Gregorics Tibor: Objektumelvű programozás 7

C++ program int main() { y := < > ifstream x( "input.txt" ); st, ch, x : read if ( x.fail() ){ ofstream = norm y( "output.txt" ); if ( y.fail() ){ y : write(átalakít(ch)) char ch; while(x.get(ch)){ y st, << ch, transform(ch); x : read st, ch, x : read x.get(ch); while(!x.fail()){ y << transform(ch); x.get(ch)); st==norm y : write(transform(ch)) return 0; Gregorics Tibor: Objektumelvű programozás 8

C++ program char transform(char ch) { char new_ch; switch (ch) { case 'á' : case 'é' : case 'í' : case 'ó' : case 'ö' : case 'õ' : case 'ú' : case 'ü' : case 'û' : case 'Á' : case 'É' : case 'Í' : case 'Ó' : case 'Ö : case 'Õ' : case 'Ú' : case 'Ü : case 'Û' : new_ch = 'a'; break; new_ch = 'e'; break; new_ch = 'i'; break; new_ch = 'o'; break; new_ch = 'u'; break; new_ch = 'A'; break; new_ch = 'E'; break; new_ch = 'I'; break; new_ch = 'O'; break; new_ch = 'U'; break; default : new_ch = ch; return new_ch; Gregorics Tibor: Objektumelvű programozás 9

2.Feladat Válogassuk ki a páros számokat egy egész számokat tartalmazó szekvenciális inputfájlból! A : x:infile(z), cout:outfile(z) Ef : x = x 0 Uf : cout = e x0 <e> Összegzés: t:enor(e) ~ e páros x:infile(z) st,e,x : read cout := < > st, e, x : read st = norm e páros cout : write(<e>) f(e) ~ <e> ha e páros H,+,0 ~ Z*,, <> st, e, x : read Gregorics Tibor: Objektumelvű programozás 10

Szürkedoboz tesztelés vázlata Vizsgálni kell a felsorolót felsorolás hossza szerint: 0, 1, 2, több felsorolás eleje, vége szerint: 2 eltérő elem felsorolása a terheléses teszt most sem érdekes a kiválogatás feltételeit a felsoroló hossza szerint: 0, 1, 2, több egész számot tartalmazó input, amely csupa páros számból áll (másolás) a feltétel szerint: x = <-100, -55, -2, -1, 0, 1, 2, 55, 100> y = <-100, -2, 0, 2, 100 > Gregorics Tibor: Objektumelvű programozás 11

C++ program #include <iostream> #include <fstream> using namespace std; int main() { cout := < > st, e, x : read ifstream x; bool error = true; do{ string = norm fname; cout << "file name: "; cin >> fname; e páros x.open(fname.c_str()); if( (error=x.fail()) ) { cout << "Wrong file name!\n"; x.clear(); st, e, x : read while(error); cout : write(<e>) Az elválasztójelek átlépése után az e típusának megfelelő értéket olvas. st, ch, x : read x >> e; while(!x.fail()){ if(0==e%2) cout << e; x >> e; st==norm cout : write(<e>) cout << "Selected even numbers: "; int e; while(x >> e) { if(0==e%2) cout << e << " "; return 0; Gregorics Tibor: Objektumelvű programozás 12

3.Feladat és a specifikációja Egy könyvtári nyilvántartásból válogassuk ki a nulla példányszámú könyveket és a 2000-nél régebbi kiadásúakat! A : x:infile(könyv), y:outfile(könyv2), z:outfile(könyv2) Könyv = rec( azon : N, szerző : String, cím : String, kiadó : String, év : String, pld : N, isbn:string) Könyv2 = rec( azon : N, szerző : String, cím : String) Ef : x = x 0 Uf : y = dx x0 dx.pld=0 <(dx.azon, dx.szerző, dx.cím)> z = dx x0 <(dx.azon, dx.szerző, dx.cím)> dx.év< 2000 Gregorics Tibor: Objektumelvű programozás 13

Algoritmus Összegzés: t:enor(e) ~ x:infile(könyv), sx,dx,x : read e ~ dx f 1 (e) ~ <(dx.azon, dx.szerző, dx.cím)> ha dx.pld = 0 f 2 (e) ~ <(dx.azon, dx.szerző, dx.cím)> ha dx.év < 2000 H,+,0 ~ Könyv2*,, <> y, z := < > sx, dx, x : read sx = norm dx.pld = 0 y : write(<(dx.azon, dx.szerző, dx.cím)>) dx.év < 2000 z : write(<(dx.azon, dx.szerző, dx.cím)>) sx, dx, x : read Gregorics Tibor: Objektumelvű programozás 14

Szürkedoboz tesztelés vázlata Vizsgálni kell a felsorolót felsorolás hossza szerint: 0, 1, 2, több felsorolás eleje, vége szerint: 2 eltérő elem felsorolása a terheléses teszt most sem érdekes a szétválogatás feltételeit a felsoroló hossza szerint: a feltételek szerint: 0, 1, 2, több olyan könyv, amelyek mind megfelelnek az összes feltételnek (másolás) nulla és nem-nulla példányszámú, illetve 2000-nél régebbi és nem régebbi könyvek Gregorics Tibor: Objektumelvű programozás 15

Megvalósítás read és write művelettel bool read(ifstream &x, Book &dx, Status &sx); void write(ofstream &x, const Book &dx); int main() { ifstream x("inp.txt"); if (x.fail() ) { ofstream y("out1.txt"); if (y.fail() ) { ofstream z("out2.txt"); if (z.fail() ) { Book dx; Status sx; while(read(x,dx,sx)) { if (0==dx.nc) write(y,dx); if (dx.year<"2000") write(z,dx); return 0; struct Book{ int id; string author; string title; string publisher; string year; int nc; string isbn; ; enum Status{abnorm, norm; read(x,dx,sx); while(norm==sx){ if (0==dx.nc) write(y,dx); if (dx.year<"2000") write(z,dx); read(x,dx,sx); Gregorics Tibor: Objektumelvű programozás 16

read és write művelet sorokba tördelt, szigorúan pozícionált inputfájl 12 J. K. Rowling Harry Potter II. Animus 2000 0 963 8386 94 O 15 A. A. Milne Micimackó Móra 1936 10 963 11 1547 X 17 Gárdonyi Géza A láthatatlan ember Szépirodalmi 1973 0 SZ 1823-D-7374 25 Fekete István Zsellérek Nestor 1994 12 963 7523 3 4 O bool read(ifstream &f, Book &dx, Status &sx){ string line; getline(f,line); karakterláncot számmá alakít if (!f.fail()) { sx = norm; rész-sztring C stílusú karakterláncot csinál sort olvas dx.id = atoi(line.substr( 0, 4).c_str()); dx.author = line.substr( 5,14); dx.title = line.substr(21,19); dx.publisher = line.substr(42,14); dx.year = line.substr(58, 4); dx.nc = atoi(line.substr(63, 3).c_str()); dx.isbn = line.substr(67,14); else sx=abnorm; void write(ofstream &f, const Book &dy){ f << setw(4) << dy.id << ' ' return norm==sx; << setw(14) << dy.author << ' ' << setw(19) << dy.title << endl; logikai értéket is visszaad pozícionált kiírás #include <iomanip> Gregorics Tibor: Objektumelvű programozás 17

Megvalósítás osztályokkal int main() { try{ Stock x("input.txt"); Result y("output1.txt"); Result z("output2.txt"); Book dx; Status sx; while(x.read(dx,sx)){ if (0==dx.nc) ; y.write(dx); if (dx.year<"2000") z.write(dx); catch(stock::errors e){ if(stock::file_error==e) cout << catch(stock::errors e){ if(stock::file_error==e) cout << return 0; f.open(fname.c_str()); if(f.fail()) throw FILE_ERROR; f.open(fname.c_str()); if(f.fail()) throw FILE_ERROR; struct Book{ int id; std::string author; std:: string title; std:: string publisher; std:: string year; int nc; std:: string isbn; ; enum Status{abnorm, norm; class Stock{ public: enum Errors{FILE_ERROR; Stock(std::string fname); bool read(book &dx, Status &sx); private: std::ifstream f; a belseje nem változott class Result{ public: enum Errors{FILE_ERROR; Result(std::string fname); void write(const Book &dx); private: std::ofstream f; ; a belseje nem változott Gregorics Tibor: Objektumelvű programozás 18

4.Feladat Egy szöveges állomány a félévéves számonkéréseinek eredményét egy hallgató egy sor formában tartalmazza. Egy sorban szóközökkel vagy tabulátorjellel elválasztva az alábbi sorrendben találjuk az adatokat : neptun-kód (6 számjegy), + és - -ok összefüggő (szóközökkel sem elválasztott) nem üres sztring 1 beadandó és a 4 zárthelyi eredménye (mindegyik 0.. 5) Határozzuk meg azon hallgatók félévvégi összesített jegyét, akik kaphatnak jegyet! AA11XX ++++-+++++ 5 5 5 5 5 CC33ZZ ++++--++-- 2 1 0 5 5 BB22YY --+---+++- 2 2 3 3 5 Gregorics Tibor: Objektumelvű programozás 19

Megoldási terv A : x : infile(hallgató), y : outfile(értékelés) Hallgató = rec(neptun : String, pm : String, jegyek : {0..5 7 ) Értékelés = rec(neptun : String, jegy : {0..5) Ef : x = x 0 Uf : y = dx x0 <dx.neptun, átl(dx) > felt(dx) 7 dx.pm dx.pm felt(dx) = (dx.jegyek[i] >1) ( 1 1 ) i=1 i=1 i=1 Összegzés: t:enor(e) ~ 7 átl(dx) = ( dx.jegyek[i] ) / 7 i=1 x:infile(hallgató) sx,dx,x : read e ~ dx f(e) ~ ha felt(dx) akkor <(dx.neptun, átl(dx))> H,+,0 ~ Értékelés*,, <> dx.pm[i]= dx.pm[i]= + y := < > sx, dx, x : read st = norm felt(dx) y : write(<(dx.neptun, átl(dx))>) sx, dx, x : read Gregorics Tibor: Objektumelvű programozás 20

Alprogramok Opt. lineáris keresés: t:enor(e) ~ i = 1.. 7 e ~ i felt(e) ~ dx.eredm[i]>1 Két számlálás: t:enor(e) ~ i = 1.. dx.pm e ~ i felt1(e) ~ dx.pm[i] = + felt2(e) ~ dx.pm[i] = - Összegzés: t:enor(e) ~ i = 1.. 7 e ~ i f(e) ~ dx.eredm[i] H,+,0 ~ R, +, 0 7 l := ( dx.eredm[i]>1) i=1 dx.pm dx.pm p, m := 1, 1 i=1 i=1 dx.pm[i]= + dx.pm[i]= 7 s := dx.eredm[i]) /7 i=1 Gregorics Tibor: Objektumelvű programozás l := felt(dx) l, i := true, 1 l i 7 l := dx.eredm[i] > 1 i := i + 1 p, m := 0, 0 i = 1.. dx.pm dx.pm[i] = + p := p + 1 dx.pm[i] = - m := m + 1 l := l p m a := átl(dx.eredm) s := 0 i = 1.. 7 s := s + dx.eredm[i] a := s / 7 21

Szürkedoboz tesztelés vázlata Külső feltételes összegzés: a felsoroló hossza szerint: 0, 1, 2, több olyan hallgató, akik kaphatnak jegyet a felsorolás eleje/vége: a fentiekkel letudva terhelés: nem kell a cond() és f() vizsgálata: lásd alább Plusz-mínuszok számlálása: a felsoroló hossza szerint: 0, 1, 2, több csak + a felsorolás eleje/vége: 2 hosszú felsorolások, felváltva + vagy (4 eset) eredmény szerint: eddigieken túl: 0, 1, több és mellette + -ok Nincs elégtelen eldöntése (optimista linker) : a felsoroló hossza szerint: nem kell (garantáltan 7) a felsorolás eleje/vége: csak az eleje 1, csak a vége 1 eredmény szerint: csupa 1, van 1, mind legalább 2 Osztályzatok összegzése: a felsoroló hossza szerint: nem kell (garantáltan 7) a felsorolás eleje/vége: elején és végén különböző osztályzatokkal terhelés: nem kell Gregorics Tibor: Objektumelvű programozás 22

C++ program bool cond(const vector<int> &marks, const string &pm ); double avr(const vector<int> &marks); int main(){ try{ InpFile x("input.txt"); OutFile y("output.txt"); Student dx; Status sx; while(x.read(dx,sx)) { if (cond(dx.marks, dx.pm)) { Evaluation dy(dx.neptun, avr(dx.marks)); y.write(dy); catch( InpFile::Errors er ) { if( er==inpfile::file_error ) cout << ; catch( OutFile::Errors er ) { if( er==outfile::file_error ) cout << ; return 0; Gregorics Tibor: Objektumelvű programozás 23

C++ függvények bool cond(const vector<int> &marks, const string &pm ) { bool l = true; for(unsigned int i=0; l && i<marks.size(); ++i){ l=marks[i]>1; int p, m; p = m = 0; for(unsigned int i = 0; i<pm.size(); ++i){ if(pm[i]=='+') ++p; if(pm[i]=='-') ++m; return l && m<=p; double avr(const vector<int> &marks) { double s = 0.0; for(unsigned int i = 0; i< marks.size(); ++i){ s += marks[i]; return (0== marks.size()? 0 : s/ marks.size()); Gregorics Tibor: Objektumelvű programozás 24

Szekvenciális inputfájl struct Student { std::string neptun; std::string pm; std::vector<int> marks; ; enum Status {abnorm, norm; class InpFile{ public: enum Errors{FILE_ERROR; InpFile(std::string fname){ f.open(fname.c_str()); if(f.fail()) throw FILE_ERROR; bool read( Student &dx, Status &sx); private: std::ifstream f; ; bool InpFile::read(Student &dx, Status &sx) { string line; getline(f, line); if (!f.fail() && line!="") { sx=norm; istringstream in(line); in >> dx.neptun; in >> dx.pm; dx.marks.clear(); int mark; while( in >> mark ) dx.marks.push_back(mark); else sx=abnorm; return norm==sx; Gregorics Tibor: Objektumelvű programozás 25

Szekvenciális outputfájl struct Evaluation { std::string neptun; double mark; Evaluation(std::string str, double j) : neptun(str), mark(j) { ; class OutFile{ public: enum Errors{FILE_ERROR; OutFile(std::string fname){ f.open(fname.c_str()); if(f.fail()) throw FILE_ERROR; void write(const Evaluation &dy) { f.setf(std::ios::fixed); f.precision(2); f << dy.neptun << std::setw(7) << dy.mark << std::endl; private: std::ofstream f; #include <iomanip> ; Gregorics Tibor: Objektumelvű programozás 26

Feladat és a program módosítása Egy szöveges állományban a sorok a hallgatók nevével kezdődnek, amely tetszőleges számú, de legalább egy tagból áll (közöttük elválasztó jelek). Gipsz Jakab Elemér AA11XX ++++++++++ 5 5 5 5 5 Szer Elek CC33ZZ +++++-++++ 2 1 0 5 1 Jose Fernando Llano del Colona BB22YY ---+++---- 2 4 4 0 0 int main(){ try{ InpFile x("input.txt"); OutFile y("output.txt"); Student dx; Status sx; while(x.read(dx,sx)) { if (dx.has) { Evaluation dy(dx.neptun, dx.result); y.write(dy); struct Student { std::string name; std::string neptun; bool has; double result; ; Gregorics Tibor: Objektumelvű programozás 27

Változó számú adat olvasása bool InpFile::read(Student &dx, Status &sx) { string line, str; dx kitöltése a line alapján getline(f, line); if (!f.fail() && line!="") { sx=norm; sorbeli adatok önálló olvasásához (#include <sstream>) istringstream in(line); in >> dx.name; in >> dx.neptun; in >> str; while(!('+'== str[0] '-'== str[0]) ){ dx.name += " " + dx.neptun; dx.neptun = str; in >> str; vector<int> marks; int mark; while( in >> mark ) marks.push_back(mark); dx.has = cond(marks, str); dx.result = avr(marks); else sx=abnorm; return norm==sx; ha str nem + vagy jellel kezdődik, akkor az még a név része vagy legfeljebb a neptun kód amit eddig neptun kódnak hittünk, az még a név része str-t pedig tekintsük egyelőre neptun kódnak Inp osztály privát metódusai Gregorics Tibor: Objektumelvű programozás 28

Olvasás szöveges állományokból x : infile(e) st, data, x : read st = abnorm E char // karakterek elválasztás nélkül x.get(data); x >> data; //x.unsetf(ios::skipws) x.eof() E <elemi típus> // elválasztó jelekkel szeparált elemi // típusú érték E struct(s1 : <elemi típus>, s2 : <elemi típus>, sn : <elemi típus> n, ) // fix számú, elválasztó jelekkel szeparált // elemi típusú értékekkel kitölthető // struktúra E sor // sorokba szervezett, soronként eltérő számú adat esetén x >> data; x >> data.s1 >> data.s2; for(int i=0; i<n; ++i) { x >>data.sn[i]; string data; getline(x, data); istringstream is(data); is >> x.fail() x.fail() x.fail() Gregorics Tibor: Objektumelvű programozás 29