Калькулятор в C # - PullRequest
       11

Калькулятор в C #

0 голосов
/ 10 октября 2019

Невозможно проверить, что пользовательский ввод является целым числом. Хотел бы зациклить программу, если пользовательский ввод требует, чтобы программа делилась на ноль. Также хотелось бы проверить, если пользователь вводит нецелое число как Num1, или Num2 и operation, ввод - буква "m" или "d".

Попытка с использованием циклов Do while для проверкиесли пользователь ввел 0 для Num2 и выбрал деление чисел.

using System;

namespace Lab3
{
    public class Lab3
    {
        public static void Main()
        {
            prompt();
        }
        public static double multiply(double x, double y)
        {
            double product = x * y;
            return product;
        }
        public static double divide(double x, double y)
        {
            double result = x / y;
            return result;
        }
        public static void prompt()
        {
            double Num1;
            double Num2;
            char operation;

            Console.WriteLine("Please input a number: ");
            Num1 = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("Please input a second number: ");
            Num2 = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("Indicate if you would like to multiply or divide your first number by your second number");

            operation = Convert.ToChar(Console.ReadLine());

            if (operation == 'm')
            {
                double product = multiply(Num1, Num2);
                Console.WriteLine("The product of {0} and {1} is {2}", Num1, Num2, product);
                Console.ReadLine();
            }
            else if(operation == 'd')
            {
                double result = divide(Num1, Num2);
                Console.WriteLine("The quotient of {0} and {1} is {2}", Num1, Num2, result);
                Console.ReadLine();
            }
        }
    }
}

Сбой программы, если пользователь вводит нецелые Num1 и Num2, значение кроме «d» или «m» для operation. Кроме того, программа выводит «Коэффициент 0 и 0 равен NaN», если Num1 - целое число, Num2 - 0, а operation - «d».

Например:

Please input a number:
0
Please input a second number:
0
Indicate if you would like to multiply or divide your first number by your second number
d
The quotient of 0 and 0 is NaN

1 Ответ

0 голосов
/ 10 октября 2019

Я использую пользовательский метод для получения строго типизированных данных от пользователя. Он принимает строку, которая используется для запроса данных у пользователя, и необязательный метод проверки, который можно использовать для проверки того, что входные данные соответствуют вашим критериям. Метод запускает цикл, который непрерывно запрашивает у пользователя, пока он не введет действительные данные:

private static double GetDoubleFromUser(string prompt, Func<double, bool> validator = null)
{
    double result;
    var cursorTop = Console.CursorTop;

    do
    {
        ClearSpecificLineAndWrite(cursorTop, prompt);
    } while (!double.TryParse(Console.ReadLine(), out result) ||
                !(validator?.Invoke(result) ?? true));

    return result;
}

private static char GetCharFromUser(string prompt, Func<char, bool> validator = null)
{
    char result;
    var cursorTop = Console.CursorTop;

    do
    {
        ClearSpecificLineAndWrite(cursorTop, prompt);
        result = Console.ReadKey().KeyChar;
    } while (!(validator?.Invoke(result) ?? true));

    Console.WriteLine();
    return result;
}

private static void ClearSpecificLineAndWrite(int cursorTop, string message)
{
    Console.SetCursorPosition(0, cursorTop);
    Console.Write(new string(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, cursorTop);
    Console.Write(message);
}

С этими вспомогательными методами ваш код будет выглядеть следующим образом:

public static void prompt()
{
    double num1 = GetDoubleFromUser("Please input a number: ");
    double num2 = GetDoubleFromUser("Please input a second number: ");
    char operation = GetCharFromUser(
        "Do you want to (m)ultiply or (d)ivide the first number by the second: ",
        c => c == 'm' || c == 'd');

    if (operation == 'm')
    {
        double product = multiply(num1, num2);
        Console.WriteLine("The product of {0} and {1} is {2}", num1, num2, product);
    }
    else
    {
        if (num2 == 0) 
        {
            Console.WriteLine("Sorry, you cannot divide by zero.");
        }
        else
        {
            double result = divide(num1, num2);
            Console.WriteLine("The quotient of {0} and {1} is {2}", num1, num2, result);
        }
    }

    Console.ReadLine();
}
...