1

При выборе действия в первом switch, переходит ко второму, не дает два раза ввести данные с клавиатуры, переходя в блок default. В чем может быть проблема?

То есть я вижу:

Выберите таблицу:
1. Гости
2. Номера
3. Заселение
4. Категории намеров
5. Стоимость номеров
1
Выбрана таблица 'Гости'
Выберите действие:
1. Создать (CREATE)
2. Вывод (READ / SELECT)
3. Обновить (UPDATE)
4. Удалить (DELETE)
0. Назад (BACK)
Незивестная команда
Выберите действие:
1. Создать (CREATE)
2. Вывод (READ / SELECT)
3. Обновить (UPDATE)
4. Удалить (DELETE)
0. Назад (BACK)
Незивестная команда
Выберите действие:
1. Создать (CREATE)
2. Вывод (READ / SELECT)
3. Обновить (UPDATE)
4. Удалить (DELETE)
0. Назад (BACK)

А должно быть:

Выберите таблицу:
1. Гости
2. Номера
3. Заселение
4. Категории намеров
5. Стоимость номеров
1
Выбрана таблица 'Гости'
Выберите действие:
1. Создать (CREATE)
2. Вывод (READ / SELECT)
3. Обновить (UPDATE)
4. Удалить (DELETE)
0. Назад (BACK)

Далее код:

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

namespace Kursovaya { class Program { static void Main(string[] args) { SelectTable(); } public static void SelectTable() { Console.Clear();

        Console.WriteLine("Выберите таблицу: ");
        Console.WriteLine("1. Гости");
        Console.WriteLine("2. Номера");
        Console.WriteLine("3. Заселение");
        Console.WriteLine("4. Категории намеров");
        Console.WriteLine("5. Стоимость номеров");
        int table = Console.Read();

        switch (table)
        {
            case '1':
                Console.WriteLine("Выбрана таблица 'Гости'");
                SelectAction();
                break;
            case '2':
                SelectAction();
                break;
            case '3':
                SelectAction();
                break;
            case '4':
                SelectAction();
                break;
            case '5':
                SelectAction();
                break;
            default:
                Console.WriteLine("Незивестная команда");
                SelectTable();
                break;
        }
        Console.ReadKey();
    }

    public static void SelectAction()
    {
        Console.WriteLine("Выберите действие: ");
        Console.WriteLine("1. Создать (CREATE)");
        Console.WriteLine("2. Вывод (READ / SELECT)");
        Console.WriteLine("3. Обновить (UPDATE)");
        Console.WriteLine("4. Удалить (DELETE)");
        Console.WriteLine("0. Назад (BACK)");

        int action = Console.Read();
        switch (action)
        {
            case '1':

                break;
            case '2':
                break;
            case '3':
                break;
            case '4':
                break;
            case '0':
                SelectTable();
                break;
            default:
                Console.WriteLine("Незивестная команда");
                SelectAction();
                break;
        }
        Console.ReadKey();
        Console.Clear();
    }
}

}

1 Answers1

0

Используйте ReadLine вместо Read:

class Program
{
    static void Main(string[] args)
    {
        SelectTable();
    }
    public static void SelectTable()
    {
        //Console.Clear();
    Console.WriteLine("Выберите таблицу: ");
    Console.WriteLine("1. Гости");
    Console.WriteLine("2. Номера");
    Console.WriteLine("3. Заселение");
    Console.WriteLine("4. Категории намеров");
    Console.WriteLine("5. Стоимость номеров");
    string table = Console.ReadLine();

    switch (table)
    {
        case "1":
            Console.WriteLine("Выбрана таблица 'Гости'");
            SelectAction();
            break;
        case "2":
            SelectAction();
            break;
        case "3":
            SelectAction();
            break;
        case "4":
            SelectAction();
            break;
        case "5":
            SelectAction();
            break;
        default:
            Console.WriteLine("Незивестная команда");
            SelectTable();
            break;
    }
    Console.ReadKey();
}

public static void SelectAction()
{
    Console.WriteLine("Выберите действие: ");
    Console.WriteLine("1. Создать (CREATE)");
    Console.WriteLine("2. Вывод (READ / SELECT)");
    Console.WriteLine("3. Обновить (UPDATE)");
    Console.WriteLine("4. Удалить (DELETE)");
    Console.WriteLine("0. Назад (BACK)");

    string action = Console.ReadLine();
    switch (action)
    {
        case "1":

            break;
        case "2":
            break;
        case "3":
            break;
        case "4":
            break;
        case "0":
            SelectTable();
            break;
        default:
            Console.WriteLine("Незивестная команда");
            SelectAction();
            break;
    }
    Console.ReadKey();
    Console.Clear();
}

}

После ReadLine программа останавливается и ждёт пока вы не введёте строку и не нажмёте Enter. При Read читается текущее (мгновенное) состояние нажатых клавиш и идёт дальнейшее выполнение программы. Ваш код Read возвращает -1 если не нажата ни одна клавиша (так обычно и происходит), поэтому вы и попадаете в секцию default.

A K
  • 28,718
  • 1
    Здесь надо избавиться от двойной рекурсии, она ни к чему хорошему не приведет. – aepot Oct 31 '20 at 09:09
  • 1
    @aepot Очень хорошее замечание, я видя что явная домашка не вглядывался пристально что ещё в этом коде стоит улучшить. – A K Oct 31 '20 at 09:32