{*************************************************************

               Le CyberZo‹de Qui Fr‚tille

  http://www.multimania.com/cyberzoide/info/turbo/turbo.htm
               cyberzoide@multimania.com

***************************************************************}

program tp4;

uses crt;

type tableau=array[1..50] of string;

procedure init(var tabmots:tableau; var nbmots:integer);
begin
tabmots[1]:='PROGRAM';
tabmots[2]:='UNIT';
tabmots[3]:='INTERFACE';
tabmots[4]:='USES';
tabmots[5]:='CONST';
tabmots[6]:='TYPE';
tabmots[7]:='RECORD';
tabmots[8]:='ARRAY';
tabmots[9]:='PACKED';
tabmots[10]:='STRING';
tabmots[11]:='FILE';
tabmots[12]:='SET';
tabmots[13]:='OBJECT';
tabmots[14]:='LABEL';
tabmots[15]:='PROCEDURE';
tabmots[16]:='FUNCTION';
tabmots[17]:='VAR';
tabmots[18]:='IMPLEMENTATION';
tabmots[19]:='BEGIN';
tabmots[20]:='END';
tabmots[21]:='FOR';
tabmots[22]:='TO';
tabmots[23]:='DOWNTO';
tabmots[24]:='DO';
tabmots[25]:='IF';
tabmots[26]:='THEN';
tabmots[27]:='ELSE';
tabmots[28]:='WHILE';
tabmots[29]:='REPEAT';
tabmots[30]:='UNTIL';
tabmots[31]:='CASE';
tabmots[32]:='OF';
tabmots[33]:='GOTO';
tabmots[34]:='AND';
tabmots[35]:='OR';
tabmots[36]:='NOT';
tabmots[37]:='XOR';
tabmots[38]:='DIV';
tabmots[39]:='MOD';
tabmots[40]:='IN';
tabmots[41]:='SHL';
tabmots[42]:='SHR';
tabmots[43]:='WITH';
tabmots[44]:='NIL';
tabmots[45]:='ASM';
tabmots[46]:='INLINE';
tabmots[47]:='CONSTRUCTOR';
tabmots[48]:='DESTRUCTOR';
nbmots:=48;
end;

procedure tri(var tabmots:tableau; nbmots:integer);
var i,j:integer;
    temp:string;
begin
for i:= 1 to (nbmots-1) do
    begin
    for j:=(i+1) to nbmots do
        begin
        if tabmots[j]<tabmots[i] then
           begin
           temp:=tabmots[j];
           tabmots[j]:=tabmots[i];
           tabmots[i]:=temp;
           end;
        end;
    end;
end;

function majuscule(chaine:string):string;
var i:integer;
begin
for i:=1 to length(chaine) do chaine[i]:=upcase(chaine[i]);
majuscule:=chaine;
end;

procedure affiche(tabmots:tableau; nbmots:integer);
var i:integer;
begin
clrscr;
writeln(' - AFFICHAGE DU TABLEAU - ');
if nbmots>=1 then
begin
for i:=1 to nbmots do
    begin
    writeln(tabmots[i]);
    if (i mod 20)=0 then
       begin
       readln;
       clrscr;
       end;
    end;
writeln('Affichage termin‚.');
end
else writeln('Tableau vide !');
writeln;
end;

function existe(chaine:string; tabmots:tableau; n:integer):boolean;
var i:integer;
begin
existe:=false;
for i:=1 to n do
    begin
    if tabmots[i]=chaine then existe:=true;
    { ou encore: "existe:=tabmots[i]=chaine;" }
    end;
end;

var tabmots:tableau;
    nbmots:integer;
    chaine:string;

BEGIN
clrscr;
init(tabmots,nbmots);
tri(tabmots,nbmots);
repeat

repeat
writeln('Voulez-vous afficher le contenu du tableau ? [O/N]');
readln(chaine);
chaine:=majuscule(chaine);
until (chaine='O') or (chaine='N');

if chaine='O' then affiche(tabmots,nbmots);

repeat
writeln('Entrez au clavier une chaŚne de caractŠres (tapez "Q" pour quitter) : ');
readln(chaine);
chaine:=majuscule(chaine);
until chaine<>'';

write('La chaine sp‚cifi‚e <',chaine,'> ');
if existe(chaine,tabmots,nbmots) then writeln('appartient au tableau.')
else writeln('n''appartient pas au tableau.');
writeln;
until chaine='Q';
END.