Sin título de diapositiva - Ingeniería Electrónica Industrial

Anuncio
TEMA 4: Estructuras de Control
Fundamentos de Informática
(Grados en Ingenierías Industriales)
Índice de contenidos
1. Estructuras de Selección (Condicionales)
1.1. Sentencias if, if-else, if-else múltiple
1.2. Operador condicional ?:
1.3. Sentencia switch
2. Estructuras Repetitivas o Iterativas (Bucles)
2.1. Bucle while
2.2. Bucle do-while
2.3. Bucle for
3. Anidamiento de Bucles
2
1
Introducción: Estructuras de control
• Estructura secuencial: aquella en la que las instrucciones
o sentencias son ejecutadas una a una en orden.
• Se puede alterar esa secuencialidad usando dos
estructuras o sentencias de control distintas. Estas
estructuras permiten variar el flujo de control del programa
dependiendo de ciertas condiciones. Son:
– Estructura de selección (o condicional): Permite que
se tomen rutas alternativas de acción dependiendo del
resultado de una operación.
– Estructura repetitiva (iterativa o bucle): Permite repetir
un conjunto de sentencias.
3
Introducción: Estructuras de control
Principio
Principio
Sentencia
V
¿?
Sentencias
F
Selección
Sentencias
Sentencia
Sentencias
Sentencia
¿?
Fin
Estructura secuencial
Iteración
V
F
Fin
Estructuras no secuenciales
4
2
1.1. Sentencias:
•
if, if-else
1. Selección
Sirven para decidir si se ejecutan unas acciones u otras, dependiendo
del valor de una condición.
if ( condición ) Selección binaria
Selección simple
{
if ( condición )
Bloque_sentenciasA
}
{
Bloque_sentenciasA else
{
}
Bloque_sentenciasB
}
• condición deberá ser una expresión cuyo valor ser interpretará:
•
•
como verdadero ( si su valor es distinto de 0) o como falso (si el valor
expresión es 0).
La condición (la expresión) SIEMPRE debe ir entre paréntesis.
Funcionamiento: Se determina si la condición es cierta o falsa.
Si es cierta  se ejecuta un bloque o cjto. instrucciones (sentenciasA)
y si es falsa se ejecuta el otro bloque (el de sentenciasB), si lo hay
•
Si un bloque sólo tiene una sentencia, las llaves se pueden quitar.
5
1. Selección
1.1. Ejemplo: Expresiones
• Dada la siguiente declaración de variables:
int a = 5, b = 10;
decir el valor numérico y el valor lógico (Verdad o Falso) de las
siguientes expresiones:
Expresión
Valor numérico
Valor lógico
a
!a
!! a
a–b
a–b+5
!(a – b + 5)
a<b
!(!a || !b)
!(a && b)
5
0
1
–5
0
1
1
1
0
true
false
true
true
false
true
true
true
false
Nota: Cualquier expresión es válida como condición en un if o if-else.
6
3
1. Selección
1. Ejemplo: Sentencia if-else
/* Calcular el flujo de corriente en un circuito eléctrico
de resistencia r al que se le aplica un voltaje de v. Se
calcula con la ecuación i=v/r.
Para evitar la posibilidad de dividir por cero habrá que
evaluar la expresión sólo si r no es cero. */
#include <iostream>
using namespace std;
int main()
{
float r, v;
cout << " Intro Resistencia: "; cin >> r;
cout << " Intro Voltaje: ";
cin >> v;
Selección binaria
if( r == 0 )
cout << "\n Existe un cortocircuito\n";
else
cout << "\n Corriente = " << v/r << "amps\n";
return 0;
}
7
1. Selección
1.1. Ejemplo: Sentencias if, if-else
/* Determina el número más grande entre tres */
#include <iostream>
using namespace std;
int main()
{ int n1, n2, n3, mayor;
cout << "Primer valor: ";
cin >> n1;
cout << "Segundo valor: "; cin >> n2;
cout << "Tercer valor: ";
cin >> n3;
if(n1 > n2) /* Calcular el mayor de n1 y n2 */
mayor = n1;
Selección binaria
else
mayor = n2;
if(n3 > mayor) /* Ver si n3 es el mayor */
mayor = n3;
Selección simple
cout << "El mayor es: " << mayor;
return 0;
}
8
4
1. Selección
1.1. Ejemplo: Sentencias if anidadas
/* Determina si un número es menor, mayor o igual a cero */
#include <iostream>
using namespace std;
int main()
{
int num;
cout << "Valor del número: ";
cin >> num;
Selección binaria
if (num >= 0)
Selección binaria
if(num == 0)
cout << "Número igual a cero \n";
else
cout << "Número mayor que cero \n";
else
cout << "Número menor que cero \n";
return 0;
}
Nota: Salvo que las “llaves” indiquen lo contrario, cada else se
asocia siempre al if más cercano de los que le preceden
9
1.1. Sentencia: if-else múltiple
Selección múltiple
if ( condición1 )
{
Bloque1
}
else if ( condición2 )
{
Bloque2
}
else if ( condición3 )
{
Bloque3
}
...
else
{
BloqueN
}
1. Selección
Funcionamiento:
– El Bloque1 de sentencias se
ejecuta si la condición1 es cierta.
Si es falsa el programa evalúa la
siguiente condición.
– Si la condición2 es cierta el
programa ejecuta el Bloque2, en
caso contrario evalúa la
siguiente condición y así
sucesivamente.
– Si todas las condiciones son
falsas el programa ejecuta el
bloque de sentencias del else
final (BloqueN).
– Este último else puede no
existir (entonces no se haría nada)
10
5
1. Selección
1.1 Ejemplo: if-else múltiple
/*Programa que muestra la calificación según la nota numérica*/
#include <iostream>
using namespace std;
int main()
{
float nota;
cout << " - Introduce la nota numérica: ";
cin >> nota;
if (nota < 5.0)
cout << "Suspenso";
else if(nota < 7.0)
cout << "Aprobado";
else if(nota < 9.0)
cout << "Notable";
else if(nota < 9.9)
cout << "Sobresaliente";
else
cout << "Matrícula Honor";
return 0;
Selección múltiple
}
Ejercicio propuesto: Mejora el programa anterior para que muestre mensajes de
error si la nota leída no es válida (si es mayor que 10 o menor que cero).
11
1. Selección
1.1 Ejemplo: if-else anidados
/* Programa que clasifica una onda electromagnética (EM)
dada su longitud de onda */
#include <iostream>
using namespace std;
int main()
{
float lambda;
cout << "Dame la longitud de onda: ";
cin >> lambda;
cout << "La onda electromagnética es ";
if
else
else
else
else
else
else
if
if
if
if
if
(lambda
(lambda
(lambda
(lambda
(lambda
(lambda
<
<
<
<
<
<
1e-11) printf("Rayos Gamma ");
1e-9) printf("Rayos X ");
400e-9)printf("Ultravioleta ");
700e-9)printf("Luz ");
1e-3) printf("Infrarrojos ");
1e-1) printf("Microondas ");
printf("Ondas de radio ");
return 0;
}
12
6
1. Selección
1.1. Ejemplo: if-else anidados
/* Determina la resistencia equivalente de 2 resistencias
conectadas en serie o en paralelo */
#include <iostream>
using namespace std;
int main()
{
float r1, r2, requ;
char ch;
cout << "Introduce los valores de las 2 resistencias: ";
cin >> r1 >> r2;
cout << "¿Las resistencias están en (s)erie o en (p)aralelo?: ";
cin >> ch;
Selección múltiple
if ( ch == 's' || ch == 'S' )
{
requ = r1 + r2;
cout << "Resistencia equivalente en serie es: " << requ;
}
else if ( ch == 'p' || ch == 'P' )
{
requ = r1 * r2 / (r1 + r2);
cout << "Resistencia equivalente en paralelo es: " << requ;
}
else
cout << "Entrada no válida, debes teclear una S o una P";
}
13
1.2. Operador condicional
•
•
?:
1. Selección
Es una herramienta útil para evaluar expresiones condicionales.
Su forma general es la siguiente:
expresión1 ? expresión2 : expresión3;
•
•
Interpretación:
– Si expresión1 es cierta, entonces se evalúa la expresión2, en
otro caso se evalúa la expresión3.
– Por tanto, el resultado de la expresión completa es el valor y tipo de
la expresión evaluada: de la expresión2 o de la expresión3 (los
cuales deben ser del mismo tipo).
Ejemplo:
a = b<0 ? –b : b;
– La expresión condicional es la que está en negrita. Si el valor de b es
menor que 0, la expresión completa tomará el valor de -b, en otro
caso tomará el valor de b.
– En definitiva, a la variable a se le asigna el valor absoluto de b
dependiendo de la condición b<0. La sentencia anterior completa
es equivalente a:
if (b<0) a=-b;
else a=b;
14
7
1.3. Sentencia
switch
switch ( expresión )
1. Selección
Selección múltiple
• La sentencia switch se usa
cuando existe una decisión
case valor1: Bloque1_de_sentencias
múltiple.
break;
case valor2: Bloque2
• Normalmente se usa para
break;
reemplazar a la sentencia
case valor3: Bloque3
if-else múltiple (cuando
break;
el programa puede tomar
default:
Bloque4
múltiples rutas de ejecución).
{
}
• La expresión:
- Sólo podrá ser de tipo entero o de tipo carácter.
- SIEMPRE debe ir entre paréntesis.
• Funcionamiento:
• Se evalúa la expresión y se va comparando su valor con cada uno de los que
aparecen después de cada case, según el orden en que estén escritos.
• Si alguno coincide, se ejecutan todas las instrucciones que vayan después de los dos
puntos hasta encontrar un break.
• No es obligatorio que haya un break por cada case, si no existe se seguirán
ejecutando las instrucciones de los siguientes case hasta encontrar el break o
hasta el final del switch. Puede haber tantos case como se desee.
• Si no coincide ningún valor se ejecutan las instrucciones de la opción default.
15
• La opción default no es obligatoria.
1. Selección
1.3. Ejemplo: Sentencia switch
...
int main()
{
int opcion;
cout << "1>España\n
2> Francia\n"
<< "3>Italia\n
4> Inglaterra\n";
cout << "Selecciona una opción: ";
cin >> opcion;
switch ( opcion )
{
case 1: printf("Hola\n");
break;
case 2: printf("Allo\n");
break;
case 3: printf("Pronto\n");
break;
case 4: printf("Hello\n");
}
}
16
8
1. Selección
1.3. Ejemplos: Sentencia switch
Los 2 siguientes trozos de código son equivalentes:
if ( a == 1 )
cout << "Es un uno";
else if ( a ==2 )
cout << "Es un dos";
else
cout << "No es uno ni dos";
switch ( a ) {
case 1: cout << "Es un uno";
break;
case 2: cout << "Es un dos";
break;
default: cout << "No es uno ni dos";
}
Los 2 siguientes trozos de código son equivalentes:
if(a==0 || a==1 || a==2 || a==3 || a==4)
cout << "a está en el rango 0-4";
La variable a es
de tipo entero
switch ( a ) {
case 0: case 1: case 2: case 3: case 4:
cout << "a está en el rango 0-4";
}
17
1. Selección
1.3. Ejemplo: Sentencia switch
Los 2 siguientes trozos de código son equivalentes:
if ( operador == '+' )
resultado = a+b;
else if (operador == '-')
resultado = a-b;
else if (operador == '*')
resultado = a*b;
else if (operador == '/')
resultado = a/b;
else
cout << "Operador inválido";
switch(operador)
{
case '+': resultado = a+b;
case '-': resultado = a-b;
case '*': resultado = a*b;
case '/': resultado = a/b;
default:
cout << "Operador
}
La variable operador
es de tipo carácter
break;
break;
break;
break;
inválido";
18
9
1. Selección
1.3. Ejemplo: Sentencia switch
char letra;
cout << "Introduce una letra: ";
cin >> letra;
switch ( letra ) /* Aquí la expresión es una variable */
{
/* de tipo carácter*/
case 'a':
case 'e':
case 'i':
case 'o': case 'u': cout << "Vocal minúscula \n";
break;
case 'A': case 'E': case 'I': case 'O':
case 'U': cout << "Vocal mayúscula \n";
break;
default:
}
if ( (letra >'a') && (letra <='z') )
cout << "Consonante minúscula \n";
else if ( (letra >'A') && (letra <='Z') )
cout << "Consonante mayúscula \n";
else
cout << "No es una letra \n";
// no se han considerado como letras ni las eñes ni las letras acentuadas
19
2. Estructuras Iterativas o Repetitivas:
Bucles
• Un proceso repetitivo o iterativo (bucle) permite que un conjunto de
sentencias se ejecute varias veces.
• Hay tres tipos de bucles en C: while, do-while y for.
• Todos requieren una condición que determina si el bucle continua o no.
• Si la condición es cierta el bucle continua, si es falsa se detiene.
• Flujo general de estos bucles:
Inicialización
Sentencia/s
Actualización
Sentencia/s
SI
¿La
condición
es cierta?
SI
¿La
condición
es cierta?
Sentencia/s
¿La
condición
es cierta?
SI
NO
while
NO
do-while
for
NO
20
10
2.1. Bucle:
2. E. Iterativas
while
while ( condicion )
{
Bloque_de_sentencias
}
Bloque de
Sentencias
• Funcionamiento:
Se evalúa la condición de control del bucle
• Si la condición es cierta, se ejecuta el bloque
de sentencias y se vuelve a evaluar la condición.
• Si la condición es falsa se termina el bucle
y se ejecuta lo que haya a continuación.
SI
¿La
condición
es cierta?
NO
 Es decir, el bucle (y por tanto, el bloque de sentencias) se repite
mientras la condición sea cierta (true).
• Importante: La condición de terminación se comprueba cada vez ANTES de
ejecutarse el cuerpo del bucle (el Bloque de Sentencias).
• Si la condición es inicialmente cierta, el bucle no terminará (bucle infinito) a
menos que en el cuerpo del mismo se modifique de alguna forma la condición
de control del bucle.
21
2. E. Iterativas
2.1. Ejemplo: Bucle while
/* Obtener la media de una lista de números enteros.
La lista terminará cuando se intro el número 0 */
...
int main()
{
int x;
// vble. para guardar cada número leido por teclado
int suma=0; // vble. para ir guardando la suma de los num leídos
int cant=0; // contará la cantidad de números (no nulos) leídos
cout << "Dame el primer número: ";
cin >> num;
while ( num != 0 )
{
suma = suma + num;
cant++;
cout << "Dame otro número: ";
cin >> num;
}
if ( cant > 0 )
cout << "La media es: " << (float)suma / cant ;
else
cout << "No hay media.\n";
}
22
11
2.2. Bucle:
do-while
2. E. Iterativas
do {
Bloque_de_sentencias
}while ( condicion );
Bloque de
Sentencias
Funcionamiento:
SI
• Se ejecuta el Bloque de sentencias (una o varias
instrucciones), y luego se evalúa la condición.
• Si ésta es cierta se vuelve al principio del bucle,
pero si es falsa se termina.
¿La
condición
es cierta?
NO
• La condición se comprueba, cada vez, DESPUÉS de
la ejecución del cuerpo del bucle (de las sentencias).
Por tanto, el Bloque de Sentencias siempre se
ejecuta como mínimo una vez.
23
2. E. Iterativas
2.2. Ejemplo: Bucle do-while
• Ejemplo: Suele usarse este bucle para imponer condiciones
en los datos de entrada.
• Observe que como mínimo hay que leer UN dato
obligatoriamente.
• Se leerán más datos si el dato leído es incorrecto.
• Se leerán sucesivamente datos MIENTRAS se lean datos que
no cumplen las condiciones.
/* Trozo de código que obligue al usuario a introducir un
valor entero que esté dentro del rango [-5..5], ambos
incluidos */
...
int num;
do {
cout << "Intro un entero en el rango[-5..5]: ";
cin >> num;
} while( num < -5 || num > 5 );
...
24
12
2.3. Bucle:
2. E. Iterativas
for
for (inicialización; condición; actualización)
{
Bloque de Sentencias
}
Funcionamiento:
• Se ejecutan todas las instrucciones
Inicialización
de la inicialización.
• Se evalúa la condición (expresión):
Si es cierta se ejecuta el Bloque de
sentencias y luego las instrucciones
Actualización
de actualización (en ese orden) y
se vuelve a evaluar la condición
Si la condición es falsa, termina el bucle.
Bloque de
Sentencias
NOTAS:
¿La
• En la parte de inicialización y de actualización
puede haber más de una instrucción, separadas
por el operador coma (,).
• En la parte de condición sólo puede haber una.
• Si no hay condición, el test de condición es verdadero.
• Ninguna de las tres partes es obligatoria.
2.3. Bucle for
(usar como bucle determinista)
SI
condición
es cierta?
NO
25
2. E. Iterativas
IMPORTANTE: por similitud con la mayoría del resto de lenguajes de programación,
limitaremos el uso de esta estructura for, y la usaremos siempre como bucle
determinista, es decir, la usaremos cuando sepamos el nº exacto de repeticiones
que queremos que se realicen, y con un formato similar al siguiente:
<=
for(vble=valorInicial; vble < valorFinal; actualización de vble)
{
>=
Bloque de Sentencias
}
>
!=
EJEMPLO:
for(i=1; i<=10; i++)
cout << "*";
// aquí, la act. de la vble i consiste en incrementar en 1 su valor
La variable i empieza tomando el valor 1, como 1 <= 10  e imprime un ‘*’ y se incrementa i en 1 (i++).
Cada vez que i tome un nuevo valor <=10  se escribirá otro ‘*’.
Es decir, el último valor que i tomará dentro del bucle será 10
 la instrucción de salida por pantalla se repite 10 veces
