Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- typedef enum weekday
- {
- PON, WTO, SRO, CZW, PIA, SOB, NIE
- } weekday_T;
- static const char *dni_tygodnia[] = {"PON", "WTO", "SRO", "CZW", "PIA", "SOB", "NIE"};
- typedef struct czas
- {
- int hour;
- int min;
- } CZAS_T;
- typedef struct przerwy
- {
- CZAS_T start;
- CZAS_T koniec;
- } Przerwa_T;
- typedef struct workday
- {
- int data;
- weekday_T dzien;
- CZAS_T pocz;
- CZAS_T koniec;
- Przerwa_T *przerwa;
- struct workday *next;
- } workday_T;
- typedef enum Odzczyt_zawartosci
- {
- DAY, DAY_WEEK, PHASE1, START_HOUR, START_MIN, PHASE2,
- END_HOUR, END_MIN, PHASE3, START_BREAK_HOUR, START_BREAK_MIN,
- PHASE4, END_BREAK_HOUR, END_BREAK_MIN
- } Odczyt_T;
- workday_T* Odczyt_pliku_praca(char *plik_path);
- char *Czytanie_pliku_linia(FILE *plik);
- workday_T *utworzenie_work(char *linia);
- void Wydruk_Konsola(workday_T *workday);
- int Zakres_godzin_LICZ(workday_T *workday, int data_pierwsza_data, int data_druga_data); //godziny w zakresie
- int SUMA_H(workday_T *workday); //Suma godiny
- int main()
- {
- char plik_do_wczytania[256];
- int pierwsza_data,druga_data;
- 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");
- printf("Wpisz nazwe pliku ktory ma zostac wczytany do programu(Nalezy podac pelna nazwe pliku wraz z rozszerzeniem):");
- gets(plik_do_wczytania); //NAZWA PLIKU TEKSTOWEGO
- workday_T* workday = Odczyt_pliku_praca(plik_do_wczytania);
- Wydruk_Konsola(workday);
- printf("\n Ponizej program obliczy ilosc przepracowanych przez pracownika godzin w zadanym zakresie\n");
- printf("Data-Poczatek: <od tej daty program zacznie zliczac godziny> ");
- scanf("%d",&pierwsza_data); //PIERWSZA DATA ZAKRESU
- printf("Data-Koniec: <na tej dacie program zakonczy zliczanie godzin> ");
- scanf("%d",&druga_data); //DATA NA KTOREJ KONCZYMY OBLICZAC
- 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));
- printf("Sumaryczny czas pracy wynosi: %dh\n\n",SUMA_H(workday)); // SUMARCZYCNY CZAS PRACY
- return 0;
- }
- void Wydruk_Konsola(workday_T *workday)
- {
- workday_T *tmp = workday;
- while (tmp != NULL)
- {
- printf("Data: %d", tmp->data);
- printf(" Dzien: %s", dni_tygodnia[tmp->dzien]);
- printf(" Godzina rozpoczecia pracy: %02d:%02d", tmp->pocz.hour, tmp->pocz.min);
- printf(" Godzina zakonczenia pracy: %02d:%02d", tmp->koniec.hour, tmp->koniec.min);
- if (tmp->przerwa != NULL)
- {
- printf(" \t Przerwa:");
- printf(" Poczatek: %02d:%02d", tmp->przerwa->start.hour, tmp->przerwa->start.min);
- printf(" Koniec: %02d:%02d", tmp->przerwa->koniec.hour, tmp->przerwa->koniec.min);
- }
- printf("\n");
- tmp = tmp->next;
- }}
- int Zakres_godzin_LICZ(workday_T *workday, int data_pierwsza_data, int data_druga_data)
- {
- int godz = 0;
- int min =0;
- workday_T *tmp = workday;
- while (tmp != NULL)
- {
- if (tmp->data >= data_pierwsza_data && tmp->data <= data_druga_data)
- {
- if (tmp->koniec.min < tmp->pocz.min)
- {
- godz = godz - 1;
- min = min + (tmp->koniec.min + 60 - tmp->pocz.min);
- }
- godz = godz + (tmp->koniec.hour - tmp->pocz.hour);
- }
- tmp = tmp->next;
- }
- godz=godz + (min / 60);
- return godz;
- }
- int SUMA_H(workday_T *workday)
- {
- int godz = 0;
- int min = 0;
- workday_T *tmp = workday;
- while (tmp != NULL)
- {
- if (tmp->koniec.min < tmp->pocz.min)
- {
- godz = godz - 1;
- min = min + (tmp->koniec.min + 60 - tmp->pocz.min);
- }
- godz = godz + (tmp->koniec.hour - tmp->pocz.hour);
- tmp = tmp->next;
- }
- godz = godz + (min / 60);
- return godz;
- }
- workday_T* Odczyt_pliku_praca(char *plik_path)
- {
- FILE *plik;
- plik = fopen(plik_path, "r");
- if (plik == NULL)
- {
- printf("Blad otwarcia pliku!!!");
- exit(0);
- }
- char *linia;
- workday_T* workday = NULL;
- workday_T* tmp = NULL;
- do {
- if (tmp == NULL)
- {
- tmp = workday;
- }
- linia = Czytanie_pliku_linia(plik);
- if (linia != NULL)
- {
- if (workday == NULL)
- {
- workday = utworzenie_work(linia);
- }
- else
- {
- tmp->next = utworzenie_work(linia);
- tmp = tmp->next;
- }
- }
- } while (linia != NULL);
- fclose(plik);
- return workday;
- }
- char *Czytanie_pliku_linia(FILE *plik)
- {
- char *linia = NULL;
- char line;
- int rozmiar = 0;
- while ((line = fgetc(plik)) != EOF)
- {
- if (line == '\n')
- {
- line = '\0';
- }
- rozmiar = rozmiar + 1;
- char *tmp = NULL;
- if (linia != NULL)
- {
- tmp = linia;
- }
- linia = malloc(sizeof(char) * rozmiar);
- if (tmp != NULL)
- {
- int i;
- for (i = 0; i < rozmiar; i++)
- {
- linia[i] = tmp[i];
- }
- free(tmp);
- }
- linia[rozmiar - 1] = line;
- if (line == '\0')
- {
- break;
- }
- }
- if (linia != NULL)
- {
- char *tmp = linia;
- linia = malloc(sizeof(char) + sizeof(char) * rozmiar);
- int i;
- for (i = 0; i < rozmiar; i++) {
- linia[i] = tmp[i];
- }
- linia[rozmiar] = '\0';
- free(tmp);
- }
- return linia;
- }
- workday_T *utworzenie_work(char *linia)
- {
- workday_T *workday = malloc(sizeof(workday_T));
- workday->data = -1;
- workday->pocz.hour = 0;
- workday->pocz.min = 0;
- workday->koniec.hour = 0;
- workday->koniec.min = 0;
- workday->next = NULL;
- workday->przerwa = malloc(sizeof(Przerwa_T));
- workday->przerwa->start.hour = -1;
- workday->przerwa->start.min = 0;
- workday->przerwa->koniec.hour = 0;
- workday->przerwa->koniec.min = 0;
- char dni_tydzien[5];
- int i = 0;
- int j = 0;
- Odczyt_T a = DAY;
- int zwieksz = 0;
- char tmpCHAR[8];
- while (linia[i] != '\0')
- {
- if (a == DAY)
- {
- if (linia[i] == '\t' || linia[i] == ' ')
- {
- i = i + 1;
- continue;
- }
- tmpCHAR[j] = linia[i];
- if (linia[i + 1] == '\t' || linia[i + 1] == ' ' )
- {
- workday->data = 0;
- int Z;
- zwieksz = 1;
- for (Z = 0; Z < j + 1; Z++)
- {
- workday->data = workday->data + ((tmpCHAR[j - Z] - '0') * zwieksz);
- zwieksz = zwieksz * 10;
- }
- a = DAY_WEEK;
- i = i + 1;
- j = 0; continue;
- }
- i = i + 1;
- j = j + 1; continue;
- }
- if (a == DAY_WEEK)
- {
- if (linia[i] == '\t' || linia[i] == ' ')
- {
- i = i + 1; continue;
- }
- dni_tydzien[j] = linia[i];
- j = j + 1;
- if (j == 3)
- {
- int Z;
- dni_tydzien[j] = '\0';
- for (Z = 0; Z < j; Z++)
- {
- dni_tydzien[Z] = toupper(dni_tydzien[Z]);
- }
- for (Z = 0; Z < 7; Z++)
- {
- if (strcmp(dni_tydzien, dni_tygodnia[Z]) == 0)
- {
- workday->dzien = Z;
- }}
- a = PHASE1;
- i = i + 1;
- j = 0; continue;
- }
- i = i + 1; continue;
- }
- if (a == PHASE1 || a == PHASE2 || a == PHASE3 || a == PHASE4)
- {
- if (linia[i] == '\t' || linia[i] == ' ')
- {
- i = i + 1;
- continue;
- }
- tmpCHAR[j] = linia[i];
- if (linia[i] == '-' || linia[i] == ':')
- {
- tmpCHAR[j + 1] = '\0';
- if (a == PHASE1)
- {
- a = START_HOUR;
- } else if (a == PHASE2)
- {
- a = END_HOUR;
- } else if (a == PHASE3)
- {
- a = START_BREAK_HOUR;
- } else if (a == PHASE4)
- {
- a = END_BREAK_HOUR;
- }
- j = 0;
- i = i + 1;continue;
- }
- j = j + 1;
- i = i + 1; continue;
- }
- if (a == START_HOUR || a == END_HOUR || a == START_BREAK_HOUR || a == END_BREAK_HOUR)
- {
- if (linia[i] == '\t' || linia[i] == ' ')
- {
- i = i + 1; continue;
- }
- tmpCHAR[j] = linia[i];
- if (linia[i + 1] == ':')
- {
- int Z;
- zwieksz = 1;
- if (a == START_BREAK_HOUR)
- {
- workday->przerwa->start.hour = 0;
- }
- for (Z = 0; Z < j + 1; Z++)
- {
- if (a == START_HOUR)
- {
- workday->pocz.hour = workday->pocz.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
- }
- else if (a == END_HOUR)
- {
- workday->koniec.hour = workday->koniec.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
- }
- else if (a == START_BREAK_HOUR)
- {
- workday->przerwa->start.hour = workday->przerwa->start.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
- }
- else if (a == END_BREAK_HOUR)
- {
- workday->przerwa->koniec.hour = workday->przerwa->koniec.hour + ((tmpCHAR[j - Z] - '0') * zwieksz);
- }
- zwieksz = zwieksz * 10;
- }
- if (a == START_HOUR)
- {
- a = START_MIN;
- }
- else if (a == END_HOUR)
- {
- a = END_MIN;
- }
- else if (a == START_BREAK_HOUR)
- {
- a = START_BREAK_MIN;
- }
- else if (a == END_BREAK_HOUR)
- {
- a = END_BREAK_MIN;
- }
- j = 0;
- i = i + 2;
- continue;
- }
- i = i + 1;
- j = j + 1;
- continue;
- }
- if (a == START_MIN || a == END_MIN || a == START_BREAK_MIN || a == END_BREAK_MIN)
- {
- if (linia[i] == '\t' || linia[i] == ' ')
- {
- i = i + 1;
- a = 5;
- continue;
- }
- tmpCHAR[j] = linia[i];
- if (linia[i + 1] == '\t' || linia[i + 1] == ' ' || linia[i + 1] == '\0' || linia[i + 1] == '-')
- {
- int Z;
- zwieksz = 1;
- for (Z = 0; Z < j + 1; Z++)
- {
- if (a == START_MIN)
- {
- workday->pocz.min = workday->pocz.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
- }
- else if (a == END_MIN)
- {
- workday->koniec.min = workday->koniec.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
- }
- else if (a == START_BREAK_MIN)
- {
- workday->przerwa->start.min = workday->przerwa->start.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
- }
- else if (a == END_BREAK_MIN)
- {
- workday->przerwa->koniec.min = workday->przerwa->koniec.min + ((tmpCHAR[j - Z] - '0') * zwieksz);
- }
- zwieksz = zwieksz * 10;
- }
- if (a == START_MIN)
- {
- a = PHASE2;
- }
- else if (a == END_MIN)
- {
- a = PHASE3;
- }
- else if (a == START_BREAK_MIN)
- {
- a = PHASE4;
- }
- else if (a == END_BREAK_MIN){ break; }
- j = 0;
- i = i + 1; continue;
- }
- i = i + 1;
- j = j + 1; continue;
- }
- }
- if (workday->data == -1)
- {
- free(workday->przerwa);
- workday->przerwa = NULL;
- free(workday);
- workday = NULL;
- }
- if (workday != NULL && workday->przerwa->start.hour == -1)
- {
- free(workday->przerwa);
- workday->przerwa = NULL;
- }
- return workday;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement