Funkcja kwadratowa – ocena kodu

0

Kompletnie nie znam się na programowaniu, chciałbym poznać Waszą opinię. Co oprócz zmiennych globalnych i niepotrzebnych funkcji obliczenia(), zapis_funkcji(), ile_miejsc_zerowych() mógłbym zmienić żeby było lepiej w szerokim tego słowa znaczeniu? Czy według Was ten ''kod'' jest w ogóle czytelny?

Funkcja zapis_funkcji() zrobiłem po to, żeby w konsoli estetyczniej wyglądał zapis funkcji. Np. przy podaniu wartości -1 dla wszystkich trzech parametrów a, b, c funkcja wygląda tak:

-x^2 - x - 1

zamiast

-1x^2 + -1x + -1

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

double a,b,c,d,pierwiastek_d,x_0,x_1,x_2,p,q;
void obliczenia()
{
    d=(pow(b,2)-(4*a*c)); pierwiastek_d=(sqrt(d));
    p=x_0=(-b/2*a); q=((-d)/(4*a));
    x_1=((-b-pierwiastek_d)/(2*a)); x_2=((-b+pierwiastek_d)/(2*a));
}
void zapis_funkcji()
{
    // wspolczynnik a
    if ((a!=0)&&(a!=1)&&(a!=-1))
        cout << "Funkcja kwadratowa f(x) = " << a << "x^2 ";
    else if (a==1)
        cout << "Funkcja kwadratowa f(x) = " << "x^2 ";
    else if (a==-1)
        cout << "Funkcja kwadratowa f(x) = " << "-x^2 ";
    else
        cout << "Nie istnieje funkcja kwadratowa z wspolczynnikiem a = 0";

    // wspolczynnik b
    if ((a!=0)&&((b>1)||((b<1)&&(b>0))))
        cout << "+ " << b << "x ";
    else if ((a!=0)&&(b==1))
        cout << "+ x ";
    else if (((a!=0)&&(b<0))&&(b!=-1))
        cout << "- " << (-b) << "x ";
    else if ((a!=0)&&(b==-1))
        cout << "- x ";

    // wspolczynnik c
    if ((a!=0)&&(c>0))
        cout << "+ " << c;
    else if ((a!=0)&&(c<0))
        cout << "- " << (-c);
}
void ile_miejsc_zerowych()
{
    if ((a!=0)&&(d>0)) // dwa pierwiastki
        cout << " ma dwa miejsca zerowe." << endl;
    else if ((a!=0)&&(d==0)) // jeden pierwiastek
        cout << " ma jedno miejsce zerowe." << endl;
    else if ((a!=0)&&(d<0))// brak pierwiastków
        cout << " nie ma miejsc zerowych." << endl;
}
int main()
{
    cout << "Podaj wspolczynniki funkcji kwadratowej.\n" << endl;
    cout << "Wspolczynnik a: "; cin >> a;
    cout << "Wspolczynnik b: "; cin >> b;
    cout << "Wspolczynnik c: "; cin >> c;
    obliczenia(); cout << endl;
    zapis_funkcji();
    ile_miejsc_zerowych();
    cout << endl << endl << endl;
    cout << "Delta: " << d << endl;
    if (d>0)
    {
        cout << "x1: " << setprecision(3) << x_1 << endl;
        cout << "x2: " << setprecision(3) << x_2 << endl;
    }
    if (d==0)
        cout << "x0: " << x_0 << endl;
    cout << "Wierzcholek W = (" << p << "; " << q << ")" << endl;
    return 0;
}


0
double a, b, c, d, pierwiastek_d, x_0, x_1, x_2, p, q; // 1. spacje!! daj oddychać!
// 1.a wolna linia!
void obliczenia() 
{
	d = (pow(b, 2) - (4 * a * c)); // 2. jedna instrukcja na linię
	pierwiastek_d = sqrt(d); // 3. usuwaj niepotrzebne nawiasy

// ...
// 4. nie żałuj nawiasów - kiedyś obroni Cię to przed głupim błędem!
if (a != 0 && a != 1 && a != -1)
{
	cout << "Funkcja kwadratowa f(x) = " << a << "x^2 ";
}
0

Jak usuniesz zmienne globalne to jak na początkującego nie jest strasznie.
Nie rób długich linijek np: p=x_0=(-b/2*a); q=((-d)/(4*a));, to się źle czyta i jeszcze gorzej debuguje.

Do wypisywania liczb zawsze ze znakiem jest flaga showpos, wiec nie musisz kombinować z dopisywaniem +/-

pow(b, 2) jest bezsensu lepiej użyć b*b.

Nazwy funkcji są kiepskie, zbyt ogólne:

int PierwiastkiTrojmianu(double a, double b, double c, double &x1, double &x2) // zamiast: void obliczenia()
ostream& WypiszTrojmian(ostream& output, double a, double b, double c) // zmaiast: void zapis_funkcji();
int LiczbaPierwiastkowTrojmianu(double a, double b, double c) // zamiast: void ile_miejsc_zerowych() ale PierwiastkiTrojmianu już to pokrywa
0

Dzięki :)

0

Warto wspomnieć, że bezmyślne używanie wzorów z liceum też nie jest najlepszym sposobem rozwiązania tego zadania. https://people.csail.mit.edu/bkph/articles/Quadratics.pdf
Dodałbym też wczytywanie argumentów z linii poleceń (słowo kluczowe argc/argv), bo takie pytanie się o kolejne współczynniki to wieje mocno programami dla początkujących.

1 użytkowników online, w tym zalogowanych: 0, gości: 1