Задача Ю1.19. Найти координаты вершины параболы [latex]y = a{ x }^{ 2 }+bx+c[/latex]
[latex]a[/latex] | [latex]b[/latex] | [latex]c[/latex] | [latex]x[/latex] | [latex]y[/latex] | Комментарий |
1 | -2 | -3 | 1 | -4 | Пройден. |
0 | 2 | 2 | — | — | Не пройден так график y(x) не является параболой и программа оповещает об ошибке |
1 | 0 | 4 | 0 | 4 | Пройден. |
2 | 1 | 3 | -0.25 | 2.875 | Пройден. |
Мы знаем координаты вершины параболы вычисляются по формулам:
1)[latex]{ x }_{ 0 }=-\frac { b }{ 2a } [/latex]
2)[latex]{ y }_{ 0 }=a{ x }_{ 0 }^{ 2 }+b{ x }_{ 0 }+c[/latex]
(Для простоты в программе [latex]{ x }_{ 0 }[/latex] и [latex]{ y }_{ 0 }[/latex] заменены на [latex]{ x }[/latex] и [latex]{ y }[/latex] соответственно)
Теперь учтем ситуации в проработке которых могут возникнуть сложности:
Если [latex]{ a }=0[/latex], то график [latex]y(x)[/latex] не является параболой,
о чем на должен проинформировать компилятор.
Это все проблемы связанные с графиком.
Теперь проанализируем же может вызвать противоречия или ошибки,
для этого проанализируем элементы С++ которые могут вызвать ошибки или неточности:
Наиболее рационально использовать тип double, но у этого типа есть некоторая неточность, а именно (-0) — может быть принята за вполне нормальное число со знаком и компилятор безо всяких угрызений совести выведет «-0», а не 0 ( было бы логичнее ). Именно по этой причине мы вначале выполним [latex]{ x }_{ 0 }=\frac { b }{ 2a } [/latex], а потом уже, если [latex]{ x }[/latex] окажется не равным нулю, то мы умножим его на [latex]-1[/latex].
Это все сложности которые могут повстречаться на на пути реализации данной программы, так ничего не мешает нам написать данную программу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> using namespace std; int main() { double a, b, c, x, y; cin >> a >> b >> c; if( a != 0 ){ // "только если уравнение задает на графике параболу..." x = b/(2*a); // находим первую координату вершины параболы и нам остаётся только умножить результат на -1 if(x!=0) x*=-1; // в типе double 0 -- иногда получает свойства числа со знаком, поэтому дабы при b == 0 мы не получили x == -0 нам нужно умножить x на (-1) только если x != 0 } else{ // если а == 0, то график y(x) не является параболой ==> выводим на экран "Error" и закрываем программу cout << "Error"; return 0; } y = a*x*x + b*x + c; // находим вторую координату вершины параболы cout << x << ' ' << y << endl; return 0; } |
Укажите, пожалуйста, рубрику и метки (ключевые слова).
С -0 действительно странно, x=0; x*=-1; cout <<x; стабильно выдает -0. Причем, верно, что -0==0, но неверно, что -0<0.
В конце вывода желательно перейти на новую строку (endl) — например, e-olimp.com.ua к этому аспекту критичен (при проверке задач).
Выполнено!
Благодарю, за информацию, а то я думал что endl только очищает поток
Засчитано, 10 баллов.