Szlávi-Zsakó: Programozási alapismeretek 7. előadás 1
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 2
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 3
Ennek a játék a betűkkel -szerű absztrakciónak az az értelme, h. észleljük: még formálisan is igazítani tudtuk a konkrét feladat specifikációját az absztrakthoz. Ára: egy megfelelőképpen definiált szumma, ill. 2-változós operátor. Szlávi-Zsakó: Programozási alapismeretek 7. előadás 4
és folytatható a játék a betűkkel -szerű alakítgatás, csak éppen most az algoritmizálásnál. Ára már csak egy 2-változós operátor algoritmikus definiálhatósága. Ennek nincs akadálya a függvények definiálhatóságának ismeretében, de ennek leírása helyett lássuk a C++ kódját! Szlávi-Zsakó: Programozási alapismeretek 7. előadás 5
//név: Szlávi Péter //ETR-azonosító: SZPKAFT.ELTE //drótposta-cím: szlavip@elte.hu //Feladat: // Adott N bevétel és kiadás. Mennyi az össz jövedelem? //Kódolási újdonság: // operátor bevezetése a kód jobb olvashatóságához //Egyszerűsítés: // konstans bemenet -- nincs beolvasás #include <iostream> #include <windows.h> using namespace std; //TNyer típus definiálása: struct TNyer{int bev, kia;};//reprezentáció int operator +(int _s, TNyer _x);//tnyer típusú hozzáadás operátor fejsora //a lényegi számítás függvénye: int sum(int _n, const TNyer _t[]);//_n TNyer 'összege' függvény fejsora //Billentyűre várás: void billrevar(); Szlávi-Zsakó: Programozási alapismeretek 7. előadás 6
int main() { //bemenet -csak most: konstansok, így nem kell beolvasni!-: const TNyer Jov[]={{10,5},{5,10},{100,50}};//jövedelem tömb értékei int N=sizeof Jov / sizeof(tnyer);//aktuális elemszám //kimenet -mindjárt számítással-: int S=sum(N,Jov); //eredménymegjelenítés: cout << "Ossz jovedelem:" << S << endl; } billrevar(); return 0; //TNyer típusú hozzáadás operátor definíciója: int operator +(int _s, TNyer _x) { return _s + _x.bev - _x.kia; } //_n TNyer 'összege' függvény definíciója: int sum(int _n, const TNyer _t[]) { int sum=0; for (int i=0; i<_n; i++) { sum=sum+_t[i]; } return sum; } void billrevar() { cout << endl; system("pause"); } Szlávi-Zsakó: Programozási alapismeretek 7. előadás 6
Ad : a hóval és nappal szembeni természetes elvárások. Szlávi-Zsakó: Programozási alapismeretek 7. előadás 7
C++ próbához: A dátum típus definíciója és az operátor prototípusa: struct datum{int ho; int nap;}; bool operator <=(datum d1, datum d2);//érdekes: ha itt '<=' helyett csak '<', nem jelez hibát?!? és az operátor definiálása: bool operator <=(datum d1, datum d2) { return d1.ho<d2.ho (d1.ho==d2.ho && d1.nap<=d2.nap); } Szlávi-Zsakó: Programozási alapismeretek 7. előadás 8
Ez a rendezési operátor is megalkotható C++-ban az előző minta alapján. Szlávi-Zsakó: Programozási alapismeretek 7. előadás 9
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 10
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 11
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 12
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 13
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 14
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 15
//egy (_min,_max) közötti értékű, int elemekből álló, //(maxn, maxm) méretekkel deklarált _mat mátrix beolvasása billentyűzetről: void int_tomb_be(string _kerd, int _min, int _max, int _mat[maxn][maxm], int &_n, int &_m, int maxn, int maxm) { cout << _kerd << endl; //tényleges méretek beolvasása: be_int("sorok száma",_n,0,maxn,"hibás a sorok száma!"); be_int("oszlopok száma",_m,0,maxm,"hibás az oszlopok száma!"); //a mátrix beolvasása: cout << "Kérem az elemeket!" << endl; for (int i=0;i<_n;++i) { for (int j=0;j<_m;++j) { cout << "(" << i+1 << "," << j+1 << ") :"; be_int("",_mat[i][j],_min,_max,"hibás az elem!"); } } } Szlávi-Zsakó: Programozási alapismeretek 7. előadás 16
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 17
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 18
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 19
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 20
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 21
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 22
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 23
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 24
A Belső és a Fehér két logikai függvény, nevük alapján kitalálható szemantikával. Szlávi-Zsakó: Programozási alapismeretek 7. előadás 25
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 26
A specifikációbeli alapgondolat, az (i,j) belső pont-e, helyett az algoritmusban az (i,j) pont egyes szomszédjai belső pontok-e szerepel. Ez magyarázza a formális különbséget. Szlávi-Zsakó: Programozási alapismeretek 7. előadás 27
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 28
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 29
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 30
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 31
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 32
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 33
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 34
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 35
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 36
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 37
#include <iostream> #include <fstream> using namespace std; int fajlbol_string_tombbe(string fn, int &n, string t[], int maxn); int main() { const int maxn=10; int n; string adatok[maxn]; string fn; bool ujra; char k; int hk;//hibakód do{ cout << "A próbafájl neve:"; cin >> fn; hk=fajlbol_string_tombbe(fn,n,adatok,maxn); cout << "Hibakód:" << hk << endl; switch (hk) { case 0: ujra=false; break; case 1: cout << "Nem létezik a fájl. Újra? (I/.)"; cin >> k; ujra=toupper(k)=='i'; break; case 2: cout << "Túl nagy elemszám. Újra? (I/.)"; cin >> k; ujra=toupper(k)=='i'; break; Szlávi-Zsakó: Programozási alapismeretek 7. előadás 38
case 3: cout << "Inkonzisztens adatfájl. Újra? (I/.)"; cin >> k; ujra=toupper(k)=='i'; }; }while (ujra); } if (hk!=1) { cout << "n:" << n << endl; cout << "A teljes tömbtartalom:" << endl; for (int i=0; i<maxn; i++) { cout << i+1 << ".sora:'" << adatok[i] << "'" << endl; } } return 0; int fajlbol_string_tombbe(string fn, int &n, string t[], int maxn) /* fn fájlból feltölti a t[n] tömböt stringekkel; elvárások: LÉTEZŐFÁJL(fN) ÉS 0<=n<=maxN ÉS FÁJL_SORAI_SZÁMA(fN)=n+1 Uf: NEM LÉTEZŐFÁJL(fN) => eredmény=1 ÉS NEM 0<=n<=maxN => eredmény=2 ÉS FÁJL_SORAI_SZÁMA(fN)<>n+1 => eredmény=3 hibátlanfájl(fn) => eredmény=0 ÉS */ { int hibakod=0;//nincs hiba ifstream if(fn.c_str()); if (!if.is_open()) { hibakod=1;//nem létező fájl } else { if >> n; string tmp; getline(if,tmp);//az 1. sor maradékát eldobjuk if (n>maxn) { hibakod=2;//túl sok adat } else { int i=0; while (!if.eof() && i<=maxn) { getline(if,t[i++],'\n'); } if (i!=n) { hibakod=3;//inkonzisztens fájl } } }; if.close(); Szlávi-Zsakó: Programozási alapismeretek 7. előadás 38
} return hibakod; /* második megoldás: #include <iostream> #include <fstream> //a text fájl kezeléséhez using namespace std; int fajlbol_string_tombbe(string fn, int &n, string t[], int maxn); int main() { string fn;//fájlnév int n;//elemszám const int maxn=10;//tömb maximális elemszáma string t[maxn];//elemek //segédváltozók: int siker;//fájlnyitáshoz char tmp; } cout << "Szövegtömb beolvasása szövegfájlból" << endl; do{ cout << "Fájlnév:"; cin >> fn; siker=fajlbol_string_tombbe(fn,n,t,maxn); switch (siker) { case 1: cout << "Nem létezik a fájl. Újra? (I/.)"; cin >> tmp; siker=toupper(tmp)=='i'; break; case 2: cout << "Túl nagy elemszám. Újra? (I/.)"; cin >> tmp; siker=toupper(tmp)=='i'; break; case 3: cout << "Inkonzisztens adatfájl. Újra? (I/.)"; cin >> tmp; siker=toupper(tmp)=='i'; }; }while (siker!=0); return 0; int fajlbol_string_tombbe(string fn, int &n, string t[], int maxn) // // fajlbol_string_tombbe: // 0, ha OK; // 1, ha nem létező fájl; // 2, ha túl nagy az n; // 3, ha inkonzisztens a fájl. // { ifstream szovegfajl (fn.c_str());//megnyitás olvasásra //a megnyithatóság ellenőrzése, és esetleges abortálás if (!szovegfajl.is_open()) { return 1; }; //a fájl nyitva, elemszámolvasás: szovegfajl >> n;//elemszám beolvasása... Szlávi-Zsakó: Programozási alapismeretek 7. előadás 38
cout << "Elemszám:" << n << endl;//... és ellenőrzés célú kiírása string tmp;//a maradék sor lenyeléséhez getline(szovegfajl,tmp,'\n');//a maradék sor lenyelése if (n>maxn) { return 2; }; //a fájlméret OK, adatok olvasása: int i=0;//a beolvasott adatok száma while (!szovegfajl.eof()) { ++i; if (i>n) { return 3;//n-nél több elem }; getline(szovegfajl,t[i]);//a szöveg olvasása... cout << i << ".:" << t[i] << endl;//... és ellenőrzés célú kiírása }; szovegfajl.close();//lezárás if (i<n) { return 3;//n-nél kevesebb elem }; return 0;//a beolvasás: OK } */ Szlávi-Zsakó: Programozási alapismeretek 7. előadás 38
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 39
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 40
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 41
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 42
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 43
N=0 és N=1 esetén a kimenet üres! Szlávi-Zsakó: Programozási alapismeretek 7. előadás 44
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 45
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 46
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 47
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 48
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 49
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 50
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 51
Ad : természetes elvárások a telefonszámmal és az e-levéllel szemben. Szlávi-Zsakó: Programozási alapismeretek 7. előadás 52
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 53
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 54
Szlávi-Zsakó: Programozási alapismeretek 7. előadás 55