Sunteți pe pagina 1din 9

Guión de prácticas Estructuras condicionales

GUIÓN DE PRÁCTICAS 3:
ESTRUCTURAS CONDICIONALES

Introducción.
En este guión vamos a introducir aquellas estructuras en C que nos permiten
seleccionar qué parte del código queremos que se ejecute. A este tipo de estructuras
se les denomina estructuras condicionales o selectivas.

Selección simple.
Vamos a comenzar con un ejemplo que nos calcula el valor absoluto de un entero.

#include <stdio.h>
#include <stdlib.h>

/* Programa que calcula el valor absoluto de un entero.*/


int main( void ){
/* ENTRADAS */
int valor;
/* SALIDAS */
int absoluto;

/* Leer entradas. */
printf( "Introduzca un numero entero:" );
scanf("%i", &valor);

/* Calcular el valor absoluto. */


absoluto = valor;
if( absoluto < 0 ){
absoluto = -absoluto;
}
/* Mostrar el valor. */
printf( "El valor absoluto de %i es %i\n", valor, absoluto);

system("PAUSE");
}

NOTA: Para facilitar la visualización, compresión y el reconocimiento del código


hemos utilizado varias técnicas:

• Resaltado de sintaxis: los colores usados para las palabras.


• Identación del código (tabulado): escribir más a la derecha las instrucciones
que están dentro o dependen de otras, por ejemplo:
o La instrucción absoluto = -absoluto; está más a la derecha que
el if anterior para resaltar que sólo se ejecuta si ese if es
verdadero.
o Todo el código del programa principal está más a la derecha que la
declaración de las librerías y la definición del propio programa principal.
• Comentarios. Comentar el código nos ayuda a la compresión del mismo.

Página 1 de 9
Guión de prácticas Estructuras condicionales

El resaltado de la sintaxis lo hace automáticamente cualquier editor de código C (por


ejemplo el C-Free o el Dev C++), sin embargo, la identación del código y los
comentarios los tenemos que realizar nosotros.

A estas alturas debes ser capaz de diferenciar las partes más simples del código,
como:
• La inclusión de librerías (include).
• La declaración del programa principal (main).
• La declaración de variables (entradas y salidas).
• Las instrucciones de entrada y salida (scanf, printf).
• La asignación (=).
• Los comentarios.

Además de todas esas secciones, podemos comprobar que se ha utilizado una nueva:

if( absoluto < 0 ){


absoluto = -absoluto;
}

Esto es lo que llamamos un condicional simple. Si se cumple la condición dada entre


paréntesis ( absoluto < 0 ) el código que hay entre las llaves ({}) se ejecutará,
para después continuar con lo que hay después de cerrar la llave (}). Si no se cumple
continuará la ejecución a partir de la llave de cierre (}).

La estructura de una sentencia if es:

if( condición )
bloque_de_sentencias

donde:
condición: es cualquier expresión que genere un valor lógico (verdadero o
falso)
bloque_de_sentencias: puede ser:
Una única sentencia terminada en punto y coma.
Una o más sentencias encerradas entre llaves ({}).

Ejercicio:

• Modifica el código anterior para convertir el bloque de sentencias del if en


una sola sentencia.

Selección simple con parte “si no”.


La sección Calcular el valor absoluto del código anterior podría reescribirse así:

/* Calcular el valor absoluto. */


if( absoluto < 0 ){
absoluto = -valor;
} else {
absoluto = valor;
}

Página 2 de 9
Guión de prácticas Estructuras condicionales

Esta estructura tiene una parte opcional, que es la parte SI_NO (else), esta parte se
ejecuta sólo cuando la condición es falsa.

La estructura de una sentencia if-else es:

if( condición )
bloque_de_sentencias_1
else
bloque_de_sentencias_2

Ejercicios:
• Haz un programa que lea dos números y los muestre por pantalla de forma
ordenada (primero el mayor de ellos).
• Haz otro programa que lea dos letras y las muestre por orden alfabético.
• Crea un programa que calcule la diferencia en valor absoluto de dos
números.

Anidamiento y operadores lógicos.


Observa el siguiente código:

#include <stdio.h>
#include <stdlib.h>

int main( void ){


/* ENTRADAS */
int a=0, b=0;
char opcion;
/* SALIDAS */
int resultado=0;

/* Leer entradas. */
printf( "Introduzca dos valores enteros: " );
scanf("%i %i", &a, &b);
printf( "Desea (s)umarlos o (r)estarlos: " );
fflush(stdin);
scanf("%c", &opcion);

/* Seleccionar la operación elegida. */


if( opcion == 's' ){
resultado = a + b;
} else {
if( opcion == 'r' ){
resultado = a - b;
} else {
opcion = 'n';
}
}

/* Mostrar el resultado. */
if( opcion != 'n' ){
printf( "El resultado es: %i\n", resultado);
} else {
printf( "La opcion elegida no es valida\n");
}

Página 3 de 9
Guión de prácticas Estructuras condicionales

system("PAUSE");
}

Este programa lee dos enteros por teclado y realiza una operación con ellos (sumarlos
o restarlos), dependiendo del carácter dado como opción (‘s’ o ‘r’). Si el usuario no
introduce una opción válida, el programa dará un mensaje de error. Para ello hemos
anidado dos if, es decir, dentro de la parte else del primer condicional hemos
incluido otro condicional.

Anidar condicionales en C es muy sencillo, aunque a veces no es fácil de visualizar.


Para ello, intenta siempre tener el mismo estilo de programación. En este caso, la
sintaxis es la siguiente:

if (condición_1)
bloque_de_sentencias_1
else if (condición_2)
bloque_de_sentencias_2
...
else if (condición_n)
bloque_de_sentencias_n
else
bloque_de_sentencias_n+1

Compila, ejecuta y prueba el programa anterior.

¿Has probado a introducir una ‘S’ mayúscula?. ¿Qué ocurre en dicho caso?.

En la primera condición del código dado se puede observar una comparación entre
una variable (opcion) y un valor constante ('s'):

if( opcion == 's' ){

Como puedes comprobar la forma de comparar dos valores es utilizando la doble


igualación (==). Esto significa que los dos valores van a compararse, dando como
resultado un valor lógico.

NOTA: Un error muy frecuente es poner “=” a la hora de comparar. En C el símbolo ‘=’
se utiliza para asignar valores, por lo que el compilador no señalaría dicho error.

En la siguiente tabla se muestran los operadores lógicos y relacionales, y su


conversión a C:

Operador Operador en C Ejemplo en C Resultado


Igualdad (=) == 2==3 Falso
Distinto (≠) != 2!=3 Verdadero
Mayor (>) > 2>3 Falso
Mayor o igual (≥) >= 2>=3 Falso
Menor (<) < 2<3 Verdadero
Menor o igual (≤) <= 2<=3 Verdadero
Y (and) && (2<3) && (3<4) Verdadero
O (or) || (2<3) || (3<4) Verdadero
NO (not) ! !(2>3) Verdadero

Página 4 de 9
Guión de prácticas Estructuras condicionales

Con esta información podemos cambiar el primer condicional para que también
compare con la ‘S’ mayúscula, dejándolo de la siguiente manera:

if( opcion == 's' || opcion == 'S' ){

Ejercicios:

• Modifica el código para que también acepte la ‘R’ mayúscula para restar.
• Añade las instrucciones necesarias para que además se pueda elegir entre
sumar, restar, multiplicar o dividir.

Condicionales compuestos.
En muchas ocasiones tenemos que realizar una comparación de un mismo valor con
varios elementos distintos. Hasta el momento la única solución viable es realizar varios
condicionales simples (if) de forma anidada (o sin anidar si las condiciones son muy
estrictas).

Existe otra estructura condicional que nos puede solucionar el problema. Se trata de la
sentencia switch que se utiliza para seleccionar una de entre múltiples alternativas.
Observa el siguiente código:

#include <stdio.h>
#include <stdlib.h>

int main( void ){


/* ENTRADAS */
int a=0, b=0;
char opcion;

/* Leer entradas. */
printf( "Introduzca dos valores enteros: " );
scanf("%i %i", &a, &b);
printf( "\n(s) Sumar.\n");
printf( "(r) Restar.\n");
printf( "(m) Multiplicar.\n");
printf( "Elija una opción del menú:\n" );
fflush(stdin);
scanf("%c", &opcion);

/* Mostrar el resultado según la opción. */


switch( opcion ){
case 's':
printf( "%i + %i = %i\n", a, b, a+b);
break;
case 'r':
printf( "%i - %i = %i\n", a, b, a-b);
break;
case 'm':
printf( "%i * %i = %i\n", a, b, a*b);
break;
default:
printf( "La opción elegida no es válida\n");
}
system("PAUSE");
}

Página 5 de 9
Guión de prácticas Estructuras condicionales

Con esta nueva estructura (switch), podemos comparar un elemento con varios
valores. En este caso el elemento que se compara, denominado selector, es la
variable opcion. La sintaxis es la siguiente:

switch (selector)
{
case etiqueta_1: sentencias_1;
case etiqueta_2: sentencias_2;
...
case etiqueta_n: sentencias_n;
default: sentencias_d; //opcional
}

NOTA: Resaltar que con un switch sólo podemos realizar comparaciones de


igualdad, por lo tanto, NO se puede comparar si el valor dado es mayor o menor que
otro o realizar operaciones lógicas.

Se utiliza la palabra case para indicar el valor con el que queremos comparar, es
decir, el caso que queremos procesar. En este caso, los valores van entre comillas
simples porque son caracteres, si fueran valores constantes enteros pondríamos
simplemente el número, por ejemplo:


case 1:
printf( "%i + %i = %i\n", a, b, a+b);
break;
case 2:

En cada uno de los casos hay que indicar cuándo se acaba, y para ello ponemos la
palabra reservada break. Si no pusiéramos dicha palabra, continuaría con la
ejecución de los siguientes casos hasta que se encontrara con el fin del switch o
con un break. Por este motivo, no hace falta poner break en el último de los casos.
Por tanto, la sintaxis del switch con break, es la siguiente:

switch (selector)
{
case etiqueta_1: sentencias_1;
break;
case etiqueta_2: sentencias_2;
break;
...
case etiqueta_n: sentencias_n;
break;
default: sentencias_d; //opcional
}

Podemos utilizar esta forma de actuar (poniendo o quitando el break) según nos
convenga. Modifica el primer caso incluyendo una nueva instrucción para que quede
así:

case 'S':

Página 6 de 9
Guión de prácticas Estructuras condicionales

case 's':
printf( "%i + %i = %i\n", a, b, a+b);
break;

El primer caso (el de la S mayúscula) no tiene instrucciones, pero tampoco tiene


break, por lo tanto ejecutará las órdenes que hay en el siguiente caso (el de la s
minúscula).

Ejercicio:

• Modifica el código para que permita elegir cualquier opción indicando la


letra tanto en minúscula como en mayúscula.

El último caso que hay en el código es:

default:
printf( "La opción elegida no es válida\n");

Este es el caso por defecto, y como le ocurre a la parte SI_NO del condicional, es
totalmente opcional. Este caso se ejecuta solamente si no se ha ejecutado ninguno de
los casos anteriores.

Ejercicios:

• Modifica el código para que no muestre ningún resultado si la opción


elegida es incorrecta.
• Cambia las partes necesarias del código para que las opciones se
seleccionen utilizando números enteros.

Página 7 de 9
Guión de prácticas Estructuras condicionales

Recuerda.
● Es útil utilizar identación (tabulado) del código, para poder observar qué
instrucciones dependen de otras.
• La parte “SI_NO” (else) de un condicional “SI” (if) es opcional.
• Para realizar una comparación de igualdad se utiliza un doble igual (==).
• La estructura switch sólo permite realizar comparaciones de igualdad.
• El caso default de la instrucción switch es opcional.

Ejercicios finales.
1. Necesitamos un programa que ordene 3 números de mayor a menor.

2. Crear un programa capaz de leer un valor entero y de determinar si se trata de


un número par o impar.

3. Realizar un programa capaz de leer dos valores enteros, m y n, y determine si


m divide a n.

4. Diseñar un algoritmo que lea tres número enteros y muestre el mayor de ellos.

5. Diseñar un algoritmo que lea las longitudes de los tres lados de un triángulo
(L1,L2,L3) y determine qué tipo de triángulo es, de acuerdo a los siguientes
casos. Suponiendo que A determina el mayor de los tres lados y B y C
corresponden con los otros dos, entonces:

Si A>=B + C No se trata de un triángulo

Si A2 = B2 + C2 Es un triángulo rectángulo

Si A2 > B2 + C2 Es un triángulo obtusángulo

Si A2 < B2 + C2 Es un triángulo acutángulo

6. Un sistema de ecuaciones lineales de la forma:

ax + by = c
dx + ey = f

puede resolverse utilizando las siguientes fórmulas:

ce − bf af − cd
x= y=
ae − bd ae − bd

Diseñar un algoritmo para leer los dos conjuntos de coeficientes (a, b y c, y d, e


y f) e imprimir los valores que son solución para x e y. ¿Existen algunos casos
para los cuales este algoritmo no funcione?.

7. La distancia del punto de caída de un proyectil que es lanzado con un ángulo


Angulo (expresado en radianes) con una velocidad inicial de Velocidad

Página 8 de 9
Guión de prácticas Estructuras condicionales

(expresado en pies por segundo), ignorando la resistencia del aire, viene dada
por la fórmula:

Velocidad2∗seno2∗Angulo
Distancia=
32.2

Escribir un algoritmo que realice un juego en el que el usuario introduce


primero la distancia a una diana. Luego el usuario introduce el ángulo y la
velocidad de lanzamiento de un proyectil. Si el proyectil cae dentro de un diez
por ciento de la distancia a la diana, el usuario gana el juego. Si el proyectil no
se acerca lo suficiente, se le dice al usuario cuánto se ha alejado el proyectil.
Para simplificar las entradas del usuario, el programa debe permitir que el
ángulo de la entrada se dé en grados. La fórmula para convertir los grados en
radianes es

Radianes = Grados * PI / 180.0

8. Un equipo de fútbol ha tenido una buena campaña y desea premiar a sus


jugadores con un aumento del salario para la siguiente campaña. Los sueldos
deben ajustarse de la siguiente forma:

Sueldo actual (en €) Aumento

0-6.000 20%

6.000-7.900 10%

7.900-12.000 5%

más de 12.000 0%

Diseñar un algoritmo que lea el salario de un jugador, y que a continuación


muestre el tanto por ciento de aumento, el sueldo actual y el sueldo
aumentado.

9. Diseña un algoritmo al que se de como entradas dos enteros y un carácter. El


algoritmo deberá sumar, restar, multiplicar o dividir los valores de los dos
primeros parámetros dependiendo del código indicado en el tercer parámetro, y
devolver el resultado.

Página 9 de 9