Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

08.07.2015, 13:21. Просмотров 763. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2015, 13:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Квадратное уравнение (найти ошибку) (C++):

Создать производные классы линейное уравнение и квадратное уравнение, в которых данная функция переопределена - C++
Создать абстрактный базовый класс уравнение с виртуальной функцией - корни уравнения. Создать производные классы линейное уравнение и...

Квадратное уравнение - C++
вопрос такой почему у меня все время ошибки в этом коде (Квадратное уравнение) Пишу в этот раздел тк я в C++ два дня #include...

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

Квадратное уравнение - C++
Здравствуйте! Это код квадратного уравнение. Компилируется все нормально. Но программа не выполняет поиск корней, если D&gt;0 и D=0....

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

квадратное уравнение - C++
написать функции вычисления квадрат.уравнения

9
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 корня выводите, ладно, пусть будет.
1
Melvil
48 / 47 / 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;
}
0
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
08.07.2015, 14:01 #4
кстати мне кажется лучше либо всегда выводить 2 корня, либо перед выводом их сравнивать, и если они равны то выводить один раз, т.к. возможно при d>0 будет 2 одинаковых корня
0
Melvil
48 / 47 / 13
Регистрация: 20.05.2015
Сообщений: 251
08.07.2015, 18:58  [ТС] #5
Krock21rus, Всегда 2 корня выводить нельзя по условию. Даже если и будет 2 одинаковых корня это же нормально.
0
Даценд
Модератор
Эксперт .NET
3516 / 3437 / 1770
Регистрация: 20.04.2015
Сообщений: 6,340
08.07.2015, 19:26 #6
Цитата Сообщение от Krock21rus Посмотреть сообщение
возможно при d>0 будет 2 одинаковых корня
не возможно
Цитата Сообщение от Melvil Посмотреть сообщение
Если для заданных коэффициентов корней бесконечно много, на единственной строке выходного файла выведите -1
так не бывает
Цитата Сообщение от Melvil Посмотреть сообщение
при отсутствии корней нужно вывести просто 0 - как-то умалчивается об этом в условии.
а если корень уравнения равен 0 (x^2=0), тогда как понимать 0 на выходе?
Если D<0, нужно либо считать комплексные корни, либо выводить сообщение об отсутствии действительных корней.
0
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
08.07.2015, 22:54 #7
вводятся коэффиценты, а могут ввести коэффицент который сделает уравнение другого вида
позже пример сделаю

Добавлено через 47 минут
Цитата Сообщение от Даценд Посмотреть сообщение
не возможно
хотя да, вы правы, корень из дискриминанта в 2х вариантах имеет разный знак, а изменить а мы не можем
0
Melvil
48 / 47 / 13
Регистрация: 20.05.2015
Сообщений: 251
09.07.2015, 01:20  [ТС] #8
Цитата Сообщение от Даценд Посмотреть сообщение
так не бывает
Люди которые составляли задачу зачем-то же это указывали. Вообще, вывести -1 нужно при a = 0, b = 0, c= 0. Собственно, это есть в коде. В данной задаче учитываются только действительные корни, а если их нет, то логично предположить, что нужен 0.
0
Mr.X
Эксперт С++
3051 / 1696 / 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");
}
0
Даценд
Модератор
Эксперт .NET
3516 / 3437 / 1770
Регистрация: 20.04.2015
Сообщений: 6,340
09.07.2015, 11:09 #10
Цитата Сообщение от Melvil Посмотреть сообщение
Люди которые составляли задачу зачем-то же это указывали.
Похоже, что люди, составившие задачу, составили общее задание, в которое просто добавляли разные уравнения.
Цитата Сообщение от Melvil Посмотреть сообщение
Вообще, вывести -1 нужно при a = 0, b = 0, c= 0.
Согласен, но только потому, что в задании не сказано, что нужно решить именно квадратное уравнение. Иначе нужно было бы делать проверку a!=0, ибо при a==0 это уже не квадратное уравнение.
Цитата Сообщение от Melvil Посмотреть сообщение
если их нет, то логично предположить, что нужен 0
ни разу не логично
0
09.07.2015, 11:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2015, 11:09
Привет! Вот еще темы с ответами:

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

Квадратное уравнение в с - C++
Здравствуйте. Надо найти корни квадратного уравнения или показать что один корень или нет корней. Нужно сделать в с, а не в с++. Please,...

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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