• No se han encontrado resultados

Tema 4 Estructura de Control

N/A
N/A
Protected

Academic year: 2020

Share "Tema 4 Estructura de Control"

Copied!
16
0
0

Texto completo

(1)

TEMA 4: Estructuras de Control

Fundamentos de Informática

(Grados en Ingenierías Industriales)

2

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)

3

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.

Introducción: Estructuras de control

Introducción: Estructuras de control

Principio

Sentencias

Fin

Sentencias

¿?

Selección

Sentencia

Sentencia

Principio

Sentencia

Fin

Estructuras no secuenciales

Estructura secuencial

Sentencias

¿?

Iteración

V

F

V

(3)

5

• Sirven para decidir si se ejecutan unas acciones u otras, dependiendo

del valor de una condición.

if

(

condición

)

{

Bloque_sentenciasA

}

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.

1.1. Sentencias:

if

,

if-else

if

(

condición

)

{

Bloque_sentenciasA

}

else

{

Bloque_sentenciasB

}

Selección simple

Selección binaria

6

• 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

5

true

! a

0

false

!! a

1

true

a – b

– 5

true

a – b + 5

0

false

!(a – b + 5)

1

true

a < b

1

true

!(!a || !b)

1

true

!(a && b)

0

false

(4)

7 /* 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

;

if

(

r

== 0

)

cout <<

"

\n Existe un cortocircuito\n";

else

cout <<

"

\n Corriente = " <<

v

/

r

<< "amps\n";

return 0;

}

1. Ejemplo: Sentencia

if-else

Selección binaria

/* 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;

else

mayor = n2;

if

(

n3 > mayor

)

/* Ver si n3 es el mayor */

mayor = n3;

cout << "El mayor es: " << mayor;

return 0;

}

1. Selección

1.1. Ejemplo: Sentencias

if, if-else

Selección binaria

(5)

9

/* 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

;

if

(

num >= 0

)

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

1.1. Ejemplo: Sentencias

if

anidadas

Selección binaria

Selección binaria

10

if

(

condición1

)

{

Bloque1

}

else if (

condición2

)

{

Bloque2

}

else if (

condición3

)

{

Bloque3

}

...

else

{

BloqueN

}

1.1. Sentencia:

if-else

múltiple

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

).

(6)

11 /*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;

}

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).

1.1 Ejemplo:

if-else

múltiple

Selección múltiple

/* 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

(

lambda < 1e-11

)

printf("Rayos Gamma ");

else if

(

lambda < 1e-9

)

printf("Rayos X ");

else if

(

lambda < 400e-9

)

printf("Ultravioleta ");

else if

(

lambda < 700e-9

)

printf("Luz ");

else if

(

lambda < 1e-3

)

printf("Infrarrojos ");

else if

(

lambda < 1e-1

)

printf("Microondas ");

else

printf("Ondas de radio ");

return 0;

}

(7)

13

/* 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;

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"; }

1.1. Ejemplo:

if-else

anidados

Selección múltiple

14

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;

(8)

15

switch (

expresión

)

{

case

valor1

:

Bloque1

_de_sentencias

break

;

case

valor2

:

Bloque2

break

;

case

valor3

:

Bloque3

break

;

default

:

Bloque4

}

• 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óny 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. • La opción default no es obligatoria.

1.3. Sentencia

switch

1. Selección

• La sentencia switch se usa

cuando existe una

decisión

múltiple

.

• Normalmente se usa para

reemplazar a la sentencia

if-else múltiple (cuando

el programa puede tomar

múltiples rutas de ejecución).

Selección múltiple

...

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");

}

}

(9)

17 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";

switch ( a ) {

case 0: case 1: case 2: case 3: case 4: cout << "a está en el rango 0-4"; }

1.3. Ejemplos: Sentencia

switch

La variable a es de tipo entero

18

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;

break

;

case

'-'

:

resultado = a-b;

break

;

case

'*'

:

resultado = a*b;

break

;

case

'/'

:

resultado = a/b;

break

;

default

:

cout << "Operador inválido";

}

1. Selección

1.3. Ejemplo: Sentencia

switch

(10)

19 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

1.3. Ejemplo: Sentencia

switch

• 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:

while

do-while

for

2. Estructuras Iterativas o Repetitivas:

Bucles

Sentencia/s

NO SI

¿La condición es cierta?

NO SI

¿La condición es cierta? Inicialización

Actualización

Sentencia/s

NO SI

¿La

condición

es cierta?

(11)

21

while

(

condicion

)

{

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.

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.

2.1. Bucle:

while

NO SI

¿La

condición

es cierta? Bloque de

Sentencias

22

/* 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"; }

(12)

23

do

{

Bloque_de_sentencias

}while

(

condicion

)

;

Funcionamiento

:

• 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

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.

2.2. Bucle:

do-while

Bloque de Sentencias

NO SI

¿La

condición

es cierta?

/* 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

);

...

2.2. Ejemplo: Bucle

do-while

2. E. Iterativas

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.

(13)

25

for (

inicialización

;

condición

;

actualización

)

{

Bloque de Sentencias

}

Funcionamiento:

• Se ejecutan todas las instrucciones

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

de

actualización

(en ese orden) y

se vuelve a evaluar la

condición

Si la

condición

es

falsa,

termina el bucle.

NOTAS

:

• 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

NO SI

¿La

condición

es cierta?

Inicialización

Actualización

Bloque de Sentencias

26

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++) // aquí, la act. de la vble i consiste en incrementar en 1 su valor cout << "*";

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).

2.3. Bucle

for

(usar como bucle determinista)

(14)

27 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.

2.3. Ejemplos: 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;

}

(15)

29

3. Anidamiento de bucles

30

3. Anidamiento de bucles

3. Anidamiento

(16)

31

3. Anidamiento de bucles

Referencias

Documento similar