You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
303 lines
8.5 KiB
Markdown
303 lines
8.5 KiB
Markdown
---
|
|
marp: true
|
|
paginate: true
|
|
math: mathjax
|
|
theme: buutti
|
|
title: 3. Conditionals
|
|
---
|
|
|
|
# Conditionals
|
|
|
|
<!-- headingDivider: 5 -->
|
|
<!-- class: invert -->
|
|
|
|
## Overview
|
|
|
|
* Conditionals
|
|
* `if` and `else`
|
|
* Logical Operators
|
|
|
|
## Comparison operators
|
|
|
|
* ***Comparison operators*** are used to compare two variables
|
|
* They return either `true` or `false`
|
|
* Two variables of any type can be compared with equality operators
|
|
* Equal to: `a == b`
|
|
* (Do not mix with the assignment operator, see [Lecture 2](2-variables-and-types#assignment-operators)!)
|
|
* Not equal to: `a != b`
|
|
* Two ***numbers*** can be further compared with less than/greater than operators:
|
|
* Less than: `a < b`
|
|
* Less than or equal: `a <= b`
|
|
* Greater than: `a > b`
|
|
* Greater than or equal: `a >= b`
|
|
|
|
<!-- | Comparison | Syntax |
|
|
|:-------------------------|:---------|
|
|
| Less than | `a < b` |
|
|
| Less than or equal to | `a <= b` |
|
|
| Greater than | `a > b` |
|
|
| Greater than or equal to | `a >= b` |
|
|
| Equal to | `a == b` |
|
|
| Not equal to | `a != b` | -->
|
|
|
|
### `bool` data type
|
|
|
|
* As shown in [Lecture 2](2-variables-and-types#primitive-data-types), `bool` is a data type for storing truth values `true` or `false`
|
|
* Because conditionals return `true` or `false`, the result can be stored in a variable
|
|
```csharp
|
|
int a = 4;
|
|
int b = 3;
|
|
bool areEqual = a == b; // outputs False
|
|
bool biggerOrNot = a > b; // outputs True
|
|
```
|
|
* Useful for making multiple comparisons at once
|
|
|
|
## `if`, `else if` and `else` statements
|
|
|
|
<div class='columns21' markdown='1'>
|
|
<div markdown='1'>
|
|
|
|
* `if` checks truthfulness of a given statement
|
|
* If it results in `false`, we can check if another condition is met with `else if`
|
|
* Multiple `else if` can be chained indefinitely
|
|
* If no statement returns `true`, the `else` block is executed
|
|
* The statements are checked in order, and the first `true` condition is executed
|
|
* No other block is executed
|
|
* (You can also have just `if` and `else` without the `else if`, or just a single `if`.)
|
|
|
|
</div>
|
|
<div markdown='1'>
|
|
|
|
```csharp
|
|
int a = 2
|
|
if (a > 4)
|
|
{
|
|
// do something
|
|
}
|
|
else if (a < 2)
|
|
{
|
|
// do something else
|
|
}
|
|
else if (a < 3)
|
|
{
|
|
// do something else
|
|
}
|
|
else
|
|
{
|
|
// a is 4??
|
|
}
|
|
```
|
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
### Conditionals: An example
|
|
|
|
```csharp
|
|
double temperatureInOulu = 2.3;
|
|
double temperatureInIvalo = -10.9;
|
|
if (temperatureInOulu > temperatureInIvalo)
|
|
{
|
|
Console.WriteLine("Oulu is warmer than Ivalo");
|
|
}
|
|
else if (temperatureInOulu < temperatureInIvalo)
|
|
{
|
|
Console.WriteLine("Ivalo is warmer than Oulu");
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine
|
|
("Oulu and Ivalo have the same temperature");
|
|
}
|
|
```
|
|
|
|
This outputs `Oulu is warmer than Ivalo`.
|
|
|
|
## Not operator `!`
|
|
|
|
* The `!` ("not") operator flips the boolean value.
|
|
```csharp
|
|
Console.WriteLine(!true); // Outputs false
|
|
bool itsColdOutside = true;
|
|
if (!itsColdOutside) // same as checking if (itsColdOutside == false)
|
|
{
|
|
Console.WriteLine("It's warm outside.");
|
|
}
|
|
```
|
|
|
|
## The `switch` statement
|
|
|
|
<div class='columns' markdown='1'>
|
|
<div markdown='1'>
|
|
|
|
* The `switch` statement compares the given expression (in this example, the `path` variable) with the value of each `case`
|
|
* Only the matching code is executed
|
|
* If no match is found, the default code block is executed
|
|
* This example outputs `Here's the catalogue!`
|
|
* `break` ends each case (the code will not compile if omitted!)
|
|
|
|
</div>
|
|
<div markdown='1'>
|
|
|
|
```csharp
|
|
string path = "/browse";
|
|
|
|
switch (path)
|
|
{
|
|
case "/browse":
|
|
Console.WriteLine("Here's the catalogue!");
|
|
break;
|
|
case "/contact":
|
|
Console.WriteLine("Here's our contact info.");
|
|
break;
|
|
default:
|
|
Console.WriteLine("Given path doesn't exist!");
|
|
break;
|
|
}
|
|
```
|
|
|
|
</div>
|
|
</div>
|
|
|
|
## Scope of Variables
|
|
|
|
* Variables declared inside of blocks `{}` are ***local*** to that ***scope***; they are only accessible inside of that block
|
|
```csharp
|
|
if (true)
|
|
{
|
|
int b = 1; // b is only accessible in this block
|
|
b = 2; // This works
|
|
}
|
|
|
|
b = 3; // This throws an error
|
|
```
|
|
* Similarly, classes are only defined inside their `namespace`, and have to be imported to be accessible elsewhere
|
|
* ***Note:*** Some languages have `global` variables that are accessible everywhere — as an object-oriented language, C# doesn't have such feature.
|
|
|
|
## Logical Operators
|
|
|
|
* `&&`, `||` and `!` are the logical AND, OR and NOT operators
|
|
* These are useful when writing complex `if` statements
|
|
|
|
<div class='columns' markdown='1'>
|
|
<div markdown='1'>
|
|
|
|
```csharp
|
|
int a = 1;
|
|
int b = 3;
|
|
int c = 5;
|
|
if (a < 10)
|
|
{
|
|
if (b < 10)
|
|
{
|
|
if (c < 10)
|
|
{
|
|
Console.WriteLine
|
|
("All are smaller than 10!")
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
</div>
|
|
<div markdown='1'>
|
|
|
|
```csharp
|
|
int a = 1;
|
|
int b = 3;
|
|
int c = 5;
|
|
if (a < 10 && b < 10 && c < 10)
|
|
{
|
|
Console.WriteLine
|
|
("All are smaller than 10!")
|
|
}
|
|
```
|
|
* Same functionality achieved in fewer lines!
|
|
|
|
</div>
|
|
</div>
|
|
|
|
### Common logical operators
|
|
|
|
| Operator | Name | Usage | Description |
|
|
|:---------|:-----|:-----------|:-----------------------------------------------------------------------------------------|
|
|
| `&&` | AND | `a && b` | Returns `true` if *__both__* variables are true.<br>`b` is not evaluated if `a == false`. |
|
|
| `\|\|` | OR | `a \|\| b` | Returns `true` if *__one or both__* variables are true.<br>`b` is not evaluated if `a == true`. |
|
|
| `!` | NOT | `!a` | Negates the boolean value.<br>(`true` becomes `false` and vice versa). |
|
|
|
|
### Less common logical operators
|
|
|
|
| Operator | Name | Usage | Description |
|
|
|:---------|:------------|:---------|:-----------------------------------------------------------------------------------------|
|
|
| `^` | XOR | `a ^ b` | Exclusive OR ("*joko tai*"): returns `true` if *__only either of__* `a` or `b` are `true`, but not both! |
|
|
| `&` | Logical AND | `a & b` | Returns `true` if __both__ variables are `true`.<br>Both variables are always evaluated. |
|
|
| `\|` | Logical OR | `a \| b` | Returns `true` if __one or both__ variables are `true`.<br>Both variables are always evaluated. |
|
|
|
|
### Logical operators: An Example
|
|
|
|
|
|
```csharp
|
|
int uppercaseLetters = 2;
|
|
uppercaseLetters += 4; // is now 6
|
|
|
|
int specialCharacters = 2;
|
|
specialCharacters *= 2; // is now 4
|
|
|
|
if (uppercaseLetters >= 6 && specialCharacters >= 2)
|
|
{
|
|
Console.WriteLine("Strong password!");
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("Weak password...");
|
|
}
|
|
```
|
|
This outputs `Strong password!`
|
|
|
|
## Extra: Single statement `if`
|
|
<!-- _class: "extra invert" -->
|
|
|
|
* If a code block following a statement only has one line of code, it is possible to write the block ***without*** curly brackets:
|
|
```csharp
|
|
int baa = 49;
|
|
if (baa > 20)
|
|
Console.WriteLine("Baa");
|
|
else
|
|
Console.WriteLine("Not baa!");
|
|
if (baa > 20) Console.WriteLine("Baa");
|
|
else Console.WriteLine("Not baa!");
|
|
```
|
|
* You may encounter code like this — however, we highly recommend to refrain from using this syntax as it is highly prone to [errors](https://www.leadingagile.com/2018/01/the-goto-fail-bug-as-a-coaching-tool/).
|
|
* Can you guess how this syntax can lead to bugs?
|
|
|
|
## Exercise 1
|
|
<!--_class: "exercise invert" -->
|
|
|
|
1) Create a console application that asks the user which weekday it is and assigns the answer to a string variable.
|
|
2) Using a switch-case expression, calculate the days remaining until next Monday.
|
|
3) If the result is more than 3, print `Have a nice week!`. Otherwise, print `Have a nice weekend!`.
|
|
|
|
## Exercise 2
|
|
<!--_class: "exercise invert" -->
|
|
|
|
1) Create a console application that lets the user input a note as a string.
|
|
2) If the length of the note is less than 30, the program prints the current time and the note separated by a tab. Otherwise, the date and the note are printed to a separate line.
|
|
|
|
***Tip:*** Use `DateTime.Now.ToString()` for current time. Use `.Length` after your message variable to get the length of the message.
|
|
|
|
|
|
## Reading
|
|
|
|
Basics covering the syntax in C# are covered here:
|
|
|
|
* [Learn .NET: C# Documentation](https://learn.microsoft.com/en-us/dotnet/csharp/tour-of-csharp/)
|
|
* [Tutorialspoint: C# tutorial](https://www.tutorialspoint.com/csharp/index.htm)
|
|
* [W3Schools: C# tutorial](https://www.w3schools.com/cs/default.asp)
|
|
|
|
## Assignments
|
|
<!--_class: "exercise invert" -->
|
|
|
|
[Assignments about this topic can be found here](https://gitea.buutti.com/education/academy-assignments/src/branch/master/C%23%20Basics/3.%20Conditionals)
|
|
|