Estructuras De Control C++
elbort17 de Septiembre de 2013
2.814 Palabras (12 Páginas)427 Visitas
Tema 3
Estructuras de control en C++
1
E.T.S.I. Telecomunicaci´on Laboratorio de Programaci´on 2
2
´Indice general
3.1. Bloques de sentencias
En C++ el concepto de bloque de sentencias se utilizar para agrupar un conjunto de
sentencias dentro de un ´ambito concreto del programa. Un bloque de sentencias es un
conjunto de instrucciones englobadas bajo llaves: ’{’ y ’}’.
Hay diferentes lugares, en un programa escrito en C++, donde podemos usar bloques
de c´odigo. Por ejemplo, en la sintaxis habitual de la funci´on main(), todas las instrucciones
que pertenecen a esta funci´on principal se escriben dentro de una llave de apertura
y una llave de cierre. Todo lo que hay entre esas dos llaves es el c´odigo de la funci´on
principal. De la misma manera, como se ver´a en el siguiente tema, cualquier otra funci´on
tiene sus llaves para agrupar las instrucciones que forman parte de ella.
Por otro lado, en C++ son posibles otros bloques de c´odigo que, como veremos en
este tema, est´an asociados a estructuras de control y que engloban un conjunto de instrucciones
que se ejecutan bajo las condiciones que controlan estas estructuras.
3.2. Operadores relacionales y l´ogicos
ANSI C++ define el tipo bool que tiene dos literales, false y true. Una expresi´on
booleana o l´ogica es, por consiguiente, una secuencia de operandos y operadores que se
combinan para producir uno de los valores false o true.
ANSI C no tiene tipos de datos l´ogicos o booleanos para representar los valores verdadero
o falso. En su lugar utiliza el tipo int para ese prop´osito, con el valor 0 representando
false y cualquier otro valor representando verdadero.
Operadores como == o <= que comprueban una relaci´on entre dos operandos se llaman
operadores relacionales y se utilizan en expresiones de la forma:
expresion1 operador_relacional expresion2
3
E.T.S.I. Telecomunicaci´on Laboratorio de Programaci´on 2
Los operadores relacionales se usan normalmente en sentencias de selecci´on y de
iteraci´on para comprobar una condici´on. Operadores relacionales en C++:
Operador Significado Ejemplo
== (¡Ojo!, no =) Igual a a == b
!= No igual a a != b
> Mayor que a > b
< Menor que a < b
>= Mayor o igual a >= b
<= Menor o igual a <= b
Ejemplos:
x < 5.75 b * b >= 5.0 * a * c
Los operadores l´ogicos se utilizan con expresiones para devolver un valor verdadero o
falso (true o false). Se denominan tambi´en operadores booleanos. Los operadores l´ogicos
de C++ son: not (!), and (&&) y or (||). El operador not produce falso si su operando es
verdadero, y viceversa. El operador and produce verdadero s´olo si ambos operandos son
verdaderos; si cualquiera de los operando es falso, produce falso. El operador or produce
verdadero si cualquiera de los operandos es verdadero, y falso en caso de que los dos
operandos sean falsos. Ejemplos:
!(7 == 5) (aNum > 5) && (letra == ’a’) a >= 5 || b == 3 && c <= 8
3.3. Precedencia de operadores
La precedencia de operadores determina el orden en que se eval´uan los operadores
en una expresi´on. Seguiremos como referencia la siguiente lista, donde los operadores de
cada grupo tiene prioridad sobre los del grupo siguiente:
1. ! (not) - (menos unario) + (m´as unario)
2. operadores multiplicativos: * / %
3. operadores aditivos: + - (binarios)
4. operadores relacionales de diferencia: < <= > >=
5. operadores relacionales de igualdad y desigualdad: == !=
6. operador l´ogico de conjunci´on: &&
4
Estructuras de control en C++
7. operador l´ogico de disyunci´on: ||
Adem´as de esta lista, tenemos que tener en cuenta los siguientes puntos:
Si dos operadores se aplican al mismo operando, el operador con m´as prioridad se
aplica primero.
Todos los operadores del mismo grupo tienen igual prioridad y asociatividad (se
expresan de izquierda a derecha).
Los par´entesis tienen la m´axima prioridad.
3.4. Estructuras de selecci´on
C++ tiene dos estructuras de control para la selecci´on, if (selecci´on simple y binaria)
y switch (selecci´on m´ultiple).
3.4.1. Estructura if
La sentencia if elige entre varias alternativas en base al valor de una o m´as expresiones
booleanas.
La notaci´on BNF de esta sentencia es la siguiente:
<sent_if> ::= if (<expres_bool>) <bloque_sent>
{else if (<expres_bool>) <bloque_sent>}
[else <sec_sent>]
donde <expres bool> es una expresi´on booleana y <sec sent> puede ser una sola sentencia
o un bloque de sentencias.
<sec_sent> ::= [’{’{<sentencia>}’}’|<sentencia>]
Las formas m´as sencillas de esta sentencia, son :
if (<expres_bool>) if (<expres_bool>)
<sentencia> <sentencia>
else
<sentencia>
if (<expres_bool>) if (<expres_bool>)
5
E.T.S.I. Telecomunicaci´on Laboratorio de Programaci´on 2
{ {
<sent 1> <sent 1>
... ...
<sent n> <sent n>
} }
else
{
<sent 1>
...
<sent n>
}
N´otese que en el caso en el que s´olo siga una sentencia al if no es necesario incluir
las llaves, pero s´ı lo es cuando lo siguen m´as de una sentencia.
Los programas a menudo realizan una serie de tests de los que s´olo uno ser´a verdadero.
Como ejemplo, consid´erese un programa para escribir en pantalla un mensaje diferente
correspondiente a un n´umero que representa una calificaci´on num´erica. En C++, utilizando
sentencias if anidadas, quedar´ıa:
if (Nota == 10)
cout << "Matricula de Honor";
else
if (Nota >= 9)
cout << "Sobresaliente";
else
if (Nota >= 7)
cout << "Notable";
else
if (Nota >= 5)
cout << "Aprobado";
else
cout << "Suspenso";
Sin embargo, C++ nos proporciona una forma m´as concisa de expresar lo anterior, completamente
equivalente:
if (Nota == 10)
cout << "Matricula de Honor";
6
Estructuras de control en C++
else if (Nota >= 9)
cout << "Sobresaliente";
else if (Nota >= 7)
cout << "Notable";
else if (Nota >= 5)
cout << "Aprobado";
else
cout << "Suspenso";
De esta ´ultima forma evitamos tener que usar numerosas sangr´ıas del c´odigo que
pueden dificultar la lectura. Por tanto, el criterio que se debe seguir para decidir el
anidamiento o no de estructuras selectivas es la legibilidad del c´odigo.
3.4.2. Estructura switch
Aunque la sentencia if de C++ es muy potente, en ocasiones su escritura puede
resultar tediosa, sobre todo en casos en los que el programa presenta varias elecciones
despu´es de chequear una expresi´on: selecci´on m´ultiple o multialternativa. En situaciones
donde el valor de una expresi´on determina qu´e sentencias ser´an ejecutadas es mejor
utilizar una sentencia switch en lugar de una if. Por ejemplo, la sentencia switch:
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 invalido";
}
7
E.T.S.I. Telecomunicaci´on Laboratorio de Programaci´on 2
tiene el mismo efecto que la siguiente sentencia if:
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 invalido";
En este ejemplo se observa que el valor de la expresi´on operador (en este caso s´olo una
variable) determina qu´e sentencias se van a ejecutar. Esta expresi´on recibe el nombre de
selector de la estructura selectiva m´ultiple. Tambi´en se puede apreciar la mayor simplicidad
de la primera sentencia.
La palabra reservada break permite que el flujo de programa se detenga justo despu´es
de la ejecuci´on de la sentencia anterior a ese break, impidiendo que se ejecuten las
sentencias correspondientes a las siguientes alternativas del switch. Por tanto, debemos
obligatoriamente acabar cada bloque de sentencias correspondiente a cada alternativa
con una sentencia break.
Por otro lado, la alternativa default es opcional y engloba un conjunto de sentencias
(que puede ser vac´ıo, contener una sola sentencia o varias) que se ejecutan en caso de
que ninguna de las alternativas
...