1

Тема: Задача на С++

Розписати задачу на с++, а саме  розв'язок квадратичної нерівності --> (ax^2-bx<=c) (Описати детальніше 3 випадки дискримінанту, один з яких коли дискримінант > 0, та описати усі можливі випадики коли a<0, a==0 та коли a>0,  які можливі проміжки. Буду дуже вдячний! #ПРИМІТКА: після компіляції програми, користувач повинен сам ввести 3 значення a, b та c.

2

Re: Задача на С++

І де ж ваш код?

Подякували: vzaluskiy231

3 Востаннє редагувалося FakiNyan (14.05.2022 16:24:08)

Re: Задача на С++

ну це дуже просте завдання як на мене, якихось іфів хвате. А ви можете розв'язати ту нерівність на папері? Бо воно ж як завжди - викладачі-дегенерати не здатні навчати програмуванню, вони навчають математики через програмування.

Подякували: bebyk, Ollloppollo, leofun013

4

Re: Задача на С++

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;

int main() {
    //ax^2-bx<=c   x^2-3x+2<=0 >0 , x^2-3x+4<=0
    double a, b, c;
    cout << "Vvedit znachenna a: " << endl;
    cin >> a;
    cout << "Vvedit znachenna b: " << endl;
    cin >> b;
    cout << "Vvedit znachenna c: " << endl;
    cin >> c;
    double d = b * b - 4 * a * (-c);
    if (d < 0) {
        cout << "Rivnшіе nemae rozviazkiv, oskilki D<0!\n";
    }
    else if (d == 0) {
        double x0 = -b / 2*a;
        cout << "X e (-inf;" << x0 << "]\n";
    }
    else if (d > 0) {
        double x1 = b - sqrt(d) / 2 * a;
        double x2 = b + sqrt(d) / 2 * a;
        //тут має ще бути випадки коли a<0, a==0, a>0

        }
    }
    return 0;
}

5

Re: Задача на С++

vzaluskiy23 написав:

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;


int main() {
    //ax^2-bx<=c   x^2-3x+2<=0 >0 , x^2-3x+4<=0
    double a, b, c;
    cout << "Vvedit znachenna a: " << endl;
    cin >> a;
    cout << "Vvedit znachenna b: " << endl;
    cin >> b;
    cout << "Vvedit znachenna c: " << endl;
    cin >> c;
    double d = b * b - 4 * a * (-c);
    if (d < 0) {
        cout << "Rivnшіе nemae rozviazkiv, oskilki D<0!\n";
    }
    else if (d == 0) {
        double x0 = -b / 2*a;
        cout << "X e (-inf;" << x0 << "]\n";
    }
    else if (d > 0) {
        double x1 = b - sqrt(d) / 2 * a;
        double x2 = b + sqrt(d) / 2 * a;
        //тут має ще бути випадки коли a<0, a==0, a>0

        }
    }

    return 0;

}

ну то додайте необхідні if'и і код до них

6

Re: Задача на С++

У вас не розписаний випадок a==0 - при цьому не буде ніякого дискримінанту.
Далі - у вас в умові нерівність не в канонічній формі, тому там купа мороки зі знаками. Наприклад, при d==0 корінь буде b/(2*a). До речі, дужки ви теж забули.
Ну і взагалі ви в курсі, як такі нерівності розв'язувати?

7

Re: Задача на С++

Я знаю що потрібно просто розвязати як квадратичне рівняння, корені його розставити на проміжку і намалювати умовну параболу, потім подивитися на знак та вказати проміжки, а от як то розписати додатково через випадки з а=,<,> не розумію та не знаю, будь ласка допоможіть ))

8

Re: Задача на С++

vzaluskiy23 написав:

Я знаю що потрібно просто розвязати як квадратичне рівняння, корені його розставити на проміжку і намалювати умовну параболу, потім подивитися на знак та вказати проміжки, а от як то розписати додатково через випадки з а=,<,> не розумію та не знаю, будь ласка допоможіть ))

Якщо a==0, це не квадратна нерівність, а лінійна. Лінійні розв'язувати вмієте? От її й треба розв'язати в цьому випадку.
Якщо a<0, то парабола буде перевернутою, і вам будуть потрібні інші проміжки.

А взагалі краще спершу привести нерівність до канонічного виразу, а вже потім розв'язувати. Вам же легше буде.

Подякували: vzaluskiy231

9

Re: Задача на С++

Я зрозумів ніби, якщо би виникли ще якісь питання то напишу, дякую вам)

10

Re: Задача на С++

Я записав коли a>0 та a<0. А от де потрібно записати коли a==0,  це ж ніби получиться -bx<=c, c<=-(b/c), я правильно зрозумів ?

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;


