foci200710_C++.cpp


  1  #include <iostream>     // cin és cout parancsok
  2  #include <fstream>      // fájlkezelés
  3  #include <vector>       // vektor adattípushoz
  4  #include <map>          // szótár (map) adattípushoz
  5  #include <set>          // halmaz (set) adattípushoz
  6  #include <numeric>      // accumulate
  7  
  8  using namespace std;
  9  
 10  struct meccs
 11  {
 12      int h, v, fh, fv;                   // h - hazai gólok, v - vendég gólok, fh - félidõ hazai gólok, fv - félidõ vendég gólok
 13      string hcs, vcs;                    // hcs - hazai csapat, vcs - vendégcsapat
 14      // Pl.: 1 2 0 2 Agarak Ovatosak
 15  };
 16  
 17  void F1(map<int,vector<meccs>> &m)
 18  {
 19      ifstream fbe;
 20      fbe.open("meccs.txt");
 21      meccs temp;             // meccs (struktúra) típusú átmeneti változó a fájl beolvasásához
 22      int kulcs, n;
 23  
 24      fbe>>n;                 // mérkõzések száma, a fájl elsõ sora
 25      // további sorok beolvasása, szótár feltöltése
 26      while(fbe>>kulcs&&fbe>>temp.h&&fbe>>temp.v&&fbe>>temp.fh&&fbe>>temp.fv&&fbe>>temp.hcs&&fbe>>temp.vcs)
 27      {
 28          m[kulcs].push_back(temp);
 29      }
 30      /*
 31      for(auto msz:m)
 32      {
 33          cout << msz.first << ":" << endl;
 34          for(auto mcs:msz.second)
 35          {
 36              cout << mcs.h << " " << mcs.v << " " << mcs.fh << " " << mcs.fv << " " << mcs.hcs << " " << mcs.vcs << endl;
 37          }
 38      }
 39      */
 40      fbe.close();
 41  }
 42  
 43  void F2(map<int,vector<meccs>> m)       // adott forduló eredményei
 44  {
 45      cout << "------------------------------------------------\n2. feladat\n------------------------------------------------" << endl;
 46      set<int> fordulok;      // lejátszott fordulók sorszámai egy halmazba kerülnek
 47      for(auto mcs:m)
 48      {
 49          fordulok.insert(mcs.first);
 50      }
 51      int f;
 52      do                                              // ez most csak azért, hogy a find függvényt alkalmazhassuk...
 53      {
 54          cout << "Kérem egy forduló sorszámát: ";
 55          cin >> f;
 56      }while(fordulok.find(f) == fordulok.end());     // addig kérjük a forduló számát, amíg olyat nem ad meg, ami a halmazban benne van
 57  
 58      for(auto mcs:m[f])      // m[f] ---> az adott fordulóhoz, mint kulcshoz tartozó vektor
 59      {
 60          // Edes-Savanyu: 2-0 (1-0)
 61          cout << mcs.hcs << "-" << mcs.vcs << ": " << mcs.h << "-" << mcs.v << " (" << mcs.fh << "-" << mcs.fv << ")" << endl;
 62      }
 63  }
 64  
 65  void F3(map<int,vector<meccs>> m)       // kiknek sikerült fordítani a végén
 66  {
 67      cout << "------------------------------------------------\n3. feladat\n------------------------------------------------" << endl;
 68      for(auto msz:m)                                             // meccs szótárunk bejárása
 69      {
 70          for(auto mcs:msz.second)                                // msz.second - adott kulcshoz tartozó vektor bejárása
 71          {
 72              if(mcs.fh<mcs.fv&&mcs.h>mcs.v)                      // hazai csapat félidõben vesztésre áll, de a végén gyõz
 73              {
 74                  cout << msz.first << " " << mcs.hcs << endl;
 75              }
 76              if(mcs.fh>mcs.fv&&mcs.h<mcs.v)                      // a fenti esetet vendégként produkálta
 77              {
 78                  cout << msz.first << " " << mcs.vcs << endl;
 79              }
 80  
 81          }
 82      }
 83  }
 84  
 85  void F456(map<int,vector<meccs>> m)
 86  {
 87      cout << "------------------------------------------------\n4. feladat\n------------------------------------------------" << endl;
 88      string csn;
 89      string ellenfel;
 90      cout << "Kérek egy csapatnevet: ";
 91      cin >> csn;
 92  
 93      cout << "------------------------------------------------\n5. feladat\n------------------------------------------------" << endl;
 94      vector<int> lott;           // lõtt gólok vektora
 95      vector<int> kapott;         // kapott gólok vektora
 96      bool eloszor=false;         // elõször "botlunk bele a csapatba (a szótár rendezettsége miatt a fordulók sorszáma szerint vizsgálódunk)
 97      int fordulo,init=0;         // init - accumulate függvényhez kell - összegzés kezdõértéke
 98      for(auto msz:m)             // meccs szótárunk bejárása
 99      {
100          for(auto mcs:msz.second)                    // msz.second - adott kulcshoz tartozó vektor bejárása
101          {
102              if(mcs.hcs==csn)                        // a megadott csapatnév "megvan" hazai csapatként, akkor...
103              {
104                  lott.push_back(mcs.h);              // lehetne egyszerûen összegezni, de szerettünk volna egy accumulate függvényt látni :)
105                  kapott.push_back(mcs.v);
106                  if(mcs.h<mcs.v&&eloszor==false)     // ha a megadott csapat hazaiként kikap és még nem találkoztunk vele, akkor...
107                  {
108                      eloszor=true;
109                      fordulo=msz.first;              // a forduló száma a szótár kulcsa (msz.first)
110                      ellenfel=mcs.vcs;               // ellenfél a vendégcsapat
111                  }
112              }
113              if(mcs.vcs==csn)                        // a megadott csapatnév "megvan" vendégcsapatként, akkor...
114              {
115                  kapott.push_back(mcs.h);
116                  lott.push_back(mcs.v);
117              }
118          }
119      }
120      printf("lõtt: %d kapott: %d\n",accumulate(lott.begin(),lott.end(),init),accumulate(kapott.begin(),kapott.end(),init));
121      cout << "------------------------------------------------\n6. feladat\n------------------------------------------------" << endl;
122      if(eloszor)
123          printf("Csapatunk a(z) %d. fordulóban kapott ki elõször otthon. Ellenfél: %s\n",fordulo,ellenfel.c_str());
124      else
125          printf("A csapat otthon veretlen maradt.\n");       // ha eloszor false maradt, akkor a megadott csapat nem kapott ki otthon
126  }
127  
128  void F7(map<int,vector<meccs>> m)
129  {
130      FILE *fki;                                              // ez most csak azért, hogy használhassuk az fprintf parancsot
131      fki=fopen("stat.txt","w");
132      vector<vector<int>> stat(10, vector<int> (10, 0));      // 10x10-es mátrix, 0 kezdõértékekkel
133      int s,o;                                                // s - sor, o - oszlop ---> csak a szemléletesség kedvéért
134      for(auto msz:m)
135      {
136          for(auto mcs:msz.second)
137          {
138              s=mcs.h;                                        // maguk a gólok indexelik a mátrixot
139              o=mcs.v;
140              if(mcs.h<mcs.v)                                 // mindig a nagyobb szám legyen a sorindex, ez a kérés...
141              {
142                  s=mcs.v;
143                  o=mcs.h;
144              }
145              stat[s][o]++;                                   // s-o eredmény számlálása...
146          }
147      }
148      for(int i=0;i<10;i++)                                   // 10x10-es mátrix kiírása a stat.txt fájlba
149          for(int j=0;j<=i;j++)
150              fprintf(fki,"%d-%d: %d darab\n",i,j,stat[i][j]);
151      fclose(fki);
152  }
153  
154  int main()
155  {
156      map<int,vector<meccs>> meccsek;         // szótár ---> kulcs: integer, érték: vektor
157      setlocale(LC_ALL,"");
158      F1(meccsek);
159      F2(meccsek);
160      F3(meccsek);
161      F456(meccsek);
162      F7(meccsek);
163      return 0;
164  }