Advertisement
eugene_bespoyasko

ChM_03

Feb 14th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.62 KB | None | 0 0
  1. #include <stdio.h>  //(+0.65 -0.93 +0.45 | -0.72)
  2. #include <stdlib.h> //(+1.15 +0.43 -0.72 | +1.24)
  3. #include <math.h>   //(+0.56 -0.18 +1.03 | +2.15)
  4. #include <conio.h>
  5.  
  6. double ** CreateMassA(const int SLAR, double **massA);
  7. double * CreateMassB(const int SLAR, double *massB);
  8. void CreateMass1(const int SLAR, double **mass);
  9. double ** CreateMass2(const int SLAR, double **mass);
  10. void swap (double *a, double *b);
  11. void temp (const int SLAR, double **massA, double **tempA, const double *massB, double * tempB);
  12. void PrintMass(const int SLAR, double **massA, const double *massB);
  13. void PrintLU (const int SLAR, double **massL, double **massU);
  14. void PrintX(const int SLAR, const double *massX);
  15. void Gauss(const int SLAR, double **massA, double *massB);
  16. void LU(const int SLAR, double **massA, double *massB);
  17.  
  18. int main()
  19. {
  20.     double print;
  21.     int SLAR;
  22.     do
  23.     {
  24.         printf ("Enter the number of equations: ");
  25.         scanf_s ("%lf", &print);
  26.  
  27.     } while (print < 1);
  28.     SLAR = print;
  29.     double **massA = CreateMassA(SLAR, massA);
  30.     double *massB = CreateMassB(SLAR, massB);
  31.     double **tempA = CreateMass2(SLAR, tempA);
  32.     double *tempB;
  33.     CreateMass1 (SLAR, &tempB);
  34.     temp (SLAR, massA, tempA, massB, tempB);
  35.     Gauss(SLAR, massA, massB);
  36.     temp (SLAR, tempA, massA, tempB, massB);
  37.     LU(SLAR, massA, massB);
  38.     for (int i = 0; i < SLAR; ++i)
  39.         free (massA[i]);
  40.     free (massA);
  41.     for (int i = 0; i < SLAR; ++i)
  42.         free (tempA[i]);
  43.     free (tempA);
  44.     tempA = NULL;
  45.     free (massB);
  46.     massB = NULL;
  47.     free (tempB);
  48.     tempB = NULL;
  49.     system ("pause");
  50.     return 0;
  51. }
  52.  
  53. double ** CreateMassA(const int SLAR, double **massA)
  54. {
  55.     massA = (double **) malloc (SLAR*sizeof (double *));
  56.     if (!massA)
  57.     {
  58.         printf ("Not enough memory for massA!\n");
  59.         system ("pause");
  60.         exit (1);
  61.     }
  62.     for (int i = 0; i < SLAR; ++i)
  63.     {
  64.         massA[i] = (double *)malloc (SLAR*sizeof (double));
  65.         if (!massA[i])
  66.         {
  67.             printf ("Not enough memory for massA[%d]!\n", i+1);
  68.             system ("pause");
  69.             exit (1);
  70.         }
  71.         for (int j = 0; j < SLAR; ++j)
  72.         {
  73.             printf ("Enter the a[%i][%i]: ", i+1, j+1);
  74.             scanf_s ("%lf", &massA[i][j]);
  75.         }
  76.     }
  77.     return massA;
  78. }
  79. double * CreateMassB(const int SLAR, double *massB)
  80. {
  81.     massB = (double *) malloc (SLAR*sizeof (double));
  82.     if(!massB)
  83.     {
  84.         printf ("Not enough memory for massB!\n");
  85.         system ("pause");
  86.         exit (1);
  87.     }
  88.     for (int i = 0; i < SLAR; ++i)
  89.     {
  90.         printf ("Enter the b[%d]: ", i + 1);
  91.         scanf ("%lf", &massB[i]);
  92.     }
  93.     return massB;
  94. }
  95.  
  96. double ** CreateMass2(const int SLAR, double **mass)
  97. {
  98.     mass = (double **) malloc (SLAR*sizeof (double *));
  99.     if (!mass)
  100.     {
  101.         printf ("Not enough memory for mass[][]!\n");
  102.         system ("pause");
  103.         exit (1);
  104.     }
  105.     for (int i = 0; i < SLAR; ++i)
  106.     {
  107.         mass[i] = (double *)malloc (SLAR*sizeof (double));
  108.         if (!mass[i])
  109.         {
  110.             printf ("Not enough memory for mass[%d]!\n", i+1);
  111.             system ("pause");
  112.             exit (1);
  113.         }
  114.     }
  115.     return mass;
  116. }
  117. void CreateMass1(const int SLAR, double **mass)
  118. {
  119.     *mass = (double *) malloc (SLAR*sizeof (double));
  120.     if(!mass)
  121.     {
  122.         printf ("Not enough memory for mass[]!\n");
  123.         system ("pause");
  124.         exit (1);
  125.     }
  126. }
  127.  
  128. void swap (double *a, double *b)
  129. {
  130.     double temp = *a;
  131.     *a = *b;
  132.     *b = temp;
  133. }
  134.  
  135. void temp (const int SLAR, double **massA, double **tempA, const double *massB, double * tempB)
  136. {
  137.     for (int i = 0; i < SLAR; ++i)
  138.     {
  139.         for (int j = 0; j < SLAR; ++j)
  140.             tempA[i][j] = massA[i][j];
  141.         tempB[i] = massB[i];
  142.     }
  143. }
  144.  
  145. void PrintMass(const int SLAR, double **massA, const double *massB)
  146. {
  147.     int k = (SLAR+1)*8+5;
  148.     for (int i = 0; i < k; ++i)
  149.         putchar ('=');
  150.     putchar('\n');
  151.     for (int i = 0; i < SLAR; ++i)
  152.     {
  153.         putchar ('(');
  154.         for (int j = 0; j < SLAR; ++j)
  155.             printf (" %+7.2lf", massA[i][j]);
  156.         printf (" | %+7.2lf )\n", massB[i]);
  157.     }
  158. }
  159.  
  160. void PrintLU (const int SLAR, double **massL, double **massU)
  161. {
  162.     int k = SLAR*8+6;
  163.     int m = SLAR/2;
  164.     for (int i = 0; i < k; ++i)
  165.         putchar ('=');
  166.     putchar('\n');
  167.     for (int i = 0; i < SLAR; ++i)
  168.     {
  169.         if (i == m) printf ("L = (");
  170.         else printf ("    (");
  171.         for (int j = 0; j < SLAR; ++j)
  172.             printf (" %+7.2lf", massL[i][j]);
  173.         putchar(')'); putchar('\n');
  174.     }
  175.     for (int i = 0; i < k; ++i)
  176.         putchar ('-');
  177.     putchar('\n');
  178.     for (int i = 0; i < SLAR; ++i)
  179.     {
  180.         if (i == m) printf ("U = (");
  181.         else printf ("    (");
  182.         for (int j = 0; j < SLAR; ++j)
  183.             printf (" %+7.2lf", massU[i][j]);
  184.         putchar(')'); putchar('\n');
  185.     }
  186. }
  187.  
  188. void PrintX(const int SLAR, const double *massX)
  189. {
  190.     putchar ('\n');
  191.     for (int i = 0; i < SLAR; ++i)
  192.         printf ("x[%d] = %+.2lf\n", i+1, massX[i]);
  193.     putchar ('\n');
  194. }
  195.  
  196. void Gauss(const int SLAR, double **massA, double *massB)
  197. {
  198.     double *massX;
  199.     CreateMass1(SLAR, &massX);
  200.     printf ("Press 1 if you want to see step output of method of Gauss\n");
  201.     char ch = _getch();
  202.     if (ch == '1') PrintMass(SLAR, massA, massB);
  203.     for (int k = 0; k < SLAR - 1; ++k)  //k - номер рівняння, над яким працюємо
  204.     {
  205.         int check = 0;
  206.         double MAX = fabs(massA[k][k]);
  207.         for (int i = k + 1; i < SLAR; ++i)  //і - номер рівняння, що іде після k-го рівняння
  208.             if (MAX < fabs(massA[i][k]))    //визначаємо найбільше за модулем число у стовпці
  209.             {
  210.                 check = 1;
  211.                 for (int a = 0; a < SLAR; ++a) //а - номер елемента в рівнянні
  212.                     swap (&massA[k][a], &massA[i][a]);
  213.                 swap (&massB[k], &massB[i]);
  214.             }
  215.         if (MAX == 0)
  216.         {
  217.             for (int j = k; j < SLAR-1; ++j)
  218.             {
  219.                 int check = 0;
  220.                 for (int i = 0; i < SLAR - 1; ++i)
  221.                 {
  222.                     if (massA[j][i] != 0)
  223.                     {
  224.                         check = 1; continue;
  225.                     }
  226.                 }
  227.                 if (massB[j] != 0)
  228.                 {
  229.                     printf ("\nERROR!  System is indefinite\n", k+1);
  230.                     system ("pause");
  231.                     exit(1);
  232.                 }
  233.             }
  234.             printf ("\nERROR!  System is compatible\n", k+1);
  235.             system ("pause");
  236.             exit(1);
  237.         }
  238.         if ((ch == '1') && (check == 1)) PrintMass(SLAR, massA, massB);
  239.         for (int j = k + 1; j < SLAR; ++j) //j - номер рівняння, над яким працюємо
  240.         {                                  //занулюємо елементи під головною діагоналлю
  241.             double a = massA[j][k] / massA[k][k]; // a - число, на яке ділиться рівняння
  242.             for (int n = k; n < SLAR; ++n) //n - номер елемента в рівнянні
  243.             {
  244.                 massA[j][n] = massA[j][n]-a*massA[k][n];
  245.             }
  246.             massB[j] = massB[j] - a*massB[k];
  247.         }
  248.         if (ch == '1') PrintMass(SLAR, massA, massB);
  249.     }
  250.    
  251.     if (massA[SLAR-1][SLAR-1] == 0)
  252.     {
  253.         if (massB[SLAR-1] != 0) printf ("\nERROR! System is indefinite!\n");
  254.         else printf ("\nERROR! System is compatible!\n");
  255.         system ("pause");
  256.         exit (1);
  257.     }
  258.  
  259.     for (int i = SLAR-1; i >= 0; --i) //визначаємо корені рівняння
  260.     {
  261.         double x = 0;
  262.         for (int j = SLAR-1; j > i; --j)
  263.             x = x + massA[i][j]*massX[j];
  264.         massX[i] = (massB[i] - x) / massA[i][i];
  265.     }
  266.     PrintX(SLAR, massX);
  267.     free (massX);
  268.     massX = NULL;
  269. }
  270.  
  271. void LU(const int SLAR, double **massA, double *massB)
  272. {
  273.     double *massX;
  274.     double **massL = CreateMass2(SLAR, massL);
  275.     double **massU = CreateMass2(SLAR, massU);
  276.     CreateMass1(SLAR, &massX);
  277.     for (int i = 0; i < SLAR; ++i)
  278.         for (int j = 0; j < SLAR; ++j)
  279.         {
  280.             if (i == j) {massU[i][j] = 1; massL[i][j] = 0;}
  281.             else {massL[i][j] = 0; massU[i][j] = 0;}
  282.         }
  283.     massL[0][0] = massA[0][0];
  284.     for (int i = 1; i < SLAR; ++i)
  285.     {
  286.         massU[0][i] = massA[0][i] / massL[0][0];
  287.         massL[i][0] = massA[i][0];  //+2;1;1|1
  288.     }                               //+4;1;0|-2
  289.     for (int i = 1; i < SLAR; ++i)  //-2;2;1|7
  290.     {
  291.         massL[i][0] = massA[i][0];
  292.         for (int k = 1; k < SLAR; ++k)
  293.         {
  294.             if (k <= i)
  295.             {
  296.                 for (int m = 0; m < k; ++m)
  297.                     massL[i][k] += (massL[i][m]*massU[m][k]);
  298.                 massL[i][k] = massA[i][k] - massL[i][k];
  299.             }
  300.             else
  301.             {
  302.                 for (int m = 0; m < i; ++m)
  303.                     massU[i][k] += (massL[i][m]*massU[m][k]);
  304.             massU[i][k] = (massA[i][k] - massU[i][k]) / massL[i][i];
  305.             }
  306.         }
  307.     }
  308.     printf ("Press 1 if you want to see step output of LU-method\n");
  309.     char ch = _getch();
  310.     if (ch == '1') PrintLU (SLAR, massL, massU);
  311.     for (int i = 0; i < SLAR; ++i) //визначаємо massY
  312.     {
  313.         double x = 0;
  314.         for (int j = 0; j < i; ++j)
  315.             x += massL[i][j]*massX[j];
  316.         massX[i] = (massB[i] - x) / massL[i][i];
  317.     }
  318.     for (int i = SLAR-1; i >= 0; --i) //визначаємо корені рівняння
  319.     {
  320.         double x = 0;
  321.         for (int j = SLAR-1; j > i; --j)
  322.             x += massU[i][j]*massX[j];
  323.         massX[i] = massX[i] - x;
  324.     }
  325.     PrintX(SLAR, massX);
  326.     for (int i = 0; i < SLAR; ++i)
  327.         free (massL[i]);
  328.     free (massL);
  329.     massL = NULL;
  330.     for (int i = 0; i < SLAR; ++i)
  331.         free (massU[i]);
  332.     free (massU);
  333.     massU = NULL;
  334.     free (massX);
  335.     massX = NULL;
  336. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement