Оповещение пользователя о том, что другие типы данных (например, строка) были вставлены без сбоев

#c# #.net

#c# #.net

Вопрос:

Это интерфейс для вычисления. Интерфейс имеет два метода calculateArea и totalCost .

 public interface ICalculation {
  int calculateArea();int totalCost()
}
  

Здесь я наследую класс интерфейса. Переменными являются litre, length, height .

 public class Calculation : ICalculation {
    public int litre;
    public int length;
    public int height;
    public Calculation() {
        litre= 0;length = 0;height = 0;
    }

    public Calculation(int litre2, int lenght2, int height2) {
         this.litre = litre2;
         this.length = lenght2;
         this.height = height2;
    }

    public int calculateArea() {
        return length * height;
    } 

    public int totalCost() {
        return calculateArea()* litre;
    }
  

Тестирование программы для просмотра выходных данных.
Создайте новое вычисление объекта, а затем попросите пользователя ввести литр, длину и высоту. Вычислите площадь и общую стоимость после получения значений.

 class Tester {
    static void Main(string[] args) {
       Calculation c = new Calculation();

       try{ 
            Console.WriteLine("How much litre?");
            c.litre = int.Parse(Console.ReadLine());
            Console.WriteLine("What is the lenght");
            c.length = int.Parse(Console.ReadLine());
            Console.WriteLine("What is the height");
            c.height = int.Parse(Console.ReadLine());

            Console.WriteLine("The Total area "   c.calculateArea());
            Console.WriteLine("The Total cost for the project is "   c.totalCost());
            Console.ReadKey();
        }       
        catch(FormatException ){
            Console.WriteLine("{0}is not an integer, try again!");
            // Console.ReadLine();
        }
    }
}
  

Я хочу, чтобы пользователь мог вводить ТОЛЬКО значения int с консоли, а именно; литр, длина и высота. Предупреждает пользователя о том, что были вставлены другие типы данных (например, строка), и предлагает им повторить попытку. Проблема в том, что код вылетает, как только в любое из заданных значений вставляется значение, отличное от int. Есть мысли о том, как это сделать?

Ответ №1:

Я бы сказал, проверка с использованием цикла while.

 int i;
while (true)
{
  var line = Console.ReadLine();
  if (int.TryParse(line, out i))
    break;
  Console.WriteLine("Invalid number");
}
  

Комментарии:

1. Подробное объяснение высоко ценится?

2. Использование int.TryParse заключается в том, чтобы избежать исключений, возникающих во время недопустимого приведения. Он вернется true , если синтаксический анализ будет успешным, а false если нет. break Оператор выведет вас из цикла. В ответе use on @Mark Fro указано, что, хотя пользовательский ввод не является допустимым целым числом, он будет продолжать отображаться "Invalid number" , но если он действителен, он выйдет из цикла, чтобы продолжить программные процессы. Существуют разные способы реализации этого, но основным помощником является int.TryParse .

3. хорошо, где и как я могу изменить код для проверки этого? я использую объект c для чтения значений, полученных с консоли..

Ответ №2:

Модифицированная версия Mark answer .

 public  static int ReadFromConsole()
{
    int i;
    while (true)
    {
        var line = Console.ReadLine();
        if (int.TryParse(line, out i)) break;
        Console.WriteLine("Invalid number.");
    }

    return i;
}
  

тогда вы можете просто вызвать это так.

 Console.WriteLine("How much litre?");
c.litre = ReadFromConsole();
Console.WriteLine("What is the lenght");
c.length = ReadFromConsole();
Console.WriteLine("What is the height");
c.height = ReadFromConsole();