Jump to content

Archived

This topic is now archived and is closed to further replies.

nyac55

C# - Obliczanie pierwiastków równania kwadratowego?

Recommended Posts

Witam. Mam do zrealizowania program ,który będzie obliczał pierwiastki równania kwadratowego.

Muszą być 4 metody: 1 do wprowadzania a,b,c; 2 do liczenia delty; 3 do liczenia pierwiastków rzeczywistych; 4 do wyświetlania i liczenia pierwiastków zespolonych (dla delta < 0 ) oraz program musi wykorzystywać 1 if. Nie bardzo mi to wychodzi napisałem fragment kodu ,ale mam jakieś ,błędy i nie wiem co robię źle. Poniżej zamieszczam ten fragment:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
class Program
{
public void wprowadz()
{
Console.WriteLine("Podaj współczynniki równania kwadratowego \n");
Console.WriteLine("a: \n");
a=Console.ReadKey();
Console.WriteLine("b: \n");
b=Console.ReadKey();
Console.WriteLine("c: \n");
c=Console.ReadKey();
}
static void Main(string[] args)
{
int a, b, c;
wprowadz();
Console.ReadKey();
}
}
}

Jednak fragment nie działa poprawnie. Proszę o pomoc.

Link to comment
Share on other sites

1. Błędy i ostrzeżenia kompilatora są po to, żeby je czytać. W nich jest naprawdę sporo wartościowych informacji.

2. a, b, c powinny być zadeklarowane w nieco innym miejscu, jeśli maja być widoczne w całej klasie. W jakim?

3. Jesteś pewien, że funcja Console.ReadKey() jest tutaj najlepszym pomysłem? Może zamiast funkcji, która wczytuje kolejny znak lepiej by było użyć czegoś, co wczytuje całą linię?

Link to comment
Share on other sites

Poprawiłem nieco kod i mam ,go trochę więcej:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
class Program
{
static int a, b, c, obl_delta, x1 ,x2;
public static void wprowadz()
{
Console.WriteLine("Podaj współczynniki równania kwadratowego \n");
Console.WriteLine("a: \n");
a = System.Int32.Parse(Console.ReadLine());
Console.WriteLine("b: \n");
b=System.Int32.Parse(Console.ReadLine());
Console.WriteLine("c: \n");
c=System.Int32.Parse(Console.ReadLine());
}
public static int delta(int a, int b, int c)
{
obl_delta = (b * b) - 4 * a * c;
Console.WriteLine("Delta wynosi: "+obl_delta+" \n");
return obl_delta;
}
public static int x(int obl_delta)// ref x1, ref x2)
{
x1 = (-b - (int)Math.Sqrt(obl_delta)) / (2 * a);
x2 = (-b + (int)Math.Sqrt(obl_delta)) / (2 * a);
return 0;
}
static void Main(string[] args)
{
wprowadz();
Console.WriteLine(a + " " + b + " " + c);
delta(a,b,c);
//x1 = x(obl_delta, x1);
//x2 = x(obl_delta, x1, x2);
Console.ReadKey();
}
}
}

Niestety teraz nie wiem jak z metody x zwrócić 2 argumenty x1 i x2 ,trochę czytałem w internecie ,ale znalazłem tylko ,że można to zrobić przez referencję. Czy jest jakiś inny sposób czy tylko przez referencję da się zwrócić x1 i x2? Jeśli tylko przez referencję to proszę o jakąś podpowiedź albo przykład jak to zrobić.

Link to comment
Share on other sites

Jaki jest zasięg zmiennych obl_delta, x1 oraz x2, a jaki powinien być? Używasz tych zmiennych jakby to były zmienne lokalne w funkcjach, a zadeklarowane są jako zmienne statyczne w bloku klasy. Jak się zdecydujesz jakie to mają być zmienne, to będzie można napisać jak to przekazywać.

Jaki jest sens rzutowania pierwiastka na liczbę całkowitą i czemu x1, x2 oraz obl_delta są intami?

I po raz kolejny - czytaj błędy i ostrzeżenia kompilatora.

Link to comment
Share on other sites

Stworzyłem już ,program jednak działa poprawnie tylko do pewnego momentu. Chyba brakuje mu ostatniego szlifu. Prosiłbym o pomoc ,co jest źle:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
class Program
{
public static int a, b, c;// obl_delta, x1 ,x2;
public static double obl_delta, x1, x2;
public static void wprowadz()
{
Console.WriteLine("Podaj współczynniki równania kwadratowego \n");
Console.WriteLine("a: \n");
a = System.Int32.Parse(Console.ReadLine());
Console.WriteLine("b: \n");
b=System.Int32.Parse(Console.ReadLine());
Console.WriteLine("c: \n");
c=System.Int32.Parse(Console.ReadLine());
}
public static double delta(int a, int b, int c)
{
obl_delta = (b * b) - 4 * a * c;
Console.WriteLine("Delta wynosi: "+obl_delta+" \n");
return obl_delta;
}

public static double x(int obl_delta ,ref double x1, ref double x2)
{
if (obl_delta == 0)
{
x1 = x2 = -b / (2 * a);
}
else if (obl_delta > 0)
{
x1 = (-b - Math.Sqrt(obl_delta)) / (2 * a);
x2 = (-b + Math.Sqrt(obl_delta)) / (2 * a);
}

return 0;
}

public static double ix(int a,int b,int c)
{
if (obl_delta < 0)
{
x1=Math.Sqrt(4*a*c-(b*b));
return x1;
}
return 0;
}
static void Main(string[] args)
{

wprowadz();
Console.WriteLine(a + " " + b + " " + c);
delta(a,b,c);
x(obl_delta, ref x1, ref x2);
ix(a,b,c);
//x1 = x(obl_delta, x1);
//x2 = x(obl_delta, x1, x2);
Console.ReadKey();
}
}
}

