Otra calculadora que tiene uno que otro detalle

¿Has encontrado un error? ¿Tienes la solución? Deja 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 estudiante con únicamente conocimiento básico del lenguaje, no de programación.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
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.

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

  • Si es lenguaje C <code lang="c">Código en C</code>
  • Si es lenguaje Pascal <code lang="pascal">Aquí dentro el código de Pascal</code>.

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

Deja un comentario

Suscribirse a los comentarios.