Advertisement
Guest User

zadanie

a guest
Nov 29th, 2015
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.73 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. double wartoscFunkcji(double wspolczynniki[], int stopien, double x) //obliczanie wartości funkcji w danym miejscu
  6. {
  7.     double wartosc = 0;
  8.     for(int i = 0, j = stopien - 1; i < stopien; i++, j--)
  9.     {
  10.         wartosc += wspolczynniki[i] * pow(x, j);
  11.     }
  12.     return wartosc;
  13. }
  14.  
  15. void zapisDoPliku(double pole, int powtorzenie) //zapisywanie wyników do pliku tekstowego
  16. {
  17.     FILE *file;
  18.     file = fopen("test.txt", "r+");
  19.     char c = fgetc(file);
  20.     while(c != EOF)
  21.     {
  22.         if(c=='\n' && powtorzenie == 0)
  23.         {
  24.             break;
  25.         }
  26.         c = fgetc(file);
  27.         if(c == '\n')
  28.         {
  29.             powtorzenie--;
  30.         }
  31.     }
  32.     fprintf(file, " %f", pole);
  33.     printf("%f\n", pole);
  34.     fclose(file);
  35. }
  36.  
  37. void pobranieZPliku(double *minimum, double *maksimum, int *rozdzialka, double wspolczynniki[], int powtorzenie) // pobranie z pliku danych do całkowania
  38. {
  39.     int czytaj = 0, pozycja = 0, zmienna = 0, pozycja2 = 0;
  40.     FILE *file;
  41.     file = fopen("test.txt", "r");
  42.     char c, c1[20];
  43.     while(powtorzenie != 0) // ustawienie na odpowiednia linie
  44.     {
  45.         c = fgetc(file);
  46.         if(c == '\n')
  47.         {
  48.             powtorzenie--;
  49.         }
  50.     }
  51.     do // odczytywanie wspolczynnikow przy "x"
  52.     {
  53.         c= fgetc(file);
  54.         if(c == '+' || c == '-' || c == '=')
  55.         {
  56.             czytaj = 1;
  57.             if(c != '=')
  58.             {
  59.                 c1[pozycja] = c;
  60.                 pozycja++;
  61.             }
  62.         }
  63.         if(czytaj == 1 && ((c > 47 && c < 58) || c == '.'))
  64.         {
  65.             c1[pozycja] = c;
  66.             pozycja++;
  67.         }
  68.         else if(czytaj == 1 && (c == 'x' || c == ';'))
  69.         {
  70.             wspolczynniki[pozycja2] = atof(c1);
  71.             pozycja = 0;
  72.             czytaj = 0;
  73.             pozycja2++;
  74.             for(int i = 0; i < 20; i++)
  75.                 c1[i]=' ';
  76.         }
  77.     }
  78.     while(c != ';'); //zczytywanie wzoru funkcji
  79.     for(int i = 0; i < 20; i++)
  80.         c1[i]=' '; //nie wiem dlaczego, jezeli nie ma tej linijki, niektore wspolczynniki "glupieja"
  81.     c = fgetc(file);
  82.     do //zczytywanie minimum, maximum i rozdzielczosci
  83.     {
  84.         if(c != ';')
  85.         {
  86.             c1[pozycja] = c;
  87.             pozycja++;
  88.         }
  89.         else
  90.         {
  91.             if(zmienna == 0)
  92.             {
  93.                 *minimum = atof(c1);
  94.             }
  95.             else
  96.             {
  97.                 *maksimum = atof(c1);
  98.             }
  99.             for(int i = 0; i < 20; i++)
  100.             {
  101.                 c1[i] = ' ';
  102.             }
  103.             zmienna++;
  104.             pozycja = 0;
  105.         }
  106.         c = fgetc(file);
  107.     }
  108.     while(c != '\n' && c != EOF);
  109.     *rozdzialka = atoi(c1);
  110.     fclose(file);
  111. }
  112.  
  113. int main()
  114. {
  115.     double wspolczynniki[4];
  116.     double minimum = 0, maksimum = 0, pole = 0, delta;
  117.     int rozdzialka = 0, stopien = 0;
  118.     for(int j = 0; j < 3; j++) // aby zczytac wszystkie 3 funkcje
  119.     {
  120.         pobranieZPliku(&minimum, &maksimum, &rozdzialka, wspolczynniki, j); // przekazujemy "oryginaly" zmiennych, dlatego "&"
  121.         stopien = sizeof wspolczynniki / sizeof *wspolczynniki; // określa nam jakiego stopnia jest dany wielomian
  122.         delta = (maksimum - minimum) / rozdzialka; //jak duzy musi byc kolejny krok aby osiagnac oczekiwana rozdzielczosc
  123.         pole = 0;
  124.         for(int i = 0; i < rozdzialka; i++)
  125.         {
  126.             double x = minimum + (delta * i) + (0.5 * delta); // znajdujemy kolejne punkty
  127.             double y = wartoscFunkcji(wspolczynniki, stopien, x); // podstawiamy wartosci do danych punktow
  128.             pole += delta * y; // obliczamy pole pod wykresem (wynik calki) sumujac wartosci kolejnych prostokatow
  129.         }
  130.         zapisDoPliku(pole, j);
  131.     }
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement