Funkcja która oblicza i pokazuje pierwiastki równania kwadratowego, deltę i całą funkcję

0

Cześć!

Za zadanie mam napisać program który oblicza deltę równania kwadratowego za pomocą funkcji

  double Delta(double a, double b, double c) 

to akurat mam, również za pomocą funkcji oblicza ile równanie ma pierwiastków int IlePierwiastkow(double delta)

. Do ma wyświetlać cały zapis funkcji kwadratowe, czyli np jeżeli b=0 wyświetla tylko 4x^2 -1. (przy a=0 nie jest funkcją kwadratową), do tego przy 1 ma nie wyświetlać jedynki z przodu tylko samego x, jeśli nie podam wartości c, to bez c itp. można do tego napisać pewnie z 15-20 ifów ale myślę że da się to jakoś zrobić szybciej bez rozstrząsania każdego przypadku z osobna. Do tego wyświetla:
obliczoną deltę *to mam*
wyświetla informację o liczbie pierwiastków <-brak
wyświetla obliczone pierwiastki <- to mam, jednak gdy pierwiastek jest podwójny wyświetla mi go dwa razy a powinno jeden, gdy pierwiastków nie ma wyświetla się NaN
obsługuje wyjątki <- dołączyłem to, jednak nie wiem czy jest to obsługa wszystkich wyjątków o jakie może chodzić.

