1 #include <iostream> // cin, cout 2 #include <fstream> // fájlkezelés 3 #include <ctime> // véletlenszámok 4 #include <vector> // vector adattípushoz (kvázi lista) 5 #include <map> // map adattípushoz (szótár) 6 #include <set> // set adattípushoz (halmaz) 7 #include <algorithm> // sort 8 9 using namespace std; 10 11 struct teszt 12 { 13 string k; // kérdés 14 long v; // válasz 15 int p; // pont 16 string t; // témakör 17 }; 18 19 void F1(vector<teszt> &k) // cím szerinti paraméterátadás 20 { 21 printf("1. feladat - Adatok beolvasása ---------------------------\n"); 22 ifstream fbe; 23 fbe.open("felszam.txt"); 24 bool kerdes_jon=true; // figyeljük, hogy kérdés jön-e a fájlban 25 string sor=" ", enter; // a kérdés teljes sorát egyben olvassuk be; sorvégi enterre figyelni kell majd 26 teszt temp; // ebbe az ideiglenes struktúrába helyezzük el a beolvasott adatokat 27 while(sor!="") // addig olvassuk a fájlt, amíg üres sort nem olvasunk 28 { 29 if(kerdes_jon) // ha kérdés jön, akkor... 30 { 31 sor=""; // ezt üresre állítjuk, hogy ha esetleg már nincs mit olvasni, ne legyen benne "szemét" 32 getline(fbe,sor); // teljes sor beolvasása (ez egy kérdés) 33 temp.k=sor; // temp-be bekerül a kérdés 34 kerdes_jon=false; // hamisra "kapcsoljuk", mert majd nem kérdés jön... 35 } 36 else // nem kérdés olvasása 37 { 38 fbe >> temp.v; // szóközök, mint szeparálók alapján olvassuk be a három további elemet 39 fbe >> temp.p; 40 fbe >> temp.t; 41 getline(fbe,enter); // az előző beolvasások ott hagyják a sorvégi entert, ezt el kell "tüntetni"... 42 k.push_back(temp); // mind a 4 elem együtt, mehet a vektorunkba 43 kerdes_jon=true; // és majd ismét kérdés jön (ez megy, amíg van mit olvasni a fájlból...) 44 } 45 } 46 fbe.close(); 47 } 48 49 int F2(vector<teszt> k) 50 { 51 printf("\n2. feladat -----------------------------------------------\n"); 52 return k.size(); 53 } 54 55 void F3(vector<teszt> k) 56 { 57 printf("\n3. feladat -----------------------------------------------\n"); 58 map<int,int> mat; // "szótár": kulcs és érték is int típusú 59 for(int i=1;i<4;i++) mat[i]=0; // a lehetséges pontszámok a kulcsok: 1, 2, 3. A kezdő érték nulla 60 int db=0; // matematika témakörben hány kérdés van? 61 for(auto elem:k) // "bejárjuk" a vektorunkat, egyik elemét a másik után... 62 { 63 if(elem.t=="matematika") // ha a témakör matek, akkor... 64 { 65 db++; // számlálót növeljük 66 mat[elem.p]++; // a "szótár" adott pontszámhoz tartozó bejegyzését növeljük, darabra számoljuk 67 } 68 } 69 printf("Az adatfájlban %d matematika feladat van.\n", db); 70 printf("1 pontot ér %d feladat, 2 pontot ér %d feladat, 3 pontot ér %d feladat.\n", mat[1], mat[2], mat[3]); 71 } 72 73 bool valasz(teszt i1, teszt i2) 74 { 75 return (i1.v < i2.v); // egy struktúra v eleme < egy másik struktúra v eleme ---> igaz / hamis 76 } 77 78 void F4(vector<teszt> k) 79 { 80 printf("\n4. feladat -----------------------------------------------\n"); 81 // rendezzük a vektort, de mivel struktúrákból áll, meg kell mondani melyik rész szerint rendezzük 82 // ezt a valasz függvény adja meg: a válaszok alapján rendezzük (ugye ez long típusú adatrész) 83 sort(k.begin(),k.end(),valasz); 84 printf("A válaszok számértéke %d és %d között van.\n", k[0].v, k[k.size()-1].v); 85 86 } 87 void F5(vector<teszt> k) 88 { 89 printf("\n5. feladat -----------------------------------------------\n"); 90 set<string> temakorok; // egy halmazba gyűjtjük a temakoroket 91 for(auto kerdes:k) 92 { 93 temakorok.insert(kerdes.t); // a halmaz csak egyedi elemeket tartalmazhat, ezt használjuk ki... 94 } 95 printf("Az adatfájlban szereplő témakörök:\n"); 96 for(auto temakor:temakorok) 97 cout << temakor << endl; 98 99 }100 101 void F6(vector<teszt> k)102 {103 printf("\n6. feladat -----------------------------------------------\n");104 string temakor;105 long valasz;106 cout << "Milyen témakörből szeretne feladatot kapni? ";107 cin >> temakor;108 // random109 srand(time(NULL));110 int i=rand()%(k.size());111 while(k[i].t!=temakor) // addig generálunk véletlen "indexeket", amíg megfelelő témakörűt nem ad!!!112 {113 i=rand()%(k.size());114 }115 cout << k[i].k << " ";116 cin >> valasz;117 if(valasz==k[i].v)118 {119 cout << "A válasz " << k[i].p << " pontot ér." << endl;120 }121 else122 {123 cout << "A válasz 0 pontot ér." << endl;124 cout << "A helyes válasz: " << k[i].v << endl;125 }126 }127 128 void F7(vector<teszt> k)129 {130 printf("\n7. feladat - Teszt kiírása fájlba ------------------------\n");131 ofstream fki;132 fki.open("tesztfel.txt");133 134 int rnd;135 vector<teszt> kivalogat; // ebbe válogatjuk a 10 különböző kérdést136 set<int> indexek; // indexeket fogunk össze szedni, 10 db különbözőt!!! Ezért set (halmaz) a típusa!137 srand(time(NULL)); // véletlenszám-generátor inicializálása138 139 while(indexek.size()<10) // addig "válogatunk véletlenszerűen, amíg meg nem lesz a 10 különböző indexünk140 {141 rnd=rand()%(k.size()); // véletlen index generálása142 indexek.insert(rnd); // halmazba helyezés, de ugye a halmazban nincsenek ismétlődő értékek...143 }144 for(auto index:indexek)145 {146 kivalogat.push_back(k[index]); // a kiválogatott indexű elemeket a kerdesek vektorból a kivalogat147 // vektorba helyezzük148 }149 int sum=0; // összpontszámhoz kell150 for(auto kerdes:kivalogat)151 {152 fki << kerdes.p << " " << kerdes.v << " " << kerdes.k << endl;153 sum+=kerdes.p; // összegzés154 }155 fki << "A feladatsorra összesen " << sum << " pont adható." << endl;156 157 fki.close();158 }159 160 int main()161 {162 setlocale(LC_ALL,"");163 vector<teszt> kerdesek;164 F1(kerdesek);165 printf("Az adatfájlban %d feladat van.\n",F2(kerdesek));166 F3(kerdesek);167 F4(kerdesek);168 F5(kerdesek);169 F6(kerdesek);170 F7(kerdesek);171 return 0;172 }173