C/C++

Правильно ли на с++ написал прогу?

Написал программу к заданию с фото, но результат выдаёт какой-то странный. Правильно ли написал? Если нет, то в чём ошибка и как исправить, чтобы было всё в порядке?
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int a=2.8, b=-0.3, c=4;
float y, x;
for (x=0.3; x<=4.8; x+ 0,25)
{
if (x<1.4)
{
y=(a+b*x)*sqrt(x*x+4);
}
else
{
if (x=1.4)
{
y=a*x*x+b*x+c;
}
else
{
if (x>1.4)
y=a/x+exp(a*b);
}
}
cout<<"\n y="<<y;
}
}
Лучше так:
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
int main()
{
double a = 2.8, b = -0.3, c = 4, d = exp(a * b), x, y;
for (x = 0.3; x <= 4.8; x += 0.25)
{
if (x < 1.4) y = (a + b * x) * sqrt(x * x + 4);
else if (fabs(x - 1.4) < 1e-15) y = a * x * x + b * x + c;
else y = a / x + d;
cout << "x = " << setprecision(2) << fixed
<< setw(4) << x << ", y =" << setprecision(14)
<< fixed << setw(17) << y << endl;
}
system("pause > nul");
return 0;
}
Если в цикле постепенно прибавлять к переменной х постоянное число 0.25, тогда в точку х=1.4 вообще не попасть, а тогда и значение у (1.4)=9.068 и соответствующее ему условие if (x == 1.4) y=a*x*x+b*x+c можно совершенно исключить. Однако если это важное условие и исключать его ни в коем случае нельзя, что было бы, например, при шаге 0.1, то тогда придётся всё переписывать, потому что компьютер даже с типом вещественных чисел double обязательно "промахнётся" и не попадёт в точку х=1.4 в силу не совсем точного представления вещественных чисел в ЭВМ (значение переменной у при этом окажется 2.4317105, а вовсе не 9.068 !). Вот потому я и вставила if (fabs(x-1.4)<1e-15). А math.h или cmath - это несущественно (причём это настолько в данной ситуации несущественно, что комментарий к моему ответу какого-то тупого, угрюмого и нудного остолопа у любого нормального человека не может вызвать ничего другого, как только лишь взрыв весёлого жизнерадостного хохота ! (✿^‿^) ). Главные ошибки здесь, конечно же, неправильно заданный тип данных и неверные операции (сложение и сравнение). Да, и ещё: такие постоянные как exp(a*b) лучше, естественно, выносить из цикла (нечего им там делать !), да в самом цикле лучше не прибавлять на каждом его шаге к аргументной переменной шаг табуляции, а вычислять аргумент более точно, чтобы он не "уплывал" в процессе табуляции, а позиционировался с максимальной точностью! И полиномы ещё вот тоже лучше всего вычислять по экономной схеме Горнера, в данном случае c+x*(b+x*a), что требует меньшего количества арифметических операций, но это здесь так - мелкая деталь !. (•‿•)
Николай Мальцев
Николай Мальцев
29 440
Лучший ответ
Данил Татаринцев Это существенно. По стандарту cmath
Про дельту не стал усложнять.
Данил Татаринцев Мне всё равно кем Вы меня считаете, но просто Вы неправильно подсказываете другим людям. Вот и всё. Повторюсь C++ не обязан поддерживать все стандарты C. Отдельный привет Microsoft компиляторам. По современному стандарту C++ должны подключать cmath. Тут какое дело - есть стандарт - ему нужно соответствовать. Когда люди начинают делать то, что не гарантированно работает - начинаются большие проблемы. Вам-бы наверное не хотелось попасть н-р в аварию из-за чувака который применил нестандартную фичу в коде, а в другом компиляторе она работает не так. И Ваши примеры с VLA в C++ один из способов заработать проблемы.

Что я угрюмый и т. д. - глупые домыслы, не соотв. действительности. Но как-бэ не мои проблемы.
Данил Татаринцев exp(a*b) - оптимизрует компилятор. Не волнуйтесь.
Данил Татаринцев Более того компилятор скорее всего построит готовую таблицу в данном случае. Ничего фактически не вычисляя в цикле вообще.
Илфат Хисм-Н Этот же скот всё вывернул таким образом, что она-де "неправильно подсказывает другим людям" - вот почему он обычный скот !..
#include < cmath > //так в C++
int a=2.8, b=-0.3, c=4; ошибка double a = 2.8, и т. д. (ну или если нужна меньшая точность - float..)
if (x=1.4) ошибка. if (x == 1.4)
x+ 0,25 ошибка x+=0.25;

if (x>1.4) - не, то, что ошибка - просто лишнее условие