Zamieszczam program (tyle ile udało mi się zrobić z moimi umiejętnościami):
```csharp
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zad4
{
    class Program
    {
        static double Delta(double a, double b, double c)
        {
            return Convert.ToDouble(b * b - 4 * a * c);
        }
        static void Main(string[] args)
        {
            double a, b, c, d, x1, x2;
            try
            {
                Console.WriteLine("Podaj parametr a: ");
                a = Convert.ToDouble(Console.ReadLine());

                Console.WriteLine("Podaj parametr b: ");
                b = Convert.ToDouble(Console.ReadLine());

                Console.WriteLine("Podaj parametr c: ");
                c = Convert.ToDouble(Console.ReadLine());

                if (Convert.ToDouble(a) == 0)
                {
                    Console.WriteLine("To nie jest funkcja kwadratowa!");
                }

                x1 = -b + Math.Sqrt(b * b - 4 * a * c) / 2 * a;
                x2 = -b + Math.Sqrt(b * b - 4 * a * c) / 2 * a;
                Console.WriteLine("Pierwiastki wynoszą: " + x1 + x2);


                Console.WriteLine("Wynik to: {0:G17}", Delta(Convert.ToDouble(a), Convert.ToDouble(b), Convert.ToDouble(c)));
            }
            catch (DivideByZeroException f)
            {
                Console.WriteLine(f.Message);
            }
            catch (FormatException e)
            {
                Console.WriteLine(e.Message);
            }
            catch (Exception de)
            {
                Console.WriteLine(de.Message);
            }
            Console.ReadLine();
        }
    }
}
 
1

No bo przecież masz źle warunki. Jak delta < 0 to wtedy wyświetl 'brak', jak 0 to wyświetl tylko 1 i jak dwa to wyświetl 2 (3 ify).
Co do wyświetlania zapisu funkcji kwadratowej to podobnie można zrobić, coś w stylu:

string zapis = "";
if(a != 0)
  zapis += a == 1 ? "x^2" : $"{a}x^2";
if (b != 0)
  zapis += //... itd.
2
  1. Po co w tym wzorze
return Convert.ToDouble(b * b - 4 * a * c);

jest konwersja? Przecież b * b - 4 * a * c jest typu double.
2. Masz błędne wzory na pierwiastki równania (poczytaj o priorytetach - kolejności wykonywania działań arytmetycznych). Dostajesz poprawne wyniki tylko dla a = 1 i b = 0.

0
NeuroXiq napisał(a):

No bo przecież masz źle warunki. Jak delta < 0 to wtedy wyświetl 'brak', jak 0 to wyświetl tylko 1 i jak dwa to wyświetl 2 (3 ify).
Co do wyświetlania zapisu funkcji kwadratowej to podobnie można zrobić, coś w stylu:

string zapis = "";
if(a != 0)
  zapis += a == 1 ? "x^2" : $"{a}x^2";
if (b != 0)
  zapis += //... itd.

Ten oto zapis który prezentujesz jest błędny, nie odczytuje znaku np $, kiedy dam coś takiego:

 string zapis = "";
            if (a != 0)
                Console.WriteLine(zapis += a == 1 ? "x^2" : $"{a}x^2"); 

to raz że sie nie skompiluje bo jest znaczek "$" a dwa gdy go usunę i a wpisze np 2, to wyświetli się coś takiego "{a}x^2" a nie o to mi chodzi

0

Ostatecznie zapisałem to tak:

 if (a != 0 && b > 0 && c > 0)
                Console.WriteLine(a + "x^2" + "+" + b + "x" + "+" + c);
            if (a != 0 && b < 0 && c < 0)
                Console.WriteLine(a + "x^2" +  b + "x" + c);
            if (a != 0 && b > 0 && c < 0)
                Console.WriteLine(a + "x^2" + "+" + b + "x" + c);
            if (a != 0 && b < 0 && c > 0)
                Console.WriteLine(a + "x^2" + b + "x" + "+" + c);
            if (a != 0 && b == 0 && c == 0)
                Console.WriteLine(a + "x^2");
            if (a != 0 && b > 0 && c == 0)
                Console.WriteLine(a + "x^2" + "+" + b + "x");
            if (a != 0 && b < 0 && c == 0)
                Console.WriteLine(a + "x^2" + b + "x");
            if (a != 0 && b == 0 && c > 0)
                Console.WriteLine(a + "x^2" + "+" + c);
            if (a != 0 && b == 0 && c < 0)
                Console.WriteLine(a + "x^2" + c);
            
            

            if (Convert.ToDouble(a) == 0)
            {
                Console.WriteLine("To nie jest funkcja kwadratowa!");
            } 

Są sprawdzone wszystkie przypadki, jednak gdybym chciał zrobić wielomian stopnia 5 to bym się już dawno zajechał... nie ma na to prostszego algorytmu?

0

W zasadzie mam już pełen program. Jest jednak jedno ale, program jest poddawany automatycznym testom i muszę mieć zadeklarowane:

 int IlePierwiastkow(double delta) 

<- który oblicza, ile pierwiastków ma równanie, a w moim programie wygląda to tak: static double ObliczPierwiastek(double a, double b, double delta)
{
return (-b + Math.Sqrt(delta)) / 2a;
}
static double ObliczPierwiastek2(double a, double b, double delta)
{
return (-b - Math.Sqrt(delta)) / 2
a;
}


W jaki sposób mogę to połączyć? Może nie trzeba tylko dodać coś nowego?

Program w pełni wygląda następująco: 
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {

        
        static double Delta(double a, double b, double c)
        {
            return b * b - 4 * a * c;
        }
        static double ObliczPierwiastek(double a, double b, double delta)
        {
            return (-b + Math.Sqrt(delta)) / 2*a;
        }
        static double ObliczPierwiastek2(double a, double b, double delta)
        {
            return (-b - Math.Sqrt(delta)) / 2*a;
        }
        
        static void rownaniekwadratowe()
        {
            double a, b, c, delta;
            Console.WriteLine("Podaj parametr a: ");
            a = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("Podaj parametr b: ");
            b = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("Podaj parametr c: ");
            c = Convert.ToDouble(Console.ReadLine());
            delta = Delta(a, b, c);            
            
            if (a != 0 && b > 0 && c > 0)
                Console.WriteLine(a + "x^2" + "+" + b + "x" + "+" + c);
            if (a != 0 && b < 0 && c < 0)
                Console.WriteLine(a + "x^2" +  b + "x" + c);
            if (a != 0 && b > 0 && c < 0)
                Console.WriteLine(a + "x^2" + "+" + b + "x" + c);
            if (a != 0 && b < 0 && c > 0)
                Console.WriteLine(a + "x^2" + b + "x" + "+" + c);
            if (a != 0 && b == 0 && c == 0)
                Console.WriteLine(a + "x^2");
            if (a != 0 && b > 0 && c == 0)
                Console.WriteLine(a + "x^2" + "+" + b + "x");
            if (a != 0 && b < 0 && c == 0)
                Console.WriteLine(a + "x^2" + b + "x");
            if (a != 0 && b == 0 && c > 0)
                Console.WriteLine(a + "x^2" + "+" + c);
            if (a != 0 && b == 0 && c < 0)
                Console.WriteLine(a + "x^2" + c);

            Console.WriteLine("Delta: " + Delta(a, b, c));

            if (Convert.ToDouble(a) == 0)
            {
                Console.WriteLine("To nie jest funkcja kwadratowa!");
            }
            else
            {
                if (delta < 0)
                {
                    Console.WriteLine("Delta jest ujemna brak pierwiastków rzeczywistych");
                }
                else
                {
                    if (delta > 0)
                    {
                        Console.WriteLine("Delta > 0");
                        Console.WriteLine("x1 wynosi:");
                        Console.WriteLine(ObliczPierwiastek(a, b, delta));
                        Console.WriteLine("x2 wynosi:");
                        Console.WriteLine(ObliczPierwiastek2(a, b, delta));
                    }
                    else
                    {
                        Console.WriteLine("Delta = 0");
                        Console.WriteLine("x0 wynosi");
                        Console.WriteLine(ObliczPierwiastek(a, b, delta));
                    }
                }
            }

            
        }
        static void Main(string[] args)
        {
            try
            {
                rownaniekwadratowe();
            }
            catch (Exception)
            {

                Console.Write("Błąd! Program zakończy działanie.");
            }

            Console.ReadKey();
        }

    }

}
 
1

Wzory na pierwiastki masz nadal złe (choć jest w nich o jeden błąd mniej). Poprawne wyniki dostajesz tylko dla a = 1.

0
bogdans napisał(a):

Wzory na pierwiastki masz nadal złe (choć jest w nich o jeden błąd mniej). Poprawne wyniki dostajesz tylko dla a = 1.

Faktycznie, dopiero teraz to zauważyłem, dzięki, cenna uwaga! :)
Po dopisaniu nawiasów wyświetla sie poprawnie:

 static double ObliczPierwiastek(double a, double b, double delta)
        {
            return (-b + Math.Sqrt(delta)) / (2 * a);
        }
        static double ObliczPierwiastek2(double a, double b, double delta)
        {
            return (-b - Math.Sqrt(delta)) / (2 * a);
        }

Czy oprócz tego wiesz może jak mógłbym połączyć w jedną funkcję

int IlePierwiastkow(double delta) 

? To o czym wyżej pisałem

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