Link to comment
Share on other sites

Ponieważ należy cytować mądrych ludzi:

Jaki jest zasięg zmiennych obl_delta, x1 oraz x2, a jaki powinien być? Używasz tych zmiennych jakby to były zmienne lokalne w funkcjach, a zadeklarowane są jako zmienne statyczne w bloku klasy. Jak się zdecydujesz jakie to mają być zmienne, to będzie można napisać jak to przekazywać.

Jaki jest sens rzutowania pierwiastka na liczbę całkowitą i czemu x1, x2 oraz obl_delta są intami?

A do tego - co właściwie robi funkcja ix?

I tak przy okazji - co się stanie jak a będzie równe 0?

[edit]

I jeszcze jedno - czemu a, b i c są intami?

Link to comment
Share on other sites

A do tego - co właściwie robi funkcja ix?

Metoda ix ma za zadanie się wykonywać jeśli wartość delty wyjdzie ujemna to wtedy według wikipedii: mamy ,że pierwiastek z delty = i pierwiastek z 4ac - b^2 i właśnie to chciałem zwrócić tylko jeszcze na początku musiałbym dokleić jakoś i.

I tak przy okazji - co się stanie jak a będzie równe 0?
Tego przypadku jeszcze nie uwzględniłem ,bo program nie działa poprawnie.
I jeszcze jedno - czemu a, b i c są intami?
Wydawało mi się to wygodne. To tylko szkolny program... Lecz mogę to zmienić.
aki jest zasięg zmiennych obl_delta, x1 oraz x2, a jaki powinien być? Używasz tych zmiennych jakby to były zmienne lokalne w funkcjach, a zadeklarowane są jako zmienne statyczne w bloku klasy. Jak się zdecydujesz jakie to mają być zmienne, to będzie można napisać jak to przekazywać.

Jaki jest sens rzutowania pierwiastka na liczbę całkowitą i czemu x1, x2 oraz obl_delta są intami?

Na to pytanie nie umiem odpowiedzieć - zmienne są prawdopodobnie globalne. Są statyczne ponieważ klasa nie ma obiektu.

__________________________


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
class Program
{
public static double a, b, c, obl_delta, x1, x2;
public static void wprowadz()
{
Console.WriteLine("Podaj współczynniki równania kwadratowego \n");
a = 0;

while (a == 0)
{
Console.WriteLine("a: \n");
a = System.Int32.Parse(Console.ReadLine());
//Console.WriteLine("Błąd ,a nie może wynosić 0! ");
Console.WriteLine("b: \n");
b = System.Int32.Parse(Console.ReadLine());
Console.WriteLine("c: \n");
c = System.Int32.Parse(Console.ReadLine());
if (a == 0)
Console.WriteLine("Błąd! a nie może wynosić 0");
}



}
public static double delta(double a, double b, double c)
{
obl_delta = (b * b) - 4 * a * c;
Console.WriteLine("Delta wynosi: "+obl_delta+" \n");
return obl_delta;
}

public static void x()
{
if (obl_delta == 0)
{
x1 = x2 = -b / (2 * a);
Console.WriteLine("Dla delty równej 0: \nx1 i x2 wynoszą: " + x1);
}
else if (obl_delta > 0)
{
x1 = (-b - Math.Sqrt(obl_delta)) / (2 * a);
x2 = (-b + Math.Sqrt(obl_delta)) / (2 * a);
Console.WriteLine("Dla delty większej niż 0:\nx1 = " + x1 + " \nx2 = " + x2);
}
}

public static void ix()
{
double Re, Im;

if (obl_delta < 0)
{
Re = (-b / (2 * a));
Im = (Math.Sqrt(-obl_delta))/(2*a);

Console.WriteLine("" + Re + "-" + Im + "i");
Console.WriteLine("" + Re + "+" + Im + "i");
}
}

static void Main(string[] args)
{
wprowadz();
Console.WriteLine(a + " " + b + " " + c);
delta(a,b,c);
x();
ix();
//x1 = x(obl_delta, x1);
//x2 = x(obl_delta, x1, x2);
Console.ReadKey();
}
}
}

Obecnie program działa poprawnie. Dzięki za pomoc.

Link to comment
Share on other sites



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...