Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.67 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include <stdbool.h>
  7. #include <malloc.h>  
  8.  
  9.  
  10. void generator_przebiegu_funkcji(int wsp[], int dziedzina[], double tablica_wyn[], int wielkosc_tab_wyn);
  11. void generator_szumu(double tablica[], double tablica_zaszumiona[], int rozmiar);
  12. void drukuj_tablice(double tablica[], int rozmiar);
  13. double mediana(double t[], int n);
  14. void filtr_medianowy(double wej[], int rozmiar);
  15. double srednia(double t[], int rozm);
  16. void filtr_srednia(double wej[], int rozm);
  17. void parametry(int wsp[]);
  18. void dziedzina(double dziedz[]);
  19. int pobierz_ilosc_probek();
  20. void zapisz_sygnal(double tab[], int rozm);
  21. int wczytaj_sygnal(double **tabsygnalu);
  22. int menu();
  23. double pobierz_double();
  24. float pobierz_int();
  25. void pobierzDaneIGenerujFunkcje(int wielkosc_tab_wyn, double **tablica_wyn[], int **dziedz[], int **param[]);
  26.  
  27.  
  28.  
  29.  
  30. double pobierz_double()
  31. {
  32.     double tmp;
  33.     while (1)
  34.     {
  35.         while ('\n' != getchar());                              /* zwolnienie buforu (na poczatku funkcji bo zostawal newline po wprwadzeniu danych w buforze */
  36.         if (scanf("%lf", &tmp))                                 /* jesli scanf poprawnie pobral dane zwaraca "1", jesli nie "0" */
  37.         {
  38.  
  39.             return tmp;
  40.         }
  41.         else
  42.         {
  43.             printf("Bledny format danych, wprowadz ponownie \n");
  44.         }
  45.     }
  46.  
  47. }
  48.  
  49. float pobierz_int()
  50. {
  51.     float tmp;
  52.     int rzutowanie;
  53.     while (1)
  54.     {
  55.         while (getchar() != '\n');                              /* zwolnienie buforu */
  56.         if (scanf("%f", &tmp))                                  /* jesli scanf poprawnie pobral dane zwaraca "1", jesli nie "0" */
  57.         {
  58.  
  59.             rzutowanie = (int)tmp;                              /* W przypadku wprowadzenia liczby zmiennoprzecinkowej */
  60.  
  61.             printf("Zrzutowano do: %d\n", rzutowanie);
  62.             return rzutowanie;
  63.         }
  64.         else
  65.         {
  66.  
  67.             printf("Bledny format danych, wprowadz ponownie:  \n");
  68.         }
  69.     }
  70.  
  71. }
  72.  
  73.  
  74. void generator_przebiegu_funkcji(int wsp[], double dziedzina[], double tablica_wyn[], int wielkosc_tab_wyn)
  75. {
  76.     int roznica = dziedzina[1] - dziedzina[0];
  77.     double skok = ((double)roznica) / wielkosc_tab_wyn;         /* skok - podzielenie dziedziny wedlug zadanej ilosci probek */
  78.     printf("Probkowanie: %f\n", skok);
  79.  
  80.     double x = (double)dziedzina[0];
  81.  
  82.     printf("Generowana funkcja: f(x) = A * sqrt((cos(x))^A + B)\n\n");
  83.  
  84.     if ((pow(cos(x), wsp[0]) + wsp[1]) < 0)                     /* Sprawdzenie wartosci dodatniej pod pierwiastkiem */
  85.     {
  86.         printf("Dla podanych parametrów funkcja generuje wyniki poza dziedzina funkcji. Sprobuj ponownie.");
  87.         pobierzDaneIGenerujFunkcje(wielkosc_tab_wyn, tablica_wyn, dziedzina, wsp);
  88.     }
  89.     else                                                    /* W przypadku gdy parametr B jest ok */
  90.     {
  91.         //printf("%d \n", wielkosc_tab_wyn);
  92.         for (int i = 0; i <= wielkosc_tab_wyn - 1; i++)
  93.         {
  94.             //printf("%d", x);
  95.             if (x > dziedzina[1]) break;
  96.             double wyn = wsp[0] * sqrt(pow(cos(x), wsp[0]) + wsp[1]);
  97.             tablica_wyn[i] = wyn;
  98.             //printf("%d", x);
  99.             x += skok;
  100.         }
  101.     }
  102. }
  103.  
  104. void generator_szumu(double tablica[], double tablica_zaszumiona[], int rozmiar)
  105. {
  106.     for (int i = 0; i < rozmiar; i++)
  107.     {
  108.         tablica_zaszumiona[i] = tablica[i] + (rand() % 100)*1.0 / 1000;
  109.     }
  110. }
  111.  
  112. void drukuj_tablice(double tablica[], int rozmiar)
  113. {
  114.     printf("DRUKUJE TABLICE \n==========\n");
  115.     for (int i = 0; i < rozmiar; i++)
  116.     {
  117.         printf("[%d] %f \n", i, tablica[i]);
  118.     }
  119. }
  120.  
  121. double mediana(double t[], int n)
  122. {
  123.     double tmp;
  124.     for (int i = 0; i < n; i++)
  125.     {
  126.         for (int j = 0; j < n - 1; j++)
  127.         {
  128.             if (t[j] > t[j + 1])
  129.             {
  130.                 tmp = t[j];
  131.                 t[j] = t[j + 1];
  132.                 t[j + 1] = tmp;
  133.             }
  134.         }
  135.     }
  136.  
  137.     return t[2];
  138. }
  139.  
  140. void filtr_medianowy(double wej[], int rozmiar)
  141. {
  142.  
  143.     for (int i = 2; i < rozmiar - 2; i++)
  144.     {
  145.         double tab_med[5];
  146.         tab_med[0] = wej[i - 2];
  147.         tab_med[1] = wej[i - 1];
  148.         tab_med[2] = wej[i];
  149.         tab_med[3] = wej[i + 1];
  150.         tab_med[4] = wej[i + 2];
  151.         wej[i] = mediana(tab_med, 5);
  152.     }
  153. }
  154.  
  155.  
  156. double srednia(double t[], int rozm)
  157. {
  158.     double suma = 0;
  159.     for (int i = 0; i < rozm; i++)
  160.     {
  161.         suma += t[i];
  162.     }
  163.  
  164.     double reszta = suma / rozm;
  165.     return reszta;
  166. }
  167.  
  168. void filtr_srednia(double wej[], int rozm)
  169. {
  170.  
  171.     for (int i = 2; i < rozm - 2; i++)
  172.     {
  173.         double tab_sr[5];
  174.         tab_sr[0] = wej[i - 2];
  175.         tab_sr[1] = wej[i - 1];
  176.         tab_sr[2] = wej[i];
  177.         tab_sr[3] = wej[i + 1];
  178.         tab_sr[4] = wej[i + 2];
  179.         wej[i] = srednia(tab_sr, 5);
  180.     }
  181. }
  182.  
  183. void parametry(int wsp[])
  184. {
  185.     printf("Podaj wartosc parametru A:\n");
  186.     wsp[0] = pobierz_double();
  187.     printf("Podaj wartosc parametru B:\n");
  188.     wsp[1] = pobierz_double();
  189. }
  190.  
  191. void dziedzina(double dziedz[])
  192. {
  193.     printf("Podaj dolna granice dziedziny (x>):\n");
  194.     dziedz[0] = pobierz_double();
  195.     printf("Podaj gorna granice dziedziny (x<):\n");
  196.     dziedz[1] = pobierz_double();
  197.     if (dziedz[1] < dziedz[0])
  198.     {
  199.         printf("\nZle podana dziedzina.\n");
  200.         dziedzina(dziedz);
  201.     }
  202. }
  203.  
  204. int pobierz_ilosc_probek()
  205. {
  206.     printf("Podaj ilosc probek:\n");
  207.     int ilosc_probek = pobierz_int();
  208.     return ilosc_probek;
  209. }
  210.  
  211. void zapisz_sygnal(double tab[], int rozm)
  212. {
  213.     FILE *plik;
  214.     int i;
  215.     plik = fopen("dane.csv", "w");
  216.  
  217.     if (plik == NULL)
  218.     {
  219.         printf("Brak takiego Pliku!");
  220.     }
  221.     else
  222.     {
  223.         for (i = 0; i < rozm; i++)
  224.         {
  225.             fprintf(plik, "%f;\n", tab[i]);
  226.         }
  227.         fclose(plik);
  228.     }
  229. }
  230.  
  231. int wczytaj_sygnal(double **tabsygnalu)
  232. {
  233.     double *temp = NULL;
  234.     int rozmiartab = 0;
  235.     double tmp = 0;
  236.     FILE *file;
  237.     file = fopen("dane.csv", "r");
  238.     if (file != NULL)
  239.     {
  240.         while (fscanf(file, "%lf;\n", &tmp) == 1)
  241.         {
  242.             temp = (double*)realloc(*tabsygnalu, (rozmiartab + 1) * sizeof(double));
  243.  
  244.             if (temp != NULL)
  245.             {
  246.                 *tabsygnalu = temp;
  247.                 (*tabsygnalu)[rozmiartab] = tmp;
  248.                 rozmiartab++;
  249.             }
  250.             else
  251.             {
  252.                 printf("Błąd");
  253.                 free(*tabsygnalu);
  254.                 *tabsygnalu = NULL;
  255.                 return 0;
  256.             }
  257.         }
  258.     }
  259.     return rozmiartab;
  260. }
  261.  
  262. int menu()
  263. {
  264.     int wartosc;
  265.     printf("\tMENU\n");
  266.     printf("Jeśli chcesz stworzyc sygnal: 1\n");
  267.     printf("Jeśli chcesz wczytac sygnal wybierz: 2\n");
  268.     printf("Jeśli chcesz zaszumic sygnal wybierz: 3\n");
  269.     printf("Jeśli chcesz filtrowac mediana sygnal wybierz: 4\n");
  270.     printf("Jeśli chcesz filtrowac srednia wybierz: 5\n");
  271.     printf("Jesli chcesz zapisac sygnal wybierz: 6 \n");
  272.     printf("Jesli chcesz wyswietlic sygnal wybierz: 7 \n\n");
  273.     scanf("%d", &wartosc);
  274.     return wartosc;
  275. }
  276.  
  277. void pobierzDaneIGenerujFunkcje(int wielkosc_tab_wyn, double **tablica_wyn[], int **dziedz[], int **param[])
  278. {
  279.     wielkosc_tab_wyn = pobierz_ilosc_probek();
  280.     tablica_wyn= (double*)malloc(wielkosc_tab_wyn * sizeof(double));
  281.     parametry(param);
  282.     dziedzina(dziedz);
  283.     printf("%d", dziedz[1]);
  284.     generator_przebiegu_funkcji(param, dziedz, tablica_wyn, wielkosc_tab_wyn);
  285.     drukuj_tablice(tablica_wyn, wielkosc_tab_wyn);
  286. }
  287.  
  288.  
  289. int main()
  290. {
  291.  
  292.     int wielkosc_tab_wyn = 0;
  293.     double* tablica_wyn = (double*)malloc(wielkosc_tab_wyn * sizeof(double));
  294.     double* tablica_zaszumiona = (double*)malloc(wielkosc_tab_wyn * sizeof(double));
  295.     double dziedz[2];
  296.     int param[2];
  297.     srand(time(NULL));
  298.  
  299.     bool CzyTablicaWynStworzona = false;
  300.     bool CzyTablicaZaszumionaStworzona = false;
  301.  
  302.     do
  303.     {
  304.         int odp = menu();
  305.  
  306.         switch (odp)
  307.         {
  308.         case 1:
  309.             pobierzDaneIGenerujFunkcje(wielkosc_tab_wyn, tablica_wyn, dziedz, param);
  310.             CzyTablicaWynStworzona = true;
  311.             break;
  312.         case 2:
  313.             wielkosc_tab_wyn = wczytaj_sygnal(&tablica_wyn);
  314.             CzyTablicaWynStworzona = true;
  315.             break;
  316.         case 3:
  317.             if (!CzyTablicaWynStworzona)
  318.                 printf("Tablica jest pusta.");
  319.             else
  320.             {
  321.                 tablica_zaszumiona = (double*)malloc(wielkosc_tab_wyn * sizeof(double));
  322.                 generator_szumu(tablica_wyn, tablica_zaszumiona, wielkosc_tab_wyn);
  323.                 drukuj_tablice(tablica_zaszumiona, wielkosc_tab_wyn);
  324.                 CzyTablicaZaszumionaStworzona = true;
  325.             }
  326.             break;
  327.         case 4:
  328.             if (!CzyTablicaZaszumionaStworzona)
  329.                 printf("Tablica jest pusta.");
  330.             else
  331.             {
  332.                 filtr_medianowy(tablica_zaszumiona, wielkosc_tab_wyn);
  333.                 drukuj_tablice(tablica_zaszumiona, wielkosc_tab_wyn);
  334.             }
  335.             break;
  336.         case 5:
  337.             if (!CzyTablicaZaszumionaStworzona)
  338.                 printf("Tablica jest pusta.");
  339.             else
  340.             {
  341.                 filtr_srednia(tablica_zaszumiona, wielkosc_tab_wyn);
  342.                 drukuj_tablice(tablica_zaszumiona, wielkosc_tab_wyn);
  343.             }
  344.             break;
  345.         case 6:
  346.             printf("Sygnal oryginalny: 1 \n");
  347.             printf("Sygnal zaszumiony: 2 \n");
  348.             int ans = 0;
  349.             scanf("%d", &ans);
  350.             if (ans == 1)
  351.             {
  352.                 zapisz_sygnal(tablica_wyn, wielkosc_tab_wyn);
  353.             }
  354.             else {
  355.                 zapisz_sygnal(tablica_zaszumiona, wielkosc_tab_wyn);
  356.             }
  357.             break;
  358.         case 7:
  359.             printf("Sygnal oryginalny: 1 \n");
  360.             printf("Sygnal zaszumiony: 2 \n");
  361.             int ans2 = 0;
  362.             scanf("%d", &ans);
  363.             if (ans2 == 1)
  364.             {
  365.                 drukuj_tablice(tablica_wyn, wielkosc_tab_wyn);
  366.             }
  367.             else {
  368.                 drukuj_tablice(tablica_zaszumiona, wielkosc_tab_wyn);
  369.             }
  370.             break;
  371.         default:
  372.             printf("Zla opcja.\n");
  373.             break;
  374.         }
  375.     } while (1 < 3);
  376.  
  377.     system("pause");
  378. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement