szamok201305idny_C++.cpp
  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      // random
109      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      else
122      {
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ést
136      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ása
138  
139      while(indexek.size()<10)        // addig "válogatunk véletlenszerűen, amíg meg nem lesz a 10 különböző indexünk
140      {
141          rnd=rand()%(k.size());      // véletlen index generálása
142          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 kivalogat
147                                          // vektorba helyezzük
148      }
149      int sum=0;                      // összpontszámhoz kell
150      for(auto kerdes:kivalogat)
151      {
152          fki << kerdes.p << " " << kerdes.v << " " << kerdes.k << endl;
153          sum+=kerdes.p;              // összegzés
154      }
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