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  }