A continuación veremos algunos errores muy comunes al programar, especialmente en aquellas personas que están iniciándose en este mundo de los códigos. Se verán errores de tipo lógico (de razonamiento) y otros que tengan que ver con el correcto uso de los operadores del lenguaje. En particular, estos errores serán demostrados en el lenguaje C++, compilados con Bloodshev dev C++.
Slide 3
Bucle infinito:
Este error es muy común en los nuevos programadores cuando van descubriendo las estructuras repetitivas o bucles. Estos realizan determinadas acciones hasta que se cumpla cierta condición (límite). Muchas veces el límite está mal establecido o bien, nunca se cumple porque la condición que verifica la estructura repetitiva no está bien planteada por un fallo lógico al pensar la variable de conteo del bucle.
En el código, se puede apreciar un for. Este le asigna un valor a su variable contadora X y establece la condición para que el bucle se repita X<=10 (siempre que X sea menor o igual que 10). El bucle tiene la finalidad de mostrar el valor que contenga x, puesto que este valor debería ir creciendo del 1 hasta el 10. Veamos su ejecución:
Rubrica: : Código en C++ del ejemplo de bucle infinito.
El programa repite de manera indefinida el número 0, porque este es el valor de X. Como esta nunca cambia su valor dentro de la estructura repetitiva, nunca podría llegar a incumplir la condición del for (X<=10) ya que SIEMPRE será 0. Hay variantes de este tipo de error que llevan al mismo resultado. Podría realizarse el conteo de la variable pero fuera del for, por lo que nunca se tendría en cuenta dentro del mismo y llevaría a los mismos resultados. También podría volver a inicializarse la variable contadora con un 0 dentro del mismo for, lo que provocaría que aunque la x cuente, siempre vuelva a valer 0 para cuando se terminó de ejecutar el programa.
Para este caso, como el error es no contar del 1 al 10 la varabiable contadora, se añade en el encabezado del for X++. El operador ++ significa que a esa variable se le va a sumar 1. Sería lo mismo que escribir X=X+1. De esta manera, nuestra variable debería ir aumentando su valor de 1 en 1 hasta llegar a 10, donde entraría por última vez al for. La próxima vez que se ejecute el for, X=11 y por tanto no se cumpliría la condición del for. Lo que lleva a la finalización del bucle. Veamos la ejecución.
Rubrica: : El programa se ejecuta correctamente, realizando y mostrando la cuenta del 1 al 10.
Slide 9
Error de secuencia:
En síntesis, un error de secuencia se da cuando la forma en la que están ordenadas las líneas o instrucciones del algoritmo no es correcta para el objetivo que tiene este. Es decir, no produciría errores al compilar si la sintaxis es buena, pero no produciría los resultados esperados. Un caso muy común para las personas que se inician en C++ se da porque pretenden que las asignaciones funciones como ecuaciones. Por ejemplo, escribiendo suma= a+b se pretende que suma contenga la suma de estas dos variables. Ahora, esto se realizará con los valores que a y b tengan al momento de la ejecución de la instrucción.
Como se puede observar, se crea una variable llamada suma, la cual contiene la suma de a y b. No obstante es después de la creación y asignación de esta variable, cuando se realiza la toma de datos ingresados por teclado y se almacenan estos valores en a y b, respectivamente.
Rubrica: : En la ejecución del código erróneo, se puede apreciar que el resultado es 1.
Slide 12
Explicación y corrección del error:
En C++ y en muchos otros lenguajes de programación, las asignaciones son cosas de una sola vez. Es decir, las variables contienen un valor apartir del momento en que se crea y se les da uno. De aquí en adelante, este no se altera hasta que se vuelva a invocar esta variable utilizando el operador de asignación. En síntesis, si bien se está sumando lo que contiene a y lo que contiene b, estas variables todavía no contienen ningún valor (o bien contienen basura de memoria, error que trataremos más adelante). La corrección del código implicaría desplazar suma= a+b luego de la toma de valores para a y b. Veamos su ejecución.
Rubrica: : El código corregido se ejecuta correctamente, haciendo la suma 2+5= 7
Slide 14
No inicializar variables:
Este error tiene sus raíces en que, a diferencia de otros lenguajes como por ejemplo Pascal, en C++ las variables recién creadas (del tipo que sea, aunque veremos un ejemplo con enteros) no son inicializadas en 0 por defecto. Aquellos programadores que vienen de otros lenguajes que sí realizan esto, suponen que al crear una variable cualquiera de tipo entero, por ejemplo, estas ya tienen un 0 dentro suyo, esperando para que operen la variable. La realidad es que C++ les asigna un espacio en memoria aleatorio, el cual pudo o no haber estar ocupado antes por alguna otra información, tal que el valor de la variable recién creada podría ser 0 como podría ser 9284394. A estos valores que quedaron de procesos o cálculos anteriores se los llama basura de memoria.
Este error es bastante difícil de demostrar con un código sencillo, pero comprobaremos la existencia de esta basura de memoria y el hecho de que las variables no son inicializadas en 0, con la suma de 3 variables que, supuestamente, no tienen valores asginados.
Rubrica: : Se puede observar que la suma entre a b y c, que no han sido inicializadas, da un total de 1.
Slide 17
Explicación y corrección del error:
El resultado de la suma es 1 debido a que muy probablemente, los espacios que fueron asignados para a,b y c estaban siendo ocupados por valores flotantes (es decir, decimales) y la suma de estos fue redondeada a 1 por el programa. En este caso, el total dio 1, pero si la memoria estuvo en su totalidad ocupada en algun momento desde que la computadora se prendió, es muy probable que se produzcan valores más altos, aleatorios. Lo correcto sería inicializar las variables que se crean en algún punto del programa, bien en el momento de declararlas o justo antes de utilizarlas. En la imagen se comprueba la inicialización en 0 de las variables.