Advertisement
Guest User

Projekt Pawel

a guest
Jan 24th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.03 KB | None | 0 0
  1. // main.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include<string>
  7. #include<fstream>
  8. using namespace std;
  9.  
  10. //struct termin {
  11. // int rok;
  12. // int miesiac;
  13. // int dzien;
  14. //};
  15. //
  16. //struct czas_ukonczenia {
  17. // int godzin;
  18. // int minut;
  19. // int sekund;
  20. //};
  21.  
  22. /** Struktura reprezentujaca jeden bieg. Jest to wezel drzewa binarnego. */
  23. struct bieg {
  24. string miejsce;
  25. int data;
  26. int czas;
  27. /** lewy potomek wg daty */
  28. bieg *pLewy;
  29. /** prawy potomek wg daty */
  30. bieg *pPrawy;
  31. };
  32.  
  33.  
  34. /** Struktura reprezentuje biegacza */
  35. struct id {
  36. /** nazwisko :-) */
  37. string nazwisko;
  38. /** nastepny biegacz w liscie */
  39. id*pNext;
  40. /** biegi w ktorych bral udzial */
  41. bieg * pBiegi;
  42. };
  43.  
  44. void help();
  45. string wyciagnijNazwisko(string line); // Wyciagamy substringa od pierwszego do drugiego przecinka
  46. int konwertujStringNaInt(string napis);
  47. int wyciagnijCzasNaMecie(string line); // Wyciagamy substringa od ostatniego przecinka do konca
  48. int indexPierwszejNazwyPliku(int ile, char ** argumenty, int &h);
  49. id* adressPamieciZawodnika(id *pHead, string id_nazwisko);
  50. void dodajZawodnika(id* & pHead, string id_nazwisko);
  51. void dodajBiegDoZawodnika(bieg* &pRoot, string nazwa_maratonu, int data, int czas);
  52. void wypiszBiegi(bieg *& pRoot, std::ostream & plik);
  53. void wypiszBiegiDoPliku(id * zawodnik);
  54. void usunListe(id* & pHead);
  55. void wypiszDateWFormacie(int data, std::ostream & plik);
  56. void wypiszCzasWFormacie(int czas, std::ostream & plik);
  57.  
  58. int main(int argc,char *argv[])
  59. {
  60. int ETYKIETAhelp = 1;
  61. id *Glowa=NULL;
  62.  
  63. ifstream input;
  64. for (int i = indexPierwszejNazwyPliku(argc, argv, ETYKIETAhelp); i < argc; i++) // nazwy plikow podane po etykiecie "-i"
  65. {
  66. if (i == ETYKIETAhelp) continue; // jesli po -i wystpilo -h pomoc zostanie wyswietlona, ale -h nie zostanie potraktowane jako nazwa pliku
  67.  
  68. input.open(argv[i]);
  69. if (input.good())
  70. {
  71. string nazwa_maratonu, datastr, linia, nazwisko;
  72. int data, czasNaMecie;
  73.  
  74. getline(input, nazwa_maratonu); // Pobierz pierwsza linie(nazwa maratonu)
  75. getline(input, datastr); // Pobierz druga linie(data)
  76. data = konwertujStringNaInt(datastr); // przekonwertuj date na int
  77.  
  78. while (getline(input, linia)) // Dla ka¿dego biegu wykonuj:
  79. {
  80. nazwisko = wyciagnijNazwisko(linia);
  81. czasNaMecie = wyciagnijCzasNaMecie(linia);
  82. dodajZawodnika(Glowa, nazwisko); // sprawdza czy zawodnik istnieje, jesli nie dodaje zawodnika na poczatku listy // KS: Gdyby ta funkcja zwracala adres, bylby od razu do nastepnej intrukcji.
  83. dodajBiegDoZawodnika(adressPamieciZawodnika(Glowa, nazwisko)->pBiegi,nazwa_maratonu,data,czasNaMecie);
  84. }
  85. input.close();
  86. }
  87. else
  88. cout << "Nie udalo sie otworzyc pliku: " << argv[i] << endl;
  89.  
  90. }
  91. wypiszBiegiDoPliku(Glowa);
  92.  
  93. return 0;
  94. }
  95.  
  96. void help()
  97. {
  98. cout << "Krotka pomoc" << endl;
  99. }
  100. int indexPierwszejNazwyPliku(int ile, char ** argumenty, int &h)
  101. {
  102. const string ETYKIETAINPUT("-i");
  103. const string ETYKIETAHELP("-h");
  104. const int FLAGAINPUT = 1;
  105. const int FLAGAOUTPUT = FLAGAINPUT << 1;
  106. const int POPRAWNYWYNIK = FLAGAINPUT;
  107. int wynik = 0;
  108. int miejsce=ile;
  109. for (int i = 1; i < ile; i++)
  110. {
  111. string arg(argumenty[i]);
  112. if (arg == ETYKIETAINPUT)
  113. {
  114. miejsce = i + 1;
  115. wynik |= FLAGAINPUT;
  116. }
  117. if (arg == ETYKIETAHELP)
  118. {
  119. h = i;
  120. help();
  121. }
  122. }
  123. return miejsce;
  124. }
  125. string wyciagnijNazwisko(string line) // Wyciagamy substringa od pierwszego do drugiego przecinka
  126. {
  127. int a, b;
  128. a = line.find(',');
  129. b = line.find(',', a + 1);
  130. string napis = line.substr(a + 1, b - a - 1);
  131. for (int i = 0; i < napis.length(); i++)
  132. if (napis[i] == ' ') napis.erase(i, 1);
  133. return napis;
  134. }
  135. int konwertujStringNaInt(string napis)
  136. {
  137. for (int i = 0; i < napis.length(); i++)
  138. if (!(napis[i] >= '0' && napis[i] <= '9'))
  139. napis.erase(i, 1);
  140. return atoi(napis.c_str());
  141. }
  142. int wyciagnijCzasNaMecie(string line) // Wyciagamy substringa od ostatniego przecinka do konca
  143. {
  144. int a;
  145. a = line.rfind(',');
  146. line = line.substr(a + 1);
  147. return konwertujStringNaInt(line);
  148. }
  149. id* adressPamieciZawodnika(id *pHead, string id_nazwisko)
  150. {
  151. if (pHead)
  152. {
  153. auto p = pHead;
  154. while (p) {
  155. if (p->nazwisko == id_nazwisko) return p;
  156. p = p->pNext;
  157. }
  158. }
  159. return NULL;
  160. }
  161. void dodajZawodnika(id* & pHead, string id_nazwisko)
  162. {
  163. if (!adressPamieciZawodnika(pHead, id_nazwisko))
  164. pHead = new id{ id_nazwisko, pHead, NULL };
  165. }
  166. void dodajBiegDoZawodnika(bieg* &pRoot, string nazwa_maratonu, int data, int czas)
  167. {
  168. if (!pRoot)
  169. pRoot = new bieg{ nazwa_maratonu, data, czas, NULL, NULL };
  170. else
  171. {
  172. if (data < pRoot->data)
  173. dodajBiegDoZawodnika(pRoot->pLewy, nazwa_maratonu, data, czas);
  174. else
  175. dodajBiegDoZawodnika(pRoot->pPrawy, nazwa_maratonu, data, czas);
  176. }
  177. }
  178. void wypiszBiegi(bieg *& pRoot, std::ostream & plik)
  179. {
  180. if (pRoot)
  181. {
  182. wypiszBiegi(pRoot->pLewy, plik);
  183. wypiszDateWFormacie(pRoot->data, plik);
  184. plik << "\t" << pRoot->miejsce << "\t";
  185. wypiszCzasWFormacie(pRoot->czas, plik);
  186. wypiszBiegi(pRoot->pPrawy, plik);
  187. }
  188. }
  189. void wypiszBiegiDoPliku(id * zawodnik)
  190. {
  191. auto p = zawodnik;
  192. while (p)
  193. {
  194. ofstream output;
  195. output.open("../data/" + p->nazwisko + ".txt");
  196. output << p->nazwisko << endl << endl;
  197. if (p->pBiegi)
  198. {
  199. wypiszBiegi(p->pBiegi->pLewy, output);
  200. wypiszDateWFormacie(p->pBiegi->data, output); // Korzen
  201. output << "\t" << p->pBiegi->miejsce << "\t";
  202. wypiszCzasWFormacie(p->pBiegi->czas, output);
  203. wypiszBiegi(p->pBiegi->pPrawy, output);
  204. }
  205. output.close();
  206. p = p->pNext;
  207. }
  208. }
  209. void wypiszDateWFormacie(int data, std::ostream & plik)
  210. {
  211. string a = to_string(data);
  212. plik << a.substr(0, 4) << "-" << a.substr(4, 2) << "-" << a.substr(6, 2);
  213. }
  214. void wypiszCzasWFormacie(int czas, std::ostream & plik)
  215. {
  216. string a = to_string(czas);
  217. if (a.length() == 5)
  218. a = '0' + a;
  219. plik << a.substr(0, 2) << ":" << a.substr(2, 2) << ":" << a.substr(4, 2) << endl;
  220. }
  221. void usunListe(id* & pHead)
  222. {
  223. while (pHead)
  224. {
  225. auto p = pHead;
  226. pHead = pHead->pNext;
  227. delete p;
  228. }
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement