Advertisement
deced

Untitled

Nov 17th, 2020
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. const double MIN_VALUE = -23170;
  5. const double MAX_VALUE = 23170;
  6. const double MIN_STEP = 0.0001;
  7. const double MAX_STEP = 0.1;
  8. using namespace std;
  9. double * inputIntervalFromConsole()
  10. {
  11.     double interval[2];
  12.     bool isIncorrect;
  13.     string input;
  14.     do {
  15.         isIncorrect = false;
  16.         cout << "\nВведите A из следующего диапазона [" << MIN_VALUE << ";" << MAX_VALUE << "]: " << endl;
  17.         try {
  18.             cin >> input;
  19.             interval[0] = stod(input);
  20.             if ((interval[0] < MIN_VALUE) || (interval[0] > MAX_VALUE)) {
  21.                 cout << "Введено число не из диапазона! Пожалуйста, повторите попытку" << endl;
  22.                 isIncorrect = true;
  23.             }
  24.         }
  25.         catch (...) {
  26.             cout << "Ошибка! Введено не число! Пожалуйста, повторите попытку" << endl;
  27.             isIncorrect = true;
  28.         }
  29.     } while (isIncorrect);
  30.  
  31.     do {
  32.         isIncorrect = false;
  33.         printf("Введите B из следующего диапазона [%5.3f; %5.3f]: ", interval[0], MAX_VALUE);
  34.         try {
  35.             cin >> input;
  36.             interval[1] = stod(input);
  37.             if ((interval[1] < MIN_VALUE) || (interval[1] > MAX_VALUE)) {
  38.                 cout << "Введено число не из диапазона! Пожалуйста, повторите попытку" << endl;
  39.                 isIncorrect = true;
  40.             }
  41.             if (interval[1] < interval[0]) {
  42.                 cout << "Введено число не из диапазона! Пожалуйста, повторите попытку" << endl;
  43.                 isIncorrect = true;
  44.             }
  45.         }
  46.         catch (...) {
  47.             cout << "Ошибка! Введено не число! Пожалуйста, повторите попытку" << endl;
  48.             isIncorrect = true;
  49.         }
  50.     } while (isIncorrect);
  51.     return interval;
  52. }
  53.  
  54. double* inputIntervalFromFile() {
  55.     double interval[2];
  56.     string path;
  57.     ifstream file;
  58.     bool isIncorrect = true;
  59.  
  60.     do {
  61.         do {
  62.             cout << "Введите путь к файлу с интервалом" << endl;
  63.             cin >> path;
  64.             try
  65.             {
  66.                 isIncorrect = false;
  67.                 file.open(path);
  68.             }
  69.             catch (...)
  70.             {
  71.                 isIncorrect = true;
  72.                 cout << "Файл не найден" << endl;
  73.             }
  74.         } while (isIncorrect);
  75.         try {
  76.             file >> interval[0];
  77.             file >> interval[1];
  78.         }
  79.         catch (...) {
  80.             isIncorrect = true;
  81.         }
  82.         if ((interval[1] < MIN_VALUE) || (interval[1] > MAX_VALUE)) {
  83.             cout << "В файле находилось число не из диапазона! Пожалуйста, повторите попытку" << endl;
  84.             isIncorrect = true;
  85.         }
  86.         if (interval[1] < interval[0]) {
  87.             cout << "В файле находилось число не из диапазона! Пожалуйста, повторите попытку" << endl;
  88.             isIncorrect = true;
  89.         }
  90.     } while (isIncorrect);
  91.     return interval;
  92. }
  93.  
  94. double* inputInterval()
  95. {
  96.     bool isInCorrect;
  97.     string input;
  98.     double* interval = new double[2];
  99.     do {
  100.         isInCorrect = true;
  101.         cout << "Выберите режим ввода (1 - файл, 2 - консоль)" << endl;
  102.         cin >> input;
  103.         if (input == "1") {
  104.             interval = inputIntervalFromFile();
  105.             isInCorrect = false;
  106.         }
  107.         else if (input == "2") {
  108.             interval = inputIntervalFromConsole();
  109.             isInCorrect = false;
  110.         }
  111.     } while (isInCorrect);
  112.     printf("Указанный промежуток: [%5.3f; %5.3f]", interval[0], interval[1]);
  113.     return interval;
  114. }
  115.  
  116. static double inputStep() {
  117.     bool isIncorrect;
  118.     string input;
  119.     double step = 0;
  120.     do {
  121.         isIncorrect = false;
  122.         printf("\nВведите шаг поиска значения из следующего диапазона [%6.4f; %3.1f]: ", MIN_STEP, MAX_STEP);
  123.         try {
  124.             cin >> input;
  125.             step = stod(input);
  126.             if ((step < MIN_STEP) || (step > MAX_STEP)) {
  127.                 cout << "Введено число не из диапазона! Пожалуйста, повторите попытку" << endl;
  128.                 isIncorrect = true;
  129.             }
  130.         }
  131.         catch (...) {
  132.             cout << "Ошибка! Введено не число! Пожалуйста, повторите попытку" << endl;
  133.             isIncorrect = true;
  134.         }
  135.     } while (isIncorrect);
  136.     return step;
  137. }
  138.  
  139. // 4 cycle
  140. static double findMaxValue(double interval[], double step) {
  141.  
  142.     double y, x, max = 0;
  143.     x = interval[0];
  144.     y = (2 * x + 3) / (2 * x * x - 3 * x + 4);
  145.     max = y;
  146.     while (x < interval[1]) {
  147.         y = (2 * x + 3) / (2 * x * x - 3 * x + 4);
  148.         if (y > max) {
  149.             max = y;
  150.         }
  151.         x = x + step;
  152.     }
  153.     return max;
  154. }
  155.  
  156. static void writeOutputToFile(double max) {
  157.     ofstream file("output.txt");
  158.     file<<"Наибольшее значение данной функции на заданном промежутке = "<< max;
  159.     file.close();
  160. }
  161.  
  162. int main()
  163. {
  164.     setlocale(LC_ALL, "Russian");
  165.     double step, max;
  166.     cout << "Данная программа находит наибольшее значение y = (2 * x + 3) / (2 * x^2 - 3 * x + 4) функции на промежутке [a; b]." << endl;
  167.     double* interval = inputInterval();
  168.     step = inputStep();
  169.     max = findMaxValue(interval, step);
  170.     printf("Наибольшее значение данной функции на заданном промежутке = %5.3f", max);
  171.     writeOutputToFile(max);
  172.  
  173. }
  174.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement