nyac55 Posted October 22, 2013 Report Share Posted October 22, 2013 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 More sharing options...
Sevard Posted October 22, 2013 Report Share Posted October 22, 2013 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 More sharing options...
nyac55 Posted October 22, 2013 Author Report Share Posted October 22, 2013 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 More sharing options...
mateusz(stefan) Posted October 22, 2013 Report Share Posted October 22, 2013 W tym wypadku polecałbym skorzystanie ze słowa kluczowego ref. Link to comment Share on other sites More sharing options...
Sevard Posted October 22, 2013 Report Share Posted October 22, 2013 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 More sharing options...
nyac55 Posted October 22, 2013 Author Report Share Posted October 22, 2013 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 More sharing options...
mateusz(stefan) Posted October 22, 2013 Report Share Posted October 22, 2013 Pierwsza rzecz co mi się rzuca w oczy to co jeśli delta wyjdzie ułamkowa? Stracisz istotną informację. Oparłbym się na innych typach niż intiger. Link to comment Share on other sites More sharing options...
Sevard Posted October 22, 2013 Report Share Posted October 22, 2013 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 More sharing options...
mateusz(stefan) Posted October 22, 2013 Report Share Posted October 22, 2013 Racja. Skoro to pola składowe klasy to nie masz problemu z dostępem do nich i nic nie trzeba w sumie przekazywać... Link to comment Share on other sites More sharing options...
Sevard Posted October 22, 2013 Report Share Posted October 22, 2013 Ja bym akurat przekazywał, tylko wtedy trzeba deklarację tych zmiennych przenieść w inne miejsce. Generalnie raczej należy unikać zmiennych globalnych, statycznych itp. Link to comment Share on other sites More sharing options...
nyac55 Posted October 22, 2013 Author Report Share Posted October 22, 2013 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 More sharing options...