utca201810_C++.cpp

  1  #include <iostream>         // cin, cout
  2  #include <fstream>          // fájkezelés
  3  #include <vector>           // vector adattípushoz
  4  #include <set>              // set (halmaz) adattípushoz
  5  #include <ctime>            // random számhoz
  6  #include <iomanip>          // setw parancs
  7  
  8  using namespace std;
  9  
 10  struct telek                // egy telket "leíró" struktúra
 11  {
 12      int hazszam;
 13      int szelesseg;
 14      char kerites;
 15      int sorrend;            // fájlban elfoglalt eredeti sorrend (egyben a vásárlás sorrendje)
 16  };
 17  
 18  void F1(vector<telek> &prs,vector<telek> &ptl)
 19  {
 20      ifstream fbe;
 21      fbe.open("kerites.txt");
 22      int oldal;                      // a fájl sorának első eleme, melyet arra használunk, hogy a házszámot megállapítsuk
 23      int prs_hsz=2,ptl_hsz=1;        // házszámok a páros és páratlan oldalon, ez kerül a struktúrába és a vectorba
 24      telek temp;                     // telek típusú átmeneti változó a fájlból beolvasott adatokhoz
 25      int i=1;                        // eredeti sorrendhez (lsd. 15.sor megjegyzése)
 26      while(fbe>>oldal&&fbe>>temp.szelesseg&&fbe>>temp.kerites)
 27      {
 28          if(oldal==0)    // páros oldalon vagyunk
 29          {
 30              temp.hazszam=prs_hsz;
 31              temp.sorrend=i;
 32              prs.push_back(temp);    // páros oldal vectorának feltöltése
 33              prs_hsz+=2;             // házszám "léptetése"
 34          }
 35          else
 36          {
 37              temp.hazszam=ptl_hsz;
 38              temp.sorrend=i;
 39              ptl.push_back(temp);    // páratlan oldal vectorának feltöltése
 40              ptl_hsz+=2;             // házszám "léptetése"
 41          }
 42          i++;    // sorrend növelése
 43      }
 44      fbe.close();
 45      // beolvasott adatok (páros és páratlan oldali vectorok) kiírása képernyőre
 46      for(auto elem:prs)
 47      {
 48          cout << elem.hazszam << " " << elem.szelesseg << " " << elem.kerites << " " << elem.sorrend << endl;
 49      }
 50      cout << "-------------------------------------------------------------------------" << endl;
 51      for(auto elem:ptl)
 52      {
 53          cout << elem.hazszam << " " << elem.szelesseg << " " << elem.kerites << " " << elem.sorrend << endl;
 54      }
 55  }
 56  
 57  void F2(vector<telek> prs,vector<telek> ptl)
 58  {
 59      cout << "-------------------------------- 2. feladat --------------------------------" << endl;
 60      printf("Az eladott telkek száma: %d\n",prs.size()+ptl.size());
 61  }
 62  
 63  void F3(vector<telek> prs,vector<telek> ptl)
 64  {
 65      cout << "-------------------------------- 3. feladat --------------------------------" << endl;
 66      string valasz;
 67      int hsz;
 68      // ha a párosoldali utolsó telek sorrend-száma azonos a teljes telekszámmal, akkor páros oldalon volt az utolsó telek
 69      if(prs[prs.size()-1].sorrend==(prs.size()+ptl.size()))      // itt van egy kis "hátránya" a kétvektoros megoldásunknak
 70      {
 71          valasz="páros";
 72          hsz=prs[prs.size()-1].hazszam;
 73      }
 74      else                                // egyébként a páratlan oldalon
 75      {
 76          valasz="páratlan";
 77          hsz=ptl[ptl.size()-1].hazszam;
 78      }
 79      cout << "A " << valasz << " oldalon adták el az utolsó telket." << endl;
 80      cout << "Az utolsó telek házszáma: " << hsz << endl;
 81  }
 82  
 83  void F4(vector<telek> ptl)
 84  {
 85      cout << "-------------------------------- 4. feladat --------------------------------" << endl;
 86      // Keresünk egy házszámot a páratlan oldalról, amely melletti telken ugyanolyan színű a kerítés...
 87      // Feltételezheti, hogy van ilyen telek, a több ilyen közül elég az egyik ház számát megjeleníteni...
 88      int hsz;                        // ez nem házszám, hanem index a páratlanoldali vectorhoz
 89      set<char> temp={'#',':'};       // a "nem színek" halmaza
 90      for(auto i=0;i<ptl.size();i++)  // páratlan oldali vector bejárása
 91      {
 92          // ha nem eleme tempnek a kerites színe, és ugyanolyan, mint a következő
 93          if(temp.count(ptl[i].kerites)==0&&ptl[i].kerites==ptl[i+1].kerites)
 94          {
 95              hsz=i;      // akkor megjegyezzük az indexét
 96              break;      // és "kiugrunk" a ciklusból
 97          }
 98      }
 99      cout << "A szomszédossal egyezik a kerítés színe: " << ptl[hsz].hazszam << endl;
100  }
101  
102  int kerites_hazszam(vector<telek> t,int hazszam)        // adott házszámú telek keresése a megfelelő vectorban
103  {
104      int i=0;                                            // klasszikus lineáris keresés
105      while(i<t.size()&&t[i].hazszam!=hazszam)
106      {
107          i++;
108      }
109      if(i<t.size()) return i;                            // ha van találat, visszaadja az indexét
110      else return -1;                                     // egyébként -1-et
111  }
112  
113  void F5(vector<telek> prs,vector<telek> ptl)
114  {
115      cout << "-------------------------------- 5. feladat --------------------------------" << endl;
116  
117      char s;
118      int hsz,k,bal,jobb;         // hsz - házszám, k - a megadott házszámú telek indexe és bal, jobb szomszéd indexe
119      vector<telek> temp;         // ebbe kerül vagy a páros vagy páratlan oldali vector
120      set<char> szomszedok;       // egy halmaz, amibe a szomszédok és az adott telek színe kerül
121  
122      cout << "Adjon meg egy házszámot! ";
123      cin >> hsz;                 // házszám beolvasása
124  
125      srand(time(NULL));          // véletlenszám-generátor inicializálása
126      if(hsz%2==0)                // ha házszám páros, akkor
127      {
128          k=kerites_hazszam(prs,hsz);     // házszám alapján megkeressük a telek indexét
129          temp=prs;                       // temp-be kerül a párosoldali vector
130      }
131      else
132      {
133          k=kerites_hazszam(ptl,hsz);     // ugyanaz, mint a páros esetben...
134          temp=ptl;
135      }
136      if(k!=-1)                           // ha találtunk ilyen telket, akkor
137      {
138          cout << "A kerítés színe / állapota: " << temp[k].kerites << endl;
139          bal=k-1;jobb=k+1;                       // szomszédok indexe
140          k==0 ? bal=k : bal=k-1;                 // legelső telket adtuk meg ---> ha igen, akkor a bal szomszéd maga a telek
141          k==temp.size()-1 ? jobb=k : jobb=k+1;   // legutolsó telket adtuk meg, akkor a jobb szomszéd maga a telek
142          for(int i=bal;i<=jobb;i++) {szomszedok.insert(temp[i].kerites);}    // szomszédok (és az adott telek) színének halmazba helyezése
143          do      // véletlenszínek generálása...
144          {
145              s=char (65+rand()%26);
146          }
147          while(szomszedok.count(s)!=0);      //... amíg olyant nem generálunk, ami nincs a szomszed halmazban
148          cout << "Egy lehetséges festési szín: " << s << endl;
149      }
150      else
151      {
152          cout << "Ilyen házszám nincs!" << endl;
153      }
154  }
155  
156  void F6(vector<telek> ptl)
157  {
158      ofstream fki;
159      fki.open("utcakep.txt");
160      char szokoz=' ';
161      string hazszam;
162      for(auto t:ptl)
163      {
164          for(int i=0;i<t.szelesseg;i++) fki << t.kerites;        // telek szélességnek megfelelő számszor kerítés színének kiírása
165      }
166      fki << endl;
167      for(auto t:ptl)
168      {
169          hazszam=to_string(t.hazszam);           // házszám stringé alakítása
170          fki << hazszam << setw(t.szelesseg-hazszam.size()) << szokoz;   // házszám és megfelelő számú szóköz kiírása
171      }
172      fki << endl;
173  }
174  
175  int main()
176  {
177      setlocale(LC_ALL,"");
178      vector<telek> parosoldal;
179      vector<telek> paratlanoldal;
180      F1(parosoldal,paratlanoldal);
181      F2(parosoldal,paratlanoldal);
182      F3(parosoldal,paratlanoldal);
183      F4(paratlanoldal);
184      F5(parosoldal,paratlanoldal);
185      F6(paratlanoldal);
186      return 0;
187  }