Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Mario Olivera en 15 Mayo 2015, 06:43 am



Título: Programa solución a error cuando esperamos un integer + codigo
Publicado por: Mario Olivera en 15 Mayo 2015, 06:43 am
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



tnJqZjGz23A

Código en pascal (despues dejaré el de C++)
Código
  1. program hki;
  2.  
  3. Uses
  4. crt;
  5.  
  6. var
  7. (*VARIABLES PARA EL PASAJE DE STRING INTEGER!*)
  8. ladoDelCuadrado:integer;
  9. cantidadDeCaracteres:integer;
  10. auxCantidadCaracteres:integer;
  11. multiplicador,resultado:integer;
  12. auxNumero:string;
  13. caracter:char;
  14. i:integer;
  15. polaridad:boolean;
  16. interruptor:boolean;
  17. cambioPolaridad:boolean;
  18. respuesta:boolean;
  19.  
  20. (*VARIABLES PARA DIBUJAR EL CUADRADO!*)
  21. anchoUno:integer;
  22. cantidadDeLineas:integer;
  23. auxAncho:integer;
  24.  
  25. BEGIN
  26. ClrScr;
  27.  
  28.  
  29. i:=1;
  30. interruptor:= false; (* si los varoles son correctos esta en true, cuando entra a un else de algun case se apaga y asi queda*)
  31. polaridad:= true; (* Numero positivo*)
  32.    cambioPolaridad:=false;
  33. respuesta:= true;
  34.  
  35. write('Ingrese el lado del cuadrado: ');
  36. readLn(auxNumero); (*Lee el numero string*)
  37.  
  38. cantidadDeCaracteres:=length(auxNumero);
  39. multiplicador:= 10;
  40. ladoDelCuadrado:= 0;
  41. resultado:= 10;
  42.  
  43. while (interruptor <> true) do
  44. begin
  45. interruptor:= true;
  46. if (cantidadDeCaracteres = 1) then
  47. begin
  48. caracter:= auxNumero[1];
  49. case caracter of
  50. '0':
  51. begin
  52. ladoDelCuadrado:= 0;
  53. end;
  54. '1':
  55. begin
  56. ladoDelCuadrado:= 1;
  57. end;
  58. '2':
  59. begin
  60. ladoDelCuadrado:= 2;
  61. end;
  62. '3':
  63. begin
  64. ladoDelCuadrado:= 3;
  65. end;
  66. '4':
  67. begin
  68. ladoDelCuadrado:= 4;
  69. end;
  70. '5':
  71. begin
  72. ladoDelCuadrado:= 5;
  73. end;
  74. '6':
  75. begin
  76. ladoDelCuadrado:= 6;
  77. end;
  78. '7':
  79. begin
  80. ladoDelCuadrado:= 7;
  81. end;
  82. '8':
  83. begin
  84. ladoDelCuadrado:= 8;
  85. end;
  86. '9':
  87. begin
  88. ladoDelCuadrado:= 9;
  89. end;
  90. else
  91. begin
  92. interruptor:= false;
  93. end
  94. end;
  95. end
  96. else
  97. begin
  98. while (i <  cantidadDeCaracteres) do (*Me Falta sumar el ultimo digito itera 4 veces*)
  99. begin
  100. caracter:= auxNumero[1];
  101. if (i = 1) then
  102. begin
  103. if (caracter = '+') then
  104. begin
  105. auxNumero:= copy(auxNumero,2,cantidadDecaracteres);
  106. end;
  107.  
  108. if (caracter = '-') then
  109. begin
  110. auxNumero:= copy(auxNumero,2,cantidadDecaracteres);
  111. interruptor:= false;
  112. polaridad:= false; (* SE PONE EN MENOS*)
  113. cambioPolaridad:= true;
  114. end;
  115.  
  116. end;
  117.  
  118. caracter:= auxNumero[i];
  119. (*if (interruptor <> false) then
  120. begin*)
  121. case caracter of
  122. '0':
  123. begin
  124. if ((auxNumero[1]) <> '+') or ((auxNumero[1]) <> '-') then
  125. begin
  126. if (i > 1) then
  127. begin
  128. ladoDelCuadrado:= ladoDelCuadrado + ( 0 * resultado);
  129. end;
  130.  
  131. end
  132. else
  133. begin
  134. if (i > 2) then
  135. begin
  136. ladoDelCuadrado:= ladoDelCuadrado + ( 0 * resultado);
  137. end;
  138. end;
  139. end;
  140. '1':
  141. begin
  142. ladoDelCuadrado:= ladoDelCuadrado + ( 1 * resultado);
  143. end;
  144. '2':
  145. begin
  146. ladoDelCuadrado:= ladoDelCuadrado + ( 2 * resultado);
  147. end;
  148. '3':
  149. begin
  150. ladoDelCuadrado:= ladoDelCuadrado + ( 3 * resultado);
  151. end;
  152. '4':
  153. begin
  154. ladoDelCuadrado:= ladoDelCuadrado + ( 4 * resultado);
  155. end;
  156. '5':
  157. begin
  158. ladoDelCuadrado:= ladoDelCuadrado + ( 5 * resultado);
  159. end;
  160. '6':
  161. begin
  162. ladoDelCuadrado:= ladoDelCuadrado + ( 6 * resultado);
  163. end;
  164. '7':
  165. begin
  166. ladoDelCuadrado:= ladoDelCuadrado + ( 7 * resultado);
  167. end;
  168. '8':
  169. begin
  170. ladoDelCuadrado:= ladoDelCuadrado + ( 8 * resultado);
  171. end;
  172. '9':
  173. begin
  174. ladoDelCuadrado:= ladoDelCuadrado + ( 9 * resultado);
  175. end
  176. else
  177. begin
  178. respuesta:=false;
  179. end;
  180. end;
  181. (*end;*)
  182.  
  183. resultado:= resultado * 10;
  184. i:= i + 1;
  185. end;
  186.  
  187. end;
  188.  
  189. (* SACANDO EL ULTIMO DIGITO POR FIN! *)
  190. if (cantidadDeCaracteres <> 1) then
  191. begin
  192. if (cambioPolaridad = true) then
  193. begin
  194. cantidadDeCaracteres:= cantidadDeCaracteres + 1;
  195. caracter:= auxNumero[cantidadDeCaracteres];
  196. end
  197. else
  198. begin
  199. caracter:= auxNumero[cantidadDeCaracteres];
  200. end;
  201.  
  202. case caracter of
  203. '1','2','3','4','5','6','7','8','9','0':
  204. begin
  205.  
  206. end;
  207. else
  208. begin
  209. respuesta:= false;
  210. end;
  211. end;
  212.  
  213. if (interruptor = true) and (respuesta = true) and (ladoDelcuadrado > 9) then
  214. begin
  215. if (cambioPolaridad = true) then
  216. begin
  217. cantidadDeCaracteres:= cantidadDeCaracteres + 1;
  218. caracter:= auxNumero[cantidadDeCaracteres];
  219. end
  220. else
  221. begin
  222. caracter:= auxNumero[cantidadDeCaracteres];
  223. end;
  224.  
  225. case caracter of
  226. '1':
  227. begin
  228. ladoDelCuadrado:= ladoDelCuadrado + 1;
  229. end;
  230. '2':
  231. begin
  232. ladoDelCuadrado:= ladoDelCuadrado + 2;
  233. end;
  234. '3':
  235. begin
  236. ladoDelCuadrado:= ladoDelCuadrado + 3;
  237. end;
  238. '4':
  239. begin
  240. ladoDelCuadrado:= ladoDelCuadrado + 4;
  241. end;
  242. '5':
  243. begin
  244. ladoDelCuadrado:= ladoDelCuadrado + 5;
  245. end;
  246. '6':
  247. begin
  248. ladoDelCuadrado:= ladoDelCuadrado + 6;
  249. end;
  250. '7':
  251. begin
  252. ladoDelCuadrado:= ladoDelCuadrado + 7;
  253. end;
  254. '8':
  255. begin
  256. ladoDelCuadrado:= ladoDelCuadrado + 8;
  257. end;
  258. '9':
  259. begin
  260. ladoDelCuadrado:= ladoDelCuadrado + 9;
  261. end
  262. end;
  263. end
  264. else
  265. begin
  266. writeln('No ingreses valores torpes o(-.-)o: ');
  267. write('Ingrese el lado del cuadrado: ');
  268. readLn(auxNumero);
  269. i:=1;
  270. interruptor:= false;
  271. polaridad:= true; (* Numero positivo*)
  272. cambioPolaridad:=false;
  273. respuesta:= true;
  274. cantidadDeCaracteres:=length(auxNumero);
  275. multiplicador:= 10;
  276. ladoDelCuadrado:= 0;
  277. resultado:= 10;
  278.  
  279.                            end;
  280. end
  281. else (*SI TIENE 1 CARACTER*)
  282. begin
  283. if(interruptor = false) then
  284. begin
  285. writeln('No ingreses valores torpes o(-.-)o: ');
  286. write('Ingrese el lado del cuadrado: ');
  287. readLn(auxNumero);
  288. i:=1;
  289. interruptor:= false;
  290. polaridad:= true; (* Numero positivo*)
  291. cambioPolaridad:=false;
  292. respuesta:= true;
  293. cantidadDeCaracteres:=length(auxNumero);
  294. multiplicador:= 10;
  295. ladoDelCuadrado:= 0;
  296. resultado:= 10;
  297. end;
  298. end;
  299. end; (*FIN WHILE*)
  300.  
  301. (*YA TENDRIA EL VALOR INTEGER*)
  302. writeln('Valor: ',ladoDelCuadrado);
  303. (*ESCRITURA DEL CUADRADO!!!! POR FIN -.- *)
  304.  
  305. auxAncho:=0;
  306. anchoUno:= 0;
  307. cantidadDeLineas:=1;
  308.  
  309.  
  310. if (ladoDelCuadrado = 1) then
  311. begin
  312. writeLn('*');
  313. end
  314.  
  315. else
  316. begin
  317.  
  318. while (anchoUno <> ladoDelCuadrado) do
  319. begin
  320. write('*');
  321. anchoUno:= anchoUno + 1;
  322. end;
  323.  
  324. anchoUno:= 0;
  325. writeLn(' ');
  326.  
  327.  
  328.  
  329. while ((ladoDelCuadrado >= 3) and ( cantidadDeLineas <= (ladoDelCuadrado - 2))) do
  330. begin
  331. write('*');
  332.  
  333. while (auxAncho < (ladoDelCuadrado -2)) do
  334. begin
  335.  
  336. write(' ');
  337. auxAncho:= auxAncho + 1;
  338. end;
  339. auxAncho:= 0;
  340. writeLn('*');
  341. cantidadDeLineas:= cantidadDeLineas + 1;
  342. end;
  343.  
  344. while (anchoUno <> ladoDelCuadrado) do
  345. begin
  346. write('*');
  347. anchoUno := anchoUno + 1;
  348. end;
  349. writeLn(' ');
  350. end;
  351.  
  352. readkey;
  353. END.