Advertisement
Guest User

Untitled

a guest
Jan 20th, 2020
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.05 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. #include <string>
  4. using namespace std;
  5.  
  6.  
  7. struct TStudent//deklaracia struktury Tstudent
  8. {
  9. char Meno[30];
  10. char Priezvisko[30];
  11. int rc;
  12. int bodyUbytko;
  13. char bydlisko[30];
  14. int vzdialenost;
  15. };
  16. int rok(int);// deklaracie vsetkych funkcii
  17. int jeZena(int);
  18. int mesiac(int);
  19. int den(int);
  20. void VypisDatum(int c);
  21. int PorovnajStudentov(TStudent*, TStudent*);
  22. int NajdiStudenta(TStudent*, char, int, char*);
  23. int PorovnajRC(TStudent*, TStudent*);
  24. void Bubblesort(TStudent**data, int pocet);
  25. void vypis_studenta(TStudent *);
  26.  
  27.  
  28. int rok(int rc)
  29. {
  30. int pomocna = rc / 10000;// rok zistujeme z posledných dvoch znakov
  31. if (pomocna < 20)//ak je mensi ako 20 tak 2000 ak
  32. return pomocna + 2000;
  33. else return pomocna + 1900;
  34.  
  35. }
  36. int jeZena(int c)
  37. {
  38. c = c / 1000; // rodne cislo vydeli 1000
  39. c %= 10; //zisti zvysok po deleni posledneho trojcisla
  40. if (c >= 5)// ak je vacsi ako 5 tak zena inak muz
  41. return 1;
  42. else return 0;
  43. }
  44.  
  45. int mesiac(int rc)
  46. {
  47. int Monat = ((rc % 10000) / 100); // zvysok po deleni 100000 vydeli 100
  48. if (Monat > 12) return Monat - 50;// ak je vascie ako 12 tak od mesiaca odrata 50(v pripade ze je zena ta ma k mesiacu priratane 50)
  49. else return Monat;// ak mensie ako 12 tak ide o muža tomu k mesiacu nepriratava nic
  50. }
  51. int den(int rc)
  52. {
  53. return rc % 100;
  54. }
  55. void VypisDatum(int c)// zvyšok je deleny 100 je den
  56. {
  57. cout << den(c) << ". " << mesiac(c) << ". " << rok(c); // vypiše datum volanim funkcii den , mesiac, rok
  58. }
  59. int PorovnajRC(TStudent*s1, TStudent*s2)
  60. {
  61. int rok1 = rok(s1->rc);//funkcia porovnava studentov podla veku
  62. int rok2 = rok(s2->rc); // najprv si do premnnych prebere den,mesiac,rok volanim fukcii rok,mesiac,den
  63. int mesiac1 = mesiac(s1->rc);// v ktorych sa ako parameter nachadza ukazovate na strukturovu premmenu jednotlivých studentov
  64. int mesiac2 = mesiac(s2->rc);
  65. int den1 = den(s1->rc);
  66. int den2 = den(s2->rc);
  67. if (rok1 > rok2)// nasledne poronava rok , mesiac , a dni aj ja 1vascia ako 2 vrati 1 inak porovnava az po den
  68. // a ak s1 nie je vacsia ako s2 tak vrati 0
  69. {
  70. return 1;
  71. }
  72. else if (rok1 == rok2)
  73. {
  74. if (mesiac1 > mesiac2)
  75. {
  76. return 1;
  77. }
  78. else if (mesiac1 == mesiac2)
  79. if (den1 > den2)
  80. {
  81. return 1;
  82. }
  83. }
  84. return 0;
  85. }
  86. int PorovnajStudentov(TStudent *s1, TStudent *s2)// podobne porovnavanie podla vybranych parametrov
  87. {
  88. if (s1->bodyUbytko > s2->bodyUbytko)
  89. {
  90. return 1;
  91. }
  92. else if (s1->bodyUbytko == s2->bodyUbytko)
  93. {
  94. if (s1->vzdialenost > s2->vzdialenost)
  95. {
  96. return 1;
  97. }
  98. else if (s1->vzdialenost == s2->vzdialenost)
  99. {
  100. if (PorovnajRC(s1, s2) == 1)
  101. {
  102. return 1;
  103. }
  104. }
  105. }
  106. return false;
  107. }
  108. int NajdiStudenta(TStudent*s, char pohl, int body_ubyt, char* mesto)
  109. {
  110. mesto[0] = toupper(mesto[0]);// nastavi znak v 0 indexe ukayovatela mesto na velke pismeno
  111. int i;
  112. int pocet = 0;
  113. for (i = 0; i < 31; i++)
  114. {
  115. if (mesto[i] == '-') // prechadza pole a ak najde znak pomlcka tak zvyši pocet o 1
  116. pocet++;
  117. }
  118. if (pocet == 2)// ak sa pocet rovna 2
  119. {
  120. for (i = 0; i < 31; i++)
  121. {
  122. if (mesto[i] == '-')// ak najde prvu pommlcky ta vyjde z cyklu
  123. break;
  124. }
  125. for (i = i + 1; i < 31; i++)// a pokracuje znakom od prvej pomlcky pri ktorej zmeni znak za pomlckov na velky (slovenske mesta maju prve velke potom male potom zase velke)
  126. if (mesto[i] == '-')// naprc Dubnica-nad-Vahom
  127. {
  128. mesto[i + 1] = toupper(mesto[i + 1]);
  129. }
  130. }
  131. if (pocet == 1) // ak sa pocet rovna 1 tak zmeni znak za pomlckov na velky
  132. {
  133. for (i = 0; i < 31; i++) //naprv Nova-Sala
  134. if (mesto[i] == '-')
  135. {
  136. mesto[i + 1] = toupper(mesto[i + 1]);
  137. }
  138. }
  139. char gender;
  140. if (jeZena(s->rc)) gender = 'z';
  141. else gender = 'm';
  142. if ((pohl == gender) && (s->bodyUbytko <= body_ubyt) && (!strcmp(s->bydlisko, mesto)))
  143. return 1;
  144. else
  145. return 0;
  146. }
  147. void Bubblesort(TStudent**data, int pocet)
  148. {
  149. int i;
  150. TStudent* tmp;
  151. for (i = 0; i < pocet - 1; i++)
  152. {
  153. for (int j = 0; j < pocet - i - 1; j++) {
  154. if (PorovnajStudentov(data[j + 1], data[j]))
  155. {
  156. tmp = data[j + 1];
  157. data[j + 1] = data[j];
  158. data[j] = tmp;
  159. }
  160. }
  161. }
  162. }
  163. void vypis_studenta(TStudent *s)
  164. {
  165. cout << s->Priezvisko << " " << s->Meno << "\t";
  166. cout << "(" << s->bodyUbytko << ")" << " "; cout << s->rc << ", ";
  167.  
  168. if (jeZena(s->rc))
  169. cout << "z" << ", ";
  170. else
  171. cout << "m" << ", ";
  172. VypisDatum(s->rc);
  173. cout << "\t" << s->bydlisko << " ";
  174. cout << "(" << s->vzdialenost << ")" << " ";
  175. cout << endl;
  176. }
  177. void VypisStudentov(TStudent **st, int poc)
  178. {
  179. int i;
  180. for (i = 0; i < poc; i++)
  181. {
  182. vypis_studenta(st[i]);
  183. }
  184.  
  185. }
  186. int main()
  187. {
  188. char m[30], p[30];
  189. int rc, bu, vz;
  190. char hlad_pohlavie;
  191. int hlad_body;
  192. char mesto[30];
  193. ifstream vstup;// vytvorenie objektu vstup triedy ifstream
  194. vstup.open("studenti.txt");
  195. if (!vstup.is_open())// testovanie ci je objekt ifstream asociovany s nejakým datový prudom
  196. {
  197. cout << "subor sa nepodarilo otvorit (skontrolujte ci ste zadali spravny nazov suboru)";
  198. return 0;
  199. }
  200.  
  201. int j = 0;
  202. TStudent **student = new TStudent*[100];
  203.  
  204. while (vstup >> m >> p >> rc >> bu >> mesto >> vz) //citanie z prudu vstup pomocov prepisaneho operatora
  205. {
  206. student[j] = new TStudent(); // vytvorenie pola studentov
  207. strcpy(student[j]->Meno, m);// vkladanie nacitaných hodnot do jednotlivých prvkov pola student
  208. strcpy(student[j]->Priezvisko, p);
  209. student[j]->rc = rc;
  210. student[j]->bodyUbytko = bu;
  211. strcpy(student[j]->bydlisko, mesto);
  212. student[j]->vzdialenost = vz;
  213. j++;
  214. }
  215. int pocet = j;
  216.  
  217. cout << "Neusporiadany zoznam " << j << " studentov zo suboru 'studenti.txt'" << endl;
  218. cout << "-----------------------------------------------------------------------" << endl;
  219. VypisStudentov(student, j);
  220. cout << "-----------------------------------------------------------------------" << endl;
  221. cout << "Usporiadany zoznam" << j << "studentov zo suboru 'studenti.txt' funkciou Bubblesort";
  222. cout << endl;
  223. cout << "------------------------------------------------------------------------" << endl;
  224. Bubblesort(student, j);
  225. VypisStudentov(student, j);
  226. cout << "-------------------------------------------------------------------------" << endl;
  227. cout << "Vlozte pohlavie hladanych studentov muz(m)/zena(z) : ";
  228. cin >> hlad_pohlavie;
  229. cout << "Vlozte maximalny pocet bodov za ubytovanie studentov : ";
  230. cin >> hlad_body;
  231. cout << "Vlozte hladane meno studenta :";
  232. cin >> mesto;
  233. int pocet_najdenych = 0;
  234. for (int i = 0; i < pocet; i++)
  235. {
  236. if (NajdiStudenta(student[i], hlad_pohlavie, hlad_body, mesto) == 1)
  237. {
  238. pocet_najdenych++;
  239. vypis_studenta(student[i]);
  240.  
  241. }
  242. }
  243. if (pocet_najdenych == 0)
  244. cout << "Nenasiel sa student ktory splna zadane kriteria " << endl;
  245. cout << endl;
  246. cout << "pocet studentov ktori splnaju zadane kriteria : " << pocet_najdenych;
  247. cout << endl;
  248.  
  249. for (int k = 0; k < j; k++)
  250. delete student[k];//zmazanie jednotlivých prvkov pola
  251. delete[] student;//vymazanie dvojrozmerneho dynamickeho pola student
  252. return 0;
  253. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement