Some sample MINIP programs

The following sample MINIP programs are meant as a help when debugging your compilers. They are probably not covering all cases, and the fact that you can successfully compile and run them is no guarantee that your compiler is free of errors.

This file was created by Jeppe Buk for testing the assignments in 1996.

Useful programs


program fibonacci;

var a : integer;

    function fib(n : integer): integer;
    
    begin
        if n <= 1 then
            fib := n
         else
            fib := fib(n - 1) + fib(n - 2)
    end;
    
begin
    a := 0;
    while a < 10 do begin
        write(fib(a));
        writeln();
        a := a + 1
    end
end.


program fakultet;

var a,r : integer;

    function fak(x : integer): integer;
    
    begin
        if x<=1 then
        begin
            fak := 1
        end
        else
        begin
            fak := x * fak(x-1)
        end
    end;

begin
    a := 0;
    while a <= 10 do
    begin
        write(fak(a));
        a := a + 1;
        writeln()
    end
end.


program QSort;

var num : ARRAY[1..20] of integer;

    procedure writeArray(a, b : integer);
    
    begin
        while a <= b do
            begin
                write(num[a]);
                a := a + 1
            end;
        writeln()
    end;
        
        
    procedure Swap(a, b : integer);
    
    var tmp : integer;
    
    begin
        tmp := num[b];
        num[b] := num[a];
        num[a] := tmp
    end;

    procedure Quicksort(a, b : integer);
    
    var j : integer;
    
        function Partition(p, r : integer) : integer;
        
        var i, j, x : integer;
            cont    : boolean;

        begin
            x := num[p];
            i := p - 1;
            j := r + 1;
            cont := true;
            while cont do begin
                j := j - 1;
                while num[j] > x do
                    j := j - 1;
                i := i + 1;
                while num[i] < x do
                    i := i + 1;
                if i < j then Swap(i,j)
                else cont := false
            end;
            Partition := j
        end;
    
    begin
        if a < b then
            begin
                j := Partition(a, b);
                Quicksort(a,j);
                Quicksort(j+1,b)
            end
    end;
    
begin
    num[1]  :=  10;
    num[2]  :=  18;
    num[3]  :=  19;
    num[4]  :=  18;
    num[5]  :=  12;
    num[6]  :=   8;
    num[7]  :=   3;
    num[8]  :=  15;
    num[9]  :=  20;
    num[10] :=   3;
    num[11] :=  17;
    num[12] :=  25;
    num[13] :=  11;
    num[14] :=  23;
    num[15] :=  12;
    num[16] :=   0;
    num[17] :=  -8;
    num[18] := -13;
    num[19] :=   9;
    num[20] :=  42;
    writeArray(1,20);
    Quicksort(1,20);
    writeArray(1,20)
end.

Programs testing more subtle cases


program procparam;

{ Testing parameter passing of a parameter passed subprogram }

procedure a(function g: integer);
begin
    write(g(2));
    writeln()
end;

    procedure b(function h: integer);
    begin
        a(h)
    end;
    
    procedure c();
    var m : integer;
    
        function f(n : integer): integer;
        begin
            f := m + n
        end;
    
    begin
        m := 3;
        b(f)
    end;
    
begin
    c()
end.


program temptest;

{ Testing utilization of temporary variables }

var a,b,c,d,e,f,g,h,i,j :integer;
        
begin
    a:= b+(c+(d+(e+(f+(g+(h+(i+123456)))))))
end.


program access;

{ Testing following of access-link }

var x : integer;

    procedure c();
    
    var m : integer;
    
        function f(var n : integer): integer;
        
        begin
            n:= m;
            f := m + n
        end;
    
    begin
        m:=3;
        m := f(m);
        write(m+x)
    end;
    
begin
    x:=1;
    c()
end.


program param;

{ Testing sub-program parameter (Dragon book, p. 419) }

    procedure b(function h: integer);
    
    begin
        write(h(2));
        writeln()
    end;
    
    procedure c();
    
    var m : integer;
    
        function f(n : integer): integer;
        
        begin
            f := m + n
        end;
    
    begin
        m := 3;
        b(f)
    end;
    
begin
    c()
end.


Jeppe Buk <buk@imada.sdu.dk>

Last modified: Fri Sep 20 11:48:54 1996