Nieprawidłowy format ciągu wejściowego

0

Witam. Proszę o pomoc z usunięciem błędu. Główny kod mam w Calc.cs i dodatkowo utworzyłam klasę w osobnym Square.cs gdzie obliczam pierwiastki równania kwadratowego. Sam kod z Square.cs działa, ale gdy odwołuję się do niego w Calc.cs przez load to wyskakuje mi błąd właśnie w tym Square.cs (kod poniżej). Chodzi o linijkę a = System.Int32.Parse(Console.ReadLine()); A błąd to: An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll Additional information: Nieprawidłowy format ciągu wejściowego. Z góry dziękuję :)

    class Square
    {
        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: \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");
            }
        }
0

Masz obiekt typu double, a parsujesz na int. Jak wpiszesz np. 3.4 to masz wyjątek formatu.
Poza tym ten kod jest troszkę bez sensu.

Jeżeli jedynie a ma być różne od zera to sprawdzaj tylko a w pętli, pomijając wpisywanie na nowo reszty danych. Po drugie lepiej skorzystać z double.TryParse, bo nie rzuca wyjątku, a wiadomo, że pomyłki we wpisywaniu danych raczej będą częste:

double a = 0;
while ((!double.TryParse(Console.ReadLine(), out a)) || a == 0) ;

W ogóle static'i też są niepotrzebne.

0

Nie wykrywa żadnych błędów w kodzie, ale nie liczy pierwiastków i nie mam pojęcia co teraz jest źle jak patrzę na kod

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

            double a = 0;
            while ((double.TryParse(Console.ReadLine(), out a)) && 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 double delta()
        {
            obl_delta = (b * b) - 4 * a * c;
            Console.WriteLine("Delta wynosi: " + obl_delta + " \n");
            return obl_delta;
        }

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

    }
}
0

Masz trochę pomieszane warunki w pętli. Ja bym to zrobił w ten sposób:

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

public static class Ext
{
    public static bool Cmp(this double a, double b)
    {
        return Math.Abs(a - b) < double.Epsilon;
    }
}

class Quadratic
{
    private double a;
    private double b;
    private double c;
    private double delta;
    private double x1;
    private double x2;

    public double Delta { get { return this.delta; } }
    public double X1 { get { return this.x1; } }
    public double X2 { get { return this.x2; } }

    public void InsertValues()
    {
        Console.Write("'A' (must be non-zero!): "); while (!double.TryParse(Console.ReadLine(), out this.a) || this.a.Cmp(0.0)) ;
        Console.Write("'B': "); while (!double.TryParse(Console.ReadLine(), out this.b)) ;
        Console.Write("'C': "); while (!double.TryParse(Console.ReadLine(), out this.c)) ;
    }

    public void MakeDelta()
    {
        this.delta = (this.b * this.b) - 4 * this.a * this.c;
    }

    public void Process()
    {
        if (this.delta.Cmp(0.0)) this.x1 = this.x2 = -this.b / (2 * this.a);
        else if (this.delta > 0.0)
        {
            this.x1 = (-this.b - Math.Sqrt(this.delta)) / (2.0 * this.a);
            this.x2 = (-this.b + Math.Sqrt(this.delta)) / (2.0 * this.a);
        }
    }
}

class Program
{


    public static void Main(string[] args)
    {
        var quad = new Quadratic();
        quad.InsertValues();
        quad.MakeDelta();
        quad.Process();
        Console.WriteLine("\nx1: {0}\nx2: {1}\ndelta: {2}\n\n", quad.X1, quad.X2, quad.Delta);
    }
}

PS: Należy pamiętać, że porównujesz z zerem liczby zmiennoprzecinkowe, o czym ja też zapomniałem. Metoda Cmp pozwala uzyskać prawidłowe porównanie.
PS2: Liczby zmiennoprzecinkowe wprowadzamy z konsoli z przecinkiem, a nie z kropką! .NET bierze pod uwagę lokalizację (czy tam kulturę, czy jak to tam się nazywa...).
PS3: Możesz pobawić się w walidację danych i sprawdzić czy wszystkie rzeczy są wprowadzone przed procesowaniem równania. Takie tam...

1 użytkowników online, w tym zalogowanych: 0, gości: 1