Не разрешать другой вариант - PullRequest
0 голосов
/ 07 января 2019

Я застрял с небольшой проблемой. Я создаю программу, в которой пользователь должен выбрать 5 вариантов (1. Ввод чисел 2. Показать наименьшее 3. Показать наибольший 4. Показать все числа 5 Выйти.) Все опции работают. Проблема в том, что когда пользователь выбирает опцию, при нажатии любой буквы выдает ошибку. Я хочу, чтобы, если пользователь нажимал любую букву или любой символ, было предупреждающее сообщение типа «Введено неизвестное значение параметра» и повторите попытку. Я предполагаю, что речь идет о преобразовании или что-то подобное, но я не могу найти, где проблема. Вот мой код:

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

namespace Assignmen2014_15
{
    class Program
    {
    const int MAXNUMBERS = 3;
        static void Main(string[] args)
        {
        int[] theNumbers = new int[MAXNUMBERS];
        int chosenOption = 0;
        bool quit = false;

        InitialiseNumbers(theNumbers);
        while (quit == false)
            {
            DisplayHeader();
            DisplayMenu();
            chosenOption = ReadNumber("Please choose an option: ");
            quit = ProcessMenu(chosenOption, theNumbers);
            Console.Clear();
            }
        }
        static void InitialiseNumbers(int[] numbers)
        {
            for (int index = 0; index < MAXNUMBERS; index++)
            {
            numbers[index] = 0;
            }
        }
        static void DisplayHeader()
        {
        WriteText("*******************************************************************************", 0, 0); // Top left hand corner of screen is x = 0, y = 0;
        WriteText("* This application is designed to allow you to choose numbers *", 0, 1); // Next line down is x = 0, y = 1, etc WriteText("* and finds the biggest and the smallest value *", 0, 2);
        WriteText("*******************************************************************************", 0, 3);
        }
        static void DisplayMenu()
        {
            WriteText("Select an option", 20, 8); // Display menu at at x = 20, y = 8
            WriteText("1. Enter the numbers", 20, 9);
            WriteText("2. Find the smallest", 20, 10);
            WriteText("3. Find the largest", 20, 11);
            WriteText("4. Display all numbers", 20, 12);
            WriteText("5. Quit", 20, 13);
        }
        static void WriteText(string text, int x, int y)
        {
            Console.CursorLeft = x;
            Console.CursorTop = y;
            Console.Write(text);
        }
        static int ReadNumber(string prompt)
        {
            string text;
            int number;
            WriteText(prompt, 20, 14);
            text = Console.ReadLine();
            number = int.Parse(text);
            ClearText(20, 14, prompt.Length + text.Length); // Clear the text at this line
            return number;

        }
        static void ClearText(int x, int y, int length)
        {
            // Write space ' ' characters starting at x, y for 'length' times
            WriteText(new String(' ', length), x, y);
        }

        static void DisplayNumbers(int[] theNumbers)
        {
            Console.Write("Your numbers are: ");
            for (int i = 0; i < MAXNUMBERS; i++)
            {
                Console.WriteLine(theNumbers[i]);
            }

        }

        static bool ProcessMenu(int option, int[] numbers)
        {
            bool quit = false;

            switch (option)
            {
                case 1:
                    GetNumbers(numbers);
                    break;
                case 2:
                    WriteText(string.Format("The smallest value is {0}", FindSmallest(numbers)), 20, 15);
                    Console.ReadKey(); // Pause
                    break;
                case 3:
                    WriteText(string.Format("The largest value is {0}", FindLargest(numbers)), 20, 15);
                    Console.ReadKey(); // Pause
                    break;
                case 4:
                    DisplayNumbers(numbers);
                    Console.ReadKey();
                    break;
                case 5:
                    quit = IsQuitting();
                    break;
                default:
                    WriteText("Unknown option value entered", 20, 15);
                    Console.ReadKey(); // Pause 
                    break;
            }
            return quit;
        }
        static void GetNumbers(int[] numbers)
        {
            for (int index = 0; index < MAXNUMBERS; index++)
            {
                numbers[index] = ReadNumber("Enter number: ");
            }
        }
        static int FindSmallest(int[] numbers)
        {
            int smallest = numbers[0];
            for (int index = 0; index < MAXNUMBERS - 1; index++) // <-- subtract 1
            {
                if (numbers[index + 1] < smallest)
                {
                    smallest = numbers[index + 1];
                }
            }
            return smallest;
        }
        static int FindLargest(int[] numbers)
        {
            int largest = numbers[0];
            for (int index = 0; index < MAXNUMBERS - 1; index++) // <-- subtract 1
            {
                if (numbers[index + 1] > largest)
                {
                    largest = numbers[index + 1];
                }
            }
            return largest;
        }
        static bool IsQuitting()
        {
            string response;
            bool quit = false;
            WriteText("Do you really wish to quit? ", 20, 13);
            response = Console.ReadLine();
            if (response.Equals("Yes" , StringComparison.InvariantCultureIgnoreCase) || response.Equals("Y", StringComparison.InvariantCultureIgnoreCase))
            {
                quit = true;
            }
            return quit;
        }
    }
}

1 Ответ

0 голосов
/ 07 января 2019

Используйте метод Int32.TryParse(String, Int32), который пытается проанализировать строку в целое число и возвращает логическое значение, представляющее, был ли анализ успешным или нет. В вашем случае, если синтаксический анализ завершится неудачно, вы можете вернуть -1 из вашего ReadNumber метода, который вызовет default: часть вашего регистра переключателя, и появится сообщение об ошибке. В противном случае, если анализ был успешным, вы можете просто вернуть проанализированный номер, который будет либо одним из ваших желаемых номеров, либо вызовет действие default:.

Ниже приведен пример из документации Microsoft

String[] values = { null, "160519", "9432.0", "16,667",
                      "   -322   ", "+4302", "(100);", "01FA" };
foreach (var value in values) 
{
   int number;

   bool success = Int32.TryParse(value, out number);
   if (success)
   {
      Console.WriteLine("Converted '{0}' to {1}.", value, number);         
   }
   else
   {
      Console.WriteLine("Attempted conversion of '{0}' failed.", 
                         value ?? "<null>");
   }
}

В вашем конкретном примере вам нужно изменить метод ReadNumber(string prompt):

static int ReadNumber(string prompt)
{
    string text;
    int number;
    WriteText(prompt, 20, 14);
    text = Console.ReadLine();
    bool is_parsing_successful = Int32.TryParse(text, out number);
    ClearText(20, 14, prompt.Length + text.Length); // Clear the text at this line
    if(is_parsing_successful){
        return number;
    } else {
        return -1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...