jueves, 26 de abril de 2012

Estructuras de Control en C: La instrucción switch

Supongamos de nuevo que tenemos una lista con las calificaciones de un grupo de alumnos. Las calificaciones son números enteros entre 0 y 10. Usted necesita recibir las calificaciones e imprimirlas en la pantalla. Para esto puede usar la sentencia if.Sin embargo, el lenguaje C proporciona una instrucción más adecuada para éste tipo de casos en los cuales las opciones no se limitan a dos casos excluyentes: la instrucción switch. Para familiarizarse con ella es útil el siguiente programa. Es necesario escribirlo y ejecutarlo.

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++
 *                                                    *
 *    ESTE PROGRAMA RECIBE UN NUMERO DEL USUARIO Y    *
 *    DECIDE E IMPRIME SI ES 0, 1, 2,.....10          *
 * +++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 *                                                                        *
 *                                ALGORITMO:                              *
 * Pedir un numero al usuario                                             *
 * Recibir el numero                                                      *
 *                                                                        *
 * Si el numero es 0:                                                     *
 *     Imprime 'El numero es 0'                                           *
 * Si el numero es 1:                                                     *
 *     Imprime 'El numero es 1'                                           *
 * Si el numero es 2:                                                     *
 *     Imprime 'El numero es 2'                                           *
 * .............................                                          *
 * .............................                                          *
 * .............................                                          *
 * Si el numero es 10:                                                    *
 *     Imprime 'El numero es 10'                                          *
 *                                                                        *
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
 #include <stdio.h>
 
 int main()
 {        /* Abre main */

 int calificacion;
 printf("\nPor favor introduzca la calificacion del alumno: ");
 scanf("%d", &calificacion);
 
 switch(calificacion)
 {    /*Abre switch */
 case 0: 
 printf("\nLa calificacion es 0.\n");
 break;

 case 1:
 printf("\nLa calificacion es 1.\n");
 break;

 case 2: 
 printf("\nLa calificacion es 2.\n");
 break;

 case 3: 
 printf("\nLa calificacion es 3.\n");
 break;
 
 case 4: 
 printf("\nLa calificacion es 4.\n");
 break;
 
 case 5: 
 printf("\nLa calificacion es 5.\n");
 break;
 
 case 6: 
 printf("\nLa calificacion es 6.\n");
 break;
 
 case 7: 
 printf("\nLa calificacion es 7.\n");
 break;

 case 8: 
 printf("\nLa calificacion es 8.\n");
 break;

 case 9: 
 printf("\nLa calificacion es 9.\n");
 break;

 case 10: 
 printf("\nLa calificacion es 10.\n");
 break;

 default:
 printf("\nLa calificacion no es valida.\n");
 break;
 }    /* Cierra switch */

 return 3; //Main retorna un entero
 }        /*Cierra main */

--------------------------------------------------------------------------------------------------------------------------------
Ahora hagamos un análisis del programa línea por línea para revisar cada instrucción.


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++
 *                                                    *
 *    ESTE PROGRAMA RECIBE UN NUMERO DEL USUARIO Y    *
 *    DECIDE E IMPRIME SI ES 0, 1, 2,.....10          *
 * +++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 *                                                                        *
 *                                ALGORITMO:                              *
 * Pedir un numero al usuario                                             *
 * Recibir el numero                                                      *
 *                                                                        *
 * Si el numero es 0:                                                     *
 *     Imprime 'El numero es 0'                                           *
 * Si el numero es 1:                                                     *
 *     Imprime 'El numero es 1'                                           *
 * Si el numero es 2:                                                     *
 *     Imprime 'El numero es 2'                                           *
 * .............................                                          *
 * .............................                                          *
 * .............................                                          *
 * Si el numero es 10:                                                    *
 *     Imprime 'El numero es 10'                                          *
 *                                                                        *
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

Estas líneas son un par de comentarios. Los comentarios vienen encerrados dentro de /* y */. El segundo comentario es el algoritmo en seudocódigo del programa.

#include <stdio.h>

¿Y si no incluímos esta línea? Incluso es posible que no pase nada. Mi compilador (cc) envía el siguiente mensaje cuando la omito:

Switch.c: In function ‘main’:
Switch.c:33:2: warning: incompatible implicit declaration of built-in function ‘printf’
Switch.c:34:2: warning: incompatible implicit declaration of built-in function ‘scanf’

El mensaje es una advertencia, pero el ejecutable se crea a pesar de todo.
Muchos compiladores optimizados tratan de corregirle la plana a los programadores. Colocan variables muy frecuentemente usadas en el programa en registros para mejorar el desempeño, envían mensajes de advertencia cuando la notación es obsoleta e incluyen automáticamente el encabezado <stdio.h> Sin embargo no todos los compiladores pueden hacer estas tareas, y por lo demás podrían no estar obligados, así que siempre será mejor escribir un buen código desde el principio. Además el compilador no puede tomarse tantas libertades porque podría ser que el programador realmente quiera hacer exactamente lo que el programa dice.

int main()
 {        /* Abre main */

La primera línea indica que se abre la función main, la cual retorna un entero (int) y además no recibe nada. La forma de los encabezados de función es la siguiente:

<tipo de retorno> Nombre_DeFunción(<tipo que recibe>)

Si la función no recibe ningún tipo de datos, entonces el paréntesis puede quedar en blanco.

int calificacion;
printf("\nPor favor introduzca la calificacion del alumno: ");
scanf("%d", &calificacion);
 

Lo que hacen estas tres líneas ya es conocido: printf imprime un mensaje que pide un número al usuario, scanf recibe ese número y lo asígna a la variable calificacion. Antes de usar la variable calificación tuvimos que declararla; se hizo en la línea de arriba. int es el tipo de datos, calificacion es el nombre de la variable.

switch(calificacion)

Por primera vez aparece la instrucción switch. La forma general de esa estructura de control es la siguiente:

switch( entero )
{           
  case numero1:
   instrución 1
   instrución 2
   .......... .
   .......... .
   instrución n
   break;
   
  case numero2:
   instrución 1
   instrución 2
   .......... .
   .......... .
   instrución n
   break;
   
  .............
  .............
  .............
  .............
  
  case numeroN:
   instrución 1
   instrución 2
   ............
   ............
   break;
   
  default:
   instrución 1
   instrución 2
   .......... .
   .......... .
   instrución 3
  break;
 
}

entre paréntesis () debe aparecer una variable de tipo entero, la cual se va a evaluar. En nuestro caso es la variable calificacion.

{    /*Abre calificacion */

El cuerpo de la instrucción switch debe estar limitado por corchetes {} Conforme escribe instrucciones anidadas sus códigos tendrán cada vez más corchetes, esta es la razón por la cual es conveniente anotar, mediante un comentario, a qué cuerpo de instrucciones corresponde cada uno de ellos.

case 0: 
printf("\nLa calificacion es 0.\n");
break;

La instrucción switch contiene varias etiquetas llamadas case que analizan cada uno de los valores posibles de la variable califiación. El primero de los valores que analiza es el 0, sin embargo esto es totalmente arbitrario, se puede poner cualquier número con la única condición de que sea entero. Más adelante también veremos cómo trabajar con variables tipo char. En un condicional if, la condición se evalúa como 'verdadero' o 'falso', se dice que la condición toma un valor booleano. La instrucción switch, en cambio, evalúa un entero. Una etiqueta case n inicia el cuerpo de instrucciones que habrán de realizarse en el caso de que el número evaluado sea igual a n.
La primera etiqueta es case 0: Después del número, siempre van2 puntos (:) Esos dos puntos indican el inicio del cuerpo de instrucciones. Para este caso, el cuerpo solamente incluye a la función printf. Sólo se imprime el mensaje "La calificación es 0" y se coloca el cursor en la siguiente línea.
La siguiente instrucción es la palabra reservada break. El lenguaje de programación C se reserva el uso de algunas palabras como identificadores internos, por lo cual no podrán ser usadas por el usuario como nombres de variables. A lo largo del curso las iremos revisando. Por lo pronto puede ver la entrada Palabras reservadas del lenguaje C para familiarizarse con ellas. break indica el final del cuerpo de instrucciones para la etiqueta case 0.

case 1:
printf("\nLa calificacion es 1.\n");
break;

La estructura de esta, y las siguientes líneas es idéntica a la analizada arriba para el caso 0. Sólo se usa la etiqueta case con los argumentos 1, 2, 3,...10.
La instrucción break altera el control del programa. Si se suprime en alguna de las etiquetas case, y la condición de esa etiqueta se cumple, se ejecuta no sólo el cuerpo de esa etiqueta, sino el de la(s) subsecuente(s) hasta la aparición de una instrucción break. Por ejemplo, si se omite el break correspondiente a case 4: y el número analizado es efectivamente 4, el programa imprime los mensajes "La califiación es 4" y "La calificación es 5", que es la que se encuentra justo antes del siguiente break. Para evitar errores es necesario crearse la buena costumbre de escribir un break cada que se escribe una etiqueta case antes de escribir las instrucciones. Mas adelante volveremos sobre esta instrucción de control.

default:
printf("\nLa calificacion no es valida.\n");
break;

switch también incluye una etiqueta llamada default. Como su nombre lo indica, la etiqueta default reune todos los casos que no se hayan analizado en las instrucciones case. Por ejemplo, en nuestro programa, estamos suponiendo que el usuario introducirá números entre 0 y 10, sin embargo, si se intoduce un número entero fuera de ese rango, el programa imprime el mensaje después de default: "La calificacion no es valida". default puede colocarse dentro de switch en cualquier lugar, y siempre realiza la tarea de evaluar los casos no contenidos en las etiquetas case, sin embargo, por claridad debería incluirse sólo al final; la istrucción también incluye un break, si bien no es estrictamente necesario, ya que el control del programa se termina con el final de switch, sin embargo, por simetría, es bueno incluir siempre también una instrucción break. Si usted coloca default antes del final, y no coloca el break correspondiente, se ejecutarán las instrucciones que siguen en orden de aparición hasta el la siguiente instrucción break. No complique los programas. Recuerde que un programa bien escrito es más fácil de depurar y modificar que uno mal escrito.

}    /* Cierra switch */

Esta llave derecha cierra el cuerpo de switch y así lo indica el comentario correspondiente.

return 3; //Main retorna un entero

Esto no es un error. La función main retorna un entero, esto es lo que dice el encabezado, sin embargo no se especifica qué entero. Por convención siempre se retorna 0, pero ese número puede sustituirse por cualquier otro. Cuando revisemos las funciones quedará más claro este punto. Por lo pronto siga retornando 0 en la función main.

}        /*Cierra main */

Finalmente, esta llave derecha cierra el cuerpo de main y con ello termina el programa. Así lo indica el comentario final.

______________________________________________________________________________
Lo que aprendió:
La estructura de control switch
El uso de las etiquetas case
El uso de la etiqueta default
El uso de la instrucción break
______________________________________________________________________________
Esta página forma parte del Curso de C Con Programas Explicados Línea Por Línea
Índice
Entrada Anterior
Entrada Siguiente

jueves, 19 de abril de 2012

Estucturas de Control en C: Los Condicionales if y else

C es un lenguaje de programación estructurado. Esto quiere decir que en sus programas el orden en el cual se ejecutan las instrucciones es, por defecto, el orden en el que aparecen. En los programas que hemos visto hasta ahora así ha sido. Esto puede parecer obvio de entrada, pero no lo es. Algunos lenguajes de programación no son estructurados, lo cual dificulta la lectura del código y su mantenimiento; además los programas de esos lenguajes son más susceptibles de contener errores difíciles de detectar. No obstante lo anterior, una de las principales tareas de un programa de computadora es la toma de decisiones. Imagine que escribe una aplicación para evaluar el desempeño de sus alumnos de programación. Las opciones son solamente dos: Aprobado o Reprobado. Para esto tiene una lista de las calificaciones de los exámenes finales. Para cada uno de sus alumnos tendrá que recibir la calificación y tomar una decisión: si es mayor a 6, imprime 'Aprobado', de lo contrario imprime 'Reprobado'. El código deberá contener las instrucciones que hay que llevar a cabo si la el alumno obtuvo más de 6 y también deberá contener las instrucciones para el caso en el que reprueba. Alguno de ese grupo de instrucciones estará primero que el otro en el orden de aparición. Sin embargo, sólo debe realizarse uno. La instrucción if hace que el programa no realice cierto grupo de instrucciones y transfiere el control justo a las instrucciones siguientes. Para delimitar exactamente qué instrucciones se evitarán, el cuerpo de if se limita generalmente con unas llaves {}. Esto quedará más claro con el siguiente programa: Copie, pegue, compile y ejecute:


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++
   *                                                      *
   *  ESTE PROGRAMA RECIBE TRES NUMEROS ENTEROS Y DECIDE  *
   *  EN CADA CASO SI:                                    *
   *  EL NUMERO ES POSITIVO                               *              
   *  EL NUMERO ES POSITIVO O NEGATIVO                    *
   *  EL NUMERO ES POSITIVO, NEGATIVO O CERO              *
   *                                                      *
   *  LO QUE RECIBE:                                      *
   *  TRES NUMEROS ENTEROS                                *
   *                                                      *
   *  LO QUE HACE:                                        *
   *  IMPRIME EN CADA CASO SI EL NUMERO ES:               *
   *  POSITIVO                                            *
   *  POSITIVO O NEGATIVO                                 *
   *  POSITIVO, NEGATIVO O CERO                           * 
   *++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

  /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   *                                                                    *
   *                              ALGORITMO:                            *
   *  Pedir un numero al usuario                                        *
   *  Recibir el numero                                                 *
   *    Si el numero recibido es mayor que 0                            *
   *    Imprimir "El numero es positivo                                 *
   *                                                                    *
   *  Pedir un numero al usuario                                        *
   *  Recibir el numero                                                 *
   *                                                                    *
   *    Si el numero recibido es mayor que 0                            *
   *         Imprimir "El numero es positivo                            *
   *    De lo contrario                                                 *
   *         Imprimir "El numero no es positivo                         *
   *                                                                    *
   *                                                                    *
   *  Pedir un numero al usuario                                        *
   *  Recibir el numero                                                 *
   *                                                                    *
   *    Si el numero recibido es mayor que 0                            *
   *         Imprimir "El numero es positivo                            *
   *    De lo contrario                                                 *
   *         Si el numero es menor que 0                                *
   *            Imprimir "El numero es negativo                         *
   *         De lo contrario                                            *
   *            Imprimir "El numero es 0"                               *
   *                                                                    *
   **********************************************************************/

 #include <stdio.h>
 
 int main()
 {  /* Abre main */
 int numero;
 printf("\nPor favor introduzca un numero entero: ");
 scanf("%d", &numero);

 if ( 0 < numero )
 /* Es una buena practica de programacion hacer las comparaciones de esta forma*/
 printf("\nEl numero que introdujo es positivo\n ");

 printf("\nPor favor introduzca de nuevo un numero entero: ");
 scanf("%d", &numero);
 
 if ( 0 < numero )
 printf("\nEl numero que introdujo es positivo\n ");
 else
 printf("\nEl numero que introdujo no es positivo\n ");

 printf("\nPor favor introduzca de nuevo un numero entero: ");
 scanf("%d", &numero);
  
 if ( 0 < numero )
 printf("\nEl numero que introdujo es positivo\n ");
 else
 if ( 0 > numero )
 printf("\nEl numero que introdujo es negativo\n ");
 else
 printf("\nEl numero que introdujo es 0\n");
 
 printf("\nHasta pronto!\n");
 
 return 0;
 }  /* Cierra main */


Ahora hagamos un análisis del programa línea por línea para revisar cada instrucción.



/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++
   *                                                      *
   *  ESTE PROGRAMA RECIBE TRES NUMEROS ENTEROS Y DECIDE  *
   *  EN CADA CASO SI:                                    *
   *  EL NUMERO ES POSITIVO                               *              
   *  EL NUMERO ES POSITIVO O NEGATIVO                    *
   *  EL NUMERO ES POSITIVO, NEGATIVO O CERO              *
   *                                                      *
   *  LO QUE RECIBE:                                      *
   *  TRES NUMEROS ENTEROS                                *
   *                                                      *
   *  LO QUE HACE:                                        *
   *  IMPRIME EN CADA CASO SI EL NUMERO ES:               *
   *  POSITIVO                                            *
   *  POSITIVO O NEGATIVO                                 *
   *  POSITIVO, NEGATIVO O CERO                           * 
   *++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

Estas líneas, encerradas por los caracteres /* */ son un comentario. Los comentarios ayudan a documentar el programa. No está de más remarcar la importancia de esto. Con una simple mirada a este recuadro usted, o cualquier lector del código, sabe de manera general qué hace el programa. Se incluye lo que se pide del usuario lo que el programa hace. Estas líneas son prescindibles para el programa, pero no lo son tanto para el programador. Sin embargo no es necesario incluirlas.

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   *                                                                    *
   *                              ALGORITMO:                            *
   *  Pedir un numero al usuario                                        *
   *  Recibir el numero                                                 *
   *    Si el numero recibido es mayor que 0                            *
   *    Imprimir "El numero es positivo                                 *
   *                                                                    *
   *  Pedir un numero al usuario                                        *
   *  Recibir el numero                                                 *
   *                                                                    *
   *    Si el numero recibido es mayor que 0                            *
   *         Imprimir "El numero es positivo                            *
   *    De lo contrario                                                 *
   *         Imprimir "El numero no es positivo                         *
   *                                                                    *
   *                                                                    *
   *  Pedir un numero al usuario                                        *
   *  Recibir el numero                                                 *
   *                                                                    *
   *    Si el numero recibido es mayor que 0                            *
   *         Imprimir "El numero es positivo                            *
   *    De lo contrario                                                 *
   *         Si el numero es menor que 0                                *
   *            Imprimir "El numero es negativo                         *
   *         De lo contrario                                            *
   *            Imprimir "El numero es 0"                               *
   *                                                                    *
   **********************************************************************/

