Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
#1

Квадратное уравнение (найти ошибку) - C++

08.07.2015, 13:21. Просмотров 667. Ответов 9
Метки нет (Все метки)

Добрый день, решал вот такую задачку, однако она не проходит один из тестов, помогите найти ошибку. Также, как я понял, при отсутствии корней нужно вывести просто 0 - как-то умалчивается об этом в условии. Спасибо.

Сложно найти человека, который любит решать однообразные задачки по математике. В последнее время школьникам стало легче, ведь с появлением компьютеров почти в каждой квартире стало существенно проще проверять себя.

Но программы, в которых решение уравнений является стандартной функцией, установлены не везде. Напишите программу, которая сможет решить уравнение

ax2 + bx + c = 0

при заданных коэффициентах a, b и c.
Входные данные

Единственная строка входного файла INPUT.TXT содержит три целых числа a, b и c, каждое из которых не превосходит по модулю 30000. Числа разделяются пробелами.

Выходные данные

На первой строке выходного файла OUTPUT.TXT выведите число действительных корней заданного уравнения. Затем выведите сами корни по одному на строке с ошибкой, не превосходящей 10-4. Если для заданных коэффициентов корней бесконечно много, на единственной строке выходного файла выведите -1.

Моё решение:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iomanip>
#include <cmath>
#include <iostream>
using namespace std;
 
