INFORMATIKA ÉRETTSÉGI EMELT SZINT PROGRAMOZÁSI FELADATOK MEGOLDÁSA C++
|
|
- Lőrinc Pap
- 9 évvel ezelőtt
- Látták:
Átírás
1 Ódor Péter INFORMATIKA ÉRETTSÉGI EMELT SZINT PROGRAMOZÁSI FELADATOK MEGOLDÁSA C++ Ódor Péter, 2015
2 T A R T A L O M J E G Y Z É K TÁJÉKOZTATÓ... 5 ADATSZERKEZETEK... 6 TÖMB (VEKTOR, SOROZAT)... 6 MÁTRIX... 6 STRUKTÚRA... 8 SZÖVEGES FÁJLOK KEZELÉSE EGYÉB FÁJLKEZELÉSI MEGOLDÁS NÉHÁNY KIEMELT ALGORITMUS NÉHÁNY MŰVELET STRINGEKKEL NÉHÁNY HASZNOS ALGORITMUS május emelt LOTTÓ FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD október emelt VIGENÉRE FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD február emelt TELEFONSZÁMLA FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD május emelt FEHÉRJE FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD október emelt ZENEI ADÓK FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD május emelt SMS SZAVAK FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD
3 2007. október emelt FOCI FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD május emelt SMS FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD október emelt ROBOT FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD május emelt LIFT FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD október emelt ÚTÉPÍTÉS FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD május emelt HELYJEGY FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD október emelt ANAGRAMMA FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD május emelt SZÓJÁTÉK FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD október emelt PITYPANG FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD
4 2012. május emelt FUTÁR FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD október emelt SZÍN-KÉP FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD május emelt VÁLASZTÁSOK FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD október emelt KÖZÚTI ELLENŐRZÉS FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD május emelt IPv FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD október emelt NÉZŐTÉR FELADAT SZÖVEGE FONTOSABB VÁLTOZÓK PROGRAMKÓD
5 TÁJÉKOZTATÓ Az emelt szintű érettségi feladatok megoldása során elsődleges szempont az átláthatóság volt, és nem a hatékonyság. Ennek köszönhetően a programok nem mindig elegánsak vagy általánosak. Ahol lehetett, ott azért próbáltam általános függvényeket készíteni, főleg olyan helyzetekben, amikor egy feladatrész egy korábbi feladatrészt használt fel. A problémák megoldása során alapvető adatszerkezeti ismeretekre van szükség (tömb/vektor, mátrix, struktúra), ismerni kell a szöveges fájlok kezeléséhez szükséges alaputasításokat, eszközöket. Az adatszerkezeteken túl ismerni kell - az ugyancsak alapvető - programozási tételeket is (lineáris keresés, kiválasztás, összegzés, kiválogatás, megszámolás, rendezés, stb.) 5
6 ADATSZERKEZETEK TÖMB (VEKTOR, SOROZAT) A tömb azonos típusú adatok halmazát jelenti. A tömböt ugyanúgy, mint a közönséges változókat névvel azonosítjuk a programban, és a tömbben található egyes adatokat indexük, azaz sorszámuk segítségével lehet elérni, kezelni. (A C-ben az indexelés mindig 0-tól indul.) Példa int T[100]; (T 100 egész számot tartalmazó tömb, melynek ötödik elemét indexeléssel érhetjük el: T[4].) int T[5]=0,0,0,0,0; (Minden elem kezdőértéke 0.) A tömbök feldolgozása általában ciklussal oldható meg (pl. for ciklus), ha minden elemével el kell végezni valamilyen műveletet, például értéket kell adni a tömbelemeknek: for(int i=0;i<100;i++) T[i]=0; (A fenti programrész T minden elemének a 0 kezdőértéket adja. Érdemes megfigyelni a ciklusváltozó és a tömbindexelés kapcsolatát. A legtöbb esetben az i ciklusváltozó indexként is felhasználható.) int i=0; while(i<20) T[i]+=10; i++; (A fenti programrész T első 20 elemének értékét 10-zel növeli) MÁTRIX A mátrix is azonos típusú adatok egysége, de 2 vagy több dimenziós is lehet. Általában kétdimenziós mátrixokat használunk. Példa int M[100][3]; (M 100 sorból és 3 oszlopból álló adatszerkezet, minden eleme egész szám, melyben például az ötödik sor második elemét a következőképpen érhetjük el: T[4][1].) int T[3][3]= ; 0,0,0, 0,0,0, 0,0,0 (Minden elem kezdőértéke 0.) 6
7 A mátrixok feldolgozása általában két ciklussal oldható meg (pl. for ciklusok), döntésünktől függően vagy sorfolytonosan vagy oszlopfolytonosan, azaz vagy egy soron végighaladva kezdünk új sort, vagy egy oszlopon végighaladva kezdünk új oszlopot. Ha például minden elemével el kell végezni valamilyen műveletet (értéket kell adni a mátrixelemeknek), az alábbiak szerint járhatunk el: for(int i=0;i<100;i++) for(int j=0;j<3;j++) T[i][j]=0; //SORFOLYTONOS feldolgozás (A fenti programrész T minden elemének a 0 kezdőértéket adja.) for(int j=0;j<3;j++) for(int i=0;i<100;i++) T[i][j]=0; //OSZLOPFOLYTONOS feldolgozás (A fenti programrész T minden elemének a 0 kezdőértéket adja.) További példák: int het[7]=1,2,3,4,5,6,7; (Konstans tömb, pl. het[3]=4) string napok[7]= hétfő, kedd, szerda, csütörtök, péntek, szombat, vasárnap ); cout << napok[het[5]] << endl; (Gyakori megoldás az, ha egy adott tömb-, vagy mátrixelem indexét (sorszámát) egy másik tömb vagy mátrix szolgáltatja. A példa erőltetett, csak illusztrálja ezt a lehetőséget, viszont az érettségi feladatokban gyakran alkalmazható eljárás. A példa a képernyőre a vasárnap szót írja ki, köszönhetően annak, hogy az indexek mindig 0-tól kezdődnek.) 7
8 STRUKTÚRA Ezt az összetett adatszerkezetet akkor használjuk, ha különböző típusú adatokat szeretnénk egy egységben kezelni. Példa struct str_nev int a, b; char c; float f; string st; Az str_nev a programban olyan, mint például az int, float, char, stb. Azaz egy új adattípust jelent. A fenti példa öt adatmezőből álló struktúrára mutat mintát. Látható, hogy az egyes mezők különböző típusúak. A programban a struktúra egyes mezőire a következőképpen tudunk hivatkozni: 1. Először is egy változót kell megadni ezzel az új, struktúra típussal: str_nev adat; 2. Az egyes mezők használata: adat.a=4; adat.b=adat.a*2 adat.c= C ; adat.st= Szöveges adat ; A struktúra és a tömb, vagy mátrix segítségével még összetettebb adatszerkezeteket hozhatunk létre. Nézzünk erre is példákat: Példa struct str_nev int a, b; char c; float f; string st; adat[100]; A fenti példában rögtön a struktúra definiálásakor egy tömböt is létrehozunk 100 elemmel, ahol az elemek a, b, c, f, st mezők együttesét jelenti, azaz adatötösök lesznek a tömbelemek. 8
9 Az egyes tömbelemek tehát a következőképpen érhetők el: adat[5].a=7; adat[7].st= Szöveges információ ; Látható, hogy a tömbelemeket indexeléssel érjük el, és a tömbelemen belül az egyes mezőket ponttal elválasztva kezelhetjük, mint egy normál struktúra típusnál. Ha ugyanilyen struktúra típusú mátrixot is szeretnénk létrehozni, azt a következőképpen tehetjük meg: str_nev matrix[10][20]; A mátrix elemeinek használatára egy példa: matrix[4][8].f=3.14; 9
10 SZÖVEGES FÁJLOK KEZELÉSE Az érettségi feladatokban - eddig legalábbis - csak szövegfájlokat kellett kezelni. A fájlok tartalma lehet szöveg és szám is. Tartalmuk elrendezése szerint viszont nagy a változatosság: 1. minden adat külön sorban van, 2. egy sorban több, de azonos típusú adat van szóközökkel elválasztva 3. egy sorban több és különböző típusú adat van szóközökkel elválasztva 4. egy sorban szóközökkel tagolt szöveg van Nézzük meg, hogy az egyes tartalmi elrendezésekre milyen megoldást érdemes kidolgozni. (Természetesen más megoldások is lehetnek): 1. minden adat külön sorban van Ez a legegyszerűbb eset. Automatikusan beolvashatók a sorok, mivel a fájlkezelés során a fájlmutató automatikusan új sorra lép. Példa proba.txt fájl tartalma: #include <iostream> 1 #include <fstream> //fájlkezelés fv. tára 2 3 #define max 10 //ha pl. 10 elem lehet maximum 4 int main() int adat[max]; int i=0; ifstream fbe; //input fájlkezelés fbe.open( proba.txt ); while(!fbe.eof()) fbe >> adat[i]; i++; fbe.close(); cout << Beolvasott elemek száma: << i; return 0; A fenti példában nem ismert a fájlban található elemek száma, így a beolvasást addig kell folytatni, amíg a fájl végére nem érünk (fbe.eof() eof: end of file). Az i ciklusváltozó a ciklus lefutása után a beolvasott elemek számát tartalmazza. Ha ismert a fájlban lévő elemek száma, akkor egy egyszerű for ciklussal is beolvashatjuk az elemeket. 10
11 2. minden sorban több adat van Ez sem okozhat problémát: az adatok beolvasása során automatikusan, szóközönként továbblép a fájlmutató, a sorok végén pedig automatikusan új sorra lép. Példa proba.txt fájl tartalma: #include <iostream> #include <fstream> //fájlkezelés fv. tára #define max 15 //ha pl. 15 elem lehet maximum int main() int adat[max]; int i=0; ifstream fbe; //input fájlkezelés fbe.open( proba.txt ); while(!fbe.eof()) fbe >> adat[i]; i++; fbe.close(); cout << Beolvasott elemek száma: << i; return 0; (Látható, hogy semmi különbség nincs az előző példához képest.) 11
12 3. minden sorban több, különböző típusú adat van Példa proba.txt fájl tartalma: #include <iostream> 123 ablak k #include <fstream> //fájlkezelés fv. tára 210 ajtó z #define max 15 //ha pl. 15 elem lehet maximum struct adat int szam; string szoveg; char k; float valos; adatok[max]; int main() int i=0; ifstream fbe; //input fájlkezelés fbe.open( proba.txt ); while(!fbe.eof()) fbe >> adatok[i].szam; fbe >> adatok[i].szoveg; fbe >> adatok[i].char; fbe >> adatok[i].valos; i++; fbe.close(); cout << Beolvasott elemek száma: << i; return 0; Ha különböző típusú adatokat kell egy egységben kezelnünk, akkor célszerű lehet a struktúra (struct) használata. Ez megfelel egy adatbázistábla megadásának: mezőnevek és adattípusok. Rögtön a struktúra definiálásánál változót (a példában egy tömböt) rendelhetünk ehhez az új adatszerkezethez. Ekkor a változónk globális lesz, bármely függvényünkben felhasználhatjuk. EGYÉB FÁJLKEZELÉSI MEGOLDÁS Mit tegyünk, ha az a feladat, hogy egy már létező fájlhoz kell új adatokat, sorokat hozzáfűzni? Ebben az esetben a fájlt append, azaz hozzáfűzés módban kell megnyitni. Nézzünk erre egy példát! Példa: ofstream ki; ki.open("eredmeny.txt", fstream::app); Az így megnyitott fájl tartalma, ha már létezett, nem törlődik, hanem az új tartalmak hozzáfűzésre kerülnek. 12
13 NÉHÁNY KIEMELT ALGORITMUS EGYSZERŰ CSERÉS RENDEZÉS! Példa: Adott egy N elemű x nevű tömb, melynek elemeit növekvő sorrendbe kell rendezni. Az algoritmus C nyelven: for(int i=0; i<n-1; i++) for(int j=i+1; j<n; j++) if(x[i] > x[j]) swap(x[i], x[j]); //külső ciklus N-1-ig megy //belső ciklus mindig i+1-től N-ig //Ha sorrend nem jó, akkor csere MEGSZÁMOLÁS! Példa: Adott egy N elemű x nevű tömb és egy T tulajdonság. Számoljuk meg, hány elem rendelkezik ezzel a tulajdonsággal! Az algoritmus C nyelven: int db=0; for(int i=0; i<n; i++) if(x[i] T tulajdonságú) db++; //minden elemet meg kell vizsgálni cout << db; MAXIMUMKERESÉS! Példa: Adott egy N elemű x nevű tömb, melynek elemei összehasonlíthatók. Keressük meg a legnagyobb elemet! Az algoritmus C nyelven: int max=0; for(int i=1; i<n; i++) if(x[i]>x[max]) max=i; //feltételezzük, hogy a 0 indexű elem a legnagyobb //a ciklus az 1 indexűtől indul //ha az i. elem nagyobb, akkor a max címkét ő kapja meg cout << Legnagyobb elem: << x[max]; LINEÁRIS KERESÉS! Példa: Adott egy N elemű x nevű tömb és egy T tulajdonság. Keressünk T tulajdonságú elemet! Ez az algoritmus, nevéből is adódóan, az elsőt fogja megadni, ha van. Az algoritmus C nyelven: int i=0; //a ciklus addig megy, amíg van még elem és az éppen vizsgált nem T tulajdonságú while(i<n &&!(x[i] T tulajdonságú) i++; if(i<n) cout << A megtalált elem: << x[i]; else cout << Nincs ilyen tulajdonságú elem! ; //ha a ciklus végére i<n igaz, akkor volt //ha nem, akkor nem volt ilyen elem! 13
14 EGYSZERŰ CSERÉS RENDEZÉS TÖBB RENDEZÉSI SZEMPONTTAL! Példa: Adott egy N elemű x nevű struktúra, például nev, magassag, testsuly mezőkkel. Feladat: rendezzük névsorba, azon belül pedig magasság szerint az adatokat! Az algoritmus C nyelven: struct adat string nev; int magassag, testsuly; x[n]; //Tegyük fel, hogy az x tömbben vannak adatok //Rendezés: for(int i=0; i<n-1; i++) //külső ciklus N-1-ig megy for(int j=i+1; j<n; j++) //belső ciklus mindig i+1-től N-ig if(x[i].nev>x[j].nev x[i].nev==x[j].nev&&x[i].magassag>x[j].magassag) swap(x[i], x[j]); //Ha sorrend nem jó, akkor csere 14
15 NÉHÁNY MŰVELET STRINGEKKEL Az alábbi programrészlet néhány alapvető stringműveletet illusztrál. #include <iostream> #include <string> #include <fstream> using namespace std; int main() setlocale(lc_all, "hun"); string s="próba szöveg - második rész"; string s2="csere"; char szov[10]; cout << "Eredeti szöveg: " << s << endl; cout << "s.size(): " << s.size() << endl; //szöveg hossza cout << "s.length(): " << s.length() << endl; //szöveg hossza cout << "Szövegben csere lesz: " << endl; cout << s.replace(15,7,s2) << endl; //15. karaktertől 7 karakter cseréje s2-re cout << "Új hosszúság: " << s.length() << endl; for(int i=0; i<s.length(); i++) s[i]=toupper(s[i]); //párja tolower() cout << "Most már nagybetűsen:" << endl; cout << s << endl; //Ékezetes betűk eltávolítása for(int i=0;i<s.length();i++) if(s[i]=='ö' s[i]=='ó' s[i]=='ő') s[i]='o'; if(s[i]=='ü' s[i]=='ű' s[i]=='ú') s[i]='u'; if(s[i]=='á') s[i]='a'; if(s[i]=='é') s[i]='e'; if(s[i]=='í') s[i]='i'; cout << "Ékezetmentesen:" << endl; cout << s << endl; int found; found=s.find('-'); string s_bal=s.substr(0,found); //részszöveg 0, found-ig string s_jobb=s.substr(found+2,s.length()); cout << "bal: " << s_bal << endl; cout << "jobb: " << s_jobb << endl; return 0; 15
16 NÉHÁNY HASZNOS ALGORITMUS LEGNAGYOBB KÖZÖS OSZTÓ, LEGKISEBB KÖZÖS TÖBBSZÖRÖS Két szám legnagyobb közös osztóját az EUKLIDESZI ALGORITMUS segítségével határozhatjuk meg. A legkisebb közös többszörös ebből már közvetlenül számolható: LKKT=a*b/LNKO(a,b). Az algoritmus a következő C nyelven: #include <iostream> using namespace std; int lnko(int a, int b) //EUKLIDÉSZI ALGORITMUS int x=0; while(b>0) x=a%b; a=b; b=x; return a; int lkkt(int a, int b) return (a*b)/lnko(a,b); int main() setlocale(lc_all, "hun"); int A, B; cout << "A="; cin >> A; cout << "B="; cin >> B; cout << A << " és " << B << " legnagyobb közös osztója: " << lnko(a,b) << endl; cout << A << " és " << B << " legkisebb közös többszöröse: " << lkkt(a,b) << endl; return 0; 16
17 PRÍMSZÁMOK LISTÁZÁSA Az algoritmus 2-től akármeddig kilistázza a prímszámokat. A lényeg: egy adott szám osztói a szám fele+1-nél kisebbek, ha vannak. Például 24 osztói: 2, 3, 4, 6, 8, 12 < 24/2+1. Ha a 17-et nézzük, ugye ez egy prímszám, akkor 17/2+1-ig, azaz 9-ig nem találunk egy osztót sem. A C nyelv szigorúan típusos nyelv, így az osztást (/) egész számok között úgy végzi el, hogy az eredmény is egész lesz. Pl.: 17/2=8 (A valós eredmény 8,5 lenne.) Az algoritmus C nyelven: #include <iostream> using namespace std; int main() int szamlalo; for(int i = 2; i < 1000; i++) if(szamlalo == 0) cout << i-1 << " "; //prímszám kiírása szamlalo = 0; //egy adott szám osztóit számlálja meg for(int j = 2; j < i/2 + 1; j++) //ha a szám feléig nem talál osztót, //akkor a szám prímszám, if(i%j == 0) //ha mégis talál, a szamlaloban számolja szamlalo++; //mennyi van 17
18 INFORMATIKA EMELT SZINT PROGRAMOZÁSI FELADATOK MEGOLDÁSA
19 2005. MÁJUS EMELT LOTTÓ
20 FELADAT SZÖVEGE Magyarországon 1957 óta lehet ötös lottót játszani. A játék lényege a következő: a lottószelvényeken 90 szám közül 5 számot kell a fogadónak megjelölnie. Ha ezek közül 2 vagy annál több megegyezik a kisorsolt számokkal, akkor nyer. Az évek során egyre többen hódoltak ennek a szerencsejátéknak és a nyeremények is egyre nőttek. Adottak a lottosz.dat szöveges állományban a év 51 hetének ötös lottó számai. Az első sorában az első héten húzott számok vannak, szóközzel elválasztva, a második sorban a második hét lottószámai vannak stb. Például: A lottószámok minden sorban emelkedő számsorrendben szerepelnek. Az állományból kimaradtak az 52. hét lottószámai. Ezek a következők voltak: Készítsen programot a következő feladatok megoldására! 1. Kérje be a felhasználótól az 52. hét megadott lottószámait! 2. A program rendezze a bekért lottószámokat emelkedő sorrendbe! A rendezett számokat írja ki a képernyőre! 3. Kérjen be a felhasználótól egy egész számot 1-51 között! A bekért adatot nem kell ellenőrizni! 4. Írja ki a képernyőre a bekért számnak megfelelő sorszámú hét lottószámait, a lottosz.dat állományban lévő adatok alapján! 5. A lottosz.dat állományból beolvasott adatok alapján döntse el, hogy volt-e olyan szám, amit egyszer sem húztak ki az 51 hét alatt! A döntés eredményét (Van/Nincs) írja ki a képernyőre! 6. A lottosz.dat állományban lévő adatok alapján állapítsa meg, hogy hányszor volt páratlan szám a kihúzott lottószámok között! Az eredményt a képernyőre írja ki! 7. Fűzze hozzá a lottosz.dat állományból beolvasott lottószámok után a felhasználótól bekért, és rendezett 52. hét lottószámait, majd írja ki az összes lottószámot a lotto52.ki szöveges fájlba! A fájlban egy sorba egy hét lottószámai kerüljenek, szóközzel elválasztva egymástól! 8. Határozza meg a lotto52.ki állomány adatai alapján, hogy az egyes számokat hányszor húzták ki 2003-ban. Az eredményt írja ki a képernyőre a következő formában: az első sor első eleme az a szám legyen ahányszor az egyest kihúzták! Az első sor második eleme az az érték legyen, ahányszor a kettes számot kihúzták stb.! (Annyit biztosan tudunk az értékekről, hogy mindegyikük egyjegyű.) Példa egy lehetséges eredmény elrendezésére (6 sorban, soronként 15 érték) Adja meg, hogy az 1-90 közötti prímszámokból melyiket nem húzták ki egyszer sem az elmúlt évben. A feladat megoldása során az itt megadott prímszámokat felhasználhatja vagy előállíthatja! (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89.) 20
21 FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS lsz[52][5] int 52x5-ös mátrix t[90] int 90 elemű tömb A lottosz.dat fájlban található adatok és a felhasználótól bekért 5 szám tárolása. Szerkezete az 52 hétnek felel meg, és a hetente kihúzott 5 számnak. A sorsolásokon a számok 1 és 90 közöttiek lehetnek. Ha kihúzott szám pl. 6, akkor a t tömb ennek megfelelő elemét kezeljük! globális globális primek[90] int 90 elemű tömb Sorsolt szám: 6 t[6-1] elem beállításra kerül. Lsd a megfelelő programrészt! 9. feladatban arra használjuk, hogy a prímszámú indexeken 0- ról 1-re állítjuk, a feladatmegoldáshoz így felhasználhatjuk! lokális 21
22 PROGRAMKÓD #include <iostream> #include <fstream> using namespace std; int lsz[52][5]; // ezek az indexek int t[90]; //maguk a kihúzott számok fogják indexelni ezt a tömböt!!! void F1() cout << "Kérem a hiányzó 52. hét számait:" << endl; //A hiányzó számokat beillesztjük a mátrixba, így a 7. feladat könnyű lesz!! for(int i=0;i<5;i++) cout << i+1 <<".szám:"; cin >> lsz[51][i]; void F2() //Egyszerű cserés rendezés for(int i=0;i<4;i++) for(int j=i+1;j<5;j++) if(lsz[51][i]>lsz[51][j]) swap(lsz[51][i],lsz[51][j]); 22
23 void F3_4() //3. és 4. feladat egyben ifstream f; f.open("lottosz.dat"); for(int i=0;i<51;i++) //sorok for(int j=0;j<5;j++) //oszlopok, azaz az 5 szám az adott sorban f >> lsz[i][j]; cout << lsz[i][j] << " "; cout << endl; f.close(); cout << "Kérek egy hetet (1-51):"; int het; cin >> het; for(int i=0;i<5;i++) cout << lsz[het-1][i] << " "; cout << endl; void F5() for(int i=0;i<90;i++) t[i]=0; //ez a cikluspár a 8. feladatot is megoldja!!! for(int i=0;i<51;i++) //51 a vége, mert ezt kéri a feladat for(int j=0;j<5;j++) t[lsz[i][j]-1]++; //lsz[i][j] a kihúzott szám most indexként működik (-1 az kell, tudjuk) bool nincs=true; //azt állítjuk, hogy nincs olyan, amit nem húztak ki for(int i=0;i<90;i++) if(t[i]==0) nincs=false; if(nincs) cout << "Minden számot kihúztak legalább egyszer!"; else cout << "Van olyan szám, amit egyszer sem húztak ki!"; cout << endl; 23
24 void F6() //Ha 2-vel osztva a maradék 1, akkor páratlan a szám, ha 0, akkor páros int ptlan=0; for(int i=0;i<51;i++) //51 a vége, mert ezt kéri a feladat for(int j=0;j<5;j++) if(lsz[i][j]%2==1) ptlan++; cout << "Páratlan számok száma: " << ptlan << endl; void F7() ofstream ki; ki.open("lotto52.ki"); for(int i=0;i<52;i++) //51 a vége, mert ezt kéri a feladat for(int j=0;j<5;j++) ki << lsz[i][j] << " "; ki << endl; ki.close(); void F8() for(int i=0;i<90;i++) if(i%15==0) cout << endl; cout << t[i] << " "; 24
25 void F9() int primek[90]; //t tömbbel "párhuzamos" tömb, csak a prímszámokat megjelöljük benne for(int i=0;i<90;i++) primek[i]=0; //primek tömb prímszám indexű(-1) elemeinek beállítása 1-re int szamlalo, prim; for(int i = 2; i < 90; i++) if(szamlalo == 0) prim=i-1; primek[prim-1]=1; szamlalo = 0; //egy adott szám osztóit számlálja meg for(int j = 2; j < i/2 + 1; j++) //ha a szám feléig nem talál osztót, //akkor a szám prímszám, if(i%j == 0) //ha mégis talál, a szamlaloban számolja szamlalo++; //mennyi van cout << endl << "Ezeket a prímszámokat nem húzták ki egyszer sem:" << endl; //Melyiket nem húzták ki? for(int i=0;i<90;i++) if(t[i]==0&&primek[i]==1) //0-t számoltunk korábban és prím is, akkor oké cout << i+1 << " "; int main() setlocale(lc_all, "hun"); cout << "Lottósorsolás" << endl; F1(); F2(); F3_4(); F5(); F6(); F7(); F8(); F9(); return 0; 25
26 2005. OKTÓBER EMELT VIGENÉRE
27 FELADAT SZÖVEGE Már a XVI. században komoly titkosítási módszereket találtak ki az üzenetek elrejtésére. A század egyik legjobb kriptográfusának Blaise de Vigenère-nek a módszerét olvashatja a következőkben. A kódoláshoz egy táblázatot és egy ún. kulcsszót használt. A táblázatot a jobb oldali ábra tartalmazza. A tábla adatait a vtabla.dat fájlban találja a következő formában. Készítsen programot kodol néven a következő feladatok végrehajtására! 1. Kérjen be a felhasználótól egy maximum 255 karakternyi, nem üres szöveget! A továbbiakban ez a nyílt szöveg. 2. Alakítsa át a nyílt szöveget, hogy a későbbi kódolás feltételeinek megfeleljen! A kódolás feltételei: A magyar ékezetes karakterek helyett ékezetmenteseket kell használni. (Például á helyett a; ő helyett o stb.) A nyílt szövegben az átalakítás után csak az angol ábécé betűi szerepelhetnek. A nyílt szöveg az átalakítás után legyen csupa nagybetűs. 3. Írja ki a képernyőre az átalakított nyílt szöveget! 4. Kérjen be a felhasználótól egy maximum 5 karakteres, nem üres kulcsszót! A kulcsszó a kódolás feltételeinek megfelelő legyen! (Sem átalakítás, sem ellenőrzés nem kell!) Alakítsa át a kulcsszót csupa nagybetűssé! 5. A kódolás első lépéseként fűzze össze a kulcsszót egymás után annyiszor, hogy az így kapott karaktersorozat (továbbiakban kulcsszöveg) hossza legyen egyenlő a kódolandó szöveg hosszával! Írja ki a képernyőre az így kapott kulcsszöveget! 6. A kódolás második lépéseként a következőket hajtsa végre! Vegye az átalakított nyílt szöveg első karakterét, és keresse meg a vtabla.dat fájlból beolvasott táblázat első oszlopában! Ezután vegye a kulcsszöveg első karakterét, és keresse meg a táblázat első sorában! Az így kiválasztott sor és oszlop metszéspontjában lévő karakter lesz a kódolt szöveg első karaktere. Ezt ismételje a kódolandó szöveg többi karakterével is! 7. Írja ki a képernyőre és a kodolt.dat fájlba a kapott kódolt szöveget! 27
28 FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS VT[26][26] char 26x26-os karaktermátrix A fájlban található Vigenére táblázat tárolása. globális nyers string Eredeti nyers szöveg globális kodolt string A nyers szöveg ékezetes betűk és egyéb írásjelek nélkül, csupa nagybetűvel globális k string Billentyűzetről beolvasott kulcs globális kulcs string A k kulcsból kodolt szöveg hoszszan globális felépített kulcs. Pl.: nyers= Ez a szövegem, amit kódolok! kodolt= EZASZOVEGEMAMITKODOLOK k= auto kulcs= AUTOAUTOAUTOAUTOAUTOAU eredmeny string Ebben alakul ki a végleges kódolt szöveg globális 28
29 PROGRAMKÓD #include <iostream> #include <fstream> #include <string> #include <windows.h> using namespace std; char VT[26][26]; string nyers, kodolt, k, kulcs, eredmeny; void kiir(string s) cout << s <<". feladat" << endl; void F123() //Első három feladat mehet egybe... cout << "Kérek egy szöveget: " << endl; getline(cin,nyers); kodolt=""; for(int i=0;i<nyers.length();i++) //magyar betűk switch(nyers[i]) case 'á': nyers[i]='a'; break; case 'Á': nyers[i]='a'; break; case 'é': nyers[i]='e'; break; case 'É': nyers[i]='e'; break; case 'ö': nyers[i]='o'; break; case 'Ö': nyers[i]='o'; break; case 'ó': nyers[i]='o'; break; case 'Ó': nyers[i]='o'; break; case 'ő': nyers[i]='o'; break; case 'Ő': nyers[i]='o'; break; case 'í': nyers[i]='i'; break; case 'Í': nyers[i]='i'; break; //Szóközök és egyéb írásjelek kimaradnak if((nyers[i]>='a' && nyers[i]<='z') (nyers[i]>='a' && nyers[i]<='z')) kodolt+=toupper(nyers[i]); cout << "Kódolt szöveg:" << endl; cout << kodolt << endl; 29
30 void F4() cout << "Kérem a kulcsot (max. 5 karakter): "; cin>> k; for(int i=0;i<k.length();i++) k[i]=toupper(k[i]); cout << "A kulcs: " << k << endl; void F5() //k kulcs ismétlése a kódolt szöveg hosszáig kulcs=""; //Egészben a k mehet a kulcsba... for(int i=0;i<kodolt.length()/k.length();i++) kulcs+=k; //Maradék karakterek mennek a kulcsba for(int i=0;i<kodolt.length()%k.length();i++) kulcs+=k[i]; cout << "A végleges kulcs:"; cout << kulcs << endl; void F67() ifstream V; V.open("Vtabla.dat"); int iindex,jindex; for(int i=0;i<26;i++) for(int j=0;j<26;j++) V>>VT[i][j]; V.close(); ofstream ki; ki.open("kodolt.dat"); eredmeny=""; //Ebbe "gyűjtjük" a karaktereket a VT mátrixból for(int i=0;i<kodolt.length();i++) iindex=(int)kodolt[i]-65; //nagy A betű ASCII kódja: 65!! jindex=(int)kulcs[i]-65; eredmeny+=vt[iindex][jindex]; cout << "A lekódolt szöveg:" << endl; ki << eredmeny; cout << eredmeny << endl; ki.close(); 30
31 int main() setlocale(lc_all, "hun"); kiir("1-3"); F123(); kiir("4"); F4(); kiir("5"); F5(); kiir("6-7"); F67(); return 0; 31
32 2006. FEBRUÁR EMELT TELEFONSZÁMLA
33 FELADAT SZÖVEGE Egy új szolgáltatás keretében ki lehet kérni a napi telefonbeszélgetéseink listáját. A listát egy fájlban küldik meg, amelyben a következő adatok szerepelnek: hívás kezdete, hívás vége, hívott telefonszám. A hívás kezdete és vége óra, perc, másodperc formában szerepel. Például A hívások listája időben rendezett módon tartalmazza az adatokat, és szigorúan csak egy napi adatot, azaz nincsenek olyan beszélgetések, amelyeket előző nap kezdtek vagy a következő napon fejeztek be. Továbbá az elmúlt időszak statisztikái alapján tudjuk, hogy a napi hívások száma nem haladja meg a kétszázat. A telefonálás díjait a következő táblázat foglalja össze. Hívásirány Csúcsidőben (Ft/perc) Csúcsidőn kívül és (Ft/perc) Vezetékes Mobil társaság 69,175 46,675 További fontos információk: A csúcsidő reggel 7:00:00-kor, a csúcsidőn kívüli időszak pedig 18:00:00-kor kezdődik. A díjazás számításakor az számít, hogy mikor kezdte az illető a beszélgetést. (Például: ha 17:55-kor kezdett egy beszélgetést, de azt 18:10-kor fejezte be, akkor is csúcsidőbeli díjakkal kell számlázni.) Minden megkezdett perc egy egész percnek számít. Minden telefonszám elején egy kétjegyű körzetszám, illetve mobil hívószám található. A mobil hívószámok: 39, 41, 71 kezdődnek, minden egyéb szám vezetékes hívószámnak felel meg. A következő feladatokat oldja meg egy program segítségével! A programot mentse szamla néven! 1. Kérjen be a felhasználótól egy telefonszámot! Állapítsa meg a program segítségével, hogy a telefonszám mobil-e vagy sem! A megállapítást írja ki a képernyőre! 2. Kérjen be továbbá egy hívás kezdeti és hívás vége időpontot óra perc másodperc formában! A két időpont alapján határozza meg, hogy a számlázás szempontjából hány perces a beszélgetés! A kiszámított időtartamot írja ki a képernyőre! 3. Állapítsa meg a hivasok.txt fájlban lévő hívások időpontja alapján, hogy hány számlázott percet telefonált a felhasználó hívásonként! A kiszámított számlázott perceket írja ki a percek.txt fájlba a következő formában! perc telefonszám Óra perc mperc Óra perc mperc Telefonszám Óra perc mperc Óra perc mperc Telefonszám 4. Állapítsa meg a hivasok.txt fájl adatai alapján, hogy hány hívás volt csúcsidőben és csúcsidőn kívül! Az eredményt jelenítse meg a képernyőn! 5. A hivasok.txt fájlban lévő időpontok alapján határozza meg, hogy hány percet beszélt a felhasználó mobil számmal és hány percet vezetékessel! Az eredményt jelenítse meg a képernyőn! 6. Összesítse a hivasok.txt fájl adatai alapján, mennyit kell fizetnie a felhasználónak a csúcsdíjas hívásokért! Az eredményt a képernyőn jelenítse meg! 33
34 FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS adat[200] hivasok típusú 200 elemű tömb, minden eleme egy adathetest tartalmaz struktúra 7 adatmezővel: 1-6. mező int ko hívás kezdő óra kp hívás kezdő perc km hívás kezdő másodperc vo hívás vége óra vp hívás vége perc vm hívás vége másodperc tsz telefonszám (string) A fájlban található adatok tárolása. globális N int hívások száma globális 34
35 PROGRAMKÓD #include <iostream> #include <fstream> #include <windows.h> #include <string> using namespace std; struct hivasok int ko, kp, km, vo, vp, vm; string tsz; adat[200]; int N; //Hívások száma void kiir(int ssz) cout << " " << endl; cout << ssz << ". feladat" << endl; cout << " " << endl; //Mivel a fő adataink globálisak itt nem is kellene paraméterátadás, de lássunk ilyet is!! :) bool mobil(string t) bool az=false; if(t.substr(0,2)=="39" t.substr(0,2)=="41" t.substr(0,2)=="71") az=true; return az; //Mivel a fő adataink globálisak itt nem is kellene paraméterátadás, de lássunk ilyet is!! :) int perc(int o1,int p1,int m1,int o2,int p2,int m2) int ido1=o1*3600+p1*60+m1; int ido2=o2*3600+p2*60+m2; int percek=(ido2-ido1)/60; //Minden megkezdett perc számít, így a maradékot is vizsgálni kell! if((ido2-ido1)%60!=0) percek++; return percek; 35
36 //Mivel a fő adataink globálisak itt nem is kellene paraméterátadás, de lássunk ilyet is!! :) bool csucsido(int ora) bool csucs=false; if(ora>=7&&ora<18) csucs=true; return csucs; /* A mobil, perc, csucsido függvények nagyban megkönnyítik a feladat megoldását. Érdemes ilyen "általános célú" függvényeket készíteni, ha több feladatrész is fel tudja használni! */ void F1() string tel; cout << "Kérek egy telefonszámot: "; cin >> tel; if(mobil(tel)) cout << "MOBILSZÁM!"; else cout << "NEM MOBILSZÁM!"; cout << endl; void F2() int k_o, k_p, k_m, v_o, v_p, v_m; cout << "Kérem a hívás adatait: "; cout << "Kezdés óra: "; cin >> k_o; cout << "Kezdés perc: "; cin >> k_p; cout << "Kezdés másodperc: "; cin >> k_m; cout << "Vége óra: "; cin >> v_o; cout << "Vége perc: "; cin >> v_p; cout << "Vége másodperc: "; cin >> v_m; cout << perc(k_o,k_p,k_m,v_o,v_p,v_m) << " perces volt!" << endl; 36
37 void F3() cout << "Adatok beolvasása és feldolgozása..." << endl; ifstream be; be.open("hivasok.txt"); ofstream ki; ki.open("percek.txt"); int i=0; while(!be.eof()) be >> adat[i].ko; be >> adat[i].kp; be >> adat[i].km; be >> adat[i].vo; be >> adat[i].vp; be >> adat[i].vm; be >> adat[i].tsz; ki << perc(adat[i].ko,adat[i].kp,adat[i].km,adat[i].vo,adat[i].vp,adat[i].vm) << " " << adat[i].tsz << endl; i++; N=i; cout << "Hívások száma: " << N << endl; ki.close(); be.close(); void F4() int db=0; for(int i=0;i<n;i++) if(csucsido(adat[i].ko)) db++; cout << "Csúcsidőben történt hívások száma: " << db << endl; cout << "Csúcsidőn kívül történt hívások száma: " << N-db << endl; void F5() int mperc=0, vperc=0; for(int i=0;i<n;i++) if(mobil(adat[i].tsz)) mperc+=perc(adat[i].ko,adat[i].kp,adat[i].km,adat[i].vo,adat[i].vp,adat[i].vm); else vperc+=perc(adat[i].ko,adat[i].kp,adat[i].km,adat[i].vo,adat[i].vp,adat[i].vm); cout << "Mobil hívások összesen: " << mperc << " perc" << endl; cout << "Vezetékes hívások összesen: " << vperc << " perc" << endl; 37
38 void F6() //Ez a feladat lehetne a 4-es és az 5-ös kombinációja, //ha általánosítjuk ezeket is, de most külön megoldjuk a 6. feladatot float fizet=0; int percek; for(int i=0;i<n;i++) //Csúcsdíjas időszakról van szó if(csucsido(adat[i].ko)) percek=perc(adat[i].ko,adat[i].kp,adat[i].km,adat[i].vo,adat[i].vp,adat[i].vm); //Mobil 69,175 Ft/perc. Vezetékes 30 Ft/perc if(mobil(adat[i].tsz)) fizet+=percek*69.175; else fizet+=percek*30; cout << "Csúcsdíjas hívásokért fizetendő: " << fizet << " Ft" << endl; int main() setlocale(lc_all, "hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); return 0; 38
39 2006. MÁJUS EMELT FEHÉRJE
40 FELADAT SZÖVEGE A fehérjék óriás molekulák, amelyeknek egy része az élő szervezetekben végbemenő folyamatokat katalizálják. Egy-egy fehérje aminosavak százaiból épül fel, melyek láncszerűen kapcsolódnak egymáshoz. A természetben a fehérjék fajtája több millió. Minden fehérje húszféle aminosav különböző menynyiségű és sorrendű összekapcsolódásával épül fel. Az alábbi táblázat tartalmazza az aminosavak legfontosabb adatait, a megnevezéseket és az őket alkotó atomok számát (az aminosavak mindegyike tartalmaz szenet, hidrogént, oxigént és nitrogént, néhányban kén is van): Neve Rövidítés Betűjele C H O N S Glicin Gly G Alanin Ala A Arginin Arg R Fenilalanin Phe F Cisztein Cys C Triptofán Trp W Valin Val V Leucin Leu L Izoleucin Ile I Metionin Met M Prolin Pro P Szerin Ser S Treonin Thr T Aszparagin Asn N Glutamin Gln Q Tirozin Tyr Y Hisztidin His H Lizin Lys K Aszparaginsav Asp D Glutaminsav Glu E Készítsen programot feherje néven, ami megoldja a következő feladatokat! Ügyeljen arra, hogy a program forráskódját a megadott helyre mentse! 1. Töltse be az aminosav.txt fájlból az aminosavak adatait! A fájlban minden adat külön sorban található, a fájl az aminosavak nevét nem tartalmazza. Ha az adatbetöltés nem sikerül, vegye fel a fenti táblázat alapján állandóként az első öt adatsort, és azzal dolgozzon! Az első néhány adat: Gly G Ala A
41 2. Határozza meg az aminosavak relatív molekulatömegét, ha a szén atomtömege 12, a hidrogéné 1, az oxigéné 16, a nitrogéné 14 és a kén atomtömege 32! Például a Glicin esetén a relatív molekulatömeg = 75. A következő feladatok eredményeit írja képernyőre, illetve az eredmeny.txt fájlba! A kiírást a feladat sorszámának feltüntetésével kezdje (például: 4. feladat)! 3. Rendezze növekvő sorrendbe az aminosavakat a relatív molekulatömeg szerint! Írja ki a képernyőre és az eredmeny.txt fájlba az aminosavak hárombetűs azonosítóját és a molekulatömeget! Az azonosítót és hozzátartozó molekulatömeget egy sorba, szóközzel elválasztva írja ki! 4. A bsa.txt a BSA nevű fehérje aminosav sorrendjét tartalmazza egybetűs jelöléssel. (A fehérjelánc legfeljebb 1000 aminosavat tartalmaz.) Határozza meg a fehérje összegképletét (azaz a C, H, O, N és S számát)! A meghatározásánál vegye figyelembe, hogy az aminosavak összekapcsolódása során minden kapcsolat létrejöttekor egy vízmolekula (H2O) lép ki! Az összegképletet a képernyőre és az eredmeny.txt fájlba az alábbi formában írja ki: Például: C H O 4234 N 8210 S 2231 (Amennyiben a bsa.txt beolvasása sikertelen, helyette tárolja a G, A, R, F, C betűjeleket tízszer egymás után és a feladatokat erre a láncra oldja meg!) 5. A fehérjék szekvencia szerkezetét hasításos eljárással határozzák meg. Egyes enzimek bizonyos aminosavak után kettéhasítják a fehérjemolekulát. Például a Kimotripszin enzim a Tirozin (Y), Fenilalanin (W) és a Triptofán (F) után hasít. Határozza meg, és írja ki képernyőre a Kimotripszin enzimmel széthasított BSA lánc leghosszabb darabjának hosszát és az eredeti láncban elfoglalt helyét (első és utolsó aminosavának sorszámát)! A kiíráskor nevezze meg a kiírt adatot, például: kezdet helye:! 6. Egy másik enzim (a Factor XI) az Arginin (R) után hasít, de csak akkor, ha Alinin (A) vagy Valin (V) követi. Határozza meg, hogy a hasítás során keletkező első fehérjelánc részletben hány Cisztein (C) található! A választ teljes mondatba illesztve írja ki a képernyőre! 41
42 FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS aminosav[20] BSA[1000] adatok típusú 20 elemű tömb, minden eleme egy adat- nyolcast tartalmaz char típusú maximum 1000 elemből álló tömb struktúra 8 adatmezővel: ko hívás kezdő óra r rövid név (string) b betűjel (char) c szén h hidrogén o oxigén n nitrogén s kén rm realatív molekulatömeg (ezek a mezők int típusúak) A fájlban található adatok tárolása. A 3. feladatban történő rendezés miatt vesszük bele a struktúrába az rm mezőt. BSA.txt fájl tartalmának tárolása, a 4. feladattól kerül felhasználásra. bsa_lh int BSA lánc hossza, 4. feladat. globális globális globális 42
43 PROGRAMKÓD #include <iostream> #include <iomanip> #include <fstream> #include <windows.h> #include <string> #define C 12 #define H 1 #define O 16 #define N 14 #define S 32 using namespace std; struct adatok string r; char b; int c, h, o, n, s; int rm; aminosav[20]; char BSA[1000]; int bsa_lh; void kiir(int ssz) cout << " " << endl; cout << ssz << ". feladat" << endl; cout << " " << endl; int szamol(int index) int rel_mol; rel_mol=aminosav[index].c*c+aminosav[index].h*h+aminosav[index].o*o+aminosav[index].n* N+aminosav[index].s*S; aminosav[index].rm=rel_mol; return rel_mol; 43
44 void F1() cout << "Adatok beolvasása..." << endl; ifstream be; be.open("aminosav.txt"); for(int i=0;i<20;i++) be >> aminosav[i].r; be >> aminosav[i].b; be >> aminosav[i].c; be >> aminosav[i].h; be >> aminosav[i].o; be >> aminosav[i].n; be >> aminosav[i].s; cout << aminosav[i].r << " " << aminosav[i].b << " " << aminosav[i].c << " "; cout << aminosav[i].h << " " << aminosav[i].o << " " << aminosav[i].n << " "; cout << aminosav[i].s << endl; be.close(); void F2() cout << "Relatív molekulatömegek meghatározása:" << endl; for(int i=0;i<20;i++) cout << aminosav[i].r << ": " << setw(3) << szamol(i) << endl; void F3() ofstream ki; ki.open("eredmeny.txt"); cout << "Relatív molekulatömegek növekvő sorrendben:" << endl; for(int i=0;i<19;i++) for(int j=i+1;j<20;j++) if(aminosav[i].rm>aminosav[j].rm) swap(aminosav[i], aminosav[j]); for(int i=0;i<20;i++) cout << aminosav[i].r << " " << aminosav[i].rm << endl; ki << aminosav[i].r << " " << aminosav[i].rm << endl; ki.close(); 44
45 void F4() ofstream ki; ki.open("eredmeny.txt", fstream::app); ifstream be; be.open("bsa.txt"); int i=0, index; int c_db=0, h_db=0, o_db=0, n_db=0, s_db=0; while(!be.eof()) be >> BSA[i]; index=0; //keressük meg a lánc adott betűjét az aminosavak között!! while(bsa[i]!=aminosav[index].b) index++; //BIZTOSAN MEGFOGJUK TALÁLNI! c_db+=aminosav[index].c; h_db+=aminosav[index].h; o_db+=aminosav[index].o; n_db+=aminosav[index].n; s_db+=aminosav[index].s; i++; bsa_lh=i-1; cout << "BSA lánc hossza: " << bsa_lh << endl; o_db=o_db-bsa_lh; //H2O kivonása h_db=h_db-2*bsa_lh; cout << "C " << c_db << " H " << h_db << " O " << o_db << " N " << n_db << " S " << s_db << endl; ki << "C " << c_db << " H " << h_db << " O " << o_db << " N " << n_db << " S " << s_db << endl; be.close(); ki.close(); 45
46 void F5() ofstream ki; ki.open("eredmeny.txt", fstream::app); int darabhossz=0, kezdete, vege, maxhossz=0; for(int i=0;i<bsa_lh;i++) darabhossz++; if(bsa[i]=='y' BSA[i]=='W' BSA[i]=='F') // cout << i << BSA[i] << endl; (Ellenőrzéshez volt jó ez a kiírás!!) if(maxhossz<darabhossz) maxhossz=darabhossz; vege=i; darabhossz=0; kezdete=vege-maxhossz+1; endl; cout << "Kezdet helye: " << kezdete << " Vége helye: " << vege << " Hossza: " << maxhossz << ki << "Kezdet helye: " << kezdete << " Vége helye: " << vege << " Hossza: " << maxhossz << endl; ki.close(); //Arginin (R) után hasít, de csak akkor, ha Alinin (A) vagy Valin (V) követi. void F6() ofstream ki; ki.open("eredmeny.txt", fstream::app); int i=0; while(!((bsa[i]=='r'&&bsa[i+1]=='a') (BSA[i]=='R'&&BSA[i+1]=='V'))) i++; int c_db=0; int eddig=i; for(int j=0;j<eddig;j++) if(bsa[j]=='c') c_db++; cout << "Az első fehérjelánc részletben " << c_db << " Cisztein (C) található!" << endl; ki.close(); 46
47 int main() setlocale(lc_all, "hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); return 0; 47
48 2006. OKTÓBER EMELT ZENEI ADÓK
49 FELADAT SZÖVEGE A rádióhallgatás ma már egyre inkább zene vagy hírek hallgatására korlátozódik. Ez a feladat három, folyamatosan zenét sugárzó adóról szól, azok egyetlen napi műsorát feldolgozva. A reklám elkerülése érdekében az adókat nevük helyett egyetlen számmal azonosítottuk. A musor.txt állomány első sorában az olvasható, hogy hány zeneszám (z<=1000) szólt aznap a rádiókban, majd ezt z darab sor követi. Minden sor négy, egymástól egyetlen szóközzel elválasztott adatot tartalmaz: a rádió sorszámát, amit a szám hossza követ két egész szám (perc és másodperc) formában, majd a játszott szám azonosítója szerepel, ami a szám előadójából és címéből áll. A rádió sorszáma az 1, 2, 3 számok egyike. Az adás minden adón 0 óra 0 perckor kezdődik. Egyik szám sem hosszabb 30 percnél, tehát a perc értéke legfeljebb 30, a másodperc pedig legfeljebb 59 lehet. A szám azonosítója legfeljebb 50 karakter hosszú, benne legfeljebb egy kettőspont szerepel, ami az előadó és a cím között található. A számok az elhangzás sorrendjében szerepelnek az állományban, tehát a később kezdődő szám későbbi sorban található. Az állományban minden zeneszám legfeljebb egyszer szerepel. Például: Deep Purple:Bad Attitude Eric Clapton:Terraplane Blues Eric Clapton:Crazy Country Hop Omega:Ablakok Készítsen programot zene néven, amely az alábbi kérdésekre válaszol! Ügyeljen arra, hogy a program forráskódját a megadott helyre mentse! 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:). Ha a billentyűzetről olvas be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár. Az adatszerkezet készítése során vegye figyelembe az Ön által használt programozási környezetben az adatok tárfoglalási igényét! 1. Olvassa be a musor.txt állományban talált adatokat, s annak felhasználásával oldja meg a következő feladatokat! Ha az állományt nem tudja beolvasni, akkor a forrás első 10 sorának adatait jegyezze be a programba, s úgy oldja meg a következő feladatokat! 2. Írja a képernyőre, hogy melyik csatornán hány számot lehetett meghallgatni! 3. Adja meg, mennyi idő telt el az első Eric Clapton szám kezdete és az utolsó Eric Clapton szám vége között az 1. adón! Az eredményt óra:perc:másodperc formában írja a képernyőre! 4. Amikor az Omega:Legenda című száma elkezdődött, Eszter rögtön csatornát váltott. Írja a képernyőre, hogy a szám melyik adón volt hallható, és azt, hogy a másik két adón milyen számok szóltak ekkor. Mivel a számok a kezdés időpontja szerint növekvő sorrendben vannak, így a másik két adón már elkezdődött a számok lejátszása. Feltételezheti, hogy a másik két adón volt még adás. 49
50 5. Az egyik rádióműsorban sms-ben, telefonon, de akár képeslapon is kérhető szám. Ám a sokszor csak odafirkált kéréseket olykor nehéz kibetűzni. Előfordul, hogy csak ennyi olvasható: gaoaf, tehát ezek a betűk biztosan szerepelnek, mégpedig pontosan ebben a sorrendben. Annyi biztos, hogy először a szerző neve szerepel, majd utána a szám címe. Olvassa be a billentyűzetről a felismert karaktereket, majd írja a keres.txt állományba azokat a számokat, amelyek ennek a feltételnek megfelelnek. Az állomány első sorába a beolvasott karaktersorozat, majd utána soronként egy zeneszám azonosítója kerüljön! A feladat megoldása során ne különböztesse meg a kis- és a nagybetűket! 6. Az 1. adón változik a műsor szerkezete: minden számot egy rövid, egyperces bevezető előz majd meg, és műsorkezdéstől minden egész órakor 3 perces híreket mondanak. Természetesen minden szám egy részletben hangzik el továbbra is, közvetlenül a bevezető perc után. Így ha egy szám nem fejeződne be a hírekig, el sem kezdik, az üres időt a műsorvezető tölti ki. Írja a képernyőre óra:perc:másodperc formában, hogy mikor lenne vége az adásnak az új műsorszerkezetben! FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS adat[1000] zene típusú 1000 elemű tömb, minden eleme egy adat-ötöst tartalmaz struktúra 5 adatmezővel: r rádió sorszáma (int) p perc (int) mp másodperc (int) eloado (előadó neve (string) cim dal címe (string) A fájlban található adatok tárolása. Az előadó és dalcím szöveget szétbontjuk az első (F1) feladatban N int musor.txt első sorában található szám, a zeneszámok száma globális globális 50
51 PROGRAMKÓD #include <iostream> #include <fstream> #include <windows.h> #include <string> using namespace std; struct zene int r, p, mp; //r - rádió sorszáma, p - perc <=30, mp - másodperc<=59 string eloado, cim; adat[1000]; int N; //zeneszámok száma void kiir(int ssz) cout << " " << endl; cout << ssz << ". feladat" << endl; cout << " " << endl; void szamoldki(int x) int ora, perc, mp, m; ora=x/3600; m=x%3600; perc=m/60; mp=m%60; //6. feladat miatt kell ez az if-es játék if(ora==0) cout << perc << ":" << mp << endl; else cout << ora << ":" << perc << ":" << mp << endl; void F1() ifstream be; be.open("musor.txt"); be >> N; for(int i=0;i<n;i++) be >> adat[i].r; be >> adat[i].p; be >> adat[i].mp; getline(be, adat[i].eloado,':'); getline(be, adat[i].cim); //LEVESSZÜK AZ ELŐADÓ NEVE ELŐTTI FELESLEGES SZÓKÖZT!! adat[i].eloado.erase(0,1); //0. karaktertől 1 karakter törlése be.close(); 51
52 void F2() int db1=0, db2=0, db3=0; for(int i=0;i<n;i++) switch(adat[i].r) case 1: db1++; break; case 2: db2++; break; case 3: db3++; break; cout << "1. rádió: " << db1 << " zeneszám" << endl; cout << "2. rádió: " << db2 << " zeneszám" << endl; cout << "3. rádió: " << db3 << " zeneszám" << endl; void F3() int elso, utolso; //Első ERIC CLAPTON szám keresése az 1-es rádión int i=0; while(i<n&&!(adat[i].r==1&&adat[i].eloado=="eric Clapton")) i++; if(i<n) elso=i; else elso=-1; //Utolsó ERIC CLAPTON szám keresése az 1-es rádión i=n-1; while(i>=0&&!(adat[i].r==1&&adat[i].eloado=="eric Clapton")) i--; if(i>=0) utolso=i; else utolso=-1; /* Ez könnyen lehet, hogy felesleges, mert feltételezhetjük, hogy van legalább 2 Eric Clapton szám az 1-es rádión!! */ int masodperc=0; if(elso!=-1&&utolso!=-1) for(int i=elso;i<utolso;i++) if(adat[i].r==1) masodperc=masodperc+adat[i].p*60+adat[i].mp; szamoldki(masodperc); 52
53 void F4() // Megkeressük az Omega-számot és az előtte lévő másik adók számai kellenek string aktualis_e[3]="", "", ""; string aktualis_c[3]="", "", ""; int i=0; int omega; while(i<n&&!(adat[i].eloado=="omega"&&adat[i].cim=="legenda")) //Ahogy haladunk előre a keresésben, ezekben a tömbökben //rögzítjük, hogy éppen mi szól az egyes adókon aktualis_e[adat[i].r-1]=adat[i].eloado; aktualis_c[adat[i].r-1]=adat[i].cim; i++; omega=adat[i].r; cout << "Az Omega:Legenda szám a(z) " << omega << ". rádión ment" << endl; for(int i=0;i<3;i++) //Ha nem az Omega csatornáján vagyunk, akkor kiírjuk a címeket! if(i!=omega-1) cout << "A(z) " << i+1 << ". adón a következő szám szólt: " << aktualis_e[i] << ":" << aktualis_c[i] << endl; void F5() ofstream ki; ki.open("keres.txt"); string reszlet; string egyben; //Össze kell fűznünk az előadót és a címet cout << "Kérem az ismert részletet: "; cin >> reszlet; ki << reszlet << endl; int egyezes; //ebben nezzük hány betű egyezik a reszletből az aktuális műsorszám betűivel for(int i=0;i<n;i++) egyben=adat[i].eloado+adat[i].cim; //összefűzés egyezes=0; for(int j=0;j<egyben.length();j++) //végig megyünk az aktuális zeneszám betűin if(toupper(reszlet[egyezes])==toupper(egyben[j])) egyezes++; //Ha az egyezések száma megegyezik a részlet karaktereinek számával, akkor az jó if(egyezes==reszlet.length()) cout << adat[i].eloado << ":" << adat[i].cim << endl; ki << adat[i].eloado << ":" << adat[i].cim << endl; ki.close(); 53
54 void F6() int ujido=180; //Feltéve, hogy 3 perces hírműsorral indulnak int dalhossz, ora=0; for(int i=0;i<n;i++) if(adat[i].r==1) dalhossz=60+adat[i].p*60+adat[i].mp; //Plusz 1 perc bevezető if(ujido+dalhossz>3600) //Túllépné az egész órát //Ha túllépnénk az egész órát, akkor //180 mp hírek és utána játszák le a dalt ujido=180+dalhossz; //És így egy újabb óra eltelt ora++; else cout << ora << ":"; szamoldki(ujido); //a fenti miatt az ujidoben csak az egész óra utáni másodpercek lesznek ujido+=dalhossz; int main() setlocale(lc_all, "hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); return 0; 54
55 2007. MÁJUS EMELT SMS SZAVAK
56 FELADAT SZÖVEGE Napjainkban a kommunikáció egy elterjedt formája az SMS-küldés. Az SMS-küldésre alkalmas telefonok prediktív szövegbevitellel segítik az üzenetek megírását. Ennek használatakor a szavakat úgy tudjuk beírni, hogy a telefon számbillentyűjén található betűknek megfelelő számokat kell beírnunk. A számok és betűk megfeleltetését az alábbi táblázat mutatja: Ha meg szeretnénk jeleníteni az ablak szót, akkor a kódot kell beírnunk. A telefon a tárolt szótára alapján a kódhoz kikeresi a megfelelő szót. Ha több szóhoz is azonos kód tartozik, akkor a kódhoz tartozó összes szót felkínálja választásra. Egy ilyen szógyűjteményt talál a szavak.txt fájlban. A fájlról a következőket tudjuk: Legfeljebb 600 szó található benne. Minden szó külön sorban található. A szavak hossza maximum 15 karakter. A szavak mindegyike csak az angol ábécé kisbetűit tartalmazza. Minden szó legfeljebb egyszer szerepel. Írjon sms néven programot, ami a szógyűjtemény felhasználásával megoldja az alábbi feladatokat! 1. Kérjen be a felhasználótól egy betűt, és adja meg, hogy milyen kód (szám) tartozik hozzá! Az eredményt írassa a képernyőre! 2. Kérjen be a felhasználótól egy szót, és határozza meg, hogy milyen számsorral lehet ezt a telefonba bevinni! Az eredményt írassa a képernyőre! 3. Olvassa be a szavak.txt fájlból a szavakat, és a továbbiakban azokkal dolgozzon! Ha nem tudja az állományból beolvasni az adatokat, akkor az állományban található b kezdőbetűs szavakat gépelje be a programba, és azokkal oldja meg a feladatokat! 4. Határozza meg és írassa a képernyőre, hogy melyik a leghosszabb tárolt szó! Amennyiben több azonos hosszúságú van, elegendő csak az egyiket megjeleníteni. Adja meg ennek a szónak a hosszát is! 5. Határozza meg és írassa a képernyőre, hogy hány rövid szó található a fájlban! Rövid szónak tekintjük a legfeljebb 5 karakterből álló szavakat. 6. Írassa a kodok.txt állományba a szavak.txt fájlban található szavaknak megfelelő számkódokat! Minden szónak feleljen meg egy számkód, és minden számkód külön sorba kerüljön! 7. Kérjen be a felhasználótól egy számsort, és határozza meg, hogy melyik szó tartozhat hozzá! Amennyiben több szó is megfelelő, akkor mindegyiket írassa ki! (Teszteléshez használhatja például a 225 számsort, mivel ehhez egynél több szó tartozik a szógyűjteményben.) 8. Határozza meg, hogy a szógyűjteményben mely kódokhoz tartozik több szó is! Írassa ki a képernyőre ezeket a szavakat a kódjukkal együtt egymás mellé az alábbi mintának megfelelően (a szavak sorrendje ettől eltérhet): baj : 225; bal : 225; arc : 272; apa : 272; eb : 32; fa : 32; dal : 325; fal : 3 25; eltesz : ; elvesz : ; fojt : 3658; folt : 3658;... 56
57 9. Határozza meg, hogy melyik kódnak megfelelő szóból van a legtöbb! Írassa ki a képernyőre a kódot, és a kódhoz tartozó összes tárolt szót! Ha több kódhoz is azonos számú szó tartozik, akkor elegendő ezen kódok közül csak az egyikkel foglalkozni. FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS szavak[600] string 600 elemű tömb kodok[600] string 600 elemű tömb A fájlban található szavak tárolása minden szóhoz egy kódszó tartozik, szintén stringként kezelhetjük, mivel számolni nem kell vele globális globális N int A fájlban található szavak száma globális melyik int A 8. és 9. feladatban használjuk. A legtöbb szóval rendelkező kód indexe a kodok tömbben globális 57
58 PROGRAMKÓD #include <iostream> #include <fstream> #include <windows.h> #include <string> using namespace std; string szavak[600]; string kodok[600]; int N; //beolvasott szavak száma int melyik; //8. és 9. feladathoz, a leggyakoribb kód indexe void kiir(int ssz) cout << " " << endl; cout << ssz << ". feladat" << endl; cout << " " << endl; char kodolas(char betu) char kod; betu=tolower(betu); //karakter kisbetűsre állítása, párja: toupper if(betu=='a' betu=='b' betu=='c') kod='2'; if(betu=='d' betu=='e' betu=='f') kod='3'; if(betu=='g' betu=='h' betu=='i') kod='4'; if(betu=='j' betu=='k' betu=='l') kod='5'; if(betu=='m' betu=='n' betu=='o') kod='6'; if(betu=='p' betu=='q' betu=='r' betu=='s') kod='7'; if(betu=='t' betu=='u' betu=='v') kod='8'; if(betu=='w' betu=='x' betu=='y' betu=='z') kod='9'; return kod; string szokodolas(string szo) string s=""; for(int i=0;i<szo.length();i++) s=s+kodolas(szo[i]); return s; 58
59 void F1() char betu; cout << "Kérek egy betűt: "; cin >> betu; cout << "A(z) '" << betu << "' betű kódja: " << kodolas(betu) << endl; void F2() string szo; cout << "Kérek egy szót: "; cin >> szo; cout << "Kódolása: "; for(int i=0;i<szo.length();i++) cout << kodolas(szo[i]); cout << endl; void F3() ifstream be; be.open("szavak.txt"); int i=0; while(!be.eof()) be >> szavak[i]; i++; N=i; be.close(); cout << "Beolvasott szavak száma: " << N << endl; void F4() int melyik=0; // melyik - a leghosszabb szó indexe lesz for(int i=1;i<n;i++) // A ciklus i=1-től, azaz a másodiktól indul! endl; if(szavak[i].length()>szavak[melyik].length()) melyik=i; cout << "A leghosszabb szó: '" << szavak[melyik] << "', hossza: " << szavak[melyik].length() << 59
60 void F5() int h=5; int rovid_db=0; for(int i=0;i<n;i++) if(szavak[i].length()<=h) rovid_db++; cout << "Rövid szavak száma: " << rovid_db << endl; void F6() ofstream ki; ki.open("kodok.txt"); for(int i=0;i<n;i++) ki.close(); kodok[i]= szokodolas(szavak[i]); ki << kodok[i] << endl; //fájlba void F7() string kodszo; cout << "Kérek egy kódot: "; cin >> kodszo; bool volt=false; for(int i=0;i<n;i++) if(kodszo==kodok[i]) cout << szavak[i] << endl; volt=true; if(!volt) cout << "Ilyen kódra nincs szavunk!" << endl; 60
61 void F8() //Rendezéssel oldjuk meg, és 9. feladatot is előkészítjük int max=0; for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if(kodok[i]>kodok[j]) swap(kodok[i],kodok[j]); swap(szavak[i],szavak[j]); bool van_meg; //Ha lesz egy szónak minimum egy párja, akkor ez igaz lesz vagy nem! for(int i=0;i<n-1;i++) int darab=1; //9. feladathoz, melyikből van a legtöbb darab van_meg=false; //Amíg az adott szó azonos a következővel írjuk ki while(kodok[i]==kodok[i+1]) van_meg=true; cout << szavak[i] << " : " << kodok[i] << "; "; i++; //A ciklusváltozót ne felejtsük el továbbvinni darab++; //számoljuk hány darab van belőle //A while ciklus az utolsó azonost nem írja ki, így a van_meg dönt kell-e még egy kiírás, if(van_meg) cout << szavak[i] << " : " << kodok[i] << "; "; if(darab>max) melyik=i; max=darab; cout << endl; void F9() cout << "Leggyakoribb kód: " << kodok[melyik] << endl; cout << "A kódhoz tartozó szavak:" << endl; for(int i=0;i<n;i++) if(kodok[i]==kodok[melyik]) cout << szavak[i] << endl; 61
62 int main() setlocale(lc_all, "hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); kiir(7); F7(); kiir(8); F8(); kiir(9); F9(); return 0; 62
63 2007. OKTÓBER EMELT FOCI
64 FELADAT SZÖVEGE Perec város sportéletében fontos szerepet játszanak a fiatalok nagypályás labdarúgó mérkőzései. Tavasszal minden csapat minden csapattal pontosan egy mérkőzést játszott. A folyamatosan vezetett eredménylista azonban eltűnt, így csak a mérkőzések jegyzőkönyvei álltak rendelkezésre. A jegyzőkönyveket ismételten feldolgozták, ehhez első lépésként a meccs.txt állományba bejegyeztek néhány adatot. Önnek ezzel az állománnyal kell dolgoznia. A meccs.txt állomány első sorában az állományban tárolt mérkőzések száma található. Alatta minden sorban egy-egy mérkőzés adatai olvashatók. Egy mérkőzést 7 adat ír le. Az első megadja, hogy a mérkőzést melyik fordulóban játszották le. A második a hazai, a harmadik a vendégcsapat góljainak száma a mérkőzés végén, a negyedik és ötödik a félidőben elért gólokat jelöli. A hatodik szöveg a hazai csapat neve, a hetedik a vendégcsapat neve. Az egyes adatokat egyetlen szóköz választja el egymástól. A sor végén nincs szóköz. A csapatok és a fordulók száma nem haladja meg a 20, a mérkőzések száma pedig a 400 értéket. Egy csapat sem rúgott meccsenként 9 gólnál többet. A csapatok neve legfeljebb 20 karakter hosszú, a névben nincs szóköz. Például: Agarak Ovatosak Erosek Agarak Ijedtek Hevesek Ijedtek Nyulak Lelkesek Bogarak Fineszesek Csikosak Pechesek Csikosak Csikosak Kedvesek Nyulak Lelkesek Ovatosak Nyulak Az 2. sor mutatja, hogy a 14. fordulóban az otthon játszó Agarakat az Óvatosak 2-1-re megverték úgy, hogy a félidőben már vezettek 2-0-ra. Készítsen programot, amely az alábbi kérdésekre válaszol! A program forráskódját mentse foci néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie.) 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:). Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! 1. Olvassa be a meccs.txt állományban talált adatokat, s annak felhasználásával oldja meg a következő feladatokat! Ha az állományt nem tudja beolvasni, az első 10 mérkőzés adatait jegyezze be a programba és dolgozzon azzal! 2. Kérje be a felhasználótól egy forduló számát, majd írja a képernyőre a bekért forduló mérkőzéseinek adatait a következő formában: Edes-Savanyu: 2-0 (1-0)! Soronként egy mérkőzést tüntessen fel! A különböző sorokban a csapatnevek ugyanazon a pozíción kezdődjenek! Például: Edes-Savanyu: 2-0 (1-0) Ijedtek-Hevesek: 0-2 (0-2)... 64
65 3. Határozza meg, hogy a bajnokság során mely csapatoknak sikerült megfordítaniuk az állást a második félidőben! Ez azt jelenti, hogy a csapat az első félidőben vesztésre állt ugyan, de sikerült a mérkőzést megnyernie. A képernyőn soronként tüntesse fel a forduló sorszámát és a győztes csapat nevét! 4. Kérje be a felhasználótól egy csapat nevét, és tárolja el! A következő két feladat megoldásához ezt a csapatnevet használja! Ha nem tudta beolvasni, használja a Lelkesek csapatnevet! 5. Határozza meg, majd írja ki, hogy az adott csapat összesen hány gólt lőtt és hány gólt kapott! Például: lőtt: 23 kapott: Határozza meg, hogy az adott csapat otthon melyik fordulóban kapott ki először és melyik csapattól! Ha egyszer sem kapott ki (ilyen csapat például a Bogarak), akkor A csapat otthon veretlen maradt. szöveget írja a képernyőre! 7. Készítsen statisztikát, amely megadja, hogy az egyes végeredmények hány alkalommal fordultak elő! Tekintse egyezőnek a fordított eredményeket (például 4-2 és 2-4)! A nagyobb számot mindig előre írja! Az elkészült listát a stat.txt állományban helyezze el! Például: 2-1: 18 darab 4-0: 2 darab 2-0: 19 darab... FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS t[400] merkozes típusú 400 elemű tömb, minden eleme egy adat- hetest tartalmaz struktúra 7 adatmezővel: f forduló sorszáma hg hazai lőtt gólok száma vg vendég gólok száma fhg félidei hazai gólok fvg félidei vendég gólok h hazai csapat v - vendégcsapat A fájlban található adatok tárolása. globális N int mérkőzések száma globális csn string csapatnév a 4. és 5. feladathoz e[10][10] int 10x10-es mátrix a különböző lehetséges eredmények számolásához kell. Az indexei az egyes eredményeket képviselik. Pl.: e[2][1] 2-1-es eredmények gyűjtője globális globális 65
66 PROGRAMKÓD #include <iostream> #include <fstream> #include <string> #include <windows.h> using namespace std; //a meccs.txt 1-1 sora struct merkozes int f, hg, vg, fhg, fvg; string h, v; t[400]; int N; //mérközések száma string csn; void kiir(int s) cout << "..." << endl; cout << s << ". feladat" << endl; cout << "..." << endl; void F1() ifstream meccs; meccs.open("meccs.txt"); meccs >> N; for(int i=0;i<n;i++) meccs >> t[i].f; meccs >> t[i].hg; meccs >> t[i].vg; meccs >> t[i].fhg; meccs >> t[i].fvg; meccs >> t[i].h; meccs >> t[i].v; cout << t[i].f << " " << t[i].hg << " " << t[i].vg << " " << t[i].fhg << " " << t[i].fvg << " " << t[i].h << " " << t[i].v << endl; meccs.close(); 66
67 void F2() int fs; cout << "Forduló sorszáma: "; cin >> fs; for(int i=0;i<n;i++) if(t[i].f==fs) cout << t[i].h << "-" << t[i].v << ": "; cout << t[i].hg << "-" << t[i].vg << " ("; cout << t[i].fhg << "-" << t[i].fvg << ")" << endl; void F3() for(int i=0;i<n;i++) if(t[i].fhg<t[i].fvg&&t[i].hg>t[i].vg) cout << t[i].f << " " << t[i].h << endl; if(t[i].fhg>t[i].fvg&&t[i].hg<t[i].vg) cout << t[i].f << " " << t[i].v << endl; void F4() cout << "Kérek egy csapat nevet: "; cin >> csn; void F5() int lg=0; //összes lőtt gól int kg=0; //összes kapott gólja for(int i=0;i<n;i++) if(t[i].h==csn) lg=lg+t[i].hg; kg=kg+t[i].vg; if(t[i].v==csn) lg=lg+t[i].vg; kg=kg+t[i].hg; cout << "lőtt: " << lg << " kapott: " << kg << endl; 67
68 void F6() for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if(t[i].f>t[j].f) swap(t[i],t[j]); /* for(int i=0;i<n;i++) cout << t[i].f << " " << t[i].hg << " " << t[i].vg << " " << t[i].fhg << " " << t[i].fvg << " " << t[i].h << " " << t[i].v << endl; */ int i=0; while(i<n&&!(t[i].h==csn&&t[i].hg<t[i].vg)) i++; if(i<n) cout << t[i].f << ". fordulóban... a(z) " << t[i].v << " csapattól"; else cout << "A csapat otthon veretlen maradt!"; cout << endl; 68
69 void F7() int e[10][10]; for(int i=0;i<10;i++) for(int j=0;j<10;j++) e[i][j]=0; int s,o; for(int i=0;i<n;i++) if(t[i].hg>t[i].vg) s=t[i].hg; o=t[i].vg; else s=t[i].vg;o=t[i].hg; e[s][o]++; //Kiírjuk az eredményt for(int i=0;i<10;i++) for(int j=0;j<10;j++) if(e[i][j]>0) cout << i << "-" << j << ": " << e[i][j] << " db" << endl; int main() setlocale(lc_all, "hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); kiir(7); F7(); return 0; 69
70 2008. MÁJUS EMELT SMS
71 FELADAT SZÖVEGE Esemes Ernő szenvedélyes SMS-küldő, ezért a MaMobil nevű cég tesztelésre kérte fel. Ehhez egy új, kézreálló telefont adnak, amelynek tesztüzemben egyetlen hátránya, hogy legfeljebb az először érkező 10 darab, egyenként legfeljebb 100 karakteres üzenetet tud eltárolni. Ha ettől több üzenet van, akkor azokat korlátlan számban a szolgáltató őrzi meg a hangpostához hasonlóan, tehát azokhoz csak bizonyos díj fejében juthat hozzá. Az üzenetek nem tartalmazhatnak ékezetes karaktereket. Az sms.txt állomány első sorában az a k szám olvasható, amely megadja, hogy hány üzenet érkezett a készülékre a mai napon. Az érkező üzenetek száma legalább egy, de nem haladja meg a 100 darabot. Minden üzenethez 2 sor tartozik. Az első sor szerkezete a következő: először az érkezés órája (szám), érkezés perce (szám), telefonszám (pontosan 9 jegyű szám), a másodikban pedig az üzenet (legfeljebb 100 karakternyi szöveg) található. Az állományban az üzenetek számát követően k 2 sor szerepel. Az üzenetek érkezési idő szerint növekvően rendezettek. Például: Szia, mikor jossz? Nem kerek ebedet! Hova menjek erted? Hozd el a mintas pulcsimat! Nyertünk a palyazaton! Készítsen programot sms néven, amely az alábbi kérdésekre válaszol! Ügyeljen arra, hogy a program forráskódját a megadott helyre mentse! 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: ) 1. Olvassa be az sms.txt állományban talált adatokat, s annak felhasználásával oldja meg a következő feladatokat! Ha az állományt nem tudja beolvasni, akkor a benne található adatok közül az első tíz üzenet adatait jegyezze be a programba, s úgy oldja meg a feladatokat! 2. A fájlban tárolt utolsó üzenet érkezésekor melyik üzenet a legfrissebb a telefon memóriájában? Írja az üzenet szövegét a képernyőre! 3. Adja meg a leghosszabb és a legrövidebb üzenetek adatait! Ha több azonos hosszúságú üzenet van, akkor elegendő csak egyet-egyet megadnia! A képernyőn óra, perc, telefonszám, üzenet formában jelenítse meg az adatokat! 4. Készítsen karakterhossz szerinti statisztikát: 1-20, 21-40, 41-60, 61-80, ! Az intervallumok mellé a hozzájuk tartozó üzenetek darabszámát írja, mint eredményt a képernyőre! 5. Ha Ernő minden óra 0. percében elolvasná a memóriában lévő üzeneteket (az éppen ekkor érkező üzeneteket nem látja), majd ki is törölné, akkor hány olyan üzenet lenne, amelynek elolvasásához fel kellene hívnia a szolgáltatót? Írja ezt a számot a képernyőre! (Az üzeneteket először 1, utoljára 24 órakor olvassa el.) 6. Ernő barátnője gyakran küld sms-t az es számról. Mennyi volt a leghosszabb idő, amennyi eltelt két üzenete között? Ha legfeljebb 1 üzenet érkezett tőle, akkor írja ki, hogy nincs elegendő üzenet, egyébként pedig adja meg a leghosszabb időtartamot óra perc alakban! 71
72 7. Egy üzenet véletlenül késett. Olvassa be a billentyűzetről ennek az sms-nek az adatait, majd tárolja el a memóriában a többihez hasonlóan! 8. Az smski.txt állományban készítsen egy listát az üzenetekről telefonszám szerinti csoportosításban, telefonszám szerint növekvő sorrendben! Egy csoporthoz tartozó első sorban a feladó telefonszáma szerepeljen! Az alatta lévő sorokban a feladás ideje, majd a tőle újabb szóközzel elválasztva az üzenet szövege szerepeljen! FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS sms[100] uzenet típusú 100 elemű tömb, minden eleme egy adatnégyest tartalmaz struktúra 4 adatmezővel: o üzenet érkezési óra p üzenet érkezési perc tsz telefonszám uzenet uzenet szövege A fájlban található adatok tárolása. globális max konstans Értéke 10. A memóriában tárolható maximális üzenetszám k int Beérkezett üzenetek száma, a fájl első sora globális globális stat[5] int típusú 5 elemű tömb o[24] int típusú 24 elemű tömb A 4. feladatban használjuk az egyes karakterhossz intervallumok összesítéséhez (5 intervallum van) Az 5. feladatban használjuk. Minden órára összesítjük, hogy mennyi üzenet van a szolgáltató központjában lokális lokális 72
73 PROGRAMKÓD #include <iostream> #include <fstream> #include <string> #include <windows.h> #define max 10 using namespace std; struct uzenet int o, p; string tsz; string uzenet; sms[100]; int k; //fájlban lévő üzenetek száma void kiir(int ssz) cout << " " << endl; cout << ssz << ". feladat" << endl; cout << " " << endl; int szamol(int x, int y) //Percekre számoljuk át az időket int e=sms[x].o*60+sms[x].p; int v=sms[y].o*60+sms[y].p; return v-e; void eredmeny(int x) //Percekről óra és perc visszaszámolása int h, m; h=x/60; m=x%60; cout << h << " óra " << m << " perc"; 73
74 void F1() cout << "Adatok beolvasása..." << endl; ifstream be; be.open("sms.txt"); be >> k; cout << "Üzenetek száma: " << k << endl; cout << "Az üzenetek:" << endl; for(int i=0;i<k;i++) be >> sms[i].o; be >> sms[i].p; getline(be,sms[i].tsz); getline(be,sms[i].uzenet); cout << sms[i].o << " " << sms[i].p << " " << sms[i].tsz << endl; cout << sms[i].uzenet << endl; be.close(); void F2() cout << "Legfrissebb üzenet a telefonban:" << endl; //Megnézzük, hogy 10-nél több vagy kevesebb üzenet érkezett-e? if(k<max) else cout << endl; cout << sms[k-1].uzenet; cout << sms[max-1].uzenet; //-1 az indexek miatt //-1 az indexek miatt void F3() int maxi=0, mini=0; for(int i=0;i<k;i++) if(sms[i].uzenet.length()>sms[maxi].uzenet.length()) maxi=i; if(sms[i].uzenet.length()<sms[mini].uzenet.length()) mini=i; cout << "Leghosszabb üzenet adatai:" << endl; cout << sms[maxi].o << " " << sms[maxi].p << " " << sms[maxi].tsz << endl; cout << sms[maxi].uzenet << endl; cout << "Legrövidebb üzenet adatai:" << endl; cout << sms[mini].o << " " << sms[mini].p << " " << sms[mini].tsz << endl; cout << sms[mini].uzenet << endl; 74
75 void F4() // int stat[5]=0,0,0,0,0; for(int i=0;i<k;i++) if(sms[i].uzenet.length()<21) stat[0]++; if(sms[i].uzenet.length()>20&&sms[i].uzenet.length()<41) stat[1]++; if(sms[i].uzenet.length()>40&&sms[i].uzenet.length()<61) stat[2]++; if(sms[i].uzenet.length()>60&&sms[i].uzenet.length()<81) stat[3]++; if(sms[i].uzenet.length()>80) stat[4]++; cout << "Statisztika:" << endl; //20-asával "mennek" az intervallumok, ezt kihasználhatjuk a kiírásban for(int i=0;i<5;i++) cout << (i%20)*20+1 << " - " << (i%20)*20+20 << ": " << stat[i] << endl; void F5() int o[24]; for(int i=0;i<24;i++) o[i]=0; //Számoljuk meg, hogy az egyes órákban hány üzenet van! for(int i=0;i<k;i++) o[sms[i].o-1]++; //az üzenet óra mezőjével indexelünk //minden órában 10-et, azaz max-ot elolvas és töröl int szolg=0; //szolgáltatónál mennyi lesz? for(int i=0;i<24;i++) //ha egy órában 10-nél több van, //akkor a töblet a szolgáltatónál lesz if(o[i]>max) szolg+=(o[i]-max); cout << i+1 << " órában " << szolg << " üzenet van a szolgáltatónál" << endl; cout << endl; cout << "A nap végén " << szolg << " üzenet van a szolgáltatónál" << endl; 75
76 void F6() string b_tsz=" "; /* szóköz az elején, mert a getline a szóközt is beovasta a telefonszám előtt */ //keressük meg az első üzenetet ezzel a telefonszámmal int i=0, maxi=0, ido, elozo, kovetkezo; bool volt=false; while(i<k&&sms[i].tsz!=b_tsz) i++; if(i<k) elozo=i; for(int j=i+1;j<k;j++) if(sms[j].tsz==b_tsz) kovetkezo=j; ido=szamol(elozo, kovetkezo); if(ido>maxi) maxi=ido; elozo=kovetkezo; if(maxi>0) volt=true; if(volt) cout << "Két üzenet közt eltelt leghosszabb idő: "; eredmeny(maxi); else cout << "Nincs elegendő üzenet!"; cout << endl; 76
77 void F7() //Ezt a feladatot nem is értem!!!??? int index=k; //indexek -1-es elcsűszása miatt pont k lesz az új üzenet indexe cout << "Kérem, adja meg az üzenet adatait:" << endl; cout << "Óra: "; cin >> sms[k].o; cout << "Perc: "; cin >> sms[k].p; cout << "Telefonszám: "; cin >> sms[k].tsz; sms[k].tsz=" "+sms[k].tsz; string puffer; //kell egy üres getline, hogy az előző adatbevitel után //üres legyen a billentyűzetpuffer getline(cin, puffer); cout << "Üzenet: "; getline(cin, sms[k].uzenet); k++; //Mert azért 1-gyel több üzenetünk lett!!! void F8() cout << "Adatok kiírása..." << endl; //rendezzük az adatokat telefonszám szerint for(int i=0;i<k-1;i++) for(int j=i+1;j<k;j++) if(sms[i].tsz>sms[j].tsz) swap(sms[i],sms[j]); ofstream ki; ki.open("smski.txt"); string elozo=""; for(int i=0;i<k;i++) if(sms[i].tsz!=elozo) ki << sms[i].tsz << endl; elozo=sms[i].tsz; ki << sms[i].o << " " << sms[i].p << " " << sms[i].uzenet << endl; ki.close(); 77
78 int main() setlocale(lc_all, "hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); kiir(7); F7(); kiir(8); F8(); return 0; 78
79 2008. OKTÓBER EMELT ROBOT
80 FELADAT SZÖVEGE Gáborék iskolai szakkörön robotot építenek. Már elkészítettek egy olyan változatot, amelyik sík terepen kellő pontossággal vezérelhető. A robot a memóriájába előre betáplált programok egyikét hajtja végre. A robot jelenleg csak az E, K, D, N utasításokat érti, amelyek a négy égtáj (sorrendben: észak, kelet, dél, nyugat) irányában tett 1 centiméteres elmozdulást eredményezik. A robotba táplált programokat a program.txt állományban rögzítettük. Az állomány első sorában a betáplált programok száma található, amely legfeljebb 100. Alatta soronként egy-egy program olvasható. Egy sor legfeljebb 200 karakter hosszúságú, benne az E, K, D, N karakterek mint utasítások találhatók. A sorok nem tartalmaznak szóközt. Például: program.txt 12 ENNNDKENDND ENNDDDDENDENDEEDDNNKED... A 2. sorban az első betáplált program utasításai vannak. Készítsen programot, amely az alábbi kérdésekre válaszol! A program forráskódját robot néven mentse! Minden részfeladat megoldása előtt írja a képernyőre a feladat sorszámát! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár (például 2. feladat: Kérem az utasítássor sorszámát!)! 1. Olvassa be a program.txt állományban talált adatokat, s azok felhasználásával oldja meg a következő feladatokat! Ha az állományt nem tudja beolvasni, az állomány első 10 sorának adatait jegyezze be a programba és dolgozzon azzal! 2. Kérje be egy utasítássor számát, majd írja a képernyőre, hogy: a. Egyszerűsíthető-e az utasítássorozat! Az egyszerűsíthető, illetve nem egyszerűsíthető választ írja a képernyőre! (Egy utasítássort egyszerűsíthetőnek nevezünk, ha van benne két szomszédos, ellentétes irányt kifejező utasításpár, hiszen ezek a párok elhagyhatók. Ilyen ellentétes utasításpár az ED, DE, KN, NK.) b. Az utasítássor végrehajtását követően legkevesebb mennyi E vagy D és K vagy N utasítással lehetne a robotot a kiindulási pontba visszajuttatni! A választ a következő formában jelenítse meg: 3 lépést kell tenni az ED, 4 lépést a KN tengely mentén. c. Annak végrehajtása során hányadik lépést követően került (légvonalban) legtávolabb a robot a kiindulási ponttól és mekkora volt ez a távolság! A távolságot a lépés sorszámát követően 3 tizedes pontossággal írja a képernyőre! 3. A robot a mozgáshoz szükséges energiát egy beépített akkuból nyeri. A robot 1 centiméternyi távolság megtételéhez 1 egység, az irányváltásokhoz és az induláshoz 2 egység energiát használ. Ennek alapján az EKK utasítássor végrehajtásához 7 egység energia szükséges. A szakkörön használt teljesen feltöltött kis kapacitású akkuból 100, a nagykapacitásúból 1000 egységnyi energia nyerhető ki. Adja meg azon utasítássorokat, amelyek végrehajtásához a teljesen feltöltött kis kapacitású akku is elegendő! Írja a képernyőre egymástól szóközzel elválasztva az utasítássor sorszámát és a szükséges energia mennyiségét! Minden érintett utasítássor külön sorba kerüljön! 4. Gáborék továbbfejlesztették az utasításokat értelmező programot. Az új, jelenleg még tesztelés alatt álló változatban a több, változatlan irányban tett elmozdulást helyettesítjük az adott irányban tett 80
81 elmozdulások számával és az irány betűjével. Tehát például a DDDKDD utasítássor leírható rövidített 3DK2D formában is. Az önállóan álló utasításnál az 1-es számot nem szabad kiírni! Hozza létre az ujprog.txt állományt, amely a program.txt állományban foglalt utasítássorozatokat az új formára alakítja úgy, hogy az egymást követő azonos utasításokat minden esetben a rövidített alakra cseréli! Az ujprog.txt állományba soronként egy utasítássor kerüljön, a sorok ne tartalmazzanak szóközt! 5. Sajnos a tesztek rámutattak arra, hogy a program új verziója még nem tökéletes, ezért vissza kell térni az utasítássorok leírásának régebbi változatához. Mivel a szakkörösök nagyon bíztak az új változatban, ezért néhány utasítássort már csak ennek megfelelően készítettek el. Segítsen ezeket visszaírni az eredeti formára! Az ismétlődések száma legfeljebb 200 lehet! Kérjen be egy új formátumú utasítássort, majd írja a képernyőre régi formában! FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS sor[100][200] char 100x200-as karakter mátrix sordb[100] int 100 elemű tömb A fájlban található adatok tárolása, az egyes utasítássorok tárolása. Az utasítások száma maximum 100 és minden utasítássor maximum 200 karakter Az egyes utasítások karaktereinek száma kerül a tömbbe. Az első 4. feladatban lesz szerepe az egyes utasítássorok feldolgozásakor globális globális N int utasítássorok száma globális s string F2a és F2bc feladatokban van szerepe, paraméterátadás helyett globális globális 81
82 PROGRAMKÓD #include <iostream> #include <string> #include <cstring> #include <fstream> #include <cmath> #include <iomanip> //sqrt miatt (sqrt = négyzetgyök) lsd. F2bc függvénynél //setprecision miatt (tizedesjegyek szanályozása lsd. F2bc függvénynél using namespace std; int N, s; char sor[100][200]; int sordb[100]; void k(int x) cout << x << endl; void F1() int db; ifstream be; be.open("program.txt"); be >> N; /* Az alábbi kiírás csak önellenőrzés a feladat szempontjából nincs szerepe */ for(int i=0; i<n; i++) be >> sor[i]; db=0; for(int j=0; j<200; j++) if(sor[i][j]=='e' sor[i][j]=='d' sor[i][j]=='k' sor[i][j]=='n') db++; sordb[i]=db; cout << sor[i] << " (" << sordb[i] << ")" << endl; be.close(); void F2a() cout << "Utasítássor száma: "; cin >> s; if(strstr(sor[s-1],"ed")==null && strstr(sor[s-1],"de")==null && strstr(sor[s-1],"kn")==null && strstr(sor[s-1],"nk")==null) cout << "Nem egyszerűsíthető" << endl; else cout << "Egyszerűsíthető" << endl; 82
83 void F2bc() int x=0, y=0, ls; float max=0, m; for(int i=0; i<sordb[s-1]; i++) if(sor[s-1][i]=='e') x++; if(sor[s-1][i]=='d') x--; if(sor[s-1][i]=='k') y++; if(sor[s-1][i]=='n') y--; m=sqrt(x*x+y*y); if(m>max) max=m; ls=i+1; cout << abs(x) <<" lépést kell tenni az ED, " << abs(y) << " lépést a KN tengely mentén." << endl; cout << "Legnagyobb távolság " << ls << " lépésben: " << setprecision(4) << max << endl; void F3() int e; //energia for(int i=0;i<n;i++) //végigmegyünk az összes utasítássoron e=2; //indulás for(int j=0;j<sordb[i]-1;j++) // -1 kell az irányváltás vizsgálata miatt e++; //egyszerű lépés if(sor[i][j]!=sor[i][j+1]) e=e+2; //irányváltás e++; // -1 miatt az utolsó lépés kimaradna, így ide kell if(e<=100) cout << "Utasítássor száma: " << i+1 << " Energiaszükséglet: " << e << endl; 83
84 void F4() ofstream ki; ki.open("ujprog.txt"); int db; string s; for(int i=0;i<n;i++) s=""; // Egyszerűsített utasítás stringje, kezdetben üres for(int j=0;j<sordb[i];j++) db=1; // egymást követő azonos karakterek számolása while(sor[i][j]==sor[i][j+1]) db++; j++; if(db==1) s=s+sor[i][j]; //ha csak egy volt else s=s+ (char) ((int) '0' +db) + sor[i][j]; //ha volt több azonos egymásután /* többszörös típuskoverzió történik az else után: 1. '0' karakternél az (int) '0' megadja a nulla (0) karakter ASCII-kódját, majd a db-t hozzáadva a (char) hatására megkapjuk az adott számnak (adott ASCIIkódnak) megfelelő karaktert, amit a stringhez fűzünk. Például: '0' karakter ASCII kódja 48, '3' karakter ASCII kódja 51 tehát, ha például db=3, akkor (int) '0' + 3 = 48+3, azaz 51, (char) 51 = '3' */ cout << s << endl; ki << s << endl; ki.close(); 84
85 void F5() string s; cout << "Kérek egy új utasítássort: "; cin >> s; for(int i=0; i<s.length(); i++) s[i]=toupper(s[i]); cout << s << endl; float szam, kezd, vege; cout << "A régi kód:" << endl; for(int i=0;i<s.length();i++) if(s[i]!='e'&&s[i]!='d'&&s[i]!='n'&&s[i]!='k') /* Ha az adott karakter nem égtáj, akkor elkezdjük nézni, hogy meddig tartanak a számjegyek */ kezd=i; // Itt kezdődnek vege=kezd+1; while(s[vege]<'d') vege++; i=vege; // Itt érnek véget (vege) // Az i=vege azért kell, hogy a "nagy ciklus" a számjegyek után folytatódjon! szam=0; // SZámjegykarakterek helyiérték szerinti számmá alakítása // (A pow(10,x) 10 az x-edikent jelenti (cmath kell hozzá, lsd. fent includeoknál!!) for(int j=kezd;j<vege;j++) szam=szam+((int)s[j]-(int)'0')*pow(10,(vege-j-1)); // Ismétlődő karakter kiírása. A vege változó tartalmazza, // hogy ez melyik karakter is! for(int j=0;j<szam;j++) cout << s[vege]; else // ha égtáj volt az aktuális karakter, akkor simán kiírjuk cout << s[i]; 85
86 int main() setlocale(lc_all,""); k(1); F1(); k(2); F2a(); F2bc(); k(3); F3(); k(4); F4(); k(5); F5(); return 0; 86
87 2009. MÁJUS EMELT LIFT
88 FELADAT SZÖVEGE A Madárház Kft. toronyházak építésével foglalkozik. Jelenleg a Csúcs Rt. 100 szintes szerkezetkész épületén kezdték meg a belső szerelési műveleteket. Az egyes szerelőcsapatok naponta többször változtatják helyüket. Ha az új munkaterület egy másik emeleten van, akkor a biztonsági előírások miatt lifttel kell menniük. A házban egyetlen lift működik, amelynek igénybevételét az egyes csapatok a célszint megadásával jelezhetik. A lift az igényeket a jelzés sorrendjében szolgálja ki, és egyszerre csak egy csapatot szállít. A csapatok mozgását a 9 és 14 óra közötti intervallumban követjük nyomon. Ez az intervallum a munkaidőnek csak egy része, tehát a csapatok már dolgoznak valamelyik szinten, de 9 órakor teljesítetlen kérés nincs és a lift szabad. A lifthasználati igényeket az igeny.txt állomány tartalmazza. Első sorában a szintek száma (legfeljebb 100), a második sorban a csapatok száma (legfeljebb 50), a harmadik sorban pedig az igények száma (legfeljebb 100) olvasható. A negyedik sortól kezdve soronként egy-egy igény szerepel a jelzés sorrendjében. Egy igény hat számból áll: az első három szám az időt adja meg (óra, perc, másodpercszám sorrendben), a negyedik a csapat sorszáma, az ötödik az induló-, a hatodik a célszint sorszáma. Az egyes számokat pontosan egy szóköz választja el egymástól. Például: igeny.txt A 4. sor megmutatja, hogy 9 óra 7 perc 11 másodperckor a 7. csapat igényelt liftet, hogy a 6. szintről a 22. szintre eljusson. Készítsen programot, amely az alábbi kérdésekre válaszol! A program forráskódját lift néven mentse! Ügyeljen arra, hogy programjának minden helyes tartalmú bemeneti állomány esetén működnie kell! Minden részfeladat megoldása előtt írja a képernyőre a feladat sorszámát! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár (például a 2. feladat esetén: 2. feladat Kérem a lift indulási helyét! )! A képernyőn megjelenített üzenetek esetén az ékezetmentes kiírás is elfogadott. 1. Olvassa be az igeny.txt állományban talált adatokat, s azok felhasználásával oldja meg a következő feladatokat! Ha az állományt nem tudja beolvasni, az első 8 igényhez tartozó adatokat jegyezze be a programba és dolgozzon azzal! 2. Tudjuk, hogy a megfigyelés kezdetén a lift éppen áll. Kérje be a felhasználótól, hogy melyik szinten áll a lift, és a további részfeladatok megoldásánál ezt vegye figyelembe! Ha a beolvasást nem tudja elvégezni, használja az igeny.txt fájlban az első igény induló szintjét! 3. Határozza meg, hogy melyik szinten áll majd a lift az utolsó kérés teljesítését követően! Írja képernyőre a választ a következőhöz hasonló formában: A lift a 33. szinten áll az utolsó igény teljesítése után.! 4. Írja a képernyőre, hogy a megfigyelés kezdete és az utolsó igény teljesítése között melyik volt a legalacsonyabb és melyik a legmagasabb sorszámú szint, amelyet a lift érintett! 5. Határozza meg, hogy hányszor kellett a liftnek felfelé indulnia utassal és hányszor utas nélkül! Az eredményt jelenítse meg a képernyőn! 88
89 6. Határozza meg, hogy mely szerelőcsapatok nem vették igénybe a liftet a vizsgált intervallumban! A szerelőcsapatok sorszámát egymástól egy-egy szóközzel elválasztva írja a képernyőre! 7. Előfordul, hogy egyik vagy másik szerelőcsapat áthágja a szabályokat, és egyik szintről gyalog megy a másikra. (Ezt onnan tudhatjuk, hogy más emeleten igényli a liftet, mint ahova korábban érkezett.) Generáljon véletlenszerűen egy létező csapatsorszámot! (Ha nem jár sikerrel, dolgozzon a 3. csapattal!) Határozza meg, hogy a vizsgált időszak igényei alapján lehet-e egyértelműen bizonyítani, hogy ez a csapat vétett a szabályok ellen! Ha igen, akkor adja meg, hogy melyik két szint közötti utat tették meg gyalog, ellenkező esetben írja ki a Nem bizonyítható szabálytalanság szöveget! 8. A munkák elvégzésének adminisztrálásához minden csapatnak egy blokkoló kártyát kell használnia. A kártyára a liftben elhelyezett blokkolóóra rögzíti az emeletet, az időpontot. Ennek a készüléknek a segítségével kell megadni a munka kódszámát és az adott munkafolyamat sikerességét. A munka kódja 1 és 99 közötti egész szám lehet. A sikerességet a befejezett és a befejezetlen szavakkal lehet jelezni. Egy műszaki hiba folytán az előző feladatban vizsgált csapat kártyájára az általunk nyomon követett időszakban nem került bejegyzés. Ezért a csapatfőnöknek a műszak végén pótolnia kell a hiányzó adatokat. Az igeny.txt állomány adatait felhasználva írja a képernyőre időrendben, hogy a vizsgált időszakban milyen kérdéseket tett fel az óra, és kérje be az adott válaszokat a felhasználótól! A pótlólag feljegyzett adatokat írja a blokkol.txt állományba! A blokkol.txt állomány tartalmát az alábbi sorok mintájára alakítsa ki: Befejezés ideje: 9:23:11 Sikeresség: befejezett Indulási emelet: 9 Célemelet: 11 Feladatkód: 23 Befejezés ideje: 10:43:22 Sikeresség: befejezetlen Indulási emelet: 11 Célemelet: 6 Feladatkód: 6 89
90 FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS igeny[100] igenyles típusú 100 elemű tömb, minden eleme egy adathatost tartalmaz struktúra 6 adatmezővel: o óra p perc m másodperc ssz csapat sorszáma ind induló szint cel célszint A fájlban található adatok tárolása. globális sz int max. 100 szintek száma globális cs int max. 50 csapatok száma globális isz int igénylések száma globális fsz int felh. adja meg hol áll a lift A 2. és 5. feladatrészben van szerepe igenybevett[cs] int 0 vagy 1 értékű tömb, cscsapatok száma A 6. feladathoz globális lokális 90
91 PROGRAMKÓD #include <iostream> #include <fstream> #include <ctime> using namespace std; using namespace std; int sz; int cs; int isz, fsz; struct igenyles int o, p, m, ssz, ind, cel; igeny[100]; void kiir(int sorszam) cout << sorszam << ". feladat" << endl; void F1() ifstream be; be.open("igeny.txt"); be >> sz; be >> cs; be >> isz; for(int i=0;i<isz;i++) be >> igeny[i].o; be >> igeny[i].p; be >> igeny[i].m; be >> igeny[i].ssz; be >> igeny[i].ind; be >> igeny[i].cel; be.close(); void F2() cout << "Hol áll a lift: "; cin >> fsz; 91
92 void F3() cout << "A lift a(z) " << igeny[isz-1].cel << ". szinten áll az utolsó igény teljesítése után." << endl; void F4() int max=0, min=sz+1; for(int i=0;i<isz;i++) if(igeny[i].ind>max) max=igeny[i].ind; if(igeny[i].cel>max) max=igeny[i].cel; if(igeny[i].ind<min) min=igeny[i].ind; if(igeny[i].cel<min) min=igeny[i].cel; cout << "Legalacsonyabb szint: " << min << endl; cout << "Legmagasabb szint: " << max << endl; void F5() int ures=0, teli=0; if(igeny[0].ind>fsz) ures++; if(igeny[0].ind<igeny[0].cel) teli++; for(int i=1;i<isz;i++) if(igeny[i-1].cel<igeny[i].ind) ures++; if(igeny[i].ind<igeny[i].cel) teli++; cout << "Üres menetek felfelé: " << ures << endl; cout << "Teli menetek felfelé: " << teli << endl; void F6() int igenybevett[cs]; for(int i=0;i<cs;i++) igenybevett[i]=0; //kiindulás: egy csapat sem vett igénybe //megnézzük, hogy tényleg így van-e, 1-re állítjuk az IGENYBEVETT tömböt a csapat sorszámok alapján int csapat_szam; //ezzel indexeljük majd az IGENYBEVETT tömböt for(int i=0;i<isz;i++) csapat_szam=igeny[i].ssz-1; igenybevett[csapat_szam]=1; //most megnézzük, maradt-e 0 érték valamelyik csapatnál for(int i=0;i<cs;i++) if(igenybevett[i]==0) cout << i+1 << " "; //i+1 index itt a csapat sorszámának felel meg cout << endl; 92
93 void F7() int csapat; srand(time(null)); csapat=rand()%cs+1; //a generált véletlenszám 1 és cs közé fog esni cout << "A vizsgálandó csapat: " << csapat << endl; //megkeressük az adott csapat első igénylését - LINEÁRIS KERESÉS int i=0; while(i<isz && igeny[i].ssz!=csapat) i++; if(i<isz) //volt talalat a csapatra, tehát nem a 6. feladatban meghatározottak közé tartozik //i+1-től vizsgáljuk az igényléseit, volt-e olyan, hogy az ELŐZŐ CÉL más, mint //az AKTUÁLIS INDULÁSI SZINT //egy megfelelő eset nekünk már jó, így kiugrunk a ciklusból, ha találtunk bizonyítékot!!! int elozo=i; bool van=false; //ez segít majd a kiugrásban for(int aktualis=i+1;aktualis<isz;aktualis++) //csak a saját csapatunkkal foglalkozunk és azzal, hogy... if(igeny[aktualis].ssz==csapat) //...az előző cél nem egyenlő a mostani indulással if(igeny[elozo].cel!=igeny[aktualis].ind) cout << "Van bizonyíték:" << endl; cout << "A(z) " << igeny[elozo].cel << ".szint és a(z) " << igeny[aktualis].ind << ".szint között gyalog mentek!" << endl; cout << "Igénylések: " << elozo+1 << " és " << aktualis+1 << endl; van=true; break; else //ha most éppen nem csaltak, akkor ez AKTUALIS lesz az ELOZO a következő vizsgálathoz //hiszen a ciklus megy tovább elozo=aktualis; if(van==false) cout << "Nincs bizonyítható szabálytalanság!" << endl; else cout << "Ez a csapat igénybe sem vette a liftet!!" << endl; 93
94 int main() setlocale(lc_all, "hun"); cout << "LIFT" << endl; kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); kiir(7); F7(); return 0; 94
95 2009. OKTÓBER EMELT ÚTÉPÍTÉS
96 FELADAT SZÖVEGE Az Alsó és Felső várost összekötő út m hosszú részének a felújításán dolgoznak. Ennek a szakasznak a forgalmát figyeljük egy nap néhány óráján keresztül. Az említett szakaszon előzési tilalom van érvényben. A forgalmat a forgalom.txt állomány tartalmazza. Első sorában a megfigyelési időszakban áthaladó járművek száma (legfeljebb 2000) látható, a továbbiakban pedig soronként egy áthaladó jármű adatai olvashatók időrendben. Egy sorban az első három szám azt az időpontot jelöli (óra, perc, másodperc), amikor a jármű belép a vizsgált útszakaszra. A következő szám jelöli, hogy a jármű az érintett távolságot hány másodperc alatt tenné meg (legfeljebb 300) a belépéskor mért sebességgel, ha haladását semmi nem akadályozná. Ezt egy betű követi, amely jelzi, hogy a jármű melyik város irányából érkezett. Ennek megfelelően a betű A vagy F lehet. Az egyes adatokat pontosan egy szóköz választja el egymástól. Ha az útszakaszon egyik jármű utoléri a másikat, akkor az előzési tilalom miatt úgy tekintjük, hogy változatlan sorrendben, ugyanabban az időpillanatban hagyják el a szakasz, mint ahogy a lassabb jármű tenné. Például: forgalom.txt F F F A A A 3. sor megmutatja, hogy a 7 óra 21 perc 58 másodperckor a Felső város felől érkező jármű 69 másodperc alatt tenné meg ezt az 1 km hosszú távolságot. Ez a jármű ha más járművek nem akadályozzák 7 óra 23 perc 7 másodperckor lép ki az útszakaszról, tehát akkor már nem tartózkodik ott. Készítsen programot, amely az alábbi kérdésekre válaszol! A program forráskódját ut néven mentse! Ügyeljen arra, hogy programjának más bemeneti állomány esetén is működnie kell! Minden részfeladat megoldása előtt írja a képernyőre annak sorszámát! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár (például a 2. feladat esetén: 2. feladat Adja meg a jármű sorszámát! )! 1. Olvassa be a forgalom.txt állományban talált adatokat, s azok felhasználásával oldja meg a következő feladatokat! Ha az állományt nem tudja beolvasni, akkor az első 10 sorának adatait jegyezze be a programba és dolgozzon azzal! 2. Írja ki a képernyőre, hogy az n-edikként belépő jármű melyik város felé haladt! Ehhez kérje be a felhasználótól az n értékét! 3. Írja a képernyőre, hogy a Felső város irányába tartó utolsó két jármű hány másodperc különbséggel érte el az útszakasz kezdetét! 4. Határozza meg óránként és irányonként, hogy hány jármű érte el a szakaszt! Soronként egy-egy óra adatait írja a képernyőre! Az első érték az órát, a második érték az Alsó, a harmadik a Felső város felől érkező járművek számát jelentse! A kiírásban csak azokat az órákat jelenítse meg, amelyekben volt forgalom valamely irányban! 96
97 5. A belépéskor mért értékek alapján határozza meg a 10 leggyorsabb járművet! Írassa ki a képernyőre ezek belépési idejét, a várost (Alsó, illetve Felső), amely felől érkezett, és m/s egységben kifejezett sebességét egy tizedes pontossággal, sebességük szerinti csökkenő sorrendben! Ha több azonos sebességű járművet talál, bármelyiket megjelenítheti. Soronként egy jármű adatait jelenítse meg, és az egyes adatokat szóközzel tagolja! (A feladat megoldásakor figyeljen arra, hogy a következő feladatban az adatok eredeti sorrendjét még fel kell használni!) 6. Írassa ki az also.txt állományba azokat az időpontokat, amikor az Alsó város felé tartók elhagyták a kérdéses útszakaszt! Ha egy jármű utolér egy másikat, akkor a kilépésük időpontja a lassabb kilépési ideje legyen! A fájl minden sorába egy-egy időpont kerüljön óra perc másodperc formában! A számokat pontosan egy szóköz válassza el egymástól! FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS adatok[2000] jarmu típusú 2000 elemű tömb, minden eleme egy adatötöst tartalmaz struktúra 5 adatmezővel: 4 int és 1 char típusú mező o óra p perc mp másodperc ido ennyi ideig tart megtenni az 1000 méteres utat honnan A vagy F, attól függ honnan jön a jármű A fájlban található adatok tárolása N int Az útszakaszon áthaladó járművek száma globális globális 97
98 PROGRAMKÓD #include <conio.h> #include <iostream> #include <fstream> #include <string> #include <windows.h> #include <iomanip> // printf miatt az 5. feladatban //precision miatt using namespace std; struct jarmu int o, p, mp, ido; char honnan; adatok[2000]; // A vagy F int N; //Járművek száma void kiir(int szam) cout << " " << endl; cout << szam << ". feladat" << endl; cout << " " << endl; void F1() cout << "Adatok beolvasása..." << endl; ifstream be; be.open("forgalom.txt"); be >> N; for(int i=0;i<n;i++) be >> adatok[i].o; be >> adatok[i].p; be >> adatok[i].mp; be >> adatok[i].ido; be >> adatok[i].honnan; be.close(); 98
99 void F2() int n; cout << "Melyik autóra kiváncsi? (1-" << N << ")" << endl; cout << "Kérek egy számot: "; cin >> n; if(adatok[n-1].honnan=='a') cout << "Felső város felé haladt a jármű"; else cout << "Alsó város felé haladt a jármű"; cout << endl; void F3() int i, j, mpi, mpj, kulonbseg; i=n-1; while(i>=0&&adatok[i].honnan!='a') i--; if(i>=0) j=i-1; while(j>=0&&adatok[j].honnan!='a') j--; if(j>=0) mpi=adatok[i].o*3600+adatok[i].p*60+adatok[i].mp; mpj=adatok[j].o*3600+adatok[j].p*60+adatok[j].mp; kulonbseg=mpi-mpj; cout << i+1 << ": " << adatok[i].o << " " << adatok[i].p << " " << adatok[i].mp << " " << adatok[i].ido << " " << adatok[i].honnan << endl; cout << j+1 << ": " << adatok[i].o << " " << adatok[j].p << " " << adatok[j].mp << " " << adatok[j].ido << " " << adatok[j].honnan << endl; cout << "Különbség: " << kulonbseg << endl; else cout << "Nem találtam két ilyen járművet!" << endl; 99
100 void F4() int ora1, ora2; int orak[2][24]; //A és F valamint 24 óra szerinti mátrix for(int i=0;i<2;i++) for(int j=0;j<24;j++) orak[i][j]=0; for(int i=0;i<n;i++) if(adatok[i].honnan=='a') orak[0][adatok[i].o-1]++; else orak[1][adatok[i].o-1]++; cout << "Adatok" << endl; cout << "Óra A F" << endl; for(int i=0;i<24;i++) if(orak[0][i]!=0 orak[1][i]!=0) cout << i+1 << " " << orak[0][i] << " " << orak[1][i] << endl; 100
101 void F5() jarmu rend[n]; for(int i=0;i<n;i++) rend[i]=adatok[i]; for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if(rend[i].ido>rend[j].ido) swap(rend[i], rend[j]); float x, ido2; for(int i=0;i<10;i++) cout.width(2); cout << rend[i].o << ":"; cout.width(2); cout << rend[i].p << ":"; cout.width(2); cout << rend[i].mp << " "; if(rend[i].honnan=='a') cout << "Alsó "; else cout << "Felső "; ido2=rend[i].ido; //rá kell venni a programot, hogy valós számokkal dolgozzon!! x=1000/ido2; //hogy legyen törtrész is, amit kerekíthetünk printf("%3.1f m/s\n",x); //1 tizedes jegyre. Most a printf-et is használhatjuk! 101
102 void F6() cout << "Adatok fájlba írása..." << endl; ofstream ki; ki.open("also.txt"); int mp_aktualis, mp_elozo, elso=0; //Keressük meg az első Alsó városba tartót! //Feltételezhetjük, hogy biztosan van ilyen jármű while(adatok[elso].honnan!='f') elso++; ki << adatok[elso].o << " " << adatok[elso].p << " " << adatok[elso].mp << endl; int elozo=elso; for(int i=elozo+1;i<n;i++) if(adatok[i].honnan=='f') //aktuális jármű mp_aktualis=adatok[i].o*3600+adatok[i].p*60+adatok[i].mp+adatok[i].ido; //aktuális jármű mp_elozo=adatok[elozo].o*3600+adatok[elozo].p*60+adatok[elozo].mp+adatok[elozo].ido; x if(mp_aktualis-mp_elozo<=0) ki << adatok[elozo].o << " " << adatok[elozo].p << " " << adatok[elozo].mp << endl; else ki << adatok[i].o << " " << adatok[i].p << " " << adatok[i].mp << endl; elozo=i; //átadjuk az "előző" státuszt az "aktuálisnak" ki.close(); int main() setlocale(lc_all, "hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); return 0; 102
103 2010. MÁJUS EMELT HELYJEGY
104 FELADAT SZÖVEGE Egy autóbuszokat üzemeltető társaság távolsági járataira az utasok jobb kiszolgálása érdekében csak akkor ad el jegyet, ha ülőhelyet is tud biztosítani. Minden jegyre rányomtatja, hogy az adott vonalon mettől meddig érvényes és melyik ülést lehet elfoglalni birtokában. Az eladott.txt állomány pontosan egy út jegyvásárlásait tartalmazza. Az első sorban az eladott jegyek száma (legfeljebb 500), a vonal hossza (legfeljebb 200 km) és minden megkezdett 10 km után fizetendő összeg (legfeljebb 100 Ft) található. Az állomány további sorai a vásárlás sorrendjében egy-egy jegy három adatát írják le: az utas melyik ülést foglalhatja el, hol száll fel és hol száll le. (A fel- és a leszállás helyét a járat kezdőállomásától mért távolsággal adják meg.) Az üléseket 1-től 48-ig folyamatosan számozták. A soron belüli határoló jel minden esetben egy-egy szóköz. Az állomány csak egész számokat tartalmaz. Az utast a későbbiekben egyetlen sorszámmal azonosítjuk, azzal az értékkel, amely megadja, hogy hanyadik jegyvásárló volt. A jegy árának meghatározásakor az értéket öttel osztható számra kell kerekítenie. (1, 2, 6 és 7 esetén lefelé, 3, 4, 8 és 9 esetén pedig felfelé kell kerekítenie.) Például: eladott.txt Az adott járat 200 km hosszú úton közlekedik. Eddig 132 jegyet adtak el, és megkezdett 10 km-ként 71 Ft-ba kerül a jegy. Az állomány harmadik sora tartalmazza a második jegyvásárló adatait, aki a 13. és a 65. km között utazik a 12. helyen ülve. A megtett távolság 52 km, tehát 6 darab 10 km hosszú szakaszért kell fizetnie, ennek értéke 6*71, azaz 426 Ft. Mivel kerekíteni kell, ezért a fizetendő összeg 425 Ft. Készítsen programot, amely az alábbi kérdésekre válaszol! A program forráskódját helyjegy néven mentse! Minden képernyőre írást igénylő részfeladat megoldása előtt írja a képernyőre a feladat sorszámát! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár (például a 7. feladat esetén: 7. feladat Adja meg, hogy az út mely kilométerén kéri az utaslistát! )! Az ékezetmentes kiírás is elfogadott. 1. Olvassa be az eladott.txt állományban talált adatokat, s azok felhasználásával oldja meg a következő feladatokat! Ha az állományt nem tudja beolvasni, az állomány első 10 sorának adatait jegyezze be a programba és dolgozzon azzal! 2. Adja meg a legutolsó jegyvásárló ülésének sorszámát és az általa beutazott távolságot! A kívánt adatokat a képernyőn jelenítse meg! 3. Listázza ki, kik utazták végig a teljes utat! Az utasok sorszámát egy-egy szóközzel elválasztva írja a képernyőre! 4. Határozza meg, hogy a jegyekből mennyi bevétele származott a társaságnak! Az eredményt írja a képernyőre! 5. Írja a képernyőre, hogy a busz végállomást megelőző utolsó megállásánál hányan szálltak fel és le! 6. Adja meg, hogy hány helyen állt meg a busz a kiinduló állomás és a célállomás között! Az eredményt írja a képernyőre! 104
105 7. Készítsen utaslistát az út egy pontjáról! A listában ülésenként tüntesse fel, hogy azt az adott pillanatban melyik utas foglalja el! A pontot, azaz a kiindulási állomástól mért távolságot, a felhasználótól kérje be! Ha a beolvasott helyen éppen megálló lett volna, akkor a felszálló utasokat vegye figyelembe, a leszállókat pedig hagyja figyelmen kívül! Az eredményt az ülések sorszámának sorrendjében írja a kihol.txt állományba! Az üres helyek esetén az üres szót jelenítse meg! Minden ülés külön sorba kerüljön! Például: kihol.txt 1. ülés: üres 2. ülés: üres 3. ülés: üres 4. ülés: 29. utas 5. ülés: 95. utas FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS utasok[500] utvonal[201] utas típusú 500 elemű tömb, minden eleme egy adatötöst tartalmaz int típusú 201 elemű tömb struktúra 5 adatmezővel: sorszam az utas sorszáma ules ülés száma fel felszállás km helye le leszállás km helye fizet fizetendo összeg A fájlban található adatok tárolása, valamint a sorszám és fizetendő kezelésére szolgál A 6. feladatban használjuk fel, gyakorlatilag km-ig minden egyes kilométerhez rendelünk egy értéket, vagy 0-t vagy az ott lévő utasok számát e_szam int eladott jegyek száma (a fájl első sora) vonalhossz int a járat hossza km-ben (a fájl második sora) ar_10 int 10km-es szakasz viteldíja (a fájl harmadik sora) globális globális globális globális globális 105
106 PROGRAMKÓD #include <conio.h> #include <iostream> #include <fstream> using namespace std; struct utas int sorszam, ules, fel, le, fizet; utasok[500]; int e_szam; //eladott jegyek száma int vonalhossz; int ar_10; int utvonal[201]; //0 és 200 km majd nem játszik void kiir(int s) cout << endl; cout << s << ". feldat" << endl; cout << "..." << endl; int kerekit(int ezt) // 1,2,6,7 le 3,4,8,9 fel int kerek; int maradek=ezt%5; if(maradek<3) kerek=ezt-maradek; else kerek=ezt-maradek+5; return kerek; 106
107 void F1() int fizetendo; //beolvasáskor kiszámolhatjuk a fizetendo díjat minden utasra int megtett_ut; ifstream be; be.open("eladott.txt"); be >> e_szam; be >> vonalhossz; be >> ar_10; cout << "Eladott jegyek száma: " << e_szam << endl; cout << "Vonal hossza: " << vonalhossz << endl; cout << "10 km ára: " << ar_10 << endl << endl; for(int i=0;i<e_szam;i++) utasok[i].sorszam=i+1; be >> utasok[i].ules; be >> utasok[i].fel; be >> utasok[i].le; megtett_ut=utasok[i].le-utasok[i].fel; if(megtett_ut%10!=0) fizetendo=(megtett_ut/10+1)*ar_10; else fizetendo=(megtett_ut/10)*ar_10; utasok[i].fizet=kerekit(fizetendo); //Adatok kiírása (nem kell), csak rossz szokás....) cout << utasok[i].sorszam << " "; cout << utasok[i].ules << " "; cout << utasok[i].fel << " "; cout << utasok[i].le << " "; cout << utasok[i].fizet << endl; be.close(); 107
108 void F2() int i=e_szam-1; cout << "Utolsó (" << utasok[i].sorszam << ".) utas adatai: " << endl; cout << "Ülésszám: " << utasok[i].ules; cout << " Beutazott távolság: " << utasok[i].le-utasok[i].fel << endl; void F3() for(int i=0;i<e_szam;i++) if(utasok[i].fel==0&&utasok[i].le==vonalhossz) cout << utasok[i].sorszam << " "; cout << endl; void F4() //egyszerű összegzés a feladat int bevetel=0; for(int i=0;i<e_szam;i++) bevetel=bevetel+utasok[i].fizet; cout << "A társaság bevétele: " << bevetel << endl; 108
109 void F5() //Több megoldás is lehetséges!!! int max_fel=0; //Második legnagyobb szám keresése felszálláskor for(int i=1;i<e_szam;i++) if(utasok[i].fel>max_fel&&utasok[i].fel!=vonalhossz) max_fel=utasok[i].fel; cout << "Utolsó előtti megálló felszállók esetén: " << max_fel << endl; int max_le=0; //Második legnagyobb szám keresése felszálláskor for(int i=1;i<e_szam;i++) if(utasok[i].le>max_le&&utasok[i].le!=vonalhossz) max_le=utasok[i].le; cout << "Utolsó előtti megálló leszállók esetén: " << max_le << endl; //Végső maximum, azaz utolsó előtti megálló //Valószínű, hogy a max_fel és max_le azonos, de hát ki tudja? int max; if(max_fel>=max_le) max=max_fel; else max=max_le; int fel_db=0, le_db=0; for(int i=0;i<e_szam;i++) if(utasok[i].fel==max) fel_db++; if(utasok[i].le==max) le_db++; cout << "Utolsó előtti megállónál felszállók száma: " << fel_db << endl; cout << "Utolsó előtti megállónál leszállók száma : " << le_db << endl; cout << endl; cout << "Fel- és leszállók összesen: " << fel_db+le_db << endl; 109
110 void F6() //Itt is több megoldás lehetséges! for(int i=0;i<201;i++) utvonal[i]=0; //Az utasok fel- és leszállása alapján növeljük az adott kilométernek megfelelő tömbelemet, //így jelezzük, hogy ott megálló volt for(int i=0;i<e_szam;i++) utvonal[utasok[i].fel]++; utvonal[utasok[i].le]++; int megallo_db=0; //0 és 200 km most nem játszik for(int i=1;i<200;i++) if(utvonal[i]!=0) megallo_db++; cout << "Az induló és a végállomás közötti megállók száma: " << megallo_db << endl; void F7() ofstream ki; ki.open("kihol.txt"); int tav; cout << "Távolság: "; cin >> tav; int ules[48]; //48 ülés van, kezdetben mind üres for(int i=0;i<48;i++) ules[i]=0; for(int i=0;i<e_szam;i++) //ha tav=felszallasi hely, azt is kezeljuk if(tav>=utasok[i].fel&&tav<utasok[i].le) ules[utasok[i].ules-1]=utasok[i].sorszam; for(int i=0;i<48;i++) if(ules[i]==0) ki << i+1 << ". ülés: üres" << endl; cout << i+1 << ". ülés: üres" << endl; else ki << i+1 << ". ülés: " << ules[i] << ". utas" << endl; cout << i+1 << ". ülés: " << ules[i] << ". utas" << endl; ki.close(); 110
111 int main() setlocale(lc_all, "hun"); cout << "Helyjegy" << endl; kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); kiir(6); F7(); return 0; 111
112 2010. OKTÓBER EMELT ANAGRAMMA
113 FELADAT SZÖVEGE Az anagramma a szójátékok egy fajtája, melyben értelmes szavak vagy mondatok betűinek sorrendjét úgy változtatjuk meg, hogy az eredmény szintén értelmes szó vagy mondat lesz. Sok anagramma esetén az eredeti szó és a végeredmény között humoros vagy egyéb kapcsolat van, ez növeli az anagramma érdekességét, értékét. Például a satu szó anagrammái: utas, tusa, suta. A szotar.txt ASCII kódolású állomány legfeljebb 300 különböző szót tartalmaz. A szavak legalább 2, legfeljebb 30 karakter hosszúságúak, és csak az angol ábécé kisbetűit tartalmazzák. Az állományban az egyes szavak külön sorokban szerepelnek, és minden szó csak egyszer fordulhat elő. Például: szotar.txt eszesen kereszt keretes keretez nyertesek hadartam maradhat Készítsen programot, amely az alábbi kérdésekre válaszol! A program forráskódját anagram néven mentse! Ügyeljen arra, hogy programjának minden helyes tartalmú bemeneti állomány esetén működnie kell! Minden részfeladat megoldása előtt írja a képernyőre a feladat sorszámát! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár (például az 1. feladat esetén: Adja meg a szöveget: )! A képernyőn megjelenített üzenetek esetén az ékezetmentes kiírás is elfogadott. 1. Kérjen be a felhasználótól egy szöveget, majd határozza meg, hogy hány különböző karakter található a szövegben! A darabszámot és a karaktereket írja ki a képernyőre! 2. Olvassa be a szotar.txt állományból a szavakat, és a következő feladatok megoldása során ezekkel dolgozzon! Amennyiben nem tudja beolvasni az állományból a szavakat, akkor az első 10 szóval dolgozzon! 3. Az állományból beolvasott szavakat alakítsa át úgy, hogy minden szó karaktereit egyenként tegye ábécérendbe! Az így létrehozott szavakat írja ki az abc.txt állományba az eredeti állománnyal egyező sorrendben! Például: Eredeti tervez nyugalom Ábécé sorrendben lévő eertvz aglmnouy 4. Kérjen be a felhasználótól két szót, és döntse el, hogy a két szó anagramma-e! Ha azok voltak, írja ki a képernyőre az Anagramma szót, ha nem, akkor pedig a Nem anagramma szöveget! 5. Kérjen be a felhasználótól egy szót! A szotar.txt állomány szavaiból keresse meg a szó anagrammáit (a szót önmagát is annak tekintve)! Ha van találat, azokat egymás alá írja ki a képernyőre, ha nem volt találat, akkor írja ki a Nincs a szótárban anagramma szöveget! 6. Határozza meg, hogy a szotar.txt állományban melyik a leghosszabb szó! Ha több, ugyanannyi karakterből álló leghosszabb szó volt, akkor az ugyanazokat a karaktereket tartalmazó szavakat (amelyek 113
114 egymás anagrammái) közvetlenül egymás alá írja ki! A feltételnek megfelelő összes szó pontosan egyszer szerepeljen a kiírásban! 7. Rendezze a szotar.txt állományban lévő szavakat a karakterek száma szerint növekvő sorrendbe! Az egyforma hosszúságú és ugyanazokat a karaktereket tartalmazó szavak (amelyek egymás anagrammái) szóközzel elválasztva ugyanabba a sorba kerüljenek! Az egyforma hosszúságú, de nem ugyanazokat a karaktereket tartalmazó szavak külön sorba kerüljenek! A különböző hosszúságú szavakat egy üres sorral különítse el egymástól! Az így rendezett szavakat írja ki a rendezve.txt állományba! Például: Eredeti halat Rendezett ajak ajka kaja rakat ajak papi pipa satu suta tusa utas papi rakta ajka takar kaja satu vallat halat rakat rakta takar tarka vallat paplan tarka pipa paplan FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS sz[300] r[300] string típusú 300 elemű tömb string típusú 300 elemű tömb A szotar.txt tárban található maximum 300 db szó tárolása Az sz tömb rendezett példánya, azaz ebben a tömbben az sz-beli szavak betűi rendezve szerepelnek N int A szotar.txt-ben szereplő szavak száma globális globális globális 114
115 PROGRAMKÓD #include <iostream> #include <fstream> #include <string> #include <windows.h> using namespace std; string sz[300]; string r[300]; int N; string szorendezo(string a) for(int i=0;i<a.length()-1;i++) for(int j=i+1;j<a.length();j++) if(a[i]>a[j]) swap(a[i],a[j]); return a; void F1() string be; cout << "Szöveg:"; cin >> be; if(be.length()>0) //rendezés be=szorendezo(be); cout << "Rendezve: " << be << endl; else //számolás int db=1; for(int i=1;i<be.length();i++) if(be[i]!=be[i-1]) db++; cout << "A különböző karakterek száma: " << db << endl; cout << "Üres szöveg: " << 0 << " db karakter" << endl; 115
116 void F2() ifstream be; be.open("szotar.txt"); int i=0; while(!be.eof()) be >> sz[i]; i++; //szavak száma N=i; be.close(); void F3() ofstream ki; ki.open("abc.txt"); for(int i=0;i<n;i++) r[i]=szorendezo(sz[i]); ki << r[i] << endl; cout << r[i] << endl; ki.close(); void F4() string a, b; cout << "Kérek 2 szót!" << endl; cout << "1. szó: "; cin >> a; cout << "2. szó: "; cin >> b; if(szorendezo(a)==szorendezo(b)) cout << "Anagramma" << endl; else cout << "Nem anagramma" << endl; 116
117 void F5() string t; cout << "Kérek egy szót: "; cin >> t; t=szorendezo(t); int db=0; cout << "Találatok:" << endl; for(int i=0;i<n;i++) if(t==r[i]) cout << sz[i] << endl; db++; if(db==0) cout << "Nincs a szótárban anagramma" << endl; void F6() //r és sz tömb rendezése szavak hossza szerint csökkenőbe, //azonos szóhosszúság esetén ABC rend szerint rendezünk for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if(r[i].length()<r[j].length() (r[i].length()==r[j].length()&&r[i]<=r[j])) swap(r[i],r[j]); swap(sz[i],sz[j]); int s=0; while(r[s].length()==r[0].length()) cout << r[s] << " eredeti: " << sz[s] << endl; s++; 117
118 void F7() //Hosszúság szerint növekvően, azon belül ABC rendbe rendezzük az r tömböt, //és vele párhuzamosan az sz tömböt is átrendezzük. Hasonlóan a 6. feladathoz. for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if(r[i].length()>r[j].length() (r[i].length()==r[j].length()&&r[i]>=r[j])) swap(r[i],r[j]); swap(sz[i],sz[j]); ofstream ki; ki.open("rendezve.txt"); for(int i=0;i<n;i++) if(sz[i].length()==sz[i+1].length() && i<n-1) //anagrammák egymás mellé kerülnek if(r[i] == r[i+1]) ki << sz[i] << " "; else ki << sz[i] << endl; else if(i==n-1) ki << sz[i]; else ki << sz[i] << endl << endl; ki.close(); int main() setlocale(lc_all, "hun"); F1(); F2(); F3(); F4(); F5(); F6(); F7(); return 0; 118
119 2011. MÁJUS EMELT SZÓJÁTÉK
120 FELADAT SZÖVEGE Sok szórakoztató szójátékkal lehet elütni az időt. Ezek közül némelyekhez segítségül hívhatjuk a technikát is. Az alábbiakban szójátékokhoz kapcsolódó problémákat kell megoldania. A feladatok megoldásához rendelkezésére áll a szoveg.txt fájl, amelybe Gárdonyi Géza Egri csillagok című regényéből gyűjtöttünk ki szavakat. Az állományban csak olyan szavak szerepelnek, melyek az angol ábécé betűivel leírhatók, és minden szó csak egyszer szerepel. A könnyebb feldolgozhatóság érdekében valamennyi szó csupa kisbetűvel szerepel, szavanként külön sorban. Tudjuk, hogy ebben az állományban a szavak 20 karakternél nem hosszabbak. Készítsen programot, amely az alábbi feladatokat megoldja! A program forráskódját szavak néven mentse! Minden képernyőre írást igénylő részfeladat megoldása előtt írja a képernyőre a feladat sorszámát! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár (például a 1. feladat esetén: 1. feladat Adjon meg egy szót: )! Az ékezetmentes kiírás is elfogadott. 1. Kérjen be a felhasználótól egy szót, és döntse el, hogy tartalmaz-e magánhangzót! Amennyiben tartalmaz, írja ki, hogy Van benne magánhangzó.! Ha nincs, akkor írja ki, hogy Nincs benne magánhangzó.! A begépelendő szóról feltételezheti, hogy csak az angol ábécé kisbetűit tartalmazza. (Az angol ábécé magánhangzói: a, e, i, o, u.) 2. Írja ki a képernyőre, hogy melyik a leghosszabb szó a szoveg.txt állományban, és az hány karakterből áll! Ha több azonos leghosszabb hosszúságú szó is van a szógyűjteményben, akkor azok közül elegendő egyetlen szót kiírnia. A feladatot úgy oldja meg, hogy tetszőleges hosszúságú szövegállomány esetén működjön, azaz a teljes szöveget ne tárolja a memóriában! 3. A magyar nyelv szavaiban általában kevesebb a magánhangzó, mint a mássalhangzó. Határozza meg, hogy az állomány mely szavaiban van több magánhangzó, mint egyéb karakter! Ezeket a szavakat írja ki a képernyőre egy-egy szóközzel elválasztva! A szavak felsorolása után a mintának megfelelően az alábbi adatokat adja meg: hány szót talált; hány szó van összesen az állományban; a talált szavak hány százalékát teszik ki az összes szónak! A százalékot két tizedessel szerepeltesse! Például: 130/3000 : 4,33% A következőkben a szólétra játékkal kapcsolatos feladatokat kell megoldania. A szólétra építés egy olyan játék, amikor adott egy szó közepe, például isz, amit a létra fokának nevezünk. Ennek a szócsonknak az elejére és a végére kell egy-egy betűt illesztenünk úgy, hogy értelmes szót hozzunk létre, például hiszi vagy liszt. Ezt az értelmes szót a játékban létraszónak nevezzük. Az adott szórészlethez minél több létraszót tudunk kitalálni, annál magasabb lesz a szólétra. A cél az, hogy egy megadott szócsonkhoz a lehető legmagasabb szólétrát építsük. 120
121 Például: Szórészlet: isz A hozzá tartozó létraszavak: hiszi liszt viszi tiszt 4. Hozzon létre egy tömb vagy lista adatszerkezetet, és ebbe gyűjtse ki a fájlban található ötkarakteres szavakat! A szoveg.txt állomány legfeljebb 1000 darab ötkarakteres szót tartalmaz. Kérjen be a felhasználótól egy 3 karakteres szórészletet! Írja ki a képernyőre a szólétra építés szabályai szerint hozzá tartozó ötkarakteres szavakat a tárolt adathalmazból! A kiírásnál a szavakat egy-egy szóköz válassza el! (Teszteléshez használhatja például az isz vagy obo szórészleteket, mert ezekhez a megadott szövegállományban több létraszó is tartozik.) 5. Az eltárolt ötkarakteres szavakból csoportosítsa azokat a szavakat, melyek ugyanannak a hárombetűs szórészletnek a létraszavai! Hozzon létre egy letra.txt állományt, amelybe ezeket a szavakat írja az alábbiak szerint: minden szó külön sorba kerüljön; csak olyan szó szerepeljen az állományban, aminek van legalább egy párja, amivel egy létrát alkotnak (azaz első és utolsó karakter nélkül megegyeznek); az egy létrához tartozó szavak közvetlenül egymás után helyezkedjenek el; két létra szavai között egy üres elválasztó sor legyen! Például: letra.txt megye vegye hegyi tegye lehet teher mehet tejes fejet fejen neked nekem reked
122 FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS szavak[1000] string 1000 elemű stringeket tartalmazó tömb Az ötbetűs szavakat tárolja. A 4. és 5. feladatban használjuk. globális SZ int A szoveg.txt fájlból beolvasott szavak száma ot int Az ötbetűs szavak száma. A 4. és 5. feladatban használjuk. globális globális Ebben a feladatban a stringekkel kapcsolatos eszközökre lesz szükség, így javaslom az ide vonatkozó fejezet tanulmányozását NÉHÁNY MŰVELET STRINGEKKEL! 122
123 PROGRAMKÓD #include <iostream> #include <fstream> #include <string> #include <windows.h> #include <iomanip> //precision miatt using namespace std; #define N 1000 string szavak[n]; int SZ, ot; //ot - az ötbetűs szavak száma void kiir(int szam) cout << " " << endl; cout << szam << ". feladat" << endl; cout << " " << endl; int maganhangzo(string szo) int db=0; char mh[5]='a', 'e', 'i', 'o', 'u'; for(int i=0;i<szo.length();i++) for(int j=0;j<5;j++) if(szo[i]==mh[j]) db++; return db; void F1() string be; cout << "Kérek egy szót: "; cin >> be; int mennyi=maganhangzo(be); if(mennyi >0) cout << "Van benne magánhangzó." << " db: " << mennyi; else cout << "Nincs benne magánhangzó."; cout << endl; 123
124 void F2() ifstream be; be.open("szoveg.txt"); string s; string max=""; int i=0; while(!be.eof()) be >> s; if(s.length()>max.length()) max=s; i++; SZ=i-1; //beolvasott szavak száma! 3. feladathoz jó lesz! cout << "A leghosszab szó: " << max << endl; be.close(); void F3() ifstream be; be.open("szoveg.txt"); string s; string max=""; int db=0; while(!be.eof()) be >> s; if(maganhangzo(s)>s.length()/2) cout << s << " "; db++; cout << endl; be.close(); cout << "Talált szavak száma: " << db << " db." << endl; cout << "Összes szavak száma: " << SZ << " db." << endl; cout << "Százalékban: " << db << "/" << SZ << " : "; cout.precision(4); cout << (float) db/sz*100 << "%" << endl; 124
125 void F4() ifstream be; be.open("szoveg.txt"); string s; ot=0; //Feltetelzhetjuk, hogy lesznek 5 betűs szavak for(int i=0;i<sz;i++) be >> s; if(s.length()==5) szavak[ot]=s; ot++; be.close(); string harom; cout << "Kérek egy 3 karakteres szórészletet: "; cin >> harom; for(int i=0;i<ot;i++) if(szavak[i].substr(1,3)==harom) cout << szavak[i] << " "; cout << endl; //1,3 mert a karakterek indexelése 125
126 void F5() //Rendezéssel is megoldható, de lehet más megoldás is //Próbáljuk meg a középső három karakter szerint rendezni a szavakat for(int i=0;i<ot-1;i++) for(int j=i+1;j<ot;j++) if(szavak[i].substr(1,3)>szavak[j].substr(1,3)) swap(szavak[i],szavak[j]); ofstream ki; ki.open("letra.txt"); //Most nézzük a rendezett tömb szavainak a közepét bool enter=false; for(int i=1;i<ot;i++) if(szavak[i].substr(1,3)==szavak[i-1].substr(1,3)) cout << szavak[i-1] << endl; ki << szavak[i-1] << endl; enter=true; else if(enter) cout << szavak[i-1] << endl; cout << endl; ki << szavak[i-1] << endl; ki << endl; enter=false; ki.close(); int main() setlocale(lc_all, "hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); return 0; 126
127 2011. OKTÓBER EMELT PITYPANG
128 FELADAT SZÖVEGE A kerekdombi Pitypang wellness hotel nem régen nyitotta meg kapuit. A szállodában összesen 27 szoba van. A szobák egységesen kétágyasak, de minden szobában egy pótágy elhelyezésére is van lehetőség. Árképzés szempontjából három különböző időszakot határolt el a szálloda vezetősége: tavaszi, nyári és őszi szakaszt. Ennek megfelelően az árakat az alábbi táblázat tartalmazza. Tavasz Nyár Ősz Ft Ft Ft A feltüntetett értékek egy szoba árát mutatják egy éjszakára. Ha csak egy fő száll meg, akkor is ki kell fizetni a teljes szobaárat. Egy adott foglalás besorolása az érkezés napjától függ. A pótágy díja Ft éjszakánként. Amennyiben a vendég igényel reggelit, azért a fenti áron felül személyenként és naponként Ft-ot kell fizetni. Ha például a két felnőttből és egy gyermekből álló Tóth család április 30. és május 4. között 4 éjszakát tölt a hotelben és kér reggelit, akkor ők az alábbi összegeket fizetik: Ft-ot a szobáért, Ft-ot a pótágyért, Ft-ot a reggeliért. A végső számla így Ft Ft Ft = Ft lesz. A szálloda eddigi foglalásait a pitypang.txt fájl tartalmazza. Az első sor a fájlban tárolt foglalások számát mutatja. A további sorokban szóközzel elválasztva soronként az alábbi adatok találhatók: a foglalás sorszáma, a szoba száma (1 27), az érkezés napjának sorszáma, a távozás napjának sorszáma, a vendégek száma, kérnek-e reggelit (1=igen vagy 0=nem), a foglalást végző vendég nevéből képzett azonosítója (maximum 25 karakter). A napok sorszámozása január 1-jétől (1-es sorszám) kezdődik. Április 30-hoz például a = 120-as sorszám tartozik. A Tóth család foglalása ebben a szerkezetben a következőképpen néz ki: Toth_Balint A fájl egy éven belül tartalmaz foglalásokat. Az adatok az érkezés napja szerint növekvő sorrendben vannak rendezve a fájlban. Tájékoztatásul a honapok.txt fájl a hónapok neveit, a rá következő sorban az adott hónap napjainak számát, majd az ezt követő sorban pedig a hónap első napjának sorszámát tartalmazza. Az állományt forrásfájlként is felhasználhatja. A fenti táblázatnak megfelelő nyári időszak a 121. napon, míg az őszi a 244. napon kezdődik. Készítsen programot szalloda néven, amely az alábbi kérdésekre válaszol! 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:)! Ahol a felhasználótól kér be adatot, ott írja a képernyőre, hogy milyen adatot vár! 128
129 1. Olvassa be az pitypang.txt állományban található maximum 1000 foglalás adatát, s annak felhasználásával oldja meg a következő feladatokat! Ha az állományt nem tudja beolvasni, akkor a benne található adatok közül az 1-5, és foglalási sorszámú sorok adatait jegyezze be a programba, s úgy oldja meg a feladatokat! 2. Jelenítse meg a képernyőn a leghosszabb szállodai tartózkodást! Csak az időtartamot vegye figyelembe, azaz nem számít, hogy hány vendég lakott az adott szobában! Az esetlegesen azonos hosszúságú tartózkodások közül bármelyiket kiválaszthatja. Az eredményt ebben a formában írja a képernyőre: Név (érkezési_nap_sorszáma) eltöltött_éjszakák_száma például: Nagy_Bertalan (105) Számítsa ki, hogy az egyes foglalások után mennyit kell fizetnie az egyes vendégeknek! A foglalás sorszámát és a kiszámított értékeket kettősponttal elválasztva írja ki a bevetel.txt fájlba! Ez a példában szereplő Tóth család esetén a következő lenne: 123:57200 (Amennyiben nem tudja a fájlba íratni a kiszámított értékeket, úgy az első tíz foglaláshoz tartozó értéket a képernyőre írassa ki!) Írja a képernyőre a szálloda teljes évi bevételét! 4. Készítsen statisztikát az egyes hónapokban eltöltött vendégéjszakákról! Egy vendégéjszakának egy fő egy eltöltött éjszakája számít. A példában szereplő Tóth család áprilisban 3, májusban pedig 9 vendégéjszakát töltött a szállodában. Írassa ki a havi vendégéjszakák számát a képernyőre az alábbi formában: hónap_sorszáma: x vendégéj például: 8: 1059 vendégéj 5. Kérje be a felhasználótól egy új foglalás kezdő dátumához tartozó nap sorszámát és az eltöltendő éjszakák számát! Határozza meg, hogy hány szoba szabad a megadott időszak teljes időtartamában! A választ írassa ki a képernyőre! 129
130 FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS fogl[1000] foglalas típusú 1000 elemű tömb, minden eleme egy adathetest tartalmaz struktúra 7 adatmezővel: s foglalás sorszáma sz szoba száma e érkezés napja t távozás napja v vendégek száma r reggeli (1/0) az vendég azonosítója (string) A fájlban található adatok tárolása. globális ho[12] honap típusú 12 elemű tömb, minden eleme egy adathármast tartalmaz struktúra 3 adatmezővel: hn hónap neve nap hónap napjainak száma ksz hónap kezdő napjának sorszáma A fájlban található adatok tárolása. globális N int foglalások száma (a fájl első sora) szabad[27][365] bool mátrix Utolsó feladatban kell. Logikai mátrix, melyben false egy elem, ha foglalt a szoba az adott napon, és true, ha szabad. 27 szoba, minden szoba 365 napját kezeljük vele globális lokális 130
131 PROGRAMKÓD #include <iostream> #include <fstream> #include <conio.h> #include <stdio.h> #include <windows.h> #include <cmath> //math.h #include <ctime> #include <string> using namespace std; struct honap string hn; //hónap neve int nap; //hónap napjainak száma int ksz; //hónap kezdősorszáma ho[12]; //12 hónap tömbje, minden eleme 3 mezőből áll struct foglalas int s, sz, e, t, v, r; string az; fogl[1000]; int N; void F1() ifstream be; be.open("pitypang.txt"); be >> N; for(int i=0;i<n;i++) be >> fogl[i].s; be >> fogl[i].sz; be >> fogl[i].e; be >> fogl[i].t; be >> fogl[i].v; be >> fogl[i].r; be >> fogl[i].az; be.close(); 131
132 void F1_2() ifstream be; be.open("honapok.txt"); for(int i=0;i<12;i++) be >> ho[i].hn; be >> ho[i].nap; be >> ho[i].ksz; cout << ho[i].hn << " " << ho[i].nap << ho[i].ksz << endl; be.close(); void F2() int max=0; int maxth=fogl[max].t-fogl[max].e; for(int i=1;i<n;i++) if(fogl[i].t-fogl[i].e>maxth) max=i; maxth=fogl[i].t-fogl[i].e; cout << fogl[max].az << " (" << fogl[max].e << ") - " << maxth << endl; 132
133 void F3() int bev=0; int fiz; ofstream ki; ki.open("bevetel.txt"); for(int i=0;i<n;i++) if(fogl[i].e<121) fiz=9000; if(fogl[i].e>=121&&fogl[i].e<244) fiz=10000; if(fogl[i].e>=244) fiz=8000; //pótágy 2000/éj if(fogl[i].v>2) fiz=fiz+(fogl[i].t-fogl[i].e)*2000; //reggeli 1100/fő/nap if(fogl[i].r==1) fiz=fiz+fogl[i].v*(fogl[i].t-fogl[i].e)*1100; ki << fogl[i].s << ":" << fiz << endl; bev=bev+fiz; fiz=0; ki.close(); cout << "Összbevétel: " << bev << endl; int hol_van(int x) int honap=0; for(int i=0;i<12;i++) if(i<11) if(x>=ho[i].ksz&&x<ho[i+1].ksz) honap=i; //Január-november else if(x>=ho[i].ksz) honap=i; return honap; 133
134 void F4() int vej[12]; for(int i=0;i<12;i++) vej[i]=0; int erk_honap; int tav_honap; for(int i=0;i<n;i++) erk_honap=hol_van(fogl[i].e); tav_honap=hol_van(fogl[i].t); if(erk_honap==tav_honap) vej[erk_honap]+=(fogl[i].t-fogl[i].e)*fogl[i].v; else vej[erk_honap]+=(ho[tav_honap].ksz-fogl[i].e)*fogl[i].v; vej[tav_honap]+=(fogl[i].t-ho[tav_honap].ksz)*fogl[i].v; // cout << "vej: " << vej[erk_honap] << " " << vej[tav_honap] << endl; for(int i=0;i<12;i++) cout << i+1 << ": " << vej[i] << " vendégéj" << endl; 134
135 void F5() char szabad[27][365]; for(int i=0;i<27;i++) for(int j=0;j<365;j++) szabad[i][j]=true; int x,y,z; //x - szoba (sor), y - érkezés napja (oszlopok) z - távozás napja for(int i=0;i<n;i++) x=fogl[i].sz-1; //-1 mert indexek elcsusznak y=fogl[i].e-1; z=fogl[i].t-1; //foglalások alapján false-ra állítjuk a foglalt napokat az egyes szobákban for(int j=y;j<z;j++) szabad[x][j]=false; //adatok bekérése a felhasználótól: mikor jön és hány éjszakára int enap, ejsz; cout << "Új foglalás" << endl; cout << "Érkezési nap sorszáma: "; cin >> enap; cout << "Eltöltendő éjszakák száma:"; cin >> ejsz; //ejsz hosszú TRUE értékű sorozat keresése a SZABAD mátrixban bool van=false; int j,db; //szobánként haladunk for(int i=0;i<27;i++) j=enap-1; db=0; //számoljuk az egymást követő szabad napokat egy-egy szobánál ejsz hosszú "szakaszon" while(j<enap+ejsz-1) if(szabad[i][j]) db++; j++; if(db==ejsz) van=true; cout << i+1 << ". szoba" << endl; break; //Nem elegáns, de ha volt ilyen szabad sorozat, akkor fejezzük be! if(!van) cout << "Nincs szabad szoba ebben az időszakban!" << endl; 135
136 int main() setlocale(lc_all, "hun"); cout << "1. feladat" << endl; F1(); F1_2(); cout << "2. feladat" << endl; F2(); cout << "3. feladat" << endl; F3(); cout << "4. feladat" << endl; F4(); cout << "5. feladat" << endl; F5(); return 0; 136
137 2012. MÁJUS EMELT FUTÁR
138 FELADAT SZÖVEGE A nagyvárosokon belül, ha csomagot gyorsan kell eljuttatni egyik helyről a másikra, akkor sokszor a legjobb választás egy kerékpáros futárszolgálat igénybevétele. A futárszolgálat a futárjainak a megtett utak alapján ad fizetést. Az egyik futár egy héten át feljegyezte fuvarjai legfontosabb adatait, és azokat eltárolta egy állományban. Az állományban az adatok rögzítése nem mindig követi az időrendi sorrendet. Azokra a napokra, amikor nem dolgozott, nincsenek adatok bejegyezve az állományba. A fájlban legalább 10 sor van, és minden sor egy-egy út adatait tartalmazza egymástól szóközzel elválasztva. Az első adat a nap sorszáma, ami 1 és 7 közötti érték lehet. A második szám a napon belüli fuvarszám, ami 1 és 40 közötti érték lehet. Ez minden nap 1-től kezdődik, és az aznapi utolsó fuvarig egyesével növekszik. A harmadik szám az adott fuvar során megtett utat jelenti kilométerben, egészre kerekítve. Ez az érték nem lehet 30-nál nagyobb. Például: A 3. sor például azt mutatja, hogy a hét harmadik napján a második fuvar 12 kilométeres távolságot jelentett. Készítsen programot, amely a tavok.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse futar néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.) 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:)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott. 1. Olvassa be a tavok.txt állományban talált adatokat, s annak felhasználásával oldja meg a következő feladatokat! 2. Írja ki a képernyőre, hogy mekkora volt a hét legelső útja kilométerben! Figyeljen arra, hogy olyan állomány esetén is helyes értéket adjon, amiben például a hét első napján a futár nem dolgozott! 3. Írja ki a képernyőre, hogy mekkora volt a hét utolsó útja kilométerben! 4. Tudjuk, hogy a futár minden héten tart legalább egy szabadnapot. Írja ki a képernyőre, hogy a hét hányadik napjain nem dolgozott a futár! 5. Írja ki a képernyőre, hogy a hét melyik napján volt a legtöbb fuvar! Amennyiben több nap is azonos, maximális számú fuvar volt, elegendő ezek egyikét kiírnia. 6. Számítsa ki és írja a képernyőre a mintának megfelelően, hogy az egyes napokon hány kilométert kellett tekerni! 1. nap: 124 km 2. nap: 0 km 3. nap: 75 km 138
139 7. A futár az egyes utakra az út hosszától függően kap fizetést az alábbi táblázatnak megfelelően: 1 2 km 500 Ft 3 5 km 700 Ft 6 10 km 900 Ft km Ft km Ft Kérjen be a felhasználótól egy tetszőleges távolságot, és határozza meg, hogy mekkora díjazás jár érte! Ezt írja a képernyőre! 8. Határozza meg az összes rögzített út ellenértékét! Ezeket az értékeket írja ki a dijazas.txt állományba nap szerint, azon belül pedig az út sorszáma szerinti növekvő sorrendben az alábbi formátumban: 1. nap 1. út: 700 Ft 1. nap 2. út: 900 Ft 1. nap 3. út: 2000 Ft 9. Határozza meg, és írja ki a képernyőre, hogy a futár mekkora összeget kap a heti munkájáért! FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS adatok[7][40] futar típusú 7x40 elemű tömb, minden eleme egy adatkettőst tartalmaz struktúra 2 adatmezővel: km adott nap, adott fuvar megtett km-re ft adott nap, adott fuvar megtett kilométere után fizetendő összeg A fájlban található adatok tárolása, egyben a feladatot leegyszerűsítő adatszerkezet, mivel pontosan napok szerint indexelt és fuvar szerint indexelt a mátrix az ft mezőt csak a 8. feladattól használjuk, akkor kap értéket napi_km[7] int 7 elemű tömb egy adott naphoz a 7 közül a napi összes km-t tartalmazza elso_nap int kezdőértékkel rendelkező változó kezdőértéke: 7+1 utolso_nap int kezdőértékkel rendelkező változó kezdőértéke: 0 adatbeolvasás során ebbe helyezzük az első nap sorszámát. Azért 8 a kezdőértéke, hogy tudjunk nála kisebbet keresni. 2. feladat adatbeolvasás során ebbe helyezzük az utolsó nap sorszámát. Azért 0 a kezdőértéke, hogy tudjunk nála nagyobbat keresni. 3. feladat globális globális globális globális 139
140 PROGRAMKÓD #include <iostream> #include <fstream> #include <windows.h> using namespace std; struct futar int km; int ft; adatok[7][40]; int elso_nap=7+1, utolso_nap=0, napi_km[7]; void kiir(int szam) cout << endl; cout << szam << ". FELADAT" << endl; cout << "..." << endl; void F1() /*mátrix nullázása, hogy ha egy nap nem volt fuvar, vagy nem volt 40 fuvar, csak kevesebb, akkor ott nulla legyen. Ezt később ki tudjuk használni.*/ for(int i=0;i<7;i++) for(int j=0;j<40;j++) adatok[i][j].km=0; ifstream be; be.open("tavok.txt"); int nap, fuvar; int i=0; while(!be.eof()) be >> nap; if(nap<elso_nap) elso_nap=nap; //minimumkeresés if(nap>utolso_nap) utolso_nap=nap; //maximumkeresés be >> fuvar; be >> adatok[nap-1][fuvar-1].km; //Ez itt a lényeg, azindexelés!!!!! cout << nap << " " << fuvar << " " << adatok[nap-1][fuvar-1].km << endl; i++; cout << "Első nap: " << elso_nap << " utolsó nap: " << utolso_nap << endl; be.close(); 140
141 void F2() cout << elso_nap << ".nap első fuvar: " << adatok[elso_nap-1][0].km << " km volt" << endl; void F3() //lineáris keresés a végétől az eleje felé int j=39; while(j>-1&&adatok[utolso_nap-1][j].km==0) j--; if(j>-1) cout << "A(z) " << utolso_nap << ". nap (utolsó nap) utolsó fuvar: " << adatok[utolso_nap-1][j].km << " km" << endl; void F4() int i=0; int db=0; for(int i=0;i<7;i++) if(adatok[i][0].km==0) cout << i+1 << ". napon nem dolgozott" << endl; db++; if(db==0) cout << "Minden nap dolgozott!" << endl; 141
142 void F5() int max_fuvar=0, mikor; for(int i=0;i<7;i++) int j=0; while(j<40&&adatok[i][j].km!=0) j++; if(j<40) if(j>max_fuvar) max_fuvar=j; mikor=i+1; cout << "A(z) " << mikor << ". napon ment a legtöbbet!" << endl; void F6_seged() //napi összegzés //ha kevés elem van, így is adhatunk nekik kezdőértéket napi_km[7]=(0,0,0,0,0,0,0); for(int i=0;i<7;i++) for(int j=0;j<40;j++) napi_km[i]=napi_km[i]+adatok[i][j].km; void F6() //F6_seged alapjan itt már csak ki kell írni az adatokat! for(int i=0;i<7;i++) cout << i+1 << ". nap: " << napi_km[i] << " km" << endl; 142
143 int F7_kalkulator(int tav) // 1 2 km 500 Ft // 3 5 km 700 Ft // 6 10 km 900 Ft // km 1400 Ft // km 2000 Ft int fizet=0; if(tav<3) fizet=500; else if(tav<6) fizet=700; else if(tav<11) fizet=900; else if(tav<21) fizet=1400; else if(tav<31) fizet=2000; else fizet=0; // :) Ez a feladatból következik, nem... :) return fizet; void F7() int tavolsag; cout << "Adjon meg egy távolságot: "; cin >> tavolsag; cout << "Erre jár " << F7_kalkulator(tavolsag) << " Ft." << endl; 143
144 void F8() ofstream ki; ki.open("dijazas.txt"); //Itt is nagyon jól kihasználhatjuk a mátrixunk előnyeit, //mely mátrix - ugye - napok és utak szerint indexelt!! for(int i=0;i<7;i++) //napok szerint megy a ciklus for(int j=0;j<40;j++) //azon belül pedig utanként if(adatok[i][j].km!=0) //csak akkor írjuk ki a mátrix alapján a Ft-ot, ha ott tényleg volt út!! //csak egyszerűen a kalkulátorra bízzuk a számolást és rögtön kiírjuk az eredményt! //képernyőre... ki.close(); //a 9. feladathoz kell, hogy ez a ft mező is feltöltésre kerüljön. //akár itt is összegezhetnénk a keresetet, de meghagyjuk a 9. pontnak! adatok[i][j].ft=f7_kalkulator(adatok[i][j].km); cout << i+1 << ". nap " << j+1 << ". út: " << adatok[i][j].ft << " Ft" << endl; //...és fájlba ki << i+1 << ". nap " << j+1 << ". út: " << adatok[i][j].ft << " Ft" << endl; void F9() int kereset=0; //Egyszerű összegzés mátrix elemekre for(int i=0;i<7;i++) //napok szerint megy a ciklus for(int j=0;j<40;j++) //azon belül pedig utanként if(adatok[i][j].km!=0) //csak akkor számolunk a mátrix alapján a Ft-ot, ha ott tényleg volt út!! kereset=kereset+adatok[i][j].ft; cout << "Heti munka díjazása: " << kereset << " Ft" << endl; 144
145 int main() setlocale(lc_all, "hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); kiir(7); F7(); kiir(8); F8(); kiir(9); F9(); return 0; 145
146 2012. OKTÓBER EMELT SZÍN-KÉP
147 FELADAT SZÖVEGE Egy digitális kép tárolásánál minden egyes képpont színét tároljuk. A képpontok színét az RGB kód adja. Az RGB kód a vörös (R), zöld (G) és a kék (B) színösszetevő értékét határozza meg. Ezen színösszetevők értéke 0 és 255 közötti egész szám lehet. A kep.txt fájlban egy képpontos kép képpontjainak RGB kódjai vannak a következő formában. Az állomány a képet sorfolytonosan, a képpontok RGB kódját szóközzel elválasztva tartalmazza, minden képpontot egy újabb sorban: Készítsen programot szinkep néven a következő feladatok megoldására! A program futása során a képernyőre való kiíráskor, illetve az adatok billentyűzetről való beolvasásakor utaljon a feladat sorszámára és a kiírandó, illetve bekérendő adatra! 1. Olvassa be a fájlból egy megfelelő adatszerkezetbe az egyes képpontok RGB kódját! 2. Kérjen be a felhasználótól egy RGB kódot! Állapítsa meg a program segítségével, hogy a bekért szín megtalálható-e a képen! A megállapítás eredményét írja ki a képernyőre! 3. Határozza meg, hogy a kép 35. sor 8. képpontjának színe hányszor szerepel a 35. sorban, illetve a 8. oszlopban. Az értékeket írja ki a képernyőre az alábbi formában: Például: Sorban: 5 Oszlopban: Állapítsa meg, hogy a vörös, kék és zöld színek közül melyik szín fordul elő legtöbbször a képen! Az (egyik) legtöbbször előforduló szín nevét írja ki a képernyőre! A színek kódjai: Vörös 255, 0, 0 Zöld 0, 255, 0 Kék 0, 0, Készítsen 3 képpont széles, fekete színű keretet a képnek! A keretet úgy hozza létre, hogy a kép mérete ne változzon! A fekete szín kódja RGB (0, 0, 0). 6. A kép képpontjainak színét írja ki a keretes.txt nevű szövegfájlba a bemeneti fájl formátumával egyezően! A képet sorfolytonosan tárolja, minden képpontot új sorba, a képpontok RGB kódját szóközzel elválasztva írja ki! Például:
148 7. Az es képen a kerettől függetlenül egy sárga RGB (255, 255, 0) színű téglalap van. Határozza meg a program segítségével a bal felső és a jobb alsó sárga képpontnak a helyét (sor, oszlop), majd határozza meg, hogy a sárga téglalap hány képpontból áll! A képpontok helyét és a sárga alakzat méretét a következő formában írassa ki a képernyőre: Például: Kezd: sor, oszlop Vége: sor, oszlop Képpontok száma: darab Kezd: 18, 12 Vége: 25, 19 Képpontok száma: 64 FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS kep[50][50] RGB típus 50x50-es mátrix, minden eleme egy adathármast tartalmaz struktúra 3 adatmezővel: R vörös színkód G zöld színkód B kék színkód A fájlban található adatok tárolása. globális 148
149 PROGRAMKÓD #include <iostream> #include <fstream> using namespace std; struct RGB int R; int G; int B; kep[50][50]; void kiir(int ssz) cout << ssz << ".feladat" << endl; void F1() ifstream be; be.open("kep.txt"); for(int i=0;i<50;i++) for(int j=0;j<50;j++) be >> kep[i][j].r; be >> kep[i][j].g; be >> kep[i][j].b; be.close(); 149
150 void F2() int r,g,b; cout << "Kérek egy RGB kódot:"; cout << "r="; cin>>r; cout << "g="; cin>>g; cout << "b="; cin>>b; int i=0; int j=0; while(i<50&&!(kep[i][j].r==r&&kep[i][j].g==g&&kep[i][j].b==b)) //Lineáris keresés mátrixra alkalmazása j=0; while(j<50&&!(kep[i][j].r==r&&kep[i][j].g==g&&kep[i][j].b==b)) j++; i++; if(i<50) cout << "Van ilyen kód!"; else cout << "Nincs ilyen kód!"; cout << endl; void F3() int r=kep[34][7].r; int g=kep[34][7].g; int b=kep[34][7].b; int sdb=0,odb=0; for(int i=0;i<50;i++) if(kep[34][i].r==r&&kep[34][i].g==g&&kep[34][i].b==b) sdb++; for(int i=0;i<50;i++) if(kep[i][7].r==r&&kep[i][7].g==g&&kep[i][7].b==b) odb++; cout << "Sorban: " << sdb << " Oszlopban: " << odb << endl; 150
151 void F4() //3 elemű tömb, az egyes színek (V, Z, K) előfordulásának számolására int szin[3]=0, 0, 0; //Kevés elem esetén így is adhatunk kezdőértéket a tömbelemeknek for(int i=0;i<50;i++) for(int j=0;j<50;j++) if(kep[i][j].r==255&&kep[i][j].g==0&&kep[i][j].b==0) szin[0]++; if(kep[i][j].r==0&&kep[i][j].g==255&&kep[i][j].b==0) szin[1]++; if(kep[i][j].r==0&&kep[i][j].g==0&&kep[i][j].b==255) szin[2]++; int max=0, sorszam; for(int i=0;i<3;i++) if(szin[i]>max) max=szin[i]; sorszam=i; switch(sorszam) case 0: cout << "Leggyakoribb szín: VÖRÖS"; break; case 1: cout << "Leggyakoribb szín: ZÖLD"; break; case 2: cout << "Leggyakoribb szín: KÉK"; break; cout << endl; void F5() for(int i=0;i<50;i++) //ELSŐ és UTOLSÓ HÁROM SOR átszínezése kep[0][i].r=0; kep[0][i].g=0; kep[0][i].b=0; kep[1][i].r=0; kep[1][i].g=0; kep[1][i].b=0; kep[2][i].r=0; kep[2][i].g=0; kep[2][i].b=0; kep[47][i].r=0; kep[47][i].g=0; kep[47][i].b=0; kep[48][i].r=0; kep[48][i].g=0; kep[48][i].b=0; kep[49][i].r=0; kep[49][i].g=0; kep[49][i].b=0; //ELSŐ és UTOLSÓ HÁROM OSZLOP átszínezése kep[i][0].r=0; kep[i][0].g=0; kep[i][0].b=0; kep[i][1].r=0; kep[i][1].g=0; kep[i][1].b=0; kep[i][2].r=0; kep[i][2].g=0; kep[i][2].b=0; kep[i][47].r=0; kep[i][47].g=0; kep[i][47].b=0; kep[i][48].r=0; kep[i][48].g=0; kep[i][48].b=0; kep[i][49].r=0; kep[i][49].g=0; kep[i][49].b=0; 151
152 void F6() ofstream ki; ki.open("keretes.txt"); for(int i=0;i<50;i++) for(int j=0;j<50;j++) ki << kep[i][j].r << " "; ki << kep[i][j].g << " "; ki << kep[i][j].b << endl; ki.close(); 152
153 void F7() int i, j, ki, kj, vi, vj; // ki - sárga terület balfelső sarok i. sora, kj - sárga terület balfelső sarok j. oszlopa (kezdő koordináták) // vi - sárga terület jobbalsó sarok i. sora, kj - sárga terület jobbalsó sarok j. oszlopa (vég koordináták) //BAL FELSŐ SAROKBÓL KEZDEM A KERESÉST i=3; while(i<50) j=3; while(j<50&&!(kep[i][j].r==255&&kep[i][j].g==255&&kep[i][j].b==0)) j++; if(j<50) cout << "Kezd: " << i << ", " << j << endl; ki=i; kj=j; i=50; i++; //JOBB ALSÓ SAROKBÓL KEZDEM A KERESÉST i=46; while(i>0) j=46; while(j>0&&!(kep[i][j].r==255&&kep[i][j].g==255&&kep[i][j].b==0)) j--; if(j>0) cout << "Vége: " << i << ", " << j << endl; vi=i; vj=j; i=0; i--; cout << "Képpontok száma: " << (vi-ki+1)*(vj-kj+1) << endl; 153
154 int main() setlocale(lc_all,"hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); kiir(7); F7(); return 0; 154
155 2013. MÁJUS EMELT VÁLASZTÁSOK
156 FELADAT SZÖVEGE Eszemiszom városában időközi helyhatósági választásokat írtak ki. A városban összesen szavazásra jogosult állampolgár van, akiket nyolc választókerületbe soroltak. Minden választókerületben több jelölt is indul, de egy jelölt csak egy választókerületben indulhat. Egy választókerület szavazói az adott választókerületben induló jelöltek közül egy jelöltre adhatnak le szavazatot, de nem kötelező részt venniük a szavazáson. Minden választókerületben az a jelölt nyer, aki a legtöbb szavazatot kapja. (Feltételezheti, hogy egyetlen választókerületben sem alakult ki holtverseny.) A jelöltek vagy egy párt támogatásával, vagy független jelöltként indulhatnak. Az idei évben a Gyümölcsevők Pártja (GYEP), a Húsevők Pártja (HEP), a Tejivók Szövetsége (TISZ) vagy a Zöldségevők Pártja (ZEP) támogatja a jelölteket. A szavazás eredményét a szavazatok.txt szóközökkel tagolt fájl tartalmazza, amelynek minden sorában egy-egy képviselőjelölt adatai láthatók. Például: Zeller Zelma ZEP 6 63 Zsoldos Zsolt - Az első két adat a választókerület sorszáma és a képviselőjelöltre leadott szavazatok száma. Ezt a jelölt vezeték- és utóneve, majd a jelöltet támogató párt hivatalos rövidítése követi. Független jelöltek esetében a párt rövidítése helyett egy kötőjel szerepel. Minden képviselőjelöltnek pontosan egy utóneve van. Készítsen programot valasztas néven, amely az alábbi kérdésekre válaszol! Minden részfeladat feldolgozása során írja ki a képernyőre a részfeladat sorszámát, (például: 2. feladat)! Ahol a felhasználótól kér be adatot, ott írja ki a képernyőre azt is, hogy milyen adatot vár! Az ékezetmentes kiírás is elfogadott. 1. Olvassa be a szavazatok.txt fájl adatait, majd ezek felhasználásával oldja meg a következő feladatokat! Az adatfájlban legfeljebb 100 képviselőjelölt adatai szerepelnek. 2. Hány képviselőjelölt indult a helyhatósági választáson? A kérdésre egész mondatban válaszoljon az alábbi mintához hasonlóan: A helyhatósági választáson 92 képviselőjelölt indult. 3. Kérje be egy képviselőjelölt vezetéknevét és utónevét, majd írja ki a képernyőre, hogy az illető hány szavazatot kapott! Ha a beolvasott név nem szerepel a nyilvántartásban, úgy jelenjen meg a képernyőn az Ilyen nevű képviselőjelölt nem szerepel a nyilvántartásban! figyelmeztetés! A feladat megoldása során feltételezheti, hogy nem indult két azonos nevű képviselőjelölt a választáson. 4. Határozza meg, hányan adták le szavazatukat, és mennyi volt a részvételi arány! (A részvételi arány azt adja meg, hogy a jogosultak hány százaléka vett részt a szavazáson.) A részvételi arányt két tizedesjegy pontossággal, százalékos formában írja ki a képernyőre! Például: A választáson 5001 állampolgár, a jogosultak 40,51%-a vett részt. 156
157 5. Határozza meg és írassa ki a képernyőre az egyes pártokra leadott szavazatok arányát az összes leadott szavazathoz képest két tizedesjegy pontossággal! A független jelölteket együtt, Független jelöltek néven szerepeltesse! Például: Zöldségevők Pártja= 12,34% Független jelöltek= 23,40% 6. Melyik jelölt kapta a legtöbb szavazatot? Jelenítse meg a képernyőn a képviselő vezetékés utónevét, valamint az őt támogató párt rövidítését, vagy azt, hogy független! Ha több ilyen képviselő is van, akkor mindegyik adatai jelenjenek meg! 7. Határozza meg, hogy az egyes választókerületekben kik lettek a képviselők! Írja ki a választókerület sorszámát, a győztes vezeték- és utónevét, valamint az őt támogató párt rövidítését, vagy azt, hogy független egy-egy szóközzel elválasztva a kepviselok.txt nevű szöveges fájlba! Az adatok a választókerületek száma szerinti sorrendben jelenjenek meg! Minden sorba egy képviselő adatai kerüljenek! FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS adatok[100] adat típus 100 elemű tömb, minden eleme egy adatötöst tartalmaz struktúra 5 adatmezővel: vk - választókerület sz kapott szavazatok száma vnev - vezetéknév knev - keresztnév part támogató párt/független A fájlban található adatok tárolása. globális V konstans értéke Választásra jogosultak száma N int Forrás fájlban található sorok száma, azaz a képviselőjelöltek száma globális globális 157
158 PROGRAMKÓD Speciális elemek a programkódban Ebben a feladatban szükségünk lesz az IOMANIP nevű függvénytárra, melyben az I/O műveletek manipulálására alkalmas függvények találhatók. (Lsd. F4() és F5() feladatrészekben a cout.precision(4), illetve a setprecision(4) függvényeket!) #include <iostream> #include <iomanip> #include <fstream> #define V using namespace std; struct adat int vk; int sz; string vnev; string knev; string part; adatok[100]; int N; float szumma; void kiir(int ssz) cout << ssz << ". feladat" << endl; void F1() ifstream be; be.open("szavazatok.txt"); int i=0; while(!be.eof()) be >> adatok[i].vk; be >> adatok[i].sz; be >> adatok[i].vnev; be >> adatok[i].knev; be >> adatok[i].part; cout << adatok[i].vk << " " << adatok[i].sz << " " << adatok[i].vnev << " " << adatok[i].knev << " " << adatok[i].part << endl; i++; N=i; be.close(); 158
159 void F2() cout << "A helyhatósági választáson " << N << " képviselőjelölt indult." << endl; void F3() string vn, kn; cout << "Kerem a vezeteknevet: "; cin >> vn; cout << "Kerem a keresztnevet: "; cin >> kn; int i=0; while(i<n&&!(adatok[i].vnev==vn&&adatok[i].knev==kn)) i++; if(i>=n) cout << "Ilyen nevu kepviselojelolt nem szerepel a nyilvántartásban!" << endl; else cout <<"Kapott szavazatok száma: " << adatok[i].sz << endl; float osszesen() float szumma=0; for(int i=0;i<n;i++) szumma+=adatok[i].sz; return szumma; void F4() float szumma=osszesen(); cout << "A választáson " <<szumma << " állampolgár, a jogosultak "; cout.precision(4); cout << (szumma/v)*100 << "%-a vett részt" << endl; 159
160 int F5() float gy=0, h=0, t=0, z=0, f=0, szumma=osszesen(); for(int i=0;i<n;i++) if(adatok[i].part=="gyep") gy+=adatok[i].sz; if(adatok[i].part=="hep") h+=adatok[i].sz; if(adatok[i].part=="tisz") t+=adatok[i].sz; if(adatok[i].part=="zep") z+=adatok[i].sz; if(adatok[i].part=="-") f+=adatok[i].sz; cout << "Gyümölcsevők Pártja = " << setprecision(4) << gy/szumma*100 << "%" << endl; cout << "Húsevők Pártja = " << setprecision(4) << h/szumma*100 << "%" << endl; cout << "Tejivók Szövetsége = " << setprecision(4) << t/szumma*100 << "%" << endl; cout << "Zöldségevők Pártja = " << setprecision(4) << z/szumma*100 << "%" << endl; cout << "Független jelöltek = " << setprecision(4) << f/szumma*100 << "%" << endl; void F6() int max; max=0; for(int i=0;i<n;i++) if(adatok[i].sz>max) max=adatok[i].sz; for(int i=0;i<n;i++) if(adatok[i].sz==max) cout << adatok[i].vnev << " " << adatok[i].knev << " "; if(adatok[i].part!="-") cout << adatok[i].part; else cout << "független"; cout << endl; 160
161 void F7() int ker[8][2]; for(int i=0;i<8;i++) ker[i][0]=0; for(int i=0;i<n;i++) if(adatok[i].sz>ker[adatok[i].vk-1][0]) ker[adatok[i].vk-1][0]=adatok[i].sz; ker[adatok[i].vk-1][1]=i; ofstream ki; ki.open("kepviselok.txt"); for(int i=0;i<8;i++) cout << adatok[ker[i][1]].vnev << " " << adatok[ker[i][1]].knev << " "; if(adatok[ker[i][1]].part!="-") cout << adatok[ker[i][1]].part; else cout << "független"; cout << endl; //fájlba írási rész ki << adatok[ker[i][1]].vnev << " " << adatok[ker[i][1]].knev << " "; if(adatok[ker[i][1]].part!="-") ki << adatok[ker[i][1]].part; else ki << "független"; ki << endl; ki.close(); int main() setlocale(lc_all,"hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); kiir(7); F7(); return 0; 161
162 2013. OKTÓBER EMELT KÖZÚTI ELLENŐRZÉS
163 FELADAT SZÖVEGE Bizonyára mindenki látott már rendőrjárőrt, aki szolgálata során egy út menti ellenőrző pontról a forgalmat figyelte. A járőr feladata lehet a szabálytalankodók kiszűrése mellett az elhaladó járművek szúrópróbaszerű vagy módszeres ellenőrzése. Bizonyos esetekben egy műszaki ellenőrző állomás is kitelepül, amely alkalmas a kiválasztott járművek műszaki állapotának felmérésére. Egy olyan nap adatait kell feldolgoznia, amelyen a rendőri mellett műszaki ellenőrzés is zajlott egy egyirányú út mentén. Az úton haladó legalább 50, de legfeljebb 1000 jármű adatait a jarmu.txt állományban tárolta el a rendőrautó forgalomrögzítő kamerájához csatlakoztatott gép. Az állomány sorai azonos szerkezetűek, az időt és a rendszámot tartalmazzák az elhaladás sorrendjében. A rendszám mindig 7 karakter hosszú, az angol ábécé nagybetűit, kötőjelet és számjegyeket tartalmaz ebben a sorrendben. A példában szereplőtől eltérő felépítésű rendszámok is lehetségesek. Például: TI BU AAAA DM-5632 A 2. sor mutatja, hogy a BU-5523 jármű 11 óra 12 perc 9 másodperckor haladt át az ellenőrző ponton. Készítsen programot, amely az alábbi kérdésekre válaszol! A program forráskódját mentse jaror néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie.) 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:)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott. 1. Olvassa be a jarmu.txt állományban talált adatokat, s annak felhasználásával oldja meg a következő feladatokat! 2. Határozza meg, hogy aznap legalább hány óra hosszat dolgoztak az ellenőrzést végzők, ha munkaidejük egész órakor kezdődik, és pontosan egész órakor végződik! (Minden óra 0 perc 0 másodperckor kezdődik, és 59 perc 59 másodperccel végződik.) Az eredményt jelenítse meg a képernyőn! 3. Műszaki ellenőrzésre minden órában egy járművet választanak ki. Azt, amelyik abban az órában először halad arra. Az ellenőrzés óráját és az ellenőrzött jármű rendszámát jelenítse meg a képernyőn a következő formában: 9 óra: AB-1234! Minden óra adata külön sorba kerüljön! Csak azon órák adatai jelenjenek meg, amikor volt ellenőrizhető jármű! 4. A rendszám első karaktere külön jelentéssel bír. Az egyes betűk közül a B autóbuszt, a K kamiont, az M motort jelöl, a többi rendszámhoz személygépkocsi tartozik. Jelenítse meg a képernyőn, hogy az egyes kategóriákból hány jármű haladt el az ellenőrző pont előtt! 5. Mettől meddig tartott a leghosszabb forgalommentes időszak? A választ jelenítse meg a képernyőn a következő formában: 9:9:13-9:15:3! 6. A rendőrök egy baleset közelében látott járművet keresnek rendszám alapján. A szemtanúk csak a rendszám bizonyos karaktereire emlékeztek, így a rendszám ismeretlen karaktereit a * karakterrel helyettesítve keresik a nyilvántartásban. Kérjen be a felhasználótól egy ilyen rendszámot, majd jelenítse meg a képernyőn az arra illeszthető rendszámokat! 163
164 7. Egy közúti ellenőrzés pontosan 5 percig tart. Amíg az ellenőrzés folyik, a járművek szabadon elhaladhatnak, a következő megállítására csak az ellenőrzés befejezése után kerül sor. Ha a rendőrök a legelső járművet ellenőrizték, akkor mely járműveket tudták ellenőrizni a szolgálat végéig? Írja az ellenőrzött járművek áthaladási idejét és rendszámát a vizsgalt.txt állományba az áthaladás sorrendjében, a bemenettel egyező formában! Ügyeljen arra, hogy az időadatokhoz tartozó számok a bevezető nullákat tartalmazzák! FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS a [1000] adat típus 100 elemű tömb, minden eleme egy adatötöst tartalmaz struktúra 5 adatmezővel: vk - választókerület sz kapott szavazatok száma vnev - vezetéknév knev - keresztnév part támogató párt/független A fájlban található adatok tárolása. V konstans értéke Választásra jogosultak száma N int Forrás fájlban található sorok száma, azaz a képviselőjelöltek száma globális globális globális 164
165 PROGRAMKÓD #include <iostream> #include <fstream> #include <string> #include <windows.h> using namespace std; int N; struct adatok int h; // óra int p; //perc int m; //másodperc string r; //rendszám a[1000]; void kiir(int x) cout << x << ". feladat" << endl; void F1() ifstream be; be.open("jarmu.txt"); int i=0; while(!be.eof()) be >> a[i].h; be >> a[i].p; be >> a[i].m; be >> a[i].r; i++; N=i; be.close(); void F2() int x = a[n-1].h+1; //utolsó elem órája + 1, mert egész óráig dolgoztak int y = a[0].h; //első elem órája, mert egész órakor kezdték cout << x-y << " orat dolgoztak legalabb." << endl; //8kor kezdték és 14ig tartott, ha feltételezzük, hogy nem dolgoztak munkdaidőn kívűl 165
166 void F3() for(int i=0; i<n-1 ; i++) if(a[i].h!=a[i+1].h) cout << a[i+1].h << " ora: " << a[i+1].r << endl; void F4() // substr(x,y) kivesz egy részletet a stringből: az x karaktertől kezdve, y darabot int b=0, k=0, m=0, sz=0; for(int i=0; i<n-1 ; i++) if(a[i].r.substr(0,1)=="b") b++; if(a[i].r.substr(0,1)=="k") k++; if(a[i].r.substr(0,1)=="m") m++; else sz++; cout << b <<" busz, " << k <<" kamion, " << m <<" motor es " << sz <<" szemelygepkocsi haladt el az elenorzo pont elott." << endl; void F5() int max=0, index=0; for(int i=0; i<n-1 ; i++) if((a[i+1].h*3600+a[i+1].p*60+a[i+1].m)-(a[i].h*3600+a[i].p*60+a[i].m)>max) index=i; max=(a[i+1].h*3600+a[i+1].p*60+a[i+1].m)- (a[i].h*3600+a[i].p*60+a[i].m); cout << a[index].h << ":" << a[index].p << ":" << a[index].m << " - " << a[index+1].h << ":" << a[index+1].p << ":" << a[index+1].m << endl; 166
167 void F6() string x; cout << "Kerem a keresett rendszamot, ismeretlen betuit '*' jellel helyetesitve: "; getline(cin,x); int azonos; int db=0; for(int i=0; i<n; i++) azonos=0; for(int j=0;j<x.length();j++) if(a[i].r[j]==x[j] x[j]=='*') azonos++; if(azonos==x.length()) cout << a[i].r << endl; db++; if(db==0) cout << "Nincs találat!" << endl; 167
168 void F7() ofstream ki; ki.open("vizsgalt.txt"); int j; if(a[0].h<10) ki << "0" << a[0].h << " "; else ki << a[0].h << " "; if(a[0].p<10) ki << "0" << a[0].p << " "; else ki << a[0].p << " "; if(a[0].m<10) ki << "0" << a[0].m << " "; else ki << a[0].m << " "; ki << a[0].r << endl; for(int i=0; i<n; i++) j=0; while(j!=n+1) if( (a[i+j].h*3600+a[i+j].p*60+a[i+j].m) - (a[i].h*3600+a[i].p*60+a[i].m) >= 300 ) //azért >=300, mert abban a pillanatban, amint lejár a 300 másodperc(=5 perc), rögtön képesek egy új járművet ellenőrizni if(a[i+j].h<10) ki << "0" << a[i+j].h << " "; else ki << a[i+j].h << " "; if(a[i+j].p<10) ki << "0" << a[i+j].p << " "; else ki << a[i+j].p << " "; if(a[i+j].m<10) ki << "0" << a[i+j].m << " "; else ki << a[i+j].m << " "; ki << a[i].r << endl; i+=j; break; j++; ki.close(); int main() setlocale(lc_all,"hun"); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); F7(); return 0; 168
169 2014. MÁJUS EMELT IPV6
170 FELADAT SZÖVEGE A számítógépes hálózatok üzemeltetésében az IPv4-es címeket lassan leváltja az IPv6-os címzési rendszer, amely az eddigi 32 bit hosszúságú címek helyett 128 bit hosszúságú címeket használ. Az IPv6-os címeket hexadecimális alakban ábrázoljuk, nyolc darab négyes csoportba osztva. Az egyes számjegyek a tízes számrendszerben is használt számjegyek, valamint az a, b, c, d, e, f betűk lehetnek. Az egyes csoportokat kettősponttal választjuk el. Ezek alapján formailag megfelelő IPv6-os cím a következő: 2001:0db8:03cd:0000:0000:ef45:0006:0123 Egy nagyvállalatnál készítettek egy programot, ami a cég szerverén tárolt összes dokumentumból kigyűjtötte az IPv6-címeket. Az így keletkezett gyűjteményt az ip.txt fájl tárolja. Minden IP-címet csak az első előfordulásakor rögzítettek. Az állomány legalább 20, de legfeljebb 500 adatsort, soronként egy IP-címet tartalmaz a következő példának megfelelően: 2001:0db8:03cd:0000:0000:ef45:0006: :0e10:0000:aabc:0000:01ac:0000:0001 fdf8:f53b:82e4:0000:0000:0000:0000:0053 fc00:0000:0000:ad65:0124:33ab:0100:6543 A vállalatnál háromféle IP-cím fordul elő. A feladat megoldásában csak ezekkel a címekkel kell foglalkozni: A 2001:0db8 kezdetű címek a dokumentációs címek, eszközöknek nincsenek kiosztva. A 2001:0e kezdetű címek az informatikai eszközöknek kiosztott globális egyedi címek. Az fc, valamint az fd kezdetű címek az eszközöknek kiosztott helyi egyedi címek. Több szabály vonatkozik a címek rövidebb leírásának lehetőségére: Az egyes csoportokban a bevezető nullák elhagyhatók. Például így leírva a fenti cím: 2001:db8:3cd:0:0:ef45:6:123 Kettő vagy több csak nullákból álló csoportot le lehet egyszerűsíteni két kettőspont közötti üres csoportra. Ezzel a szabállyal tovább egyszerűsítve az előző címet: 2001:db8:3cd::ef45:6:123 Ha egy címben több helyen is vannak csak nullákból álló csoportok, akkor is csak egyszer lehet ez utóbbi módszerrel rövidítést végrehajtani. Ilyen esetben mindig a több nullás csoportot kell rövidíteni. Ha azonos számú nullás csoport található a címen belül több helyen is, akkor balról az elsőt kell rövidíteni. Például: 2001:0000:0000:00f5:0000:0000:0000:0123 Rövidítve: 2001:0:0:f5::123 Készítsen programot, amely az ip.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse cimek néven! (A program megírásakor a megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.) 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:)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott. A képernyőre írást igénylő feladatok eredményét a feladatok utáni mintának megfelelően jelenítse meg! 1. Olvassa be az ip.txt állományban talált adatokat, s annak felhasználásával oldja meg a következő feladatokat! 2. Határozza meg és írja a képernyőre, hogy hány adatsor van az állományban! 170
171 3. Írja a képernyőre az állományban található legalacsonyabb IP-címet! A megoldásában felhasználhatja, hogy a betűk ASCII-kódjai a számok ASCII-kódjai után találhatók a kódtáblában. 4. Határozza meg, hogy az állományban hány darab IP-cím van az egyes fajtákból! Az eredményt jelenítse meg a képernyőn a mintának megfelelően! 5. Gyűjtse ki a sok.txt állományba azokat az IP-címeket, melyek legalább 18 nullát tartalmaznak! A fájlban minden sor elején szerepeljen az eredeti állományból a cím sorszáma! Ezt kövesse egy szóközzel elválasztva a cím az ip.txt állományban szereplő alakjával! 6. Kérjen be a felhasználótól egy sorszámot! Az állományban a megadott sorszámon található IPcímet rövidítse a csoportokon belüli bevezető nullák elhagyásával! Az állományban található alakot és a rövidített változatot írja a képernyőre egymás alá! 7. Az előző feladatban használt IP-címet rövidítse tovább az egymást követő nullás csoportok rövidítésére vonatkozó szabályoknak megfelelően! Az eredményt jelenítse meg a képernyőn! Amennyiben nem rövidíthető, írja ki: Nem rövidíthető tovább.! Minta a szöveges kimenetek kialakításához: 2. feladat: Az állományban 372 darab adatsor van. 3. feladat: A legalacsonyabb tárolt IP-cím: 2001:0db8:0000:00b9:0800:0f00:e02a:71ac 4. feladat: Dokumentációs cím: 106 darab Globális egyedi cím: 120 darab Helyi egyedi cím: 146 darab 6. feladat: Kérek egy sorszámot: 10 fcef:b0e7:7d20:0000:0000:0000:3b95:0565 fcef:b0e7:7d20:0:0:0:3b95: feladat: fcef:b0e7:7d20::3b95:565 FONTOSABB VÁLTOZÓK ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS ip[500] string típusú 500 elemű tömb alaphelyzetben minden string 255 karakter hoszszú lehet maximum A fájlban található ipcímek tárolása. globális resz[8] string típusú 8 elemű tömb N int Forrás fájlban található sorok száma, azaz az ip-címek száma ipx string A 6. és 7. feladatban kell a címek rövidítéséhez minden ip-cím 8 részből áll, ezeknek a részeknek a kezeléséhez kell globális globális globális 171
172 PROGRAMKÓD #include <iostream> #include <fstream> #include <string> #include <iomanip> using namespace std; string ip[500]; int N; string ipx; string resz[8]; void kiir(int sorszam) cout << sorszam << ". feladat" << endl; void F1() ifstream be; be.open("ip.txt"); int i=0; while(!be.eof()) be >> ip[i]; cout << ip[i] << endl; i++; N=i-1; be.close(); void F2() cout << "Az állományban " << N << " darab adatsor van" << endl; 172
173 void F3() ofstream ki2; ki2.open("rendezett.txt"); string ip2[500]; for(int i=0;i<n;i++) ip2[i]=ip[i]; for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if(ip2[i]>ip2[j]) swap(ip2[i],ip2[j]); for(int i=0;i<n;i++) ki2 << ip2[i] << endl; ki2.close(); cout << "A legalacsonyabb tárolt IP-cím:" << endl; cout << ip2[0] << endl; void F4() string d="2001:0db8"; string g="2001:0e"; string h1="fc"; string h2="fd"; string s; int ddb=0, gdb=0, hdb=0; for(int i=0;i<n;i++) if(ip[i].substr(0,9)==d) ddb++; if(ip[i].substr(0,7)==g) gdb++; if(ip[i].substr(0,2)==h1 ip[i].substr(0,2)==h2) hdb++; cout << "Dokumentációs cím: " << ddb << endl; cout << "Globális egyedi cím: " << gdb << endl; cout << "Helyi egyedi cím: " << hdb << endl; 173
174 void F5() ofstream ki; ki.open("sok.txt"); int nulla; int hatar=18; string ssz; for(int i=0;i<n;i++) nulla=0; for(int j=0;j<ip[i].length();j++) if(ip[i][j]=='0') nulla++; if(nulla>=hatar) ki << i+1 << " " << ip[i] << endl; cout << i+1 << " " << ip[i] << endl; ki.close(); void F6() int ssz; cout << "Kérek egy sorszámot: "; cin >> ssz; int i=ssz-1; int index=0; cout << ip[i] << endl; for(int j=0;j<8;j++) resz[j]=ip[i].substr(j*5,4); cout << endl; for(int i=0;i<8;i++) while(resz[i][0]=='0') resz[i]=resz[i].substr(1,4); if(resz[i].length()==0) resz[i]="0"; if(i<7) ipx+=resz[i]+":"; else ipx+=resz[i]; cout << "A rövidített IP-cím:" << endl; cout << ipx << endl; 174
175 void F7() int max=0; int db=0, hely; for(int i=0;i<8;i++) if(resz[i]=="0") int j=i+1; while(resz[j]=="0") j++; db=j-i; if(db>max) max=db; db=0; hely=i; i=j; cout << "Lehetséges rövidítés helye: " << hely << ", száma: " << max << endl; for(int i=hely;i<hely+max;i++) resz[i]=""; ipx=""; for(int i=0;i<8;i++) if(resz[i]!="") if(i<7) ipx+=resz[i]+":"; else ipx+=resz[i]; if(resz[i]==""&&hely%5==i) ipx+=":"; cout << endl << ipx << endl; 175
176 int main() setlocale(lc_all, "hun"); kiir(1); F1(); kiir(2); F2(); kiir(3); F3(); kiir(4); F4(); kiir(5); F5(); kiir(6); F6(); kiir(7); F7(); return 0; 176
177 2014. OKTÓBER EMELT NÉZŐTÉR
178 FELADAT SZÖVEGE A Fregoli Színházban a jegyeladásokat elektronikusan rögzítik. A színházban 15 sor, és soronként 20 szék van. A sorokat 1-től 15-ig számozzák, a sorokon belül pedig a székeket 1-től 20-ig. Egy előadásra a pillanatnyilag eladott jegyek eloszlását a foglaltsag.txt szöveges állomány tartalmazza, melyben x jelzi a foglalt és o a szabad helyeket. Például: ooxxxoxoxoxoxxxooxxx xxxxxxxxxxxxxxxxxxxx oxxxxxoooxxxxxxxxxxo Az első sor 1-2. széke például még szabad, míg a 2. sorba az összes jegyet eladták. A jegyek ára nem egyforma, összege a helytől függően ötféle lehet. Azt, hogy az adott szék az öt közül melyik árkategóriába tartozik, a kategoria.txt fájl tartalmazza az alábbi formában: Például: A példa szerint az 1. sor 2. széke a 3. kategóriába, a 2. sor 1. széke a 4. kategóriába esik. Készítsen programot nezoter néven a következő feladatok megoldására! A program futása során a képernyőre való kiíráskor, illetve az adatok billentyűzetről való beolvasásakor utaljon a feladat sorszámára (például: 3. feladat), és a kiírandó, illetve bekérendő tartalomra! Az ékezetmentes kiírás is elfogadott. 1. Olvassa be és tárolja el a foglaltsag.txt és a kategoria.txt fájl adatait! 2. Kérje be a felhasználótól egy sor, és azon belül egy szék számát, majd írassa ki a képernyőre, hogy az adott hely még szabad-e vagy már foglalt! 3. Határozza meg, hogy hány jegyet adtak el eddig, és ez a nézőtér befogadóképességének hány százaléka! A százalékértéket kerekítse egészre, és az eredményt a következő formában írassa ki a képernyőre: Például: Az előadásra eddig 156 jegyet adtak el, ez a nézőtér 42%-a. 4. Határozza meg, hogy melyik árkategóriában adták el a legtöbb jegyet! Az eredményt írassa ki a képernyőre az alábbi formában: Például: A legtöbb jegyet a(z) 3. árkategóriában értékesítették. 5. A jegyek árát kategóriánként a következő táblázat tartalmazza: árkategória ár (Ft) Mennyi lenne a színház bevétele a pillanatnyilag eladott jegyek alapján? Írassa ki az eredményt a képernyőre! 178
179 6. Mivel az emberek általában nem egyedül mennek színházba, ha egy üres hely mellett nincs egy másik üres hely is, akkor azt nehezebben lehet értékesíteni. Határozza meg, és írassa ki a képernyőre, hogy hány ilyen egyedülálló üres hely van a nézőtéren! 7. A színház elektronikus eladási rendszere az érdeklődőknek az üres helyek esetén a hely árkategóriáját jeleníti meg, míg a foglalt helyeket csak egy x karakterrel jelzi. Készítse el ennek megfelelően a fenti adatokat tartalmazó szabad.txt fájlt! Például: FONTOSABB VÁLTOZÓK 33xxx1x1x1x1xxx22xxx xxxxxxxxxxxxxxxxxxxx 4xxxxx222xxxxxxxxxx4 ADAT NEVE TÍPUSA FELÉPÍTÉSE SZEREPE FELHASZNÁLÁS N konstans sorok száma globális M konstans oszlopok (székek) száma egy sorban globális sor[n] string foglaltsag.txt file egy-egy sorát globális tartalmazza, azaz N db stringet (lsd. foglaltsag.txt képet lent) kat[n] string kategoria.txt file egy-egy sorát globális tartalmazza, azaz N db stringet (lsd. kategoria.txt képet lent) m[5] int 5 elemű A 4. és 5. feladatban kap szerepet, globális tömb amikor az egyes kategóriákat darabra megszámoljuk, illetve forintra váltjuk Mivel a sor[] és a kat[] tömbök stringeket tartalmaznak, lehetőség van arra, hogy karakterenként is kezeljük ezeket, de ekkor a sort és a katot is mátrixként kell kezelni. Itt lesz szerepe az M konstansnak. Lásd: már a 2. feladattól kezdve mátrixként kezeljük a sort. (N sor, és minden sorban M szék, azaz karakter.) 179
Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez
Pásztor Attila Algoritmizálás és programozás tankönyv az emeltszintű érettségihez 11. ÉRETTSÉGI FELADATOK...124 11.1. LOTTO (2005. V.)...124 11.2. A VIGENÈRE TÁBLA (2005. X.)...128 11.3. FEHÉRJE (2006.
INFORMATIKA EMELT SZINT%
Szövegszerkesztés, prezentáció, grafika, weblapkészítés 1. A fényképezés története Táblázatkezelés 2. Maradékos összeadás Adatbázis-kezelés 3. Érettségi Algoritmizálás, adatmodellezés 4. Fehérje Maximális
EMELT SZINTŰ GYAKORLATI VIZSGA
ÉRETTSÉGI VIZSGA 2006. május 17. INFORMATIKA EMELT SZINTŰ GYAKORLATI VIZSGA 2006. május 17. 8:00 A gyakorlati vizsga időtartama: 240 perc Beadott dokumentumok Piszkozati pótlapok száma Beadott fájlok száma
Felvételi tematika INFORMATIKA
Felvételi tematika INFORMATIKA 2016 FEJEZETEK 1. Természetes számok feldolgozása számjegyenként. 2. Számsorozatok feldolgozása elemenként. Egydimenziós tömbök. 3. Mátrixok feldolgozása elemenként/soronként/oszloponként.
INFORMATIKA tétel 2019
INFORMATIKA tétel 2019 ELIGAZÍTÁS: 1 pont hivatalból; Az 1-4 feladatokban (a pszeudokód programrészletekben): (1) a kiír \n utasítás újsorba ugratja a képernyőn a kurzort; (2) a / operátor osztási hányadost
Gyakorló feladatok az 1. nagy zárthelyire
Gyakorló feladatok az 1. nagy zárthelyire 2012. október 7. 1. Egyszerű, bevezető feladatok 1. Kérjen be a felhasználótól egy sugarat. Írja ki az adott sugarú kör kerületét illetve területét! (Elegendő
INFORMATIKA tétel 2017
INFORMATIKA tétel 2017 ELMÉLETI TÉTEL: Sorold fel a rekurzív függvények/eljárások jellemzőit! Szemléltesd a fogalmakat egy konkrét példán! [1 pont] GYAKORLATI TÉTEL: 1. Legyen az alábbi pszeudokód programrészlet
2. Készítsen awk szkriptet, amely kiírja az aktuális könyvtár összes alkönyvtárának nevét, amely februári keltezésű (bármely év).
1. fejezet AWK 1.1. Szűrési feladatok 1. Készítsen awk szkriptet, ami kiírja egy állomány leghosszabb szavát. 2. Készítsen awk szkriptet, amely kiírja az aktuális könyvtár összes alkönyvtárának nevét,
Maximum kiválasztás tömbben
ELEMI ALKALMAZÁSOK FEJLESZTÉSE I. Maximum kiválasztás tömbben Készítette: Szabóné Nacsa Rozália Gregorics Tibor tömb létrehozási módozatok maximum kiválasztás kódolása for ciklus adatellenőrzés do-while
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:)!
Space Shuttle 40 Pont A Space Shuttle (magyarul űrsikló", hivatalos angol nevén: Space Transportation System, STS) az Amerikai Egyesült Államok ember szállítására is alkalmas űrprogramja volt. Feladatai
Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):
Python Változók Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai): Név Érték Típus Memóriacím A változó értéke (esetleg más attribútuma is) a program futása alatt
Bánsághi Anna 2014 Bánsághi Anna 1 of 68
IMPERATÍV PROGRAMOZÁS Bánsághi Anna anna.bansaghi@mamikon.net 3. ELŐADÁS - PROGRAMOZÁSI TÉTELEK 2014 Bánsághi Anna 1 of 68 TEMATIKA I. ALAPFOGALMAK, TUDOMÁNYTÖRTÉNET II. IMPERATÍV PROGRAMOZÁS Imperatív
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.
Torna A pekingi olimpián tornából hat versenyszámban mérettetik meg magukat a versenyzők. Ennek a versenynek az eredményeit kell feldolgoznia ebben a feladatban. A megoldás során vegye figyelembe a következőket:
Felvételi vizsga mintatételsor Informatika írásbeli vizsga
BABEȘ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR A. tételsor (30 pont) Felvételi vizsga mintatételsor Informatika írásbeli vizsga 1. (5p) Egy x biten tárolt egész adattípus (x szigorúan pozitív
Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek
Programozás alapjai gyakorlat 4. gyakorlat Konstansok, tömbök, stringek Házi ellenőrzés (f0069) Valósítsd meg a linuxos seq parancs egy egyszerűbb változatát, ami beolvas két egész számot, majd a kettő
Programozási segédlet
Programozási segédlet Programozási tételek Az alábbiakban leírtam néhány alap algoritmust, amit ismernie kell annak, aki programozásra adja a fejét. A lista korántsem teljes, ám ennyi elég kell legyen
Programozás II. 2. Dr. Iványi Péter
Programozás II. 2. Dr. Iványi Péter 1 C++ Bjarne Stroustrup, Bell Laboratórium Első implementáció, 1983 Kezdetben csak precompiler volt C++ konstrukciót C-re fordította A kiterjesztés alapján ismerte fel:.cpp.cc.c
1. numere.txt n (1 n 10000) n növekvő kilenc a) Pascal/C++ Például: NUMERE.TXT
Az informatika érettségi harmadik tételsora tartalmaz egy feladatot, melyet hatékonyan kell megoldani. A program megírása mellett követelmény a megoldásban használt módszer rövid leírása, kitérve a módszer
Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása
Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba I 10. gyakorlat C++: alprogramok deklarációja és paraméterátadása 2011.11.22. Giachetta Roberto groberto@inf.elte.hu
Megjegyzés: A programnak tartalmaznia kell legalább egy felhasználói alprogramot. Példa:
1. Tétel Az állomány két sort tartalmaz. Az első sorában egy nem nulla természetes szám van, n-el jelöljük (5
Programozás alapjai 5. gyakorlat Vezérlési szerkezetek egymásba ágyazása
Programozás alapjai 5. gyakorlat Vezérlési szerkezetek egymásba ágyazása 1. feladat: Eldönteni egy számról, hogy pozitív, negatív vagy 0. Próbálja megoldani a feladatot switch szerkezettel is. Mikor használható
Bevezetés a programozásba I.
Bevezetés a programozásba I. 3. gyakorlat Tömbök, programozási tételek Surányi Márton PPKE-ITK 2010.09.21. ZH! PlanG-ból papír alapú zárthelyit írunk el reláthatólag október 5-én! Tömbök Tömbök Eddig egy-egy
Bevezetés a programozásba I.
Bevezetés a programozásba I. 6. gyakorlat C++ alapok, szövegkezelés Surányi Márton PPKE-ITK 2010.10.12. Forrásfájlok: *.cpp fájlok Fordítás: a folyamat, amikor a forrásfájlból futtatható állományt állítunk
Bevezetés a C++ programozásba
Bevezetés a C++ programozásba A program fogalma: A program nem más, mint számítógép által végrehajtható utasítások sorozata. A számítógépes programokat különféle programnyelveken írhatjuk. Ilyen nyelvek
3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai
Kémiai elemek felfedezése A kémiai elemek kémiailag tovább már nem bontható, egyszerű anyagok. Jelenleg 118 különböző kémiai elemet ismerünk, közüliik a Földön 94 található meg a természetben, ezeket természetes
INFORMATIKA javítókulcs 2016
INFORMATIKA javítókulcs 2016 ELMÉLETI TÉTEL: Járd körbe a tömb fogalmát (Pascal vagy C/C++): definíció, egy-, két-, több-dimenziós tömbök, kezdőértékadás definíciókor, tömb típusú paraméterek átadása alprogramoknak.
hiányzott szeptemberben vagy A tanuló nem hiányzott szeptemberben szöveget
Hiányzások Ebben a feladatban egy általános iskola 2017 szeptemberi hiányzásai tartalmazó szövegfájlt kell feldolgoznia. Az adatok a szeptember.csv állomány tartalmazza. Az állomány egy sorában egy tanuló
Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)
Programozás alapjai C nyelv 7. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.11.05. -1- Függvények C program egymás mellé rendelt függvényekből
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 Szeberényi Imre BME IIT Függvények C program egymás mellé rendelt függvényekből áll. A függvény (alprogram) jó absztrakciós eszköz a programok
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
1 Információk 2 A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin Elérhetőség mesko.katalin@tfk.kefo.hu Fogadóóra: szerda 9:50-10:35 Számonkérés időpontok Április 25. 9 00 Május 17. 9 00 Június
Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása
Tömbök kezelése Példa: Vonalkód ellenőrzőjegyének kiszámítása A számokkal jellemzett adatok, pl. személyi szám, adószám, taj-szám, vonalkód, bankszámlaszám esetében az elírásból származó hibát ún. ellenőrző
INFORMATIKA tétel 2018
INFORMATIKA tétel 2018 ELIGAZÍTÁS: 1 pont hivatalból; Az 1-4 feladatokban (a pszeudokód programrészletekben): (1) a kiír \n utasítás újsorba ugratja a képernyőn a kurzort; (2) a minden i = n,1,-1 végezd
Programozás I. házi feladat
Programozás I. házi feladat 2013. 6. hét, 1. rész A feladatsor 4 feladatot tartalmaz, amelyeket egy közös forráskódban kell megvalósítani. Annak érdekében, hogy a tesztelő egymástól függetlenül tudja tesztelni
Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)
Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával) I. A nyelv története C++ C (ős: B???) 1972 Ritchie AT&T Bell laboratórium UNIX 1978 Kernighan & Ritchie az első tankönyv,
Szövegek C++ -ban, a string osztály
Szövegek C++ -ban, a string osztály A string osztály a Szabványos C++ könyvtár (Standard Template Library) része és bár az objektum-orientált programozásról, az osztályokról, csak később esik szó, a string
Programozás alapjai 9.Gy: Struktúra 2.
Programozás alapjai 9.Gy: Struktúra 2. Ördögi részletek P R O A L A G 35/1 B ITv: MAN 2018.11.10 Euró árfolyam statisztika Az EURO árfolyamát egy negyedéven keresztül hetente nyilvántartjuk (HUF / EUR).
Bevezetés a programozásba I.
Bevezetés a programozásba I. 8. gyakorlat Fájlkezelés Surányi Márton PPKE-ITK 2010.11.02. Fájlkezelés C++-ban C++-ban van lehet ségünk fájlok kezelésére. Itt már tényleges fájlokkal dolgozunk, nem pedig
Programozási alapismeretek 2009/2010
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
7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II.
7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II. A gyakorlat célja: 1. A shell vezérlő szerkezetei használatának gyakorlása. A használt vezérlő szerkezetek: if/else/fi, for, while while, select, case,
Bevezetés a programozásba. 9. Előadás: Rekordok
Bevezetés a programozásba 9. Előadás: Rekordok ISMÉTLÉS Függvényhívás #include #include #include #include using using namespace namespace std; std; double double terulet(double
10. gyakorlat Tömb, mint függvény argumentum
10. gyakorlat Tömb, mint függvény argumentum 1. feladat: A 6. gyakorlat 1. feladatát oldja meg a strukturált programtervezési alapelv betartásával, azaz minden végrehajtandó funkciót külön függvényben
Adatbázis rendszerek Gy: Algoritmusok C-ben
Adatbázis rendszerek 1. 1. Gy: Algoritmusok C-ben 53/1 B ITv: MAN 2015.09.08 Alapalgoritmusok Összegzés Megszámlálás Kiválasztás Kiválasztásos rendezés Összefésülés Szétválogatás Gyorsrendezés 53/2 Összegzés
Tájékoztató. Használható segédeszköz: -
A 12/2013. (III. 29. NFM rendelet szakmai és vizsgakövetelménye alapján. Szakképesítés, azonosítószáma és megnevezése 54 481 06 Informatikai rendszerüzemeltető Tájékoztató A vizsgázó az első lapra írja
1. feladat Készítse el szövegszerkesztővel, majd mentse osztály.txt néven a következő tartalmú szöveges fájlt:
BME MOGI Gépészeti informatika 12. 1. feladat Készítse el szövegszerkesztővel, majd mentse osztály.txt néven a következő tartalmú szöveges fájlt: Matematika;Fizika;Történelem;Irodalom;Nyelvtan;Angol;Testnevelés;
Bevezetés a programozásba. 8. Előadás: Függvények 2.
Bevezetés a programozásba 8. Előadás: Függvények 2. ISMÉTLÉS Helló #include using namespace std; int main() cout
INFORMATIKAI ALAPISMERETEK
Informatikai alapismeretek középszint 1021 ÉRETTSÉGI VIZSGA 2011. május 13. INFORMATIKAI ALAPISMERETEK KÖZÉPSZINTŰ ÍRÁSBELI ÉRETTSÉGI VIZSGA JAVÍTÁSI-ÉRTÉKELÉSI ÚTMUTATÓ NEMZETI ERŐFORRÁS MINISZTÉRIUM
Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)
Programozás alapjai C nyelv 5. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -1- Tömbök Azonos típusú adatok tárolására. Index
Programozás alapjai. 5. előadás
5. előadás Wagner György Általános Informatikai Tanszék Cserélve kiválasztásos rendezés (1) A minimum-maximum keresés elvére épül. Ismétlés: minimum keresés A halmazból egy tetszőleges elemet kinevezünk
Azonosító jel: ÉRETTSÉGI VIZSGA 2005. május 19. INFORMATIKA EMELT SZINTŰ GYAKORLATI VIZSGA. A gyakorlati vizsga időtartama: 240 perc
ÉRETTSÉGI VIZSGA 2005. május 19. INFORMATIKA EMELT SZINTŰ GYAKORLATI VIZSGA A gyakorlati vizsga időtartama: 240 perc Beadott dokumentumok Piszkozati pótlapok száma Beadott fájlok száma A beadott fájlok
BME MOGI Gépészeti informatika 5.
BME MOGI Gépészeti informatika 5. 1. feladat Készítsen alkalmazást, mely feltölt egy egydimenziós tömböt adott tartományba eső, véletlenszerűen generált egész értékekkel! Határozza meg a legkisebb és a
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
I. ALAPALGORITMUSOK 1. Prímszámvizsgálat Adott egy n természetes szám. Írjunk algoritmust, amely eldönti, hogy prímszám-e vagy sem! Egy számról úgy fogjuk eldönteni, hogy prímszám-e, hogy megvizsgáljuk,
2018, Funkcionális programozás
Funkcionális programozás 6. előadás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2018, tavaszi félév Miről volt szó? Haskell modulok, kompilálás a
Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.
Keresés Rendezés Feladat Keresés Rendezés Feladat Tartalom Keresés és rendezés A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán
ELEMI PROGRAMOZÁSI TÉTELEK
ELEMI PROGRAMOZÁSI TÉTELEK 1. FELADATMEGOLDÁS PROGRAMOZÁSI TÉTELEKKEL 1.1 A programozási tétel fogalma A programozási tételek típusalgoritmusok, amelyek alkalmazásával garantáltan helyes megoldást adhatunk
Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.
Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás 4. előadás Procedurális programozás: iteratív és rekurzív alprogramok Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto
1. Alapok. Programozás II
1. Alapok Programozás II Elérhetőség Név: Smidla József Elérhetőség: smidla dcs.uni-pannon.hu Szoba: I916 2 Irodalom Bjarne Stroustrup: A C++ programozási nyelv 3 Irodalom Erich Gamma, Richard Helm, Ralph
Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán
Keresés Rendezés Feladat Keresés és rendezés A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán 2016. november 7. Farkas B., Fiala
Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1
Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1 Készítette: Gipsz Jakab Neptun-azonosító: A1B2C3 E-mail: gipszjakab@vilaghalo.hu Kurzuskód: IP-08PAED Gyakorlatvezető
Bevezetés a programozásba. 11. Előadás: Esettanulmány
Bevezetés a programozásba 11. Előadás: Esettanulmány ISMÉTLÉS Függvényhívás #include #include #include #include using using namespace namespace std; std; double double
Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök. Adatfolyamok Hibalehetőségek
Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba I 8. gyakorlat C++: szövegfolyamok, intelligens tömbök 2011.11.08. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto
PROGRAMOZÁS ALAPFELADATOK
2011-2012 TARTALOMJEGYZÉK Beolvasás, kiírás, eldöntés, számítások...3 Egyszerű ciklusok...4 Egymásba ágyazott ciklusok:...6 Tömbök kezelése...8 Szövegkezelés...9 File-kezelés (I. rész):...10 File-kezelés
117. AA Megoldó Alfréd AA 117.
Programozás alapjai 2. (inf.) pót-pótzárthelyi 2011.05.26. gyak. hiányzás: kzhpont: MEG123 IB.028/117. NZH:0 PZH:n Minden beadandó megoldását a feladatlapra, a feladat után írja! A megoldások során feltételezheti,
Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata
Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba I 4. gyakorlat PLanG: 2011.10.04. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Fájlok
Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök
Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba I 8. gyakorlat C++: szövegfolyamok, intelligens tömbök 2011.11.08. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto
8. gyakorlat Pointerek, dinamikus memóriakezelés
8. gyakorlat Pointerek, dinamikus memóriakezelés Házi ellenőrzés Egy számtani sorozat első két tagja A1 és A2. Számítsa ki a sorozat N- dik tagját! (f0051) Egy mértani sorozat első két tagja A1 és A2.
HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport
10-es Keressünk egy egész számokat tartalmazó négyzetes mátrixban olyan oszlopot, ahol a főátló alatti elemek mind nullák! Megolda si terv: Specifika cio : A = (mat: Z n m,ind: N, l: L) Ef =(mat = mat`)
Programozási tételek. Dr. Iványi Péter
Programozási tételek Dr. Iványi Péter 1 Programozási tételek A programozási tételek olyan általános algoritmusok, melyekkel programozás során gyakran találkozunk. Az algoritmusok általában számsorozatokkal,
Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek
Programozás alapjai II. (7. ea) C++ Kiegészítő anyag: speciális adatszerkezetek Szeberényi Imre BME IIT M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 1
Egyszerű programozási tételek
Egyszerű programozási tételek 2. előadás Sergyán Szabolcs sergyan.szabolcs@nik.uni-obuda.hu Óbudai Egyetem Neumann János Informatikai Kar 2011. szeptember 15. Sergyán (OE NIK) AAO 02 2011. szeptember 15.
Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök
Programozás alapjai II. (8. ea) C++ Kiegészítő anyag: speciális adatszerkezetek Szeberényi Imre BME IIT Speciális adatszerkezetek A helyes adatábrázolás választása, a helyes adatszerkezet
AWK programozás, minták, vezérlési szerkezetek
10 AWK programozás, minták, vezérlési szerkezetek AWK adatvezérelt szkriptnyelv text processing, adat kiterjesztés, tagolt adatok automatizált soronkénti feldolgozása a forrásállományt soronként beolvassa
Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)
Adatszerkezetek Nevezetes algoritmusok (Keresések, rendezések) Keresések A probléma általános megfogalmazása: Adott egy N elemű sorozat, keressük meg azt az elemet (határozzuk meg a helyét a sorozatban),
Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE
Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE 2015-16 Classic Empire - A turn Based Wargame Classic Empire is a real time, multiplayer, Internet-based game, featuring military, diplomatic, and economic
Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök Gyakorló feladatok V 1.0 ÓE-NIK-AII,
Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök Gyakorló feladatok V 1.0 ÓE-NIK-AII, 2016 1 Hallgatói Tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a
Algoritmizálás + kódolás C++ nyelven és Pascalban
Algoritmizálás + kódolás nyelven és ban Motiváció A Programozási alapismeretek tárgyban az algoritmizáláshoz struktogramot, a kódoláshoz nyelvet használunk, a Közismereti informatikában (a közoktatásban
Tájékoztató. Használható segédeszköz: -
A 35/2016. (VIII. 31.) NFM rendelet szakmai és vizsgakövetelménye alapján. Szakképesítés, azonosítószáma és megnevezése 54 213 05 Szoftverfejlesztő Tájékoztató A vizsgázó az első lapra írja fel a nevét!
I. Specifikáció készítés. II. Algoritmus készítés
Tartalomjegyzék I. Specifikáció készítés...2 II. Algoritmus készítés...2 Egyszerű programok...6 Beolvasásos feladatok...10 Elágazások...10 Ciklusok...1 Vegyes feladatok...1 1 I. Specifikáció készítés A
Programozás alapjai II. (7. ea) C++
Programozás alapjai II. (7. ea) C++ Kiegészítő anyag: speciális adatszerkezetek Szeberényi Imre BME IIT M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 1
Azonosító jel: INFORMATIKA EMELT SZINTŰ GYAKORLATI VIZSGA. 2006. november 3. 14:00. A gyakorlati vizsga időtartama: 240 perc
ÉRETTSÉGI VIZSGA 2006. november 3. INFORMATIKA EMELT SZINTŰ GYAKORLATI VIZSGA 2006. november 3. 14:00 A gyakorlati vizsga időtartama: 240 perc Beadott dokumentumok Piszkozati pótlapok száma Beadott fájlok
Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek
Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás, rendezések 2015 Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Algoritmusok és programozási tételek
10. gyakorlat Struktúrák, uniók, típusdefiníciók
10. gyakorlat Struktúrák, uniók, típusdefiníciók Házi - (f0218) Olvass be 5 darab maximum 99 karakter hosszú szót úgy, hogy mindegyiknek pontosan annyi helyet foglalsz, amennyi kell! A sztringeket írasd
C programozási nyelv Pointerek, tömbök, pointer aritmetika
C programozási nyelv Pointerek, tömbök, pointer aritmetika Dr. Schuster György 2011. június 16. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 1 / 15 Pointerek (mutatók) Pointerek
7. fejezet: Mutatók és tömbök
7. fejezet: Mutatók és tömbök Minden komolyabb programozási nyelvben vannak tömbök, amelyek gondos kezekben komoly fegyvert jelenthetnek. Először is tanuljunk meg tömböt deklarálni! //Tömbök használata
Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés
Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba I 4. gyakorlat PLanG: 2011.10.04. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Fájlok
/* Az iter függvény meghívása és a visszatérő érték átadása a gyok változóba */ gyok = iter( n, a, e ) ;
1. Írjunk programot, amely függvény alkalmazásával meghatározza n a értékét, (a az n-edik gyök alatt), az általunk megadott pontossággal, iterációval. Az iteráció képlete a következő: ahol : n-1 x uj =
6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok
6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok 1. feladat: Az EURO árfolyamát egy negyedéven keresztül hetente nyilvántartjuk (HUF / EUR). Írjon C programokat az alábbi kérdések
INFORMATIKAI ALAPISMERETEK
Informatikai alapismeretek középszint 0621 ÉRETTSÉGI VIZSGA 2007. május 25. INFORMATIKAI ALAPISMERETEK KÖZÉPSZINTŰ ÍRÁSBELI ÉRETTSÉGI VIZSGA JAVÍTÁSI-ÉRTÉKELÉSI ÚTMUTATÓ OKTATÁSI ÉS KULTURÁLIS MINISZTÉRIUM
// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió
BME MOGI Gépészeti informatika 3. 1. feladat Végezze el a következő feladatokat! Kérjen be számokat 0 végjelig, és határozza meg az átlagukat! A feladat megoldásához írja meg a következő metódusokat! a.
Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):
Javascript Változók Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai): Név Érték Típus Memóriacím A változó értéke (esetleg más attribútuma is) a program futása
Hatékonyság 1. előadás
Hatékonyság 1. előadás Mi a hatékonyság Bevezetés A hatékonyság helye a programkészítés folyamatában: csak HELYES programra Erőforrásigény: a felhasználó és a fejlesztő szempontjából A hatékonyság mérése
Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED
UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED AWK - szintaxis, vezérlési szerkezetek Operációs rendszerek 11. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Csuvik
Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok
Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba I 3. gyakorlat PLanG: 2011.09.27. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Algoritmusok
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
Programozás alapjai C nyelv 8. gyakorlat Szeberényi mre BME T Programozás alapjai. (C nyelv, gyakorlat) BME-T Sz.. 2005.11.07. -1- Mutatók és címek (ism.) Minden változó és függvény
Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs sergyan.szabolcs@nik.uni-obuda.hu
Programozás I. 3. előadás Egyszerű programozási tételek Sergyán Szabolcs sergyan.szabolcs@nik.uni-obuda.hu Óbudai Egyetem Neumann János Informatikai Kar Alkalmazott Informatikai Intézet 2015. szeptember
Gyakorló feladatok. Az alaputasítások olyanok, mint C-ben. (Részleteket ld. segedletek/02.pdf vagy bármelyik Java tutorial.)
Gyakorló feladatok Az alaputasítások olyanok, mint C-ben. (Részleteket ld. segedletek/02.pdf vagy bármelyik Java tutorial.) 1. Adott egy pozitív egész számokból álló tömb. Hozzunk létre egy másik tömböt,
A C# programozási nyelv alapjai
A C# programozási nyelv alapjai Tisztán objektum-orientált Kis- és nagybetűket megkülönbözteti Ötvözi a C++, Delphi, Java programozási nyelvek pozitívumait.net futtatókörnyezet Visual Studio fejlesztőkörnyezet
Occam 1. Készítette: Szabó Éva
Occam 1. Készítette: Szabó Éva Párhuzamos programozás Egyes folyamatok (processzek) párhuzamosan futnak. Több processzor -> tényleges párhuzamosság Egy processzor -> Időosztásos szimuláció Folyamatok közötti
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!
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! using System; using System.Collections.Generic; using System.IO;
Egyszerű példaprogramok gyakorláshoz
Egyszerű példaprogramok gyakorláshoz Tartalom Feladatok... 2 For ciklus... 2 Szorzótábla... 2 Szorzótábla részlet... 3 Pascal háromszög... 4 Pascal háromszög szebben... 5 DO-LOOP ciklus... 6 Véletlen sorsolás...
Alkalmazott modul: Programozás 2. előadás. Procedurális programozás: adatfolyamok, adatsorok kezelése
Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás 2. előadás Procedurális programozás: adatfolyamok, adatsorok kezelése 2015 Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto