godor202105C++.cpp
  1  #include <iostream>             // cin, cout
  2  #include <fstream>              // fájlkezelés
  3  #include <vector>               // vector adattípushoz
  4  #include <algorithm>            // count, minmax_element, distance
  5  
  6  using namespace std;
  7  
  8  void F1(vector<int> &g)
  9  {
 10      cout << "1. feladat" << endl;
 11      ifstream fbe;
 12      fbe.open("melyseg.txt");
 13      int temp;
 14      while(fbe>>temp)
 15      {
 16          g.push_back(temp);
 17      }
 18      fbe.close();
 19      printf("A fájl adatainak száma: %d\n", g.size());
 20  }
 21  
 22  void F2(vector<int> &g, int &t)             // t - tav neven "forog" majd a 6. feladathoz is...
 23  {
 24      cout << endl << "2. feladat" << endl;
 25      cout << "Adjon meg egy távolságértéket! ";
 26      cin >> t;
 27      printf("Ezen a helyen a felszín %d méter mélyen van.\n",g[t-1]);        // indexelés, ugye!
 28  }
 29  
 30  void F3(vector<int> g)
 31  {
 32      cout << endl << "3. feladat" << endl;
 33      int nulla_db=count(g.begin(), g.end(), 0);              // 0 értékből hány darab van?
 34      float arany=(float) nulla_db/ (float) g.size()*100;     // float, hogy valós eredményünk legyen
 35      printf("Az érintetlen terület aránya %.2f%s.\n", arany,"%");        // .2f - két tizedesjegy valós
 36  }
 37  
 38  void F4_5(vector<int> g)
 39  {
 40      cout << endl << "4. feladat" << endl;
 41      cout << "Adatok kiírása fájlba... ";
 42      ofstream fki;
 43      fki.open("godrok.txt");
 44  
 45      bool enter=false;           // ezzel szabályozzuk a soremelést a fájlban a gödrök végén
 46      int godrok_szama=0;
 47      for(auto elem:g)
 48      {
 49          if(elem>0)              // kezdődik egy gödör
 50          {
 51              fki << elem << " "; // kiírjuk
 52              enter=true;         // "bekapcsoljuk" a soremelés "jelzőt"
 53          }
 54          else                    // most felszínen vagyunk
 55          {
 56              if(enter)           // ha soremelést kell csinálni, akkor
 57              {
 58                  godrok_szama++; // gödör volt és számoljuk
 59                  fki << endl;    // fájlban soremelés
 60              }
 61              enter=false;        // kapcsolót visszaállítjuk...
 62          }
 63      }
 64      fki.close();
 65      cout << "kész!" << endl;
 66      cout << endl << "5. feladat" << endl;
 67      printf("A gödrök száma: %d\n", godrok_szama);
 68  }
 69  
 70  void F6(vector<int> g, int t)
 71  {
 72      cout << endl << "6. feladat" << endl;
 73  
 74      int kezd, vege;     // 2. feladatban megadott helyen a lehetséges gödör kezdete és vége
 75                          // itt nagyon meg kell gondolni, hogy mi index, mi igazi sorszám...!!!
 76      if(g[t-1]==0)
 77      {
 78          cout << "Az adott helyen nincs gödör." << endl;
 79      }
 80      else
 81      {
 82          kezd=t-1;               // az adott ponttól visszafelé megyünk 0-ig
 83          while(g[kezd-1]!=0)
 84          {
 85              kezd--;
 86          }
 87          vege=t;                 // az adott ponttól előre megyünk 0-ig
 88          while(g[vege]!=0)
 89          {
 90              vege++;
 91          }
 92          cout << "a)" << endl;
 93  
 94          printf("A gödör kezdete: %d méter, a gödör vége: %d méter.", kezd+1, vege);
 95  
 96          cout << endl << "b)" << endl;
 97          // MONOTON - NEM SZIGORÚAN MONOTON...
 98          // minmax_element egy adatpárt jelent: first a minimum, second a maximum értéke
 99          auto it=minmax_element(g.begin()+kezd,g.begin()+vege-1);
100          int max_helye=distance(g.begin()+kezd, it.second);      // max helye a kezd-hez képest
101          bool le=true;       // gödör "bal" szélétől lefelé ereszkedünk
102          for(int i=kezd;i<kezd+max_helye;i++)
103          {
104              if(g[i]>g[i+1])     // ha az ereszkedésben törés van, akkor bukta van... :)
105              {
106                  le=false;
107                  break;
108              }
109          }
110          bool fel=true;      // gödör "mélypontjától" felfelé lépkedünk jobb széle felé...
111          for(int i=kezd+max_helye;i<vege;i++)
112          {
113              if(g[i]<g[i+1])     // ha az emelkedésben törés van, akkor bukta van... :)
114              {
115                  fel=false;
116                  break;
117              }
118          }
119          if(le && fel)       // ha a le, és a fel is sikeres volt, akkor...
120          {
121              cout << "Folyamatosan mélyül." << endl;
122          }
123          else
124          {
125              cout << "Nem mélyül folyamatosan." << endl;
126          }
127  
128          cout << "c)" << endl;
129          printf("A legnagyobb mélysége %d méter.",g[kezd+max_helye]);
130  
131          cout << endl << "d)" << endl;
132          int terfogat=0;
133          for(int i=kezd;i<vege;i++) terfogat+=g[i]*10;       // térfogat=1*mélység*szélesség (minden méterre)
134          printf("A térfogata %d m^3.",terfogat);
135  
136          cout << endl << "e)" << endl;
137          // lehetne máshogy is...
138          int mennyiseg=0;
139          for(int i=kezd;i<vege;i++) mennyiseg+=(g[i]-1)*10;  // mélységből 1-et elveszünk
140          printf("A vízmennyiség %d m^3.\n",mennyiseg);
141      }
142  }
143  
144  int main()
145  {
146      setlocale(LC_ALL,"");
147  
148      vector<int> godor;
149      int tav;                // 2. és 6. feladathoz
150      godor.reserve(2000);    // 2000 elemre foglaljuk a memóriát...
151  
152      F1(godor);
153      F2(godor,tav);          // itt az a bizonyos tav, ami a 6. feladathoz is átadásra kerül
154      F3(godor);
155      F4_5(godor);
156      F6(godor,tav);          // tav...
157  
158      return 0;
159  }