---
marp: true
paginate: true
math: mathjax
theme: buutti
title: 2. Variables and Types
---

# Variables and Types

<!-- headingDivider: 5 -->
<!-- class: invert -->

## Overview

* Variables
* Comments
* Data Types
* Arithmetic Operators
* Increment & Decrement
* Assignment Operators
* Strings
* Character Constants
* String Interpolation

## Variables

* A variable can be thought of as a name for a certain address in computer's memory
  * Using this name we can access the value on the computer's memory
  * The value can be read or written
* On more practical terms: We can assign values to named variables.

### Declaring variables

* Every variable declaration in C# requires the ***type*** and the ***name*** of the variable, for example:
  ```csharp
  int x;
  ```
* After declaration, you can assign a ***value*** for declared variables:
  ```csharp
  x = 25;
  ```
* Variable declaration with value assignment can be done in one line:
  ```csharp
  int x = 25;
  ```

### Printing to console with `Console.WriteLine`

<div class='columns' markdown='1'>
<div markdown='1'>

* We can use the method `Console.WriteLine` to write, a.k.a. ***print*** to the C# console
  ```csharp
  Console.WriteLine("Hello World!")
  ```
* We can also declare variables and print their values like this:
  ```csharp
  int example = 123;
  Console.WriteLine(example);
  // prints 123
  ```

</div>
<div markdown='1'>

This program prints the value `15`:
```csharp
using System;
namespace MyAwesomeProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int a = 25;
      int b = 10;
      Console.WriteLine(a - b);
    }
  }
}
```

</div>
</div>

### Extra: Modifiers
<!-- _class: "extra invert" -->

* A common modifier to add in front of a variable is `const`, short for ***constant***
* If we know that a value of a variable is never going to change during the execution of the script, we can set it to `const`:
  ```c#
  const int one = 1;
  
  one = 2;  // raises an error
  ```
* Some programmers prefer using `const` by default.
* Other modifiers include ***access modifiers*** introduced in [Lecture 7](7-classes-and-objects#access-modifiers).

## Comments

* There are two basic ways to comment in C#:
  ```csharp
  // This is a comment

  /* This is a
  multi
  line
  comment */
  ```
* Any text inside a comment will not be executed
* Use comments to
  a) explain your code
  b) comment out actual code for testing and debugging


## Data types

### What is a data type?

* Data type tells to a computer what type of data is stored in a variable.
* Data types are commonly divided into two categories:
  * Primitive data types
  * Reference data types
