Added example programs.
This commit is contained in:
parent
d2c505ad6b
commit
681e2e0432
7
examples/.distr
Normal file
7
examples/.distr
Normal file
|
@ -0,0 +1,7 @@
|
|||
hilo.b
|
||||
hilo.c
|
||||
hilo.mod
|
||||
hilo.ocm
|
||||
hilo.p
|
||||
paranoia.c
|
||||
README
|
26
examples/README
Normal file
26
examples/README
Normal file
|
@ -0,0 +1,26 @@
|
|||
# $Source$
|
||||
# $State$
|
||||
# $Revision$
|
||||
|
||||
A few notes on the examples
|
||||
---------------------------
|
||||
|
||||
This directory contains a handful of working example programs that can be
|
||||
built with the ACK. They're intended as a convention source of test code
|
||||
and as a starting point when writing your own programs.
|
||||
|
||||
They consist of:
|
||||
|
||||
hilo.c ANSI C version of the Hi/Lo game
|
||||
hilo.b Basic version of the Hi/Lo game
|
||||
hilo.mod Modula-2 version of the Hi/Lo game
|
||||
hilo.ocm Occam 1 version of the Hi/Lo game
|
||||
hilo.p Pascal version of the Hi/Lo game
|
||||
|
||||
paranoia.c An ancient public domain K&R C adventure game
|
||||
|
||||
Enjoy.
|
||||
|
||||
David Given
|
||||
dg@cowlark.com
|
||||
2007-02-25
|
39
examples/hilo.b
Normal file
39
examples/hilo.b
Normal file
|
@ -0,0 +1,39 @@
|
|||
1 ' $Source$
|
||||
2 ' $State$
|
||||
3 ' $Revision$
|
||||
|
||||
10 print "Hi there! Before we start, what is your name?"
|
||||
20 input "> ", PlayerName$
|
||||
30 print
|
||||
40 print "Hello, "; PlayerName$; "!"
|
||||
|
||||
100 gosub 1000
|
||||
110 print
|
||||
120 print "Would you like another go?"
|
||||
130 input "> ", s$
|
||||
140 s$ = left$(s$, 1)
|
||||
150 if s$ = "n" or s$ = "N" then goto 200
|
||||
160 print
|
||||
170 print "Excellent! ";
|
||||
180 goto 100
|
||||
200 print
|
||||
210 print "Thanks for playing --- goodbye!"
|
||||
220 end
|
||||
|
||||
1000 print "See if you can guess my number."
|
||||
1010 Number% = rnd(1) mod 100
|
||||
1020 Attempts% = 1
|
||||
|
||||
1030 print
|
||||
1040 input "> ", guess%
|
||||
1050 if guess% < Number% then print: print "Try a bit higher."
|
||||
1060 if guess% > Number% then print: print "Try a bit lower."
|
||||
1070 if guess% = Number% then goto 1100
|
||||
1080 Attempts% = Attempts% + 1
|
||||
1090 goto 1030
|
||||
1100 print
|
||||
1110 print "You got it right in only"; Attempts%;
|
||||
1120 if Attempts% = 1 then print "go"; else print "goes";
|
||||
1130 print "!"
|
||||
1140 return
|
||||
|
83
examples/hilo.c
Normal file
83
examples/hilo.c
Normal file
|
@ -0,0 +1,83 @@
|
|||
/* $Source$
|
||||
* $State$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
char buffer[32];
|
||||
char PlayerName[32];
|
||||
|
||||
int Number;
|
||||
int Attempts;
|
||||
|
||||
void reads(void)
|
||||
{
|
||||
char* p;
|
||||
|
||||
printf("> ");
|
||||
fflush(stdout);
|
||||
|
||||
fgets(buffer, sizeof(buffer), stdin);
|
||||
|
||||
p = strchr(buffer, '\n');
|
||||
if (p != NULL)
|
||||
*p = '\0';
|
||||
}
|
||||
|
||||
void game(void)
|
||||
{
|
||||
printf("See if you can guess my number.\n");
|
||||
|
||||
Number = rand() % 100;
|
||||
Attempts = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
int guess;
|
||||
|
||||
printf("\n");
|
||||
reads();
|
||||
guess = atoi(buffer);
|
||||
|
||||
if (guess == Number)
|
||||
{
|
||||
printf("\nYou got it right in only %d %s!\n", Attempts,
|
||||
(Attempts == 1) ? "go" : "goes");
|
||||
return;
|
||||
}
|
||||
|
||||
if (guess < Number)
|
||||
printf("\nTry a bit higher.\n");
|
||||
if (guess > Number)
|
||||
printf("\nTry a bit lower.\n");
|
||||
Attempts++;
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
printf("\nHi there! Before we start, what is your name?\n");
|
||||
reads();
|
||||
strcpy(PlayerName, buffer);
|
||||
printf("\nHello, %s! ", PlayerName);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
game();
|
||||
printf("\nWould you like another go?\n");
|
||||
reads();
|
||||
|
||||
if ((buffer[0] == 'n') || (buffer[0] == 'N'))
|
||||
{
|
||||
printf("\nThanks for playing --- goodbye!\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
printf("\nExcellent! ");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
95
examples/hilo.mod
Normal file
95
examples/hilo.mod
Normal file
|
@ -0,0 +1,95 @@
|
|||
(* $Source$
|
||||
* $State$
|
||||
* $Revision$
|
||||
*)
|
||||
|
||||
MODULE HiLo;
|
||||
FROM InOut IMPORT WriteInt, WriteLn, WriteString, ReadString, ReadInt;
|
||||
FROM random IMPORT Uniform;
|
||||
|
||||
VAR
|
||||
buffer : ARRAY [0..32] OF CHAR;
|
||||
|
||||
PROCEDURE reads;
|
||||
BEGIN
|
||||
WriteString("> ");
|
||||
ReadString(buffer);
|
||||
END reads;
|
||||
|
||||
PROCEDURE game;
|
||||
VAR
|
||||
Number : INTEGER;
|
||||
Attempts : INTEGER;
|
||||
guess : INTEGER;
|
||||
finished : BOOLEAN;
|
||||
BEGIN
|
||||
WriteString("See if you can guess my number.");
|
||||
WriteLn;
|
||||
|
||||
Number := Uniform(0, 99);
|
||||
Attempts := 1;
|
||||
finished := FALSE;
|
||||
|
||||
WHILE NOT finished DO
|
||||
WriteLn;
|
||||
WriteString("> ");
|
||||
ReadInt(guess);
|
||||
|
||||
IF guess = Number THEN
|
||||
WriteLn;
|
||||
WriteString("You got it right in only ");
|
||||
WriteInt(Attempts, 0);
|
||||
WriteString(" ");
|
||||
IF Attempts = 1 THEN
|
||||
WriteString("go");
|
||||
ELSE
|
||||
WriteString("goes");
|
||||
END;
|
||||
WriteString("!");
|
||||
WriteLn;
|
||||
finished := TRUE;
|
||||
ELSIF guess < Number THEN
|
||||
WriteLn;
|
||||
WriteString("Try a bit higher.");
|
||||
WriteLn;
|
||||
ELSIF guess > Number THEN
|
||||
WriteLn;
|
||||
WriteString("Try a bit lower.");
|
||||
WriteLn;
|
||||
END;
|
||||
|
||||
Attempts := Attempts + 1;
|
||||
END;
|
||||
END game;
|
||||
|
||||
VAR
|
||||
finished : BOOLEAN;
|
||||
BEGIN
|
||||
WriteLn;
|
||||
WriteString("Hi there! Before we start, what is your name?");
|
||||
WriteLn;
|
||||
reads;
|
||||
WriteLn;
|
||||
WriteString("Hello, ");
|
||||
WriteString(buffer);
|
||||
WriteString("! ");
|
||||
|
||||
finished := FALSE;
|
||||
WHILE NOT finished DO
|
||||
game;
|
||||
WriteLn;
|
||||
WriteString("Would you like another go?");
|
||||
WriteLn;
|
||||
reads;
|
||||
|
||||
IF (buffer[0] = 'n') OR (buffer[0] = 'N') THEN
|
||||
finished := TRUE;
|
||||
WriteLn;
|
||||
WriteString("Thanks for playing --- goodbye!");
|
||||
WriteLn;
|
||||
ELSE
|
||||
WriteLn;
|
||||
WriteString("Excellent! ");
|
||||
END;
|
||||
END;
|
||||
END HiLo.
|
131
examples/hilo.ocm
Normal file
131
examples/hilo.ocm
Normal file
|
@ -0,0 +1,131 @@
|
|||
#
|
||||
-- $Source$
|
||||
-- $State$
|
||||
-- $Revision$
|
||||
|
||||
#include "dec.ocm"
|
||||
|
||||
-- General utilities: read and write strings.
|
||||
|
||||
proc puts(value s[]) =
|
||||
seq i = [1 for s[byte 0]]
|
||||
output ! s[byte i]
|
||||
:
|
||||
|
||||
proc gets(var s[]) =
|
||||
var length, finished, c:
|
||||
seq
|
||||
finished := false
|
||||
length := 0
|
||||
|
||||
while not finished
|
||||
seq
|
||||
input ? c
|
||||
if
|
||||
c = 10
|
||||
finished := true
|
||||
true
|
||||
seq
|
||||
length := length + 1
|
||||
s[byte length] := c
|
||||
|
||||
s[byte 0] := length
|
||||
:
|
||||
|
||||
-- Our random number generator.
|
||||
|
||||
var seed:
|
||||
proc randomise(value s) =
|
||||
seq
|
||||
seed := s
|
||||
:
|
||||
|
||||
proc random(value range, var result) =
|
||||
seq
|
||||
seed := (20077 * seed) + 12345
|
||||
if
|
||||
seed < 0
|
||||
seed := -seed
|
||||
true
|
||||
skip
|
||||
result := seed \ range
|
||||
:
|
||||
|
||||
-- Does the reading-in-the-name thing.
|
||||
|
||||
proc getname =
|
||||
var seed, buffer[128]:
|
||||
seq
|
||||
puts("*nHi there! Before we start, what is your name?*n")
|
||||
puts("> ")
|
||||
gets(buffer)
|
||||
|
||||
seed := 0
|
||||
seq i = [1 for buffer[byte 0]]
|
||||
seed := seed + buffer[byte i]
|
||||
randomise(seed)
|
||||
|
||||
puts("*nHello, ")
|
||||
puts(buffer)
|
||||
puts("! ")
|
||||
:
|
||||
|
||||
-- Plays a single game.
|
||||
|
||||
proc game =
|
||||
var Number, Attempts, finished, guess:
|
||||
seq
|
||||
puts("See if you can guess my number.*n")
|
||||
random(100, Number)
|
||||
Attempts := 1
|
||||
finished := false
|
||||
while not finished
|
||||
seq
|
||||
puts("*n> ")
|
||||
var c:
|
||||
seq
|
||||
c := '*s'
|
||||
decin(input, guess, c)
|
||||
|
||||
if
|
||||
guess = Number
|
||||
seq
|
||||
puts("*nYou got it right in only ")
|
||||
decout(output, Attempts, 0)
|
||||
puts(" ")
|
||||
if
|
||||
Attempts = 1
|
||||
puts("go")
|
||||
true
|
||||
puts("goes")
|
||||
puts("!*n")
|
||||
finished := true
|
||||
|
||||
guess < Number
|
||||
puts("*nTry a bit higher.*n")
|
||||
guess > Number
|
||||
puts("*nTry a bit lower.*n")
|
||||
Attempts := Attempts + 1
|
||||
:
|
||||
|
||||
var finished, buffer[128]:
|
||||
seq
|
||||
output ! TEXT
|
||||
getname
|
||||
|
||||
finished := false
|
||||
while not finished
|
||||
seq
|
||||
game
|
||||
|
||||
puts("*nWould you like another go?*n")
|
||||
puts("> ")
|
||||
gets(buffer)
|
||||
if
|
||||
(buffer[byte 1] = 'n') or (buffer[byte 1] = 'N')
|
||||
seq
|
||||
finished := true
|
||||
puts("*nThanks for playing --- goodbye!*n")
|
||||
true
|
||||
puts("*nExcellent! ")
|
||||
|
167
examples/hilo.p
Normal file
167
examples/hilo.p
Normal file
|
@ -0,0 +1,167 @@
|
|||
(* $Source$
|
||||
* $State$
|
||||
* $Revision$
|
||||
*)
|
||||
|
||||
(*$U+ --- enables underscores in identifiers *)
|
||||
|
||||
program hilo(input, output);
|
||||
|
||||
type
|
||||
string = array [0..255] of char;
|
||||
|
||||
var
|
||||
playing : Boolean;
|
||||
seed : integer;
|
||||
|
||||
{ This version of Pascal seems to have no random number generator I can find,
|
||||
so we have to implement our own here. This is a hacked up and probably
|
||||
broken version of the C library generator. }
|
||||
|
||||
procedure randomise(s : integer);
|
||||
begin
|
||||
seed := s;
|
||||
end;
|
||||
|
||||
function random(range : integer) : integer;
|
||||
begin
|
||||
seed := (20077 * seed + 12345);
|
||||
random := seed mod range;
|
||||
end;
|
||||
|
||||
{ Pascal doesn't provide string input, so we interface to the _read() syscall
|
||||
and do it manually. }
|
||||
|
||||
function _read(fd : integer; var buffer : char; count : integer) : integer;
|
||||
extern;
|
||||
|
||||
function readchar : char;
|
||||
var
|
||||
c : char;
|
||||
dummy : integer;
|
||||
|
||||
begin
|
||||
c := chr(0);
|
||||
dummy := _read(0, c, 1);
|
||||
readchar := c;
|
||||
end;
|
||||
|
||||
procedure readstring(var buffer : string; var length : integer);
|
||||
var
|
||||
finished : Boolean;
|
||||
c : char;
|
||||
|
||||
begin
|
||||
write('> ');
|
||||
|
||||
length := 0;
|
||||
finished := FALSE;
|
||||
seed := 0;
|
||||
while not finished do
|
||||
begin
|
||||
c := readchar;
|
||||
if (ord(c) = 10) then
|
||||
finished := true
|
||||
else
|
||||
begin
|
||||
buffer[length] := c;
|
||||
length := length + 1;
|
||||
end
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure getname;
|
||||
var
|
||||
name : string;
|
||||
namelen : integer;
|
||||
i : integer;
|
||||
seed : integer;
|
||||
|
||||
begin
|
||||
writeln;
|
||||
writeln('Hi there! Before we start, what is your name?');
|
||||
writeln;
|
||||
readstring(name, namelen);
|
||||
writeln;
|
||||
write('Hello, ');
|
||||
|
||||
seed := 0;
|
||||
for i := 0 to (namelen-1) do
|
||||
begin
|
||||
write(name[i]);
|
||||
seed := seed + ord(name[i]);
|
||||
end;
|
||||
|
||||
randomise(seed);
|
||||
write('! ');
|
||||
end;
|
||||
|
||||
procedure game;
|
||||
var
|
||||
Number : integer;
|
||||
Attempts : integer;
|
||||
guess : integer;
|
||||
|
||||
begin
|
||||
writeln('See if you can guess my number.');
|
||||
Number := random(100);
|
||||
Attempts := 0;
|
||||
|
||||
guess := -1;
|
||||
while guess <> Number do
|
||||
begin
|
||||
Attempts := Attempts + 1;
|
||||
write('> ');
|
||||
readln(guess);
|
||||
|
||||
if guess < Number then
|
||||
begin
|
||||
writeln;
|
||||
writeln('Try a bit higher.');
|
||||
end;
|
||||
|
||||
if guess > Number then
|
||||
begin
|
||||
writeln;
|
||||
writeln('Try a bit lower.');
|
||||
end;
|
||||
end;
|
||||
|
||||
writeln;
|
||||
write('You got it right in only ', Attempts:0, ' ');
|
||||
if Attempts = 1 then
|
||||
write('go')
|
||||
else
|
||||
write('goes');
|
||||
writeln('!');
|
||||
end;
|
||||
|
||||
function question: Boolean;
|
||||
var
|
||||
response: char;
|
||||
|
||||
begin
|
||||
write('> ');
|
||||
readln(response);
|
||||
|
||||
question := not ((response = 'n') or (response = 'N'));
|
||||
end;
|
||||
|
||||
begin
|
||||
getname;
|
||||
|
||||
playing := TRUE;
|
||||
while playing do
|
||||
begin
|
||||
game;
|
||||
writeln;
|
||||
writeln('Would you like another go?');
|
||||
playing := question;
|
||||
|
||||
writeln;
|
||||
if playing then
|
||||
write('Excellent! ')
|
||||
else
|
||||
writeln('Thanks for playing --- goodbye!');
|
||||
end;
|
||||
end.
|
1047
examples/paranoia.c
Normal file
1047
examples/paranoia.c
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue