804 lines
27 KiB
Markdown
804 lines
27 KiB
Markdown
# Introduction
|
||
|
||
The C# programming language allows you to build applications that employ
|
||
decision-making logic.
|
||
|
||
Suppose you want to display different information to the end user depending on
|
||
some business rules. For example, what if you want to display a special
|
||
message on a customer's bill based on their geographic region? What if you
|
||
want to give a customer a discount based on the size of their order? Or what
|
||
if you want to display an employee's title based on their level in the company.
|
||
In each case, you would need to add decision logic.
|
||
|
||
By the end of this module, you'll be able to write code that can change the
|
||
flow of your code's execution based on some criteria.
|
||
|
||
> Important
|
||
> This module includes coding activities that require Visual Studio Code. You'll
|
||
need access to a development environment that has Visual Studio Code installed
|
||
and configured for C# application development.
|
||
|
||
### Learning objectives
|
||
|
||
In this module, you will:
|
||
|
||
- Write code that evaluates conditions by using the statements `if`, `else`,
|
||
and `else if`.
|
||
- Build Boolean expressions to evaluate a condition.
|
||
- Combine Boolean expressions using logical operators.
|
||
- Nest code blocks within other code blocks.
|
||
|
||
#### Prerequisites
|
||
|
||
- Experience using Visual Studio Code to create and run C# console applications.
|
||
- Experience printing messages to the console using `Console.WriteLine()`.
|
||
- Experience with string interpolation to combine variables into literal
|
||
strings.
|
||
- Experience working with the System.Random class to generate random numbers.
|
||
|
||
---
|
||
|
||
## Exercise
|
||
|
||
### Create decision logic with if statements
|
||
|
||
Most applications include a large number of execution paths. For example, an
|
||
application could implement different execution paths based on which menu
|
||
option a user selects. Developers refer to the code that implements different
|
||
execution paths as code branches.
|
||
|
||
The most widely used code branching statement is the `if` statement. The `if`
|
||
statement relies on a Boolean expression that is enclosed in a set of
|
||
parentheses. If the expression is true, the code after the `if` statement is
|
||
executed. If not, the .NET runtime ignores the code and doesn't execute it.
|
||
|
||
In this exercise, you'll practice writing `if` statements by creating a game.
|
||
First you'll define the rules of the game, then you'll implement them in code.
|
||
|
||
You'll use the `Random.Next()` method to simulate rolling three six-sided dice.
|
||
You'll evaluate the rolled values to calculate the score. If the score is
|
||
greater than an arbitrary total, then you'll display a winning message to the
|
||
user. If the score is below the cutoff, you'll display a losing message to the
|
||
user.
|
||
|
||
- If any two dice you roll result in the same value, you get two bonus points
|
||
for rolling doubles.
|
||
- If all three dice you roll result in the same value, you get six bonus
|
||
points for rolling triples.
|
||
- If the sum of the three dice rolls, plus any point bonuses, is 15 or greate
|
||
r, you win the game. Otherwise, you lose.
|
||
|
||
You'll refine the rules as you learn more about the if statement.
|
||
|
||
> Important
|
||
> This exercise makes extensive use of the `System.Random` class. You can refer
|
||
to the Microsoft Learn module titled "Call methods from the .NET Class Library
|
||
using C#" if you need a refresher how `Random.Next()` works.
|
||
|
||
#### Prepare your coding environment
|
||
|
||
This module includes activities that guide you through the process of building
|
||
and running sample code. You're encouraged to complete these activities using
|
||
Visual Studio Code as your development environment. Using Visual Studio Code
|
||
for these activities will help you to become more comfortable writing and
|
||
running code in a developer environment that's used by professionals worldwide.
|
||
|
||
Open Visual Studio Code.
|
||
|
||
### Write code that generates three random numbers and displays them in output
|
||
|
||
Ensure that you have an empty Program.cs file open in Visual Studio Code.
|
||
|
||
To create the initial code for this exercise, enter the following:
|
||
|
||
```cs
|
||
Random dice = new Random();
|
||
|
||
int roll1 = dice.Next(1, 7);
|
||
int roll2 = dice.Next(1, 7);
|
||
int roll3 = dice.Next(1, 7);
|
||
|
||
int total = roll1 + roll2 + roll3;
|
||
|
||
Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
|
||
```
|
||
|
||
Take a minute to review the code that you entered.
|
||
|
||
To begin, you create a new instance of the `System.Random` class and store a
|
||
reference to the object in a variable named `dice`. Then, you call the
|
||
`Random.Next()` method on the `dice` object three times, providing both the
|
||
lower and upper bounds to restrict the possible values between `1` and `6` (the
|
||
upper bound is exclusive). You save the three random numbers in the variables
|
||
`roll1`, `roll2`, and `roll3`, respectively.
|
||
|
||
Next, you sum the three dice rolls and save the value into an integer variable
|
||
named `total`.
|
||
|
||
Finally, you use the `WriteLine()` method to display the three values using
|
||
string interpolation.
|
||
|
||
When you run the code, you should see the following message (the numbers will
|
||
be different).
|
||
|
||
Output
|
||

|
||
```txt
|
||
Dice roll: 4 + 5 + 2 = 11
|
||
```
|
||
|
||
This first task was a setup task. Now, you can add the decision logic into
|
||
your code to make the game more interesting.
|
||
|
||
### Add an if statement to display different messages based on the value of the total variable
|
||
|
||
In the Visual Studio Code Editor, locate the cursor at the bottom of your code
|
||
file, and then create a blank code line.
|
||
|
||
To create your first game feature, enter the following if statements.
|
||
|
||
```cs
|
||
if (total > 14){
|
||
Console.WriteLine("You win!");
|
||
}
|
||
|
||
if (total < 15){
|
||
Console.WriteLine("Sorry, you lose.");
|
||
}
|
||
```
|
||
|
||
These two if statements are used to handle the winning and losing scenarios.
|
||
Take a minute to examine the first if statement.
|
||
|
||
Notice that the if statement is made up of three parts:
|
||
|
||
- The `if` keyword
|
||
- A Boolean expression between parenthesis `()`
|
||
- A code block defined by curly braces `{ }`
|
||
|
||
At run time, the Boolean expression `total > 14` is evaluated. If this is a
|
||
true statement (if the value of total is greater than `14`) then the flow of
|
||
execution will continue into the code defined in the code block. In other word
|
||
s, it will execute the code in the curly braces.
|
||
|
||
However, if the Boolean expression is false (the value of `total` not greater
|
||
than `14`) then the flow of execution will skip past the code block. In other
|
||
words, it will not execute the code in the curly braces.
|
||
|
||
Finally, the second `if` statement controls the message if the user loses. In
|
||
the next unit, you'll use a variation on the `if` statement to shorten these
|
||
two statements into a single statement that more clearly expresses the intent.
|
||
|
||
### What is a Boolean expression?
|
||
|
||
A Boolean expression is any code that returns a Boolean value, either `true` or
|
||
`false`. The simplest Boolean expressions are simply the values `true` and
|
||
`false`. Alternatively, a Boolean expression could be the result of a method that
|
||
returns the value `true` or `false`. For example, here's a simple code example
|
||
using the `string.Contains()` method to evaluate whether one string contains
|
||
another string.
|
||
|
||
```cs
|
||
string message = "The quick brown fox jumps over the lazy dog.";
|
||
bool result = message.Contains("dog");
|
||
Console.WriteLine(result);
|
||
|
||
if (message.Contains("fox")){
|
||
Console.WriteLine("What does the fox say?");
|
||
}
|
||
```
|
||
|
||
Because the `message.Contains("fox")` returns a `true` or `false` value, it
|
||
qualifies as a Boolean expression and can be used in an `if` statement.
|
||
|
||
Other simple Boolean expressions can be created by using operators to compare two values. Operators include:
|
||
|
||
- `==`, the "equals" operator, to test for equality
|
||
- `>`, the "greater than" operator, to test that the value on the left is greater than the value on the right
|
||
- `<`, the "less than" operator, to test that the value on the left is less than the value on the right
|
||
- `>=`, the "greater than or equal to" operator
|
||
- `<=`, the "less than or equal to" operator
|
||
- and so on
|
||
|
||
> Note
|
||
> The C# training series on Microsoft Learn devotes an entire module to
|
||
Boolean expressions. There are many operators you can use to construct a
|
||
Boolean expression, and you'll only cover a few of the basics here in this
|
||
module. For more on Boolean expressions, see the Microsoft Learn module titled
|
||
"Evaluate Boolean expressions to make decisions in C#".
|
||
|
||
In this example, you evaluated the Boolean expression `total > 14`. However,
|
||
you could have chosen the Boolean expression `total >= 15` because in this cas
|
||
e, they're the same. Given that the rules to the game specify "If the sum of
|
||
the three dice, plus any bonuses, is 15 or greater, you win the game", you
|
||
should probably implement the `>= 15` expression. You'll make that change in
|
||
the next step of the exercise.
|
||
|
||
### What is a code block?
|
||
|
||
A code block is a collection of one or more lines of code that are defined by
|
||
an opening and closing curly brace symbol `{ }`. It represents a complete unit
|
||
of code that has a single purpose in your software system. In this case, at
|
||
runtime, all lines of code in the code block are executed if the Boolean
|
||
expression is true. Conversely, if the Boolean expression is false, all lines
|
||
of code in the code block are ignored.
|
||
|
||
You should also know that code blocks can contain other code blocks. In fact,
|
||
it's common for one code block to be "nested" inside another code block in
|
||
your applications. You'll begin nesting your own code blocks later in this
|
||
module when you create one `if` statement inside the code block of another.
|
||
|
||
> Note
|
||
> The C# training series on Microsoft Learn devotes an entire module to
|
||
understanding code blocks. Code blocks are central to understanding code
|
||
organization and structure, and they define the boundaries of variable scope.
|
||
See the module [Control variable scope and logic using code blocks in C#](TBD).
|
||
|
||
### Add another if statement to implement the doubles bonus
|
||
|
||
Next, you can implement the rule: "If any two dice you roll result in the same
|
||
value, you get two bonus points for rolling doubles". Modify the code from the
|
||
previous step to match the following code listing:
|
||
|
||
In the Visual Studio Code Editor, locate the cursor on the blank code line
|
||
above the first `if` statement.
|
||
|
||
To create your "doubles" game feature, enter the following `if` statement.
|
||
|
||
```cs
|
||
if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)){
|
||
Console.WriteLine("You rolled doubles! +2 bonus to total!");
|
||
total += 2;
|
||
}
|
||
```
|
||
|
||
Here you combine three Boolean expressions to create one composite Boolean
|
||
expression in a single line of code. This is sometimes called a compound
|
||
condition. You have one outer set of parentheses that combines three inner
|
||
sets of parentheses separated by two pipe characters.
|
||
|
||
The double pipe characters `||` are the **logical OR operator**, which
|
||
basically says "either the expression to my left OR the expression to my right
|
||
must be true in order for the entire Boolean expression to be true". If both
|
||
Boolean expressions are false, then the entire Boolean expression is false.
|
||
You use two logical OR operators so that you can extend the evaluation to a
|
||
third Boolean expression.
|
||
|
||
First, you evaluate `(roll1 == roll2)`. If that's true, then the entire
|
||
expression is true. If it's false, you evaluate `(roll2 == roll3)`. If that's
|
||
true, then the entire expression is true. If it's false, you evaluate
|
||
`(roll1 == roll3)`. If that's true, then the entire expression is true. If
|
||
that is false, then the entire expression is false.
|
||
|
||
If the composite Boolean expression is true, then you execute the following
|
||
code block. This time, there are two lines of code. The first line of code
|
||
prints a message to the user. The second line of code increments the value of
|
||
`total` by `2`.
|
||
|
||
To improve the readability of your code, update the second `if` statement as
|
||
follows:
|
||
|
||
```cs
|
||
if (total >= 15)
|
||
```
|
||
|
||
Notice that you're now using the `>=` operator in the expression that's used
|
||
to evaluate a winning roll. The `>=` operator means "greater or equal to". As a
|
||
result, you can compare `total` to a value of `15` rather than `14`. With
|
||
these changes, the expression that you use to evaluate a winning roll now
|
||
resembles the expression that you evaluate for a losing roll. This should help
|
||
to make your code easier to understand (more readable). Since you are dealing
|
||
with integer values, your new expression `(total >= 15)` will function
|
||
identically to what you wrote previously `(total > 14)`.
|
||
|
||
Take a minute to review your code.
|
||
|
||
Your code should match the following:
|
||
|
||
```cs
|
||
Random dice = new Random();
|
||
|
||
int roll1 = dice.Next(1, 7);
|
||
int roll2 = dice.Next(1, 7);
|
||
int roll3 = dice.Next(1, 7);
|
||
|
||
int total = roll1 + roll2 + roll3;
|
||
|
||
Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
|
||
|
||
if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)){
|
||
Console.WriteLine("You rolled doubles! +2 bonus to total!");
|
||
total += 2;
|
||
}
|
||
|
||
if (total >= 15){
|
||
Console.WriteLine("You win!");
|
||
}
|
||
|
||
if (total < 15){
|
||
Console.WriteLine("Sorry, you lose.");
|
||
}
|
||
```
|
||
|
||
Notice the improved alignment between the expressions used to evaluate winning
|
||
and losing rolls.
|
||
|
||
### Add another if statement to implement the triples bonus
|
||
|
||
Next, you can implement the rule: "If all three dice you roll result in the
|
||
same value, you get six bonus points for rolling triples." Modify the code
|
||
from the previous steps to match the following code listing:
|
||
|
||
In the Visual Studio Code Editor, create a blank code line below the code
|
||
block of your "doubles" `if` statement.
|
||
|
||
To create your "triples" game feature, enter the following `if` statement.
|
||

|
||
```cs
|
||
if ((roll1 == roll2) && (roll2 == roll3)) {
|
||
Console.WriteLine("You rolled triples! +6 bonus to total!");
|
||
total += 6;
|
||
}
|
||
```
|
||
|
||
Here you combine two Boolean expressions to create one composite Boolean
|
||
expression in a single line of code. You have one outer set of parentheses
|
||
that combines two inner sets of parentheses separated by two ampersand
|
||
characters.
|
||
|
||
The double ampersand characters `&&` are the **logical AND** operator, which
|
||
basically says "only if both expressions are true, then the entire expression
|
||
is true". In this case, if `roll1` is equal to `roll2`, and `roll2` is equal to
|
||
`roll3`, then by deduction, roll1 must be equal to roll3, and the user rolled
|
||
triples.
|
||
|
||
On the Visual Studio Code File menu, click Save.
|
||
|
||
Take a minute to review your code.
|
||
|
||
Ensure that your code matches the following:
|
||
|
||
```cs
|
||
Random dice = new Random();
|
||
|
||
int roll1 = dice.Next(1, 7);
|
||
int roll2 = dice.Next(1, 7);
|
||
int roll3 = dice.Next(1, 7);
|
||
|
||
int total = roll1 + roll2 + roll3;
|
||
|
||
Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
|
||
|
||
if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)){
|
||
Console.WriteLine("You rolled doubles! +2 bonus to total!");
|
||
total += 2;
|
||
}
|
||
|
||
if ((roll1 == roll2) && (roll2 == roll3)) {
|
||
Console.WriteLine("You rolled triples! +6 bonus to total!");
|
||
total += 6;
|
||
}
|
||
|
||
if (total >= 15){
|
||
Console.WriteLine("You win!");
|
||
}
|
||
|
||
if (total < 15){
|
||
Console.WriteLine("Sorry, you lose.");
|
||
}
|
||
```
|
||
|
||
You should see output that resembles one of the following results:
|
||
|
||
```txt
|
||
Dice roll: 3 + 6 + 1 = 10
|
||
Sorry, you lose.
|
||
```
|
||
|
||
Or, like this:
|
||
|
||
```txt
|
||
Dice roll: 1 + 4 + 4 = 9
|
||
You rolled doubles! +2 bonus to total!
|
||
Sorry, you lose.
|
||
```
|
||
|
||
Or, like this:
|
||
|
||
```txt
|
||
Dice roll: 5 + 6 + 4 = 15
|
||
You win!
|
||
```
|
||
|
||
Or, if you're lucky, you'll see this:
|
||
|
||
```txt
|
||
Dice roll: 6 + 6 + 6 = 18
|
||
You rolled doubles! +2 bonus to total!
|
||
You rolled triples! +6 bonus to total!
|
||
You win!
|
||
```
|
||
|
||
But wait, should you really reward the player with both the triple bonus and
|
||
the double bonus? After all, a roll of triples implies that they also rolled
|
||
doubles. Ideally, the bonuses shouldn't stack. There should be two separate
|
||
bonus conditions. This is a bug in logic that will need to be corrected.
|
||
|
||
### Problems in your logic and opportunities to improve the code
|
||
|
||
Although this is a good start, and you've learned a lot about the if statement,
|
||
Boolean expressions, code blocks, logical OR and AND operators, and so on,
|
||
there's much that can be improved. You'll do that in the next unit.
|
||
|
||
### Recap
|
||
|
||
- Use an `if` statement to branch your code logic. The `if` decision statement
|
||
will execute code in its code block if its Boolean expression equates to true.
|
||
Otherwise, the runtime will skip over the code block and continue to the next
|
||
line of code after the code block.
|
||
- A Boolean expression is any expression that returns a Boolean value.
|
||
- Boolean operators will compare the two values on its left and right for
|
||
equality, comparison, and more.
|
||
- A code block is defined by curly braces `{ }`. It collects lines of code
|
||
that should be treated as a single unit.
|
||
- The logical AND operator `&&` aggregates two expressions so that both
|
||
subexpressions must be true in order for the entire expression to be true.
|
||
- The logical OR operator `||` aggregates two expressions so that if either
|
||
subexpression is true, the entire expression is true.
|
||
|
||
---
|
||
|
||
## Exercise
|
||
|
||
### Create nested decision logic with if, else if, and else
|
||
|
||
In the previous unit, you used multiple `if` statements to implement the rules
|
||
of a game. However, at the end of the unit, you noticed that more expressive
|
||
`if` statements are needed to fix a subtle bug in your code.
|
||
|
||
In this exercise, you'll use `if`, `else`, and `else if` statements to improve
|
||
the branching options in your code and fix a logic bug.
|
||
|
||
### Use if and else statements instead of two separate if statements
|
||
|
||
Instead of performing two checks to display the "You win!" or "Sorry, you lose"
|
||
message, you'll use the `else` keyword.
|
||
|
||
Ensure that your Program.cs code matches the following:
|
||
|
||
```cs
|
||
Random dice = new Random();
|
||
|
||
int roll1 = dice.Next(1, 7);
|
||
int roll2 = dice.Next(1, 7);
|
||
int roll3 = dice.Next(1, 7);
|
||
|
||
int total = roll1 + roll2 + roll3;
|
||
|
||
Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
|
||
|
||
if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)){
|
||
Console.WriteLine("You rolled doubles! +2 bonus to total!");
|
||
total += 2;
|
||
}
|
||
|
||
if ((roll1 == roll2) && (roll2 == roll3)) {
|
||
Console.WriteLine("You rolled triples! +6 bonus to total!");
|
||
total += 6;
|
||
}
|
||
|
||
if (total >= 15){
|
||
Console.WriteLine("You win!");
|
||
}
|
||
|
||
if (total < 15){
|
||
Console.WriteLine("Sorry, you lose.");
|
||
}
|
||
```
|
||
|
||
This is the code that you completed in the previous unit.
|
||
|
||
Take a minute to examine the two `if` statements at the end of the file:
|
||
|
||
```cs
|
||
if (total >= 15){
|
||
Console.WriteLine("You win!");
|
||
}
|
||
|
||
if (total < 15){
|
||
Console.WriteLine("Sorry, you lose.");
|
||
}
|
||
```
|
||
|
||
Notice that both `if` statements compare `total` with the same numeric value.
|
||
This is the perfect opportunity to use an `else` statement.
|
||
|
||
Update the two if statements as follows:
|
||
|
||
```cs
|
||
if (total >= 15){
|
||
Console.WriteLine("You win!");
|
||
} else {
|
||
Console.WriteLine("Sorry, you lose.");
|
||
}
|
||
```
|
||
|
||
Here, if `total >= 15` is false, then the code block following the `else`
|
||
keyword will execute. Since the two outcomes are related opposites, this is a
|
||
perfect scenario for the `else` keyword.
|
||
|
||
Your updated Program.cs file should contain the following code:
|
||
|
||
```cs
|
||
Random dice = new Random();
|
||
|
||
int roll1 = dice.Next(1, 7);
|
||
int roll2 = dice.Next(1, 7);
|
||
int roll3 = dice.Next(1, 7);
|
||
|
||
int total = roll1 + roll2 + roll3;
|
||
|
||
Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
|
||
|
||
if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)){
|
||
Console.WriteLine("You rolled doubles! +2 bonus to total!");
|
||
total += 2;
|
||
}
|
||
|
||
if ((roll1 == roll2) && (roll2 == roll3)){
|
||
Console.WriteLine("You rolled triples! +6 bonus to total!");
|
||
total += 6;
|
||
}
|
||
|
||
if (total >= 15){
|
||
Console.WriteLine("You win!");
|
||
} else {
|
||
Console.WriteLine("Sorry, you lose.");
|
||
}
|
||
```
|
||
|
||
#### Modify the code to remove the stacking bonus for doubles and triples using nesting
|
||
|
||
In the previous unit, you saw that a subtle logic bug was introduced into your
|
||
application. You can fix that issue by nesting your `if` statements.
|
||
|
||
Nesting allows you to place code blocks inside of code blocks. In this case,
|
||
you'll nest an if and else combination (the check for doubles) inside of
|
||
another if statement (the check for triples) to prevent both bonuses from being
|
||
awarded.
|
||
|
||
Modify your code to match the following code listing:
|
||
|
||
```cs
|
||
Random dice = new Random();
|
||
|
||
int roll1 = dice.Next(1, 7);
|
||
int roll2 = dice.Next(1, 7);
|
||
int roll3 = dice.Next(1, 7);
|
||
|
||
int total = roll1 + roll2 + roll3;
|
||
|
||
Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
|
||
|
||
if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)){
|
||
if ((roll1 == roll2) && (roll2 == roll3)){
|
||
Console.WriteLine("You rolled triples! +6 bonus to total!");
|
||
total += 6;
|
||
} else {
|
||
Console.WriteLine("You rolled doubles! +2 bonus to total!");
|
||
total += 2;
|
||
}
|
||
}
|
||
|
||
if (total >= 15){
|
||
Console.WriteLine("You win!");
|
||
} else {
|
||
Console.WriteLine("Sorry, you lose.");
|
||
}
|
||
```
|
||
|
||
Take a minute to review the nested `if` statements.
|
||
|
||
The goal is to create an inner `if-else` construct where the two outcomes
|
||
are related opposites, and then use the opposing outcomes (if/true and else
|
||
/false) to award the bonus points for triples and doubles. To achieve this goal,
|
||
you check for doubles in the outer `if` statement, and then for triples in the
|
||
inner `if` statement. This pattern ensures that when the inner check for
|
||
triples returns `false`, your `else` code block can award the points for doubles.
|
||
|
||
Coming up, you will "hard code" the results of your three rolls in order to
|
||
test your code logic.
|
||
|
||
Create a blank code line above the line where total is declared and initialized.
|
||
|
||
To test for a roll of doubles, enter the following code:
|
||
|
||
```cs
|
||
roll1 = 6;
|
||
roll2 = 6;
|
||
roll3 = 5;
|
||
```
|
||
|
||
Hard coding the three roll variables enables you to test the code without
|
||
having to run the application dozens of times.
|
||
|
||
When your code runs, you should see:
|
||
|
||
```cs
|
||
Dice roll: 6 + 6 + 5 = 17
|
||
You rolled doubles! +2 bonus to total!
|
||
You win!
|
||
```
|
||
|
||
To test for a roll of triples, update your hard-coded roll variables as follows:
|
||
|
||
```cs
|
||
roll1 = 6;
|
||
roll2 = 6;
|
||
roll3 = 6;
|
||
```
|
||
|
||
When your code runs, you should see:
|
||
|
||
```txt
|
||
Dice roll: 6 + 6 + 6 = 18
|
||
You rolled triples! +6 bonus to total!
|
||
You win!
|
||
```
|
||
|
||
#### Use if, else, and else if statements to give a prize instead of a win-lose message
|
||
|
||
To make the game more fun, you can change the game from "win-or-lose" to awarding fictitious prizes for each score. You can offer four prizes. However, the player should win only one prize:
|
||
|
||
- If the player scores greater or equal to 16, they'll win a new car.
|
||
- If the player scores greater or equal to 10, they'll win a new laptop.
|
||
- If the player scores exactly 7, they'll win a trip.
|
||
- Otherwise, the player wins a kitten.
|
||
|
||
Modify the code from the previous steps to the following code listing:
|
||
|
||
```cs
|
||
Random dice = new Random();
|
||
|
||
int roll1 = dice.Next(1, 7);
|
||
int roll2 = dice.Next(1, 7);
|
||
int roll3 = dice.Next(1, 7);
|
||
|
||
int total = roll1 + roll2 + roll3;
|
||
|
||
Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
|
||
|
||
if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)){
|
||
if ((roll1 == roll2) && (roll2 == roll3)){
|
||
Console.WriteLine("You rolled triples! +6 bonus to total!");
|
||
total += 6;
|
||
} else {
|
||
Console.WriteLine("You rolled doubles! +2 bonus to total!");
|
||
total += 2;
|
||
}
|
||
Console.WriteLine($"Your total including the bonus: {total}");
|
||
}
|
||
|
||
if (total >= 16){
|
||
Console.WriteLine("You win a new car!");
|
||
} else if (total >= 10){
|
||
Console.WriteLine("You win a new laptop!");
|
||
} else if (total == 7){
|
||
Console.WriteLine("You win a trip for two!");
|
||
} else {
|
||
Console.WriteLine("You win a kitten!");
|
||
}
|
||
```
|
||
|
||
Take a minute to review the updated `if-elseif-else` construct.
|
||
|
||
The `if`, `else if`, and `else` statements allow you to create multiple
|
||
exclusive conditions as Boolean expressions. In other words, when you only
|
||
want one outcome to happen, but you have several possible conditions and
|
||
results, use as many `else if` statements as you want. If none of the `if` and
|
||
`else if` statements apply, the final `else` code block will be executed. The
|
||
`else` is optional, but it must come last if you choose to include it.
|
||
|
||
Use the technique of temporarily hard coding the `roll` variables to test each
|
||
message.
|
||
|
||
### Recap
|
||
|
||
- The combination of `if` and `else` statements allows you to test for one
|
||
condition, and then perform one of two outcomes. The code block for the `if`
|
||
will be run when the Boolean expression is `true`, and the code block for the
|
||
`else` will be run when the Boolean expression is `false`.
|
||
- You can nest `if` statements to narrow down a possible condition. However, you
|
||
should consider using the `if`, `else if`, and `else` statements instead.
|
||
- Use `else if` statements to create multiple exclusive conditions.
|
||
- An `else` is optional, but it must always come last when included.
|
||
|
||
---
|
||
|
||
## Exercise
|
||
|
||
### Complete a challenge activity to apply business rules
|
||
|
||
Code challenges will reinforce what you've learned and help you gain some
|
||
confidence before proceeding.
|
||
|
||
### Challenge: Improve renewal rate of subscriptions
|
||
|
||
You've been asked to add a feature to your company's software. The feature is
|
||
intended to improve the renewal rate of subscriptions to the software. Your
|
||
task is to display a renewal message when a user logs into the software system
|
||
and is notified their subscription will soon end. You'll need to add a couple
|
||
of decision statements to properly add branching logic to the application to
|
||
satisfy the requirements.
|
||
|
||
### Prepare your coding environment
|
||
|
||
To create the initial code for this challenge, enter the following code:
|
||
|
||
```cs
|
||
Random random = new Random();
|
||
int daysUntilExpiration = random.Next(12);
|
||
int discountPercentage = 0;
|
||
|
||
// Your code goes here
|
||
```
|
||
|
||
Notice that this code will generate a random number with a value of 0 - 11.
|
||
The random number is assigned to an integer variable named `daysUntilExpiration`.
|
||
You have another integer variable named `discountPercentage` that is initialized
|
||
to `0`.
|
||
|
||
### Review the business rules for this challenge
|
||
|
||
1. Rule 1: Your code should only display one message.
|
||
|
||
The message that your code displays will depend on the other five rules. For rules 2-6, the higher numbered rules take precedence over the lower numbered rules.
|
||
|
||
2. Rule 2: If the user's subscription will expire in 10 days or less, display the message:
|
||
|
||
```txt
|
||
Your subscription will expire soon. Renew now!
|
||
```
|
||
|
||
3. Rule 3: If the user's subscription will expire in five days or less, display the messages:
|
||
|
||
```txt
|
||
Your subscription expires in _ days.
|
||
Renew now and save 10%!
|
||
```
|
||
|
||
> Note
|
||
Be sure to replace the _ character displayed in the message above with the
|
||
value stored in the variable daysUntilExpiration when you construct your
|
||
message output.
|
||
|
||
4. Rule 4: If the user's subscription will expire in one day, display the messages:
|
||
|
||
```txt
|
||
Your subscription expires within a day!
|
||
Renew now and save 20%!
|
||
```
|
||
|
||
5. Rule 5: If the user's subscription has expired, display the message:
|
||
|
||
```txt
|
||
Your subscription has expired.
|
||
```
|
||
|
||
6. Rule 6: If the user's subscription doesn't expire in 10 days or less, display nothing.
|
||
|
||
### Implement your solution code using `if` statements
|
||
|
||
Your solution must use separate `if` and `if-else` statements to implement the
|
||
business rules. The `if-else` statement can include multiple `else if` parts.
|
||
|
||
1. Create an `if-else` statement that displays a message about when the
|
||
subscription will expire.
|
||
|
||
> Tip
|
||
Use an else if to ensure each expiration rule is accounted for.
|
||
|
||
2. Create a separate `if` statement that displays a discount offer.
|
||
|
||
The business rules indicate when a discount should be offered.
|