TryParse Handling in Loop - c#

I'm using TryParse to check if user enters integer or not in a loop and if user enters any character or non integer value user will receive invalid message and loop goes to next iteration.
I want user to re-enter input to same iteration.
int[] number = new int[5];
int newSum = 0;
int outValue;
Console.Write("Enter Five Integer Digits: \n");
for (int i = 0; i <= number.Length - 1; i++)
{
Console.Write("Number {0}: ", i);
bool Parse = Int32.TryParse(Console.ReadLine(), out outValue);
if (Parse)
{
number[i] = outValue;
}
else
{
Console.WriteLine("You Have Entered InValid Format: ");
}
newSum += number[i];
}
Console.WriteLine("Sun of Numbers :{0}", newSum);
I expected the output to be
Number 2: h
You Have Entered InValid Format:
Number 2:
But the actual output is
Number 2: h
You Have Entered InValid Format:
Number 3:

I'd rewrite you loop in following way:
for (int i = 0; i <= number.Length - 1; i++)
{
Console.Write("Number {0}: ", i);
bool Parse = Int32.TryParse(Console.ReadLine(), out outValue);
if (Parse)
{
// if parsing is successfull, then add to array and to sum :)
number[i] = outValue;
newSum += number[i];
}
else
{
Console.WriteLine("You Have Entered InValid Format: ");
// just decrement iterator to repeat this iteration
i--;
}
}

for (int i = 0; i < number.Length; i++)
{
Console.Write("Number {0}: ", i);
bool Parse = Int32.TryParse(Console.ReadLine(), out outValue);
if (Parse)
{
number[i] = outValue;
newSum += number[i];
}
else
{
i--;
Console.WriteLine("You Have Entered InValid Format: ");
}
}

I'm not a fan of changing the value of the index inside a for-next loop (code smell!).
An alternative is:
var i=0;
while (i < 5)
{
Console.Write("Number {0}: ", i);
bool Parse = Int32.TryParse(Console.ReadLine(), out outValue);
if (Parse)
{
number[i] = outValue;
newSum += number[i];
i++;
}
else
{
Console.WriteLine("You Have Entered InValid Format: ");
}
}
It would be worth checking for some form of "escape" character as the while loop will not exit until 5 acceptable values are entered.

Related

do/while and if/else problems

I have to put in an extra "test score" to get an answer.
(i.e i have to enter six 5' to get 25)
I can't get the do/while & if statements to loop if there is more than one number outside the "while" range. I haven't been coding for very long, a couple weeks so try and break down the answers. Thanks for the help!
Here is my code
Console.Write("Enter the number of tests: ");
int n = int.Parse(Console.ReadLine());
int[] scores = new int[n];
Console.WriteLine("----------------------------------------");
Console.WriteLine("Please enter the test scores");
int i;
do
{
i = Convert.ToInt32(Console.ReadLine());
if (i < 0)
{
Console.WriteLine("Please enter a value greater than 0");
}
if (i > 100)
{
Console.WriteLine("Please enter a value less than 100");
}
} while (i < 0 || i > 100);
for (i = 0; i < n; i++)
{
scores[i] = int.Parse(Console.ReadLine());
}
int sum = 0;
foreach (int d in scores)
{
sum += d;
}
Console.WriteLine("The sum of all the scores is {0}",sum);
Console.ReadLine();
Put the do block that does the input validation inside the for loop:
Console.Write("Enter the number of tests: ");
int n = int.Parse(Console.ReadLine());
int[] scores = new int[n];
Console.WriteLine("----------------------------------------");
Console.WriteLine("Please enter the test scores");
for (int i = 0; i < n; i++)
{
int input = -1;
do
{
input = Convert.ToInt32(Console.ReadLine());
if (input < 0)
{
Console.WriteLine("Please enter a value greater than 0");
}
else if (input > 100)
{
Console.WriteLine("Please enter a value less than 100");
}
} while (input < 0 || input > 100);
scores[i] = input;
}
int sum = 0;
foreach (int d in scores)
{
sum += d;
}
Console.WriteLine("The sum of all the scores is {0}", sum);
Console.ReadLine();
n is the number of tests, meaning the amount of scores counter i should be the same as the amount of tests. Also prefer Convert.ToInt32 to int.Parse since it throws exceptions in case it isn't able to make the conversion.
Console.Write("Enter the number of tests: ");
int n = Convert.ToInt32(Console.ReadLine());
int sum = 0, i = 0, score = 0;
int[] scores = new int[n];
Console.WriteLine("----------------------------------------");
do {
Console.WriteLine("Please enter the test score #" + (i + 1));
score = Convert.ToInt32(Console.ReadLine());
if (score < 0) {
Console.WriteLine("Please enter a value greater or equal to 0");
}
else if (score > 100)
{
Console.WriteLine("Please enter a value less or equal to 100");
}
else {
scores[i] = score;
i++;
}
} while (i < n);
foreach (int d in scores) {
sum += d;
}
Console.WriteLine("The sum of all the scores is {0}", sum);
Console.ReadLine();
Just for the potential learning opportunity, and and not as a direct answer to your question, here is the way I would do this exercise:
Console.Write("Enter the number of tests: ");
int n = int.Parse(Console.ReadLine());
Console.WriteLine("----------------------------------------");
Console.WriteLine("Please enter the test scores");
int AskForInteger()
{
while (true)
{
if (int.TryParse(Console.ReadLine(), out int i) && i >= 0 && i <= 100)
{
return i;
}
Console.WriteLine("Please enter a value between 0 and 100 inclusive");
}
}
int[] scores =
Enumerable
.Range(0, n)
.Select(x => AskForInteger())
.ToArray();
Console.WriteLine("The sum of all the scores is {0}", scores.Sum());
Console.ReadLine();
There are two options:
a. Start at 1 rather than 0 --> for (i = 1; i < n; i++)
b. Lower the value of n by 1 --> for (i = 1; i < n-1; i++)
Good luck

C# Need inputs in different lines

I am trying to create a program that is will take letters as input only and not duplicated. I am getting error when i put one letter in an input.
This is what i need to do, I need to get the user input in each line (like a enter, b enter, etc), if there is a duplication value i need a error message and continues with the input, and if there is incorrect value i get another error stating such. I cannot use LINQ, Hashset, nor list, it has to be arrays.
static void Main(string[] args)
{
char[] Array = new char[5];
Console.WriteLine("Please Enter 5 Letters B/W a through j only: ");
string letters = "abcdefghij";
char[] read = Console.ReadLine().ToLower().ToCharArray();
//loop through array
for (int i = 0; i < 5; i++)
{
if (letters.Contains(read[i]) && !Array.Contains(read[i]))
{
Array[i] = read[i];
}
else
{
Console.WriteLine("You have entered an incorrect value");
}
}
Console.WriteLine("You have Entered the following Inputs: ");
for (int i = 0; i < Array.Length; i++)
{
Console.WriteLine(Array[i]);
}
Console.ReadKey();
}
I think this more or less does what you want:
var max = 5;
var array = new char[max];
var letters = "abcdefghij";
var count = 0;
while (count < 5)
{
Console.WriteLine("Please Enter {0} Letters B/W a through j only: ", max);
var key = Console.ReadKey();
var read = key.KeyChar
if (!letters.Contains(read))
{
Console.WriteLine("You have entered an incorrect value");
continue;
}
var found = false;
for (int i = 0; i < count; i++)
{
if (array[i] == read)
{
found = true;
}
}
if (found)
{
Console.WriteLine("You have entered an duplicate value");
continue;
}
array[count++] = read;
}
Console.WriteLine("You have Entered the following Inputs: ");
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
}
Console.ReadKey();
If you want the user to enter the values individually then you would need to request each character in a loop.
Something like:
static void Main(string[] args)
{
const string validValues = "abcdefghij";
var enteredCharacters = new char[5];
for (int i = 0; i < enteredCharacters.Length; i++)
{
Console.WriteLine("Please enter a unique character between a and j");
var input = Console.ReadLine();
if (input.Length == 0)
{
Console.WriteLine("You did not enter a value.");
return;
}
if (input.Length > 1)
{
Console.WriteLine("You have entered more than 1 character");
return;
}
var character = input[0];
if (!validValues.Contains(character))
{
Console.WriteLine("You have entered an invalid character");
return;
}
if (enteredValues.Contains(character))
{
Console.WriteLine("You have already entered this character");
return;
}
enteredCharacters[i] = character;
}
// process numbers.
}
this is you problem
for (int i = 0; i < 5; i++)
this is your fix:
static void Main(string[] args)
{
char[] Array = new char[5];
Console.WriteLine("Please Enter 5 Letters B/W a through j only: ");
string letters = "abcdefghij";
char[] read = Console.ReadLine().ToLower().ToCharArray();
//loop through array
for (int i = 0; i < read.Length; i++)
{
if (letters.Contains(read[i]) && !Array.Contains(read[i]))
{
Array[i] = read[i];
}
else
{
Console.WriteLine("You have entered an incorrect value");
}
}
Console.WriteLine("You have Entered the following Inputs: ");
for (int i = 0; i < Array.Length; i++)
{
Console.WriteLine(Array[i]);
}
Console.ReadKey();
}

storing the result of a for loop into array and revrse it?

I want to store the result of the for loop in an array then reverse it.
Example:
When I run the program and enter 5 the answer will be
54321
I want it to be
12345
int num;
int index = 0;
Console.Write("Number: ");
num = int.Parse(Console.ReadLine());
for (int x = num; x > 0; x--)
{
index = Convert.ToInt32(index + x);
Console.Write(x);
}
Console.WriteLine("\nThe sum is: {0}", index);
Console.ReadLine();
How about this?
Console.Write("Number: ");
var num = int.Parse(Console.ReadLine()); // parse console input
var range = Enumerable.Range(1, num); //generate array of values from 1 to num
var str = String.Concat(range.Select(x => x.ToString())); //concatenate array of values
Console.WriteLine(str); // write string
var sum = range.Sum(); // get sum of array
Console.WriteLine("\nThe sum is: {0}", sum); // write sum
Console.ReadLine(); // pause
Ok, none of those responses really would do what you asked for, but I mut say your example is really misleading.
Try this:
public int[] ArrayAndReverse(int Number)
{
int[] data = new int[Number];
int index =
for (int x = Number; x > 0; x--)
{
index = Convert.ToInt32(index + x);
Console.Write(x);
}
return data.Reverse().ToArray();
}
now in your console code you can do:
Console.Write("Number: ");
num = int.Parse(Console.ReadLine());
int[] data = ArrayAndReverse(number);
foreach(int i in data)
Console.Write(i);
Also, not sure why your loop is already reversed, I suppose as I said this example is really misleading, else you can just use:
int[] data = Enum.Range(1, number).ToArray();
This will give you already the array in the right order.
Try this
For auto increment to total length
Use this
Console.WriteLine("Input length");
int length;
if (!int.TryParse(Console.ReadLine(), out length))
{
Console.WriteLine("Invalid number");
}
else
{
int[] array = new int[length];
for (int i = length; i > 0; i--)
{
array[length - i] = i;
}
Console.WriteLine("Array is");
foreach (var i in array)
{
Console.WriteLine(i);
}
Console.WriteLine("Reverse Array is");
foreach (var i in array.Reverse())
{
Console.WriteLine(i);
}
}
Console.ReadKey();
To take every number from user, try this
private static void Main(string[] args)
{
Console.WriteLine("Input length");
int length;
if (!int.TryParse(Console.ReadLine(), out length))
{
Console.WriteLine("Invalid number");
}
else
{
int[] array = new int[length];
for (int i = length; i > 0; i--)
{
int input;
Console.WriteLine("Input number");
if (!int.TryParse(Console.ReadLine(), out input))
{
Console.WriteLine("Invalid number");
input = 0;
}
array[length - i] = input;
}
Console.WriteLine("Array is");
foreach (var i in array)
{
Console.WriteLine(i);
}
Console.WriteLine("Reverse Array is");
foreach (var i in array.Reverse())
{
Console.WriteLine(i);
}
}
Console.ReadKey();
}

