Advertisement
believe_me

Untitled

Oct 29th, 2021
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.29 KB | None | 0 0
  1. #include <fstream>
  2. #include <string>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. string inputPathToFile();
  8.  
  9. void checkExtension(string* path);
  10.  
  11. int inputNumber(int minNumber, int maxNumber) {
  12.     bool isIncorrect;
  13.     int number;
  14.     string input = "";
  15.     do {
  16.         getline(cin, input);
  17.         isIncorrect = false;
  18.         try {
  19.             number = stoi(input);
  20.         }
  21.         catch (invalid_argument ex) {
  22.             cout << "Нужно ввести целое число.\n";
  23.             isIncorrect = true;
  24.         }
  25.         catch (out_of_range ex) {
  26.             cout << "Нужно ввести число, которое не меньше " << minNumber << " и не больше " << maxNumber << "\n";
  27.             isIncorrect = true;
  28.         }
  29.         if (!isIncorrect && (number < minNumber || number > maxNumber)) {
  30.             cout << "Нужно ввести число, которое не меньше " << minNumber << " и не больше " << maxNumber << "\n";
  31.             isIncorrect = true;
  32.         }
  33.     } while (isIncorrect);
  34.     return number;
  35. }
  36.  
  37. int chooseWayOfInput() {
  38.     const int CONSOLE_INPUT = 1;
  39.     const int FILE_INPUT = 2;
  40.     int userWay;
  41.     do {
  42.         cout << "Выберите способ ввода: \nНажмите '1', если хотите ввести отрезок через консоль.\nНажмите '2', если хотите считать отрезок из файла.\n";
  43.         userWay = inputNumber(1, 2);
  44.     } while (userWay != CONSOLE_INPUT && userWay != FILE_INPUT);
  45.     return userWay;
  46. }
  47.  
  48. void checkExtension(string* path)
  49. {
  50.     bool isIncorrect;
  51.     int lastIndex;
  52.     do {
  53.         isIncorrect = false;
  54.         lastIndex = (*path).length() - 1;
  55.         if ((*path)[lastIndex] != 't' || (*path)[lastIndex - 1] != 'x' || (*path)[lastIndex - 2] != 't' || (*path)[lastIndex - 3] != '.')
  56.         {
  57.             isIncorrect = true;
  58.             cout << "Файл имеет неверное расширение. ";
  59.             *path = inputPathToFile();
  60.         }
  61.     } while (isIncorrect);
  62. }
  63.  
  64. string inputPathToFile() {
  65.     string path;
  66.     bool isIncorrect, isNotCorrect;
  67.     cout << "Введите путь к файлу:\n";
  68.     do {
  69.         isNotCorrect = false;
  70.         do {
  71.             isIncorrect = false;
  72.             cin >> path;
  73.             ifstream fin(path);
  74.             if (!fin.is_open())
  75.             {
  76.                 cout << "Файл не найден. ";
  77.                 isIncorrect = false;
  78.             }
  79.             else {
  80.                 fin.close();
  81.             }
  82.         } while (isIncorrect);
  83.         checkExtension(&path);
  84.     } while (isNotCorrect);
  85.     return path;
  86. }
  87.  
  88. int receiveXStartFromFile(string* path)
  89. {
  90.     const int MAX_BORDER = 100;
  91.     bool isIncorrect;
  92.     int xStart;
  93.     do {
  94.         isIncorrect = false;
  95.         ifstream fin(*path);
  96.         fin >> xStart;
  97.         if (abs(xStart) > MAX_BORDER)
  98.         {
  99.             isIncorrect = true;
  100.             cout << "Некорректные данные в файле. ";
  101.             *path = inputPathToFile();
  102.         }
  103.         fin.close();
  104.     } while (isIncorrect);
  105.     return xStart;
  106. }
  107.  
  108. int receiveXEndFromFile(string* path)
  109. {
  110.     const int MAX_BORDER = 100;
  111.     bool isIncorrect;
  112.     int xEnd;
  113.     do {
  114.         isIncorrect = false;
  115.         ifstream fin(*path);
  116.         fin.ignore(2);
  117.         fin >> xEnd;
  118.         if (abs(xEnd) > MAX_BORDER)
  119.         {
  120.             isIncorrect = true;
  121.             cout << "Некорректные данные в файле. ";
  122.             *path = inputPathToFile();
  123.         }
  124.         fin.close();
  125.     } while (isIncorrect);
  126.     return xEnd;
  127. }
  128.  
  129. double searchMaxFunctionValue(int* range) {
  130.     double maxValue, y, x;
  131.     x = range[0];
  132.     maxValue = (2 * x) / (2 * x * x - 3 * x + 4);
  133.     while (x <= range[1])
  134.     {
  135.         y = (2 * x + 3) / (2 * x * x - 3 * x + 4);
  136.         x += 0.01;
  137.         if (y > maxValue)
  138.         {
  139.             maxValue = y;
  140.         }
  141.     }
  142.     maxValue = floor(maxValue * 1000) / 1000;
  143.     return maxValue;
  144. }
  145.  
  146. void resaultOutput(int* range, double maxFunctionValue)
  147. {
  148.     cout << "Наибольшее значение функции y=(2x + 3)/(2x^2 - 3x + 4) на отрезке [" << range[0] << "," << range[1] << "] = " << maxFunctionValue;
  149. }
  150.  
  151. int inputXStart()
  152. {
  153.     int xStart;
  154.     bool isIncorrect;
  155.     cout << "Введите первую границу:\n";
  156.     do {
  157.         isIncorrect = false;
  158.         xStart = inputNumber(-100, 100);
  159.     } while (isIncorrect);
  160.     return xStart;
  161. }
  162.  
  163. int inputXEnd()
  164. {
  165.     int xEnd;
  166.     bool isIncorrect;
  167.     cout << "Введите вторую границу:\n";
  168.     do {
  169.         isIncorrect = false;
  170.         xEnd = inputNumber(-100, 100);
  171.     } while (isIncorrect);
  172.     return xEnd;
  173. }
  174.  
  175. int* receiveRange(int userWay)
  176. {
  177.     int xStart = 0;
  178.     int xEnd = 0;
  179.     string path;
  180.     switch (userWay)
  181.     {
  182.     case 1:
  183.     {
  184.         xStart = inputXStart();
  185.         xEnd = inputXEnd();
  186.         break;
  187.     }
  188.     case 2:
  189.     {
  190.         path = inputPathToFile();
  191.         xStart = receiveXStartFromFile(&path);
  192.         xEnd = receiveXEndFromFile(&path);
  193.         break;
  194.     }
  195.     }
  196.     int matrix[2]{ xStart, xEnd };
  197.     return matrix;
  198. }
  199.  
  200. int* sortRange(int* range)
  201. {
  202.     if (range[0] > range[1])
  203.     {
  204.         range[0] = range[0] + range[1];
  205.         range[1] = range[0] - range[1];
  206.         range[0] = range[0] - range[1];
  207.     }
  208.     return range;
  209. }
  210.  
  211. void printResultInFile(string path, int* range, int maxFunctionValue)
  212. {
  213.     bool isIncorrect;
  214.     do {
  215.         isIncorrect = false;
  216.         checkExtension(&path);
  217.         ofstream fout(path, ios::trunc);
  218.         if (fout.is_open()) {
  219.             fout << "Наибольшее значение функции y=(2x + 3)/(2x^2 - 3x + 4) на отрезке [" << range[0] << "," << range[1] << "] = " << maxFunctionValue;
  220.             fout.close();
  221.         }
  222.         else {
  223.             cout << "Файл закрыт для записи. \n";
  224.             isIncorrect = true;
  225.             path = inputPathToFile();
  226.         }
  227.     } while (isIncorrect);
  228. }
  229.  
  230. void userWayOfOutput(int* range, double maxFunctionValue)
  231. {
  232.     char userWay;
  233.     const char PRINT_TO_FILE = '1';
  234.     cout << "\nЕсли хотите записать результат в файл, введите '1'. Если не хотите - введите другой символ:\n";
  235.     cin >> userWay;
  236.     if (userWay == PRINT_TO_FILE)
  237.     {
  238.         string path = inputPathToFile();
  239.         printResultInFile(path, range, maxFunctionValue);
  240.         cout << "Результат записан в файл. \n";
  241.     }
  242. }
  243.  
  244. int main()
  245. {
  246.     setlocale(LC_ALL, "Russian");
  247.     cout << "Программа находит максимальное значение функции y=(2x + 3)/(2x^2 - 3x + 4) на отрезке [a,b].\n";
  248.     int userWay;
  249.     double maxFunctionValue;
  250.     userWay = chooseWayOfInput();
  251.     int* range = receiveRange(userWay);
  252.     range = sortRange(range);
  253.     maxFunctionValue = searchMaxFunctionValue(range);
  254.     resaultOutput(range, maxFunctionValue);
  255.     userWayOfOutput(range, maxFunctionValue);
  256.     cout << "Программа завершена";
  257.     return 0;
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement