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.
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 :)