C# mastermind game

In the Main method, in the for loop, if you copy/paste/run whole program in visual, you'll see that i'm trying to end the game. First "if", if the user hasn't guessed; then attempts decrements by one and keeps guessing. The second "else if", if the user has guessed the PCArray, than the game ends and message shows. those work.
But, the first "else if", if the user has exhausted his attempts to guess, and hasn't guessed PCArray, than it should say "oh no, you couldn't guess..." Why is this not working.
I just want it to work so that if:
- user hasn't guessed but still has attempts, attempts decrements by 1 until 0.
- user has guessed the correct number, it says congrats.
- attempts are 0 and user still hasn't guessed number, then show "oh no..." message.
class Program
{
static void Main(string[] args)
{
string name;
Console.WriteLine("**************Let's play Master-Mined**************");
Console.WriteLine();
Console.Write("Please enter your name: ");
name = Console.ReadLine();
Console.WriteLine("Welcome {0}. Have fun!! ", name);
int numberCount = 0;
int difficultyLevel = 0;
int digitNumber = GetRandomNumberCount(numberCount);
Console.Write(digitNumber + " it is. Let's play.");
Console.WriteLine();
int[] PCArray = GenerateRandomNumbers(digitNumber);
Console.WriteLine("A " + digitNumber + "-digit number has been chosen. Each possible digit may be the number 1, 2, 3 or 4.");
Console.WriteLine(" ******");
int difficulty = GetGameDifficulty(difficultyLevel);
int attempts = difficulty * digitNumber;
Console.WriteLine("Enter your guess ({0} guesses remaining)", attempts);
int remaining = attempts;
for (int i = 0; i < attempts; i++)
{
int[] userArray = GetUserGuess(digitNumber);
int hits = CountHits(PCArray, userArray, attempts);
if ((hits != PCArray.Length) && (attempts > 0))
{
remaining--;
Console.WriteLine("Enter your guess ({0} guesses remaining)", remaining);
}
else if ((attempts < 1))
{
Console.WriteLine("Oh no {0}! You couldn't guess the right number.", name);
Console.WriteLine("The correct number is: ");
for (int j = 0; j < PCArray.Length; j++)
{
Console.Write(PCArray[j] + " ");
}
Console.WriteLine("Would you like to play again (Y/N)? ");
}
else if (hits == PCArray.Length)
{
attempts = 0;
Console.WriteLine("You win {0}!", name);
Console.WriteLine("The correct number is:");
for (int j = 0; j < PCArray.Length; j++)
{
Console.Write(PCArray[j] + " ");
}
}
}
Console.ReadLine();
}
public static int GetRandomNumberCount(int numberCount)
{
int number = 0;
do
{
try
{
Console.Write("How many numbers would you like to use in playing the game (4-10)? ");
number = int.Parse(Console.ReadLine());
Console.WriteLine();
}
catch
{
Console.WriteLine("You must pick a number between 4 and 10. Choose again.");
Console.WriteLine();
}
} while ((number < 4) || (number > 10));
return number;
}
public static int GetGameDifficulty(int difficultyLevel)
{
int difficulty = 0;
do
{
try
{
Console.Write("Choose a difficulty level (1=hard, 2=medium, 3=easy): ");
difficulty = int.Parse(Console.ReadLine());
}
catch
{
Console.WriteLine(" Incorrect entry: Please re-enter.");
}
} while ((difficulty < 1) || (difficulty > 3));
return difficulty;
}
public static int[] GenerateRandomNumbers(int PCSize)
{
int eachNumber;
int[] randomNumber = new int[PCSize];
Random rnd = new Random();
for (int i = 0; i < randomNumber.Length; i++)
{
eachNumber = rnd.Next(1, 5);
randomNumber[i] = eachNumber;
Console.Write(eachNumber);
}
Console.WriteLine();
return randomNumber;
}
public static int[] GetUserGuess(int userSize)
{
int number = 0;
int[] userGuess = new int[userSize];
for (int i = 0; i < userGuess.Length; i++)
{
Console.Write("Digit {0}: ", (i + 1));
number = int.Parse(Console.ReadLine());
userGuess[i] = number;
//Console.Write(number);
}
Console.WriteLine();
Console.Write("Your guess: ");
for (int i = 0; i < userGuess.Length; i++)
{
Console.Write(userGuess[i] + " ");
}
Console.WriteLine();
return userGuess;
}
public static int CountHits(int[] PCArray, int[] userArray, int attempts)
{
int hit = 0;
int miss = 0;
int hits = 0;
for (int i = 0; i < PCArray.Length; i++)
{
if (PCArray[i] == userArray[i])
{
hit = hit + 1;
hits = hit;
}
else
{
miss = miss + 1;
}
}
Console.WriteLine("Results: {0} Hit(s), {1} Miss(es)", hit, miss);
return hits;
}
}
First of all, you should rethink your code, because the flow control is scattered throughout your code. For example, you don't need both attempts and remaining, they control the same thing.
Using two variables to control the same thing is what is causing your problem. The first two ifs in your for should be like this:
if (hits != PCArray.Length && remaining > 1)
and
else if (remaining == 1)
Note I removed the unnecessary parenthesis. With these changes, your application works, although the code is not too pretty.
A simple way of enhancing your code is to first check for the right result, and if it's not, then decrease the attempts variable and finally check for its value. That's why with your code as it is, the if should compare to 1 instead of 0.
The hits variable in your CountHits method is totally unnecessary; you should just return hit. Actually the miss variable can be avoided too, you can calculate it. Also remember to use the ++ operator.
But as I said first, the important thing is not to make it work but to organize your code properly. Later I will post my version.
My version, it's not the most beautiful thing in the world but I didn't want to change much of your code structure:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("************** Let's play Master-Mind **************\n");
string name = GetPlayerName();
do
{
Play(name);
Console.Write("\nWould you like to play again (Y/N)? ");
}
while (Console.ReadLine().ToUpper() == "Y");
}
private static void Play(string name)
{
int numberCount = GetRandomNumberCount();
Console.Write(numberCount + " it is. Let's play.");
Console.WriteLine();
int[] PCArray = GenerateRandomNumbers(numberCount);
Console.WriteLine("A {0}-digit number has been chosen. Each possible digit may be the number 1 to 4.\n", numberCount);
int difficulty = GetGameDifficulty();
bool won = false;
for (int allowedAttempts = difficulty * numberCount; allowedAttempts > 0 && !won; allowedAttempts--)
{
Console.WriteLine("\nEnter your guess ({0} guesses remaining)", allowedAttempts);
int[] userArray = GetUserGuess(numberCount);
if (CountHits(PCArray, userArray) == numberCount)
won = true;
}
if (won)
Console.WriteLine("You win, {0}!", name);
else
Console.WriteLine("Oh no, {0}! You couldn't guess the right number.", name);
Console.Write("The correct number is: ");
for (int j = 0; j < numberCount; j++)
Console.Write(PCArray[j] + " ");
Console.WriteLine();
}
private static string GetPlayerName()
{
Console.Write("Please enter your name: ");
string name = Console.ReadLine();
Console.WriteLine("Welcome, {0}. Have fun!!\n", name);
return name;
}
public static int GetRandomNumberCount()
{
int number;
Console.Write("How many numbers would you like to use in playing the game (4-10)? ");
while (!int.TryParse(Console.ReadLine(), out number) || number < 4 || number > 10)
Console.WriteLine("You must pick a number between 4 and 10. Choose again.");
return number;
}
public static int GetGameDifficulty()
{
int difficulty = 0;
Console.Write("Choose a difficulty level (1=hard, 2=medium, 3=easy): ");
while (!int.TryParse(Console.ReadLine(), out difficulty) || difficulty < 1 || difficulty > 3)
Console.WriteLine("Incorrect entry: Please re-enter.");
return difficulty;
}
public static int[] GenerateRandomNumbers(int PCSize)
{
int eachNumber;
int[] randomNumber = new int[PCSize];
Random rnd = new Random();
Console.Write("PC number: ");
for (int i = 0; i < PCSize; i++)
{
eachNumber = rnd.Next(1, 5);
randomNumber[i] = eachNumber;
Console.Write(eachNumber);
}
Console.WriteLine();
return randomNumber;
}
public static int[] GetUserGuess(int userSize)
{
int number = 0;
int[] userGuess = new int[userSize];
for (int i = 0; i < userSize; i++)
{
Console.Write("Digit {0}: ", (i + 1));
while (!int.TryParse(Console.ReadLine(), out number) || number < 1 || number > 4)
Console.WriteLine("Invalid number!");
userGuess[i] = number;
}
Console.WriteLine();
Console.Write("Your guess: ");
for (int i = 0; i < userSize; i++)
{
Console.Write(userGuess[i] + " ");
}
Console.WriteLine();
return userGuess;
}
public static int CountHits(int[] PCArray, int[] userArray)
{
int hits = 0;
for (int i = 0; i < PCArray.Length; i++)
{
if (PCArray[i] == userArray[i])
hits++;
}
Console.WriteLine("Results: {0} Hit(s), {1} Miss(es)", hits, PCArray.Length - hits);
return hits;
}
}
It does a few more validations and it even actually lets you play again! ;)

