¡Descarga Estructuras de control en C++ y más Apuntes en PDF de Informática solo en Docsity!
UNIVERSIDAD DE MALAGA
DPTO. DE LENGUAJES Y C. DE LA COMPUTACION
E.T.S. DE INGENIERIA INFORMATICA
INGENIERIA INFORMATICA
LABORATORIO
DE
ELEMENTOS DE PROGRAMACIÓN
(CURSO 2004-2005)
TEEM T
MA
A I
III
ESTRUCTURAS DE CONTROL EN C++
II.1. Flujo de control.II.2. Expresiones lógicas.II.3. Estructuras de selección.
II.3.1. Estructura if.II.3.2. Estructura switch.
II.4. Estructuras de iteración.
II.4.1. Estructura while.II.4.2. Estructura do while.II.4.3. Estructura for.
II.5. Ejemplos.II.6. Recomendaciones y errores frecuentes.II.7. Ejercicios.
Bibliografía: [SAVI00], [JOYA00].
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
II.
FLUJO DE CONTROL El efecto deseado con un programa se consigue mediante la ejecución de una
secuencia de instrucciones o sentencias. Hasta ahora hemos considerado las instrucciones deasignación y las que permiten efectuar entrada/salida básica, por lo que el orden de ejecuciónde las instrucciones (flujo de control) coincide con el orden en que están dispuestas en elprograma, comenzando por la primera y continuando en secuencia hasta llegar a la última. Bloques
. Un bloque es una unidad de ejecución mayor que la sentencia, y permite agrupar
una secuencia de sentencias como una unidad. Para ello, enmarcamos la secuencia desentencias entre dos llaves, formando un bloque.
sentencia_1;sentencia_2;
sentencia_n; }
Es posible anidar bloques.
sentencia_1;sentencia_2;{
sentencia_3;sentencia_4;..... }.....sentencia_n; }
Dentro de un bloque se podrán definir variables,
en tal caso, serán visibles desde el
punto de la declaración hasta el final del bloque en que se definen. Aunque C++ da libertad alrespecto, cuando deseemos declarar variables o cualquier otra entidad en nuestros programas,siempre lo haremos al principio de un bloque, evitando hacerlo en puntos intermedios delmismo. Seguiremos el siguiente formato:
declaración_1;....declaración_n;sentencia_1;
sentencia_m; }
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
Para que un programa realice algo útil es necesario, disponer de la posibilidad de
alterar el flujo de control del mismo. C++ dispone de dos tipos de estructuras para alterar elflujo de control, las estructuras de selección y las estructuras de iteración. Ambas estructurasdependen de la evaluación de expresiones lógicas o booleanas. II.
EXPRESIONES LÓGICAS En cualquiera de las estructuras que permiten alterar el flujo de control del programa
habrá que especificar las condiciones bajo las cuales dicho flujo continua por un punto u otrodel programa. Para ello se emplean expresiones lógicas, que en C++ tienen las mismaspropiedades que ya hemos estudiado en la asignatura de Elementos de Programación, aexcepción de los nombres de los operadores disponibles. La siguiente tabla muestra losoperadores de que dispone C++ para construir expresiones lógicas.
Operador
pseudolenguaje
Operador
C++
=^
≠^
,^
≥^
∧^
∨^
¬^
II.
ESTRUCTURAS DE SELECCIÓN Se utilizan para alterar el flujo de control, permitiendo seleccionar una de entre varias
alternativas dependiendo de condiciones lógicas. La alternativa seleccionada hará que el flujode control alcance una instrucción o bloque de instrucciones concreto. C++ dispone de dostipos de estructuras de selección, if y switch. II.3.1. Estructura “
if”
En su versión más simple la estructura if permite seleccionar la ejecución o no de una
determinada secuencia de sentencias dependiendo de que la expresión lógica de control seevalúe a true o a false. Tiene el siguiente formato:
if
(condición
de control)
Secuencia de
sentencias
La estructura if admite una versión más general en la que se puede especificar una
secuencia de sentencias alternativa para ser ejecutada cuando la condición de control seevalúe a false. Tiene el siguiente formato:
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
if
(condición
de control)
Secuencia de
sentencias
}^
else
{ Secuencia de
sentencias
Si la secuencia de sentencias consta de una única instrucción no es necesario que esté
enmarcada entre llaves. No obstante, por cuestiones de estilo, y para evitar errores deprogramación que se suelen producir al prescindir de las llaves, nosotros siempre usaremosllaves para delimitar las sentencias de las distintas alternativas. Anidamiento
. Una secuencia de sentencias consta de una o más sentencias, cada una de ellas
acabada en punto y coma. Por tanto, nada impide que una de estas sentencias sea a su vez unasentencia de selección. Cuando ello ocurre hablamos de sentencias de selección anidadas. Enel siguiente ejemplo, dada una variable “dia”, cuyo contenido representa un día de la semana,se muestran mensajes relativos al día representado.
if^
((Lunes <=
dia)
(dia
<= Domingo))
cout
“Día
valido”;
if^
(dia <=
Viernes) { cout
<< “Día laborable”;
}^
else
{cout
<< “Día no
laborable”;
}^ else
{cout
“Día
no válido”;
Frecuentemente aparecen en un programa situaciones en las que se desea seleccionar
una alternativa de entre varias. Como ejemplo, considérese un programa para escribir enpantalla un mensaje diferente correspondiente a un número que representa una calificaciónnumérica. Utilizando sentencias if anidadas, quedaría:
if (Nota ==
cout
<< "Matrícula de
Honor";
}^ else
{if^
(Nota
cout <<
"Sobresaliente";
} else {
if^
(Nota
cout
<< "Notable";
}^ else
{if (Nota >=
cout
"Aprobado";
} else
{cout
"Suspenso";
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
Si el objetivo hubiera sido localizar un punto de entrada para continuar la ejecución a
partir de ahí, no hubiéramos situado
break
detrás de cada alternativa. Por ejemplo, si
deseamos un programa que nos muestre los días que quedan a partir de uno dado por lavariable “
dia”
, podríamos hacer: switch
(dia)
case Lunes:
cout
<< “Lunes”;
case Martes:
cout
<< “Martes”;
case Miercoles:
cout
<< “Miercoles”;
case Jueves:
cout
<< “Jueves”;
case Viernes:
cout
<< “Viernes”;
case Sabado:
cout
<< “Sabado”;
case Domingo:
cout
<< “Domingo”; break;
default:
cout
<< “ERROR.
DIA NO
VALIDO”;
En este caso, si “
dia
” vale Viernes, nos interesa que se escriba Viernes, Sabado y
Domingo, por lo que no situamos
break
tras cada alternativa. Por otro lado, como nos
interesa que no se escriba ERROR. DIA
NO VÁLIDO cuando se trate de un día válido,
situamos una instrucción
break
tras las sentencias asociadas a la etiqueta Domingo. Este uso
de la instrucción
switch
, en la que se ejecutan instrucciones asociadas a diferentes etiquetas
case (aunque es válido en el lenguaje)
está totalmente desaconsejado
. La instrucción
switch
solamente debe usarse cuando las instrucciones asociadas a las etiquetas sean
excluyentes entre sí (es decir, siempre irán seguidas de
break
Es posible que distintas etiquetas seleccionen el mismo grupo de sentencias. Si
queremos representar esta situación basta con situar todas las etiquetas relacionadas de formaconsecutiva, de la siguiente forma:
switch
(expresión)
case etiqueta1:case etiqueta2:case etiqueta3:
secuencia
de sentencias1;
break;
case etiqueta4:
secuencia
de sentencias2;
break;
........
default:
secuencia
de sentencias3;
break;
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
Donde se indica que en caso de que la expresión dé como resultado etiqueta1, etiqueta2 oetiqueta3, deseamos que se ejecute la secuencia de sentencias1. II.
ESTRUCTURAS DE ITERACIÓN Se utilizan para expresar capacidad de ejecutar de forma repetida una sentencia o
grupo de sentencias bajo ciertas condiciones. C++ admite los tres esquemas de iteración(bucles) vistos en el pseudolenguaje de la asignatura Elementos de Programación, aunquealgunas de ellas presentan un comportamiento ligeramente diferente. II.4.1. Estructura “
while
Se corresponde exactamente con el esquema
MIENTRAS
del pseudolenguaje. Su
formato viene dado por:
while (condición de
control) {
Secuencia de
sentencias
Cuerpo del
bucle
Cuando se ejecuta esta sentencia, en primer lugar se evalúa la expresión de control. Si
el resultado es true, entonces el flujo de control entra en el cuerpo del bucle, ejecutándosetodas las sentencias que lo forman. Seguidamente el flujo de control vuelve al principio delwhile, repitiéndose el proceso hasta que la expresión de control sea evaluada a false, en cuyocaso el flujo de control continua por la primera instrucción que siga al bucle.
Como puede observarse, la expresión de control se comprueba cada vez antes de que
el cuerpo del bucle sea ejecutado. El cuerpo se ejecuta mientras se cumpla la condición decontrol. Si la condición es false, entonces el cuerpo no se ejecuta. Hay que hacer notar que, sila condición es true inicialmente, la sentencia while no terminará (bucle infinito) a menos queen el cuerpo del bucle se modifique de alguna forma la condición de control. Por otra parte,de acuerdo al comportamiento indicado, si en la primera iteración la condición de control seevalúa a false, el cuerpo del bucle no se ejecutará ni siquiera una vez. Por tanto, estaestructura repetitiva permitirá expresar situaciones en las que deseamos que el cuerpo delbucle se repita cero o más veces.
Por ejemplo, si queremos leer una serie de números enteros y encontrar su suma,
parando cuando se lea un número negativo, podemos hacer:
sum
cin
i; while
(i
sum
= sum
cin
i;
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
II.4.2. Estructura “
do
while”
Se
corresponde
con
el
esquema
REPETIR
del
pseudolenguaje,
aunque
su
comportamiento es ligeramente diferente. Su formato es:
do^
Secuencia de
sentencias;
Cuerpo
del bucle
}^ while
(condición
de
control)
En esta estructura, primero se ejecuta el cuerpo del bucle y después se evalúa la
condición de control para determinar si deseamos repetir o no una vez más la ejecución delcuerpo. Este comportamiento seguirá hasta que en el momento de evaluar la condición decontrol se obtenga como resultado
false
Como puede observarse, puesto que la expresión de control se evalúa después de
ejecutar el cuerpo del bucle, en esta estructura el cuerpo del bucle se ejecutará siempre almenos una vez. Esto se adapta a numerosas situaciones típicas en programación. Por ejemplo,si deseamos leer un número hasta asegurarnos que el valor introducido es mayor que cero,podríamos haber optado por una estructura
while
de la siguiente forma,
cout <<
"Introduzca
un número mayor que
cero";
cin
>>^
numero;
while (numero
<^
1)^
cout
"Introduzca
un
número
mayor
que cero";
cin
>>^
numero;
Pero, ya que la petición del número debe ser ejecutada siempre al menos una vez, laestructura “
do
while”
se adapta mejor al que queremos describir, quedando por tanto más
natural de la siguiente forma:
do^
cout
"Introduzca
un
número
mayor
que cero";
cin
>>^
numero;
}^ (numero
Nota
:^ El comportamiento de la estructura “
do
while”
difiere del comportamiento
estudiado en Elementos de Programación en la estructura REPETIR. La estructuraREPETIR acaba cuando la expresión de control se evalúa a
true
, mientras que la
estructura “
do
..^
while”
acaba cuando la expresión de control se evalúa a
false
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
II.4.3. Estructura “
for”
Corresponde al esquema PARA del pseudolenguaje, aunque su comportamiento es
ligeramente diferente. Su formato es:
for
(inicialización;
condición
de
control;
incremento)
Secuencia de
sentencias;
Cuerpo
del bucle
En esta estructura, tras la palabra reservada
for
aparece la cabecera del bucle. Dicha
cabecera consta de tres componentes, que reflejan la forma en que evolucionará el flujo decontrol del bucle. Para ello, se basa en el uso de una “variable de control”. La componente deinicialización define la variable de control y almacena su valor inicial, la componente deincremento indica como se va actualizando y la componente de condición de controldetermina cuando acabar el bucle.
El comportamiento en detalle de la estructura
for
puede describirse fácilmente en
base a la siguiente estructura
while
Inicialización;while
(condición de
control) {
Secuencia de
sentencias
Incremento }
Como se puede observar, al principio, y una sola vez se ejecuta la componente de
inicialización, que será una instrucción en la que se le da valor inicial a la variable de controldel bucle, posteriormente se comprueba la condición de control, y
mientras
ésta se cumpla, se
ejecutará la secuencia de sentencias que forman el cuerpo del bucle
for
, ejecutándose al final
de cada iteración la componente de incremento, que será una instrucción en la que seespecifique la forma en que va evolucionando la variable de control tras cada iteración.
Por ejemplo, si deseamos mostrar por pantalla los N primeros números naturales,
donde N es un valor leído por teclado, podríamos haber usado una estructura
while
de la
siguiente forma
cin >>
N;
i^
while
(i
N)
cout
i;
i++; }
pero queda más claro si utilizamos la estructura
for
de la siguiente forma:
cin
N;
for (int
i =
1; i
N;
i++) {
cout
i;
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
while (((num
cand)
|| ((num
cand)
cand--; }cout
“El máximo común dividor
es:“
cand;
return 0; } /**^
Autor: *^
Fecha:
Versión:
**^
Programa
para el
cálculo del
MCD
de
dos
números
leidos de
teclado
*^
Se^
usa el
algoritmo de
Euclides.
*/#include
using
namespace std; int main(){
int
num1; int
num2; cout
“Teclee
dos
números:
cin
num1 >>
num2;
while (num1 !=
num2)
if (num1 >
num2)
num1 =
num
–^
num2;
} else
{num2 =
num
–^
num1;
}cout
“El máximo común dividor
es:“
num1;
return 0; }
II.
RECOMENDACIONES Y ERRORES FRECUENTES A continuación incidiremos en algunas características que consideramos interesantes
para conseguir que al utilizar las estructuras explicadas anteriormente se obtengan programasclaros y legibles, evitando y señalando errores típicos.
Recomendaciones
-^
Definir siempre un bloque para las alternativas de una instrucción
if
, incluso
si solo hay una sentencia en la secuencia de sentencias.
-^
No modificar la variable de control de un bucle
for
dentro de su cuerpo.
Errores frecuentes
-^
Usar
=^
en lugar de
para efectuar una comparación de igualdad. El operador
=^
expresa asignación de una valor a una variable, y en C++ se permite que
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
forme parte de una expresión, por lo que el compilador no avisa de un error encaso de confundir uno por otro.
-^
Usar & para el AND lógico, que realmente es &&. El compilador no avisa delerror porque & es un operador válido, aunque no hace lo que deseamos.
-^
Usar! para el OR lógico, que realmente es
El compilador no avisa del
error porque
!^ es un operador válido, aunque no hace lo que deseamos.
-^
Construir expresiones con operadores relacionales que no expresan lo quedeseamos. C++ es muy flexible a la hora de construir expresiones, por lo quees posible que el compilador acepte expresiones que no se comportan comoesperamos. Un ejemplo típico viene dado por la expresión
X^
Deseemos expresar la pregunta de si el valor de X está comprendido entre 0 y100, sin embargo C++ interpreta algo totalmente distinto (que no entraremos aanalizar).
X)
(X
Para
evitar
estas
situaciones,
recomendamos que siempre que usemos una expresión compuesta usemosparéntesis en cualquier subexpresión que contenga.
-^
Olvidar la instrucción
break
al final de la alternativa seleccionada en una
etiqueta de una instrucción
switch
. En tal caso, después de ejecutar
la
alternativa no se continúa por la instrucción que siga al
switch
, sino que se
ejecutan las sentencias asociadas a la siguiente alternativa.
-^
Construir expresiones lógicas compuestas que no expresan realmente lo quedeseamos expresar. Es frecuente usar el operador || cuando deberíamos usar eloperador && y viceversa.
-^
Errores de ejecución por no tener en cuenta que las expresiones lógicas seevalúan en cortocircuito. Por ejemplo, la instrucción
V^
=^
((A
B)
C)
(B
=^
0)^
genera un error de ejecución si B vale cero, mientras que si
aprovecho el cortocircuito, dicho error no se produce
V
=^
(B^
!=^
0)^
&&^
((A/
B)
>^
C)
-^
Confundir el significado de la condición lógica del
do
while
con la del
REPETIR visto en la asignatura de Elementos de Porogramación.
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
II.
EJERCICIOS
Una empresa maneja códigos numéricos con las siguientes características:
-^
Cada código consta de cuatro dígitos:
-^
El primero representa a una provincia.
-^
Los dos siguientes indican el número de la operación.
-^
El último es un dígito de control.
Se desea obtener un programa que lea de teclado un número de cuatro dígitos (sesupone que el primer dígito no es un cero), y posteriormente imprima en pantalla lasiguiente información.
PROVINCIA
NUMERO DE OPERACION
DIGITO DE CONTROL
En caso de que el número no tenga exactamente cuatro dígitos, o bien el dígito decontrol sea erróneo (será correcto si su valor coincide con el resto de dividir el númerode operación entre la provincia), en lugar del mensaje anterior, habrá que imprimir enpantalla el siguiente mensaje de error:
ERROR: CODIGO INVALIDO.
El recibo de la electricidad se elabora de la siguiente forma:
- 1 € de gastos fijos.- 0.50 €/Kw para los primeros 100 Kw.- 0.35 €/Kw para los siguientes 150 Kw.- 0.25 €/Kw para el resto.
Elabore un programa que lea de teclado dos números, que representan los dos últimosvalores del contador de la luz. (al restarlos obtendremos el consumo en Kw ), y calculee imprima en pantalla el importe total a pagar en función del consumo realizado.
Codifique un programa que se comporte como una calculadora simple. Para ello deberátener las siguientes características:
-^
Solo efectuará operaciones con dos operandos.
-^
Operaciones permitidas: (+,-,*,/).
-^
Se trabajará con operandos enteros.
-^
Pedirá en primer lugar la operación a realizar, y a continuación los dosoperandos. Si el operador no se corresponde con alguno de los indicados seemitirá un mensaje de error.
EJEMPLO:
Operación
Operando 1
Operando 2
Resultado
E.T.S. de Ingeniería Informática (Ing. Informática)
Dpto de Lenguajes y C. de la Computación
_______________________________________
Laboratorio de Elementos de Programación
Tema II. Estructuras de control en C++
Calculador
repetitivo.
Modifique
el
programa
para
que
se
repita
un
número
indefinido de veces. El calculador dejará de trabajar cuando se introduzca como códigode operación &. Ejemplo:
Operación
Operando 1
Operando 2
Resultado
Operación
: u
ERROR!!!!Operación
Operando 1
Operando 2
Resultado
Operación
FIN DEL PROGRAMA.
Escriba un programa que lea un número N (
≤^
N^
≤^ 9) e imprima una pirámide de
números con N filas como en la siguiente figura:
Escriba un programa que lea un número N de teclado y a continuación imprima enpantalla:
* La suma de los N primeros términos de la serie armónica (1+1/2+...+1/N)* Los N primeros términos de la sucesión de Fibonacci.