1 #include <iostream>
2 #include <fstream>
3 #include <sstream> //stringstream miatt kell (lásd idoszoveg függvényt)
4
5 using namespace std;
6
7 struct hivas
8 {
9 int h_kezd, h_vege;
10 }hivasok[1000];
11 //maximum 1000 sor lehet, és minden sorban 6 egész szám -> ezeket másodpercre váltjuk majd
12 int N; //a fájlban lévő sorok száma (Figyeljünk az esetleges üres sorra a fájl végén!)
13
14 void kiir(string sz)
15 {
16 cout << sz <<endl;
17 }
18
19 int mpbe(int ora, int perc, int mp) //1. feladat
20 {
21 int mp_x=ora*3600+perc*60+mp;
22 return mp_x;
23 }
24
25 string idoszoveg(int mp)
26 {
27 //A stringstream típus egy ún. string buffert használ, ami egy spec. memóriaterület
28 //Ezt a memóriaterületet közvetlenül kezelhetjük, például az alábbiak szerint
29 stringstream memoria;
30 memoria << mp/3600 << " " << (mp%3600)/60 << " " << mp%60;
31 string szoveges_ido;
32 getline(memoria, szoveges_ido);
33 return szoveges_ido;
34 }
35
36 void F2()
37 {
38 ifstream fbe;
39 int o, p, mp;
40 fbe.open("hivas.txt");
41 int i=0;
42 cout << "Adatok beolvasása...";
43 while(!fbe.eof())
44 {
45 fbe >> o >> p >> mp;
46 hivasok[i].h_kezd=mpbe(o,p,mp);
47 fbe >> o >> p >> mp;
48 hivasok[i].h_vege=mpbe(o,p,mp);
49 i++;
50 }
51 cout << "vége!" << endl;
52 N=i-1; //-1 az üres sor miatt a fájl végén
53 cout << "Beolvasott sorok száma: " << N << endl;
54 fbe.close();
55
56 }
57
58 void F3() //MEGSZÁMLÁLÁS
59 {
60 int orak[24]={0}; //Ebben számoljuk az órákhoz tartozó hívások számát, kezdetben mind nulla
61 for(int i=0;i<N;i++)
62 {
63 orak[hivasok[i].h_kezd/3600]++;
64 }
65 for(int i=0;i<24;i++)
66 {
67 if(orak[i]>0) cout << i << " óra " << orak[i] << " hívás" << endl;
68 }
69 }
70
71 void F4() //MAXIMUMKERESÉS
72 {
73 int maxhossz=0;
74 int maxhely=0;
75
76 for(int i=0;i<N;i++)
77 {
78
79 if(hivasok[i].h_vege-hivasok[i].h_kezd>maxhossz)
80 {
81 maxhossz=hivasok[i].h_vege-hivasok[i].h_kezd;
82 maxhely=i+1;
83 }
84 }
85 cout << "A leghosszabb ideig vonalban lévő hívó " << maxhely << ". sorban szerepel, ";
86 cout << "a hívás hossza: " << maxhossz << " másodperc." << endl;
87 }
88
89 void F5() //LINEÁRIS KERESÉS
90 {
91 int ora, perc, mp;
92 cout << "Kérek egy időpontot! (óra, perc, mp)" << endl;
93 cout << "óra: "; cin >> ora;
94 cout << "perc: "; cin >> perc;
95 cout << "mp: "; cin >> mp;
96 int most=mpbe(ora,perc,mp);
97 int kezd, vege;
98 int beszelo=0,varakozo=0; //várakozók száma
99 for(int i=0;i<N;i++)
100 {
101 if(hivasok[i].h_kezd<=most&&most<hivasok[i].h_vege&&beszelo!=0)
102 //Ennek meg kell előznie a beszélő megállapítását, hogy a beszélőt ne számolja bele a várakozókba
103 {
104 varakozo++;
105 }
106 //Kihasználjuk, hogy az adatok hívásidő szerint sorban vannak
107 if(hivasok[i].h_kezd<=most&&most<hivasok[i].h_vege&&beszelo==0)
108 {
109 beszelo=i+1; //+1, mert nem indexet közlünk a felhasználóval, hanem tényleges sorszámot!
110 }
111
112 }
113 if(beszelo==0)
114 cout << "Nem volt beszélő!" << endl;
115 else
116 cout << "Várakozók száma: " << varakozo << ", a beszélő a(z) " << beszelo << ". hívó." << endl;
117 }
118
119 void F6()
120 {
121 int kezd, vege, u_kezd, e_vege;
122 int varakozas; //várakozási idő
123 int elozo,utolso=0;
124 int ora12=mpbe(12,0,0);
125 for(int i=0;i<N;i++)
126 {
127 if(hivasok[i].h_kezd<=ora12&&hivasok[i].h_vege>hivasok[utolso].h_vege)
128 {
129 elozo=utolso;
130 utolso=i;
131 }
132 }
133 varakozas=hivasok[elozo].h_vege-hivasok[utolso].h_kezd;
134 cout << "Az utolsó telefonáló adatai a(z) " << utolso+1 << ". sorban vannak, ";
135 cout << varakozas << " másodpercig várt." << endl;
136 }
137
138 void F7()
139 {
140 cout << "Adatok kiírása a fájlba..." << endl;
141 int munkakezdes=mpbe(8, 0, 0);
142 int ora12=mpbe(12,0,0);
143 ofstream fki;
144 fki.open("sikeres2.txt");
145 int vonalban=0;
146 //Megkeressük az első olyan hívót, aki 8 óra után tette le a telefont,
147 //az ilyenre azt mondjuk, hogy vonalban volt 8-kor, illetve utána
148 while(hivasok[vonalban].h_vege<munkakezdes)
149 {
150 vonalban++;
151 }
152 //Az alábbi +1 a szokásos indexprobléma miatt van :)
153 //Ha 8 előtt hívta a központot, a beszélgetése csak 8-tól kezdődhetett
154 if(munkakezdes>hivasok[vonalban].h_kezd)
155 fki << vonalban+1 << " " << idoszoveg(munkakezdes);
156 else
157 fki << vonalban+1 << " " << idoszoveg(hivasok[vonalban].h_kezd);
158 fki << " " << idoszoveg(hivasok[vonalban].h_vege) << endl;
159
160 //Az első vonalban lévő után a többi sikeres telefonálót is kiírjuk a fájlba
161 for(int i=0; i<N; i++)
162 {
163 //Akkor sikeres hívó, ha az aktuálisan vonalban lévőhöz képest,
164 //ő később tette le a kagylót és a kezdése mukaidő vége előtt volt
165 if(hivasok[i].h_kezd<=ora12&&hivasok[i].h_vege>hivasok[vonalban].h_vege)
166 {
167 fki << i+1 << " " << idoszoveg(max(hivasok[i].h_kezd, hivasok[vonalban].h_vege)) << " ";
168 fki << idoszoveg(hivasok[i].h_vege) << endl;
169
170 vonalban=i; //Ha van egy ilyen (lásd pár sorral feljebb), akkor ő lesz az akihez majd nézzük a következőt
171 }
172 }
173 fki.close();
174 }
175
176 int main()
177 {
178 setlocale(LC_ALL, "hun");
179 kiir("2. feladat:");
180 F2();
181 kiir("3. feladat:");
182 F3();
183 kiir("4. feladat:");
184 F4();
185 kiir("5. feladat:");
186 F5();
187 kiir("6. feladat:");
188 F6();
189 kiir("7. feladat:");
190 F7();
191
192 return 0;
193
194 }