C# programkód, másodfokú egyenlet megoldására. Milyen hiba/hiányosság van még benne?
Arra is gondolok, ha valahol egyszerűsíteni lehetne, pl. változót kivenni, kevesebb feltétellel írni meg, hogy optimálisabb legyen a program.
Még kezdő vagyok nagyon.
while (true)
{
Console.WriteLine("A >>(a*x)^2+b*x+c=0<< alakú másodfokú egyenlet megoldásait fogjuk megkeresni.");
Console.WriteLine("a?");
double a = double.Parse(Console.ReadLine());
Console.WriteLine("b?");
double b = double.Parse(Console.ReadLine());
Console.WriteLine("c?");
double c = double.Parse(Console.ReadLine());
double det = Math.Pow(b, 2) - (4 * a * c);
double cmplxdet = Math.Abs(det);
double cmplx = Math.Sqrt(cmplxdet) / (2 * a);
double realx = -b / (2 * a);
if (a == 0 && b == 0 && c == 0)
Console.WriteLine("Minden szám kielégíti 0*x^2+0*x=0 egyenletet.");
else if (a==0 && b==0 && c!=0)
Console.WriteLine("A {0}=0 egyenlet nem oldható meg.", c);
else if (a==0 && b!=0)
Console.WriteLine("Egy valós gyök: x={0}.", -c/b);
else if (det < 0)
{
if (cmplx == 1 && realx == 0)
Console.WriteLine("Két komplex gyök: x1=i, x2=-i");
else if (cmplx != 1 && realx == 0)
Console.WriteLine("Két komplex gyök: x1={0}i, x2=-{0}i", cmplx);
else if (cmplx == 1 && realx != 0)
Console.WriteLine("Két komplex gyök: x1={0}+i, x2={0}-i", realx);
else
Console.WriteLine("Két komplex gyök: x1={0}+{1}i, x2={0}-{1}i", realx, cmplx);
}
else if (det == 0)
Console.WriteLine("Egy valós gyök: x={0}", -b / (2 * a));
else
Console.WriteLine("Egy valós gyök: x1={0}, x2={1}", (-b + Math.Sqrt(det)) / (2 * a), (-b - Math.Sqrt(det)) / (2 * a));
Console.WriteLine("\n\n\n\n");
Pendragon válaszaival nem kell foglalkozni.
Kiengedték az ápolási osztályról, kommentel pár kérdés alá valami gyökérséget, aztán megint bezárják pár hétre.
El se olvasd.
Ha elfogulatlanul nézzük a programot, akkor a legnagyobb baj vele inkább az, hogy egy valódi program nem így néz ki.
Nem szokás keverni az úgynevezett "üzleti logikát" (ami itt maga a másodfokú egyenlet kiszámítása) az adatbekéréssel és kiíratással.
Ez a program csak így és ebben a formában használható, miközben meglehetne úgy is írni, hogy egy újrafelhasználható, rugalmas program legyen belőle.
Persze tudom kezdőként ez kínai, de ha van vele bármilyen probléma, az inkább ez, minthogy valahol eggyel több változót deklaráltál, mint muszáj lett volna.
Értem, gyakorlásnak szántam amúgy. Egy elírást amúgy pont találtam benne, alulról a második sor *Két valós gyök. :D
Hogyan lehetne a kritikádat kiküszöbölni, szóval hogyan lehetne ebből egy rugalmasabb programot csinálni?
Objektum orientált kóddal, szépen elszeparált osztályokkal, akár külön fordítási egységekkel.
Például annak az osztálynak, ami magát az egyenletet oldja meg nem kell semmit tudna arról, hogy honnan kapja az együtthatókkal, vagy mi fog történni a gyökökkel.
Valami olyan interfészt képzelnék el neki, hogy:
static (double? x1, double? x2) SolveQuadraticEquation(double a, double b, double c);
Ebben pedig sehol nem szabadna szerepeljen bármilyen konzollal komunikálásnak.
A másik ilyen csúnyaság a while(true). Ha többször akarok számolni majd futtatom újra a programot, de nehogy már fusson a végtelenségig, ha egyszer elindítom.
double cmplx = Math.Sqrt(cmplxdet) / (2 * a);
double realx = -b / (2 * a);
if (a == 0 && b == 0 && c == 0)
Először leosztod, utána ellenőrzöd, hogy 0 volt-e?
Nem baj, csak elég érdekes.
Hiszen ezekre az érékekre csak a det<0 esetén van szükség, mért nem ott számolod ki?
Egyébként pedig vagy NaN vagy védtelen lesz (attol függően, hogy 0/0 vagy pozitív/0)
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!