Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.06 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.  
  95. workday_T *tmp = workday;
  96. while (tmp != NULL)
  97. {
  98. if (tmp->data >= data_pierwsza_data && tmp->data <= data_druga_data)
  99. {
  100. if (tmp->koniec.min < tmp->pocz.min)
  101. {
  102. godz = godz - 1;
  103. min = min + (tmp->koniec.min + 60 - tmp->pocz.min);
  104. }
  105. godz = godz + (tmp->koniec.hour - tmp->pocz.hour);
  106. }
  107. tmp = tmp->next;
  108. }
  109. godz=godz + (min / 60);
  110. return godz;
  111.  
  112.  
  113. }
  114.  
  115. int SUMA_H(workday_T *workday)
  116. {
  117. int godz = 0;
  118. int min = 0;
  119. workday_T *tmp = workday;
  120. while (tmp != NULL)
  121. {
  122. if (tmp->koniec.min < tmp->pocz.min)
  123. {
  124. godz = godz - 1;
  125. min = min + (tmp->koniec.min + 60 - tmp->pocz.min);
  126. }
  127. godz = godz + (tmp->koniec.hour - tmp->pocz.hour);
  128.  
  129. tmp = tmp->next;
  130. }
  131. godz = godz + (min / 60);
  132. return godz;
  133. }
  134.  
  135. workday_T* Odczyt_pliku_praca(char *plik_path)
  136. {
  137. FILE *plik;
  138. plik = fopen(plik_path, "r");
  139. if (plik == NULL)
  140. {
  141. printf("Blad otwarcia pliku!!!");
  142. exit(0);
  143. }
  144. char *linia;
  145. workday_T* workday = NULL;
  146. workday_T* tmp = NULL;
  147. do {
  148. if (tmp == NULL)
  149. {
  150. tmp = workday;
  151. }
  152. linia = Czytanie_pliku_linia(plik);
  153. if (linia != NULL)
  154. {
  155. if (workday == NULL)
  156. {
  157. workday = utworzenie_work(linia);
  158. }
  159. else
  160. {
  161. tmp->next = utworzenie_work(linia);
  162. tmp = tmp->next;
  163. }
  164. }
  165. } while (linia != NULL);
  166. fclose(plik);
  167. return workday;
  168. }
  169.  
  170. char *Czytanie_pliku_linia(FILE *plik)
  171. {
  172. char *linia = NULL;
  173. char line;
  174. int rozmiar = 0;
  175. while ((line = fgetc(plik)) != EOF)
  176. {
  177. if (line == '\n')
  178. {
  179. line = '\0';
  180. }
  181. rozmiar = rozmiar + 1;
  182. char *tmp = NULL;
  183. if (linia != NULL)
  184. {
  185. tmp = linia;
  186. }
  187. linia = malloc(sizeof(char) * rozmiar);
  188. if (tmp != NULL)
  189. {
  190. int i;
  191. for (i = 0; i < rozmiar; i++)
  192. {
  193. linia[i] = tmp[i];
  194. }
  195. free(tmp);
  196. }
  197. linia[rozmiar - 1] = line;
  198. if (line == '\0')
  199. {
  200. break;
  201. }
  202. }
  203. if (linia != NULL)
  204. {
  205. char *tmp = linia;
  206. linia = malloc(sizeof(char) + sizeof(char) * rozmiar);
  207. int i;
  208. for (i = 0; i < rozmiar; i++) {
  209. linia[i] = tmp[i];
  210. }
  211. linia[rozmiar] = '\0';
  212. free(tmp);
  213. }
  214. return linia;
  215. }
  216.  
  217. workday_T *utworzenie_work(char *linia)
  218. {
  219. workday_T *workday = malloc(sizeof(workday_T));
  220. workday->data = -1;
  221. workday->pocz.hour = 0;
  222. workday->pocz.min = 0;
  223. workday->koniec.hour = 0;
  224. workday->koniec.min = 0;
  225. workday->next = NULL;
  226. workday->przerwa = malloc(sizeof(Przerwa_T));
  227. workday->przerwa->start.hour = -1;
  228. workday->przerwa->start.min = 0;
  229. workday->przerwa->koniec.hour = 0;
  230. workday->przerwa->koniec.min = 0;
  231. char dni_tydzien[5];
  232. int i = 0;
  233. int j = 0;
  234. Odczyt_T a = DAY;
  235. int zwieksz = 0;
  236. char tmpCHAR[8];
  237. while (linia[i] != '\0')
  238. {
  239. if (a == DAY)
  240. {
  241. if (linia[i] == '\t' || linia[i] == ' ')
  242. {
  243. i = i + 1;
  244. continue;
  245. }
  246. tmpCHAR[j] = linia[i];
  247. if (linia[i + 1] == '\t' || linia[i + 1] == ' ' )
  248. {
  249. workday->data = 0;
  250. int Z;
  251. zwieksz = 1;
  252. for (Z = 0; Z < j + 1; Z++)
  253. {
  254. workday->data = workday->data + ((tmpCHAR[j - Z] - '0') * zwieksz);
  255. zwieksz = zwieksz * 10;
  256. }
  257. a = DAY_WEEK;
  258. i = i + 1;
  259. j = 0; continue;
  260. }
  261. i = i + 1;
  262. j = j + 1; continue;
  263. }
  264. if (a == DAY_WEEK)
  265. {
  266. if (linia[i] == '\t' || linia[i] == ' ')
  267. {
  268. i = i + 1; continue;
  269. }
  270. dni_tydzien[j] = linia[i];
  271. j = j + 1;
  272. if (j == 3)
  273. {
  274. int Z;
  275. dni_tydzien[j] = '\0';
  276. for (Z = 0; Z < j; Z++)
  277. {
  278. dni_tydzien[Z] = toupper(dni_tydzien[Z]);
  279. }
  280. for (Z = 0; Z < 7; Z++)
  281. {
  282. if (strcmp(dni_tydzien, dni_tygodnia[Z]) == 0)
  283. {
  284. workday->dzien = Z;
  285. }}
  286. a = PHASE1;
  287. i = i + 1;
  288. j = 0; continue;
  289. }
  290. i = i + 1; continue;
  291. }
  292. if (a == PHASE1 || a == PHASE2 || a == PHASE3 || a == PHASE4)
  293. {
  294. if (linia[i] == '\t' || linia[i] == ' ')
  295. {
  296. i = i + 1;
  297. continue;
  298. }
  299. tmpCHAR[j] = linia[i];
  300. if (linia[i] == '-' || linia[i] == ':')
  301. {
  302. tmpCHAR[j + 1] = '\0';
  303. if (a == PHASE1)
  304. {
  305. a = START_HOUR;
  306. } else if (a == PHASE2)
  307. {
  308. a = END_HOUR;
  309. } else if (a == PHASE3)
  310. {
  311. a = START_BREAK_HOUR;
  312. } else if (a == PHASE4)
  313. {
  314. a = END_BREAK_HOUR;
  315. }
  316. j = 0;
  317. i = i + 1;continue;
  318. }
  319. j = j + 1;
  320. i = i + 1; continue;
  321. }
  322. if (a == START_HOUR || a == END_HOUR || a == START_BREAK_HOUR || a == END_BREAK_HOUR)
  323. {
  324. if (linia[i] == '\t' || linia[i] == ' ')
  325. {
  326. i = i + 1; continue;
  327. }
  328.  
  329. tmpCHAR[j] = linia[i];
  330. if (linia[i + 1] == ':')
  331. {
  332. int Z;
  333. zwieksz = 1;
  334. if (a == START_BREAK_HOUR)
  335. {
  336. workday->przerwa->start.hour = 0;
  337. }
  338. for (Z = 0; Z < j + 1; Z++)
  339. {
  340. if (a == START_HOUR)
  341. {
  342. workday->pocz.hour = workday->pocz.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
  343. }
  344. else if (a == END_HOUR)
  345. {
  346. workday->koniec.hour = workday->koniec.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
  347. }
  348. else if (a == START_BREAK_HOUR)
  349. {
  350. workday->przerwa->start.hour = workday->przerwa->start.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
  351. }
  352. else if (a == END_BREAK_HOUR)
  353. {
  354. workday->przerwa->koniec.hour = workday->przerwa->koniec.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
  355. }
  356. zwieksz = zwieksz * 10;
  357. }
  358. if (a == START_HOUR)
  359. {
  360. a = START_MIN;
  361. }
  362. else if (a == END_HOUR)
  363. {
  364. a = END_MIN;
  365. }
  366. else if (a == START_BREAK_HOUR)
  367. {
  368. a = START_BREAK_MIN;
  369. }
  370. else if (a == END_BREAK_HOUR)
  371. {
  372. a = END_BREAK_MIN;
  373. }
  374. j = 0;
  375. i = i + 2;
  376. continue;
  377. }
  378. i = i + 1;
  379. j = j + 1;
  380. continue;
  381. }
  382. if (a == START_MIN || a == END_MIN || a == START_BREAK_MIN || a == END_BREAK_MIN)
  383. {
  384. if (linia[i] == '\t' || linia[i] == ' ')
  385. {
  386. i = i + 1;
  387. a = 5;
  388. continue;
  389. }
  390. tmpCHAR[j] = linia[i];
  391. if (linia[i + 1] == '\t' || linia[i + 1] == ' ' || linia[i + 1] == '\0' || linia[i + 1] == '-')
  392. {
  393. int Z;
  394. zwieksz = 1;
  395. for (Z = 0; Z < j + 1; Z++)
  396. {
  397. if (a == START_MIN)
  398. {
  399. workday->pocz.min = workday->pocz.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
  400. }
  401. else if (a == END_MIN)
  402. {
  403. workday->koniec.min = workday->koniec.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
  404. }
  405. else if (a == START_BREAK_MIN)
  406. {
  407. workday->przerwa->start.min = workday->przerwa->start.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
  408. }
  409. else if (a == END_BREAK_MIN)
  410. {
  411. workday->przerwa->koniec.min = workday->przerwa->koniec.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
  412. }
  413. zwieksz = zwieksz * 10;
  414. }
  415. if (a == START_MIN)
  416. {
  417. a = PHASE2;
  418. }
  419. else if (a == END_MIN)
  420. {
  421. a = PHASE3;
  422. }
  423. else if (a == START_BREAK_MIN)
  424. {
  425. a = PHASE4;
  426. }
  427. else if (a == END_BREAK_MIN){ break; }
  428. j = 0;
  429. i = i + 1; continue;
  430. }
  431. i = i + 1;
  432. j = j + 1; continue;
  433. }
  434. }
  435. if (workday->data == -1)
  436. {
  437. free(workday->przerwa);
  438. workday->przerwa = NULL;
  439. free(workday);
  440. workday = NULL;
  441. }
  442. if (workday != NULL && workday->przerwa->start.hour == -1)
  443. {
  444. free(workday->przerwa);
  445. workday->przerwa = NULL;
  446. }
  447. return workday;
  448. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement