2009-11-13 8 views
0

Je crée un court programme de console C# qui posera 10 questions supplémentaires en utilisant des nombres aléatoires de 0-10. Ensuite, il indique à l'utilisateur combien de réponses correctes ou incorrectes ils avaient. J'essaie de trouver un moyen de valider que mon entrée d'utilisateur est un nombre et non une lettre. Je poste le code que j'ai créé jusqu'à présent, mais je pourrais avoir besoin d'aide.Validation de l'entrée - Chiffres et lettres

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); 
     } 
    } 
} 
+0

J'ai modifié mon extrait de sorte que vous pouvez littéralement remplacer votre section ReadLine() avec maintenant . –

Répondre

14

Utilisation int.TryParse() comme:

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; 
    } 
} 
+0

sympa et direct, sans aucune exception supplémentaire flottant – curtisk

+1

Pourquoi ne pas simplement utiliser Int32.TryParse (String, Int32) au lieu de le faire deux fois? –

+0

Oui, Xaero. Edité pour refléter la bonne surcharge. –

2
int iResult = int.MinValue; 
bool bParsed = int.TryParse("xyz", out iResult); 

TryParse ne lancera pas une exception. Toutefois, vous pouvez également utiliser Convert.ToInt32() si nécessaire, mais cela déclenchera une exception sur les données incorrectes.

+0

Pas besoin d'initialiser iResult comme c'est un paramètre out. –

0

Cela vous permet de remplir toutes les positions de votre tableau:

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; 
+0

Pourquoi le 'continuer'? –

+0

Je souhaite également inviter l'utilisateur à entrer à nouveau un numéro – Eric

+0

Eric, il suffit de mettre un certain temps (validNumber) autour de la ReadLine avec un drapeau booléen 'validNumber' que vous avez défini sur true si valide, et sur false en dehors de la boucle while. –

1

Quelque chose comme:

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

Au lieu de:

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

Utilisation:

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

EDIT: Si vous voulez demander récursive pour une entrée correcte, voici comment vous pouvez le faire:

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"); 
    } 
} 
+0

Travailler avec votre solution, mais je veux aussi reprompt à l'utilisateur d'entrer une réponse valide, devrais-je utiliser une boucle while au lieu d'un if? et puis-je faire ça? – Eric

+0

Vérifiez mes commentaires édités. Ajouté la réponse à cela. – Yogesh

Questions connexes