Advertisement
fqrmix

Untitled

Feb 26th, 2017
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.82 KB | None | 0 0
  1. #include "functions.h"
  2. #include "functions_of_lab.h"
  3.  
  4. using namespace std;
  5.  
  6. void SetColor(ConsoleColor text, ConsoleColor background)
  7. {
  8.     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  9.     SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
  10. }
  11.  
  12. double xx0, xx1; // промежуток в ответе шагового метода
  13. double a = 1, b = 3, h = 0.1, e = 0.001; // исходные данные
  14.  
  15. double function(double x)
  16. {
  17.     return (3 * pow(log(x), 2) + 6 * log(x) - 5); // Сюда короч нашу исходную функцию из варианта своего вбиваем.
  18. }
  19. double derivative(double x)
  20. {
  21.     return ((6 * (log(x) + 1)) / x); // Сюда короч производную от этой исходной функции.
  22. }
  23. double S(double x)
  24. {
  25.     return x - 0.005 * function(x); // Эт я сам не понял(lol), но короче, это типо по такой схеме -  g(x) = x + b*f(x), b - константа.
  26. }
  27.  
  28. void _Start()
  29. {
  30.     double x0 = a, x1 = x0 + h;
  31.     while (x1 <= b)
  32.     {
  33.         x1 = x0 + h;
  34.         if (function(x0) * function(x1) < 0)
  35.         {
  36.             xx0 = x0;
  37.             xx1 = x1;
  38.         }
  39.         x0 = x1;
  40.     }
  41. }
  42.  
  43. void step_method() // Шаговый метод.
  44. {
  45.     double x0 = a, x1 = x0 + h;
  46.     while (x1 <= b)
  47.     {
  48.         x1 = x0 + h;
  49.         if (function(x0) * function(x1) < 0)
  50.         {
  51.             cout << "\nStep method:\n";
  52.             cout << "x on int. [" << x0 << "," << x1 << "]\n" << endl;
  53.             xx0 = x0;
  54.             xx1 = x1;
  55.         }
  56.         x0 = x1;
  57.     }
  58. }
  59.  
  60. void bisection_method() // Метод половинного деления.
  61. {
  62.     double x = xx0,
  63.            a1 = xx0,
  64.            b1 = xx1;
  65.     while (fabs(function(x)) > e)
  66.     {
  67.         x = (a1 + b1) / 2;
  68.         if (function(a) * function(x) < 0)
  69.             b1 = x;
  70.         else a1 = x;
  71.     }
  72.     cout << "\nBisection method:\nx= " << x << "\n" << endl;
  73. }
  74.  
  75. void newton_method() // Метод Ньютона.
  76. {
  77.     double x2 = xx0;
  78.     while (fabs(function(x2)) > e)
  79.     {
  80.         x2 = x2 - function(x2) / derivative(x2);
  81.     }
  82.     cout << "\nNewton's method:\nx= " << x2 << "\n" << endl;
  83. }
  84.  
  85. void fixed_point_iteration() // Метод простой итерации.
  86. {
  87.     double x3 = xx0;
  88.     while (fabs(function(x3)) > e)
  89.     {
  90.         x3 = S(x3);
  91.     }
  92.     cout << "\nFixed-point iteration method:\nx= " << x3 << "\n" << endl;
  93. }
  94.  
  95. void change_default_values(double *a, double *b, double *h, double *e)
  96. {
  97.     cout << "\nВведите начало интервала\n";
  98.     cin >> *a;
  99.     cout << "Конец интервала\n";
  100.     cin >> *b;
  101.     cout << "Введите шаг\n";
  102.     cin >> *h;
  103.     cout << "Введите погрешность\n";
  104.     cin >> *e;
  105. }
  106.  
  107. void enter_menu(unsigned int ActivePointOfMenu)
  108. {
  109.     printf("Управление: Вниз - s, Вверх - w, Выбор - Enter, Выйти - Esc\n");
  110.     printf("%sВывести результат шагового метода\n", ActivePointOfMenu == 1 ? ">>" : "  ");
  111.     printf("%sВывести результат метода половинного деления\n", ActivePointOfMenu == 2 ? ">>" : "  ");
  112.     printf("%sВывести результат метода Ньютона\n", ActivePointOfMenu == 3 ? ">>" : "  ");
  113.     printf("%sВывести результат метода простой итерации\n", ActivePointOfMenu == 4 ? ">>" : "  ");
  114.     printf("%sИзменить исходные данные\n", ActivePointOfMenu == 5 ? ">>" : "  ");
  115.     printf("Semen Sergeev, 2017");
  116. }
  117.  
  118. void exit_menu(unsigned int ActivePointOfMenu)
  119. {
  120.     int key;
  121.     system("cls");
  122.     printf("Вы уверены, что хотите выйти? Y/N");
  123.     for (;;)
  124.     {
  125.         if (!_kbhit())
  126.             key = _getch();
  127.  
  128.         if (key == 'y')
  129.         {
  130.             for (unsigned i = 0; i < 3; i++)
  131.             {
  132.                 system("cls");
  133.                 printf("Выход через %u...\n", i + 1);
  134.                 Sleep(1000);
  135.  
  136.             }
  137.             exit(EXIT_SUCCESS);
  138.         }
  139.         else if (key == 'n')
  140.         {
  141.             system("cls");
  142.             enter_menu(ActivePointOfMenu);
  143.             break;
  144.         }
  145.     }
  146. }
  147.  
  148. void show_choosen_point(unsigned int ActivePointOfMenu)
  149. {
  150.  
  151.     switch (ActivePointOfMenu)
  152.     {
  153.     case 1:
  154.         system("cls");
  155.         step_method();
  156.         return_to_menu(ActivePointOfMenu);
  157.         break;
  158.     case 2:
  159.     {
  160.         system("cls");
  161.         bisection_method();
  162.         return_to_menu(ActivePointOfMenu);
  163.         break;
  164.     }
  165.     case 3:
  166.     {
  167.         system("cls");
  168.         newton_method();
  169.         return_to_menu(ActivePointOfMenu);
  170.         break;
  171.     }
  172.     case 4:
  173.     {
  174.         system("cls");
  175.         fixed_point_iteration();
  176.         return_to_menu(ActivePointOfMenu);
  177.         break;
  178.     }
  179.     case 5:
  180.     {
  181.         system("cls");
  182.         change_default_values(&a, &b, &h, &e);
  183.         return_to_menu(ActivePointOfMenu);
  184.         break;
  185.     }
  186.     }
  187.  
  188. }
  189.  
  190. void return_to_menu(unsigned int ActivePointOfMenu)
  191. {
  192.     int key_menu;
  193.             printf("Нажмите Backspace для возвращения в меню...\n");
  194.         for (;;)
  195.         {
  196.             if (!_kbhit())
  197.             {
  198.                 key_menu = _getch();
  199.                 if (key_menu == 8)
  200.                 {
  201.                     system("cls");
  202.                     enter_menu(ActivePointOfMenu);
  203.                     break;
  204.                 }
  205.             }
  206.  
  207.         }
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement