Kezdőoldal » Számítástechnika » Programozás » C# programkód, másodfokú...

C# programkód, másodfokú egyenlet megoldására. Milyen hiba/hiányosság van még benne?

Figyelt kérdés

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");


2018. szept. 23. 18:49
 1/9 anonim ***** válasza:
2018. szept. 23. 19:18
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:
A videóban, amit küldtél, egy sokkal "butább" programkódot írtak, például nem tért ki arra, mi van, ha nincs valós megoldás, vagy ha az a (ami az x^2) együtthatója 0. Ugyanis attól még lehet megoldása, a videóban látható forráskód esetén viszont a program nullával akarna osztani.
2018. szept. 23. 19:22
 3/9 anonim ***** válasza:
100%

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.

2018. szept. 23. 19:27
Hasznos számodra ez a válasz?
 4/9 anonim ***** válasza:
55%

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.

2018. szept. 23. 19:30
Hasznos számodra ez a válasz?
 5/9 A kérdező kommentje:

É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?

2018. szept. 23. 19:33
 6/9 anonim ***** válasza:

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.

2018. szept. 23. 19:49
Hasznos számodra ez a válasz?
 7/9 anonim ***** válasza:

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?

2018. szept. 24. 10:41
Hasznos számodra ez a válasz?
 8/9 A kérdező kommentje:
Az miért baj?
2018. szept. 24. 16:55
 9/9 anonim ***** válasza:

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)

2018. szept. 25. 16:46
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!