* Here we go through the primitive data types
  * We dig deeper on the differences of these data types later in [Lecture 7](7-classes-and-objects#value-and-reference-types)

## Primitive data types

| Type      | Represents                     | Range                                            | Default |
|:----------|:-------------------------------|:-------------------------------------------------|:--------|
| `bool`    | Boolean value                  | `true` or `false`                                | `false` |
| `int`     | 32-bit signed integer          | $-2147483648$ to $2147483647$                    | `0`     |
| `float`   | 32-bit single-precision float  | $±1.5 \cdot 10^{-45}$ to $±3.4 \cdot 10^{38}$    | `0.0F`  |
| `double`  | 64-bit double-precision float  | $±5.0 \cdot 10^{-324}$ to $±1.7 \cdot 10^{308}$  | `0.0D`  |
| `decimal` | 128-bit precise decimal values | $±1.0 \cdot 10^{-28}$ to $±7.9228 \cdot 10^{28}$ | `0.0M`  |
| `char`    | 16-bit Unicode character       | `U+0000` to `U+ffff`                             | `\0`    |
| `byte`    | 8-bit unsigned integer         | $0$ to $255$                                     | `0`     |

More types listed in the [C# reference](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/built-in-types)!

### Data type examples

```csharp
double airPressure = 1.2;         // Use for most decimal numbers
decimal accountBalance = 1.2m;    // Use for accuracy (e.g. financial applications)
float bulletSpeed = 1.2f;         // Use only when you know its precision will be enough
bool loggedIn = false;
char previousInput = 'b';
```

* `char` is only used for single characters, multi-character ***strings*** will be introduced in a bit.

## Extra: Casting data types
<!-- _class: "extra invert" -->

Data types can be ***cast*** to another either...

<div class='columns' style="grid-template-columns: 2.5fr 3fr;" markdown='1'>
<div markdown='1'>

...implicitly:
```csharp
double valueAddedTax = 25.5;
decimal valueAddedTaxDecimal = valueAddedTax;
```

</div>
<div markdown='1'>

...explicitly:
```csharp
double valueAddedTax = 25.5;
decimal valueAddedTaxDecimal = (decimal)valueAddedTax;
```

</div>
</div>

* Casting is useful when, for example, when we want to sum a `double` and a `decimal` together:
  ```csharp
  double a = 1.0;
  decimal b = 2.1m;
  Console.WriteLine(a + (double)b);
  Console.WriteLine((decimal)a + b);
  ```
* [C# Guide: Casting and type conversions](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/types/casting-and-type-conversions)

## Assignments (variables)
<!--_class: "exercise invert" -->

[Assignments about this topic can be found here](https://gitea.buutti.com/education/academy-assignments/src/branch/master/C%23%20Basics/2.1.%20Variables%20&%20Types)

## Assignments (data types)
<!--_class: "exercise invert" -->

[Assignments about this topic can be found here](https://gitea.buutti.com/education/academy-assignments/src/branch/master/C%23%20Basics/2.2.%20Data%20Types)

## Arithmetic operations?

* ***Arithmetic operations*** are common mathematical operations:
  * Addition
  * Subtraction
  * Multiplication
  * Division
  * Modulus (remainder, in Finnish *jakojäännös*)
* The operations are represented by **_arithmetic operators_**

## Arithmetic Operators

| Operator | Name           | Example | Description                            |
|:---------|:---------------|:--------|:---------------------------------------|
| `+`      | Addition       | `a + b` | Adds together two values               |
| `-`      | Subtraction    | `a - b` | Subtracts one value from another       |
| `*`      | Multiplication | `a * b` | Multiplies two values                  |
| `/`      | Division       | `a / b` | Divides one value by another           |
| `%`      | Modulus        | `a % b` | Returns the division remainder         |
| `++`     | Increment      | `a++`   | Increases the value by 1 |
| `--`     | Decrement      | `a–-`   | Decreases the value by 1 |

## Exercise 1: Trying Out Variables
<!--_class: "exercise invert" -->

1) Create a new console application and declare two variables of type `double`.
2) Assign different values for those variables.
3) Print the sum, difference, fraction and product of those values to the console.

## The assignment operator

We have used the assignment operator `=` for assigning values for variables:
  ```csharp
  int x;
  x = 25;
  ```
* ***Note*** the difference between `=` and `==` introduced in [Lecture 3](3-conditionals#comparison-operators)!
  * `=` is used for assigning values for variables, `==` is used for ***comparing*** values

### Assignment operators

<div class='columns' markdown='1'>
<div markdown='1'>

| Operator | Example  | Same As     |
|:---------|:---------|:------------|
| `=`      | `x = 5`  | `x = 5`     |
| `+=`     | `x += 5` | `x = x + 5` |
| `-=`     | `x -= 5` | `x = x - 5` |
| `*=`     | `x *= 5` | `x = x * 5` |
| `/=`     | `x /= 5` | `x = x / 5` |
| `%=`     | `x %= 5` | `x = x % 5` |

</div>
<div markdown='1'>

* As shown here, there are some assignment operators that work as ***shorthands*** for longer assignments
* Particularly useful when the variable name is longer, so you don't have to write it twice when its value is changed

</div>
</div>


### Assignment operators: An example

```csharp
int uppercaseLetters = 2;
uppercaseLetters += 4;          // is now 6

int specialCharacters = 2;
specialCharacters *= 2;         // is now 4

Console.WriteLine(uppercaseLetters);
Console.WriteLine(specialCharacters);
```

### Increment and decrement operations

* You can increment or decrement a variable value by 1 with dedicated short-hands
  * Most programming languages implement these!

<div class='columns' markdown='1'>
<div markdown='1'>

* Addition example:
  ```csharp
  int a = 3;

  a = a + 1;  // a is now 4
  a += 1;     // a is now 5
  a++;        // a is now 6
  ```

</div>
<div markdown='1'>

* Subtraction example:
  ```csharp
  int a = 3;

  a = a - 1;  // a is now 2
  a -= 1;     // a is now 1
  a--;        // a is now 0
  ```


</div>
</div>

* `++` and `--` are called the ***increment and decrement operators***


### Extra: Increment/decrement operation precedence
<!-- _class: "extra invert" -->

* Note that incrementing can be written as ***prefix*** (`++i`) or a ***postfix*** (`i++`)
* In this example, `a++` and `++a` do exactly the same:
  ```csharp
  int a = 3;
  a++; // a is now 4
  ++a; // a is now 5
  ```
* Their exact difference is [complicated](https://stackoverflow.com/questions/3346450/what-is-the-difference-between-i-and-i-in-c), and in some cases, using either prefix or postfix form can produce different results:

<div class='columns' markdown='1'>
<div markdown='1'>

```csharp
int a = 3;
int b = ++a;
Console.WriteLine(b); // 4
```
Assignment of `b` happens after `++`,
so its value is 4

</div>
<div markdown='1'>

```csharp
int a = 3;
int b = a++;
Console.WriteLine(b); // 3
```
Assignment of `b` happens before `++`,
so its value is 3

</div>
</div>


## Strings

* `string` is a special type that contains an array of characters.
  ```csharp
  string name = "Sini Aalto";
  ```
* You can ***concatenate*** (i.e., combine) multiple strings with the `+` operator:
  ```csharp
  string firstName = "Sini";
  string lastName = "Aalto";
  
  string fullName = firstName + " " + lastName;
  
  Console.WriteLine(fullName);    // Outputs "Sini Aalto"
  ```

### Character Constants

* Character constants are preceded by a backslash `\` and can be used for formatting strings
* `\n` represents a ***newline***
  ```csharp
  string firstName = "Johannes";
  string lastName = "Kantola";
  string fullName = firstName + "\n" + lastName;
  Console.WriteLine(fullName);

  /* This outputs
  Johannes

  Kantola
  */
  ```
* All character constants are listed [here](https://www.tutorialspoint.com/csharp/csharp_constants.htm)

### String Interpolation

* Concatenating multiple variables into one string with the `+` operator quickly becomes tedious
* It's much easier to use *__string interpolation__* by prefixing your target string with `$` and inserting the variables inside curly brackets `{ }`:
  ```csharp
  string animal = "Dog";
  string sound = "Woof";

  Console.WriteLine($"{animal} says {sound}!");
  // Outputs "Dog says Woof!"
  ```

### String Formatting

* You can add *__format strings__* to change the way variables are interpolated into a string
* Add the format string after your variable, separated by a colon (:)
* You can find an overview of format strings and a handy list of both standard and custom strings  [here](https://learn.microsoft.com/en-us/dotnet/standard/base-types/formatting-types)
  ```csharp
  double pi = 3.141592653;
  Console.WriteLine($"Pi to three digits: {pi:G3}");
  // Outputs "Pi to three digits: 3.14"
  ```

## User input with `Console.ReadLine()`

<div class='columns21' markdown='1'>
<div markdown='1'>

* For the next exercise, you'll need the `Console.ReadLine()` method
* The method pauses the program, waits for an input stream from the console that pops up, and returns the value of the input:
  ```csharp
  string userInput = Console.ReadLine();
  Console.WriteLine(userInput);
  ```

</div>
<div markdown='1'>

![w:200](imgs/2%20Variables%20and%20Types_1.png)

</div>
</div>

## Exercise 2: Weekday survey
<!--_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) Print `Have a nice <weekday>` to the console where `<weekday>` is replaced with the string the user wrote.

## Assignments (arithmetic operations)
<!--_class: "exercise invert" -->

[Assignments about this topic can be found here](https://gitea.buutti.com/education/academy-assignments/src/branch/master/C%23%20Basics/2.3.%20Arithmetic%20Operations)

