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

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

Восстановить пароль Регистрация
 
Melvil
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
08.07.2015, 13:21     Квадратное уравнение (найти ошибку) #1
Добрый день, решал вот такую задачку, однако она не проходит один из тестов, помогите найти ошибку. Также, как я понял, при отсутствии корней нужно вывести просто 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++ Квадратное уравнение
C++ Квадратное уравнение
C++ Квадратное уравнение
Квадратное уравнение C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
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
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
08.07.2015, 14:01     Квадратное уравнение (найти ошибку) #4
кстати мне кажется лучше либо всегда выводить 2 корня, либо перед выводом их сравнивать, и если они равны то выводить один раз, т.к. возможно при d>0 будет 2 одинаковых корня
Melvil
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
08.07.2015, 18:58  [ТС]     Квадратное уравнение (найти ошибку) #5
Krock21rus, Всегда 2 корня выводить нельзя по условию. Даже если и будет 2 одинаковых корня это же нормально.
Даценд
Модератор
 Аватар для Даценд
2526 / 2441 / 1248
Регистрация: 20.04.2015
Сообщений: 4,638
08.07.2015, 19:26     Квадратное уравнение (найти ошибку) #6
Цитата Сообщение от Krock21rus Посмотреть сообщение
возможно при d>0 будет 2 одинаковых корня
не возможно
Цитата Сообщение от Melvil Посмотреть сообщение
Если для заданных коэффициентов корней бесконечно много, на единственной строке выходного файла выведите -1
так не бывает
Цитата Сообщение от Melvil Посмотреть сообщение
при отсутствии корней нужно вывести просто 0 - как-то умалчивается об этом в условии.
а если корень уравнения равен 0 (x^2=0), тогда как понимать 0 на выходе?
Если D<0, нужно либо считать комплексные корни, либо выводить сообщение об отсутствии действительных корней.
Krock21rus
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
08.07.2015, 22:54     Квадратное уравнение (найти ошибку) #7
вводятся коэффиценты, а могут ввести коэффицент который сделает уравнение другого вида
позже пример сделаю

Добавлено через 47 минут
Цитата Сообщение от Даценд Посмотреть сообщение
не возможно
хотя да, вы правы, корень из дискриминанта в 2х вариантах имеет разный знак, а изменить а мы не можем
Melvil
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
09.07.2015, 01:20  [ТС]     Квадратное уравнение (найти ошибку) #8
Цитата Сообщение от Даценд Посмотреть сообщение
так не бывает
Люди которые составляли задачу зачем-то же это указывали. Вообще, вывести -1 нужно при a = 0, b = 0, c= 0. Собственно, это есть в коде. В данной задаче учитываются только действительные корни, а если их нет, то логично предположить, что нужен 0.
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
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++ Квадратное уравнение
Создать производные классы линейное уравнение и квадратное уравнение, в которых данная функция переопределена C++

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

Или воспользуйтесь поиском по форуму:
Даценд
Модератор
 Аватар для Даценд
2526 / 2441 / 1248
Регистрация: 20.04.2015
Сообщений: 4,638
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     Квадратное уравнение (найти ошибку)
Ответ Создать тему
Опции темы

Текущее время: 12:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru