TOPIC A: Basics

Contents :

  Cardinal, Integer, + - * DIV MOD, IF, FOR, WHILE, RdCard, WrCard, RdInt, WrInt, WrStr, WrLn.

Exercises :



D0: First Steps

1) Your first Modula 2 program:
2) A very simple example using variables:
3) A very simple example using user input:

D1: Divisible

open Modula2 comp
  • open Modula2 compiler XDS: start -> programs -> [TW] Programming ->  XDS environment
  • create new file
  • copy the solution D1Part1
  • save as D1Part1.mod  (must be the exact same name!! Don't forget the .mod)
  • je creeert het best een folder per topic!
  • PAS OP: folders of programma's mogen geen spaties bevatten (dat geraakt XDS in de war)
    1. Ask the user for a number x and tell if it is a divisible by 7.
    2. Make sure that x is greater than 10000, otherwise give an error message.
    3. Repeat this 5 times (ask + check). Also print the iteration number.
    4. Don't repeat it 5 times, but repeat it until x is divisible by 7. Also give the number of iterations.
    5. Ask in the beginning of the program the number by which x must be divisible (instead of the 7).
    6. Ask in the beginning of the program the number where x must be greater of (instead of the 10000).

    D2: Teken figuur

  • open de Modula2 compiler XDS: Start -> Programs -> [TW] Programming ->  XDS environment
  • creer een nieuwe file
  • copieer de oplossing Demo2
  • save als Demo2.mod  (Dit moet exact deze naam zijn!! Vergeet vooral de .mod niet!!)
  • save in je eigen drive (best de E:), maak er een folder voor deze oefeningen (bvb "Modula2" )
  • je creeert het best een folder per topic (bvb TopicA, TopicB, ...)!
  • PAS OP: folders of programma's mogen geen spaties bevatten (dat geraakt XDS in de war)
  • Zoals je ziet in de IMPORT sectie, heb je Wimdows nodig om het grafische scherm te kunnen gebruiken. Download dit op onze technology pagina.
  • Opgave: vraag een kleur aan de gebruiker ('R' voor rood, 'B' voor blauw, 'G'  voor groen, gebruik RdKey() om een letter in te lezen), teken dan verschillende geometrische vormen op het scherm (cirkel, lijn, rechthoek)

    Bestudeer Demo2b, hier worden 10 lijnen getekend mbv een FOR-statement
     


    S1: Bla

    1. Print "bla" 10 times to the screen.
    2. Ask the user first how many times "bla" must be printed, then do it.
    Hint: copy the solution of Demo1 part3 and modify it

    S2: Arrow

    *
    **
    ***
    **
    *
    1. Print the above arrow to the screen.
    2. Ask the user first how big the arrow must be (in our case the arrow is 3 wide).


     


    S3: Division & Modulo

    Hint: once your program runs, but is not gicing the right results, check your program with the debugger, as explained here.


    S4: Teken Lijnen

    1. Vraag de gebruiker om 2 punten in te geven (x1, y1, x2, y2 : dus 4 gehele getallen).  Teken een lijn tussen deze beide punten.
    2. Controleer of de ingegeven punten wel degelijk binnen het grafische scherm liggen (0<x<GRAPH_WIDTH; 0<y<GRAPH_HEIGHT), anders geef je een foutmelding en teken je niets op het scherm!
    Tip: D2 geeft een voorbeeld van hoe je het grafisch scherm kan gebruiken. Vergeet niet Wimdows te downloaden op onze technology pagina om de code te kunnen compileren!



    S5: Draw Grid

    1. Teken een grid (raster) op het scherm van 500x500, met een interlinie (tussen de gridlijnen) van 50 pixels.
    2. Vraag de gebruiker voor de interlinie en teken dan de grid.
    3. Vraag de gebruiker voor het aantal gridlijnen en teken de grid.
    In english:
    1. Draw a grid on screen (a grid of lines)
    2. Ask user for spacing in between gridlines, draw grid (FOR TO BY END;)
    3. Ask user for amount of gridlines in X & Y direction, draw grid (DIV)

    S6: Gestreepte Ruit


    N = 5                                                         N = 4
    Hint:


    X1: Sequence

    The following formula defines a sequence of cardinals:

    N<1> = 1  (first, initial element)

    N<i> = (N<i-1> * 5 + 356) MOD 97 (next elements)

    with i: 1,2,3,4,...

    so: N<2> = (N<1> * 5 + 356) MOD 97 = (1 * 5 + 356) MOD 97 = 70

    - Question: What is the maximal value N<i> can have, regardless of the initial value. Divide this number by 2.
    - This formula can be used to generate random numbers between 0 and 96.


    H1: Multiples ("Veelvouden")


    H2: Fibonacci

    The following formula denote the Fibonacci series:

    N<i> = N<i-1> + N<i-2>     for i  > 1
      with  N<0> = 1, N<1> = 1

    This results in: N<2> = 2, N<3> = 3, N<4> = 5, ...

    1. Write a program that calculates and prints the first n fibonacci numbers, with n given by the user.
    2. Replace the FOR by a WHILE.



    T1: Output

    MODULE T1;
    <* NOOPTIMIZE + *> (* this is for using the debugger *)
      FROM IO IMPORT WrLn, WrCard, RdCard;
      VAR x1, x2, x3: CARDINAL;
    BEGIN
        x1 := 3;
        x2 := RdCard();  (* hier tik ik 7 in (here I type 7)  !! *)
        WHILE (x2 < 30) DO
            x3 := x1 + x2;
            IF (x3 MOD 3) = 0 THEN
                x2 := x2 + x3;
            ELSE
                x2 := x2 - 1;
            END;
        END;

        WrCard(x1, 0);
        WrLn();
        WrCard(x2, 0);
        WrLn();
        WrCard(x3, 0);
        WrLn();
    END T1.


    T2: Debug

    A student wrote the following program for exercise S2 (Arrow). It runs, but there are 2 errors!! Find and correct them.
    See  for tips.

    MODULE T2;
    <* NOOPTIMIZE + *> (* this is for using the debugger *)
         FROM IO IMPORT WrStr, WrLn, RdCard, WrCard, RdInt, WrInt;

        VAR n, i, j:CARDINAL;            (* variable-declarations *)
    BEGIN
        WrLn;
        n := 5;

        FOR i := 1 TO n DO
          REPEAT
            j := j + 1;
            WrStr("*");
          UNTIL (j = i);
          WrLn;
        END;

        FOR i := n-1 TO 1 BY -1 DO
          REPEAT
            j := j + 1;
            WrStr("*");
          UNTIL (j = i);
          WrLn;
        END;

    END T2.


    T3: Output

    What is the output of the following program? Find it out on paper.

    MODULE T3;
    <* NOOPTIMIZE + *> (* this is for using the debugger *)
      FROM IO IMPORT WrLn, WrCard, RdCard;
      VAR i, j: CARDINAL;
    BEGIN
        FOR i := 10 TO 22 BY 5 DO
           j := i;
           REPEAT
             j := j - 2;
           UNTIL (j MOD 3) = 0;
           WrCard(j, 0);
           WrLn();
        END;
    END T3.