01 estructuras control

32
F l dd Ci i d l C F acultad de Ciencias de la Computacn Estructuras de control Estructuras de control Estructuras de control Estructuras de control Abraham Sánchez López Grupo MOVIS

Upload: vickter-vidal

Post on 17-Dec-2015

61 views

Category:

Documents


9 download

DESCRIPTION

estructuras

TRANSCRIPT

  • F l d d Ci i d l C iFacultad de Ciencias de la Computacin

    Estructuras de control Estructuras de control Estructuras de control Estructuras de control

    Abraham Snchez LpezGrupo MOVISp

  • Introduccin Una de las caractersticas de las computadoras que aumenta

    considerablemente su potencia, es su capacidad para ejecutar una tareajmuchas (repetidas) veces con gran velocidad, precisin y fiabilidad.

    Las tareas repetitivas son algo que los humanos encontramos difciles ytediosas de realizar.

    Estudiaremos las estructuras de control iterativas o repetitivas querealizan la repeticin o iteracin de acciones.

    C++ admite tres tipos de estructuras de control: los ciclos while for y do- C++ admite tres tipos de estructuras de control: los ciclos while, for y do-while.

    Estas estructuras de control o sentencias repetitivas controlan el nmerode veces que una sentencia o lista de sentencias se ejecutande veces que una sentencia o lista de sentencias se ejecutan.

    Un tipo de dato enumerado es una coleccin de miembros con nombreque tiene valores enteros equivalentes.L i l d t l i bl d ti d Los ciclos se puede controlar con variables de tipo enumerado.

    2Otoo 2014 (c) ASL

  • La sentencia while, I Un ciclo es cualquier construccin de programa que repite una sentencia

    o secuencia de sentencias un nmero de veces. La sentencia (o grupo de sentencias) que se repite en un bloque se

    denomina cuerpo del ciclo y cada repeticin del cuerpo del ciclo se llamaiteracin de ciclo.

    Las dos preguntas principales en la construccin del ciclo son: Cul es el cuerpo del ciclo? Cuntas veces se iterar el cuerpo del ciclo? Cuntas veces se iterar el cuerpo del ciclo?

    Un ciclo while tiene una condicin del ciclo (una expresin lgica) quecontrola la secuencia de repeticin.La posicin de esta condicin del ciclo es delante del cuerpo del ciclo y La posicin de esta condicin del ciclo es delante del cuerpo del ciclo ysignifica que un ciclo while es un ciclo pretest, de modo que, cuando seejecuta, se evala la condicin antes de que se ejecute el cuerpo delciclo La siguiente figura representa el diagrama del ciclo whileciclo. La siguiente figura representa el diagrama del ciclo while.

    El diagrama indica que la ejecucin de la sentencia o sentenciasexpresadas se repite mientras la condicin del ciclo permaneceverdadera y termina cuando se hace falsa

    3Otoo 2014 (c) ASL

    verdadera y termina cuando se hace falsa.

  • La sentencia while, IISintaxis:1) while (condicin_ciclo)) ( _ )

    sentencia; cuerpo2) while (condicin_ciclo)

    {sentencia 1;sentencia 1; cuerpo

    sentencia n;}}

    4Otoo 2014 (c) ASL

  • La sentencia while, III Tambin indica que la condicin del ciclo se evala antes de que se

    ejecute el cuerpo del ciclo y, por consiguiente, si esta condicin esj y ginicialmente falsa, el cuerpo del ciclo no se ejecutar.

    Es decir, el cuerpo del un ciclo while se ejecutar cero o ms veces.

    #include using namespace std;

    int main(){

    int contador=0;while (contador < 5){

    contador++;cout

  • Operadores de incremento y decrementop y C++ ofrece los operadores de incremento (++) y decremento (--) que

    admiten una sintaxis abreviada para aadir (incrementar) o restar( )(decrementar) 1 al valor de una variable.

    Recordemos la sintaxis de estos operadores: ++nombreVariable // preincrementoo b e a ab e // p e c e e o nombreVariable++ // postincremento --nombreVariable // predecremento nombreVariable-- // postdecremento nombreVariable // postdecremento

    Si i es una variable entera cuyo valor es 3, las variables k e i tomansucesivos valores que se indican a continuacin:sucesivos valores que se indican a continuacin:

    k = i++; // asigna el valor 3 a k y 4 a ik = ++i; // asigna el valor 5 a k y 5 a ik = i--; // asigna el valor 5 a k y 4 a ik = --i; // asigna el valor 3 a k y 3 a i

    6Otoo 2014 (c) ASL

    ; g y

  • Terminaciones anormales de un ciclo Un error tpico en el diseo de una sentencia while se produce cuando el

    ciclo slo tiene una sentencia en lugar de varias sentencias como segplaneo.

    Ejemplo:contador=1;contador 1;while (contador < 25)

    cout

  • Diseo eficiente de ciclos Una cosa es analizar la operacin de un ciclo y otra disear

    eficientemente sus propios ciclos. Los principios a considerar son:1) analizar los requisitos de un nuevo ciclo con el objetivo de determinar suinicializacin, prueba (condicin) y actualizacin de la variable de control del ciclo.2) desarrollar patrones estructurales de los ciclos que se utilizan frecuentemente.) p q

    El cuerpo de un ciclo while no se ejecuta nunca si la prueba o condicinde repeticin del ciclo no se cumple; es falsa cuando se alcanza while laprimera vez.p

    Ejemplo: contador = 10;while (contador > 100){{

    }

    El ciclo anterior nunca se ejecutar ya que la condicin del ciclo El ciclo anterior nunca se ejecutar ya que la condicin del ciclo(contador > 100) es falsa la primera vez que se ejecuta, y enconsecuencia su cuerpo.

    8Otoo 2014 (c) ASL

  • Ciclos controlados por centinelas, Ip Normalmente, no se conoce con exactitud cuantos elementos de datos

    se procesaran antes de comenzar su ejecucin.j Esto se produce, ya sea porque no hay muchos datos a contar o porque

    el nmero de datos a procesar depende de cmo prosigue el proceso declculo.

    Un medio para manejar esta situacin, es indicarle al usuario queintroduzca un nico dato definido y especificado denominado valorcentinela como ltimo dato.

    La condicin del ciclo comprueba cada dato y termina cuando se lee elvalor centinela.

    El valor centinela se debe seleccionar con mucho cuidado y debe ser un El valor centinela se debe seleccionar con mucho cuidado y debe ser unvalor que no pueda producirse como dato.

    En realidad, el centinela es un valor que sirve para terminar el procesodel ciclodel ciclo.

    Veamos un ejemplo, en el siguiente cdigo hay un ciclo con centinela, seintroducen notas mientras sta sea distinta de centinela.

    9Otoo 2014 (c) ASL

  • Ciclos controlados por centinelas, IIp#include using namespace std;g p ;

    int main(){

    int nota, cuenta, suma;, , ;/* entrada de datos numricos, centinela -1 */const int centinela = -1;cout > nota;;while (nota != centinela){

    cuenta ++;suma+=nota;cout > nota;

    }cout

  • Ciclos controlados por indicadoresp En lenguajes, que tiene el tipo boolean, se utilizan variables booleanas

    con frecuencia como indicadores o banderas de estado para controlar laejecucin de un ciclo.

    El valor del indicador se inicializa (normalmente a falso, false) antes dela entrada del ciclo y se redefine (normalmente a verdadero, true)y ( , )cuando un suceso especfico ocurre dentro del ciclo.

    En C++ no existe el tipo boolean, por lo que se utiliza como bandera unavariable entera que puede tomar dos valores, 1 o 0.q p ,

    Un ciclo controlado por bandera-indicador se ejecuta hasta que seproduce el suceso anticipado y se cambia el valor del indicador.

    digito leido = 0;digito_leido = 0;while (!digito_leido){

    cout car;digito_leido = (0

  • La sentencia break en los ciclos La sentencia break se utiliza, a veces, para realizar una terminacin

    anormal del ciclo. Dicho de otra forma, una terminacin antes de lo previsto. La sentencia break se utiliza para la salida de un ciclo while o do-while,

    aunque tambin se puede utilizar dentro de una sentencia switch que esaunque tambin se puede utilizar dentro de una sentencia switch, que essu uso ms frecuente.

    El esquema de un ciclo while con sentencia break es:

    while (condicin 1){

    if (condicin 2)break;

    /* sentencias *// sentencias /}

    12Otoo 2014 (c) ASL

  • Ciclos while (true)( ) La condicin que se comprueba en un ciclo while puede ser cualquier

    expresin vlida C++. Mientras que la condicin permanezca verdadera(distinto de 0), el ciclo while continuar ejecutndose.

    Se puede crear un ciclo que nunca termine utilizando el valor 1(verdadero) para la condicin que se comprueba.( ) p q p

    El siguiente programa, ilustra un ejemplo.#include using namespace std;g p

    int main(){

    int flag = 1, contador = 0;hil (fl )while(flag)

    {contador++;if (contador > 10)

    break;break;}cout

  • Repeticin: el ciclo for, Ip El ciclo for de C++ es ms potente que los ciclos for de otros lenguajes

    de programacin, ya que ofrece ms control sobre la inicializacin y elg y yincremento de las variables de control del ciclo.

    Adems del ciclo while, C++ proporciona otros dos tipos de ciclos: for ydo.

    El ciclo for es el ms adecuado para implementar ciclos controlados porcontador, que son ciclos en los que un conjunto de sentencias seejecutan una vez por cada valor de un rango especificado, de acuerdoj p g p ,con el siguiente algoritmo:por cada valor de una variable_contador de un rango especfico: ejecutarsentencias

    La sentencia for (ciclo for) es un mtodo para ejecutar un bloque desentencias un nmero fijo de veces.

    El ciclo for se diferencia del ciclo while en que las operaciones de control El ciclo for se diferencia del ciclo while en que las operaciones de controldel ciclo se sitan en un solo sitio: la cabecera de la sentencia.

    Veamos a continuacin la sintaxis.

    14Otoo 2014 (c) ASL

  • Repeticin: el ciclo for, IIp2) Expresin lgica que determina si las

    sentencias se han de ejecutar (mientrassea verdadera)

    1) Inicializa la variable de 3) Incrementa o decrementa la variablecontrol del ciclo de control del ciclo

    f (I i i li i C di i It i I t )for (Inicializacin; CondicinIteracin; Incremento)sentencias

    4) Sentencias a ejecutar en cada iteracin del ciclo

    El ciclo for contiene las cuatro partes siguientes: Parte de inicializacin que inicializa las variables de control del ciclo Se

    ) j

    Parte de inicializacin, que inicializa las variables de control del ciclo. Sepueden utilizar variables de control del ciclo simples o mltiples.

    Parte de condicin, que contiene una expresin lgica que hace que el ciclorealice las iteraciones de las sentencias, mientras que la expresin seaq pverdadera.

    Parte de incremento, que incrementa o decrementa la variable o variables decontrol del ciclo.

    15Otoo 2014 (c) ASL

    Sentencias, acciones o sentencias que se ejecutarn por cada iteracin.

  • Repeticin: el ciclo for, IIIp La sentencia for es equivalente al siguiente cdigo while:

    inicializacin;inicializacin;while (condicionIteracion){

    sentencias del ciclo for; #include sentencias del ciclo for;incremento;

    } Ejemplos

    #include #define M 15#define f(x) exp(2*x)-xusing namespace std;// Programa que imprime 15 valores de la funcin f(x) = e2x-x Ejemplos // Programa que imprime 15 valores de la funcin f(x) e xint main(){

    int i;double x;f (i 1 i< M i++)for (i=1; i x;cout

  • Repeticin: el ciclo for, IVp Existen dos formas de implementar la sentencia for que se utilizan

    normalmente para implementar ciclos de conteo: formato ascendente, enel que la variable de control se incrementa, y formato descendente, en elque la variable de control se decrementa.

    A continuacin se muestra su sintaxis:

    for (var_control = valor_inicial; var_control = valor_limite; exp_incremento)sentencia;

    Ejemplos:int n; int n;for (n=1; n5; n--)

    cout

  • Usos y precauciones del ciclo for, Iy p El lenguaje C++ permite que:

    El valor de la variable de control se puede modificar en valores diferentes de 1.p Se pueda utilizar ms de una variable de control.

    La(s) variable(s) de control se puede(n) incrementar o decrementar envalores de tipo int, pero tambin es posible en valores de tipo float ovalores de tipo int, pero tambin es posible en valores de tipo float odouble y en consecuencia se incrementara o decrementara en unacantidad decimal.

    int n;for (n=1; n

  • Usos y precauciones del ciclo for, IIy p , Se puede inicializar y cambiar una variable de control del ciclo en

    cualquier cantidad que se desee. Naturalmente cuando la variable de control no sea de tipo int, se tendrn

    menos garantas de precisin. Un ciclo for se debe construir con gran precaucin asegurndose de que Un ciclo for se debe construir con gran precaucin, asegurndose de que

    la expresin de inicializacin, la condicin del ciclo y la expresin deincremento harn que la condicin del mismo se convierta en false enalgn momento.g

    En particular, si el cuerpo de un ciclo de conteo modifica los valores decualquier variable implicada en la condicin del ciclo, entonces el nmerode repeticiones se puede modificar.de repeticiones se puede modificar .

    Esta regla anterior es importante, ya que su aplicacin se considera unamala prctica de programacin.

    Es decir no es recomendable modificar el valor de cualquier variable de Es decir, no es recomendable modificar el valor de cualquier variable dela condicin del ciclo dentro del cuerpo de un ciclo for de conteo, ya quese pueden producir resultados imprevistos.

    19Otoo 2014 (c) ASL

  • Ciclos infinitos y vacios, Iy El uso principal de un ciclo for es implementar ciclos de conteo cuando el

    nmero de repeticiones se conoce por anticipado. Pero existen muchos problemas en los que el nmero de repeticiones no

    se puede determinar por anticipado. C++ no admite una sentencia que realice esta tarea pero existe una C++ no admite una sentencia que realice esta tarea, pero existe una

    variante de la sintaxis for que permite implementar ciclos infinitos que sonaquellos ciclos que, en principio, no tienen fin.

    #include #include

    using namespace std;

    int main(){{

    for (;;)cout

  • Ciclos infinitos y vacios, IIy La razn de que el ciclo se ejecute indefinidamente es que se ha

    eliminado la expresin de inicializacin, la condicin del ciclo y layexpresin del incremento.

    Al no existir una condicin de ciclo que especifique cual es la condicinpara terminar la repeticin de sentencias, supone que la condicin esp p , p qverdadera (1) y ests se ejecutarn indefinidamente.

    En el ejemplo anterior, el ciclo se ejecutar un nmero ilimitado de veces,a menos que el usuario interrumpa la ejecucin (Ctrl + C).q p j ( )

    Para evitar esta situacin, se requiere que el diseo del ciclo for sea de lasiguiente manera:

    1 El cuerpo del ciclo ha de contener todas las sentencias que se desean ejecutar1. El cuerpo del ciclo ha de contener todas las sentencias que se desean ejecutarrepetidamente.

    2. Una sentencia terminar la ejecucin del ciclo cuando se cumpla unadeterminada condicin.

    A continuacin se muestra un ejemplo. Igualmente, hay que tener cuidado de no escribir un punto y coma

    despus del parntesis inicial del ciclo for

    21Otoo 2014 (c) ASL

    despus del parntesis inicial del ciclo for.

  • Ciclos infinitos y vacios, IIIy#include #define CLAVE -999

    sing namespace stdusing namespace std;

    int main(){

    int num; for (;;){

    cout > num;if (num==CLAVE) break;if (num CLAVE) break;

    }cout

  • Ciclos infinitos y vacios, IVy En realidad lo que sucede es que se visualiza una vez la frase La ciudad

    de Puebla, ya que la sentencia for es una sentencia vaca al terminarycon un punto y coma (;).

    Sucede que la sentencia for no hace absolutamente nada durante 10iteraciones y, por lo tanto, despus de que el ciclo for haya terminado, sey, p , p q y ,ejecuta la siguiente sentencia cout y se escribe La ciudad de Puebla.

    23Otoo 2014 (c) ASL

  • Sentencias nulas en ciclos for Cualquiera o todas las expresiones de un ciclo for pueden ser nulas. Para ejecutar esta accin, se utiliza el punto y coma (;) para marcar laPara ejecutar esta accin, se utiliza el punto y coma (;) para marcar la

    expresin vaca. Si se desea crear un ciclo for que acte exactamente como un ciclo

    while se deben incluir las primeras y terceras expresiones vacaswhile, se deben incluir las primeras y terceras expresiones vacas. El siguiente programa contiene un ejemplo.

    #include La sentencia for no inicializa ningn valor,using namespace std;

    int main(){

    g ,pero incluye una prueba de contador < 5.No existe ninguna sentencia deincremento, de modo que el ciclo se

    int contador=0; for (;contador

  • Sentencias break y continue, Iy La sentencia break termina la ejecucin de un ciclo, de una sentencia

    switch, en general de cualquier sentencia.g El siguiente programa utiliza la sentencia break para salir de un ciclo

    infinito.#include

    using namespace std;

    int main(){

    int max contador=0;int max, contador=0;cout > max; for (;;){

    if (contador < max){

    cout

  • Sentencias break y continue, IIy La sentencia continue hace que la ejecucin de un ciclo vuelva a la

    cabecera del ciclo. El siguiente programa utiliza continue en un ciclo para que, si se cumple

    la condicin de la sentencia if, vuelva a la cabecera e incremente i en 1.

    #include

    using namespace std;

    int main()int main(){

    int clave, i;cout clave;cout

  • Repeticin: el ciclo do-while, Ip La sentencia do-while se utiliza para especificar un ciclo condicional que

    se ejecuta al menos una vez.j Esta situacin se suele dar en algunas circunstancias en las que se ha

    de tener la seguridad de que una determinada accin se ejecutar una ovarias veces, pero al menos una vez., p

    Sintaxis

    Accin (sentencia e ejecutar Expresin lgica que determina( j p g qal menos una vez) si la accin se repite

    1) do sentencia while (expresin)) ( )

    2) dosentencia

    while (expresin)

    27Otoo 2014 (c) ASL

  • Repeticin: el ciclo do-while, IIp La construccin do comienza ejecutando sentencia. Se evala a

    continuacin expresin. Si expresin es verdadera, entonces se repite laejecucin de sentencia.

    Este proceso contina hasta que expresin es falsa. La semntica delciclo do se represento grficamente en la figura anterior.p g g

    #include

    using namespace std;

    int main(){

    char opcion;do{

    cout

  • Diferencias entre while y do-whiley Una sentencia do-while es similar a una sentencia while, excepto que el

    cuerpo del ciclo se ejecuta siempre, al menos una vez.j A continuacin se muestra un comparativo.

    while (expresin_lgica) do{ {

    sentencia 1; sentencia 1;sentencia 2; sentencia 2; sentencia n; sentencia n;

    } } while (expresin_lgica)

    sentencia compuestasentencia compuesta

    sentencia simple

    while (expresin_lgica) dosentencia sentencia

    while (expresin_lgica)

    29Otoo 2014 (c) ASL

  • Comparacin de los ciclosp C++ proporciona tres sentencias para el control de ciclos: while, for y do-

    while. El ciclo while se repite mientras su condicin de repeticin del ciclo es

    verdadera. El ciclo for se utiliza normalmente cuando el conteo est implicado o El ciclo for se utiliza normalmente cuando el conteo est implicado, o

    bien el nmero de iteraciones requeridas se pueda determinar al principiode la ejecucin del ciclo, o simplemente cuando exista una necesidad deseguir el nmero de veces que un suceso particular tiene lugar.g q p g

    El ciclo do-while se ejecuta de un modo similar a while excepto que lassentencias del cuerpo del ciclo se ejecutan siempre al menos una vez.

    El diseo de ciclos necesita tres puntos a considerar: El diseo de ciclos necesita tres puntos a considerar:1. El cuerpo del ciclo.2. Las sentencias de inicializacin.

    Las condiciones para la terminacin del ciclo3. Las condiciones para la terminacin del ciclo.

    30Otoo 2014 (c) ASL

  • Ciclos para diseo de sumas y productosp y p Muchas tareas frecuentes implican la lectura de una lista de nmeros y

    calculan su suma. Si se conoce cuntos nmeros habr, tal tarea se puede ejecutar

    fcilmente por el siguiente pseudocdigo. El valor de la variable total es el nmero de valores que se suman La El valor de la variable total es el nmero de valores que se suman. La

    suma se acumula en la variable suma.

    suma = 0;Repetir lo siguiente total veces:Repetir lo siguiente total veces:

    leer (siguiente)suma = suma + siguiente;

    fin_ciclo

    int cuenta, suma=0; int cuenta, producto; for (cuenta=1; cuenta siguiente; cin >> siguiente;suma = suma + siguiente; producto=producto*siguiente;

    } }

    31Otoo 2014 (c) ASL

  • Ejemplos sugeridosj p g Escribir un programa con un ciclo while que visualice todas las potencias de un

    entero n, menores que un valor especificado max_limite.E ibi i li l i i t dib j Escribir un programa que visualice el siguiente dibujo

    ** * *

    * * * * ** * * * * * ** * * * * * *

    * * * * * * * * ** * * * * * *

    * * * * ** * *

    *

    En una empresa de computadoras, los salarios de los empleados van aumentarsegn su contrato actual:

    Contrato Aumento %0 a 9000 pesos 209001 a 15000 pesos 1015001 a 20000 pesos 5ms de 20000 pesos 0

    Escribir un programa que solicite el salario actual del empleado y calcule y

    32Otoo 2014 (c) ASL

    p g q p y yvisualice el nuevo salario.