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ő vectorban103 {104 int i=0; // klasszikus lineáris keresés105 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ét110 else return -1; // egyébként -1-et111 }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 indexe119 vector<telek> temp; // ebbe kerül vagy a páros vagy páratlan oldali vector120 set<char> szomszedok; // egy halmaz, amibe a szomszédok és az adott telek színe kerül121 122 cout << "Adjon meg egy házszámot! ";123 cin >> hsz; // házszám beolvasása124 125 srand(time(NULL)); // véletlenszám-generátor inicializálása126 if(hsz%2==0) // ha házszám páros, akkor127 {128 k=kerites_hazszam(prs,hsz); // házszám alapján megkeressük a telek indexét129 temp=prs; // temp-be kerül a párosoldali vector130 }131 else132 {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, akkor137 {138 cout << "A kerítés színe / állapota: " << temp[k].kerites << endl;139 bal=k-1;jobb=k+1; // szomszédok indexe140 k==0 ? bal=k : bal=k-1; // legelső telket adtuk meg ---> ha igen, akkor a bal szomszéd maga a telek141 k==temp.size()-1 ? jobb=k : jobb=k+1; // legutolsó telket adtuk meg, akkor a jobb szomszéd maga a telek142 for(int i=bal;i<=jobb;i++) {szomszedok.insert(temp[i].kerites);} // szomszédok (és az adott telek) színének halmazba helyezése143 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 halmazban148 cout << "Egy lehetséges festési szín: " << s << endl;149 }150 else151 {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ása165 }166 fki << endl;167 for(auto t:ptl)168 {169 hazszam=to_string(t.hazszam); // házszám stringé alakítása170 fki << hazszam << setw(t.szelesseg-hazszam.size()) << szokoz; // házszám és megfelelő számú szóköz kiírása171 }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 }