Este recuadro también es un comentario. De hecho se trata del algoritmo en seudocódigo del programa. Explica paso a paso qué hace el programa. Si usted quiere, puede convertir este seudocódigo a un programa en cualquier lenguaje, ya que no está limitado por particularidades del lenguaje C. También es prescindible y podría no estar. Sin embargo, es muy importante para que el lector sepa exactamente de qué va el algoritmo y pueda apreciar sus virtudes y sus defectos. De otra forma se deja al lector la tarea de leer y entender el programa leyéndolo en C, lo cual no es conveniente. C está pensado para ser leído por una máquina, no por un humano. El científico de la computación Donald Knuth escribió esta frase que, sacada un poco de contexto se puede aplicar aquí: "tenemos que cambiar la tradicional actitud ante la construcción de software. En vez de pensar que nuestra principal tarea es indicar a una computadora qué hacer, concentrémonos en explicar a las personas lo que queremos que la computadora haga".

#include <stdio.h>

Esta línea indica que usaremos la entrada y salida estándar con las funciones printf y scanf.

int main()
 {  /* Abre main */

La primera línea declara el tipo de datos que regresa main y además indica que no recibe ningún dato.
El cuerpo de main está limitado por llaves. { indica el inicio del cuerpo de main, tal como lo indica el comentario

int numero;

Antes de recibir una variable (un número, un carácter, una cadena) de parte del usuario es necesario declarar la existencia de dicha variable. Esto reserva memoria para guardarla. Es necesario especificar el tipo de datos que vamos a recibir. En este caso se trata de un entero (int).

printf("\nPor favor introduzca un numero entero: ");

La función printf sirve para imprimir o enviar datos como salida. En este caso lo que se envía es el mensaje "Por favor introduzca un numero entero".

scanf("%d", &numero);

La función scanf recibe un entero ( indicado por los caracteres %d) y lo asigna a la variable numero.

if ( 0 < numero )

La instrucción if es un condicional. Su significado es el mismo que en inglés (si). if requiere de una condición lógica que pueda evaluarse como 'falso' o 'verdadero'. Esa condición lógica debe ir encerrada entre paréntesis ().
Dentro de los paréntesis también hay algo nuevo. El operador de relación < cuyo significado es el mismo que en aritmética: menor que. Así que el cuerpo de if se realiza sólo si la condición encerrada entre paréntesis es verdadera. En este caso sólo si 0 es menor que la variable número. El cuerpo de if es, por defecto, la sentencia justo después del enunciado if(condición). Si queremos que se realice más de una instrucción, debemos encerrar ese bloque con llaves {}:
if ( condición )
{
Instrucción 1
Instrucción 2
....
....
Instrucción n
}

Los operadores relacionales están presentados abajo en la siguiente tabla:

Operadores de relación:

 >                    Mayor que
 <                    Menor que 
 ==                   Igual
 >=                   Mayor o Igual que
 <=                   Menor o Igual que

Los operadores mayor que > y menor que < son los mismos que en aritmética y por lo tanto son ya familiares. El operador de igualdad sí es distinto. Anteriormente hemos visto el operador de asignación = que toma el valor de la derecha y lo asigna a la variable de la izquierda. Doble igual == no realiza una asignación sino una COMPARACIÓN. Algunos problemas pueden surgir sí se confunden estos operadores (y es algo que pasa con mucha frecuencia), así que hay que tener cuidado para no confundirlos. Mayor o igual >= y menor o igual <= son también un poco distintos a los símbolos aritméticos, pero es relativamente fácil recordarlos.

/* Es una buena practica de programacion hacer las comparaciones de esta forma*/

Esta línea hace referencia a la forma en que colocamos la condición dentro de los paréntesis de if. Hay dos maneras de escribir la condición 'número es mayor que o'. La primera es esta:

if ( numero > 0 )

Que lo expresa directamente, 'número es mayor que 0', en tanto que la segunda es esta:

if ( 0 < numero )

Que lo expresa al revés, '0 es menor que número'.
Cualquiera de las dos formas es correcta. Sin embargo, suponga que la condición es 'numero es igual a tres'. En este caso escrita en lenguaje C la condición sería:

if ( numero == 3 )

La instrucción es totalmente correcta. Sin embargo, es un error muy común, que el programador omita un = en ==, escribiendo una instrucción ligeramente distinta:

if ( numero = 3 )

Ese problema no es reportado por el compilador, porque no es un error de sintaxis, es un error de lógica. En la práctica también resulta un error muy difícil de detectar a través de leer el código. Lo que ocurre, es que en lugar de una comparación se realiza una asignación. El valor de la derecha (3 en este caso) se asigna a la variable de la izquierda (numero) y después se evalúa la condición. Sin embargo, el condicional if sólo puede tener 2 valores: 'verdadero' (1) o 'falso' (0). El compilador de C considera verdadero todo lo que no sea falso. Así que en este caso, como el valor de la condición es 3 (el valor de la variable una vez realizada la asignación). Lo que está haciendo el programador es cambiar el valor de la variable, en tanto que el compilador toma la condición como 'verdadera' y el cuerpo del if se ejecuta siempre. Tan común es este problema que Niklaus Wirth, creador del lenguaje de programación Pascal (lenguaje pensado para estudiantes), para evitar que sus alumnos lo cometieran, estableció las asignaciones como:=, y las comparaciones con =, de forma que el natural = sirviera de comparación y el antinatural := obligara a pensar antes de ser usado. Todo esto se puede evitar fácilmente si se crea la buena costumbre de escribir los condicionales no como (numero = 3) sino como

if ( 3 == numero )

ya que, en caso de que se omita un = en la condición, el compilador mandará un mensaje de error, ya que las asignaciones en C se hacen de derecha a izquierda, y no de izquierda a derecha. Este consejo, con un ejemplo paso a paso, y otros consejos pueden encontrarse en esta liga: Consejos para programar. Fórmese desde ahora el hábito de escribir los condicionales de esta manera y evítese problemas en el futuro.

printf("\nEl numero que introdujo es positivo\n ");

Atención: Ésta línea sólo se imprime si la condición anterior se evalúa como 'verdadera' o 'true'. De lo contrario se omite. Esta es una forma de transferir el control del programa, en este caso a la instrucción siguiente. Si el número introducido es 0, o negativo, entonces no ocurre nada en el programa.

printf("\nPor favor introduzca de nuevo un numero entero: ");
scanf("%d", &numero);
 

Este par de líneas no contienen nada que no hayamos visto ya: se pide y se recibe un número del usuario.

if ( 0 < numero )
printf("\nEl numero que introdujo es positivo\n ");
  

Estas dos líneas son exactamente las mismas de arriba, primero evaluamos si el entero es positivo. Si esta condición (y sólo es cierta) se realiza la siguiente instrucción o conjunto de instrucciones limitadas por llaves. En este caso es sólo una instrucción simple.

else

La instrucción else indica lo que el programa hará en caso de que la condición no sea cierta. La estructura de la condición if - else es la siguiente:

if ( condición )
{
 instrucción 1
 instrucción 2
 .........   .
 .........   .
 .........   .
 instrucción n
}

else
{  
 instrucción 1
 instrucción 2
 ..........  .
 ..........  .
 ..........  .
 instrucción n
}

El programa realiza el cuerpo de instrucciones de if si la condición es verdadera, en tanto que realiza el cuerpo de instrucciones de else si la condición es falsa. else sólo aparece después de if en un programa.
En nuestro caso, si la condición de if no se cumple, es decir, si 0 > numero, entonces se realiza la siguiente instrucción:

printf("\nEl numero que introdujo no es positivo\n ");

Lo único que podemos decir del número es que no es positivo.


printf("\nPor favor introduzca de nuevo un numero entero: ");
scanf("%d", &numero);

De nuevo la misma petición al usuario y el almacenamiento del número entero en la variable numero.


if ( 0 < numero )
printf("\nEl numero que introdujo es positivo\n ");

Y de nuevo la misma acción para el caso en el que el número sea positivo.

else

De lo contrario, es decir, si el número no es positivo, entonces se ejecutan las siguientes instrucciones:

if ( 0 > numero )
printf("\nEl numero que introdujo es negativo\n ");
else
printf("\nEl numero que introdujo es 0\n");

Estas líneas son todas el bloque de instrucciones que corresponden al else anterior. Se trata de una instrucción if-else anidada dentro del else del primer if. La estructura es la siguiente:

if (condición 1)
{ 
 instrucción 1
 instrucción 2
 .............
 .............
 instrucción n
}
else
{
  if(condición 2)
  { 
  instrucción anidada 1
  instrucción anidada 2
  ........... ....... .
  ........... ....... .
  instrucción anidada n
  }
}

A menos que se usen llaves, {}, el compilador de C asigna un else con el if inmediatamente anterior. Para evitar algún tipo de confusión es conveniente usar llaves aún cuando no sea necesario.
Así pues, si el número no es negativo quedan dos opciones: o bien es cero o bien es negativo. Estas dos posibilidades se consideran en el if-else anidado. Si 0 es mayor que el número, entonces el número es negativo, y se ejecuta el cuerpo del if anidado (se imprime el mensaje "el número que introdujo es negativo"). De lo contrario, el número tiene que ser cero. En ese caso se tendrá que ejecutar la instrucción en el cuerpo de if (se imprime el mensaje "el número que introdujo es 0".)

printf("\nHasta pronto!\n");

Esta instrucción despide al usuario, indicando el final del programa.

return 0;

La instrucción return 0; indica el fin del programa. La función main puede retornar cualquier entero. Puede modificar este programa para poner 23 o 65 o cualquier entero en esta instrucción y será correcto.

}  /* Cierra main */

Se cierra el cuerpo de main y un comentario lo indica así.
_____________________________________________________________________________
Lo que aprendió:
El orden por defecto en que se realizan las instrucciones de un programa en C.
Los operadores de relación.
El uso de la instrucción if para transferir el control del programa.
El uso de la instrucción if-else como una transferencia anidada del control del programa.
______________________________________________________________________________
Esta página forma parte del Curso de C Con Programas Explicados Línea por Línea
Índice
Entrada Anterior
Entrada Siguiente

martes, 17 de abril de 2012

¡Mi blog ha desaparecido!

Bueno, esa fue la noticia con la cual me levanté hace ya algún tiempo, dos meses más o menos. Por alguna razón mis blogs de blogspot, mi cuenta de correo en gmail y mis páginas de picassa y google+ no estaban disponibles. Simplemente habían desaparecido, lo cual fue bastante frustrante. Después de todo, la razón por la cual abrí este blog fue para guardar mis programas y evitar que de nuevo se perdieran como me había sucedido cuando los almacenaba en discos duros. Pero a mí simplemente me aparecía un mensaje como este:
Traté de entrar a mi siguiente blog y tampoco pude hacerlo. Desde luego pensé que había perdido todo.  Tampoco pude entrar a mi correo. Sin embargo en este punto tuve la opción de enviar mi número de teléfono para recibir una contraseña de seguridad a través de él. Afortunadamente esto funcionó. Acababa de enviar mi número de celular cuando recibí una llamada bastante impersonal (una grabación en inglés) que me daba un código. Exactamente ese código fue el que introduje y fue entonces cuando pude entrar al correo y a mi blog. Las visitas habían sido nulas en todo el tiempo en que estuvo fuera pero todo estaba bien. 
La razón por la cual el blog y todas mis cuentas fueron bloqueadas no me ha quedado clara. Lo que creo que pasó es que google supuso que mi cuenta estaba siendo atacada o se estaba tratando de introducir cotraseñas falsas. Lo digo porque google tiene una política de seguridad más o menos fastidiosa. De pronto decide etiquetar a un sitio como contenido peligroso sin que lo sea, o cosas de ese estilo. Lo realmente frustrante con los servicios de google es que nunca hay alguien detrás del logotipo que de la cara en caso de problemas. Tratan de solucionarlo todo a base de clicks y cuestionarios. Supongo que sería demasiado costoso para ellos dar servicio personal a los usurios, pero se agradecería mucho. 
Otro punto que blogger podría mejorar es dar más atención, más plantillas, más actualizaciones para sus blogs. Como usuario de wordpress no ha pasado una semana sin que reciba noticias acerca de una nueva plantilla, consejos sobre publicaciones o actualizaciones en general. La razón de esta diferencia es simple: para google, los blogs son algo accesorio; ellos tienen muchos otros servicios a los cuales les dedican sus esfuerzos. En cambio, wordpress sólo tiene blogs. Sus usuarios tienen a su disposición cientos de plantillas y los blogs más vistos son publicitados directamente en la página de inicio.
Tal vez una forma de minimizar los problemas con el hospedaje de los blogs sea pagar un servicio por el cual alguien tenga que responder, y dejar de estar a merced de lo que decidan los administradores del dominio.

Related Posts Plugin for WordPress, Blogger...