|
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 }