From 3d7791fbec7db33eacdbedb8405b153a1a3c7d64 Mon Sep 17 00:00:00 2001 From: ipvg Date: Sun, 21 Jul 2024 20:49:15 -0400 Subject: [PATCH] avnc 017 --- 016_Iterate_using_for_statement/016_csharp.md | 2 - .../017_csharp.md | 749 ++++++++++++++++++ .../game_battle_challenge/Program.cs | 25 + .../game_battle_challenge.csproj | 10 + .../project_1/Program.cs | 47 ++ .../project_1/project_1.csproj | 10 + .../project_2/Program.cs | 51 ++ .../project_2/project_2.csproj | 10 + .../project_3/Program.cs | 48 ++ .../project_3/project_3.csproj | 10 + .../user_input/Program.cs | 31 + .../user_input/user_input.csproj | 10 + README.md | 3 +- 13 files changed, 1003 insertions(+), 3 deletions(-) create mode 100644 017_Looping_logic_using_do-while_and_while/017_csharp.md create mode 100644 017_Looping_logic_using_do-while_and_while/game_battle_challenge/Program.cs create mode 100644 017_Looping_logic_using_do-while_and_while/game_battle_challenge/game_battle_challenge.csproj create mode 100644 017_Looping_logic_using_do-while_and_while/project_1/Program.cs create mode 100644 017_Looping_logic_using_do-while_and_while/project_1/project_1.csproj create mode 100644 017_Looping_logic_using_do-while_and_while/project_2/Program.cs create mode 100644 017_Looping_logic_using_do-while_and_while/project_2/project_2.csproj create mode 100644 017_Looping_logic_using_do-while_and_while/project_3/Program.cs create mode 100644 017_Looping_logic_using_do-while_and_while/project_3/project_3.csproj create mode 100644 017_Looping_logic_using_do-while_and_while/user_input/Program.cs create mode 100644 017_Looping_logic_using_do-while_and_while/user_input/user_input.csproj diff --git a/016_Iterate_using_for_statement/016_csharp.md b/016_Iterate_using_for_statement/016_csharp.md index 1a551be..51ad352 100644 --- a/016_Iterate_using_for_statement/016_csharp.md +++ b/016_Iterate_using_for_statement/016_csharp.md @@ -500,5 +500,3 @@ for (int i = 1; i <= 100; i++) { Console.WriteLine($"{i} {output}"); } ``` - ---- diff --git a/017_Looping_logic_using_do-while_and_while/017_csharp.md b/017_Looping_logic_using_do-while_and_while/017_csharp.md new file mode 100644 index 0000000..9b5a939 --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/017_csharp.md @@ -0,0 +1,749 @@ +# do-while and while + +## Introduction + +As we've said several times in previous modules featuring iteration and +decision statements, there are several techniques you can use to accomplish +similar results. Just like written and spoken languages, in programming +languages you can express the same idea in different ways. Even so, each +expression may have a nuanced difference in meaning. + +The `do-while` and `while` statements allow us to control the flow of code +execution by looping through a block of code until a condition is met. When +working with the `foreach` statement, we iterate once for each item in sequence, +such as an array. The `for` statement allows us to iterate a pre-determined +number of times, and control the process of iteration. The `do-while` and +`while` statements allow us to iterate through a block of code with the intent +that the logic inside of the code block will affect when we can stop iterating. + +Suppose you want to accept and process user input. You want to continue +accepting and processing input until the user presses the `q` key for "quit". +You can use the `do-while` and the `while` statements to keep iterating +through the logic to accept user input and process it until the user is ready +to stop. + +In this module, you'll use the `do-while` statement and the `while` statement +to iterate through code block. You'll understand when to choose one over the +other. You'll use the continue statement to skip processing the remainder of +code in the code block and go directly to the Boolean evaluation of the `while` +statement. + +By the end of this module, you will be able to confidently use the `do-while` +and `while` statements to add looping logic to your application. + +### Learning objectives + +In this module, you will: + +- Write code that uses the `do-while` statement to iterate through a code block. +- Write code that uses the `while` statement to iterate through a code block. +- Use the `continue` statement to step directly to the Boolean evaluation. + +#### Prerequisites: + +- Experience using the `if` statement +- Experience using `foreach` and `for` iteration statements. +- Experience writing Boolean expressions +- Experience generating random numbers using the `System.Random` class and the +`Random.Next()` method + +--- + +## Exercise + +### Create do and while iteration loops + +On the surface, the `do-while` and `while` statements are yet another +iteration statement that allows you to iterate through a code block and +thereby change the flow of execution of your code. However, once we examine +how each works, we can better identify the nuances of each iteration statement +and when to use them. + +### What is the do-while statement? + +The `do-while` statement executes a statement or a block of statements while a +specified Boolean expression evaluates to true. Because that expression is +evaluated after each execution of the loop, a do-while loop executes one or +more times. + +```cs +do { + // This code executes at least one time +} while (true); +``` + +The flow of execution starts inside of the curly brace. The code executes at +least one time, then the Boolean expression next to the `while` keyword is +evaluated. If the Boolean expression returns `true`, the code block is executed +again. + +By hard coding the Boolean expression to `true`, we've created an infinite +loop (a loop that will never end, at least, not as it's currently written). We +would need a way to break out of the loop inside of the code block. We'll +discuss the exit criteria of a `do-while` in a bit. + +Okay, now let's prepare our coding environment and begin our examination of +code samples that implement a `do-while statement. + +#### Prepare your coding environment + +At the Terminal command prompt, to create a new console application in a +specified folder, type dotnet `new console -o ./path_to/TestProject` and then +press Enter. + +### Write a do-while statement to break when a certain random number is generated + +Let's write code that will keep generating random numbers between 1 and 10 +until we generate the number 7. It could take just one iteration to get a 7, +or it could take dozens of iterations. + +Type the following code into the code editor. + +```cs +Random random = new Random(); +int current = 0; + +do { + current = random.Next(1, 11); + Console.WriteLine(current); +} while (current != 7); +``` + +At the Terminal command prompt, to run your code, type `dotnet run` and then +press Enter. + +Review your output. + +Since the numbers generated are random, your results will be different. However, +the value `7` will be the last number to be printed as the Boolean expression +will evaluate to `false` when 7 is generated and the flow of execution will +exit the code block. + +Output + +```txt +2 +5 +8 +2 +7 +``` + +Take a minute to review your code. + +A key learning for this first task is that the code block of a `do-while` loop +will execute at least once. It could iterate a large number of times, and it +is unlikely that we know ahead of time how many iterations there will be. + +It's also important to notice that the code inside of the code block is +influencing whether to continue iterating through the code block or not. A +code block that influences the exit criteria is a primary reason to select a +`do-while` or `while` statements rather than one of the other iteration +statements. Both the `foreach` and `for` rely on factors that are external to +the code block to determine the number of code block iterations. + +#### Write a while statement that iterates only while a random number is greater than some value + +Now let's take a look at the `while` statement. + +Update your code as follows: + +```cs +Random random = new Random(); +int current = random.Next(1, 11); + +/* +do { + current = random.Next(1, 11); + Console.WriteLine(current); +} while (current != 7); +*/ + +while (current >= 3) { + Console.WriteLine(current); + current = random.Next(1, 11); +} +Console.WriteLine($"Last number: {current}"); +``` + +> Note +> In this case, we position the while keyword and the Boolean expression +before the code block. This changes the meaning of the code and acts as a +"gate" to only allow the flow of execution to enter if the Boolean expression +evaluates to true. + +Save your code file, and then run your code. + +Enter `dotnet run` from the Terminal command prompt to run your code. + +Review the output values listed. + +Since the numbers are random, so your code will produce a different sequence. + +Output + +```txt +9 +7 +5 +Last number: 1 +``` + +Take a minute to review your code. + +At the top code, we use `random` to initialize our `int` variable named +`current`. Our next active code line is our `while` statement. + +Our `while` statement will iterate based on the Boolean expression +`(current >= 3)`. We don't know what value will be assigned to current, but +there are possibilities that affect our while loop: + +- If `current` is initialized to a value greater than or equal to `3`, then the +Boolean expression will return `true`, and the flow of execution will enter +the code block. Inside the code block, the first thing that we do is write the +value of `current` to the console. Next, still inside the code block, we +update the value of `current` with a new random value. At this point, control +goes back to the top of the `while` statement where the Boolean expression is +evaluated. This process continues until the Boolean expression returns `false` +and the flow of execution breaks from the code block. +- If `current` is initialized (at the top of our code) to a value less than `3`, +then the Boolean expression will return `false`, and the code block will never +execute. + +The final code line writes the value of `current` to the console. This code +runs whether the iteration code block was executed or not, and is our chance +to write the final value of `current` to the console. + +#### Use the continue statement to step directly to the Boolean expression + +In certain cases, we want to short-circuit the remainder of the code in the +code block and `continue` to the next iteration. We can do that using the +continue statement. + +Update your code as follows: + +```cs +Random random = new Random(); +int current = random.Next(1, 11); + +do { + current = random.Next(1, 11); + if (current >= 8) continue; + Console.WriteLine(current); +} while (current != 7); + +/* +while (current >= 3) { + Console.WriteLine(current); + current = random.Next(1, 11); +} +Console.WriteLine($"Last number: {current}"); +*/ +``` + +Take a minute to review your code. + +Notice that we've switched back to a `do-while`. A `do-while` ensures that the +loop will iterate at least once. + +The first thing that we do inside the code block is to assign a new random +value to `current`. Next, we check to see if `current` is greater than or +equal to `8`. If this expression returns `true`, the `continue` key word will +transfer control to the end of the code block and the `while` will evaluate +`(current != 7)`. So, the loop will continue to iterate as long as the value +of `current` is not equal to `7`. + +The key to this step of the exercise is the line of code containing the +`continue` key word: + +```cs +if (current >= 8) continue; +``` + +Since our code that writes the value of `current` to the console is located +after the `if (current >= 8) continue;`, our code ensures that a value of +`current` that is greater than or equal to `8` will never be written to the +output window. + +Let's try it out. + +Save your code file, and then run your code. + +Enter `dotnet run` from the Terminal command prompt to run your code. + +Review the output values listed. + +```txt +5 +1 +6 +7 +``` + +You'll likely see different results than what is displayed below. However, you +will not see any values `8` or greater in the output window before the code's +execution ends with the value `7`. + +Consider the difference between the `continue` and `break` statements. + +As you saw in this last step, the `continue` statement transfers execution to +the end of the current iteration. This behavior is different than the behavior +we saw with the `break` statement. The break statement terminates the +iteration (or `switch`) and transfers control to the statement that follows +the terminated statement. If there is no statement after the terminated +statement, then control transfers to the end of the file or method. + +### Recap + +There's a few important ideas you should take away from this unit: + +- The `do-while` statement iterates through a code block at least once, and +might continue to iterate based on a Boolean expression. The evaluation of the +Boolean expression usually depends on some value generated or retrieved inside +of the code block. +- The `while` statement evaluates a Boolean expression first, and continues to +iterate through the code block as long as the Boolean expression evaluates to +`true`. +- The `continue` keyword to step immediately to the Boolean expression. + +## Exercise + +### Complete a challenge activity using do and while iteration statements + +Code challenges reinforce what you learned and help you gain some confidence +before continuing on. + +### Role playing game battle challenge + +In some role playing games, the player's character battles non-player +characters, which are usually monsters or the "bad guys". Sometimes, a battle +consists of each character generating a random value using dice and that value +is subtracted from the opponent's health score. Once either character's health +reaches zero, they lose the game. + +In this challenge, we boil down that interaction to its essence. A hero and a +monster start with the same health score. During the hero's turn, they +generate a random value that is subtracted from the monster's health. If the +monster's health is greater than zero, they take their turn and attack the hero. +As long as both the hero and the monster have health greater than zero, the +battle resumes. + +### Code challenge - write code to implement the game rules + +Here are the rules for the battle game that you need to implement in your code +project: + +- You must use either the `do-while` statement or the `while` statement as an +outer game loop. +- The hero and the monster start with 10 health points. +- All attacks are a value between 1 and 10. +- The hero attacks first. +- Print the amount of health the monster lost and their remaining health. +- If the monster's health is greater than 0, it can attack the hero. +- Print the amount of health the hero lost and their remaining health. +- Continue this sequence of attacking until either the monster's health or +hero's health is zero or less. +- Print the winner. + +Write your game code that implements each rule. + +Run your application and verify that your output meets the requirements. + +No matter how you do it, your code should produce a similar output: + +```txt +Monster was damaged and lost 1 health and now has 9 health. +Hero was damaged and lost 1 health and now has 9 health. +Monster was damaged and lost 7 health and now has 2 health. +Hero was damaged and lost 6 health and now has 3 health. +Monster was damaged and lost 9 health and now has -7 health. +Hero wins! +``` + +Since the code uses random numbers and the outcome is different each time, +your results are different than the output displayed above. However, you can +use this as an example of the output your code should generate. + +```cs +const int max_health = 10; +int hero = max_health; +int monster = max_health; +string turn = "Hero"; +Random random = new Random(); + +do { + if (turn == "Hero") { + int attack = random.Next(1,11); + monster -= attack; + monster = monster < 0 ? 0 : monster; + Console.Write($@"Monster was damaged and lost {attack} health"); + Console.WriteLine($@" and now has {monster} health"); + turn = "Monster"; + } else { + int attack = random.Next(1,11); + hero -= attack; + hero = hero < 0 ? 0 : hero; + Console.Write($@"Hero was damaged and lost {attack} health"); + Console.WriteLine($@" and now has {hero} health"); + turn = "Hero"; + } +} while (hero > 0 && monster > 0); + +Console.WriteLine(hero > monster ? "Hero wins!" : "Monster wins!"); +``` + +--- + +## Exercise + +### Complete a challenge activity to differentiate between do and while iteration statements + +Code challenges will reinforce what you've learned and help you gain some +confidence before continuing on. + +### Examine the difference between do and while statement iterations + +As you have seen, C# supports four types of iteration statements: `for`, +`foreach`, `do-while`, and `while`. Microsoft's language reference +documentation describes these statements as follows: + +- The `for` statement: executes its body while a specified Boolean expression +(the 'condition') evaluates to true. +- The `foreach` statement: enumerates the elements of a collection and +executes its body for each element of the collection. +- The `do-while` statement: conditionally executes its body one or more +times. +- The `while` statement: conditionally executes its body zero or more +times. + +The `for` and `foreach` iterations seem to be clearly differentiated from each +other and from the `do-while` and `while` iterations. The definitions for the +`do-while` and `while` statements, however, appear to be quite similar. +Knowing when to choose between a `do-while` and a `while` seems more arbitrary, +and can even be a bit confusing. Some challenge projects may help to make the +differences clear. + +In this challenge, you'll be presented with conditions for three separate +coding projects. Each project will require you to implement an iteration code +block using either a `do-while` or a `while` statement. You'll need to evaluate +the specified conditions in order to choose between the `do-while` and `while` +statements. You can switch after you start if your first choice isn't working +out as well as you had hoped. + +> Note +> The conditions for your coding project can be used to help you select +between the `do`-while and `while` statements. What you know, or don't know, +about the Boolean expression that will be evaluated can sometimes help you to +select between the `do-while` and `while` statements. In this challenge +exercise, the project conditions include information that will be used to +construct the Boolean expression. + +### Manage user input during this challenge + +When using a `Console.ReadLine()` statement to obtain user input, it's common +practice to use a nullable type string (designated `string?`) for the input +variable and then evaluate the value entered by the user. The following code +sample uses a nullable type string to capture user input. The iteration +continues while the user-supplied value is null: + +```cs +string? readResult; +Console.WriteLine("Enter a string:"); +do { + readResult = Console.ReadLine(); +} while (readResult == null); +``` + +The Boolean expression evaluated by the `while` statement can be used to +ensure user input meets a specified requirement. For example, if a prompt asks +the user to enter a string that includes at least three characters, the +following code could be used: + +```cs +string? readResult; +bool validEntry = false; +Console.WriteLine("Enter a string containing at least three characters:"); +do { + readResult = Console.ReadLine(); + if (readResult != null) { + if (readResult.Length >= 3) { + validEntry = true; + } else { + Console.WriteLine("Your input is invalid, please try again."); + } + } +} while (validEntry == false); +``` + +If you want to use `Console.ReadLine()` input for numeric values, you need to +convert the string value to a numeric type. + +The `int.TryParse()` method can be used to convert a string value to an integer. +The method uses two parameters, a string that will be evaluated and the name +of an integer variable that will be assigned a value. The method returns a +Boolean value. The following code sample demonstrates using the `int.TryParse()` +method: + +```cs +// capture user input in a string variable named readResult + +int numericValue = 0; +bool validNumber = false; + +validNumber = int.TryParse(readResult, out numericValue); +``` + +If the string value assigned to `readResult` represents a valid integer, the +value will be assigned to the integer variable named `numericValue`, and `true` +will be assigned to the Boolean variable named `validNumber`. If the value +assigned to `readResult` doesn't represent a valid integer, `validNumber` will +be assigned a value of `false`. For example, if `readResult` is equal to "7", +the value 7 will be assigned to numericValue. + +### Code project 1 - write code that validates integer input + +Here are the conditions that your first coding project must implement: + +- Your solution must include either a `do-while` or `while` iteration. + +- Before the iteration block: your solution must use a `Console.WriteLine()` +statement to prompt the user for an integer value between 5 and 10. + +- Inside the iteration block: + + - Your solution must use a `Console.ReadLine()` statement to obtain input + from the user. + - Your solution must ensure that the input is a valid representation of an + integer. + - If the integer value isn't between 5 and 10, your code must use a + `Console.WriteLine()` statement to prompt the user for an integer value + between 5 and 10. + - Your solution must ensure that the integer value is between 5 and 10 + before exiting the iteration. + +Below (after) the iteration code block: your solution must use a +`Console.WriteLine()` statement to inform the user that their input value has +been accepted. + +Write the code that implements each condition for code project 1. + +Run your application and verify that your code validates user input based on +the specified requirements. + +For example, when you run your application, it should reject input values such +as "two" and "2", but it should accept an input value of "7". + +The example described above, the console output should look similar to the +following: + +```txt +Enter an integer value between 5 and 10 +two +Sorry, you entered an invalid number, please try again +2 +You entered 2. Please enter a number between 5 and 10. +7 +Your input value (7) has been accepted. +``` + +### Code project 2 - write code that validates string input + +Here are the conditions that your second coding project must implement: + +- Your solution must include either a `do-while` or `while` iteration. + +- Before the iteration block: your solution must use a `Console.WriteLine()` +statement to prompt the user for one of three role names: Administrator, +Manager, or User. + +- Inside the iteration block: + + - Your solution must use a `Console.ReadLine()` statement to obtain input + from the user. + - Your solution must ensure that the value entered matches one of the three + role options. + - Your solution should use the `Trim()` method on the input value to ignore + leading and trailing space characters. + - Your solution should use the `ToLower()` method on the input value to + ignore case. + - If the value entered isn't a match for one of the role options, your code + must use a `Console.WriteLine()` statement to prompt the user for a valid + entry. + +- Below (after) the iteration code block: Your solution must use a +`Console.WriteLine()` statement to inform the user that their input value has +been accepted. + +- Write the code that implements each condition for code project 2. + +Run your application and verify that your code validates user input based on +the specified requirements. + +For example, when you run your application, it should reject an input value +such as "Admin", but it should accept an input value of " administrator ". + +The console output for this example should look similar to the following: + +```txt +Enter your role name (Administrator, Manager, or User) +Admin +The role name that you entered, "Admin" is not valid. Enter your role name (Administrator, Manager, or User) + Administrator +Your input value (Administrator) has been accepted. +``` + +### Code project 3 - Write code that processes the contents of a string array + +Here are the conditions that your third coding project must implement: + +- Your solution must use the following string array to represent the input to +your coding logic: + + ```cs + string[] myStrings = new string[2] { "I like pizza. I like roast chicken. I like salad", "I like all three of the menu choices" }; + ``` + +- Your solution must declare an integer variable named `periodLocation` that +can be used to hold the location of the period character within a string. + +- Your solution must include an outer `foreach` or `for` loop that can be used +to process each string element in the array. The string variable that you'll +process inside the loops should be named `myString`. + +- In the outer loop, your solution must use the `IndexOf()` method of the +`String` class to get the location of the first period character in the +`myString` variable. The method call should be similar to: +`myString.IndexOf(".")`. If there's no period character in the string, a value +of -1 will be returned. + +- Your solution must include an inner `do-while` or `while` loop that can be +used to process the `myString` variable. + +- In the inner loop, your solution must extract and display (write to the +console) each sentence that is contained in each of the strings that are +processed. + +- In the inner loop, your solution must not display the period character. + +- In the inner loop, your solution must use the `Remove()`, `Substring()`, and +`TrimStart()` methods to process the string information. + +Write the code that implements each condition listed for code project 3. + +Run your application and verify that your output meets the requirements. + +If your code logic works correctly, your output should look similar to the +following: + +```txt +I like pizza +I like roast chicken +I like salad +I like all three of the menu choices +``` + +### Project 1 solution + +```cs +string? read_input; +int input = 0; +bool valid = false; + +Console.Write("Enter a value between 5 and 10: "); +do { + read_input = Console.ReadLine(); + valid = int.TryParse(read_input, out input); + if (valid && input >= 5 && input <= 10){ + Console.WriteLine($"Your input value ({input}) has been accepted."); + } else if(!valid) { + Console.WriteLine("Sorry, you entered an invalid number, please try again"); + } else { + Console.WriteLine($"You entered {input}. Please enter a number between 5 and 10."); + valid = !valid; + } +} while (!valid); +``` + +### Project 2 solution + +```cs +string? read_input; +string user_rol = ""; +bool done = false; +string out_msg = "Enter your role name (Administrator, Manager, or User)"; + +do { + Console.WriteLine(out_msg); + read_input = Console.ReadLine(); + if (read_input != null && read_input.Length > 3){ + user_rol = read_input.ToLower().Trim(); + switch (user_rol) { + case "administrator": + Console.WriteLine($"Your input value ({read_input}) has been accepted"); + done = true; + break; + case "manager": + Console.WriteLine($"Your input value ({read_input}) has been accepted"); + done = true; + break; + case "user": + Console.WriteLine($"Your input value ({read_input}) has been accepted"); + done = true; + break; + default: + Console.Write("The role name that you entered, "); + Console.WriteLine($"\"{read_input}\" is not valid. {out_msg}"); + break; + } + } +} while (!done); +``` + +### Project 3 solution + +```cs +string[] likes = new string[2] { + "I like pizza. I like roast chicken. I like salad", + "I like all three of the menu choices" +}; + +int period_location; + +foreach (string phrase in likes){ + period_location = phrase.IndexOf("."); + string new_phrase = phrase; + while (period_location > 0){ + Console.WriteLine(new_phrase.Substring(0, period_location)); + new_phrase = new_phrase.Remove(0, period_location); + new_phrase = new_phrase.Remove(0, 1).TrimStart(); + period_location = new_phrase.IndexOf("."); + } + Console.WriteLine(new_phrase); +} +``` + +--- + +## Summary + +Your goal was to use the `do-while` and `while` statements to perform +iterations. The `do-while` and `while` statements are unique because the body +of the code block determines whether the flow of execution should continue or +stop. + +Using the `do-while` statement, you executed a block of code once before +evaluating a Boolean expression and potentially exiting the iteration. Using +the `while` statement, you performed the evaluation of the Boolean expression +immediately, and continued to evaluate it to exit the iteration. You used the +`continue` statement within the code block to step directly to the Boolean +expression. + +You developed a practical application that uses the `do-while` and `continue` +statements to simulate a battle in a role playing game. Real-world scenarios +involving the `do-while` and `while` iteration statements involve working with +streams of data from files, from the internet, or any other scenario where +you'll continue to perform an iteration until a condition is met. + +Without `do-while` and `while` iteration statements, it would be difficult to +write and maintain iteration code that sets the exit condition within the +iteration code block. diff --git a/017_Looping_logic_using_do-while_and_while/game_battle_challenge/Program.cs b/017_Looping_logic_using_do-while_and_while/game_battle_challenge/Program.cs new file mode 100644 index 0000000..85f99e5 --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/game_battle_challenge/Program.cs @@ -0,0 +1,25 @@ +const int max_health = 10; +int hero = max_health; +int monster = max_health; +string turn = "Hero"; +Random random = new Random(); + +do { + if (turn == "Hero") { + int attack = random.Next(1,11); + monster -= attack; + monster = monster < 0 ? 0 : monster; + Console.Write($@"Monster was damaged and lost {attack} health"); + Console.WriteLine($@" and now has {monster} health"); + turn = "Monster"; + } else { + int attack = random.Next(1,11); + hero -= attack; + hero = hero < 0 ? 0 : hero; + Console.Write($@"Hero was damaged and lost {attack} health"); + Console.WriteLine($@" and now has {hero} health"); + turn = "Hero"; + } +} while (hero > 0 && monster > 0); + +Console.WriteLine(hero > monster ? "Hero wins!" : "Monster wins!"); diff --git a/017_Looping_logic_using_do-while_and_while/game_battle_challenge/game_battle_challenge.csproj b/017_Looping_logic_using_do-while_and_while/game_battle_challenge/game_battle_challenge.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/game_battle_challenge/game_battle_challenge.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/017_Looping_logic_using_do-while_and_while/project_1/Program.cs b/017_Looping_logic_using_do-while_and_while/project_1/Program.cs new file mode 100644 index 0000000..9b3c5ae --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/project_1/Program.cs @@ -0,0 +1,47 @@ +string? read_input; +int input = 0; +bool valid = false; + +Console.Write("Enter an integer value between 5 and 10: "); +do { + read_input = Console.ReadLine(); + valid = int.TryParse(read_input, out input); + if (valid && input >= 5 && input <= 10){ + Console.WriteLine($"Your input value ({input}) has been accepted."); + } else if(!valid) { + Console.WriteLine("Sorry, you entered an invalid number, please try again"); + } else { + Console.WriteLine($"You entered {input}. Please enter a number between 5 and 10."); + valid = !valid; + } +} while (!valid); + +// Propoussed Solution +// string? readResult; +// string valueEntered = ""; +// int numValue = 0; +// bool validNumber = false; +// +// Console.WriteLine("Enter an integer value between 5 and 10"); +// +// do { +// readResult = Console.ReadLine(); +// if (readResult != null) { +// valueEntered = readResult; +// } +// +// validNumber = int.TryParse(valueEntered, out numValue); +// +// if (validNumber == true) { +// if (numValue <= 5 || numValue >= 10) { +// validNumber = false; +// Console.WriteLine($"You entered {numValue}. Please enter a number between 5 and 10."); +// } +// } else { +// Console.WriteLine("Sorry, you entered an invalid number, please try again"); +// } +// } while (validNumber == false); +// +// Console.WriteLine($"Your input value ({numValue}) has been accepted."); +// +// readResult = Console.ReadLine(); diff --git a/017_Looping_logic_using_do-while_and_while/project_1/project_1.csproj b/017_Looping_logic_using_do-while_and_while/project_1/project_1.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/project_1/project_1.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/017_Looping_logic_using_do-while_and_while/project_2/Program.cs b/017_Looping_logic_using_do-while_and_while/project_2/Program.cs new file mode 100644 index 0000000..706513d --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/project_2/Program.cs @@ -0,0 +1,51 @@ +string? read_input; +string user_rol = ""; +bool done = false; +string out_msg = "Enter your role name (Administrator, Manager, or User)"; + +do { + Console.WriteLine(out_msg); + read_input = Console.ReadLine(); + if (read_input != null && read_input.Length > 3){ + user_rol = read_input.ToLower().Trim(); + switch (user_rol) { + case "administrator": + Console.WriteLine($"Your input value ({read_input}) has been accepted"); + done = true; + break; + case "manager": + Console.WriteLine($"Your input value ({read_input}) has been accepted"); + done = true; + break; + case "user": + Console.WriteLine($"Your input value ({read_input}) has been accepted"); + done = true; + break; + default: + Console.Write("The role name that you entered, "); + Console.WriteLine($"\"{read_input}\" is not valid. {out_msg}"); + break; + } + } +} while (!done); + +// Propoussed Solution +// string? readResult; +// string roleName = ""; +// bool validEntry = false; +// +// do { +// Console.WriteLine("Enter your role name (Administrator, Manager, or User)"); +// readResult = Console.ReadLine(); +// if (readResult != null) { +// roleName = readResult.Trim(); +// } +// if (roleName.ToLower() == "administrator" || roleName.ToLower() == "manager" || roleName.ToLower() == "user") { +// validEntry = true; +// } else { +// Console.Write($"The role name that you entered, \"{roleName}\" is not valid. "); +// } +// } while (validEntry == false); +// +// Console.WriteLine($"Your input value ({roleName}) has been accepted."); +// readResult = Console.ReadLine(); diff --git a/017_Looping_logic_using_do-while_and_while/project_2/project_2.csproj b/017_Looping_logic_using_do-while_and_while/project_2/project_2.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/project_2/project_2.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/017_Looping_logic_using_do-while_and_while/project_3/Program.cs b/017_Looping_logic_using_do-while_and_while/project_3/Program.cs new file mode 100644 index 0000000..351bb5d --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/project_3/Program.cs @@ -0,0 +1,48 @@ +string[] likes = new string[2] { + "I like pizza. I like roast chicken. I like salad", + "I like all three of the menu choices" +}; + +int period_location; + +foreach (string phrase in likes){ + period_location = phrase.IndexOf("."); + string new_phrase = phrase; + while (period_location > 0){ + Console.WriteLine(new_phrase.Substring(0, period_location)); + new_phrase = new_phrase.Remove(0, period_location); + new_phrase = new_phrase.Remove(0, 1).TrimStart(); + period_location = new_phrase.IndexOf("."); + } + Console.WriteLine(new_phrase); +} + +// Propoussed Solution +// string[] myStrings = new string[2] { +// "I like pizza. I like roast chicken. I like salad", +// "I like all three of the menu choices" +// }; +// int stringsCount = myStrings.Length; +// string myString = ""; +// int periodLocation = 0; +// +// for (int i = 0; i < stringsCount; i++) { +// myString = myStrings[i]; +// periodLocation = myString.IndexOf("."); +// string mySentence; +// // extract sentences from each string and display them one at a time +// while (periodLocation != -1) { +// // first sentence is the string value to the left of the period location +// mySentence = myString.Remove(periodLocation); +// // the remainder of myString is the string value to the right of the location +// myString = myString.Substring(periodLocation + 1); +// // remove any leading white-space from myString +// myString = myString.TrimStart(); +// // update the comma location and increment the counter +// periodLocation = myString.IndexOf("."); +// +// Console.WriteLine(mySentence); +// } +// mySentence = myString.Trim(); +// Console.WriteLine(mySentence); +// } diff --git a/017_Looping_logic_using_do-while_and_while/project_3/project_3.csproj b/017_Looping_logic_using_do-while_and_while/project_3/project_3.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/project_3/project_3.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/017_Looping_logic_using_do-while_and_while/user_input/Program.cs b/017_Looping_logic_using_do-while_and_while/user_input/Program.cs new file mode 100644 index 0000000..0d21a86 --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/user_input/Program.cs @@ -0,0 +1,31 @@ +string? readResult; +Console.WriteLine("Enter a string:"); +do { + readResult = Console.ReadLine().Trim(); +} while (readResult == null); + +Console.WriteLine("\n-----------------------------------\n"); + +string? readResult2; +bool validEntry = false; +Console.WriteLine("Enter a string containing at least three characters:"); +do { + readResult2 = Console.ReadLine(); + if (readResult2 != null) { + if (readResult2.Length >= 3) { + validEntry = true; + } else { + Console.WriteLine("Your input is invalid, please try again."); + } + } +} while (validEntry == false); + +Console.WriteLine("\n-----------------------------------\n"); + +// capture user input in a string variable named readResult + +int numericValue = 0; +bool validNumber = false; + +validNumber = int.TryParse(readResult2, out numericValue); +Console.WriteLine($"valid num: {validNumber}"); diff --git a/017_Looping_logic_using_do-while_and_while/user_input/user_input.csproj b/017_Looping_logic_using_do-while_and_while/user_input/user_input.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/017_Looping_logic_using_do-while_and_while/user_input/user_input.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/README.md b/README.md index fa8e068..2d6386f 100644 --- a/README.md +++ b/README.md @@ -20,4 +20,5 @@ Following - [Evaluate Boolean expressions](/013_eval_boolean_expressions/013_csharp.md) - [Control variable scope and logic](/014_scope_and_logic/014_csharp.md) - [switch case construct](./015_switch_case/015_csharp.md) -- [switch case construct](/016_Iterate_using_for_statement/016_csharp.md) +- [FizzBuzz Challenge](./016_Iterate_using_for_statement/016_csharp.md) +- [Looping logic using the do-while and while](./017_Looping_logic_using_do-while_and_while/017_csharp.md)