Otra calculadora que tiene uno que otro detalle

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.

¿Has encontrado algún error? ¿Tienes la solución? Dejame tu correción ;-)

Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress las eliminó al verlas como etiquetas HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios. Y lo mas importante: Todos los ejemplos fueron realizados por personas con únicamente conocimiento básico del lenguaje, no de programación.

Otro punto importante: Si vas a sugerir un segmento de código en algún lenguaje debes hacerlo así:

  • Si es lenguaje C [c]Código en C[/c]
  • Si es lenguaje Pascal [pascal]Aquí dentro el código de Pascal[/pascal].

De esta manera el código coloreas el código.

Otro punto importante para muchos que crees que te he ignorado: Todos los comentarios los reviso y en su debido momento los apruebo, pero ojo con el con lo siguiente:

Me reservo el derecho de alterar, publicar o no los comentarios así como también cambiar mis condiciones en el momento que yo lo requiera.

¿Si estas de acuerdo? Adelante! que ya te he quitado bastante tiempo leyendo esta basura :)