i'm very new to C# (well, programming in general)
I am trying to create a menu for a c# console application. The the menu keeps reappearing after a selection from the menu is made... I've researched and tried many different options but nothing seems to be working for me.... I know it's something stupid that I've done incorrectly.
Any advice or guidance would be very much appreciated. Thanks in advanced.
static void Main() //Start of program
{
//Menu and other UI stuff
int userSelection = 0;
do
{
Console.WriteLine("[1] Encryption");
Console.WriteLine("[2] Decryption");
Console.WriteLine("[3] Exit");
Console.Write ("Please choose an option 1-3: ");
userSelection = Int32.Parse(Console.ReadLine());
switch(userSelection)
{
case 1:
readFile();
break;
case 2:
decryption();
break;
case 3:
Environment.Exit(0);
break;
default:
Console.WriteLine("Your selection is invalid. Please try again.");
break;
}
}
while (userSelection != 4);
}
Your do/while only will stops when your userSelection have value 4, in this example, it never will happen.
change your while condition to
while(userSelection <= 0 || userSelection > 3)
it should solve...
maybe you would like to use something like:
int userSelection = 0;
bool validAnswer = false;
do
{
Console.WriteLine("[1] Encryption");
Console.WriteLine("[2] Decryption");
Console.WriteLine("[3] Exit");
Console.Write ("Please choose an option 1-3: ");
userSelection = Int32.Parse(Console.ReadLine());
switch(userSelection)
{
case 1:
readFile();
validAnswer = true;
break;
case 2:
decryption();
validAnswer = true;
break;
case 3:
validAnswer = true;
Environment.Exit(0);
break;
default:
Console.Clear();
Console.WriteLine("Your selection is invalid. Please try again.");
break;
}
}while (!validAnswer);
It keeps reappearing because you placed your code in a do while loop. If you want to run this code only once don't use looping constructs, just place it directly in Main.
If you use something like
do
{
// ...
}
while (userSelection != 4);
the code inside the loop will be repeated until the user enters 4.
From msdn article on a do while:
The do statement executes a statement or a block of statements
repeatedly until a specified expression evaluates to false.
Another option would be to use a break statement after the switch block.
class Program
{
static void Main() //Start of program
{
//Menu and other UI stuff
string userSelection;
do
{
Console.Clear();
Console.WriteLine("[1] Encryption");
Console.WriteLine("[2] Decryption");
Console.WriteLine("[3] Exit");
Console.Write("Please choose an option 1-3: ");
userSelection = Console.ReadLine();
switch (userSelection)
{
case "1":
Console.WriteLine("mission 1");
break;
case "2":
Console.WriteLine("mission 2");
break;
case "3":
Environment.Exit(0);
break;
default:
Console.WriteLine("Your selection is invalid. Please try again.");
break;
}
Console.ReadLine();
}
while (true);
}
}
Related
When i introduce the "try" "catch" statements and read the user input for the "choice" variable, the code executes as it should it does not however continue on to the "switch" "case" statement as the "choice" variable is then said to be an unassigned local variable. Please help.
I was expecting the rest of the "switch case" code to execute.
int choice;
do
{
Console.Clear();
Console.WriteLine("1. Load Data");
Console.WriteLine("2. Add Customer");
Console.WriteLine("3. Sort Customers");
Console.WriteLine("4. Display Customers");
Console.WriteLine("5. Edit Customer");
Console.WriteLine("6. Exit\n");
Console.WriteLine("Chose an option 1-6: ");
bool valid = true;
do
{
try
{
choice = Convert.ToInt32(Console.ReadLine());
}
catch (Exception)
{
valid = false;
Console.WriteLine("please enter a number from 1 - 6");
}
} while (valid == false);
switch (choice)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
break;
}
Console.Clear();
} while (choice != 6);
When the catch block is executed, then choice is not assigned a value in the try block.
Assign a value to choice in the catch block
int choice; // Choice is declared here but is not assigned a value.
...
try
{
// When the conversion fails, no assignment to `choice` is made.
choice = Convert.ToInt32(Console.ReadLine());
valid = true; // This was also missing.
}
catch (Exception)
{
valid = false;
choice = 0; // <========================================
Console.WriteLine("please enter a number from 1 - 6");
}
...
// Now, here `choice` is known to have a value assigned in any case.
Note that the compiler does not consider the value of valid nor does the compiler analyze how it affects the control flow when is says that choice may be unassigned. The error message is based solely on a static analysis of the control flow for assignments made to choice itself.
But it would be easier to use TryParse instead of catching an exception.
int choice;
do {
// Console output ...
while (!Int32.TryParse(Console.ReadLine(), out choice)) {
Console.Write("please enter a number from 1 - 6: ");
}
Console.WriteLine();
switch (choice) {
...
default:
break;
}
Console.Clear();
} while (choice != 6);
Sir I think i have just solved it. I have added a Break; statement to the try block. in this case the code loops back to the beginning and allows the user to enter the correct data type again and the switch statement continues.
bool valid = true;
do
{
try
{
choice = Convert.ToInt32(Console.ReadLine());
break;
}
catch (Exception)
{
Console.Clear();
valid = false;
choice = 0;
Console.WriteLine("please enter a number from 1 - 6");
}
} while (valid == false);
You can just assign a value when you decleare choice
int choice = 0;
You have also to set the valid variable at true at the start of the loop.
bool valid;
do
{
valid = true;
try
{
choice = Convert.ToInt32(Console.ReadLine());
}
catch (Exception)
{
valid = false;
Console.WriteLine("please enter a number from 1 - 6");
}
} while (valid == false);
This might be the most simple question of all time but how do you make it so that if I write something that isn't one of the choices 1,2,3,4 the program will say "Wrong choice, try again" ?
For example: If the user types in "36" the program should say "Wrong choice, try again"
I know I can use if and if else for choice 1,2,3,4 and then use else for it to write "Wrong choice" but is there any shorter/easier way of doing it?
using System;
namespace atmtest
{
class Program
{
public static void Main()
{
int choice;
while (true)
{
Console.WriteLine("----------------------------");
Console.WriteLine("Welcome");
Console.WriteLine("----------------------------");
Console.WriteLine("1) Example 1");
Console.WriteLine("2) Example 2");
Console.WriteLine("3) Example 3");
Console.WriteLine("--------------------------------");
Console.WriteLine("Choose one of the 3 options");
choice = int.Parse(Console.ReadLine());
switch (choice)
{
case 1:
Console.Clear();
Console.WriteLine("You chose 1");
break;
case 2:
Console.Clear();
Console.WriteLine("You chose 2");
break;
case 3:
Console.Clear();
Console.WriteLine("You chose 3");
break;
}
}
}
}
}
You just set the default in the switch statement, like:
switch (choice) {
case 1:
Console.Clear();
Console.WriteLine("You chose 1");
break;
case 2:
Console.Clear();
Console.WriteLine("You chose 2");
break;
case 3:
Console.Clear();
Console.WriteLine("You chose 3");
break;
default:
Console.Clear();
Console.WriteLine("Wrong option!");
break;
}
I have looked really hard on this. Integers seem easy, but this is what I have been trying to figure out in C# in visual studio.
I want to have a user input of a letter like "a" then the console writes "apple", b=bobby, c=charlie, etc. and when they don't put a letter then it gives an error message like "no letters used". I am not sure if I am suppose to convert the user input from a string with ToChar or what the best way to do this is. I haven't gotten into arrays yet and haven't figured out the switch command with characters (instead of integers or strings).
This is how I was trying to do it:
Console.WriteLine("Enter a letter ");
choice = Convert.ToChar(Console.ReadLine());
if (char choice = 'a'){
Console.WriteLine("apple");
}else if (char choice = 'b'{
Console.WriteLine("bobby");
}else if (char choice = 'b'{
Console.WriteLine("bobby");
}else (char choise=!IsLetter){
Console.WriteLine("No Letters entered");
If you want to stick to if else, here is what you can do:
if (choice == 'a')
{
Console.WriteLine("apple");
}
else if (choice =='b')
{
Console.WriteLine("bobby");
}
else if (char choice = 'c')
{
Console.WriteLine("charlie");
}
else
{
Console.WriteLine("No Letters entered");
}
You don't need to put condition on your else anymore :)
Use a switch statement, probably best for your scenario
static void Main(string[] args)
{
//initialise bool for loop
bool flag = false;
//While loop to loop Menu
while (!flag)
{
Console.WriteLine("Menu Selection");
Console.WriteLine("Press 'a' for apple");
Console.WriteLine("Press 'b' for bobby");
Console.WriteLine("Type 'exit' to exit");
//Read userinput
//Store inside string variable
string menuOption = Console.ReadLine();
switch (menuOption)
{
case "a":
//Clears console for improved readability
Console.Clear();
//"\n" Creates empty line after statement
Console.WriteLine("apple has been selected\n");
//Break out of switch
break;
case "b":
Console.Clear();
Console.WriteLine("bobby has been selected\n");
break;
case "exit":
Console.Clear();
Console.WriteLine("You will now exit the console");
//bool set to false to exit out of loop
flag = true;
break;
//Catch incorrect characters with default
default:
Console.Clear();
//Error message
Console.WriteLine("You have not selected an option\nPlease try again\n\n");
break;
}
}
Console.ReadLine();
This is how you write it using a switch:
switch (choice){
case 'a':
Console.WriteLine("apple");
break;
case 'b':
Console.WriteLine("bobby");
break;
case 'c':
Console.WriteLine("charlie");
break;
default:
Console.WriteLine("No Letters entered");
break;
}
string tastetryk;
ConsoleKeyInfo tast;
Console.ForegroundColor = ConsoleColor.White;
Console.BackgroundColor = ConsoleColor.Blue;
Console.Clear();
do
{
Console.WriteLine("Menu");
Console.WriteLine(" ");
Console.WriteLine("Tryk en tast for at vælge funktion");
Console.WriteLine(" ");
Console.WriteLine("I - Beregn strøm");
Console.WriteLine("U - Spænding");
Console.WriteLine("R - Modstand");
Console.WriteLine(" ");
Console.WriteLine("(Esc) for at slutte ");
tast = Console.ReadKey();
tastetryk = tast.Key.ToString();
Console.Clear();
switch(tastetryk)
{
case "I":
Console.WriteLine("du har tastet I");
Console.Write("Tast Q for at komme tilbage");
tast = Console.ReadKey();
break;
case "U":
Console.WriteLine("du har tastet U");
Console.Write("Tast Q for at komme tilbage");
tast = Console.ReadKey();
break;
case "R":
Console.WriteLine("du har tastet R");
Console.Write("Tast Q for at komme tilbage");
tast = Console.ReadKey();
break;
default:
Console.WriteLine("forkert tast");
Thread.Sleep(1000);
Console.Clear();
break;
}
}
while (tast.Key == ConsoleKey.Q);
I made this code for a Menu, when i press I, U or R, one of the case will come true, when you press Q it will return to main menu. My problem is when default is true, i want it to loop to main menu without any need to press Q, I tried with tast = Consolekey.Q
Sorry for my really bad english
Clearly, you cannot break from the loop since the break breaks from the switch statement, as you've surely noticed.
Two simple solutions :
First, add a boolean flag indicating you should exit the loop, adding a new condition in the while statement.
bool bExit = false;
do
{
switch
{
/*
code here
*/
default:
bExit = true;
//etc.
}
}
while(tast.Key == ConsoleKey.Q || !bExit)
Now, I know thid could be considered pure evil but... have you considered using a goto?
do
{
switch
{
/*
code here
*/
default:
goto outOfLoop;
}
}
while(tast.Key == ConsoleKey.Q)
outOfLoop:
// etc.
I believe the second solution is actually cleaner but people could react violently to goto statements.
Here is an example where a menu of values is available. i would like to have it loop back to the start if none of the options are chosen.
static void Main(string[] args)
{
Console.WriteLine("1 : Option 1");
Console.WriteLine("2 : Option 2");
Console.WriteLine("3 : Option 3");
Console.WriteLine("4 : Option 4");
Console.WriteLine("5 : Option 5");
Console.Write("Please enter your option choice: ");
string choice = Console.ReadLine();
int intChoice = int.Parse(choice);
switch (intChoice)
{
case 1:
Console.WriteLine("you chose 1");
break;
case 2:
Console.WriteLine("you chose 2");
break;
case 3:
Console.WriteLine("you chose 3");
break;
case 4:
Console.WriteLine("you chose 4");
break;
case 5:
Console.WriteLine("you chose 5");
break;
}
}
I've tried to do it through using classes and method, but i just got really confused.
thank you in advance for any help.
Wrap the whole thing in a do-while block:
bool isValid = true;
do
{
isValid = true;
// Write to console
// read from console
switch(intChoice)
{
// Place some cases here.
default:
Console.WriteLine("Invalid Choice")
isValid = false;
}
}
while(!isValid);
Use a boolean value as a flipswitch that tell the while loop to continue running or not. Here's a small example:
bool stillRunning = true;
while (stillRunning)
{
Console.WriteLine("Enter a number.");
string input = Console.ReadLine();
int key = Convert.ToInt32(input);
switch (key)
{
case 1:
// Do something.
stillRunning = false;
break;
case 2:
// Do something.
stillRunning = false;
break;
default:
Console.WriteLine("No key selected.");
break;
}
}
you can use default
switch (intChoice)
{
case 1:
Console.WriteLine("you chose 1");
break;
case 2:
Console.WriteLine("you chose 2");
break;
.......
default:
//your logic here
break;
}
it is your choice after that how you like to do it. you can use a while and a Boolean value like this:
static void Main(string[] args)
{
Console.WriteLine("1 : Option 1");
Console.WriteLine("2 : Option 2");
Console.WriteLine("3 : Option 3");
Console.WriteLine("4 : Option 4");
Console.WriteLine("5 : Option 5");
Console.Write("Please enter your option choice: ");
bool correct = true;
while (correct)
{
string choice = Console.ReadLine();
int intChoice = int.Parse(choice);
switch (intChoice)
{
case 1:
Console.WriteLine("you chose 1");
break;
case 2:
Console.WriteLine("you chose 2");
break;
case 3:
Console.WriteLine("you chose 3");
break;
case 4:
Console.WriteLine("you chose 4");
break;
case 5:
Console.WriteLine("you chose 5");
break;
default:
correct = false;
break;
}
}
}
Thus you need only one number, it's better to use GetKey method, then reading string value from console and then parsing it to int:
DisplayOptions();
bool choiceDone;
do
{
choiceDone = true;
switch(GetChoice())
{
case ConsoleKey.D1:
Console.WriteLine("you chose 1");
break;
case ConsoleKey.D2:
Console.WriteLine("you chose 2");
break;
// etc
default:
choiceDone = false;
break;
}
} while(!choiceDone);
Also I have extracted several methods, to make code more clean:
private ConsoleKey GetChoice()
{
Console.Write("Please enter your option choice: ");
return Console.ReadKey().Key;
}
private void DisplayOptions()
{
Console.Clear();
Console.WriteLine("1 : Option 1");
Console.WriteLine("2 : Option 2");
Console.WriteLine("3 : Option 3");
Console.WriteLine("4 : Option 4");
Console.WriteLine("5 : Option 5");
}
public void GetInput()
{
int inputValue = 0;
bool isValidInput = false;
List<int> validEntries = new List<int> { 1,2,3, 42, 55, 69};
while (!isValidInput)
isValidInput = int.TryParse(Console.ReadLine(), out inputValue) && validEntries.Contains(inputValue);
switch (inputValue)
{
case 1:
{
// something
break;
}
case 2:
{
// something else
break;
}
default:
{
//yet something else
break;
}
}
}
Edit: Added explicit value check instead of accepting any integer.
The most obvious solution seems to be:
bool loop = true;
while (loop)
{
loop = false;
switch (Console.ReadLine())
{
case "1":
Console.WriteLine("you chose 1");
break;
case "2":
Console.WriteLine("you chose 2");
break;
case "3":
Console.WriteLine("you chose 3");
break;
case "4":
Console.WriteLine("you chose 4");
break;
case "5":
Console.WriteLine("you chose 5");
break;
default:
loop = true;
break;
}
}
There could be a better way to do this though.