int main()
{
    float D, x1 ,x2,a,b,c;
    cin >> a >> b >> c;
    if (a)
    {
        D = b*b - 4 * a*c;
        if (D > 0)
        {
            x1 = (-b + sqrt(D)) / 2 * a;
            x2 = (-b - sqrt(D)) / 2 * a;
            cout << 2 << endl;
            cout << fixed << setprecision(6) << x1 << endl;
            cout << fixed << setprecision(6) << x2 << endl;
        }
        else if (D == 0)
        {
            x1 = -b / (2 * a);
            cout << 1 << endl;
            cout << fixed << setprecision(6) << x1 << endl;
        }
        else
            cout << 0 << endl;
    }
    else if (a == 0 && b == 0 && c == 0)
    {
        cout << -1 << endl;
    }
    else if (a == 0 && b != 0)
    {
        x1 = -c / b;
        cout << 1 << endl;
        cout << fixed << setprecision(6) << x1 << endl;
    }   
    else if (a == 0 && b == 0)
    {
        cout << 0 << endl;
    }
    else
    {
        return 1;
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2015, 13:21     Квадратное уравнение (найти ошибку)
Посмотрите здесь:

Квадратное уравнение - C++
всем привет!кто нибудь может написать программу решения квадратного уравнения в общем виде с комплексными коэффициентами(используя...

Квадратное уравнение - C++
ax^2+bx+c=o в c\c++

Квадратное уравнение - C++
Решил немного попрактиковаться и написать програмку для решения квадратных уравнений. И у меня вопрос - поддерживает ли С++ комплексные...

Квадратное уравнение - C++
Есть такое задание: Написать программу, которая найдет корни уравнения квадратного {a}^{2}+bx+c=0 и проверить для данных type real которые...

Квадратное уравнение - C++
Привет всем, застрял, помогите :) Ввести три вещественных числа a, b, c. Решить квадратное уравнение ax2 +bx+c=0. Вывести информацию...

квадратное уравнение - C++
Обработка исключительных ситуаций Функция вычисляет корень квадратного уравнения ax2+bx+c=0

Квадратное уравнение - C++
Пишет ошибку &quot;тип &quot;double&quot; не требуется&quot; и &quot;d: необъявленный идентификатор&quot;, помогите разобраться плз #include &quot;stdafx.h&quot; #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mr_mczakenberg
65 / 65 / 31
Регистрация: 10.04.2015
Сообщений: 281
08.07.2015, 13:32     Квадратное уравнение (найти ошибку) #2
Цитата Сообщение от Melvil Посмотреть сообщение
x1 = (-b + sqrt(D)) / (2 * a);
* * * * * * x2 = (-b - sqrt(D)) /( 2 * a);
И часть где D == 0 не очень нужна, ведь выполняется то же самое что и в D>0.
UPD: 2 корня выводите, ладно, пусть будет.
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
08.07.2015, 13:57  [ТС]     Квадратное уравнение (найти ошибку) #3
Цитата Сообщение от mr_mczakenberg Посмотреть сообщение
И часть где D == 0 не очень нужна, ведь выполняется то же самое что и в D>0.
UPD: 2 корня выводите, ладно, пусть будет.
Не очень вас понял. Ведь если D == 0, значит корень 1. Спасибо за скобки.

Добавлено через 2 минуты
Со скобками всё работает, спасибо:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iomanip>
#include <cmath>
#include <iostream>
using namespace std;
 
int main()
{
    float D, x1, x2, a, b, c;
    cin >> a >> b >> c;
    if (a)
    {
        D = b*b - 4 * a*c;
        if (D > 0)
        {
            x1 = (-b + sqrt(D)) / (2 * a);
            x2 = (-b - sqrt(D)) / (2 * a);
            cout << 2 << endl;
            cout << fixed << setprecision(6) << x1 << endl;
            cout << fixed << setprecision(6) << x2 << endl;
        }
        else if (D == 0)
        {
            x1 = -b / (2 * a);
            cout << 1 << endl;
            cout << fixed << setprecision(6) << x1 << endl;
        }
        else
            cout << 0 << endl;
    }
    else if (a == 0 && b == 0 && c == 0)
    {
        cout << -1 << endl;
    }
    else if (a == 0 && b != 0)
    {
        x1 = -c / b;
        cout << 1 << endl;
        cout << fixed << setprecision(6) << x1 << endl;
    }
    else if (a == 0 && b == 0)
    {
        cout << 0 << endl;
    }
    else
    {
        return 1;
    }
    return 0;
}
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
08.07.2015, 14:01     Квадратное уравнение (найти ошибку) #4
кстати мне кажется лучше либо всегда выводить 2 корня, либо перед выводом их сравнивать, и если они равны то выводить один раз, т.к. возможно при d>0 будет 2 одинаковых корня
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
08.07.2015, 18:58  [ТС]     Квадратное уравнение (найти ошибку) #5
Krock21rus, Всегда 2 корня выводить нельзя по условию. Даже если и будет 2 одинаковых корня это же нормально.
Даценд
Модератор
Эксперт .NET
3253 / 3168 / 1619
Регистрация: 20.04.2015
Сообщений: 5,833
08.07.2015, 19:26     Квадратное уравнение (найти ошибку) #6
Цитата Сообщение от Krock21rus Посмотреть сообщение
возможно при d>0 будет 2 одинаковых корня
не возможно
Цитата Сообщение от Melvil Посмотреть сообщение
Если для заданных коэффициентов корней бесконечно много, на единственной строке выходного файла выведите -1
так не бывает
Цитата Сообщение от Melvil Посмотреть сообщение
при отсутствии корней нужно вывести просто 0 - как-то умалчивается об этом в условии.
а если корень уравнения равен 0 (x^2=0), тогда как понимать 0 на выходе?
Если D<0, нужно либо считать комплексные корни, либо выводить сообщение об отсутствии действительных корней.
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
08.07.2015, 22:54     Квадратное уравнение (найти ошибку) #7
вводятся коэффиценты, а могут ввести коэффицент который сделает уравнение другого вида
позже пример сделаю

Добавлено через 47 минут
Цитата Сообщение от Даценд Посмотреть сообщение
не возможно
хотя да, вы правы, корень из дискриминанта в 2х вариантах имеет разный знак, а изменить а мы не можем
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
09.07.2015, 01:20  [ТС]     Квадратное уравнение (найти ошибку) #8
Цитата Сообщение от Даценд Посмотреть сообщение
так не бывает
Люди которые составляли задачу зачем-то же это указывали. Вообще, вывести -1 нужно при a = 0, b = 0, c= 0. Собственно, это есть в коде. В данной задаче учитываются только действительные корни, а если их нет, то логично предположить, что нужен 0.
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
09.07.2015, 02:49     Квадратное уравнение (найти ошибку) #9
Цитата Сообщение от Melvil Посмотреть сообщение
Со скобками всё работает,
Восемь ветвлений if/else многовато, достаточно шести:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <cmath>
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    int     a   =   0;
    int     b   =   0;
    int     c   =   0;
 
    std::cin    >>  a
                >>  b
                >>  c;
 
    std::cout   <<  a
                <<  "x^2"
 
                <<  (
                        b   >=  0
                            ?   " + "
                            :   " - "
                    )
 
                <<  abs(b)
                <<  "x"
 
                <<  (
                        c   >=  0
                            ?   " + "
                            :   " - "
                    )
 
                <<  abs(c)
                <<  " = 0"
                <<  std::endl;
 
    double  D   =   b * b - 4 * a * c;
 
    if  (
                a   ==  0
            &&  b   ==  0
        )
    {
        std::cout   <<  (
                            c   ==  0
                                ?   -1
                                :   0
                        )
 
                    <<  std::endl;
    }
    else if( a == 0 )
    {
        std::cout   <<  1
                    <<  std::endl
                    <<  -c / b
                    <<  std::endl;
    }
    else if( D < 0 )
    {
        std::cout   <<  0
                    <<  std::endl;
    }
    else if( D == 0 )
    {
        std::cout   <<  1
                    <<  std::endl
                    <<  -b / 2 / a
                    <<  std::endl;
    }
    else
    {
        std::cout   <<  2
                    <<  std::endl
                    <<  (-b - sqrt( D )) / 2 / a
                    <<  std::endl
                    <<  (-b + sqrt( D )) / 2 / a
                    <<  std::endl;
    }
 
    system("pause");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2015, 11:09     Квадратное уравнение (найти ошибку)
Еще ссылки по теме:

Квадратное уравнение - C++
Нужно написать программу: вывести три целых числа, которые есть коэффициентами квадратного уравнения, найти корни квадратного уравнения. ...

Квадратное уравнение - C++
Квадратное уравнение вида ax2+bx+c=0 (относительно x). На вход программа получает три целых числа: a, b и c, соответственно. При этом...

Квадратное уравнение - C++
Написала программу, вроде все должно работать, как должно, ан нет... Условие: у=корень квадратный из (25-икс квадрат) + 2а/х-3 ...

Квадратное уравнение - C++
Хотел написать программу которая решает квадратное уравнение.Выдает две ошибки. #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include...

С++ квадратное уравнение - C++
Здравствуйте! Подскажите с чего начать вот такую задачу решать. Спасибо всем за помощь! Задача (консольная программа). Верно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Даценд
Модератор
Эксперт .NET
3253 / 3168 / 1619
Регистрация: 20.04.2015
Сообщений: 5,833
09.07.2015, 11:09     Квадратное уравнение (найти ошибку) #10
Цитата Сообщение от Melvil Посмотреть сообщение
Люди которые составляли задачу зачем-то же это указывали.
Похоже, что люди, составившие задачу, составили общее задание, в которое просто добавляли разные уравнения.
Цитата Сообщение от Melvil Посмотреть сообщение
Вообще, вывести -1 нужно при a = 0, b = 0, c= 0.
Согласен, но только потому, что в задании не сказано, что нужно решить именно квадратное уравнение. Иначе нужно было бы делать проверку a!=0, ибо при a==0 это уже не квадратное уравнение.
Цитата Сообщение от Melvil Посмотреть сообщение
если их нет, то логично предположить, что нужен 0
ни разу не логично
Yandex
Объявления
09.07.2015, 11:09     Квадратное уравнение (найти ошибку)
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru