SHARE
TWEET

Untitled

a guest May 21st, 2019 57 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top