Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.70 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define WIELKOSC 100
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <locale.h>
  6. #include <math.h>
  7. #include <time.h>
  8.  
  9.  
  10. void instrukcja()
  11. {
  12.     printf("Żartowałem, nie mam siły opisywać wszystkiego krok po kroku :D \n");
  13.     printf("Spróbuj czegoś innego");
  14.     printf("\n");
  15.  
  16. }
  17.  
  18. void wstepniak()
  19. {
  20.     printf("Program służy do pracy z funkcją postaci f(x)=sin(x-a) * cos(x-b) + c,\n");
  21.     printf("Dostępne opcje:\n");
  22.     printf("1. Określenie przedziału (zbioru argumentów) naszej funkcji.\n");
  23.     printf("2. Deklaracja parametrów - a,b,c dla naszej funkcji.\n");
  24.     printf("3. Generowanie naszej funkcji (musi być zdefiniowany przedział i parametry.\n");
  25.     printf("4. Dodanie szumu o wskazanej przez użytkownika amplitudzie.\n");
  26.     printf("5. Usrednienie (odszumienia) funkcji wskazanym promieniem. \n");
  27.     printf("6. Zapis naszej funkcji do pliku nazwa.csv. \n");
  28.     printf("7. Wczytanie funkcji z pliku nazwa.csv. \n");
  29.     printf("0. Instrukcja działania programu i poszczegolnych funkcji. \n");
  30.     printf("\n");
  31. }
  32.  
  33. void wstepniak_mini()
  34. {
  35.     printf("1.Dziedzina. \n");
  36.     printf("2.Parametry. \n");
  37.     printf("3.Generowanie. \n");
  38.     printf("4.Szum. \n");
  39.     printf("5.Odszumienie. \n");
  40.     printf("6.Zapis do pliku. \n");
  41.     printf("7.Wczytanie z pliku. \n");
  42.     printf("0.Instrukcja. \n");
  43.     printf("\n");
  44. }
  45.  
  46. float wczytajf()    //zabezpieczenie poprawnosci wprowadzania wlasciwego formatu zmiennych
  47. {
  48.     float ret;
  49.     char buf[100];      //tworzy bufor znaków
  50.        
  51.     for(;;)        
  52.     {
  53.         scanf("%100s",buf);
  54.         if(sscanf(buf,"%f",&ret)==1) return ret;        //warunek sprawdzenia tego czy ten znak jest liczbą
  55.         printf("Błędny format. Wprowadź jeszcze raz! \n");
  56.         printf("\n");
  57.     }
  58. }
  59.  
  60. int wczytaj_menu()
  61. {
  62.     int ret;
  63.     char buf[100];
  64.  
  65.     for(;;)
  66.     {
  67.         scanf("%100s",buf);
  68.         if((sscanf(buf,"%d",&ret)==1)&&(ret>=0)&&(ret<=7)) return ret;      //warunek sprawdzenia tego czy ten znak jest liczbą całk z zakr 0-7
  69.         printf("Wprowadź liczby z zakresu 0-7, nie kombinuj! Obserwuję Cię! \n");
  70.         printf("\n");
  71.     }
  72. }
  73.  
  74. int wczytaj_promien()
  75. {
  76.     int ret;
  77.     char buf[100];
  78.  
  79.     for(;;)
  80.     {
  81.         scanf("%100s",buf);
  82.         if((sscanf(buf,"%d",&ret)==1)&&(ret>=1)) return ret;        //warunek sprawdzenia tego czy ten znak jest liczbą całk, dodatnią
  83.         printf("Promień musi być liczbą dodatnią, całkowitą, nie kombinuj!\n Obserwuję Cię! \n");
  84.         printf("\n");
  85.     }
  86. }
  87.  
  88. void dziedzina (float *pdmin, float *pdmax)         //wskaźniki są argumentami funkcji, więc w tej funkcji możemy i będziemy je zmieniać 'globalnie'
  89. {
  90.     for(printf("Podaj zakres dziedziny dla naszej funkcji. \n");;)
  91.     {
  92.         printf("Zakres minimum - X1: \n");
  93.         *pdmin = wczytajf();                        //odwołujemy się do wskaźnika i zapisujemy do niego wartość
  94.         printf("Zakres maksimum - X2: \n");
  95.         *pdmax = wczytajf();                        //oczywiście jednocześnie sprawdzamy, czy nie siedzi przed komputerem małpa
  96.         if( *pdmin< *pdmax) break;                  //muszą być *(operator wyłuskiwania), ponieważ chcemy się dobrać do wartości wskazywanej przez wskaźniki
  97.         printf("UWAGA! X1 musi byc mniejszy od X2! Spróbuj ponownie! \n");
  98.        
  99.     }
  100.                  
  101. }
  102.  
  103. void wczytaj_parametry(float *param)
  104. {
  105.     printf("Funkcja dla przypomnienia jest postaci sin(x-a)*cos(x-b) + c,\n podaj parametry: a,b,c \n");
  106.    
  107.     printf("Parametr a:\n");
  108.         *param=wczytajf();          //wskaznik param traktujemy jako zmienna tablicowa (adres) i odwolujemy sie do kolejnych adresow ponizej
  109.     printf("Parametr b:\n");
  110.         *(param+1)=wczytajf();      //oczywiście sprawdzając czy małpa dalej siedzi przed komputerem
  111.     printf("Parametr c:\n");
  112.         *(param+2)=wczytajf();
  113. }
  114.  
  115. void generuj(float *param, float dmin, float dmax, float *wyniki, int wielkosc)
  116. {
  117.     int i;
  118.     float delta;
  119.     float x;
  120.    
  121.     delta=(dmax-dmin)/(wielkosc - 1);                                           //delta to 'wielkość' naszego skoku, co ile będziemy badać wartość funkcji
  122.    
  123.     printf("Generowanie wartości funkcji dla podanej dziedziny, tj <%.3f, %.3f>\n i parametrow a=%.3f, b=%.3f, c=%.3f: \n", dmin, dmax, param[0], param[1], param[2]);
  124.  
  125.     for(i=0, x=dmin; i<wielkosc ;i++, x+=delta)
  126.     {
  127.         wyniki[i]=(float)(sin(x-*param) * cos(x-*(param+1)) + *(param+2));      //zapisujemy do naszej tablicy wartości funkcji
  128.     }
  129.  
  130.     printf("Wygenerowano! \n");
  131. }
  132.  
  133. void szum(float *wyniki, int wielkosc)
  134. {
  135.     int i;
  136.     float a;
  137.    
  138.     printf("Podaj amplitude zaklocenia \n");
  139.    
  140.     for(;;)
  141.     {
  142.         a = wczytajf();
  143.         if (a>=0) break;
  144.         else printf("Amplituda musi byc liczbą wiekszą lub rowna 0 i nie kombinuj z literami!\n Obserwuję Cię! \n");
  145.     }
  146.    
  147.    
  148.     for(i=0;i<wielkosc; i++)
  149.     {
  150.         wyniki[i]+=((2.0f*rand()/RAND_MAX - 1)*2)*a ;       //nasz algorytm szumienia
  151.     }
  152.  
  153.     printf("Zaszumiono!\n");
  154.     printf("\n");
  155. }
  156.  
  157. void zapis (float dmin, float dmax, float wyniki[], int wielkosc)
  158. {
  159.     float delta;
  160.     float x;
  161.     int i;
  162.     FILE *f;
  163.    
  164.     delta=(dmax-dmin)/(wielkosc - 1);
  165.     f = fopen("nazwa.csv", "wt");                             //wt-write text
  166.    
  167.     if(f==NULL) printf("Błąd zapisu! Sprawdź, czy w folderze z plikiem nie ma już jakiegoś pliku .csv,\n a najlepiej przeinstaluj Windowsa.\n");                  
  168.     else
  169.     {
  170.         for(i=0, x=dmin; i<wielkosc ;i++, x+=delta)
  171.             {
  172.                 fprintf(f,"%f ; %f \n", x, wyniki[i]);       //najpierw deskryptor pliku! musi wiedziec gdzie ma zapisac
  173.             }
  174.     fclose(f);      //zawsze zamykamy plik na końcu
  175.    
  176.     printf("Zapisano do pliku poprawnie!\n");
  177.     printf("\n");
  178.     }
  179.    
  180. }
  181.  
  182. void wczytaj (float *wyniki, int wielk_MAX, int *wielkosc_akt, float *pdmin, float *pdmax, int *l4)
  183.  
  184. {
  185.     FILE *f;         //zmienna plikowa
  186.     int i;
  187.     float min;      //początek zakresu naszej dziedziny
  188.     float max;      //koniec -||-
  189.  
  190.  
  191.     f = fopen("nazwa.csv", "rt");
  192.  
  193.     if(f!=NULL)
  194.     {
  195.         for(i=0;i<wielk_MAX;i++)
  196.         {
  197.             if(fscanf(f, "%f ; %f", &min, &max)==2)         //ilosc poprawnych zczytań
  198.             {
  199.                 wyniki[i]=max;
  200.                 if(i==0) *pdmin=min;
  201.                 *pdmax=min;
  202.                 *l4=1;
  203.             }
  204.        
  205.             else
  206.             {
  207.                 printf("Nie udalo sie wczytac pliku! \n");
  208.                 break;
  209.                 *l4=0;          //przekazujemy aby móc zapisać/zaszumieć
  210.             }
  211.         }
  212.     *wielkosc_akt=i;        //przekazujemy po to aby wiedzieć jak dużą tablicę wczytaliśmy i aby szumić/odszumiać i zapisywać poprawnie    
  213.     fclose(f);     
  214.     printf("Wczytano poprawnie! \n");
  215.     printf("\n");
  216.     }
  217. }
  218.  
  219. void usrednianie(int wielkosc, float wyniki[])
  220. {
  221.     int i;
  222.     int j;
  223.     float suma;
  224.     float srednie[100];
  225.     int r;
  226.  
  227.     printf("Podaj promien usrednienia \n");
  228.     r=wczytaj_promien();
  229.    
  230.     for(i=0;i<wielkosc;i++)
  231.     {
  232.         suma = 0;
  233.         for(j=i-r; j<i+r ;++j) //petla wewnetrzna do liczenia sredniej
  234.         {
  235.             if(j<0) suma += wyniki[-j];
  236.             else if(j>=wielkosc) suma+=wyniki[2*wielkosc-j-1];
  237.             else suma+=wyniki[j];          
  238.         }
  239.         srednie[i]=suma/(2*r+1);
  240.  
  241.     }
  242.     for(i=0;i<wielkosc;i++) wyniki[i]=srednie[i]; //po usrednieniu wyniki zapisujemy do naszej glownej
  243.     printf("Odszumiono!\n");
  244. }
  245.  
  246.  
  247.  
  248. int main()
  249. {
  250.     int wielk = WIELKOSC;
  251.     int wybor;
  252.     int l1=0;
  253.     int l2=0;
  254.     int l3=0;
  255.     int l4=0;
  256.     float arg_min; //Nasz X1
  257.     float arg_max; //Nasz X2
  258.     float parametry[3];
  259.     float wyn[WIELKOSC];
  260.    
  261.     srand((unsigned int)time(NULL));    //raz w mainie tylko deklarujemy, usigned w nawiasie, bo srand chce unsigned
  262.     setlocale(LC_ALL, "polish");
  263.     wstepniak();
  264.        
  265.     for(;;)
  266.     {
  267.    
  268.     printf("Przejdź do: \n");
  269.     wybor=wczytaj_menu();
  270.    
  271.     switch(wybor)
  272.     {
  273.     case 1: //dziedzina
  274.         dziedzina(&arg_min, &arg_max);
  275.         l1 = 1;
  276.         printf("\n");
  277.         break;
  278.  
  279.     case 2:  //parametry
  280.         wczytaj_parametry(parametry);
  281.         l2=1;
  282.         printf("\n");
  283.         break;
  284.  
  285.     case 3: //generowanie
  286.         wielk=WIELKOSC;
  287.         if(l1 && l2)
  288.         {
  289.             generuj(parametry, arg_min, arg_max, wyn, wielk);
  290.             l3=1;
  291.         }
  292.         else printf("Do wygenerowania funkcji musisz podać dziedzinę i parametry! \n");
  293.         printf("\n");
  294.         break;
  295.  
  296.     case 4: //szum
  297.         if(l3 || l4) szum(wyn, wielk);
  298.         else printf("Aby dodać szum do funkcji musisz ją wygenerować LUB wczytać z pliku! \n");
  299.         printf("\n");
  300.         break;
  301.  
  302.     case 5: //odszumienie
  303.         if(l3 || l4) usrednianie(wielk, wyn);
  304.         else printf("Aby odszumić funkcję musisz ją wygenerować LUB wczytać z pliku! \n");
  305.         printf("\n");
  306.         break;
  307.  
  308.     case 6: //zapis do pliku
  309.         if(l3 || l4) zapis(arg_min, arg_max, wyn, wielk);
  310.         else printf("Aby zapisać funkcję musisz ją wygenerować LUB wczytać z pliku! \n");
  311.         printf("\n");
  312.         break;
  313.  
  314.     case 7: //wczyt z pliku
  315.         wczytaj(wyn, WIELKOSC, &wielk ,&arg_min, &arg_max, &l4);
  316.         printf("\n");
  317.         break;
  318.  
  319.     case 0: //instrukcja :D
  320.         instrukcja();
  321.         printf("\n");
  322.         break;
  323.     }
  324.     wstepniak_mini();
  325.     }
  326.     //dziedzina(&x, &y);
  327.     //wczytaj_parametry(parametry);
  328.     //wielk=WIELKOSC;
  329.     //generuj(parametry,x,y,wyn, wielk);        //nazwa tablicy jest adresem, bez &
  330.     //szum(wyn, wielk);
  331.     //zapis(x, y, wyn, wielk);
  332.     //usrednianie(wielk, wyn);
  333.     //zapis(x, y, wyn, wielk);
  334.     //wczytaj(wyn, WIELKOSC, &wielk ,&x, &y);
  335.  
  336.     printf ("No i koniec");
  337.    
  338.     return 0;
  339. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement