Trying to make a Simple User input to character output Console program - c#

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

Related

c# Switch case does not continue after try catch - Need a loop to enter a valid data type

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);

how to return to the start of a switch statement after case complete

I have a console application in c# where I have to edit data inside a xml. This works so far I can get through id selection the dataset I want to edit and then edit single values. What I want to achieve is if the user gives an specific value after editing he/she should be able to go back a step back and edit other values of the same dataset.
For example: User edits the name of a customer with id 2 and wishes after saving the name to change adress. The application should be able to recognize the input from before and then just give the options of which the user can change the values again.
I tried calling the method inside the method but my application just finishes after saving the new value,
this is my code:
bool inputTester = true;
while (inputTester)
{
Console.WriteLine("Welche Seiner Daten möchten Sie verändern?");
Console.WriteLine("1) Für Vornamen");
Console.WriteLine("2) Für Nachnamen");
Console.WriteLine("3) für Adresse");
Console.WriteLine("4) für Geburtsdatum");
Console.WriteLine("5) für Bankdaten");
Console.WriteLine("Bitte geben Sie nun eine Option ein");
switch (Console.ReadLine())
{
case "1":
tgt = tempId;
var name = tgt.Descendants("firstName").FirstOrDefault();
Console.WriteLine("Bitte geben sie den neuen Vornamen ein");
name.Value = Console.ReadLine();
xDoc.Save(filepath);
Console.WriteLine("Kunde gespeichert");
Console.Clear();
Console.WriteLine("Möchten Sie weitere Daten dieses Kunden bearbeiten? Falls Ja drücken Sie 1");
if (Console.ReadLine().Equals(1))
break;
break;
I tried to do it in case 1 with calling the method inside it.
EDIT: I tried to do it with the while advices but still the outcome is the same. The program just finishes and then closes itself.
I reduced my code to the minimal state posible to try it localy. I hope this is fine like this.
Place the Switch Statement in a While(true) Loop and when you want to go back to the start of the loop use the:
Continue
statement, this will start the loop again.
And when you want to exit the loop just use:
Break
I will try to simplify your issue in order to illustrate the error you made.
The requirement is :
The program will ask for "1" or "2" and sum it till you give up and type "Stop".
Your attempt looked like this : It wont loop and only ask once.
static int Count_Original()
{
var num = 0;
Console.WriteLine("Original: How Many? (1/2)");
switch (Console.ReadLine())
{
case "1":
num += 1;
return num;
case "2":
num += 2;
return num;
}
return num;
}
If we had a loop: It will still not loop as the return make us quit the method.
static int Count_Loop()
{
var num = 0;
while (true)
{
Console.WriteLine("Loop: How Many? (1/2)");
switch (Console.ReadLine())
{
case "1":
num += 1;
return num;
case "2":
num += 2;
return num;
}
return num;
}
}
Simply removing the return won't fix it, we are now trap in the loop.
static int Count_Trap()
{
var num = 0;
while (true)
{
Console.WriteLine("Trap: How Many? (1/2)");
switch (Console.ReadLine())
{
case "1":
num += 1;
break;
case "2":
num += 2;
break;
default: // I didn't understand the input. Let me ask again.
break;
}
};
return num; // Never reach
}
The final version will look like this:
A break out option using return
a default in case we didn't type a valid option.
static int Count_Fix()
{
var num = 0;
while (true)
{
Console.WriteLine("Fix: How Many? (1/2)");
switch (Console.ReadLine())
{
case "Stop": // Breakout condition, we are leaving
return num;
case "1":
num += 1;
break;
case "2":
num += 2;
break;
default: // I didn't understand the input. Let me ask again.
break;
}
};
return num;
}
Finally if you wan't to have some conditional loop back or exit you can do it with a if/else:
static int Count_Fix()
{
var num = 0;
while (true)
{
Console.WriteLine("Fix: How Many? (1/2)");
switch (Console.ReadLine())
{
case "1":
num += 1;
break;
case "2":
num += 2;
if (num % 2 == 0) break; // conditional go back or exit
else return num; // exit
default: // I didn't understand the input. Let me ask again.
break;
}
};
}

Console application Menu issues in c#

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

Returning back to the beginning of a block of code?

I need to return back to the beginning of the code shown here after a user enters the wrong key. Is there any simple line of code that will just return back to another line? As you can see I already have an if statement set up so I can just add something that can return back to the beginning or to another area in my code. I am really quite new to c# and programming in general. I really just don't want to have to enter all the code again into another if statement that would produce the same issue. I would preferably like to have the code just run again after a user enters a wrong key, because then they can re-read it without having to start from scratch again.
//Runs battle interactive
Console.WriteLine("");
Console.WriteLine("You have encountered a simple guard! He deals 2 damage per attack and has 1 HP.");
Console.WriteLine("You currently have: " + Program.Inventory);
Console.WriteLine("Choose a weapon!");
var input2 = Console.ReadKey();
//Key checker for items
switch (input2.Key)
{
case ConsoleKey.D1:
Console.WriteLine("");
if (Items.iniFists == true)
{
Console.WriteLine("You have attacked with your Fists for 1 DMG!");
}
else
{
//this will never run, just a placeholder
Console.WriteLine("You Don't have your fists!");
switch (input2.Key)
{
case ConsoleKey.D1:
Console.WriteLine("");
if (Items.iniFists == true)
{
Console.WriteLine("You have attacked with your Fists for 1 DMG!");
}
else
{
//this will never run, just a placeholder
Console.WriteLine("You Don't have your fists!");
}
break;
case ConsoleKey.D2:
Console.WriteLine("");
if (Items.iniLongsword == true)
{
Console.WriteLine("You have chosen to attack with the Longsword for 2 DMG!");
}
else
{
Console.WriteLine("You don't have a longsword!");
}
break;
case ConsoleKey.D3:
Console.WriteLine("");
if (Items.iniBow == true)
{
Console.WriteLine("You have chosen to attack with the Bow for 3 DMG!");
}
else
{
Console.WriteLine("You don't have a Bow!");
}
break;
case ConsoleKey.D4:
Console.WriteLine("");
if (Items.iniLightstaff == true)
{
Console.WriteLine("You have chosen to attack with the Lightstaff for 4 DMG!");
}
else
{
Console.WriteLine("You don't have a Lightstaff!");
}
break;
case ConsoleKey.D5:
Console.WriteLine("");
Console.WriteLine("You can't attack with an Apple!");
break;
case ConsoleKey.D6:
Console.WriteLine("");
Console.WriteLine("You can't attack with a Golden Key!");
break;
case ConsoleKey.D7:
Console.WriteLine("");
Console.WriteLine("You can't attack with a Steak!");
break;
}
}
break;
case ConsoleKey.D2:
Console.WriteLine("");
if (Items.iniLongsword == true)
{
Console.WriteLine("You have chosen to attack with the Longsword for 2 DMG!");
}
else
{
Console.WriteLine("You don't have a longsword!");
}
break;
case ConsoleKey.D3:
Console.WriteLine("");
if (Items.iniBow == true)
{
Console.WriteLine("You have chosen to attack with the Bow for 3 DMG!");
}
else
{
Console.WriteLine("You don't have a Bow!");
}
break;
case ConsoleKey.D4:
Console.WriteLine("");
if (Items.iniLightstaff == true)
{
Console.WriteLine("You have chosen to attack with the Lightstaff for 4 DMG!");
}
else
{
Console.WriteLine("You don't have a Lightstaff!");
}
break;
case ConsoleKey.D5:
Console.WriteLine("");
Console.WriteLine("You can't attack with an Apple!");
break;
case ConsoleKey.D6:
Console.WriteLine("");
Console.WriteLine("You can't attack with a Golden Key!");
break;
case ConsoleKey.D7:
Console.WriteLine("");
Console.WriteLine("You can't attack with a Steak!");
break;
}
C# supports labels in code, however it is not recommended due to the fact that it violates many coding best practices, but I guess there is always an exception to any rule.
class Program
{
static void Main(string[] args)
{
Start:
Console.WriteLine("Start Here... Press any key");
var key = Console.ReadKey(true);
switch (key.Key)
{
case ConsoleKey.A:
goto MyLabel;
case ConsoleKey.B:
goto MyLabel2;
case ConsoleKey.C:
goto MyLabel3;
default:
Console.WriteLine("Bad Choice");
goto Start;
}
MyLabel:
Console.WriteLine("MyLabel: A");
goto Start;
MyLabel2:
Console.WriteLine("MyLabel: B");
goto Start;
MyLabel3:
Console.WriteLine("MyLabel: C");
goto Start;
}
}
You can find more information here:
http://msdn.microsoft.com/en-us/library/d96yfwee.aspx
http://msdn.microsoft.com/en-us/library/13940fs2.aspx
you have a couple options, you can use a while loop
bool continue = true;
while(continue == true)// or you can simply type "while(continue)"
{
/* everything inside the `while` loop will be
repeated until `continue` is not `true`. */
}
you can also use methods
public static void doStuff()
{
// insert stuff here
}
and then you can call that from elsewhere in your class
if(x = 6)
{
doStuff(); //this line does the stuff
doStuff(); // this line does the stuff again.
}
One answer to this is to check that you have valid input in a loop like this:
while (true)
{
ConsoleKey i = Console.ReadKey()
if (i == ConsoleKey.D1 || ... ) //Check if it's equal to any valid key, you
//might be able to simplify it with <= and
//>= if valid keys are sequential.
break;
Console.WriteLine("You have entered an invalid key");
}
Alternatively, you can add a goto statement at the end of your switch block:
SwitchStatement: switch(input2.Key)
...
default:
Console.WriteLine("Invalid key pressed");
goto SwitchStatement;
break;
}

No need to press, when default is true (auto loop)

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.

Categories

Resources