int main() {
    //ax^2-bx<=c   x^2-3x+2<=0 >0 , x^2-3x+4<=0
    double a, b, c;
    cout << "Vvedit znachenna a: " << endl;
    cin >> a;
    cout << "Vvedit znachenna b: " << endl;
    cin >> b;
    cout << "Vvedit znachenna c: " << endl;
    cin >> c;
    double d = b * b - 4 * a * (-c);
    if (d < 0) {
        cout << "Rivnшіе nemae rozviazkiv, oskilki D<0!\n";
    }
    else if (d == 0) {
        double x0 = -b / 2*a;
        cout << "X e (-inf;" << x0 << "]\n";
    }
    else if (d > 0) {
        double x1 = b - sqrt(d) / 2 * a;
        double x2 = b + sqrt(d) / 2 * a;
        if(x1<x2){
            if (a < 0) {
                cout << "X e (-inf;" << x1 << "];[" << x2 << "+inf)\n";
            }
            else if (a > 0) {
                cout << "X e [" << x1 << ";" << x2 << "]\n";
            }

        }
        if (x2 < x1) {
            if (a < 0) {
                cout << "X e (-inf;" << x2 << "];[" << x1 << "+inf)\n";
            }
            else if (a > 0) {
                cout << "X e [" << x2 << ";" << x1 << "]\n";
            }
        }
    }

    return 0;

}

11

Re: Задача на С++

vzaluskiy23 написав:

Я записав коли a>0 та a<0. А от де потрібно записати коли a==0,  це ж ніби получиться -bx<=c, x<=-(b/c), я правильно зрозумів ?

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;


int main() {
    //ax^2-bx<=c   x^2-3x+2<=0 >0 , x^2-3x+4<=0
    double a, b, c;
    cout << "Vvedit znachenna a: " << endl;
    cin >> a;
    cout << "Vvedit znachenna b: " << endl;
    cin >> b;
    cout << "Vvedit znachenna c: " << endl;
    cin >> c;
    double d = b * b - 4 * a * (-c);
    if (d < 0) {
        cout << "Rivnшіе nemae rozviazkiv, oskilki D<0!\n";
    }
    else if (d == 0) {
        double x0 = -b / 2*a;
        cout << "X e (-inf;" << x0 << "]\n";
    }
    else if (d > 0) {
        double x1 = b - sqrt(d) / 2 * a;
        double x2 = b + sqrt(d) / 2 * a;
        if(x1<x2){
            if (a < 0) {
                cout << "X e (-inf;" << x1 << "];[" << x2 << "+inf)\n";
            }
            else if (a > 0) {
                cout << "X e [" << x1 << ";" << x2 << "]\n";
            }

        }
        if (x2 < x1) {
            if (a < 0) {
                cout << "X e (-inf;" << x2 << "];[" << x1 << "+inf)\n";
            }
            else if (a > 0) {
                cout << "X e [" << x2 << ";" << x1 << "]\n";
            }
        }
    }

    return 0;

}

12

Re: Задача на С++

Знак a бажано перевіряти до дискримінанта - принаймні на 0.

vzaluskiy23 написав:
    if (d < 0) {
        cout << "Rivnшіе nemae rozviazkiv, oskilki D<0!\n";
    }

Рівняння розв'язків не має, парабола повністю або над, або під віссю X; а от нерівність може мати: залежно від знаку a, або дійсно їх не буде, або будь-яке число буде розв'язком. Але якщо a==0, то рівняння не квадратне, і дискримінант не має сенсу (хоча формально він буде b2, тобто ця гілка не спрацює).

vzaluskiy23 написав:
if (d == 0) {
        double x0 = -b / 2*a;
        cout << "X e (-inf;" << x0 << "]\n";
    }

А тут узагалі неправильно. Якщо d==0, то парабола торкається осі X вершиною; залежно від знаку a, розв'язок буде або вся числова пряма, або лише одна точка - ця сама вершина (нерівність не строга). Особливо цікаво, що стається при a==0 - тоді сюди управління буде передане лише якщо b==0, і це навіть не лінійна нерівність, а певна тотожність залежно від c, розв'язками якої буде або вся числова пряма, або не буде взагалі.

vzaluskiy23 написав:
double x1 = b - sqrt(d) / 2 * a;
        double x2 = b + sqrt(d) / 2 * a;
        if(x1<x2){

По-перше, ви неправильно обчислюєте корені. У операцій ділення (/) і множення (*) пріоритет однаковий, і ви множите sqrt(d)/2 на a замість ділити. Додайте дужки.
А по-друге, арифметичний квадратний корінь завжди додатний, тому x2 буде меншим за x1 тоді і лише тоді, коли a<0, ну і навпаки. Тобто тут перевірка на знак a безглузда.