Zapytanie użytkownika o zakończenie aplikacji konsolowej

0

Witam.
Jestem totalnie początkujący w programowaniu. Dopiero poznaję podstawowe składnie i w ramach treningu piszę proste programy.

W jednym z programów chciałbym zapytać się użytkownika czy chce zakończyć program.
Po wpisaniu decyzji przez użytkownika do konsoli program:

  • wykonuje się raz jeszcze
  • kończy się

KOD PROGRAMU

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

namespace trening {
    class Program {
        static void Main(string[] args) {

            Console.WriteLine("1");
            Console.WriteLine("2");
            Console.WriteLine("Czy chcesz zakończyć program y/n ?");


            
            Console.Clear();
        }


    }
}

Udało mi się jedynie zrobić to za pomocą goto i przypisaniu wartości liczbowych do y i n.

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

namespace trening {
    class Program {
        static void Main(string[] args) {
            START:
            Console.WriteLine("1");
            Console.WriteLine("2");
            Console.WriteLine("Czy chcesz zakończyć program y=1/n=2 ?");
            int decyzja = int.Parse(Console.ReadLine());

            if (decyzja == 2) {
                goto START;
            }


            Console.Clear();
        }

    }
}

Jednak chciałbym aby użytkownik podał "n" albo "y" i na podstawie tego program wykonał działanie.

1

Wywali Ci wyjątek jak wpiszesz powiedzmy "test". Można go obsłużyć, ale lepszym wyjściem jest moim zdaniem użycie ReadKey zamiast ReadLine. Później obsłuż decyzję najlepiej switchem jeśli będzie ich docelowo kilka. Np. coś takiego:

var input = Console.ReadKey();

switch (input.Key) 
{
    case ConsoleKey.Y:
        Environment.Exit(0);
        break;
    case ConsoleKey.N:
        break;
}

Jest to o tyle dobre rozwiązanie, że możesz łatwo odczytywać dowolny klawisz np. ConsoleKey.Escape .

A co do Twojego GOTO, to ja bym wszystko opakował w while(true).

Ewentualnie można zrobić inny sposób wyjścia z programu. Wyrzucić jakiekolwiek instrukcje zamykające aplikację, a while uzależnić od jakiejś zmiennej, która przy decyzji wyjścia z programu zmieni wartość na false, pętla się skończy a razem z nią program skończy swoje działanie.

0

Unikaj GOTO. W językach wysokiego poziomu prawdopodobnie nie jest Ci potrzebne (chociaż są znane zastosowania). Goto to bardzo kontrowersyjna instrukcja, która powinna być używana tylko wtedy, kiedy faktycznie nie ma innego wyjścia (a to się bardzo rzadko zdarza).

W Twoim przypadku potrzebne są pętle. Poczytaj o pętlach. Mamy ich kilka rodzajów w C#:

  • standardowa pętla for
  • pętla foreach
  • pętla while
  • pętla do..while

Pętla to taka konstrukcja, która wykonuje Ci instrukcje określoną ilość razy. Owszem, pętlę można przedstawić tak:

:START
  instrukcja1();
  instruckja2();
  i = i + 1;
  if(i < 9)
    goto START

ale tu mamy zupełnie niepotrzebne użycie słowa goto, które tylko zaciemnia cały obraz i sprawia, że kod jest dużo mniej czytelny.

Co do Twojego problemu, to nie ma żadnego problemu ;)

string input = Console.ReadLine();
if(input == "y")...

Tyle. A jeśli chcesz, żeby użytkownik podał znak bez wciskania klawisza Enter, to do tego służy funkcja ReadKey().

0
  1. Zrób pętlę która będzie miala warunek
bool running = true
while (running)
  1. jezeli wcisnie uzytkownik odpowiedni przycisk ustaw wtedy flage na false
running = false
  1. calą logike aplikacji miej w tej pętli
0

Zastanawiam się czy używanie Environment.Exit(0); jest w tym przypadku właściwe .
Ja wolałbym żeby program zakończył się w sposób naturalny chyba że został wykryty jakiś wyjątek, który nie może zostać prawidłowo obsłużony.

0
lukaszek016 napisał(a):

Ewentualnie można zrobić inny sposób wyjścia z programu. Wyrzucić jakiekolwiek instrukcje zamykające aplikację, a while uzależnić od jakiejś zmiennej, która przy decyzji wyjścia z programu zmieni wartość na false, pętla się skończy a razem z nią program skończy swoje działanie.

Zrobiłem takie coś:

KOD

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

namespace trening {
    class Program {
        static void Main(string[] args) {
            do {
                Console.WriteLine("1");
                Console.WriteLine("2");
                Console.WriteLine("Czy chcesz zakończyć program y/n ?");
                string line = Console.ReadLine();
                if (line == "y") {
                    break;
                }
            } while (true) ;

        }

    }
}
0

Zamieniłeś tylko GOTO na while. Poza tym miało być while, a nie do-while. Co prawda tutaj nie ma to większego znaczenia, ale jak zmodyfikujesz kod na while(zmienna) to po zaznaczeniu wyjścia z aplikacji wszystko odpali się jeszcze raz. Zmień do-while na while.

A jak będziesz miał 10 opcji w menu to wrzucisz 10 razy konstrukcję if?

0

A nie lepiej po prostu, żeby program działał bez przerwy, a użytkownik jak będzie chciał zamknąć program to naciśnie sobie i tak Ctrl+C?

0
lukaszek016 napisał(a):

Zamieniłeś tylko GOTO na while. Poza tym miało być while, a nie do-while. Co prawda tutaj nie ma to większego znaczenia, ale jak zmodyfikujesz kod na while(zmienna) to po zaznaczeniu wyjścia z aplikacji wszystko odpali się jeszcze raz. Zmień do-while na while.

A jak będziesz miał 10 opcji w menu to wrzucisz 10 razy konstrukcję if?

bool running = true;
            while (running) {
                Console.WriteLine("1");
                Console.WriteLine("2");
                Console.WriteLine("Czy chcesz zakończyć program y/n ?");
                string decyzja = Console.ReadLine();
                if (decyzja == "y") {
                    Environment.Exit(0);
                }

Do switch jeszcze nie doszedłem w nauce :)

Dzięki za pomoc, mam to co chciałem.

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