Otra calculadora que tiene uno que otro detalle
pascal:
uses
crt;{Cargamos la libreria del teclado}
var
tecla : Char;{Leyendo teclas}
valor1,valor2 : Longint;{Valores para calcular}
operando,x : integer;{el operando y la abscisa}
aux : String;{Auxiliar para ir concatenando digitos}
operacion, error,mostrado : boolean;{Banderas}
function agregar(tecla:char;valor:longint):longint;
{Va concatenando la tecla en la variable valor y devuelve valor}
var
aux : String;{Variable auxiliar para ir concatenando}
begin
str(valor,aux);{Asignamos a aux el contenido de valor}
{0,1,2,3,4,5,6,7,8,9}
if (ord(tecla)>47)AND(ord(tecla)<58) then
{Verificamos si un digito fue introducido en tecla mediante su
valor ordinal en la tabla de codigo ascii}
begin
if NOT(length(aux)>8) then
{Si la longitud no es mayor a 8 seguimos permitiendo agregar digitos}
begin
val(concat(aux,tecla),valor);{concatenamos la tecla en aux, se lo asignamos a valor el
contenido de la concatenacion convirtiendolo a valor numerico}
end;
end;
{BackSpace}
if (ord(tecla)=8)AND(length(aux)>0) then{si quiere eliminar un caracter y la cadena es mayor a cero}
begin
if valor<10 then {Si solo hay un digito, entonces cuando de borrar lo convertimos a cero}
valor:=0;
delete(aux,length(aux),1);{Eliminamos de la ultima posicion un digito}
val(aux,valor);{Asignamos a valor el contenido de aux convertido en valor numerico}
end;
agregar:=valor;{Devolvemos el valor en la funcion}
end;
procedure calculadora(t:Char);{Dibuja una simulacion de calculadora en pantalla}
procedure coloreado(texto:string;x,y:integer);
{Procedimiento local de calculadora que colorea el texto en
una coordenada dada por x y y}
begin
textcolor(green);
gotoxy(x,y);
write(texto);
textcolor(white);
end;
begin{Inicia el procedimiento}
{dibuja calculadora}
gotoxy(3,2);writeln('----- <');
gotoxy(3,3);writeln('7 8 9 +');
gotoxy(3,4);writeln('4 5 6 -');
gotoxy(3,5);writeln('1 2 3 *');
gotoxy(3,6);writeln('0 /');
{Si es cualquier digito numerico colorea su digito}
if ord(tecla)=57{9} then coloreado('9',7,3);
if ord(tecla)=56{8} then coloreado('8',5,3);
if ord(tecla)=55{7} then coloreado('7',3,3);
if ord(tecla)=54{6} then coloreado('6',7,4);
if ord(tecla)=53{5} then coloreado('5',5,4);
if ord(tecla)=52{4} then coloreado('4',3,4);
if ord(tecla)=51{3} then coloreado('3',7,5);
if ord(tecla)=50{2} then coloreado('2',5,5);
if ord(tecla)=49{1} then coloreado('1',3,5);
if ord(tecla)=48{0} then coloreado('0',3,6);
{Si es un digto BackSpace o operando lo colorea}
if ord(tecla)=8{BackSpace} then coloreado('<',10,2);
if ord(tecla)=43{+} then coloreado('+',10,3);
if ord(tecla)=45{-} then coloreado('-',10,4);
if ord(tecla)=42{*} then coloreado('*',10,5);
if ord(tecla)=47{/} then coloreado('/',10,6);
end;{Fin del procedimiento dibuja calculadora}
begin{Programa principal}
clrscr;{Limpia pantalla}
valor1 :=0;{inicializa los valores principales}
valor2 :=0;{}
aux :='';{}
operacion :=false;{No hay operacion pendiente}
error :=false;{No hay errores en las operaciones}
mostrado :=false;{No se ha mostrado el resultado}
calculadora(' ');{Dibuja la calculadora sin remarcar ningun digito}
repeat{Repite la calculadora hasta que no se presione salir (Tecla ESC)}
str(valor1,aux);{Asigna a aux el valor de valor1 si existe}
x:=11-length(aux);{Especificamos la abscisa para que el texto se recorra de derecha a isquierda segun la cantidad de digitos}
tecla:=readkey;{Se le asigna a tecla el valor insertado desde el teclado}
calculadora(tecla);{Dibujamos la calculadora dibujando el caracter presionado}
if (ord(tecla)=13)OR(((ord(tecla)=42)OR(ord(tecla)=43)OR(ord(tecla)=45)OR(ord(tecla)=47))AND(operacion=true)) then
{Si tecla es ENTER o un operando y hay una operacion pendiente (Ya se ha insertado valor1)}
begin
case ord(operando) of{Evalua que operando ha sido insertado para realizar operacion}
42{*}:{Multiplic}
begin
if ord(tecla)<>42 then{Evalua que no se inserte dos veces el operando * seguido
ya que automaticamente valor2 tomaria el valor cero trallendo resultado indeseado (0)}
valor1:=valor1*valor2;
end;
43{+}:{Suma}
valor1:=valor1+valor2;
45{-}:{Resta}
valor1:=valor1-valor2;
47{/}:{Division}
begin
if ord(tecla)<>47 then{Evalua que no se inserte dos veces el operando / seguido
ya que automaticamente valor2 tomaria el valor2 cero mostrando asàun error}
if valor2<>0 then{Si el dividendo (valor2) no es cero}
valor1:=valor1 div valor2{Divide}
else
error:=true;{No divie activa la bandera de error}
end;
end;
operacion := false;{Apaga la bandera de operacion pendiente}
operando := 0;{Devuelve operando a cero para que no esté activado si ya se utilizo}
valor2 := 0;{Devuelve valor2 a cero}
gotoxy(1,1);write(' ');{Limpia la parte donde escribira el resultado}
if error=false then{Si la bandera error esta apagada}
begin
gotoxy(x,1);
write(valor1);{Muestra el resultado}
end;
if error=true then{Si la banera error esta encenida}
begin
valor1:=0;{Devuelve valor1 a cero}
gotoxy(1,1);write('ERROR');{Muestra msg de error en pantalla}
error:=false;{vuelve a apagar la bandera de error}
end;
mostrado:=true;{Enciente la bandera de que ha sido mostrado el resultado}
end;{Fin de .... {Si tecla es ENTER o un operando y hay una operacion pendiente (Ya se ha insertado valor1)}}
if mostrado=false then {Si la bandera mostrado esta apagada (no se ha mostrado un resultado)}
begin
case operacion of{Evaluamos si hay una operacion pendiente o si todavia se esta lellendo el valor1}
false:{Todavia se esta lellendo valor1}
begin
str(valor1,aux);{Asignamos a aux lo de valor1}
valor1:=agregar(tecla,valor1);{Mandamos llamar la funcion agregar
con el valor1 de la tecla y lo que tiene valor (...concatenar valores)}
gotoxy(1,1);write(' ');{Limpia parte donde muestra resultado}
gotoxy(x,1);write(valor1);{Muestra resultado de concatenar}
end;
true:{Ya se esta lellendo valor2 (Hay una operacion pendiente por realizar ya)}
begin
str(valor2,aux);
valor2:=agregar(tecla,valor2);{Mandamos llamar la funcion agregar
con el valor2 de la tecla y lo que tiene valor (...concatenar valores)}
gotoxy(1,1);write(' ');{Limpia parte donde muestra resultado}
gotoxy(x,1);write(valor2);{Muestra el resultado de concatenar}
end;{Fin de evaluar si hay o no operacion pendiente}
end;{Fin del case}
if (ord(tecla)=42{*}) OR (ord(tecla)=43{+}) OR (ord(tecla)=45{-}) OR (ord(tecla)=47{/}) then
{Si tecla es uno de los operandos *,/,-,+}
begin
operacion:=true;{Enciende la bandera de operacion pendiente}
operando := ord(tecla);{Asigna a operando el valor ordinal de la tecla (el operando insertado)}
gotoxy(11,1);write(tecla);{Se va a la coordenada donde termina la parte para mostrar resulstado y muestra
el operando}
end;
end;{Fin de si la banedera mostrado esta apagada}
mostrado:=false;{Apagamos la bandera de que ha sido mostrado el resultado}
until ord(tecla)=27;{Hasta que el valor ordinal de la tecla sea 27 (Tecla ESC)}
end.
crt;{Cargamos la libreria del teclado}
var
tecla : Char;{Leyendo teclas}
valor1,valor2 : Longint;{Valores para calcular}
operando,x : integer;{el operando y la abscisa}
aux : String;{Auxiliar para ir concatenando digitos}
operacion, error,mostrado : boolean;{Banderas}
function agregar(tecla:char;valor:longint):longint;
{Va concatenando la tecla en la variable valor y devuelve valor}
var
aux : String;{Variable auxiliar para ir concatenando}
begin
str(valor,aux);{Asignamos a aux el contenido de valor}
{0,1,2,3,4,5,6,7,8,9}
if (ord(tecla)>47)AND(ord(tecla)<58) then
{Verificamos si un digito fue introducido en tecla mediante su
valor ordinal en la tabla de codigo ascii}
begin
if NOT(length(aux)>8) then
{Si la longitud no es mayor a 8 seguimos permitiendo agregar digitos}
begin
val(concat(aux,tecla),valor);{concatenamos la tecla en aux, se lo asignamos a valor el
contenido de la concatenacion convirtiendolo a valor numerico}
end;
end;
{BackSpace}
if (ord(tecla)=8)AND(length(aux)>0) then{si quiere eliminar un caracter y la cadena es mayor a cero}
begin
if valor<10 then {Si solo hay un digito, entonces cuando de borrar lo convertimos a cero}
valor:=0;
delete(aux,length(aux),1);{Eliminamos de la ultima posicion un digito}
val(aux,valor);{Asignamos a valor el contenido de aux convertido en valor numerico}
end;
agregar:=valor;{Devolvemos el valor en la funcion}
end;
procedure calculadora(t:Char);{Dibuja una simulacion de calculadora en pantalla}
procedure coloreado(texto:string;x,y:integer);
{Procedimiento local de calculadora que colorea el texto en
una coordenada dada por x y y}
begin
textcolor(green);
gotoxy(x,y);
write(texto);
textcolor(white);
end;
begin{Inicia el procedimiento}
{dibuja calculadora}
gotoxy(3,2);writeln('----- <');
gotoxy(3,3);writeln('7 8 9 +');
gotoxy(3,4);writeln('4 5 6 -');
gotoxy(3,5);writeln('1 2 3 *');
gotoxy(3,6);writeln('0 /');
{Si es cualquier digito numerico colorea su digito}
if ord(tecla)=57{9} then coloreado('9',7,3);
if ord(tecla)=56{8} then coloreado('8',5,3);
if ord(tecla)=55{7} then coloreado('7',3,3);
if ord(tecla)=54{6} then coloreado('6',7,4);
if ord(tecla)=53{5} then coloreado('5',5,4);
if ord(tecla)=52{4} then coloreado('4',3,4);
if ord(tecla)=51{3} then coloreado('3',7,5);
if ord(tecla)=50{2} then coloreado('2',5,5);
if ord(tecla)=49{1} then coloreado('1',3,5);
if ord(tecla)=48{0} then coloreado('0',3,6);
{Si es un digto BackSpace o operando lo colorea}
if ord(tecla)=8{BackSpace} then coloreado('<',10,2);
if ord(tecla)=43{+} then coloreado('+',10,3);
if ord(tecla)=45{-} then coloreado('-',10,4);
if ord(tecla)=42{*} then coloreado('*',10,5);
if ord(tecla)=47{/} then coloreado('/',10,6);
end;{Fin del procedimiento dibuja calculadora}
begin{Programa principal}
clrscr;{Limpia pantalla}
valor1 :=0;{inicializa los valores principales}
valor2 :=0;{}
aux :='';{}
operacion :=false;{No hay operacion pendiente}
error :=false;{No hay errores en las operaciones}
mostrado :=false;{No se ha mostrado el resultado}
calculadora(' ');{Dibuja la calculadora sin remarcar ningun digito}
repeat{Repite la calculadora hasta que no se presione salir (Tecla ESC)}
str(valor1,aux);{Asigna a aux el valor de valor1 si existe}
x:=11-length(aux);{Especificamos la abscisa para que el texto se recorra de derecha a isquierda segun la cantidad de digitos}
tecla:=readkey;{Se le asigna a tecla el valor insertado desde el teclado}
calculadora(tecla);{Dibujamos la calculadora dibujando el caracter presionado}
if (ord(tecla)=13)OR(((ord(tecla)=42)OR(ord(tecla)=43)OR(ord(tecla)=45)OR(ord(tecla)=47))AND(operacion=true)) then
{Si tecla es ENTER o un operando y hay una operacion pendiente (Ya se ha insertado valor1)}
begin
case ord(operando) of{Evalua que operando ha sido insertado para realizar operacion}
42{*}:{Multiplic}
begin
if ord(tecla)<>42 then{Evalua que no se inserte dos veces el operando * seguido
ya que automaticamente valor2 tomaria el valor cero trallendo resultado indeseado (0)}
valor1:=valor1*valor2;
end;
43{+}:{Suma}
valor1:=valor1+valor2;
45{-}:{Resta}
valor1:=valor1-valor2;
47{/}:{Division}
begin
if ord(tecla)<>47 then{Evalua que no se inserte dos veces el operando / seguido
ya que automaticamente valor2 tomaria el valor2 cero mostrando asàun error}
if valor2<>0 then{Si el dividendo (valor2) no es cero}
valor1:=valor1 div valor2{Divide}
else
error:=true;{No divie activa la bandera de error}
end;
end;
operacion := false;{Apaga la bandera de operacion pendiente}
operando := 0;{Devuelve operando a cero para que no esté activado si ya se utilizo}
valor2 := 0;{Devuelve valor2 a cero}
gotoxy(1,1);write(' ');{Limpia la parte donde escribira el resultado}
if error=false then{Si la bandera error esta apagada}
begin
gotoxy(x,1);
write(valor1);{Muestra el resultado}
end;
if error=true then{Si la banera error esta encenida}
begin
valor1:=0;{Devuelve valor1 a cero}
gotoxy(1,1);write('ERROR');{Muestra msg de error en pantalla}
error:=false;{vuelve a apagar la bandera de error}
end;
mostrado:=true;{Enciente la bandera de que ha sido mostrado el resultado}
end;{Fin de .... {Si tecla es ENTER o un operando y hay una operacion pendiente (Ya se ha insertado valor1)}}
if mostrado=false then {Si la bandera mostrado esta apagada (no se ha mostrado un resultado)}
begin
case operacion of{Evaluamos si hay una operacion pendiente o si todavia se esta lellendo el valor1}
false:{Todavia se esta lellendo valor1}
begin
str(valor1,aux);{Asignamos a aux lo de valor1}
valor1:=agregar(tecla,valor1);{Mandamos llamar la funcion agregar
con el valor1 de la tecla y lo que tiene valor (...concatenar valores)}
gotoxy(1,1);write(' ');{Limpia parte donde muestra resultado}
gotoxy(x,1);write(valor1);{Muestra resultado de concatenar}
end;
true:{Ya se esta lellendo valor2 (Hay una operacion pendiente por realizar ya)}
begin
str(valor2,aux);
valor2:=agregar(tecla,valor2);{Mandamos llamar la funcion agregar
con el valor2 de la tecla y lo que tiene valor (...concatenar valores)}
gotoxy(1,1);write(' ');{Limpia parte donde muestra resultado}
gotoxy(x,1);write(valor2);{Muestra el resultado de concatenar}
end;{Fin de evaluar si hay o no operacion pendiente}
end;{Fin del case}
if (ord(tecla)=42{*}) OR (ord(tecla)=43{+}) OR (ord(tecla)=45{-}) OR (ord(tecla)=47{/}) then
{Si tecla es uno de los operandos *,/,-,+}
begin
operacion:=true;{Enciende la bandera de operacion pendiente}
operando := ord(tecla);{Asigna a operando el valor ordinal de la tecla (el operando insertado)}
gotoxy(11,1);write(tecla);{Se va a la coordenada donde termina la parte para mostrar resulstado y muestra
el operando}
end;
end;{Fin de si la banedera mostrado esta apagada}
mostrado:=false;{Apagamos la bandera de que ha sido mostrado el resultado}
until ord(tecla)=27;{Hasta que el valor ordinal de la tecla sea 27 (Tecla ESC)}
end.