Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <string>
- #include <iostream>
- using namespace std;
- string inputPathToFile();
- void checkExtension(string* path);
- int inputNumber(int minNumber, int maxNumber) {
- bool isIncorrect;
- int number;
- string input = "";
- do {
- getline(cin, input);
- isIncorrect = false;
- try {
- number = stoi(input);
- }
- catch (invalid_argument ex) {
- cout << "Нужно ввести целое число.\n";
- isIncorrect = true;
- }
- catch (out_of_range ex) {
- cout << "Нужно ввести число, которое не меньше " << minNumber << " и не больше " << maxNumber << "\n";
- isIncorrect = true;
- }
- if (!isIncorrect && (number < minNumber || number > maxNumber)) {
- cout << "Нужно ввести число, которое не меньше " << minNumber << " и не больше " << maxNumber << "\n";
- isIncorrect = true;
- }
- } while (isIncorrect);
- return number;
- }
- int chooseWayOfInput() {
- const int CONSOLE_INPUT = 1;
- const int FILE_INPUT = 2;
- int userWay;
- do {
- cout << "Выберите способ ввода: \nНажмите '1', если хотите ввести отрезок через консоль.\nНажмите '2', если хотите считать отрезок из файла.\n";
- userWay = inputNumber(1, 2);
- } while (userWay != CONSOLE_INPUT && userWay != FILE_INPUT);
- return userWay;
- }
- void checkExtension(string* path)
- {
- bool isIncorrect;
- int lastIndex;
- do {
- isIncorrect = false;
- lastIndex = (*path).length() - 1;
- if ((*path)[lastIndex] != 't' || (*path)[lastIndex - 1] != 'x' || (*path)[lastIndex - 2] != 't' || (*path)[lastIndex - 3] != '.')
- {
- isIncorrect = true;
- cout << "Файл имеет неверное расширение. ";
- *path = inputPathToFile();
- }
- } while (isIncorrect);
- }
- string inputPathToFile() {
- string path;
- bool isIncorrect, isNotCorrect;
- cout << "Введите путь к файлу:\n";
- do {
- isNotCorrect = false;
- do {
- isIncorrect = false;
- cin >> path;
- ifstream fin(path);
- if (!fin.is_open())
- {
- cout << "Файл не найден. ";
- isIncorrect = false;
- }
- else {
- fin.close();
- }
- } while (isIncorrect);
- checkExtension(&path);
- } while (isNotCorrect);
- return path;
- }
- int receiveXStartFromFile(string* path)
- {
- const int MAX_BORDER = 100;
- bool isIncorrect;
- int xStart;
- do {
- isIncorrect = false;
- ifstream fin(*path);
- fin >> xStart;
- if (abs(xStart) > MAX_BORDER)
- {
- isIncorrect = true;
- cout << "Некорректные данные в файле. ";
- *path = inputPathToFile();
- }
- fin.close();
- } while (isIncorrect);
- return xStart;
- }
- int receiveXEndFromFile(string* path)
- {
- const int MAX_BORDER = 100;
- bool isIncorrect;
- int xEnd;
- do {
- isIncorrect = false;
- ifstream fin(*path);
- fin.ignore(2);
- fin >> xEnd;
- if (abs(xEnd) > MAX_BORDER)
- {
- isIncorrect = true;
- cout << "Некорректные данные в файле. ";
- *path = inputPathToFile();
- }
- fin.close();
- } while (isIncorrect);
- return xEnd;
- }
- double searchMaxFunctionValue(int* range) {
- double maxValue, y, x;
- x = range[0];
- maxValue = (2 * x) / (2 * x * x - 3 * x + 4);
- while (x <= range[1])
- {
- y = (2 * x + 3) / (2 * x * x - 3 * x + 4);
- x += 0.01;
- if (y > maxValue)
- {
- maxValue = y;
- }
- }
- maxValue = floor(maxValue * 1000) / 1000;
- return maxValue;
- }
- void resaultOutput(int* range, double maxFunctionValue)
- {
- cout << "Наибольшее значение функции y=(2x + 3)/(2x^2 - 3x + 4) на отрезке [" << range[0] << "," << range[1] << "] = " << maxFunctionValue;
- }
- int inputXStart()
- {
- int xStart;
- bool isIncorrect;
- cout << "Введите первую границу:\n";
- do {
- isIncorrect = false;
- xStart = inputNumber(-100, 100);
- } while (isIncorrect);
- return xStart;
- }
- int inputXEnd()
- {
- int xEnd;
- bool isIncorrect;
- cout << "Введите вторую границу:\n";
- do {
- isIncorrect = false;
- xEnd = inputNumber(-100, 100);
- } while (isIncorrect);
- return xEnd;
- }
- int* receiveRange(int userWay)
- {
- int xStart = 0;
- int xEnd = 0;
- string path;
- switch (userWay)
- {
- case 1:
- {
- xStart = inputXStart();
- xEnd = inputXEnd();
- break;
- }
- case 2:
- {
- path = inputPathToFile();
- xStart = receiveXStartFromFile(&path);
- xEnd = receiveXEndFromFile(&path);
- break;
- }
- }
- int matrix[2]{ xStart, xEnd };
- return matrix;
- }
- int* sortRange(int* range)
- {
- if (range[0] > range[1])
- {
- range[0] = range[0] + range[1];
- range[1] = range[0] - range[1];
- range[0] = range[0] - range[1];
- }
- return range;
- }
- void printResultInFile(string path, int* range, int maxFunctionValue)
- {
- bool isIncorrect;
- do {
- isIncorrect = false;
- checkExtension(&path);
- ofstream fout(path, ios::trunc);
- if (fout.is_open()) {
- fout << "Наибольшее значение функции y=(2x + 3)/(2x^2 - 3x + 4) на отрезке [" << range[0] << "," << range[1] << "] = " << maxFunctionValue;
- fout.close();
- }
- else {
- cout << "Файл закрыт для записи. \n";
- isIncorrect = true;
- path = inputPathToFile();
- }
- } while (isIncorrect);
- }
- void userWayOfOutput(int* range, double maxFunctionValue)
- {
- char userWay;
- const char PRINT_TO_FILE = '1';
- cout << "\nЕсли хотите записать результат в файл, введите '1'. Если не хотите - введите другой символ:\n";
- cin >> userWay;
- if (userWay == PRINT_TO_FILE)
- {
- string path = inputPathToFile();
- printResultInFile(path, range, maxFunctionValue);
- cout << "Результат записан в файл. \n";
- }
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- cout << "Программа находит максимальное значение функции y=(2x + 3)/(2x^2 - 3x + 4) на отрезке [a,b].\n";
- int userWay;
- double maxFunctionValue;
- userWay = chooseWayOfInput();
- int* range = receiveRange(userWay);
- range = sortRange(range);
- maxFunctionValue = searchMaxFunctionValue(range);
- resaultOutput(range, maxFunctionValue);
- userWayOfOutput(range, maxFunctionValue);
- cout << "Программа завершена";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement