program
calculatrice_tp10;
type
liste = ^maillon;
type_elts = integer; {
ici mettre real a la place de integer, comme demander dans
l'enonce ! }
maillon = record
suivant: liste;
val: type_elts;
end;
pile = liste;
var
p: pile;
n: longint;
i: integer;
test: boolean;
choix: str255; {
Sur PC mettre string a la place de str255 }
{ On reutilise
les fonctions et procedure du TP9 :-) }
procedure init_liste (var
l: liste);
begin
l := nil;
end; { Fin de
'init' }
function vide_liste (l: liste): boolean;
begin
vide_liste := (l = nil); { renvoie true si la liste est vide
}
end; { Fin de
'vide_liste' }
procedure insere_tete_liste (elt: type_elts; var l:
liste);
var
p: liste;
begin
p := l;
new(l);
l^.val := elt;
l^.suivant := p;
end; { Fin de
'insere_tete_liste' }
procedure parcours_liste (l: liste);
begin
if not vide_liste(l) then
begin
parcours_liste(l^.suivant);
writeln(l^.val : 3);
end;
end; { Fin de
'parcours_liste' }
procedure super_tete (var l: liste);
var
p: liste;
begin
if l = nil then
writeln('Votre liste est vide, impossible de supprimer la
tete')
else
begin
p := l;
l := l^.suivant;
dispose(p);
end;
end; { Fin de
'super_tete' }
procedure supprime_liste (var l: liste);
begin
if l^.suivant = nil then {
On doit donc remonter jusqu'au premier }
begin
supprime_liste(l^.suivant);
dispose(l);
end;
end; { Fin de
'supprime_liste' }
function longueur_liste (l: liste): integer;
begin { On
considere la liste non-nulle }
if vide_liste(l) then
longueur_liste := 0
else
begin
if l <> nil then
begin
if l = nil then
longueur_liste := 0
else
longueur_liste := 1 + longueur_liste(l^.suivant);
end;
end;
end; { Fin de
'longueur_liste' }
function dernier_liste (l: liste): liste;
begin
if vide_liste(l) then
dernier_liste := nil
else
begin
if l^.suivant <> nil then
dernier_liste := dernier_liste(l^.suivant)
else
dernier_liste := l;
end;
end; { Fin de
'dernier_liste' }
procedure inser_classe_elt_liste (i: type_elts; var
l: liste); {
Ex2/a (insertion) }
var
p, r: liste;
begin
if vide_liste(l) then
begin
insere_tete_liste(i, l);
end
else if (l^.val > i) then
inser_classe_elt_liste(i, l^.suivant)
else
begin
new(p);
p^.val := l^.val;
l^.val := i;
p^.suivant := l^.suivant;
l^.suivant := p;
end;
end; { Fin de
'inser_classe_elt_liste' }
procedure supper_elt_liste (i: type_elts; var l:
liste); { Ex2/c
}
var
p, q: liste;
begin
if vide_liste(l) then
begin
writeln('Votre liste est vide.');
readln; { pause
}
end
else if (l^.val > i) then {
Rappel: la liste est triee }
begin
if l^.suivant <> nil then
supper_elt_liste(i, l^.suivant)
else
writeln('La valeur ', i : 2, ' n''est pas dans la
liste');
end
else if (l^.val = i) then
begin
p := l^.suivant;
q := l;
l := p;
p := q;
dispose(p);
end;
end; { Fin de
'supper_elt_liste' }
{ Fin des rappels des fonctions et procedure du TP9 }
{ Debut de la
resolution de la question a }
procedure pile_init (var p: pile);
begin
init_liste(p);
end; { Fin de
'pile_init' }
function est_vide (p: pile): boolean;
begin
est_vide := vide_liste(p);
end; { Fin de
'est_vide' }
function depile (var p: pile): type_elts;
begin
depile := p^.val;
super_tete(p);
end; { Fin de
'depile' }
procedure empile (var p: pile; i: type_elts);
begin
insere_tete_liste(i, p);
end; { Fin de
'empile' }
function longueur_pile (p: pile): integer;
begin
longueur_pile := longueur_liste(p);
end; { Fin de
'longueur_pile' }
procedure parcours_pile (p: pile);
begin
parcours_liste(p);
end; { Fin de
'parcours_pile' }
procedure supprime_pile (p: pile);
begin
supprime_liste(p);
end; { Fin de
'parcours_pile' }
{ Fin de la resolution de la question a }
{ Debut de la resolution de la question b }
function operation (op:
char; y, x: type_elts): type_elts;
begin
case op of
'+':
x := x + y;
'*':
x := x * y;
'-':
x := x - y;
'/':
begin
if y <> 0 then
x := x div y {
Sur PC mettre le symbole / a la place de div }
else
begin
writeln(' * Erreur Fatale : OVERFLOW *');
writeln('La division par zéro est impossible');
supprime_pile(p);
end;
end;
otherwise {
inutile, mais il vaut mieux prévenir que
guérir }
begin
writeln('Opération non-supportee dans cette
version');
writeln('Contacter l''auteur a
http://www.Software-DS.com');
end;
end;
writeln(x : 0);
operation := x;
end; { Fin de
'operation' }
function operation2 (op: char; y: type_elts):
type_elts;
begin
case op of
's':
writeln('La fonction sinus n''existe pas en Pascal a ma
connaissance !');
'r':
y := sqr(y); {
Pour PC mettre sqrt a la place de sqr }
otherwise {
inutile, mais il vaut mieux prévenir que
guérir }
begin
writeln('Opération non-supportée dans cette
version');
writeln('Contacter l''auteur à
www.Software-DS.com');
end;
end;
writeln(y : 0);
operation2 := y;
end; { Fin de
'operation2' }
begin { Corps du
programme }
pile_init(p);
test := true;
writeln('Calculatrice TI-DS de Software-DS.com v1.0');
writeln('Entrer une valeur ou une opération : + - * /
s r');
writeln('s: sinus r: racine carré');
writeln(' Q pour quitter.'); {
chaine vide=Q }
writeln;
while test do
begin
readln(choix);
if (choix = 'Q') or (choix = 'q') then {
Pour quitter le programme }
test := false
else
begin
if (choix = '+') or (choix = '-') or (choix = '*') or (choix
= '/') then
begin
if longueur_pile(p) >= 2 then
empile(p, operation(choix, depile(p), depile(p)))
else
begin
writeln('Fatal Error: Sortie du programme
www.Software-DS.com');
writeln('il manque un argument !');
supprime_pile(p);
end;
end
else if (choix = 'r') or (choix = 's') then
begin
if longueur_pile(p) >= 1 then
empile(p, operation2(choix, depile(p)))
else
begin
writeln('Fatal Error: Sortie du programme
www.Software-DS.com');
writeln('il manque un argument');
supprime_pile(p);
end;
end
else
begin
StringToNum(choix, n); {
Sur PC utilisez l'instruction val(
) pour convertir une
chaine de caractere en nombre }
i := n;
empile(p, i);
end;
end;
end; { while
}
supprime_pile(p); {
désallocation ! }
writeln;
writeln('©2001 All Rights Reserved to
Software-DS.com');
{ ©2001 All
Rights Reserved to http://www.Software-DS.com
10/12/01 }
end.
|