Advertisement
Guest User

Untitled

a guest
May 21st, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.05 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. typedef enum weekday
  7. {
  8. PON, WTO, SRO, CZW, PIA, SOB, NIE
  9. } weekday_T;
  10. static const char *dni_tygodnia[] = {"PON", "WTO", "SRO", "CZW", "PIA", "SOB", "NIE"};
  11. typedef struct czas
  12. {
  13. int hour;
  14. int min;
  15. } CZAS_T;
  16.  
  17. typedef struct przerwy
  18. {
  19. CZAS_T start;
  20. CZAS_T koniec;
  21. } Przerwa_T;
  22.  
  23. typedef struct workday
  24. {
  25. int data;
  26. weekday_T dzien;
  27. CZAS_T pocz;
  28. CZAS_T koniec;
  29. Przerwa_T *przerwa;
  30. struct workday *next;
  31. } workday_T;
  32.  
  33.  
  34. typedef enum Odzczyt_zawartosci
  35. {
  36. DAY, DAY_WEEK, PHASE1, START_HOUR, START_MIN, PHASE2,
  37. END_HOUR, END_MIN, PHASE3, START_BREAK_HOUR, START_BREAK_MIN,
  38. PHASE4, END_BREAK_HOUR, END_BREAK_MIN
  39.  
  40. } Odczyt_T;
  41.  
  42. workday_T* Odczyt_pliku_praca(char *plik_path);
  43. char *Czytanie_pliku_linia(FILE *plik);
  44. workday_T *utworzenie_work(char *linia);
  45. void Wydruk_Konsola(workday_T *workday);
  46. int Zakres_godzin_LICZ(workday_T *workday, int data_pierwsza_data, int data_druga_data); //godziny w zakresie
  47. int SUMA_H(workday_T *workday); //Suma godiny
  48.  
  49. int main()
  50. {
  51. char plik_do_wczytania[256];
  52. int pierwsza_data,druga_data;
  53. printf("Program wczytuje dane z pliku tesktowego zawierajace przebieg pracy pracownika, pozwala obliczyc sumaryczny czas pracy oraz liczbe godzin przepracowana w danym zakresie\n\n");
  54. printf("Wpisz nazwe pliku ktory ma zostac wczytany do programu(Nalezy podac pelna nazwe pliku wraz z rozszerzeniem):");
  55. gets(plik_do_wczytania); //NAZWA PLIKU TEKSTOWEGO
  56. workday_T* workday = Odczyt_pliku_praca(plik_do_wczytania);
  57. Wydruk_Konsola(workday);
  58. printf("\n Ponizej program obliczy ilosc przepracowanych przez pracownika godzin w zadanym zakresie\n");
  59.  
  60. printf("Data-Poczatek: <od tej daty program zacznie zliczac godziny> ");
  61. scanf("%d",&pierwsza_data); //PIERWSZA DATA ZAKRESU
  62. printf("Data-Koniec: <na tej dacie program zakonczy zliczanie godzin> ");
  63. scanf("%d",&druga_data); //DATA NA KTOREJ KONCZYMY OBLICZAC
  64. printf("W okresie od %d do %d liczba przepracowanych godzin wynosi %dh\n", pierwsza_data,druga_data, Zakres_godzin_LICZ(workday, pierwsza_data, druga_data));
  65. printf("Sumaryczny czas pracy wynosi: %dh\n\n",SUMA_H(workday)); // SUMARCZYCNY CZAS PRACY
  66. return 0;
  67. }
  68.  
  69.  
  70.  
  71. void Wydruk_Konsola(workday_T *workday)
  72. {
  73. workday_T *tmp = workday;
  74. while (tmp != NULL)
  75. {
  76. printf("Data: %d", tmp->data);
  77. printf(" Dzien: %s", dni_tygodnia[tmp->dzien]);
  78. printf(" Godzina rozpoczecia pracy: %02d:%02d", tmp->pocz.hour, tmp->pocz.min);
  79. printf(" Godzina zakonczenia pracy: %02d:%02d", tmp->koniec.hour, tmp->koniec.min);
  80. if (tmp->przerwa != NULL)
  81. {
  82. printf(" \t Przerwa:");
  83. printf(" Poczatek: %02d:%02d", tmp->przerwa->start.hour, tmp->przerwa->start.min);
  84. printf(" Koniec: %02d:%02d", tmp->przerwa->koniec.hour, tmp->przerwa->koniec.min);
  85. }
  86. printf("\n");
  87. tmp = tmp->next;
  88. }}
  89.  
  90. int Zakres_godzin_LICZ(workday_T *workday, int data_pierwsza_data, int data_druga_data)
  91. {
  92. int godz = 0;
  93. int min =0;
  94. workday_T *tmp = workday;
  95. while (tmp != NULL)
  96. {
  97. if (tmp->data >= data_pierwsza_data && tmp->data <= data_druga_data)
  98. {
  99. if (tmp->koniec.min < tmp->pocz.min)
  100. {
  101. godz = godz - 1;
  102. min = min + (tmp->koniec.min + 60 - tmp->pocz.min);
  103. }
  104. godz = godz + (tmp->koniec.hour - tmp->pocz.hour);
  105. }
  106. tmp = tmp->next;
  107. }
  108. godz=godz + (min / 60);
  109. return godz;
  110. }
  111.  
  112. int SUMA_H(workday_T *workday)
  113. {
  114. int godz = 0;
  115. int min = 0;
  116. workday_T *tmp = workday;
  117. while (tmp != NULL)
  118. {
  119. if (tmp->koniec.min < tmp->pocz.min)
  120. {
  121. godz = godz - 1;
  122. min = min + (tmp->koniec.min + 60 - tmp->pocz.min);
  123. }
  124. godz = godz + (tmp->koniec.hour - tmp->pocz.hour);
  125.  
  126. tmp = tmp->next;
  127. }
  128. godz = godz + (min / 60);
  129. return godz;
  130. }
  131.  
  132. workday_T* Odczyt_pliku_praca(char *plik_path)
  133. {
  134. FILE *plik;
  135. plik = fopen(plik_path, "r");
  136. if (plik == NULL)
  137. {
  138. printf("Blad otwarcia pliku!!!");
  139. exit(0);
  140. }
  141. char *linia;
  142. workday_T* workday = NULL;
  143. workday_T* tmp = NULL;
  144. do {
  145. if (tmp == NULL)
  146. {
  147. tmp = workday;
  148. }
  149. linia = Czytanie_pliku_linia(plik);
  150. if (linia != NULL)
  151. {
  152. if (workday == NULL)
  153. {
  154. workday = utworzenie_work(linia);
  155. }
  156. else
  157. {
  158. tmp->next = utworzenie_work(linia);
  159. tmp = tmp->next;
  160. }
  161. }
  162. } while (linia != NULL);
  163. fclose(plik);
  164. return workday;
  165. }
  166.  
  167. char *Czytanie_pliku_linia(FILE *plik)
  168. {
  169. char *linia = NULL;
  170. char line;
  171. int rozmiar = 0;
  172. while ((line = fgetc(plik)) != EOF)
  173. {
  174. if (line == '\n')
  175. {
  176. line = '\0';
  177. }
  178. rozmiar = rozmiar + 1;
  179. char *tmp = NULL;
  180. if (linia != NULL)
  181. {
  182. tmp = linia;
  183. }
  184. linia = malloc(sizeof(char) * rozmiar);
  185. if (tmp != NULL)
  186. {
  187. int i;
  188. for (i = 0; i < rozmiar; i++)
  189. {
  190. linia[i] = tmp[i];
  191. }
  192. free(tmp);
  193. }
  194. linia[rozmiar - 1] = line;
  195. if (line == '\0')
  196. {
  197. break;
  198. }
  199. }
  200. if (linia != NULL)
  201. {
  202. char *tmp = linia;
  203. linia = malloc(sizeof(char) + sizeof(char) * rozmiar);
  204. int i;
  205. for (i = 0; i < rozmiar; i++) {
  206. linia[i] = tmp[i];
  207. }
  208. linia[rozmiar] = '\0';
  209. free(tmp);
  210. }
  211. return linia;
  212. }
  213.  
  214. workday_T *utworzenie_work(char *linia)
  215. {
  216. workday_T *workday = malloc(sizeof(workday_T));
  217. workday->data = -1;
  218. workday->pocz.hour = 0;
  219. workday->pocz.min = 0;
  220. workday->koniec.hour = 0;
  221. workday->koniec.min = 0;
  222. workday->next = NULL;
  223. workday->przerwa = malloc(sizeof(Przerwa_T));
  224. workday->przerwa->start.hour = -1;
  225. workday->przerwa->start.min = 0;
  226. workday->przerwa->koniec.hour = 0;
  227. workday->przerwa->koniec.min = 0;
  228. char dni_tydzien[5];
  229. int i = 0;
  230. int j = 0;
  231. Odczyt_T a = DAY;
  232. int zwieksz = 0;
  233. char tmpCHAR[8];
  234. while (linia[i] != '\0')
  235. {
  236. if (a == DAY)
  237. {
  238. if (linia[i] == '\t' || linia[i] == ' ')
  239. {
  240. i = i + 1;
  241. continue;
  242. }
  243. tmpCHAR[j] = linia[i];
  244. if (linia[i + 1] == '\t' || linia[i + 1] == ' ' )
  245. {
  246. workday->data = 0;
  247. int Z;
  248. zwieksz = 1;
  249. for (Z = 0; Z < j + 1; Z++)
  250. {
  251. workday->data = workday->data + ((tmpCHAR[j - Z] - '0') * zwieksz);
  252. zwieksz = zwieksz * 10;
  253. }
  254. a = DAY_WEEK;
  255. i = i + 1;
  256. j = 0; continue;
  257. }
  258. i = i + 1;
  259. j = j + 1; continue;
  260. }
  261. if (a == DAY_WEEK)
  262. {
  263. if (linia[i] == '\t' || linia[i] == ' ')
  264. {
  265. i = i + 1; continue;
  266. }
  267. dni_tydzien[j] = linia[i];
  268. j = j + 1;
  269. if (j == 3)
  270. {
  271. int Z;
  272. dni_tydzien[j] = '\0';
  273. for (Z = 0; Z < j; Z++)
  274. {
  275. dni_tydzien[Z] = toupper(dni_tydzien[Z]);
  276. }
  277. for (Z = 0; Z < 7; Z++)
  278. {
  279. if (strcmp(dni_tydzien, dni_tygodnia[Z]) == 0)
  280. {
  281. workday->dzien = Z;
  282. }}
  283. a = PHASE1;
  284. i = i + 1;
  285. j = 0; continue;
  286. }
  287. i = i + 1; continue;
  288. }
  289. if (a == PHASE1 || a == PHASE2 || a == PHASE3 || a == PHASE4)
  290. {
  291. if (linia[i] == '\t' || linia[i] == ' ')
  292. {
  293. i = i + 1;
  294. continue;
  295. }
  296. tmpCHAR[j] = linia[i];
  297. if (linia[i] == '-' || linia[i] == ':')
  298. {
  299. tmpCHAR[j + 1] = '\0';
  300. if (a == PHASE1)
  301. {
  302. a = START_HOUR;
  303. } else if (a == PHASE2)
  304. {
  305. a = END_HOUR;
  306. } else if (a == PHASE3)
  307. {
  308. a = START_BREAK_HOUR;
  309. } else if (a == PHASE4)
  310. {
  311. a = END_BREAK_HOUR;
  312. }
  313. j = 0;
  314. i = i + 1;continue;
  315. }
  316. j = j + 1;
  317. i = i + 1; continue;
  318. }
  319. if (a == START_HOUR || a == END_HOUR || a == START_BREAK_HOUR || a == END_BREAK_HOUR)
  320. {
  321. if (linia[i] == '\t' || linia[i] == ' ')
  322. {
  323. i = i + 1; continue;
  324. }
  325.  
  326. tmpCHAR[j] = linia[i];
  327. if (linia[i + 1] == ':')
  328. {
  329. int Z;
  330. zwieksz = 1;
  331. if (a == START_BREAK_HOUR)
  332. {
  333. workday->przerwa->start.hour = 0;
  334. }
  335. for (Z = 0; Z < j + 1; Z++)
  336. {
  337. if (a == START_HOUR)
  338. {
  339. workday->pocz.hour = workday->pocz.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
  340. }
  341. else if (a == END_HOUR)
  342. {
  343. workday->koniec.hour = workday->koniec.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
  344. }
  345. else if (a == START_BREAK_HOUR)
  346. {
  347. workday->przerwa->start.hour = workday->przerwa->start.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
  348. }
  349. else if (a == END_BREAK_HOUR)
  350. {
  351. workday->przerwa->koniec.hour = workday->przerwa->koniec.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
  352. }
  353. zwieksz = zwieksz * 10;
  354. }
  355. if (a == START_HOUR)
  356. {
  357. a = START_MIN;
  358. }
  359. else if (a == END_HOUR)
  360. {
  361. a = END_MIN;
  362. }
  363. else if (a == START_BREAK_HOUR)
  364. {
  365. a = START_BREAK_MIN;
  366. }
  367. else if (a == END_BREAK_HOUR)
  368. {
  369. a = END_BREAK_MIN;
  370. }
  371. j = 0;
  372. i = i + 2;
  373. continue;
  374. }
  375. i = i + 1;
  376. j = j + 1;
  377. continue;
  378. }
  379. if (a == START_MIN || a == END_MIN || a == START_BREAK_MIN || a == END_BREAK_MIN)
  380. {
  381. if (linia[i] == '\t' || linia[i] == ' ')
  382. {
  383. i = i + 1;
  384. a = 5;
  385. continue;
  386. }
  387. tmpCHAR[j] = linia[i];
  388. if (linia[i + 1] == '\t' || linia[i + 1] == ' ' || linia[i + 1] == '\0' || linia[i + 1] == '-')
  389. {
  390. int Z;
  391. zwieksz = 1;
  392. for (Z = 0; Z < j + 1; Z++)
  393. {
  394. if (a == START_MIN)
  395. {
  396. workday->pocz.min = workday->pocz.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
  397. }
  398. else if (a == END_MIN)
  399. {
  400. workday->koniec.min = workday->koniec.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
  401. }
  402. else if (a == START_BREAK_MIN)
  403. {
  404. workday->przerwa->start.min = workday->przerwa->start.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
  405. }
  406. else if (a == END_BREAK_MIN)
  407. {
  408. workday->przerwa->koniec.min = workday->przerwa->koniec.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
  409. }
  410. zwieksz = zwieksz * 10;
  411. }
  412. if (a == START_MIN)
  413. {
  414. a = PHASE2;
  415. }
  416. else if (a == END_MIN)
  417. {
  418. a = PHASE3;
  419. }
  420. else if (a == START_BREAK_MIN)
  421. {
  422. a = PHASE4;
  423. }
  424. else if (a == END_BREAK_MIN){ break; }
  425. j = 0;
  426. i = i + 1; continue;
  427. }
  428. i = i + 1;
  429. j = j + 1; continue;
  430. }
  431. }
  432. if (workday->data == -1)
  433. {
  434. free(workday->przerwa);
  435. workday->przerwa = NULL;
  436. free(workday);
  437. workday = NULL;
  438. }
  439. if (workday != NULL && workday->przerwa->start.hour == -1)
  440. {
  441. free(workday->przerwa);
  442. workday->przerwa = NULL;
  443. }
  444. return workday;
  445. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement