PROGRAMACIN
EN
PASCAL
program calculadora (input, output);
uses crt;
var num, den, num1, den1: real;
op:char;
n, xpie: integer;
control, inicio: boolean;
procedure EscribirEnPie (var xpie: integer; numpie, denpie:real; op:char; inicio: bolean);
const YPIE=22;
var xinic, yinic: integer;
begin
xinic:=wherex;
yinic:=wherey;
if inicio=true then
gotoxy(1, XPIE)
else
begin
gotoxy(xpie, YPIE);
write( , op, );
end;
write(numpie:1:0, /, denpie:1:0);
xpie:=wherex;
gotoxy(xinic,yinic)
end;
procedure BorrarPantalla;
const YPIE=22;
var posy: integer;
begin
if inicio=true then
gotoxy(1,YPIE+1);
for posy:=wherey downto 1 do
begin
gotoxy(wherex,posy);
clreol
end;
end;
function leerOperacion:char;
var op:char;
color:integer;
begin
randomize;
write (?);
textcolor(color);
while (color<>(10+random(4))) and (color<>(15)) do
begin
color:=(10+random(6));
textcolor(color);
end;
readln (op);
writeln;
leerOperacion:=op;
textcolor(15)
end;
procedure simplificarFraccion (var a, b: real);
var i:integer;
begin
dsorComun:=2;
while ((a>=dsorComun) and (b>=dsorComun)) do
begin
while ((trunk(a) mod dsorComun) =0) and ((trunk(b) mod dsroComun) = 0) do
begin
a:=a/dsorComun;
b:=b/dsorComun;
end;
dsorComun:=dsorComun+1
end;
end;
procedure leerFraccion (var a,b: real);
begin
write (?);
write(Introduzca el numerador: );
readln(a)
if op=: then
while (a=0) do
begin
write (?);
write(Introduzca un numerador distinto a cero: );
readln(a)
end;
write (?);
write(Introduzca un numerador distinto a cero: );
readln(a)
while (b=0) do
begin
write(?):
write(Error. Introduzca un denominador distinto a cero: );
readln(b)
end;
simplificarFraccion (a,b);
end;
procedure sumarFraccion (var num,den: real; num1, den1:real);
begin
num:=num*den1+num1*den;
den:=den*den1
end;
procedure sumarFraccion (var num,den: real; num1, den1:real);
begin
num:=num*den1+num1*den;
den:=den*den1
end;
procedure restarFraccion (var num,den: real; num1, den1:real);
begin
num:=num*den1-num1*den;
den:=den*den1
end;
procedure multiplicarFraccion (var num,den: real; num1, den1:real);
begin
num:=num*num1;
den:=den*den1
end;
procedure dividirFraccion (var num,den: real; num1, den1:real);
begin
num:=num*den1;
den:=den*num1
end;
procedure escribirResultado (nun,den:real);
begin
simplificarFraccion (num,den);
write(?);
write(El resultado es: , num:1:0, /, den:1:0, = , num/den:1:3, .);
readln;
end;
begin
textcolor(15);
clrscr;
n:=1;
op:=leerOperacion;
(*salida del programa cuan la operacin es f o F*)
while (op<>f) and (op<> ) then
begin
(*control para que la 1 operacion sea espacio en blanco*)
if (n=1) and (op<> ) then
control:=true
else
control:=false;
if control=true then
while (op<> ) and (op<>f) and (op<> F) do
begin
write(?);
write (Pulse espacio, f o F );
op:=leerOperacion;
end;
n:=n+1;
(*control que indica si la operacin es la 1 o un espacio en blanco*)
if (op= ) or (n=1) then
inicio:=true
else
inicio:=false;
case op of
+:
begin
leerFraccion (nun1, den1);
sumarFraccion(num,den,num1,den1);
BorrarPantalla;
EscribirEnPie(xpie,num1,den1,op,inicio);
end;
-:
begin
leerFraccion (nun1, den1);
restarFraccion(num,den,num1,den1);
BorrarPantalla;
EscribirEnPie(xpie,num1,den1,op,inicio);
end;
*:
begin
leerFraccion (nun1, den1);
multiplicarFraccion(num,den,num1,den1);
BorrarPantalla;
EscribirEnPie(xpie,num1,den1,op,inicio);
end;
::
begin
leerFraccion (nun1, den1);
dividirFraccion(num,den,num1,den1);
BorrarPantalla;
EscribirEnPie(xpie,num1,den1,op,inicio);
end;
:
begin
num:=0;
den:=0;
leerFraccion (nun, den);
BorrarPantalla;
EscribirEnPie(xpie,num,den,op,inicio);
end;
=:
begin
escribirResultado (num,den);
BorrarPantalla;
EscribirEnPie(xpie,num1,den1,op,inicio);
end;
end;
(*salida del programa cuando la operacin es f o F*)
if (op<>f) and (op<>F) then
op:=leerOperacion;
(*validacion de las operaciones*)
while not ((op= )or ((op=+)or ((op=-)or ((op=*)or ((op=:)or ((op==)or ((op=f)or ((op=F)) do
begin
write(?);
write(Pulse +, -, *, :, =, espacio, f o F.);
op:=leerOperacion;
end;
end;
end.