Advertisement
Gormit

laboratoria6

Mar 26th, 2020
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. #define DL_SLOWA 20
  5. #define LICZBA_CZUJNIKOW 4
  6. #define ERROR_ALOKACJA printf("error - blad podczas alokacji\n");
  7. #define ERROR_PLIK_OTWARCIE printf("error - nie udalo sie otworzyc podanego pliku\n");
  8. #define ERROR_PLIK_PUSTY printf("error - plik z danymi jest pusty\n");
  9. #define ERROR_SLOWO_WCZYTYWANIE printf("error - blad podczas wczytywania slowa, prosze sprobuj ponownie: ");
  10.  
  11. struct pomiar {
  12.     unsigned int nrPomiaru;
  13.     unsigned int nrCzujnika;
  14.     char data[DL_SLOWA];
  15.     double temp;
  16.     struct pomiar* nastepny;
  17. };
  18.  
  19. struct listyCzujnikow {
  20.     struct pomiar** czujniki;
  21. };
  22.  
  23. void Info() {
  24.     printf("autor: \tMateusz Wloczewski\n");
  25.     printf("data: \t24 mar 2020\n");
  26.     printf("about: \tRozwiazanie wejsciowki na laboratoria nr. 6\n");
  27.     printf("\tProgram wczytan dane czujnikow temperatury z pliku: dane.txt do listy jednokierunkowej.\n");
  28.     printf("\tNastepnie zamknie plik i podzieli liste (poprzez przenoszenie elementow) na mniejsze listy\n");
  29.     printf("\tktore zawiera odczyty odpowiednio z kolejnych czujnikow. Na koniec wypisze liczbe\n");
  30.     printf("\tpomiarow z kazdego z nich, poprosi o nawe pliku wyjsciowego i utworzy dla kazdego czujnika plik\n");
  31.     printf("\t(dodajac indeks to podanej nazwy) zapisujac do niego dane z konkretnego urzadzenia pomiarowego.\n\n");
  32. }
  33.  
  34. /*
  35. @ brief Funkcja do czyszczenia bufora
  36. */
  37. void CzyszczenieBufora() {
  38.     while (getchar() != '\n') {}
  39. }
  40.  
  41. /*
  42. @ brief Funkcja do wczytania slowa
  43. @ param *info - komunikat dla uzytkownika
  44. @ param *slowo - tablica na przechowanie wczytanego slowa
  45. */
  46. void WczytajSlowo(const char* info, char* slowo) {
  47.     printf("%s: ", info);
  48.     while (scanf_s("%s", slowo, DL_SLOWA) != 1 || getchar() != '\n') {
  49.         CzyszczenieBufora();
  50.         ERROR_SLOWO_WCZYTYWANIE
  51.     }
  52. }
  53.  
  54. /*
  55. @ brief Funkcja do dodania elementu do listy jednokierunkowej
  56. @ param *in - wskaznik do konkretnego miejsca w plku, ktory zawiera linie obecnie wczytywana do listy
  57. @ ret   *nowy - wskaznik do nowo zaalokowanego elementu listy
  58. */
  59. struct pomiar* DodajElementListy(FILE* in) {
  60.     struct pomiar* nowy = (struct pomiar*)malloc(sizeof(struct pomiar));
  61.     if (nowy != NULL) {
  62.         nowy->nastepny = NULL;
  63.  
  64.         unsigned int nrPomiaru;
  65.         unsigned int nrCzujnika;
  66.         char data[DL_SLOWA] = {'\0'};
  67.         double temp;
  68.  
  69.         fscanf_s(in, "%d", &nrPomiaru);
  70.         if (feof(in)) { // napotkana linia to koniec pliku
  71.             return NULL;
  72.         }
  73.  
  74.         fscanf_s(in, "%d", &nrCzujnika);
  75.         fscanf_s(in, "%s", data, DL_SLOWA);
  76.         fscanf_s(in, "%lf", &temp);
  77.  
  78.         nowy->nrPomiaru = nrPomiaru;
  79.         nowy->nrCzujnika = nrCzujnika;
  80.         nowy->temp = temp;
  81.         strcpy_s(nowy->data, DL_SLOWA, data);
  82.  
  83.         return nowy;
  84.     }
  85.     else {
  86.         ERROR_ALOKACJA
  87.         exit(0);
  88.     }
  89. }
  90.  
  91. /*
  92. @ brief Funkcja do wczytywania pliku do listy
  93. @ param *in - wskaznik do poczatku otwartego wczesniej pliku z danymi wejsciowymi
  94. @ ret   *glowa - wskaznik do pierwszego elementu listy
  95. */
  96. struct pomiar* WczytajPlikDoListy(FILE* in) {
  97.     struct pomiar* glowa = NULL;
  98.     struct pomiar* ogon = NULL;
  99.     while (!feof(in)) {
  100.         if (glowa == NULL) {
  101.             glowa = DodajElementListy(in);
  102.             if (glowa != NULL) {
  103.                 ogon = glowa;
  104.             }
  105.             else { // jezeli funkcja chce dodac jako pierwszy element null to plik jest pusty
  106.                 ERROR_PLIK_PUSTY
  107.                 return NULL;
  108.             }
  109.         }
  110.         else {
  111.             ogon->nastepny = DodajElementListy(in);
  112.             if (ogon->nastepny != NULL) {
  113.                 ogon = ogon->nastepny;
  114.             }
  115.         }
  116.     }
  117.     return glowa;
  118. }
  119.  
  120. /*
  121. @ brief Funkcja do dealokacji listy
  122. @ param *glowa - wskaznik do poczatku listys
  123. */
  124. void DealokujListe(struct pomiar* glowa) {
  125.     struct pomiar* ogon = NULL;
  126.     while (glowa) {
  127.         ogon = glowa->nastepny;
  128.         free(glowa);
  129.         glowa = ogon;
  130.     }
  131. }
  132.  
  133. /*
  134. @ brief Funkcja do podzialu listy jednokierunkowej na LICZBA_CZUJNIKOW list jednokierunkowych
  135. @ param *lista - wskaznik do glowy listy, ktora dzielimy
  136. @ param *pomiaryCzujnikow - tablica, ktora przechowa liczbe pomiarow z kadego czujnika
  137. @ ret   struct listyCzujnikow - strukturalny typ danych ktory zawiera wskaznik do dynamicznej tablicy,
  138.         przechowujacej glowy list, czyli wskazniki do pierwszych
  139.         elementow kazdej z utoroznych list
  140. */
  141. struct listyCzujnikow UzupelnijCzujniki(struct pomiar** lista, int* pomiaryCzujnikow) {
  142.     struct pomiar** czujniki = (struct pomiar**)calloc(sizeof(struct pomiar*), LICZBA_CZUJNIKOW);
  143.     struct pomiar** dane = (struct pomiar**)calloc(sizeof(struct pomiar*), LICZBA_CZUJNIKOW);
  144.     if (czujniki != NULL && dane != NULL) {
  145.         while (*lista) {
  146.             struct pomiar* tmp = (*lista)->nastepny;
  147.  
  148.             int numer = (*lista)->nrCzujnika - 1;
  149.             if (czujniki[numer] == NULL) {
  150.                 czujniki[numer] = (*lista);
  151.                 dane[numer] = czujniki[numer];
  152.             }
  153.             else {
  154.                 dane[numer]->nastepny = (*lista);
  155.                 dane[numer] = dane[numer]->nastepny;
  156.             }
  157.             pomiaryCzujnikow[numer] += 1;
  158.             (*lista)->nastepny = NULL;
  159.             (*lista) = tmp;
  160.         }
  161.         free(dane);
  162.         (*lista) = NULL;
  163.         return listyCzujnikow{ czujniki };
  164.     }
  165.     else {
  166.         ERROR_ALOKACJA
  167.         exit(0);
  168.     }
  169. }
  170.  
  171. /*
  172. @ brief Funkcja do zapisania listy do pliku
  173. @ param *out - wskaznik do poczatku pliku otwartego w trybie w+ (utworz lub zastap plik nowym - do zapisu)
  174. @ param *lista - wskaznik do poczatku zapisywanej listy
  175. */
  176. void ZapiszListeDoPliku(FILE* out, struct pomiar* lista) {
  177.     while (lista) {
  178.         fprintf(out, "%d %d %s %lf\n", lista->nrPomiaru, lista->nrCzujnika, lista->data, lista->temp);
  179.         lista = lista->nastepny;
  180.     }
  181. }
  182.  
  183. /*
  184. @ brief Funkcja do dealokowania list zawierajacych dane z kolejnych czujnikow
  185. @ param **czujniki - tablica wskaznikow do kazdej z list
  186. */
  187. void DealokujCzujniki(struct pomiar** czujniki) {
  188.     for (int i = 0; i < LICZBA_CZUJNIKOW; i++) {
  189.         DealokujListe(czujniki[i]);
  190.     }
  191.     free(czujniki);
  192. }
  193.  
  194. struct pomiar* OtworzPlik(const char* nazwa) {
  195.     FILE* in;
  196.     if (fopen_s(&in, "test.txt", "r") == 0 && in != NULL) {
  197.         struct pomiar* lista = WczytajPlikDoListy(in);
  198.         fclose(in);
  199.         return lista;
  200.     }
  201. }
  202.  
  203. void PoliczRekordy(struct pomiar* lista) {
  204.     int liczbaRekordow = 0;
  205.     struct pomiar* ostatni = lista, *pierwszy = lista;
  206.     while (lista) {
  207.         if (liczbaRekordow == 0) {
  208.             pierwszy = lista;
  209.         }
  210.         else {
  211.             ostatni = lista;
  212.         }
  213.         liczbaRekordow++;
  214.  
  215.         lista = lista->nastepny;
  216.     }
  217.     if (liczbaRekordow != 0) {
  218.         printf("liczba rekordow: %d\n", liczbaRekordow);
  219.         printf("pierwszy rekord: %d %d %s %lf\n", pierwszy->nrPomiaru, pierwszy->nrCzujnika, pierwszy->data, pierwszy->temp);
  220.         printf("ostatni rekord: %d %d %s %lf\n", ostatni->nrPomiaru, ostatni->nrCzujnika, ostatni->data, ostatni->temp);
  221.     }
  222. }
  223.  
  224. struct pomiar* ZnajdzNajmniejszy(struct pomiar* lista) {
  225.     if (lista == NULL) return NULL; // lista pusta
  226.     else if (lista->nastepny == NULL) return lista; // lista jednoelementowa
  227.     struct pomiar* tmp = lista;
  228.     struct pomiar* wskNajmniejszy = NULL;
  229.     struct pomiar* wskPoprzedzajacy = NULL;
  230.     double najmniejszy = tmp->temp;
  231.     int czyZnaleziono = 0;
  232.     while (tmp) {
  233.         if (tmp->nastepny != NULL && tmp->nastepny->temp < najmniejszy) {
  234.             wskNajmniejszy = tmp->nastepny;
  235.             wskPoprzedzajacy = tmp;
  236.             najmniejszy = tmp->nastepny->temp;
  237.             czyZnaleziono = 1;
  238.         }
  239.         else if (tmp->nastepny == NULL) { // dotarlismy do ostatniego elementu
  240.             if (czyZnaleziono && wskNajmniejszy->nastepny == NULL) {
  241.                 return lista;
  242.             }
  243.             else if (czyZnaleziono) {
  244.                 wskPoprzedzajacy->nastepny = wskNajmniejszy->nastepny;
  245.                 tmp->nastepny = wskNajmniejszy;
  246.                 wskNajmniejszy->nastepny = NULL;
  247.                 return lista;
  248.             }
  249.             else {
  250.                 struct pomiar* zwrot = lista->nastepny;
  251.                 tmp->nastepny = lista;
  252.                 lista->nastepny = NULL;
  253.                 return zwrot;
  254.             }
  255.         }
  256.        
  257.         tmp = tmp->nastepny;
  258.     }
  259. }
  260.  
  261. void WypiszListe(struct pomiar* lista) {
  262.     while (lista) {
  263.         printf("%d %d %s %lf\n", lista->nrPomiaru, lista->nrCzujnika, lista->data, lista->temp);
  264.         lista = lista->nastepny;
  265.     }
  266. }
  267.  
  268. int main() {
  269.     Info();
  270.     FILE* in;
  271.     FILE* out;
  272.     char nazwain[DL_SLOWA];
  273.     char nazwaout[DL_SLOWA];
  274.  
  275.     int* pomiaryCzujnikow = (int*)calloc(sizeof(int), LICZBA_CZUJNIKOW);
  276.     if (pomiaryCzujnikow == NULL) {
  277.         ERROR_ALOKACJA
  278.         exit(0);
  279.     }
  280.    
  281.     // wczytywanie pliku do listy dynamicznej
  282.     WczytajSlowo("podaj nazwe pliku wejsciowego", nazwain);
  283.     struct pomiar* lista = OtworzPlik(nazwain);
  284.     struct listyCzujnikow lc;
  285.  
  286.     printf("WSZYSTKIE POMIARY: \n");
  287.     PoliczRekordy(lista);
  288.     printf("\n");
  289.  
  290.     lc = UzupelnijCzujniki(&lista, pomiaryCzujnikow);
  291.     for (int i = 0; i < LICZBA_CZUJNIKOW; i++) {
  292.         printf("CZUJNIK NR. %d\n", i + 1);
  293.         PoliczRekordy(lc.czujniki[i]);
  294.         printf("\n");
  295.         lc.czujniki[i] = ZnajdzNajmniejszy(lc.czujniki[i]);
  296.         PoliczRekordy(lc.czujniki[i]);
  297.         printf("\n\n");
  298.     }
  299.  
  300.     /*
  301.     // zapisywanie pliku
  302.     WczytajSlowo("podaj nazwe pliku wyjsciowego [do nazwy zostanie automatycznie dodany numer czujnika]", nazwaout);
  303.     for (int i = 0; i < LICZBA_CZUJNIKOW; i++) {
  304.         char tmp[DL_SLOWA + 1] = { '\0' };
  305.         char ind[DL_SLOWA] = { '1' + i, '.', 't', 'x', 't', '\0' };
  306.         strcpy_s(tmp, DL_SLOWA + 1, nazwaout);
  307.         strcat_s(tmp, DL_SLOWA + 1, ind);
  308.  
  309.         if (fopen_s(&out, tmp, "w+") == 0 && out != NULL) {
  310.             ZapiszListeDoPliku(out, lc.czujniki[i]);
  311.             fclose(out);
  312.         }
  313.         else {
  314.             ERROR_PLIK_OTWARCIE
  315.         }
  316.     }
  317.     */
  318.     free(pomiaryCzujnikow);
  319.     DealokujListe(lista);
  320.     DealokujCzujniki(lc.czujniki);
  321.  
  322.     return 0;
  323. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement