Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

nyac55

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

Polecane posty

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...