Reputation: 7
Is there any more "elegant" way to filter a number input for specific parameters?
Like here, I need to say different things if you're to high, to low or of the limits.
Would appreciate if you explain what you suggest. I'm like 2 weeks into programming.
//VARIABLES
int userNumber;//uN
int searchedNumber;//sN
//NUMBER WE'RE LOOKING FOR
searchedNumber = 87;
//TASK FOR "CUSTOMER"
Console.WriteLine("Type in a number between 1-100!");
//DO-WHILE, because it hast to run one either way
do
{
//READING OUT CONSOLE
string userNumberString = Console.ReadLine();
//CONVERTING STRING TO INT
userNumber = int.Parse(userNumberString);
//uN > THAN sN BUT <= 100
if (userNumber > searchedNumber && userNumber <= 100)
{
Console.WriteLine("To High! /n Try again.");
}
//uN < THAN sN BUT >= 1
else if (userNumber < searchedNumber && userNumber >= 1)
{
Console.WriteLine("To Low! /n Try again.");
}
//uN >= 101 AND uN <= 0
else if (userNumber >= 101 || userNumber <= 0)
{
Console.WriteLine("Between 1 and 100, Dummy!");
}
else
{
//IF NOTHING IS TRUE uN=sN
Console.WriteLine("JACKPOT!");
}
//LOOPING CONDITION
} while (userNumber != searchedNumber);
If this q is already answered somewhere, i'm sorry. English is not my native language and i struggled to even find the right search term.
Upvotes: 0
Views: 255
Reputation: 621
Thinking of a cleaner code:
public static void Main()
{
//VARIABLES
int userNumber;//uN
int searchedNumber = 87;
int min = 1;
int max = 100;
//TASK FOR "CUSTOMER"
Console.WriteLine($"Type in a number between {min}-{max}!");
//DO-WHILE, because it hast to run one either way
do
{
//READING OUT CONSOLE
string userNumberString = Console.ReadLine();
//CONVERTING STRING TO INT
if (int.TryParse(userNumberString, out userNumber))
{
if (userNumber >= min && userNumber <= max)
{
if (userNumber == searchedNumber)
{
Console.WriteLine("JACKPOT!");
}
else
{
Console.WriteLine("To " + (userNumber < searchedNumber ? "Low" : "High") + "! Try again.");
}
}
else
{
Console.WriteLine($"Between {min} and {max}, Dummy!");
}
}
else
{
Console.WriteLine($"One integer number, Dummy!");
}
} while (userNumber != searchedNumber);
}
The
TryParse
it's very important
Upvotes: 0
Reputation: 37377
This code can get little bit cleaner by rearramging conditions - if
will get a lot simplier :) Also, if you have one line under if, you can omit curly braces, see below code. I also included some comments, which I hope, wil be useful:
do
{
//READING OUT CONSOLE
string userNumberString = Console.ReadLine();
//CONVERTING STRING TO INT
// here you need to be careful, what if user types "a"?
// I suggest reading about int.TryParse :)
userNumber = int.Parse(userNumberString);
//uN >= 101 AND uN <= 0
if (userNumber >= 101 || userNumber <= 0)
Console.WriteLine("Between 1 and 100, Dummy!");
// now we are sure we are in the range
if (userNumber > searchedNumber)
Console.WriteLine("To High! /n Try again.");
else if (userNumber < searchedNumber)
Console.WriteLine("To Low! /n Try again.");
else
//IF NOTHING IS TRUE uN=sN
Console.WriteLine("JACKPOT!");
//LOOPING CONDITION
} while (userNumber != searchedNumber);
Upvotes: 0
Reputation: 186708
I suggest extracting methods, please, do not cram everything into huge single routine:
public static int ReadInteger(string title) {
if (!string.ISNullOrWhiteSpace(title))
Console.WriteLine(title);
while (true) {
if (int.TryParse(Console.ReadLine(), out int result))
return result;
Console.WriteLine("This is not a valid integer! Try again.");
}
}
public static string FeedBack(int user, int actual) {
if (user < 0 || user > 100)
return "Between 1 and 100, Dummy!"
else if (user < actual)
return "Too Low! /n Try again.";
else if (user > actual)
return "Too High! /n Try again.";
else
return "JACKPOT!"
}
Then use these methods in a tiny loop:
int userNumber = 0;
int searchedNumber = 87;
do {
userNumber = ReadInteger("Type in a number between 1-100!");
Console.WriteLine(FeedBack(userNumber, actual));
}
while (userNumber != searchedNumber);
Upvotes: 2
Reputation: 25189
One way to get rid of all the else
statements is to move the code to a method and return from the method as soon as you know what the response should be.
Something like this
public string EvaluateNumber(int userNumber, int searchedNumber)
{
if (searchedNumber <= 0 || searchedNumber >= 101)
return "Between 1 and 100, Dummy!";
if (searchedNumber < userNumber)
return "Too low! /n Try again.";
if (searchedNumber > userNumber)
return "Too high! /n Try again.";
return "JACKPOT!"; // If we get to here, the numbers are equal
}
Upvotes: 0