Как сделать проверку на выход из графика?
Помогите пожалуйста, мне необходимо задать границы графика, и если при табулировании график выходит за границы вывести значения, что тут график не существует.
Поставленная задача:
Разработать консольное приложение, производящее табулирование заданной функции в задаваемом диапазоне с задаваемым числом шагов, а также, определение минимального и максимального из выводимых значений функции. Но преподаватель сказал сделать еще проверки, мне необходимо найти границы графика и как-то их задать, чтобы когда табулирование доходило до этих значений выводило значение не найдено.
Решение:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
setlocale(LC_ALL, "russian");
double x;
double final;
double Func;
double step;
double max;
double min;
double i;
bool t = false;
ofstream out;
// Проверка на то, что вводится числа, а не другие символы
while (!t) {
cout << "Введите начальное значение: ";
cin >> x;
if (cin.good()) {
t = true;
}
else {
cout << "Введено неверное значение!" << endl;
cin.clear();
cin.ignore();
}
if (t == 1) {
break;
}
}
//
cout << "Введите конечное значение: ";
cin >> final;
cout << "Введите шаг: ";
cin >> step;
out.open("test.txt");
i = x;
min = (x * x - pow(2.3, x)) * (x + exp(2 * x)) / (x + log(pow(x, x) + 1));
max = min;
while (i <= final) {
Func = (i * i - pow(2.3, i)) * (i + exp(2 * i)) / (i + log(pow(i, i) + 1));
if (Func > max) {
max = Func;
}
if (Func < min) {
min = Func;
}
cout << "i= " << i << endl;
out << "i= " << i << endl;
cout << "Func= " << Func << endl;
out << "Func= " << Func << endl;
i += step;
}
cout << "min= " << min << endl;
out << "min= " << min << endl;
cout << "max= " << max;
out << "max= " << max;
out.close();
}
Ответы (1 шт):
в основном ваш код делает то, что требуется, но..
№1:
не совсем понятна его первая часть:
bool t = true;
// Проверка на то, что вводится числа, а не другие символы
while (!t) {
cout << "Введите начальное значение: ";
cin >> x;
if (cin.good()) {
t = true;
}
else {
cout << "Введено неверное значение!" << endl;
cin.clear();
cin.ignore();
}
if (t == 1) {
break;
}
}
что это? зачем? почему только для одной переменной?
и кстати зачем так усложнен код - лишние переменные и условия, можно же сделать так:
while (true) {
cout << "enter: ";
cin >> x;
if (cin.good())
break;
cout << "wrong!" << endl;
cin.clear();
cin.ignore();
}
№2:
теперь вы строите график (вычисляете значение функции) от x до final с шагом step
Так и надо?
Лично я думал, что надо задать 3 параметра left, right, step - левую границу, правую границу и шаг, с которым надо двигаться
№3
теперь касательно области определения функции - посмотрите на свою функцию
Func = (i * i - pow(2.3, i)) * (i + exp(2 * i)) / (i + log(pow(i, i) + 1));
в ней есть
- логарифм, у которого есть определённая область определения,
- знаменатель, у которого тоже есть особая точка
x^x(pow(i, i)) у которой тоже не все так просто
простой пример - надо построить график функции y = sqrt(x) между точками -10..+10, а функция существует только в точках 0.., значит остальные точки -10..0 надо пропустить
теперь понятно что вам надо сделать?
вам надо определить область определения вашей функции и скорректировать left, right, которые ввел пользователь
№4
ну и зачем усложнять код всякими while когда у вас есть for:
for (double x = left; x <= right; x+= step)