Get highest number from inputs

I need a programm, where I can type in numbers and in the end it gives me the highest number.
Why doesn't it work like that? What do I need to change?
public class Program
{
public static void Main()
{
double[] input = new double[12];
for (int i = 1; i <= 12; i++)
{
Console.Write(" Type in {0} number:", i);
input = [Convert.ToInt32(Console.ReadLine())];
}
Console.WriteLine("The highest number is {0}", input.Max(element => Math.Abs(element)));
Console.ReadKey();
}
}
You need to make it so its converting to double and also setting to each individual element
input[i] = Convert.ToDouble(Console.ReadLine());
and then change this because arrray starts at 0
for (int i = 0; i <= 11; i++)
As #Ashad Shanto said you must use Convert.ToDouble and you must use input[i] instead of input. So your code should look like:
public class Program
{
public static void Main()
{
double[] input = new double[12];
for (int i = 0; i < 12; i++)
{
Console.Write(" Type in {0} number:", i);
input[i] = [Convert.ToDouble(Console.ReadLine())];
}
Console.WriteLine("The highest number is {0}", input.Max(element => Math.Abs(element)));
Console.ReadKey();
}
}
Is the requirement to have a Double or Int? Anyways, you can just simple store the highest number each time a new number is entered by doing a simple comparison.
public static void Main()
{
var currentNumber = 0;
for (var i = 1; i <= 12; i++)
{
Console.Write(" Type in {0} number: ", i);
var number = Console.ReadLine();
int result;
if (int.TryParse(number, out result))
{
if (currentNumber < result)
{
currentNumber = result;
}
}
}
Console.WriteLine("The highest number is {0}", currentNumber);
Console.ReadKey();
}
As #artokai mentioned you don't need to store all entered numbers.
Try the following:
double heighest = Double.MinValue;
for (int i = 0; i < 12; i++)
{
Console.Write(" Type in {0} number:", i);
double input = (Convert.ToDouble(Console.ReadLine());
if (input > heighest)
heighest = input
}
Console.WriteLine("The highest number is {0}", highest);

Categories

Resources