El bucle parará cuando i sea igual a 11 (que ya no es <=10).
26
13
2. E. Iterativas
2.3. Ejemplos: Bucle for
for(i=0;i<9;i++) 
i empieza tomando el valor 0, cada vez que el bucle da una
vuelta se incrementa en 1 (i++). El bucle parará cuando i== 9, es decir, el último valor
que i tomará dentro del bucle será 8 (se repite 9 veces)
for(i=10;i>=1;i--)  i empieza tomando el valor 10, cada vez que el bucle da una
vuelta se decrementa en 1 (i--). El bucle parará cuando i sea igual a 0, es decir, el
último valor que i tomará dentro del bucle será 1. (se repite 10 veces)
for(i=100;i<500;i+=50)  i empieza tomando el valor 100; cada vez que el bucle da
una vuelta se le suma 50 (i+=50 es equivalente a i=i+50). Dentro del bucle i tomará los
valores 100, 150, 200, 250,..., 400, 450. (se repite 8 veces)
De esas formas es como usaremos los bucles ‘for’, para dar valores a una variable, dentro de un
rango concreto, desde un valor inicial, hasta uno final.
Aunque lo siguiente también se puede hacer, lo evitaremos para asemejar el ‘for’ del C al del
resto de lenguajes:
for( ; ; )  Representa un bucle infinito  No debe usarse, aunque se ponga una salida
en el cuerpo del bucle (break y continue no deben usarse en ningún bucle).
for(i=2; i<128 && a>0; i*=2)  Empieza con i igual a 2; cada vez que el bucle da
una vuelta, i se multiplica por 2 y continua así mientras i sea menor que 128 y a>0,
pero no sabemos a priori cuantas veces será cierta esta condición (ni el nº de repeticiones).
for(k=-20.2; h>32; z--,j++)  Empieza con k igual a -20.2; el bucle se repetirá
mientras h sea mayor que 32. Al final de cada bucle z se decrementa en 1 y j se
incrementa en 1. Pero aunque sabemos la condición para terminar (h<=32), no sabemos a
la de cuantas repeticiones se cumplirá.
La coma permite varias expresiones en el primer y tercer campo del for.
27
2. E. Iterativas
2.3. Ejemplo: Bucle for
/* Imprime los caracteres ASCII entre un valor
inicial y un valor final */
...
int main()
{
int cod, ppio, fin;
cout << "Dame el codigo ASCII inicial: ";
cin >> ppio;
cout << "Dame el codigo ASCII final: ");
cin >> fin;
for( cod=ppio; cod<=fin; cod++ )
cout << cod << " " << (char)cod << endl;
return 0;
}
28
14
3. Anidamiento
3. Anidamiento de bucles
29
3. Anidamiento
3. Anidamiento de bucles
/* Escribe un cuadrado de asteríscos */
30
15
3. Anidamiento
3. Anidamiento de bucles
/* Escribe un triángulo de asteríscos */
31
16
Descargar