Estructuras de Control en C Sintaxis y Ejemplos
Estructuras de Control en C Sintaxis y Ejemplos
Estructuras de Control en C Sintaxis y Ejemplos
La sentencia if elige entre varias alternativas en base al valor de una o ms expresiones booleanas. La notacion 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 expresion booleana y <sec sent> puede ser una sola sentencia o un bloque de sentencias. <sec_sent> ::= [{{<sentencia>}}|<sentencia>] Las formas mas sencillas de esta sentencia, son : if (<expres_bool>) if (<expres_bool>) <sentencia> <sentencia> else <sentencia> if (<expres_bool>) if (<expres_bool>) {{ <sent 1> <sent 1> ... ... <sent n> <sent n> }} else { <sent 1> ... <sent n> } Ntese que en el caso en el que slo siga una sentencia al if no es necesario incluir las llaves, pero s lo es cuando lo siguen mas de una sentencia. Los programas a menudo realizan una serie de tests de los que slo uno seria verdadero. Como ejemplo, considrese un programa para escribir en pantalla un mensaje diferente correspondiente a un numero que representa una calificacin numrica. En C++, utilizando sentencias if anidadas, quedara: 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 mas concisa de expresar lo anterior, completamente equivalente: 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"; De esta ultima forma evitamos tener que usar numerosas sangras del cdigo 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 cdigo.
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 despus de chequear una expresin: seleccin mltiple o multialternativa. En situaciones donde el valor de una expresin determina qu sentencias serian 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"; } 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 expresin operador (en este caso slo una variable) determina qu sentencias se van a ejecutar. Esta expresin recibe el nombre de selector de la estructura selectiva mltiple. Tambin se puede apreciar la mayor simplicidad de la primera sentencia. La palabra reservada break permite que el flujo de programa se detenga justo despus de la ejecucin 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 vaci, contener una sola sentencia o varias) que se ejecutan en caso de que ninguna de las alternativas del switch tenga un valor coincidente con el resultado de evaluar la expresi on del selector. La notacion BNF de la sentencia switch es: <sent_switch>::= switch (<expresion>) { {case <caso> [break]} [default <sec_sent>] } <caso> ::= <expresion_constante> : <sec_sent> Una sentencia switch contiene un selector (en el ejemplo, operador), cuyo tipo debe ser int, char o enumerado. Cuando una sentencia switch se ejecuta, el valor del selector se compara con las etiquetas case. Si alguna de ellas concuerda con ese valor se ejecutara la correspondiente secuencia de sentencias. Si queremos que varias alternativas tengan el mismo conjunto de sentencias a ejecutar, podemos hacer como en el siguiente ejemplo: switch (selector) { case 1: case 2: cout << "Salida para los casos 1 y 2" << endl; break; case 3: cout << "Salida para el caso 3" << endl; break; default:
cout << "Salida para los restantes casos" << endl; } En este ejemplo, si el selector se evala y su valor es 1 2, se ejecuta, en ambos casos, la instruccin cout << "Salida para los casos 1 y 2"<< endl;. En este caso particular puede apreciarse la utilidad de break a la hora de detener el flujo del programa. La sentencia switch puede incluir la opcin default para establecer la secuencia de sentencias a ejecutar en el caso de que ninguna etiqueta concuerde con el valor de la expresin case. El tipo de esta expresin case y el de las etiquetas tiene que ser el mismo.
Estructura do/while
Su sintaxis viene dada por: <sent_do_while> ::= do <sec_sent> while (<expres_bool>) Al igual que en la sentencia while, en esta sentencia el cuerpo del bucle se ejecuta mientras que sea verdad la expresin booleana que constituye la condicin de control. Adems, esta condicin se comprueba cada vez tras la ejecucin del cuerpo, no antes, como en el while. El cuerpo de una sentencia do/while siempre se ejecuta al menos una vez. Cuando esto pueda ocurrir es mas conveniente su uso que la sentencia while. Por ejemplo, en lugar de escribir: cout << "Introduzca un numero entre 1 y 10"; cin >> numero; while (!((1 <= numero) && (numero <= 10))){ cout << "Introduzca un numero entre 1 y 10" << endl; cin >> numero; } Podemos hacer: do { cout << "Introduzca un numero entre 1 y 10" << endl; cin >> numero; }while (!((1<=numero) && (numero <= 10))); La primera ejecucion del bucle da a numero un valor, de manera que no necesitamos Inicializarlo antes del bucle.
Estructura for
Su sintaxis: <sent_for> ::= for (<expres_ini>;<expres_bool>;<expres_inc>) <sec_sent> El bucle for contiene las cuatro partes siguientes: Parte de inicializacion (<expres ini>), que inicializa las variables de control del
bucle. Se puede utilizar variables de control de bucle simples o m ultiples. Lo mas normal es inicializar en este punto una sola variable cuyo valor vara luego en la parte de incremento. Si se inicializan varias variables de control, cada inicializacin se separa de la anterior con una coma. Parte de iteracin (<expres bool>), que contiene una expresin lgica que hace que el bucle realice las iteraciones de las sentencias, mientras que a expresin sea verdadera. Parte de incremento (<expres inc>), que modifica la variable o variables de control de bucle. Si se modifican varias variables de control, cada operacin se separa de la anterior por una coma. Sentencias (sec sent), acciones o sentencias que se ejecutaran por cada iteracin del bucle. Puede verse claramente la equivalencia entre una sentencia for y un while: for (v = valor1; v<=valor2; v=v+paso) v = valor1; { while (v <= valor2) // sentencias { } // sentencias v = v + paso; } Ejemplo de un bucle for con varias variables de control: for (v1=valor1, v2=valor2; v1+v2<=100; v1++, v2++){ // sentencias } Conviene tener en cuenta algunas consideraciones: Debemos asegurarnos que la expresin de inicializacin del bucle y la expresin de incremento haran que la condicin del bucle se convierta en falsa en algn momento. Si el cuerpo de un bucle (secuencia de sentencias) modifica los valores de cualquiera de las variables implicadas en ese bucle, entonces el numero de repeticiones se puede modificar. Ejemplo: int limite = 1; int i; for (i=0; i<=limite; i++) { cout << i << endl; limite++; } producira una secuencia infinita de enteros. No es una buena practica de programacin modificar el valor de la variable de control, por lo que evitaremos hacerlo.