Programa solución a error cuando esperamos un integer + codigo

Iniciado por Mario Olivera, 15 Mayo 2015, 06:43 AM

0 Miembros y 1 Visitante están viendo este tema.

Mario Olivera

Mision del programa: convertir variable string a integer

Programita hecho por mi, que lee un numero (la variable de tipo string), saca digito por digito y va comprobando, se encuentra con problematicas como tener un signo + o - delante, con problematicas como que empieze con 0, que tenga letras, que tenga puntos etc.

Gran utilidad para cuando estamos esperando un integer, y nos ingresan un string, donde el programa siempre se termina cerrando.

Saludos! Mario Olivera.

PD: se puede hacer un archivo .h para C++ e implementarlo para cada variable :D



[youtube=640,360]https://www.youtube.com/watch?v=tnJqZjGz23A[/youtube]

Código en pascal (despues dejaré el de C++)
Código (pascal) [Seleccionar]
program hki;

Uses
crt;

var
(*VARIABLES PARA EL PASAJE DE STRING INTEGER!*)
ladoDelCuadrado:integer;
cantidadDeCaracteres:integer;
auxCantidadCaracteres:integer;
multiplicador,resultado:integer;
auxNumero:string;
caracter:char;
i:integer;
polaridad:boolean;
interruptor:boolean;
cambioPolaridad:boolean;
respuesta:boolean;

(*VARIABLES PARA DIBUJAR EL CUADRADO!*)
anchoUno:integer;
cantidadDeLineas:integer;
auxAncho:integer;

BEGIN
ClrScr;


i:=1;
interruptor:= false; (* si los varoles son correctos esta en true, cuando entra a un else de algun case se apaga y asi queda*)
polaridad:= true; (* Numero positivo*)
    cambioPolaridad:=false;
respuesta:= true;

write('Ingrese el lado del cuadrado: ');
readLn(auxNumero); (*Lee el numero string*)

cantidadDeCaracteres:=length(auxNumero);
multiplicador:= 10;
ladoDelCuadrado:= 0;
resultado:= 10;

while (interruptor <> true) do
begin
interruptor:= true;
if (cantidadDeCaracteres = 1) then
begin
caracter:= auxNumero[1];
case caracter of
'0':
begin
ladoDelCuadrado:= 0;
end;
'1':
begin
ladoDelCuadrado:= 1;
end;
'2':
begin
ladoDelCuadrado:= 2;
end;
'3':
begin
ladoDelCuadrado:= 3;
end;
'4':
begin
ladoDelCuadrado:= 4;
end;
'5':
begin
ladoDelCuadrado:= 5;
end;
'6':
begin
ladoDelCuadrado:= 6;
end;
'7':
begin
ladoDelCuadrado:= 7;
end;
'8':
begin
ladoDelCuadrado:= 8;
end;
'9':
begin
ladoDelCuadrado:= 9;
end;
else
begin
interruptor:= false;
end
end;
end
else
begin
while (i <  cantidadDeCaracteres) do (*Me Falta sumar el ultimo digito itera 4 veces*)
begin
caracter:= auxNumero[1];
if (i = 1) then
begin
if (caracter = '+') then
begin
auxNumero:= copy(auxNumero,2,cantidadDecaracteres);
end;

if (caracter = '-') then
begin
auxNumero:= copy(auxNumero,2,cantidadDecaracteres);
interruptor:= false;
polaridad:= false; (* SE PONE EN MENOS*)
cambioPolaridad:= true;
end;

end;

caracter:= auxNumero[i];
(*if (interruptor <> false) then
begin*)
case caracter of
'0':
begin
if ((auxNumero[1]) <> '+') or ((auxNumero[1]) <> '-') then
begin
if (i > 1) then
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 0 * resultado);
end;

end
else
begin
if (i > 2) then
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 0 * resultado);
end;
end;
end;
'1':
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 1 * resultado);
end;
'2':
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 2 * resultado);
end;
'3':
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 3 * resultado);
end;
'4':
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 4 * resultado);
end;
'5':
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 5 * resultado);
end;
'6':
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 6 * resultado);
end;
'7':
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 7 * resultado);
end;
'8':
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 8 * resultado);
end;
'9':
begin
ladoDelCuadrado:= ladoDelCuadrado + ( 9 * resultado);
end
else
begin
respuesta:=false;
end;
end;
(*end;*)

resultado:= resultado * 10;
i:= i + 1;
end;

end;

(* SACANDO EL ULTIMO DIGITO POR FIN! *)
if (cantidadDeCaracteres <> 1) then
begin
if (cambioPolaridad = true) then
begin
cantidadDeCaracteres:= cantidadDeCaracteres + 1;
caracter:= auxNumero[cantidadDeCaracteres];
end
else
begin
caracter:= auxNumero[cantidadDeCaracteres];
end;

case caracter of
'1','2','3','4','5','6','7','8','9','0':
begin

end;
else
begin
respuesta:= false;
end;
end;

if (interruptor = true) and (respuesta = true) and (ladoDelcuadrado > 9) then
begin
if (cambioPolaridad = true) then
begin
cantidadDeCaracteres:= cantidadDeCaracteres + 1;
caracter:= auxNumero[cantidadDeCaracteres];
end
else
begin
caracter:= auxNumero[cantidadDeCaracteres];
end;

case caracter of
'1':
begin
ladoDelCuadrado:= ladoDelCuadrado + 1;
end;
'2':
begin
ladoDelCuadrado:= ladoDelCuadrado + 2;
end;
'3':
begin
ladoDelCuadrado:= ladoDelCuadrado + 3;
end;
'4':
begin
ladoDelCuadrado:= ladoDelCuadrado + 4;
end;
'5':
begin
ladoDelCuadrado:= ladoDelCuadrado + 5;
end;
'6':
begin
ladoDelCuadrado:= ladoDelCuadrado + 6;
end;
'7':
begin
ladoDelCuadrado:= ladoDelCuadrado + 7;
end;
'8':
begin
ladoDelCuadrado:= ladoDelCuadrado + 8;
end;
'9':
begin
ladoDelCuadrado:= ladoDelCuadrado + 9;
end
end;
end
else
begin
writeln('No ingreses valores torpes o(-.-)o: ');
write('Ingrese el lado del cuadrado: ');
readLn(auxNumero);
i:=1;
interruptor:= false;
polaridad:= true; (* Numero positivo*)
cambioPolaridad:=false;
respuesta:= true;
cantidadDeCaracteres:=length(auxNumero);
multiplicador:= 10;
ladoDelCuadrado:= 0;
resultado:= 10;

                            end;
end
else (*SI TIENE 1 CARACTER*)
begin
if(interruptor = false) then
begin
writeln('No ingreses valores torpes o(-.-)o: ');
write('Ingrese el lado del cuadrado: ');
readLn(auxNumero);
i:=1;
interruptor:= false;
polaridad:= true; (* Numero positivo*)
cambioPolaridad:=false;
respuesta:= true;
cantidadDeCaracteres:=length(auxNumero);
multiplicador:= 10;
ladoDelCuadrado:= 0;
resultado:= 10;
end;
end;
end; (*FIN WHILE*)

(*YA TENDRIA EL VALOR INTEGER*)
writeln('Valor: ',ladoDelCuadrado);
(*ESCRITURA DEL CUADRADO!!!! POR FIN -.- *)

auxAncho:=0;
anchoUno:= 0;
cantidadDeLineas:=1;


if (ladoDelCuadrado = 1) then
begin
writeLn('*');
end

else
begin

while (anchoUno <> ladoDelCuadrado) do
begin
write('*');
anchoUno:= anchoUno + 1;
end;

anchoUno:= 0;
writeLn(' ');



while ((ladoDelCuadrado >= 3) and ( cantidadDeLineas <= (ladoDelCuadrado - 2))) do
begin
write('*');

while (auxAncho < (ladoDelCuadrado -2)) do
begin

write(' ');
auxAncho:= auxAncho + 1;
end;
auxAncho:= 0;
writeLn('*');
cantidadDeLineas:= cantidadDeLineas + 1;
end;

while (anchoUno <> ladoDelCuadrado) do
begin
write('*');
anchoUno := anchoUno + 1;
end;
writeLn(' ');
end;

readkey;
END.