fork download
  1. #include <iostream>
  2. #include <math.h>
  3. #include <iomanip>
  4.  
  5. #define MAX 10+1
  6. enum limit {lewy, prawy};
  7.  
  8. using namespace std;
  9.  
  10. int n; //liczba zestawów danych wielomianu
  11.  
  12. struct WIELOMIAN {
  13. int m; //stopnie wielomianu
  14. double w[MAX] = {0}; //współczynniki danego wielomianu
  15. double w1[MAX] = {0}; //współczynniki danego wielomianu
  16. int k; //Całkowita dodatnia liczba k określająca liczbę przedziałów całkowania
  17. double p[MAX][2]; //k par liczb rzeczywistych definiujących granice całkowania
  18. };
  19.  
  20. WIELOMIAN W[MAX];
  21.  
  22.  
  23. double f(int i/*nr wielomianu*/, WIELOMIAN * W, double x)
  24. {
  25. double wynik = W[i].w1[0];
  26.  
  27. for(int j=1;j<=W[i].m;j++)
  28. wynik = wynik*x + W[i].w1[j];
  29.  
  30. return wynik;
  31. }
  32.  
  33.  
  34.  
  35. double f(int i /*nr wielomianu*/, double x /*argument*/) { //funkcja zwracająca wartość wielomianu
  36.  
  37. double result=W[i].w[0];
  38. for(int z=1; z<=W[i].m;z++) {
  39. result = result + W[i].w[z]*pow(x,z);
  40. }
  41. return result;
  42. }
  43.  
  44.  
  45. double Field(WIELOMIAN * W/*przedzial*/,int t/*nr zestawu danych*/,int r/*nr przedziału całkowania*/)
  46. {
  47. int q = 1000000; //liczba przedziałów w których liczone są trapezy
  48. double a = W[t].p[r][lewy];
  49. double b = W[t].p[r][prawy];
  50.  
  51. double h = (b-a)/(double)q; //wysokosć trapezów
  52.  
  53. double S = 0.0; //zmienna będzie przechowywać sumę pól trapezów
  54. double podstawa_a = f(t,a);
  55. double podstawa_b = f(t,b);
  56.  
  57. for(int i=1;i<=q;i++)
  58. {
  59. podstawa_b = f(t,a+h*i);
  60. S += (podstawa_a+podstawa_b);
  61. podstawa_a = podstawa_b;
  62. }
  63. return 0.5*S*h;
  64. }
  65.  
  66.  
  67. int main()
  68. {
  69.  
  70. //========= Wczytywanie danych ==============================
  71. cin >> n; //Liczba zestawów danych?
  72.  
  73. for (int i = 0; i < n; i++) { //i - nr wielomianu
  74. cin >> W[i].m; //stopień wielomianu i
  75.  
  76. for(int j=0;j<=W[i].m;j++) {
  77. cin>>W[i].w[j]; //współczynnik j wielomianu i
  78. }
  79.  
  80.  
  81. for(int j=0;j<=n;j++) {
  82. W[i].w1[n-j] = W[i].w[j];
  83. }
  84.  
  85. cin>>W[i].k; //ilość przedzialow calkowania
  86.  
  87. for(int r=0;r<W[i].k;r++) {
  88. cin>>W[i].p[r][lewy];
  89. cin>>W[i].p[r][prawy];
  90. }
  91. }
  92.  
  93.  
  94.  
  95.  
  96.  
  97. //========= Wypisywanie danych ==============================
  98.  
  99. for(int i=0;i<n;i++) {
  100. for(int j=0;j<W[i].k;j++){
  101. cout<<fixed<<setprecision(15)<<Field(W,i,j)<<endl;
  102. }
  103. }
  104.  
  105. return 0;
  106. }
  107.  
Success #stdin #stdout 1.2s 4964KB
stdin
2
2
-5 0.5 1
4
-4 -3
-3 -2.5
2 3
3 4
3
-9 -4.5 2.5 1
6
-3 -2.5
-3 -2
-3 -1.5
2 3
3 4
2 4
stdout
5.583333333333417
0.604166666666711
2.583333333333606
9.083333333333062
0.682291666666551
1.833333333332473
2.390624999997606
11.833333333335435
49.833333333333933
61.666666666683433