Added sample Triangle programs.
This commit is contained in:
parent
c8ed9462d8
commit
1db90b20a8
47
programs/arrays.tri
Normal file
47
programs/arrays.tri
Normal file
@ -0,0 +1,47 @@
|
||||
let
|
||||
type Vector ~ array 3 of Integer;
|
||||
type Matrix ~ array 3 of Vector;
|
||||
|
||||
proc putvector (v: Vector) ~
|
||||
let var i: Integer
|
||||
in
|
||||
begin
|
||||
put ('['); putint (v[0]);
|
||||
i := 1;
|
||||
while i < 3 do
|
||||
begin
|
||||
put (' '); putint (v[i]);
|
||||
i := i+1
|
||||
end;
|
||||
put (']')
|
||||
end;
|
||||
|
||||
proc putmatrix (m: Matrix) ~
|
||||
let var i: Integer
|
||||
in
|
||||
begin
|
||||
i := 0;
|
||||
while i < 3 do
|
||||
begin
|
||||
putvector (m[i]);
|
||||
puteol ();
|
||||
i := i+1
|
||||
end
|
||||
end;
|
||||
|
||||
func diagonal
|
||||
(m: Matrix): Vector ~
|
||||
[m[0][0], m[1][1], m[2][2]];
|
||||
|
||||
var me: Matrix
|
||||
|
||||
in
|
||||
begin
|
||||
me := [[1,2,3], [4,5,6], [7,8,9]];
|
||||
putmatrix (me); puteol ();
|
||||
putvector (diagonal (me));
|
||||
puteol (); puteol ();
|
||||
me[1] := [10,11,12];
|
||||
me[1][1] := 22;
|
||||
putmatrix (me); puteol ()
|
||||
end
|
86
programs/bank.tri
Normal file
86
programs/bank.tri
Normal file
@ -0,0 +1,86 @@
|
||||
let
|
||||
const max ~ 9999;
|
||||
const invalid ~ 0-1;
|
||||
type Money ~ Integer; ! 0 .. max
|
||||
type Trans ~ Char; ! 'd' | 'w' | 'q'
|
||||
|
||||
func sum (m: Money, n: Money): Money ~
|
||||
let const s ~ m + n
|
||||
in
|
||||
if s <= max then s else invalid;
|
||||
|
||||
func diff (m: Money, n: Money): Money ~
|
||||
let const d ~ m - n
|
||||
in
|
||||
if 0 <= d then d else invalid;
|
||||
|
||||
proc gettrans (var code: Trans,
|
||||
var amount: Money) ~
|
||||
begin
|
||||
get(var code);
|
||||
if code = 'q' then
|
||||
! skip
|
||||
else
|
||||
begin
|
||||
getint(var amount);
|
||||
if (0 > amount) \/ (amount > max) then
|
||||
begin
|
||||
amount := invalid; code := '?'
|
||||
end
|
||||
else if (code \= 'd') /\ (code \= 'w') then
|
||||
code := '?'
|
||||
else
|
||||
! ok
|
||||
end;
|
||||
geteol()
|
||||
end;
|
||||
|
||||
proc processtrans (code: Trans,
|
||||
amount: Money,
|
||||
var balance: Money) ~
|
||||
let
|
||||
var newbalance: Money
|
||||
in
|
||||
begin
|
||||
if code = 'd' then
|
||||
begin
|
||||
put('D'); put('e'); put('p'); put('o'); put('s');
|
||||
put('i'); put('t'); put(' ');
|
||||
putint(amount); puteol();
|
||||
newbalance := sum(balance, amount)
|
||||
end
|
||||
else if code = 'w' then
|
||||
begin
|
||||
put('W'); put('i'); put('t'); put('h'); put('d');
|
||||
put('r'); put('a'); put('w'); put(' ');
|
||||
putint(amount); puteol();
|
||||
newbalance := diff(balance, amount)
|
||||
end
|
||||
else
|
||||
; !skip
|
||||
if (code = '?') \/ (newbalance = invalid) then
|
||||
begin
|
||||
put('I'); put('n'); put('v'); put('a'); put('l');
|
||||
put('i'); put('d'); puteol()
|
||||
end
|
||||
else
|
||||
balance := newbalance;
|
||||
put('B'); put('a'); put('l'); put('a'); put('n');
|
||||
put('c'); put('e'); put(' ');
|
||||
putint(balance); puteol();
|
||||
end;
|
||||
|
||||
var balance: Money;
|
||||
var amount: Money;
|
||||
var trans: Trans
|
||||
|
||||
in
|
||||
begin
|
||||
balance := 0;
|
||||
gettrans(var trans, var amount);
|
||||
while trans \= 'q' do
|
||||
begin
|
||||
processtrans(trans, amount, var balance);
|
||||
gettrans(var trans, var amount)
|
||||
end
|
||||
end
|
26
programs/control.tri
Normal file
26
programs/control.tri
Normal file
@ -0,0 +1,26 @@
|
||||
! Plot a histogram from a stream of nonzero integers.
|
||||
|
||||
let
|
||||
const mark ~ '+';
|
||||
var n : Integer
|
||||
in
|
||||
begin
|
||||
getint (var n); geteol ();
|
||||
while n \= 0 do
|
||||
let
|
||||
var i : Integer;
|
||||
var gap : Integer
|
||||
in
|
||||
begin
|
||||
gap := if n > 0 then 20 else 20 + n;
|
||||
if n < 0 then n := 0 - n else ;
|
||||
i := 0;
|
||||
while i < gap do
|
||||
begin put (' '); i := i + 1 end;
|
||||
i := 0;
|
||||
while i < n do
|
||||
begin put (mark); i := i + 1 end;
|
||||
puteol ();
|
||||
getint (var n); geteol ()
|
||||
end
|
||||
end
|
16
programs/deepnest.tri
Normal file
16
programs/deepnest.tri
Normal file
@ -0,0 +1,16 @@
|
||||
let proc p1 () ~
|
||||
let var c1: Char;
|
||||
proc p2 () ~
|
||||
let proc p3 () ~
|
||||
let proc p4 () ~
|
||||
let proc p5 () ~
|
||||
let proc p6 () ~
|
||||
let proc p7 () ~
|
||||
put (c1)
|
||||
in p7 ()
|
||||
in p6 ()
|
||||
in p5 ()
|
||||
in p4 ()
|
||||
in p3 ()
|
||||
in begin c1 := '+'; p2 () end
|
||||
in p1 ()
|
117
programs/directories.tri
Normal file
117
programs/directories.tri
Normal file
@ -0,0 +1,117 @@
|
||||
let
|
||||
type Name ~ array 6 of Char;
|
||||
type Number ~ Integer;
|
||||
|
||||
proc prompt () ~
|
||||
begin
|
||||
put('N'); put('a'); put('m'); put('e');
|
||||
put('?'); put(' ')
|
||||
end;
|
||||
|
||||
proc getname (var newname: Name) ~
|
||||
let var i: Integer
|
||||
in
|
||||
begin
|
||||
i := 0;
|
||||
while i < 6 do
|
||||
begin
|
||||
if eol () then
|
||||
newname[i] := ' '
|
||||
else
|
||||
get (var newname[i]);
|
||||
i := i+1
|
||||
end
|
||||
end;
|
||||
|
||||
proc putname (newname: Name) ~
|
||||
let var i: Integer
|
||||
in
|
||||
begin
|
||||
i := 0;
|
||||
while i < 6 do
|
||||
begin
|
||||
put (newname[i]);
|
||||
i := i+1
|
||||
end
|
||||
end;
|
||||
|
||||
type Entry ~ record
|
||||
number: Number,
|
||||
name: Name
|
||||
end;
|
||||
type Directory ~ record
|
||||
size: Integer,
|
||||
entry: array 100 of Entry
|
||||
end;
|
||||
|
||||
proc initialize (var dir: Directory) ~
|
||||
dir.size := 0;
|
||||
|
||||
proc add (var dir: Directory,
|
||||
newname: Name,
|
||||
newnumber: Number) ~
|
||||
begin
|
||||
dir.entry[dir.size] :=
|
||||
{number ~ newnumber, name ~ newname};
|
||||
dir.size := dir.size + 1
|
||||
end;
|
||||
|
||||
proc lookup (var dir: Directory,
|
||||
oldname: Name,
|
||||
var oldnumber: Number,
|
||||
var found: Boolean) ~
|
||||
let
|
||||
var i: Integer;
|
||||
var searching: Boolean
|
||||
in
|
||||
begin
|
||||
i := 0; searching := true;
|
||||
while (i < dir.size) /\ searching do
|
||||
if dir.entry[i].name = oldname then
|
||||
searching := false
|
||||
else
|
||||
i := i+1;
|
||||
found := \searching;
|
||||
if found then
|
||||
oldnumber := dir.entry[i].number
|
||||
else !skip
|
||||
end;
|
||||
|
||||
var mydir: Directory
|
||||
|
||||
in
|
||||
|
||||
begin
|
||||
initialize (var mydir);
|
||||
add (var mydir,
|
||||
['D','a','v','i','d',' '], 6041);
|
||||
add (var mydir,
|
||||
['M','u','f','f','y',' '], 4969);
|
||||
add (var mydir,
|
||||
['K','i','e','r','a','n'], 6042);
|
||||
add (var mydir,
|
||||
['A','l','e','x','a',' '], 5322);
|
||||
|
||||
let
|
||||
const blank ~ [' ', ' ', ' ', ' ', ' ', ' '];
|
||||
var name: Name;
|
||||
var num: Number;
|
||||
var ok: Boolean
|
||||
in
|
||||
begin
|
||||
prompt ();
|
||||
getname (var name); geteol ();
|
||||
while name \= blank do
|
||||
begin
|
||||
putname (name); put (' ');
|
||||
lookup (var mydir, name, var num, var ok);
|
||||
if ok then
|
||||
putint (num)
|
||||
else
|
||||
put ('?');
|
||||
puteol ();
|
||||
prompt ();
|
||||
getname (var name); geteol ()
|
||||
end
|
||||
end
|
||||
end
|
30
programs/errors.tri
Normal file
30
programs/errors.tri
Normal file
@ -0,0 +1,30 @@
|
||||
! Program with a variety of contextual errors.
|
||||
|
||||
let
|
||||
type String ~ array 4 of Char;
|
||||
type Name ~ array 3 of String;
|
||||
type Rec ~ record x: Integer, x: Integer end;
|
||||
|
||||
var me: Name;
|
||||
var silly : maxint;
|
||||
var silly: Rec;
|
||||
|
||||
proc putstr (s: String) ~
|
||||
let var i: Integer
|
||||
in
|
||||
begin
|
||||
s[4] := ' ';
|
||||
i := 0;
|
||||
while i do
|
||||
begin i := i+true;
|
||||
put (s[\i])
|
||||
end
|
||||
end
|
||||
|
||||
in
|
||||
begin
|
||||
me[true] := ['T','i','n','y'];
|
||||
me[2][2] := 0;
|
||||
put (me[1]); put (4); put ();
|
||||
putstr (initials (me)); puteol ()
|
||||
end
|
148
programs/every.tri
Normal file
148
programs/every.tri
Normal file
@ -0,0 +1,148 @@
|
||||
! Marry a woman and man.
|
||||
! Input following data for each person (woman then man):
|
||||
! surname, forename (each up to 10 non-blank chars),
|
||||
! sex ('M'|'F'), marital status ('m'|'u'),
|
||||
! day, month, year of birth.
|
||||
|
||||
let
|
||||
type Month ~ Integer;
|
||||
const Jan ~ 1; const Feb ~ 2; const Mar ~ 3;
|
||||
const Apr ~ 4; const May ~ 5; const Jun ~ 6;
|
||||
const Jul ~ 7; const Aug ~ 8; const Sep ~ 9;
|
||||
const Oct ~ 10; const Nov ~ 11; const Dec ~ 12;
|
||||
|
||||
type Date ~ record
|
||||
y : Integer,
|
||||
m : Month,
|
||||
d : Integer
|
||||
end;
|
||||
const today ~ {y ~ 1993, m ~ Apr, d ~ 1};
|
||||
|
||||
proc getdate (var date : Date) ~
|
||||
begin
|
||||
getint (var date.d); getint (var date.m); getint (var date.y)
|
||||
end;
|
||||
|
||||
proc putdate (date : Date) ~
|
||||
begin
|
||||
putint (date.d); put ('/');
|
||||
putint (date.m); put ('/');
|
||||
putint (date.y // 100)
|
||||
end;
|
||||
|
||||
func yearsbefore (yrs : Integer, date : Date) : Date ~
|
||||
{y ~ date.y - yrs, m ~ date.m, d ~ date.d};
|
||||
|
||||
func earlier (date1 : Date, date2 : Date) : Boolean ~
|
||||
if date1.y < date2.y then true
|
||||
else if date1.y > date2.y then false
|
||||
else if date1.m < date2.m then true
|
||||
else if date1.m > date2.m then false
|
||||
else date1.d < date2.d;
|
||||
|
||||
const maxname ~ 10;
|
||||
type Name ~ array 10 of Char;
|
||||
|
||||
proc getname (var name : Name) ~
|
||||
let
|
||||
var ch : Char;
|
||||
var length : Integer
|
||||
in
|
||||
begin
|
||||
get (var ch); while ch = ' ' do get (var ch);
|
||||
length := 0;
|
||||
while length < maxname do
|
||||
begin
|
||||
length := length + 1; name[length] := ch;
|
||||
if ch \= ' ' then get (var ch) else ! skip
|
||||
end
|
||||
end;
|
||||
|
||||
proc putname (name : Name) ~
|
||||
let
|
||||
var pad : Boolean;
|
||||
var length : Integer
|
||||
in
|
||||
begin
|
||||
pad := false; length := 0;
|
||||
while (\ pad) /\ (length < maxname) do
|
||||
begin
|
||||
length := length + 1;
|
||||
if name[length] = ' ' then
|
||||
pad := true
|
||||
else
|
||||
put (name[length])
|
||||
end
|
||||
end;
|
||||
|
||||
type Person ~ record
|
||||
surname : Name,
|
||||
forename : Name,
|
||||
male : Boolean,
|
||||
married : Boolean,
|
||||
dob : Date
|
||||
end;
|
||||
|
||||
proc getperson (var person : Person) ~
|
||||
let
|
||||
var fore : Name;
|
||||
var sur : Name;
|
||||
var s : Char;
|
||||
var m : Char;
|
||||
var birth : Date
|
||||
in
|
||||
begin
|
||||
getname (var sur); getname (var fore);
|
||||
get (var s); while s = ' ' do get (var s);
|
||||
get (var m); while m = ' ' do get (var m);
|
||||
getdate (var birth);
|
||||
person := {surname ~ sur, forename ~ fore,
|
||||
male ~ (s = 'M'), married ~ (m = 'm'),
|
||||
dob ~ birth}
|
||||
end;
|
||||
|
||||
proc putperson (person : Person) ~
|
||||
begin
|
||||
putname (person.surname); put (' ');
|
||||
putname (person.forename); put (' ');
|
||||
put (if person.male then 'M' else 'F'); put (' ');
|
||||
put (if person.married then 'm' else 'u'); put (' ');
|
||||
putdate (person.dob)
|
||||
end;
|
||||
|
||||
func age (person : Person) : Integer ~
|
||||
let
|
||||
const dob ~ person.dob
|
||||
in
|
||||
if (today.m > dob.m) \/
|
||||
((today.m = dob.m) /\ (today.d >= dob.d))
|
||||
then today.y - dob.y
|
||||
else today.y - dob.y - 1;
|
||||
|
||||
const latestdob ~ yearsbefore (16, today);
|
||||
|
||||
var bride : Person;
|
||||
var groom : Person
|
||||
|
||||
in
|
||||
begin
|
||||
getperson (var bride);
|
||||
getperson (var groom);
|
||||
puteol ();
|
||||
if \ bride.male /\ groom.male /\
|
||||
\ (bride.married \/ groom.married) /\
|
||||
\ earlier (latestdob, bride.dob) /\
|
||||
\ earlier (latestdob, groom.dob) then
|
||||
begin
|
||||
put ('O'); put ('K'); puteol ();
|
||||
bride.married := true; groom.married := true;
|
||||
bride.surname := groom.surname
|
||||
end
|
||||
else
|
||||
begin
|
||||
put ('N'); put ('o'); put ('!'); puteol ()
|
||||
end;
|
||||
putperson (bride); put (' '); putint (age (bride)); puteol ();
|
||||
putperson (groom); put (' '); putint (age (groom)); puteol ();
|
||||
putdate (today); puteol ()
|
||||
end
|
15
programs/factorials.tri
Normal file
15
programs/factorials.tri
Normal file
@ -0,0 +1,15 @@
|
||||
let
|
||||
func factorial (n: Integer): Integer ~
|
||||
if n <= 1
|
||||
then 1
|
||||
else n * factorial (n-1);
|
||||
|
||||
var i: Integer
|
||||
|
||||
in
|
||||
begin
|
||||
getint (var i);
|
||||
putint (i); put ('!');
|
||||
put (' '); put ('='); put (' ');
|
||||
putint (factorial (i))
|
||||
end
|
28
programs/functions.tri
Normal file
28
programs/functions.tri
Normal file
@ -0,0 +1,28 @@
|
||||
! Print powers of integers.
|
||||
|
||||
let
|
||||
func even (n : Integer) : Boolean ~
|
||||
(n // 2) = 0;
|
||||
|
||||
func sqr (n : Integer) : Integer ~
|
||||
n * n;
|
||||
|
||||
func power (b : Integer, n : Integer) : Integer ~
|
||||
! assume n >= 0
|
||||
if n = 0
|
||||
then 1
|
||||
else
|
||||
if even (n)
|
||||
then sqr (power (b, n/2))
|
||||
else sqr (power (b, n/2)) * b;
|
||||
|
||||
var x : Integer;
|
||||
var m : Integer
|
||||
in
|
||||
begin
|
||||
getint (var x); getint (var m);
|
||||
putint (x); put ('^'); putint (m);
|
||||
put (' '); put ('='); put (' ');
|
||||
putint (power (x, m));
|
||||
puteol ()
|
||||
end
|
3
programs/hi.tri
Normal file
3
programs/hi.tri
Normal file
@ -0,0 +1,3 @@
|
||||
begin
|
||||
put('H'); put('i'); put('!')
|
||||
end
|
53
programs/hullo.tri
Normal file
53
programs/hullo.tri
Normal file
@ -0,0 +1,53 @@
|
||||
let
|
||||
const maxlength ~ 15;
|
||||
type String ~ array 16 of Char;
|
||||
const null ~ chr(0);
|
||||
!Strings will be padded with nulls.
|
||||
|
||||
proc getstring (var s: String) ~
|
||||
let var l: Integer
|
||||
in
|
||||
begin
|
||||
l := 0;
|
||||
while l < maxlength do
|
||||
begin
|
||||
if eol () then
|
||||
s[l] := null
|
||||
else
|
||||
get (var s[l]);
|
||||
l := l+1;
|
||||
end;
|
||||
s[maxlength] := null
|
||||
end;
|
||||
|
||||
proc putstring (s: String) ~
|
||||
let var i: Integer
|
||||
in
|
||||
begin
|
||||
i := 0;
|
||||
while s[i] \= null do
|
||||
begin
|
||||
put (s[i]);
|
||||
i := i+1
|
||||
end
|
||||
end;
|
||||
|
||||
var you: String
|
||||
|
||||
in
|
||||
begin
|
||||
putstring (
|
||||
['W','h','o',' ',
|
||||
'a','r','e',' ',
|
||||
'y','o','u','?',
|
||||
null,null,null,null]);
|
||||
puteol ();
|
||||
getstring (var you); geteol ();
|
||||
putstring (
|
||||
['H','u','l','l',
|
||||
'o',',',' ',null,
|
||||
null,null,null,null,
|
||||
null,null,null,null]);
|
||||
putstring (you); put ('!');
|
||||
puteol ()
|
||||
end
|
52
programs/names.tri
Normal file
52
programs/names.tri
Normal file
@ -0,0 +1,52 @@
|
||||
let
|
||||
type Name ~ array 6 of Char;
|
||||
type Number ~ Integer;
|
||||
|
||||
proc getname (var newname: Name) ~
|
||||
let var i: Integer
|
||||
in
|
||||
begin
|
||||
i := 0;
|
||||
while i < 6 do
|
||||
begin
|
||||
if eol () then
|
||||
newname[i] := ' '
|
||||
else
|
||||
get (var newname[i]);
|
||||
i := i+1
|
||||
end
|
||||
end;
|
||||
|
||||
proc putname (newname: Name) ~
|
||||
let var i: Integer
|
||||
in
|
||||
begin
|
||||
i := 0;
|
||||
while i < 6 do
|
||||
begin
|
||||
put (newname[i]);
|
||||
i := i+1
|
||||
end
|
||||
end;
|
||||
|
||||
func samename (name1: Name, name2: Name) : Boolean ~
|
||||
let
|
||||
func same (n: Integer) : Boolean ~
|
||||
(name1[n] = name2[n]) /\
|
||||
(if n = 0 then true else same (n-1))
|
||||
in
|
||||
same (5);
|
||||
|
||||
var nam: Name
|
||||
|
||||
in
|
||||
|
||||
begin
|
||||
getname (var nam); geteol ();
|
||||
putname (nam); put (' ');
|
||||
if samename (nam, ['D','a','v','i','d',' ']) then
|
||||
put ('Y')
|
||||
else
|
||||
put ('N');
|
||||
puteol ()
|
||||
end
|
31
programs/nesting.tri
Normal file
31
programs/nesting.tri
Normal file
@ -0,0 +1,31 @@
|
||||
let
|
||||
var g: Integer;
|
||||
|
||||
proc P() ~
|
||||
let
|
||||
var p: Integer;
|
||||
|
||||
proc Q() ~
|
||||
let
|
||||
var q: Integer;
|
||||
proc R() ~
|
||||
let
|
||||
var r: Integer
|
||||
in
|
||||
r := (g+p+q) * 1000 ! should cause overflow
|
||||
in
|
||||
begin q := g+p; R() end;
|
||||
|
||||
proc S() ~
|
||||
let
|
||||
var s: Integer
|
||||
in
|
||||
begin s := g+p+1; Q() end
|
||||
|
||||
in
|
||||
begin p := g+1; S() end
|
||||
|
||||
in
|
||||
begin g := 1000; P() end
|
||||
|
||||
|
56
programs/procedural.tri
Normal file
56
programs/procedural.tri
Normal file
@ -0,0 +1,56 @@
|
||||
! test program proc.Æ
|
||||
let
|
||||
const size ~ 6;
|
||||
type String ~ array 6 of Char;
|
||||
|
||||
proc putstr (s: String) ~
|
||||
let var i: Integer
|
||||
in
|
||||
begin
|
||||
i := 0;
|
||||
while i < size do
|
||||
begin put (s[i]); i := i+1 end
|
||||
end;
|
||||
|
||||
proc apply (proc p (var c : Char), var s : String) ~
|
||||
let
|
||||
var i : Integer
|
||||
in
|
||||
begin
|
||||
i := 0;
|
||||
while i < size do
|
||||
begin
|
||||
p (var s[i]);
|
||||
i := i+1
|
||||
end
|
||||
end; !apply
|
||||
|
||||
proc shift (var l : Char) ~
|
||||
let const ordl ~ ord (l)
|
||||
in
|
||||
if (ord('a') <= ordl)
|
||||
/\ (ordl <= ord('z')) then
|
||||
l := chr (ordl - ord('a') + ord('A'))
|
||||
else
|
||||
; !skip
|
||||
|
||||
proc replaceall (old: Char, new: Char,
|
||||
var s: String) ~
|
||||
let
|
||||
proc zap (var c: Char) ~
|
||||
if c = old then c := new else !skip
|
||||
in
|
||||
apply (proc zap, var s);
|
||||
|
||||
var name : String
|
||||
|
||||
in
|
||||
begin
|
||||
apply (proc get, var name);
|
||||
geteol ();
|
||||
putstr (name); puteol ();
|
||||
apply (proc shift, var name);
|
||||
putstr (name); puteol ();
|
||||
replaceall ('I', 'i', var name);
|
||||
putstr (name); puteol ()
|
||||
end
|
31
programs/procedures.tri
Normal file
31
programs/procedures.tri
Normal file
@ -0,0 +1,31 @@
|
||||
! Plot a histogram from a stream of nonzero integers.
|
||||
|
||||
let
|
||||
const mid ~ 40;
|
||||
var n : Integer;
|
||||
|
||||
proc putmany (c : Char, n : Integer) ~
|
||||
let
|
||||
var i : Integer
|
||||
in
|
||||
begin
|
||||
i := 0;
|
||||
while i < n do
|
||||
begin put (c); i := i + 1 end
|
||||
end;
|
||||
|
||||
proc makenonnegative (var n : Integer) ~
|
||||
if n < 0 then n := 0 - n else
|
||||
|
||||
in
|
||||
begin
|
||||
getint (var n); geteol ();
|
||||
while n \= 0 do
|
||||
begin
|
||||
putmany (' ', if n > 0 then mid else mid + n);
|
||||
makenonnegative (var n);
|
||||
putmany ('+', n);
|
||||
puteol ();
|
||||
getint (var n); geteol ()
|
||||
end
|
||||
end
|
24
programs/records.tri
Normal file
24
programs/records.tri
Normal file
@ -0,0 +1,24 @@
|
||||
! test program record.Æ
|
||||
let
|
||||
type Month ~ array 3 of Char;
|
||||
type Date ~ record d: Integer, m: Month end;
|
||||
const xmas ~ {d ~ 25,
|
||||
m ~ ['D','e','c']};
|
||||
var eve: Date;
|
||||
|
||||
proc putmonth (mth: Month) ~
|
||||
begin
|
||||
put (mth[0]); put (mth[1]); put (mth[2])
|
||||
end;
|
||||
|
||||
proc putdate (date: Date) ~
|
||||
begin
|
||||
putint (date.d); put ('/'); putmonth (date.m)
|
||||
end
|
||||
|
||||
in
|
||||
begin
|
||||
putdate (xmas); puteol ();
|
||||
eve := {d ~ xmas.d-1, m ~ xmas.m};
|
||||
putdate (eve); puteol ()
|
||||
end
|
13
programs/repl.tri
Normal file
13
programs/repl.tri
Normal file
@ -0,0 +1,13 @@
|
||||
let
|
||||
type Str ~ array 10 of Char;
|
||||
|
||||
func replicate (c: Char): Str ~
|
||||
[c,c,c,c,c,c,c,c,c,c];
|
||||
|
||||
var s: Str
|
||||
in
|
||||
|
||||
begin
|
||||
s := replicate('*');
|
||||
put (s[0]); put(s[9]); puteol()
|
||||
end
|
32
programs/triangle.tri
Normal file
32
programs/triangle.tri
Normal file
@ -0,0 +1,32 @@
|
||||
let
|
||||
|
||||
proc putmany (n: Integer, c: Char) ~
|
||||
let
|
||||
var i: Integer
|
||||
in
|
||||
begin
|
||||
i := 0;
|
||||
while i < n do
|
||||
begin i := i+1; put (c) end
|
||||
end;
|
||||
|
||||
var n: Integer; var r: Integer;
|
||||
const mark ~ '@'
|
||||
|
||||
in
|
||||
begin
|
||||
getint (var n); geteol ();
|
||||
r := 0;
|
||||
while r < (n-1) do
|
||||
begin
|
||||
r := r + 1;
|
||||
putmany (n-r, ' '); put (mark);
|
||||
if r >= 2 then
|
||||
begin
|
||||
putmany (2*r - 3, ' '); put (mark)
|
||||
end
|
||||
else; !skip
|
||||
puteol ()
|
||||
end;
|
||||
putmany (2*n - 1, mark)
|
||||
end
|
Reference in New Issue
Block a user