Wątek przeniesiony 2016-05-19 11:14 z C# i .NET przez ŁF.

Pobieranie danych od użytkownika w nieskończonej pętli.

0

Witam! Piszę program, który ma na celu symulować wybraną strukturę danych.

 

        static private void Main(string[] args)
        {
            Console.WriteLine("Wybierz, jaką strukturę danych mam zasymulować: ");
            Console.WriteLine("1. Stos; ");
            Console.WriteLine("2. Kolejka; ");
            Console.WriteLine("3. Lista jednokierunkowa; ");
            Console.WriteLine("4. Drzewo binarne; ");

            int choice = int.Parse(Console.ReadLine());
            
            switch (choice)
            {
                case 1:
                    {
                        Stack stos = new Stack();

                       
                            Console.WriteLine("1. empty() zwraca true jeżeli stos jest pusty");
                            Console.WriteLine("2. pop() usuwa element znajdujący się na szczycie stosu");
                            Console.WriteLine("3. push() dodaje element na szczycie stosu");
                            Console.WriteLine("4. size() zwraca liczbę elementów stosu");
                            Console.WriteLine("5. top() zwraca referencję do elementu na szczycie stosu");
                            Console.WriteLine("6. Koniec programu.");


                        for(;;)
                        {
     
                                choice = int.Parse(Console.ReadLine());
                            

                            switch (choice)
                            {
                                case 1:
                                    {
                                        stos.empty();
                                        Console.WriteLine(stos.emptyOrFull);
                                        Console.ReadLine();
                                        break;
                                    }

                                case 2:
                                    {
                                        stos.empty();
                                        stos.pop(stos.emptyOrFull);

                                        break;
                                    }

                                case 3:
                                    {
                                        stos.size();

                                        Console.WriteLine("Podaj łańcuch, jaki chcesz dodać na szczyt stosu: ");

                                        string String = Console.ReadLine();

                                        stos.push(stos.quantity, String);
                                        break;
                                    }

                                case 4:
                                    {
                                        break;
                                    }

                                case 5:
                                    {
                                        break;
                                    }

                                default:
                                    {
                                        Console.WriteLine("Nie ma takiej komendy!");
                                        Console.ReadKey();
                                        break;

                                    }

                            }

                            if (choice == 6) Environment.Exit(0);
                        }
                    
                        break;
                    }
                case 2:
                    {
                        break;
                    }
                case 3:
                    {
                        break;
                    }
                case 4:
                    {
                        break;
                    }
                default:
                    {
                        Console.WriteLine("Nie ma takiego wyboru!");
                        Console.ReadKey();
                        break;
                    }
            }
            

            }

Zawsze za trzecią iteracją pętli "for(;;)" program się zawiesza, kompilator zaznacza linijkę

 choice = int.Parse(Console.ReadLine()); 

i wyrzuca błąd o treści:
"An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll."

0

Ten błąd oznacza, że próbujesz skonwertować do int coś, co nie jest liczbą. Przestań to robić, to problemu nie będzie.

No i while(true) wygląda lepiej niż for(;;).

0

@somekind Napisałem, że zawsze za trzecia iteracją, obojętnie co tam wpiszę. Gdy wpiszę cyfrę program też się zawiesza i wyskakuje ten błąd.

0

Edit: Przetestowałem jeszcze kilka razy i jednak nie zawsze za trzecią iteracją, ale zawsze się zawiesza i wyskakuje ten błąd przy którejś iteracji.

0

Nieprawda, gdy wpiszesz cyfrę tak się nie dzieje.

Wyciągnij sobie Console.ReadLine() do jakiejś zmiennej i sprawdź w debuggerze co jest w tej zmiennej gdy program się wywala. Obstawiam pusty string.
Generalnie dobrą praktyką jest stosowanie metody int.TryParse zamiast int.Parse do weryfikacji danych wprowadzanych przez użytkownika.

1

Ja nie przetestowałam ani razu, bo mi się nie kompiluje żadne empty(), size() czy emptyOrFull (WTF?).

0

@somekind Nie wiem, czy o to Ci chodzi, ale debuger pokazuje, że w momencie przerwania programu, zmienna "choice" miała wartość, którą wcześniej podałem. Na prawdę nie wiem o co chodzi, wyślę jeszcze kod klasy "Stack" żebyś mógł to skompilować (klasa jest jeszcze nie skończona, brakuje kilku metod).

 

 public class Stack
    {
        public bool emptyOrFull = true;

        public int quantity = 0;

        public string[] elements = new string[5];

   /// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public Stack()
        {
            elements[0] = "";
            elements[1] = "";
            elements[2] = "";
            elements[3] = "";
            elements[4] = "";
        }

   /// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public bool empty()
        {
            if ((elements[0] == "") &&
            (elements[1] == "") &&
            (elements[2] == "") &&
            (elements[3] == "") &&
            (elements[4] == ""))
            {
                return true;

                emptyOrFull = true;
            }

            else
            {
                return false;
                emptyOrFull = false;
            }
        }

  /// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public void pop(bool emOrFull)
        {
            if (emOrFull == true)
            {
                Console.WriteLine(" Stos jest pusty!");
                Console.ReadKey();
            }

            else
                    if ((elements[quant--] != "") && (elements[quant - 2] != "")) elements[quant--] = "";
            }
        }

   /// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public int size()
        {
            var variable = 5;


            while (variable > 0)
            {
                if (elements[variable--] != "") quantity += 1; 

                variable--;
            }

            return quantity;
        }
  /// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public void push(int qu, string element) // qu - quantity
        {
            elements[qu] = element;
        }

    }

0
Pijany Kaczor napisał(a):

@somekind Nie wiem, czy o to Ci chodzi, ale debuger pokazuje, że w momencie przerwania programu, zmienna "choice" miała wartość, którą wcześniej podałem.

Oczywiście, że miała.
Jak już pisałem, wywala się metoda int.Parse, gdy podajesz jej wartość, której nie da się skonwertować do liczby. Zobacz co próbujesz konwertować, a nie wartość prawidłowej zmiennej.

P.S. Kod klasy Stack, który wkleiłeś się nie kompiluje.

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