Advertisement
Guest User

Řešení soustavy lineárních rovnic

a guest
Jan 16th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.35 KB | None | 0 0
  1. /* SEMESTRALNI PROJEKT
  2. Program pro vypocet soustavy linearnich rovnic
  3. - pouzita Gaussova eliminacni metoda
  4. Milan Bubniak, FEKT 2017 */
  5.  
  6. #include "stdafx.h"
  7. #include "operace.h"
  8. #include <windows.h>
  9.  
  10. #define TRUE 1
  11. #define FALSE 0
  12.  
  13. #define MAX 10                                  // maximalni pocet neznamych v soustave
  14. static const char cesta[] = "./rovnice.txt";    // cesta k souboru se soustavou rovnic
  15.  
  16. enum menu { zadavani = 1, soubor, konec };
  17.  
  18. typedef double matice[MAX - 1][MAX];
  19.  
  20. void plneni(int q, matice b);
  21. void vypis(int q, matice b);
  22. void nula(int q, int m, matice b);
  23. void plneniSoubor(int q, matice b, FILE *fileta);
  24. void vypocet(int q, matice a);
  25. void onZadat();
  26. void onSoubor();
  27. void splitter();
  28.  
  29. void plneni(int q, matice b)
  30. {
  31.     for (char m = 0; m < q; m++)
  32.     {
  33.         for (char n = 0; n < q + 1; n++)
  34.         {
  35.             b[m][n] = 0;
  36.         }
  37.     }
  38.  
  39.     for (char m = 0; m < q; m++)
  40.     {
  41.         printf(" Zadej koeficienty A,B,... (atd. dle poctu neznamych) a hodnotu Z dle tvaru: A*x + B*y + ... = Z v %.d. rovnici soustavy:\n", m + 1);
  42.         for (char n = 0; n < q + 1; n++)
  43.         {
  44.             if (n == q)
  45.                 printf("\tZ: ");
  46.             else
  47.                 printf("\t%c: ", n + 65);
  48.  
  49.             scanf_s("%lf", &b[m][n]);
  50.         }
  51.     }
  52. }
  53.  
  54. void vypis(int q, matice b)
  55. {
  56.     printf("\n");
  57.     for (char m = 0; m < q; m++)
  58.     {
  59.         for (char n = 0; n < q + 1; n++)
  60.         {
  61.             if (n == q)
  62.                 printf("  | %9.3lf", b[m][n]);
  63.             else
  64.                 printf("%10.3lf", b[m][n]);
  65.         }
  66.         printf("\n");
  67.     }
  68.     printf("\n");
  69. }
  70.  
  71. void nula(int q, int m, matice b)
  72. {
  73.     int n = m; int k = m;
  74.     double z;
  75.  
  76.     while ((b[m][n] == 0) && (m <= (q-1)))
  77.     {
  78.         m += 1;
  79.         if (b[m][n] != 0)
  80.             for (n = 0; n <= q; n++)
  81.             {
  82.                 z = b[m][n];
  83.                 b[m][n] = b[k][n];
  84.                 b[k][n] = z;
  85.             }
  86.     }
  87. }
  88.  
  89. void plneniSoubor(int q, matice b, FILE *fileta)
  90. {
  91.     for (char m = 0; m < q; m++)
  92.     {
  93.         for (char n = 0; n < q + 1; n++)
  94.         {
  95.             b[m][n] = 0;
  96.         }
  97.     }
  98.  
  99.     for (char m = 0; m < q; m++)
  100.     {
  101.         for (char n = 0; n < q + 1; n++)
  102.         {
  103.             if (!feof(fileta))
  104.                 fscanf_s(fileta, "%lf;", &b[m][n]);
  105.         }
  106.         printf(" %.d. rovnice nactena.\n", m + 1);
  107.     }
  108. }
  109.  
  110. void vypocet(int s, matice a)
  111. {
  112.     int i, j, f, g, e, c, d;
  113.     double y;
  114.  
  115.     d = FALSE;
  116.  
  117.     printf(" Sestavena matice koeficientu:\n");
  118.     vypis(s, a);
  119.     printf(" Nuluji pod diagonalou...\n");
  120.  
  121.     for (i = 0; i < s - 1; i++)
  122.     {
  123.         nula(s, i, a);
  124.  
  125.         for (e = 0; e < s - i; e++)
  126.         {
  127.             if (a[i + e][i] != 0)
  128.             {
  129.                 y = a[i + e][i] / a[i][i] * (-1.0);
  130.  
  131.                 for (j = 0; j < s + 1; j++)
  132.                 {
  133.                     a[i][j] *= y;
  134.                     a[i + e][j] += a[i][j];
  135.                 }
  136.             }
  137.         }
  138.  
  139.         vypis(s, a);
  140.         Sleep(500);
  141.  
  142.         for (f = i; f < s; f++)
  143.         {
  144.             c = FALSE;
  145.             for (g = 0; g < s; g++)
  146.                 c = (a[f][g] != 0) || c;
  147.  
  148.             if (!c)
  149.             {
  150.                 d = a[f][s + 1] == 0;
  151.                 f = s;
  152.             }
  153.         }
  154.  
  155.         if (!c)
  156.             i = s - 1;
  157.     }
  158.  
  159.     if (c)
  160.     {
  161.         for (j = (s - 1); j >= 0; j--)
  162.         {
  163.             for (e = (j + 1); e <= (s - 1); e++)
  164.                 a[j][s] -= a[j][e];
  165.  
  166.             a[s][j] = a[j][s] / a[j][j];
  167.  
  168.             for (i = 0; i <= j; i++)
  169.                 a[i][j] *= a[s][j];
  170.         }
  171.  
  172.         printf(" Vypoctene koreny soustavy:\n\n");
  173.         for (j = 0; j <= (s - 1); j++)
  174.             printf("\tX%d = %lf\n", j + 1, a[s][j]);
  175.  
  176.         splitter();
  177.     }
  178.     else
  179.     {
  180.         if (d)
  181.             printf("\n Tato soustava rovnic ma nekonecne mnoho reseni!\n");
  182.         else
  183.             printf("\n Tato soustava rovnic nema reseni!\n");
  184.  
  185.         splitter();
  186.     }
  187. }
  188.  
  189. void onZadat()
  190. {
  191.     matice ax;
  192.     int sx, cx;
  193.  
  194.     printf(" Kolik bude v rovnicich neznamych? (Takovy pak jest i pocet rovnic!)\n Poznamka: Maximalni pocet neznamych jest %.d.\n", MAX);
  195.     printf(" Zadej pocet neznamych: ");
  196.     scanf_s("%d", &sx);
  197.     while ((sx < 1) || (sx > MAX))
  198.     {
  199.         printf(" Prosim, nezadavejte nesmysly.\n");
  200.         while ((cx = getchar()) != '\n' && cx != EOF);
  201.         printf(" Zadej pocet neznamych: ");
  202.         scanf_s("%d", &sx);
  203.     }
  204.  
  205.     splitter();
  206.     plneni(sx, ax);
  207.     splitter();
  208.  
  209.     vypocet(sx, ax);
  210. }
  211.  
  212. void onSoubor()
  213. {
  214.     matice ax;
  215.     int sx;
  216.  
  217.     FILE *soubor;
  218.  
  219.     if (fopen_s(&soubor, cesta, "r") != 0)
  220.     {
  221.         printf(" Nepodarilo se otevrit soubor: %s\n", cesta);
  222.         splitter();
  223.         return;
  224.     }
  225.  
  226.     fscanf_s(soubor, "%d;\n", &sx);
  227.  
  228.     if ((sx < 1) || (sx > MAX))
  229.     {
  230.         printf(" Nepodarilo se v souboru nacist rozmer matice.\n");
  231.         return;
  232.     }
  233.  
  234.     splitter();
  235.     plneniSoubor(sx, ax, soubor);
  236.     fclose(soubor);
  237.     splitter();
  238.  
  239.     vypocet(sx, ax);
  240. }
  241.  
  242. void splitter()
  243. {
  244.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  245.     int columns = 0;
  246.  
  247.     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
  248.     columns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
  249.     printf(" ");
  250.     for (int i = 0; i < columns - 2; i++)
  251.     {
  252.         printf("~");
  253.     }
  254.     printf("\n");
  255. }
  256.  
  257. int main()
  258. {
  259.     menu volba;
  260.  
  261.     printf(" Vitejte v programu pro vypocet soustavy linearnich rovnic! Prosim vyberte cislo pozadovane operace:\n\n");
  262.  
  263.     do
  264.     {
  265.         printf(" 1: Zadat rovnice rucne\n 2: Cist rovnice ze souboru\n 3: Ukoncit program\n");
  266.         splitter();
  267.  
  268.         printf("\n Volba: ");
  269.  
  270.         if (scanf_s("%d", &volba) != 1)
  271.         {
  272.             printf(" Neplatna operace!\n");
  273.             splitter();
  274.             while ((getchar()) != '\n');
  275.             continue;
  276.         }
  277.  
  278.         switch (volba)
  279.         {
  280.             case zadavani:
  281.             {
  282.                 system("cls");
  283.                 onZadat();
  284.                 break;
  285.             }
  286.             case soubor:
  287.             {
  288.                 system("cls");
  289.                 onSoubor();
  290.                 break;
  291.             }
  292.             case konec:
  293.             {
  294.                 system("cls");
  295.                 printf("Sbohem!\n");
  296.                 Sleep(1000);
  297.                 return 1;
  298.                 break;
  299.             }
  300.             default:
  301.             {
  302.                 printf(" Neznama volba!\n");
  303.                 splitter();
  304.                 break;
  305.             }
  306.         }
  307.     } while (true);
  308.  
  309.     return 0;
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement