You are on page 1of 9
ERRORES COMUNES DE PROGRAMACION 3. 3.2 33 34 35 3.6 37 3.8 39 3.10 Olvidar una o las dos Haves que delimitan una instruccién compuesta. Colocar un punto y coma después de la condicién de una instruccién 4 provoca un error de légica dentro de tas instrucciones 4€ de seleccién simple, y un error de sintaxis en las instruceiones 4€ de seleccién doble. No proporcionar una accidn dentro del cuerpo de una instruccién while que permita que ésta se haga falsa, oca- sionaré que dicha estructura de repeticién no termine nunca: a esto se le conoce como un “iclo infinito”. Escribir la palabra rescrvada whi.Le con una letra maytiscula, como en While (recucrde que C es un lenguaje sen- sible a mayisculas y minisculas), Todas las palabras reservadas de C tales como while, if y else contienen s6lo letras mindsculas. Si no se inicializa un contador o un total, probablemente los resultados de su programa serdn incorrectas. Este es un ejemplo de un error de logica. Flegir un valor centinela que también sea un valor legitimo. Intentar una divisién entre cero ocasiona un error fatal Utilizar precision en una especificacién de conversién dentro de la cadena de control de formato de la instruceién ‘scané es un error. Las precisiones se utilizan solamente en las especificaciones de conversién de printt, Utilizar nimeros de punto flotantc de una manera que se asuma una representacién precisa, puede provocar resul- tados incorroctos. Fin la mayoria de las computadoras, los niimeros de punta flotante se ropresentan tinicamente de ‘manera aproximada Intentar utilizar el operador de incremento o decremento en una expresién que no sea un nombre de variable sim- ple es un error de sintaxis: por ejemplo, ++ (x + 1) TIPS PARA PREVENIR ERRORES 31 3.2 3.3 34 Esctibir las llaves inicial y final de instrucciones compuestas, antes de escribir las instrucciones individuales que van dentro de ellas, ayuda a evitar la omisién de una 0 ambas llaves, a prevenir errores de sintaxis y a prevenir erro- res de ligica (en donde se requieren ambas llaves). Inicialice los contadores y los totales. No compare la igualdad de valores de punto flotante. Por lo general, C no especifica el orden en que se evaluardn los operandos del operador (aunque en el capitulo 4 ‘eremos excepeiones para unos cuantos operadores). Por lo tanto, cl programador debe evitar el uso de instruccio- nes con operadores de incremento y decremento en las que una variable que se incrementa 0 decrementa aparece més de una vez. 3.9 Identifique y corrija los errores en cada una de las siguientes instrucciones: a) while (c <= 5) { producto *= c; tHe; b) scant( “$.4£”, Evalor); °) if ( genero == 1) printé( “Mujer\n” ); else; print€( “Hombre\n” ); 3.9 a) Error: falta la lave derecha que cierra el cuerpo del whi. Correceién: afiada la Ilave derecha después de la instruccién +e. b) Error: se especifica precisién dentro de la especificacién de conversién de sean£, Correccién: elimine . 4 de la especificacién de conversion. ©) Error: el punto y coma después de @1se en la instruccién 4£..01.8e provoca un error de Kogi Correccién: elimine el punto y coma después de else. 3.10 ,Qué es lo que esti mal en la siguiente instruccidn de repeticion whs.1e (suponga que z tiene un valor 100), la cual se supone debe calcular la suma en orden descendente de los enteros de 100 a 1 a) while ( z >= 0) suma t= 2; 3.10 Fl valor de la variable % munca cambia dentro de Ia instruccién while. Por lo tanto, se erea un ciclo infinito. Pa- ra prevenir que se presente un ciclo infinito, z debe disminuir de manera que alcance un valor igual a 0. EJERCICIOS 3.11. Identifique y corrija los errores de cada una de las siguientes instrucciones [Nota: Puede haber més de un error en cada poreién de cédigo}: a) if ( edad >= 65); print£( “La edad es mayor o igual que 65\n” ); else printf( “La edad es menor que 65\n” ); b) int x = 1, total; while (x <= 10) { total += x; tex: d ©) while ( x <= 100) total += x; +x; d) while (y >0) { print£( “d\n”, y ); ty: y ERRORES COMUNES DE PROGRAMACION 41 42 43 44 45 46 47 48 44 Debido a que los valores de punto flotante pueden ser aproximados, controlar ciclos contadores con variables de punto flotante puede dar como resultado valores contadores imprecisos y evaluaciones de terminacidn incorrectas. Utilizar un operador de relacién incorrceto 0 usar un valor final incorreeto cn un contador de ciclo, dentro de la condicién de una instruccién whi.1e 0 for, puede ocasionar errores por desplazamiento ea uno. Utilizar comas en lugar de puntos y comas en un encabezado for, es un error de sintaxis. Colocar un punto y coma inmedistamente a la derecha del paréntesis de un encabezado ox, convierte el cuerpo de dicha instruccion en una instruccién vacia. Por lo general, éste es un error légico. Olvidar una instruccion break cuando es necesaria en una instruccién switch, es un error légico. No procesar caracteres de nueva linea en la entrada, cuando se leen caracteres uno a uno, puede ocasionar errores ligicos. ‘Cuando la condicidn de continuacién de ciclo de una instruccion while, for 0 do...wni.1e nunca se vuelve falsa, ‘@ provoca un ciclo infinito, Para prevenir esto, asegirese de que no hay un punto y coma inmediatamente despuss del encabezado de una instruccién whd.Le 0 de una for. En un ciclo controlado por contador, asegirese de que la ‘variable de control se incrementa (o decrementa) en el cuerpo del ciclo, En um ciclo controlad por centinela, ase- ‘girese de que el valor centinela se introduce en algiin momento, Utilizar cl operador == para una asignacién, o utilizar cl operador = para una igualdad, es un error ldgico. Encuentre el error en cada uno de los siguientes segmentos de cédigo, y explique cémo corregirlos. a) x = 1; while ( x <= 10 ); xt; ) b) for ( y = -1; y 1= 1.0; y += 1) print£( “8f\n", y ); c) switch (n) { cas printf£( “El numero es 1\n” ); case 2: print£( “El namero es 2\n” ); break; default: print£( “El nimero no es 1 0 2\n" ); break; 4.4 a) Error: el punto y coma después del encabezado de whi Le ocasiona un ciclo infinito. Correccién: reemplace el punto y coma por una {, 0 climine tanto el ; como la). 'b) Error: utilizar un nimero de punto flotante para controlar una instruccién de repeticién for. Correccién: utilice un entero y realice el calculo adecuado para obtener los valores que desea. for ( y = 1; y != 10; y+t ) print£( “a£\n", ( float ) y / 10 ); ©) Error: olvidar la instruccién break en las instrucciones para el primer case. Correccién: afiada un break al final de las instrucciones del primer case, Observe que esto no necesariamente ‘es um error, siel programador quiere que la instruccién del ease 2 se cjecute cada ve7 que cl ease 1 se eject to EJERCICIOS 4.5 Encuentre el error en cada uno de los siguientes ejercicios (Nota: Puede haber mis de un errar): a) for ( x = 100, x >= 1, xt+ ) print£( “#d\n", x ); for ( int x = 100; x >= 1: x- ){ printf( "sd\n ", x); ) b) El siguiente eédigo debe imprimir si un entero es par o imp: switch ( valor #2) { case 0: printf( “Entero par\n” ); case 1: print£( “Entero impar\n” ); y int valor = 27 switch ( valor $2) { case 0: print£( "Entero par\n" ); break; ease 1: printf£( "Entero impar\n" break: e) El siguiente cédigo debe desplegar los enteros impares de! 999 al 1: for ( x = 999; x>= 1; x += 2) printf£( “td\n", x ); for { int x = 999; u>= 1; x -= 2 ){ print£({ "sd\n", x ): r £) El siguiente cédigo debe desplegar los niimeros pares del 2 al 100: contador = 2; Do { if ( contador % 2 == 0 ) printf( “ad\n”, contador ); contador += 2; } While ( contador < 100 ); int contador do { if ( contador #2 = 0 jf print£( "td\n", contador ); 23 } contador += 2; } while ( contador < 100 ); ERRORES COMUNES DE PROGRAMACION 5.1 5.2 5.3 54 5.5 5.6 5.7 5.8 59 57 Omitir tipo-valor-retomo en una definicién de funcién es un error de sintaxis si el protetipo de la funcién especi- fica un tipo diferente a int. Olvidar devolver un valor desde la fincién cuando se supone que se debe retomar alguno, puede provocar errores inespetados, El C estindar establece que el resultado de esta omisién es indefinido. Devolver un valor desde una funcién, con un tipo de retomo void, es un error de sintaxis. Especificar los parémetros de la funcién del mismo tipo como double x, y, en lugar de hacerlo como double x, double y. podria provocar errores en sus programas. La declaracién de pardmetros como double x, y. en rea- lidad hard que y sea un parimetro de tipo int, ya que int es el tipo predeterminado, Colocar un punto y coma después del paréntesis derecho que encierra la lista de parametros de la definicién de una funcién, es un error de sintaxis. Definir otra vez un parimetro de funcién como una variable local dentro de la funcién, ¢s un error de sintaxis. Definir una fumeién dentro de otra funcién es un error de sintaxis. Olvidar el punto y coma al final del prototipo de la funcién, es un error de sintaxis. Convertir un tipo de dato de mayor nivel en la jerarquia & uno de menor nivel, puede modificar el valor del dato. Encuentre el error en cada uno de los segmentos de programa y explique como puede corregir dicho error (vea tam- bign el ejercicio 5.50): a) int g( void ) { printf( “Dentro de la funcion g\n” }; int h( void ) ( print£( “Dentro de la funcién h\n” ); , } b) int suma( int x, int y ) t int resultado; resultado = x + yi } ©) int suma( int n ) on oy return 0; else n+ suma(n- 1), , d) void £( float a); { float at printf( “8£", a 7 } 57 a) by d) 2 printf( “Introduzca tres enteros: ” ) scant( “tdsdid", ga, ub, &C ); resultado = 2 * b+ cf printr( “El resultado es 2d", resultado ); return resultado; ror: la funcién h esté definida en la funcién g. Correceién: mueva la definicién de h fuera de la definicién de g. Error: se supone que el cuerpo de la funcién debe retornar wn entero, pero no lo hace. Correccién: elimine la variable resultado y coloque la siguiente instruccién en la funcién, return x + y; Error: no devuelve el resultado den + suma(n -1 ) ; suma devuelve un resultado incorrecto. Correccién: rescriba la instrucci6n en la eldusula else como return n + suma( n= 1); Error: el punto y coma después del paréntesis derecho que encierra la lista de parimeiros, y la redefinicién del parimetro a en la definicién de la fancién. Correccién: climine el punto y coma despues del paréntesis derecho de la lista de parimetios, y elimine la de- claracién £10at a; del cuerpo de la funcién. Error: la funcién devuelve un valor cuando no deberia. Correccién: elimine la instruccién return, ERRORES COMUNES DE PROGRAMACION 61 62 63 64 65 66 67 68 69 Es importante notar la diferencia entre el “séptimo elemento del arreglo” y el “elemento siete del arreglo”. Debido a que los subindices de los arreglos comienzan en 0, el “séptimo elemento del arreglo” tiene un subindice de 6, ‘mientras que “el elemento siete del arreglo” tiene un subindice de 7 y, en realidad, es el octavo elemento del arre- glo. Esta es una fuente de “errores de desplazamiento en uno”. Olvidar inicializar los elementos de un arregio, cuyos elementos debieran inicializarse. Proporcionar mas inicializadores en una lista de inicializacién que elementos en el arreglo, es un error de sintaxis, Finalizar una directiva de preprocesador #define 0 #incLude con un punto y coma. Recuerde que las directi- vas de preprocesador no son instrucciones de C. Asignar un valor a una constante simbélica en una instruccién ejecutable, es un error de sintaxis. Una constante simbética no es una variable. EI compilador no reserva espacio alguno para ella, como lo hace con las variables {que contienen valores en tiempo de ejecucién. Hacer referencia a un elemento que se encuentra fuera de los limites del arreglo. No proporcionarle a scanf un arreglo de caracteres lo suficientemente grande para almacenar una cadena escrita mediante el teclado, puede ocasionar la destruecién de los datos de un programa y otros erzores en tiempo de eje- cucién. Suponer que los elementos de un arreglo local static se inicializan en cero cada vez que se llama a la funcién enla que el arreglo esta declarado. Hacer referencia a un elemento de un arreglo con dos subindices de la forma af x, y ], en lugar de hacerlo de la forma at x1 Cy 1. 6.5 Encuentre el crror en cada uno de los siguientes segmentos de programa y corrija a) #define TAMANIO 100; b) TAMANIO = 10; ©) Suponga queint bE 10] = {0}, 4 for ( br 1; d) #inelude ; c) Supongaqueint at 2102] = 41,23, 13, 4097 10; i++ ) i i 1 all, l1=5; f) #define VALOR = 120 65 84 a) b) ad a) Error: punto y coma al final de la directiva de preprocesador #define. Correccién: eliminar el punto y coma. b) Error: asignar un valor a una Constante simbélica mediante una instruccién de asignaciéa. Comeccién: asignar un valor a la constante simbdlica en una directiva de preprocesador #define, sin utilizar cel operador de asignacién como en #define TAMANIO 10. c) Error: hacer referencia a un elemento del arreglo fuera de los limites del arreglo (b [10] ). Comeccién: modifique el valor final de la variable de control a 9. 4) Error: punto y coma al final de la directiva de preprocesador #incLude. Correccién: elimine el punto y coma. e) Error: subindices incorrecios en el arreglo. Correccién: modifique la instruccion a al 1] [1] =5; ) Error: asignar un valor a una constante simbélica mediante una instruceién de asignaciéa. Corteccién: asigne un valor a la constante simbélica en una directiva de preprocesador #define, sin utilizar cel operador de asignacién como en #define VALOR 120. Encuentre ¢! error en cada uno de los siguientes segmentos de programa y explique eémo corregirlos. a) char s[ 10 ]; strnepy( s, “hola”, 4 ); printf( “ts\n", s ); b) print£( “as”, ‘a’ ); ¢) char s[ 17 ]; strepy( s, “bienvenido a casa” ); d) if ( stremp( cadenal, cadena2 ) ) printf( “Las cadenas son iguales \n” ); Error: la funcién strnepy no escribe el caricter de terminacién nulo para el arreglo s, debido a que el tercer argumento es igual a Ia longitud de la cadena “hola” Correccién: haga el tercer argumento de strnepy igual a 5, o asigne el caricter nulo ‘\0/ as 5] Error: intentar imprimir una constante de cardcter como una cadena. Correccién: utilice %e para desplegar el cardcter, o remplace ‘a’ con Ya”. Error: el arreglo de caracteres s no es lo suficientemente largo para almacenar el caricter de terminacién nulo, Correccitin: declare el arreglo con més elementos. Error: la funcién stomp devuelve 0 si las cadenas son iguales; por lo tanto, la condicién en la instrucciin 4 es falsa y no se ejecutara la instruccién prints. Correccién: en la condicién, compare ¢l resultado de stzemp con 0.

You might also like