|
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 }