Instrucciones de control en C, Parte 1
Bienvenido a la siguiente entrega de nuestra serie, Fundamentos de C.
Las instrucciones de control nos permiten especificar el flujo de control del programa; es decir, el orden en el que se deben ejecutar las instrucciones de un programa. Permiten tomar decisiones, realizar tareas repetidamente o saltar de una sección de código a otra.
Hay cuatro tipos de declaraciones de control en C:
- Declaraciones de toma de decisiones
- Declaraciones de selección
- Declaraciones de iteración
- Declaraciones de salto
Declaración de toma de decisiones: la Declaración if-else
La declaración if-else se utiliza para llevar a cabo una prueba lógica y luego tomar una de dos acciones posibles el resultado de la prueba (es decir, si el resultado es verdadero o falso).Sintaxis
:
if (condition){ statements} else{ statements}
Si la condición especificada en la instrucción if se evalúa como true, las instrucciones dentro del bloque if se ejecutan y luego el control se transfiere a la instrucción inmediatamente después del bloque if. Incluso si la condición es falsa y no hay ningún otro bloque presente, el control se transfiere a la instrucción inmediatamente después del bloque if.
La parte else solo se requiere si se necesita ejecutar una determinada secuencia de instrucciones si la condición se evalúa como falsa. Es importante tener en cuenta que la condición siempre se especifica entre paréntesis y que es una buena práctica encerrar las sentencias en el bloque if o en el bloque else entre llaves, ya sea una sentencia única o una sentencia compuesta.
El siguiente programa comprueba si el número introducido es positivo o negativo.
#include<stdio.h>int main( ) { int a; printf("n Enter a number:"); scanf("%d", &a); if(a>0) { printf( "n The number %d is positive.",a); } else { printf("n The number %d is negative.",a); } return 0; }
El siguiente programa compara dos cadenas para comprobar si son iguales o no.
#include <stdio.h>#include <string.h>int main( ) { char a , b; printf("n Enter the first string:"); scanf("%s",a); printf("n Enter the second string:"); scanf("%s",b); if((strcmp(a,b)==0)) { printf("nStrings are the same"); } else { printf("nStrings are different"); } return 0; }
El programa anterior compara dos cadenas para comprobar si son iguales o no. Para ello se utiliza la función strcmp
. Se declara en el string.h
archivo como:
int strcmp(const char *s1, const char *s2);
compara la cadena apuntada por s1
a la cadena apuntada por s2
. La función strcmp
devuelve un entero mayor, igual o menor que cero, en consecuencia, ya que la cadena apuntada por s1
es mayor, igual o menor que la cadena apuntada por s2
.
Por lo tanto, en el programa anterior , si las dos cadenas a
y b
son iguales, la función strcmp
debe devolver un 0. Si devuelve un 0, las cadenas son las mismas; de lo contrario, son diferentes.
Sentencias if y if-else anidadas
También es posible incrustar o anidar sentencias if-else una dentro de la otra. El anidamiento es útil en situaciones en las que es necesario seleccionar uno de varios cursos de acción diferentes.
El formato general de una instrucción if-else anidada es:
if(condition1){// statement(s);}else if(condition2){//statement(s);}....else if (conditionN){//statement(s);}else{//statement(s);}
Lo anterior también se llama la escalera if-else. Durante la ejecución de una sentencia if-else anidada, tan pronto como se encuentre una condición que se evalúe como verdadera, se ejecutarán las sentencias asociadas con ese bloque if en particular y se omitirá el resto de las sentencias if-else anidadas. Si ninguna de las condiciones es verdadera, se ejecuta el último bloque else o si el bloque else está ausente, el control se transfiere a la siguiente instrucción presente inmediatamente después de la escalera else-if.
El siguiente programa hace uso de la instrucción if-else anidada para encontrar el mayor de los tres números.
#include<stdio.h>int main( ) { int a, b,c; a=6,b= 5, c=10; if(a>b) { if(b>c) { printf("nGreatest is: " , a); } else if(c>a) { printf("nGreatest is: ", c); } } else if(b>c) //outermost if-else block { printf("nGreatest is: " , b); } else { printf( "nGreatest is: " , c); } return 0; }
El programa anterior compara tres cantidades enteras e imprime las mayores. La primera instrucción if compara los valores de a
y b
. Si a>b
es true, el control de programa se transfiere a la instrucción if-else anidada dentro del bloque if, donde b
se compara con c
. Si b>c
también es verdadero, se imprime el valor de a
; de lo contrario, se comparan los valores de c
y a
y si c>a
es verdadero, se imprime el valor de c
. Después de esto, el resto de la escalera if-else se pasa por alto.
Sin embargo, si la primera condición a>b
es falsa, el control se transfiere directamente al bloque else-if más externo, donde el valor de b
se compara con c
(ya que a
no es el mayor). Si b>c
es true, se imprime el valor de b
, de lo contrario se imprime el valor de c
. Tenga en cuenta el anidamiento, el uso de llaves y la sangría. Todo esto es necesario para mantener la claridad.
Instrucción de selección: la instrucción switch-case
Una instrucción switch se utiliza para selecciones de múltiples vías que se ramificarán en diferentes segmentos de código en función del valor de una variable o expresión. Esta expresión o variable debe ser de tipo de datos entero.Sintaxis
:
switch (expression){ case value1: code segment1; break; case value2: code segment2; break;... case valueN: code segmentN; break; default: default code segment;}
El valor de esta expresión se genera durante la ejecución del programa o se lee como entrada del usuario. Se selecciona y ejecuta el caso cuyo valor es el mismo que el de la expresión. La etiqueta predeterminada opcional se utiliza para especificar el segmento de código que se ejecutará cuando el valor de la expresión no coincida con ninguno de los valores de mayúsculas y minúsculas.
La instrucción break
está presente al final de cada caso. Si no fuera así, la ejecución continuaría en el segmento de código del siguiente caso sin siquiera verificar el valor del caso. Por ejemplo, supongamos que una instrucción switch
tiene cinco casos y el valor del tercer caso coincide con el valor de la expresión. Si no hubiera una declaración de interrupción al final del tercer caso, todos los casos posteriores al caso 3 también se ejecutarían junto con el caso 3. Si break está presente, solo se selecciona y ejecuta el caso requerido; después de lo cual el control se transfiere a la siguiente instrucción inmediatamente después de la instrucción switch. No hay break
después de default
porque después del caso predeterminado, el control se transferirá de cualquier manera a la siguiente instrucción inmediatamente después del interruptor.
Ejemplo: un programa para imprimir el día de la semana.
#include<stdio.h>int main( ) { int day; printf("nEnter the number of the day:"); scanf("%d",&day); switch(day) { case 1: printf("Sunday"); break; case 2: printf("Monday"); break; case 3: printf("Tuesday"); break; case 4: printf("Wednesday"); break; case 5: printf("Thursday"); break; case 6: printf("Friday"); break; case 7: printf("Saturday"); break; default: printf("Invalid choice"); } return 0; }
Este es un programa muy básico que explica el funcionamiento de la construcción switch-case. Dependiendo del número introducido por el usuario, se selecciona y ejecuta el caso apropiado. Por ejemplo, si la entrada del usuario es 5, se ejecutará el caso 5. La instrucción break
presente en el caso 5 pausará la ejecución de la instrucción switch después del caso 5 y el control se transferirá a la siguiente instrucción after switch, que es:
return 0;
También es posible incrustar sentencias compuestas dentro de la caja de una sentencia switch. Estas declaraciones compuestas pueden contener estructuras de control. Por lo tanto, también es posible tener un interruptor anidado incrustándolo dentro de una caja.
Todos los programas escritos con la instrucción switch-case también se pueden escribir con la instrucción if-else. Sin embargo, tiene un buen sentido de programación usar la instrucción if cuando necesita tomar alguna acción después de evaluar alguna condición simple o compleja que pueda involucrar una combinación de expresiones relacionales y lógicas (por ejemplo, (if((a!=0)&&(b>5))
).
Si necesita seleccionar entre un grupo grande de valores, una instrucción switch se ejecutará mucho más rápido que un conjunto de ifs anidados. El conmutador difiere del if en que el conmutador solo puede probar la igualdad, mientras que el if puede evaluar cualquier tipo de expresión booleana.
La instrucción switch se debe usar cuando se necesita hacer una elección de un conjunto de opciones dado. La instrucción switch case se utiliza generalmente en aplicaciones basadas en menús. El uso más común de un switch-case es en el manejo de datos o archivo de procesamiento. La mayor parte del manejo de archivos involucra las funciones comunes: crear un archivo, agregar registros, eliminar registros, actualizar registros, imprimir el archivo completo o algunos registros selectivos. El siguiente programa da una idea de cómo se puede usar la instrucción switch case en el manejo de datos. No implica el código para el procesamiento de archivos, ya que podemos discutir el manejo de archivos en C solo después de haber aprendido conceptos avanzados como punteros, estructuras y uniones.
Ejemplo: Una instrucción de mayúsculas y minúsculas utilizada en el procesamiento de archivos de datos.
#include<stdio.h>int main() { //create file &set file pointer . int choice; printf("n Please select from the following options:"); printf("n 1. Add a record at the end of the file."); printf("n 2. Add a record at the beginning of the file:"); printf("n 3. Add a record after a particular record:"; printf("nPlease enter your choice:(1/2/3)?"); scanf("%d",&choice); switch(choice) { case 1: //code to add record at the end of the file break; case 2: //code to add record at the beginning of the file break; case 3: //code to add record after a particular record break; default: printf("n Wrong Choice"); } return 0; }
El ejemplo anterior de caja de conmutador generalmente implica anidar la construcción de caja de conmutador dentro de una construcción de iteración como do-while. En nuestro post de ejecución nacional, discutiremos estas declaraciones de iteración.
Leave a Reply