Advertisement
Guest User

Untitled

a guest
May 22nd, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.02 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3.  
  4.  
  5. /*
  6.  Ta struktura posłuży jako wynik sumowania, oprócz wartości
  7.  będzie informować użytkownika o tym, cyz przekroczono
  8.  dopuszczalną liczbę wyrazów rozwinięcia szeregu oraz czy
  9.  osiągnięto zadaną przez użytkownika dokładność.
  10. */
  11.  
  12. struct WynikSumowania
  13. {
  14.     double suma;
  15.     bool osiagnietoDokladnosc;
  16.     bool przekroczonoMaksWyrazow;
  17. };
  18.  
  19. /* funkcja zamienia dwie wartości typu double)
  20.    znak & (ampersand) informuje kompilator, żeby przekazał referencję do
  21.    zmiennych do funkcji, zamiast kopii tychże zmiennych.
  22. */
  23. void zamien(double &x, double &y)
  24. {
  25.     double tymczasowy = x;
  26.     x = y;
  27.     y = tymczasowy;
  28. }
  29.  
  30.  
  31. /*
  32.  Ta struktura będzie naszym przedziałem.
  33.  nazwy pól są intuicyjne (oby.)
  34. */
  35. struct Przedzial
  36. {
  37.     double poczatek, koniec;
  38. };
  39.  
  40.  
  41. /*********************************************************
  42.  * f(x) - oblicza wartośc funkcji dla argumentu x
  43.  *
  44.  ********************************************************/
  45. double f(double x)
  46. {
  47.      
  48.     //funkcja zwraca wartośc równą:
  49.     //             1                       
  50.     // f(x) =   -------                
  51.     //          (1-x^2)
  52.     return x/(1-(x*x));
  53. };
  54.  
  55. /*********************************************************
  56.  * suma(x,e,epsilon) - oblicza wartość funkcji za pomocą szeregu
  57.  * funkcja przerywa sumowanie, gdy:
  58.  * -> liczba wyrazów w
  59.  *    rozwinięciu przekroczy liczbę podaną jako argument 'e'
  60.  *
  61.  * -> zostanie osiągnięta dokładność (przekazana przez zmienną epsilon)
  62.  *
  63.  ********************************************************/
  64. WynikSumowania suma(double x, unsigned int e, double epsilon)
  65. {
  66.     int n = 1; //zaczynamy od obliczenia jednego wyrazu.
  67.     double suma = 0; //na początku suma jest równa 0.
  68.     WynikSumowania wynik; //to będzie nasz wynik.
  69.  
  70.     do
  71.     {
  72.         suma += n*(pow(x,n-1));
  73.         // do obecnej wartości sumy dodajemy:
  74.         //
  75.         //  n * x^{n-1}
  76.         //
  77.  
  78.     } while ((n < e) && (abs(suma) > abs(epsilon)));
  79.     /* powyższy warunek składa się z koniunkcji dwóch
  80.      * mniejszych warunków:
  81.      * ->  n < e (sprawdzam czy nie przekroczono dozwolonej liczby
  82.      *     wyrazów.
  83.      *
  84.      * -> abs(sum) > abs(epsilon) (sprawdzam czy moduł obecnej wartości
  85.      *    sumy jest większy od modułu epsilon (epsilon jest w module
  86.      *    na wypadek gdyby jakiś idiota podał ujemną wartość epsilon).
  87.      *    Dopóki oba warunki są spełnione - czyli nie przekroczono maksymalnej
  88.      *    ilości wyrazów, i nie osiągnięto zadanej dokładności, dopóty powyższa
  89.      *    pętla będzie się wykonywać. (korzystając z własności koniunkcji, gdy
  90.      *    którykolwiek z warunków jest niespełniony - czyli osiągnięto zadaną
  91.      *    dokładność LUB <z praw de Morgana - zaprzeczeniem koniunkcji jest alternaty-
  92.      *    -wa zaprzeczeń> przekroczono maksymalną liczbę wyrazów, wtedy pętla zakoń-
  93.      *    -czy  działanie. teraz pozostaje wypełnić strukturę typu wynikSumowania,
  94.      *    która będzie zwróconą wartością. ;-)
  95.      *
  96.      */
  97.  
  98.  
  99.     wynik.przekroczonoMaksWyrazow = n > e; 
  100.     wynik.osiagnietoDokladnosc = (abs(suma) > abs(epsilon));
  101.     /* powyższe wyrażenia korzystają z tego, że operatory porównania zwracają
  102.        wartość typu bool (true/false) i wynik tych porównań zostaje zapisany
  103.        w polach struktury 'wynik'
  104.     */
  105.  
  106.     wynik.suma = suma;
  107.     /* zapisujemy w odpowiednim polu struktury 'wynik' sumę, jaka została nam pod
  108.        koniec obliczeń
  109.     */
  110.  
  111.     return wynik; //ostatecznie - zwracamy wynik do funkcji wywołującej.
  112.    
  113. };
  114.  
  115. double* generuj_tablice(Przedzial  przedzial, double dx)
  116. {
  117.     dx = abs(dx); // na wypadek, gdyby ktoś mądry podał ujemną wartość.
  118.    
  119.     //jesli ktos podal poczatek przedzialu, ktory jest 'fizycznie'
  120.     // za jego koncem, to też poprawmy to.
  121.     if (przedzial.poczatek > przedzial.koniec)
  122.         zamien(przedzial.poczatek,przedzial.koniec);
  123.    
  124.     //gdyby początek i koniec przedziału były sobie równe, to rozmiarTab byłby równy
  125.     // 0, i by nie było wyników... ;-)
  126.     else if (przedzial.poczatek == przedzial.koniec)
  127.         przedzial.koniec = przedzial.poczatek + 10;
  128.    
  129.  
  130.     //zaczynamy generowac tablicę od poczatku przedziału.
  131.     double x = przedzial.poczatek;
  132.  
  133.  
  134.     //obliczmy ile elementów będzie mieć tablica...
  135.     int rozmiarTab = (przedzial.koniec - przedzial.poczatek) / dx;
  136.  
  137.  
  138.     if (rozmiarTab > 0)    
  139.     {
  140.         if (tablica != NULL) delete tablica;
  141.         //teraz przydzielmy dla niej pamięć.
  142.         double* tablica = new double[rozmiarTab];
  143.  
  144.         if (tablica != NULL)    //jeśli przydzielenie się powiodło,to...
  145.         {
  146.             // w pętli obliczamy wartośc dla każdego elementu x
  147.             // (zaczynając od x = przedzial.poczatek)
  148.             for (int i=0; i< rozmiarTab;i++)
  149.             {
  150.                 tablica[i] = f(x);
  151.                 x += dx; //nastepny x będzie równy x + dx,więc dodajemy dx.
  152.             };
  153.         };
  154.         return tablica;
  155.     }
  156.     else return NULL; //w przeciwnym wypadku zwracamy NULL, żeby poinformować użytkownika,
  157.     //że coś poszło nie tak.
  158.    
  159.    
  160.  
  161. };
  162.  
  163.  
  164.  
  165.  
  166.  
  167. int _tmain(int argc, _TCHAR* argv[])
  168. {
  169.     Przedzial przedzial = {0.5,0.9};
  170.     double dx  = 0.01;
  171.     int rozmiar = generuj_tablice(przedzial,dx,t);
  172.     delete t;
  173.  
  174.     return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement