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

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

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

  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
 

        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ę

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

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

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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(;;).

  • Rejestracja: dni
  • Ostatnio: dni
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.

  • Rejestracja: dni
  • Ostatnio: dni
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.

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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.

NE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 187
1

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

  • Rejestracja: dni
  • Ostatnio: dni
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).

Kopiuj
 

 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;
        }

    }

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.