## Statements

There are several kinds of statements, such as assignment statements, choice statements (select and if statements), and loop statements (while and for statements).

Semicolons are required after statements, except at the end of a sequence (that is, just before an `end` keyword and after the last statement) or after the keyword `end`. In this text semicolons are omitted before `end`.

### The assignment statement

An assignment statement is used to assign values to variables. An example:

    y = x + 10

This assignment consists of a name of the variable (`y`), an assignment symbol (`=`), and an expression (`x + 10`) yielding a value. For example, when `x` is `2`, the value of the expression is `12`. Execution of this statement copies the value to the `y` variable, immediately after executing the assignment, the value of the `y` variable is `10` larger than the value of the `x` variable at this point of the program. The value of the `y` variable will not change until the next assignment to `y`, for example, performing the assignment `x = 7` has no effect on the value of the `y` variable.

An example with two assignment statements:

    i = 2;
    j = j + 1

The values of `i` becomes 2, and the value of `j` is incremented. Independent assignments can also be combined in a multi-assignment, for example:

    i, j = 2, j + 1

The result is the same as the above described example, the first value goes into the first variable, the second value into the second variable, etc.

In an assignment statement, first all expression values are computed before any assignment is actually done. In the following example the values of `x` and `y` are swapped:

    x, y = y, x;

### The `if` statement

The if statement is used to express decisions. An example:

    if x < 0:
        y = -x
    end

If the value of `x` is negative, assign its negated value to `y`. Otherwise, do nothing (skip the `y = -x` assignment statement).

To perform a different statement when the decision fails, an `if`-statement with an `else` alternative can be used. It has the following form. An example:

    if a > 0:
        c = a
    else:
        c = b
    end

If `a` is positive, variable `c` gets the value of `a`, otherwise it gets the value of `b`.

In some cases more alternatives must be tested. One way of writing it is by nesting an `if`-statement in the `else` alternative of the previous `if`-statement, like:

    if i < 0:
        writeln("i < 0")
    else:
        if i == 0:
            writeln("i = 0")
        else:
            if i > 0 and i < 10:
                writeln("0 < i < 10")
            else:
                # i must be greater or equal 10
                writeln("i >= 10")
            end
        end
    end

This tests `i < 0`. If it fails, the `else` is chosen, which contains a second `if`-statement with the `i == 0` test. If that test also fails, the third condition `i > 0 and i < 10` is tested, and one of the `writeln` statements is chosen.

The above can be written more compactly by combining an `else`-part and the `if`-statement that follows, into an `elif` part. Each `elif` part consists of a boolean expression, and a statement list. Using `elif` parts results in:

    if i < 0:
        writeln("i < 0")
    elif i == 0:
        writeln("i = 0")
    elif i > 0 and i < 10:
        writeln("0 < i < 10")
    else:
        # i must be greater or equal 10
        writeln("i >= 10")
    end

Each alternative starts at the same column, instead of having increasing indentation. The execution of this combined statement is still the same, an alternative is only tested when the conditions of all previous alternatives fail.

Note that the line `# i must be greater or equal 10` is a comment to clarify when the alternative is chosen. It is not executed by the simulator. You can write comments either at a line by itself like above, or behind program code. It is often useful to clarify the meaning of variables, give a more detailed explanation of parameters, or add a line of text describing what the purpose of a block of code is from a birds-eye view.

### The `while` statement

The while statement is used for repetitive execution of the same statements, a so-called loop. A fragment that calculates the sum of `10` integers, `10, 9, 8, ..., 3, 2, 1`, is:

    int i = 10, sum;

    while i > 0:
        sum = sum + i; i = i - 1
    end

Each iteration of a `while` statement starts with evaluating its condition (`i > 0` above). When it holds, the statements inside the while (the `sum = sum + i; i = i - 1` assignments) are executed (which adds `i` to the sum and decrements `i`). At the end of the statements, the `while` is executed again by evaluating the condition again. If it still holds, the next iteration of the loop starts by executing the assignment statements again, etc. When the condition fails (`i` is equal to `0`), the `while` statement ends, and execution continues with the statement following `end`.

A fragment with an infinite loop is:

    while true:
        i = i + 1;
        ...
    end

The condition in this fragments always holds, resulting in `i` getting incremented 'forever'. Such loops are very useful to model things you switch on but never off, e.g. processes in a factory.

A fragment to calculate `z = x ^ y`, where `z` and `x` are of type `real`, and `y` is of type `integer` with a non-negative value, showing the use of two `while` loops, is:

    real x; int y; real z = 1;

    while y > 0:
        while y mod 2 == 0:
            y = y div 2; x = x * x
        end;
        y = y - 1; z = x * z
    end

A fragment to calculate the greatest common divisor (GCD) of two integer numbers `j` and `k`, showing the use of `if` and `while` statements, is:

    while j != k:
        if j > k:
            j = j - k
        else:
            k = k - j
        end
    end

The symbol `!=` stands for 'differs from' ('not equal').

### The `for` statement

The while statement is useful for looping until a condition fails. The for statement is used for iterating over a collection of values. A fragment with the calculation of the sum of `10` integers:

    int sum;

    for i in range(1, 11):
        sum = sum + i
    end

The result of the expression `range(1, 11)` is a list whose items are consecutive integers from `1` (included) up to `11` (excluded): `[1, 2, 3, ..., 9, 10]`.

The following example illustrates the use of the for statement in relation with container-type variables. Another way of calculating the sum of a list of integer numbers:

    list int xs = [1, 2, 3, 5, 7, 11, 13];
    int sum;

    for x in xs:
        sum = sum + x
    end

This statement iterates over the elements of list `xs`. This is particularly useful when the value of `xs` may change before the `for` statement.

### Notes

In this chapter the most used statements are described. Below are a few other statements that may be useful some times:

- Inside loop statements, the break and continue statements are allowed. The `break` statements allows 'breaking out of a loop', that is, abort a while or a for statement. The `continue` statement aborts execution of the statements in a loop. It 'jumps' to the start of the next iteration.

- A rarely used statement is the `pass` statement. It’s like an `x = x` assignment statement, but more clearly expresses 'nothing is done here'.

### Exercises

1. Study the Chi specification below and explain why, though it works, it is not an elegant way of modeling the selection. Make a suggestion for a shorter, more elegant version of:

       model M():
           int i = 3;

           if (i <  0) == true:
               write("%d is a negative number\n", i);
           elif (i <= 0) == false:
               write("%d is a positive number\n", i);
           end
       end

2. Construct a list with the squares of the integers 1 to 10.

   1. using a `for` statement, and

   2. using a `while` statement.

3. Write a program that

   1. Makes a list with the first 50 prime numbers.

   2. Extend the program with computing the sum of the first 7 prime numbers.

   3. Extend the program with computing the sum of the last 11 prime numbers.