Проверка ввода - числа против букв

Asked
Viewd5156

0

Я создаю короткую консольную программу на C #, которая будет задавать 10 дополнительных вопросов, используя случайные числа от 0 до 10.Затем он сообщает пользователю, сколько у него было правильных или неправильных ответов.Я пытаюсь найти способ проверить, что вводимые мной данные являются числом, а не буквой.Я публикую код, который уже создал, но мне нужна помощь.

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            int input;
            int correct = 0;
            int incorrect = 0;
            int questions = 10;
            int[] solutions = new int[21];
            int[] answers = new int[21];
            int[] number1 = new int[21];
            int[] number2 = new int[21]; 

            Random number = new Random();

            Console.WriteLine("  This is a test of your basic addition skills. ");
            Console.WriteLine("  Please answer the random addition question below ");
            Console.WriteLine("  with a number from 1 - 20 and press enter to get the");
            Console.WriteLine("  next of 10 questions.  At the end of the questions");
            Console.WriteLine("  your results will be calculated and presented to you.");
            Console.WriteLine("");
            Console.WriteLine("");

            while (i < questions)
            {
                number1[i] = number.Next(0, 10);
                number2[i] = number.Next(0,10);
                solutions[i] = (number1[i] + number2[i]);

                //Console.WriteLine("{0} +  {1} =  {2}", number1[i], number2[i],solutions[i]);  

                Console.Write("  {0} +  {1} =  ", number1[i], number2[i]);

                answers[i] = Convert.ToInt32(Console.ReadLine()); // original code      

                //input = Convert.ToInt32(Console.ReadLine());
                //if (input > 0 && input <21)
                //{
                //   Console.WriteLine("YOur answer is: {0}", input);
                //}
                //else
                //Console.WriteLine("YOur answer is not valid");

                if (solutions[i] == answers[i])
                {
                    Console.WriteLine("  Correct");
                    correct++;
                }
                else
                {
                    Console.WriteLine("  Your answer is incorrect, the correct answer is {0}", solutions[i]);
                    incorrect++;

                }
                //Console.WriteLine("{0}", answers[i]);

                //int sum = numberone + numbertwo;
                //answers[sum]++;
                i++;
            }

            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("The number correct is: {0}, The number incorrect is: {1}", correct, incorrect);
        }
    }
}
 
  • Я отредактировал свой фрагмент, теперь вы можете буквально заменить им раздел ReadLine ().

    Wim Hollebrandse13 ноября 2009, 20:49

5 ответов

0

Это позволяет вам заполнить все позиции вашего массива:

 int result;
bool isInt = Int32.TryParse(Console.ReadLine(), out result);
if (!isInt) {
  Console.WriteLine("Your input is not an integer number.");
  continue;
}

answers[i] = result;
 
  • Эрик, просто поместите некоторое время (validNumber) вокруг ReadLine с логическим флагом «validNumber», который вы установите в значение true, если он действителен, и в значение false вне цикла while.

    Wim Hollebrandse13 ноября 2009, 20:42
  • Я также хочу предложить пользователю повторно ввести номер

    Eric13 ноября 2009, 20:36
3

Вместо:

 answers[i] = Convert.ToInt32(Console.ReadLine()); // original code
 

Использование:

 int input;
bool validInput = int.TryParse(Console.ReadLine(), out input);
if (!validInput || input < 0 && input > 20)
    <throw exception or display some error message here...>
 

РЕДАКТИРОВАТЬ: Если вы хотите рекурсивно запрашивать правильный ввод, вы можете сделать это следующим образом:

 int input;
bool validInput = false;

while (!validInput)
{
    validInput = int.TryParse(Console.ReadLine(), out input);
    if (!validInput || input < 0 && input > 20)
    {
        validInput = false; // We need to set this again to false if the input is not between 0 & 20!
        Console.WriteLine("Please enter a number between 0 and 20");
    }
}
 
  • Работая с вашим решением, но я также хочу напомнить пользователю, чтобы он повторно вводил правильный ответ, следует ли использовать цикл while вместо if?и я могу это сделать?

    Eric13 ноября 2009, 21:07
2
 int iResult = int.MinValue;
bool bParsed = int.TryParse("xyz", out iResult);
 

TryParse не вызовет исключения.

Однако вы также можете использовать Convert.ToInt32 () при необходимости, но это вызовет исключение для неверных данных.

  • Нет необходимости инициализировать iResult, поскольку это выходной параметр.

    Philip Wallace13 ноября 2009, 20:31
1

Что-то вроде:

 if (int.TryParse(Console.ReadLine(), out answers[i]) && answers[i] > 0 && ...)
{ 
    ...
}
else
{
   // invalid answer
}
 
14

Используйте int.TryParse () как:

 bool isNumber=false;
int number;
while (!isNumber)
{
  string txt = Console.ReadLine();
  if (!int.TryParse(txt, out number))
  {
    // not a number, handle it
    Console.WriteLine("This is not a number, enter a number. For real now.");
  }
  else
  {
    // use number
    answers[i] = number;
    isNumber = true;
  }
}
 
  • нужен выходной параметр - не компилируется а число int будет доступно только из области else

    PostMan13 ноября 2009, 20:35
  • красиво и прямо, никаких лишних исключений

    curtisk13 ноября 2009, 20:32
  • Почему бы просто не использовать Int32.TryParse (String, Int32) вместо того, чтобы делать это дважды?

    Philip Wallace13 ноября 2009, 20:33
  • Он просто оставил пустые позиции в массиве ответов

    eKek013 ноября 2009, 20:35