Estructura Switch

download Estructura Switch

of 10

Transcript of Estructura Switch

  • 7/25/2019 Estructura Switch

    1/10

    ESTRUCTURAS DE CONTROL.

    Introduccin.

    Sentencia if()-else.

    Bloques.

    Anidamiento

    Introduccin.Hasta el momento, nicamente se han construido programas en los que elflujo de cdigo era secuencial. Ciertamente, es casi imposible una actiidadreal en que se tenga un flujo puramente secuencial! como m"nimo, seproducen circunstancias distintas pero preistas, # ha# que responderadecuadamente a cada una de ellas. $or tanto es necesario disponer desentencias de control que permitan tomar decisiones, # ejecutar uno u otrosegmento de cdigo en funcin de las condiciones del momento. %sta es la

    misin de la sentencia if() elseen C.

    Sentencia if()else

    http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0401.html#anchor702047http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0401.html#anchor702287http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0401.html#anchor702448http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0401.html#anchor702634http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0401.html#anchor702287http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0401.html#anchor702448http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0401.html#anchor702634http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0401.html#anchor702047
  • 7/25/2019 Estructura Switch

    2/10

    if (condicin) /* 1 */{ Bloque; /* 2 */}else{ Bloque; /* 3 */}

    &a representacin gr'fica del flujo de programa de la sentencia if()

    elsehace f'cil comprender su actuacin desde el punto de ista del flujo de

    control. &a sentencia if() elseposee tres partes bien diferenciadas!

    una e(presin de control )*+

    un primer bloque de sentencias )+

    un segundo bloque de sentencias )-+

    &a expresin de controlse eala al llegar el control a la sentencia if()

    su alor podr' ser nulo /falso0 o no nulo /erdadero0. Si el alor de lae(presin de control es erdadero, se ejecutar' el bloque )+ en casocontrario, se ejecutar' el bloque )-+. &as llaes son opcionales nicamente

    cuando el bloque en cuestin /)+ o )-+0 contiene una sola sentencia. 1 lacl'usula elsees opcional. 2n primer ejemplo de uso de la sentencia if()-

    elsepodr"a ser el siguiente!#include

  • 7/25/2019 Estructura Switch

    3/10

    + strtol($r%'2& ,..& 1); } else { /* ire esto ire esto ire esto ire esto */ $ + 1;

    + 2; }

    condicion + $ < ;

    if (condicion)

    printf(0ste loque se eecut$ porque d < d4n0& $& );

    condicion + $ " ;

    if (condicion)

    printf(0ste loque se eecut$ porque d es $5or que d4n0&$& ); else printf(06ero este otro loque se eecut$ porque d no es$5or que d4n0& $& );

    return ;

    }

    Comentario.3 %l if()no tiene cl'usula else # slo hace algo cuando es a 4

    b. %l segundo if()tiene una cl'usula else# siempre se ejecuta uno u otro

    bloque. &os resultados de la ejecucin de este programa son como sigue!

    c$uldron78xx96:=" /$outste loque se eecut$ porque 1 < 26ero este otro loque se eecut$ porque 1 no es $5or que 2c$uldron78xx96:=" /$out 2 1ste loque se eecut$ porque 2 es $5or que 1c$uldron78xx96:="

    &a primera ejecucin, como puede erse, hace uso de los alorespredefinidos dentro del programa. &a segunda traduce los alores dados atra5s de la l"nea de rdenes # los emplea como argumentos, calculando elalor de condicin en funcin de ellos. 6e este modo se puede e(perimentarcon el programa para cerciorarse de que realmente se ejecutan los bloquesimplicados por los alores dados. 7ambi5n puede ser interesante er esteotro %jemplo.

    Bloques.%s frecuente emplear la sentencia if()para decidir la posible ejecucin de

    bloques de cdigo. %stos bloques ir'n encerrados entre llaes. 2n ejemplosencillo puede ser la resolucin de una ecuacin de segundo grado, en queser' coneniente /aunque no necesario 3 8sabr' hacerlo el lector90 empleararias sentencias en cada bloque. Insistimos! es imprescindible emplearllaes para delimitar los bloques en la sentencia if(). Si no se emplean

    llaes por error, se tienen arios casos. Si las llaes omitidas correspondenal bloque else/)-+0, entonces el compilador no puede detectar el error

    http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0401.html#anchor208670http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0401.html#anchor208670
  • 7/25/2019 Estructura Switch

    4/10

    interpretar' que la nica sentencia del bloque )-+ es la primera/e(clusiamente0 que apare:ca inmediatamente despu5s deelse. %ntonces

    la ejecucin ser' correcta para el caso en que la sentencia de control seafalsa, porque se ejecutar' el contenido /incorrecto0 del bloque )-+, # todaslas sentencias posteriores. Sin embargo, la ejecucin ser' incorrecta para el

    caso en que la sentencia de control sea erdadera, porque se ejecutar' elbloque )+ # tambi5n todas las sentencias del bloque )-+, a e(cepcin de laprimera. Si el bloque )-+ est' ac"o, se prescindir' por completo de lacl'usula else/conjunto formado por else# el bloque asociado0.

    Anidamiento;o se impone restriccin alguna sobre las sentencias contenidas en elbloque /)+, )-+0. $or tanto, se admiten las sentencias de control, # enparticular las sentencias alternatias. Se dice entonces que se admite elanidamiento de sentencias alternatias. %l compilador no impondr'restricciones sobre la profundidad de anidamiento de sentencias

    alternatias sin embargo, se considera de mal estilo una profundidad deanidamiento superior a tres nieles. Como ejemplode anidamiento desentencias alternatias, se puede escribir un programa para resolerecuaciones cuadr'ticas.

    Ejemlo !.3 Construir un programa que muestre el comportamiento de lasentencia if()-elsecuando la e(presin de control es un nmero entero.

    = # =?=0 cuando el contenidodel bloque es una sola sentencia./*ste pro%r$$ uestr$ l$ utili>$cin de l$ sentenci$ if() else

    */

    #include

  • 7/25/2019 Estructura Switch

    5/10

    return ;}

    /*:=.@A.$ expresin de control se e'$l?$ en el sentido l%ico

    1 es $5or que -1 no es $5or que

    @

    Ejemlo ".3 Construir un programa capa: de resoler ecuaciones desegundo grado. ;o se consideran los casos en que $, o ctomen alores

    nulos.

    /*ste pro%r$$ perite resol'er ecu$ciones de se%undo %r$do

    =ir'e coo eeplo de $nid$iento de estructur$s if() else*/

    #include re$l dole */

    int $in('oid){

    printf(0:esolucin de ecu$ciones de se%undo %r$do& $xD2 G xG c + 4n4n0);

    printf(0scri$ los coeficientes $& 5 c sep$r$dos por

    esp$cios7 0); sc$nf(0f f f0& H$& H& Hc); printf(04n.$ ecu$cin es fxD20&$);

    " I printf(0 G0) 7 printf(0 0); printf(0fx0&); c " I printf(0 G0) 7 printf(0 0); printf(0f + 0& $& & c); printf(04n4n=olucin0); d + * - 8*$*c; if (d " ) /* discriin$nte positi'o& r$Fces re$les 5distint$s */ { r1 + (- G sqrt(d))/(2*$); r2 + (- - sqrt(d))/(2*$); printf(04n4n:$Fces re$les 5 distint$s7 r1 + f& r2 + f0&

    r1& r2); }

  • 7/25/2019 Estructura Switch

    6/10

    else { if (d < ) /* discriin$nte ne%$ti'o& r$Fces cople$sconu%$d$s */ { pre$l + (-)/(2*$);

    pi$%in$ri$ + sqrt(-d)/(2*$); printf( 04n4n:$Fces cople$s conu%$d$s7 fGf& f-f0& pre$l& pi$%in$ri$& pre$l& pi$%in$ri$); } else { rrd + (-)/(2*$); printf(04n4nn$ r$F> re$l dole7 rrd + f0& rrd); } } puts(04n4n@erin$cin nor$l del pro%r$$4n0); return ;}/*JK,@A:C=

    sEr'ese que no se !$n estudi$do todos los '$lores posiles de$& 5 c=i $l%uno o todos son ceros& se producen c$sos especi$les queno se !$ntr$t$do ste pro%r$$ es correcto& pero , es rousto*/

    #odi$icacin.3 Construir una nuea ersin del programa anterior,adapt'ndolo de tal modo que admita sus par'metros a tra5s de la l"nea derdenes

    2na posible solucin ser"a la siguiente!

    #include $r strtof */#include

  • 7/25/2019 Estructura Switch

    7/10

    { printf(04n4ntili>$cin7 /resuel'e $ c4n4n0); return ; } $ + strtof($r%'1& ,..); + strtof($r%'2& ,..);

    c + strtof($r%'3& ,..); printf(04n.$ ecu$cin es fxD20&$); " I printf(0 G0) 7 printf(0 0); printf(0fx0&); c " I printf(0 G0) 7 printf(0 0); printf(0f + 0& $& & c); printf(04n4n=olucin0); d + * -8*$*c; if (d " ) /* discriin$nte positi'o& r$Fces re$les 5distint$s */ { r1 + (- G sqrt(d))/(2*$); r2 + (- - sqrt(d))/(2*$); printf(04n4n:$Fces re$les 5 distint$s7 r1 + f& r2 + f0&r1& r2); } else { if (d < ) /* discriin$nte ne%$ti'o& r$Fces cople$sconu%$d$s */ { pre$l + (-)/(2*$); pi$%in$ri$ + sqrt(-d)/(2*$); printf( 04n4n:$Fces cople$s conu%$d$s7 fGf& f-f0& pre$l& pi$%in$ri$& pre$l& pi$%in$ri$); } else { rrd + (-)/(2*$); printf(04n4nn$ r$F> re$l dole7 rrd + f0& rrd); } } puts(04n4n@erin$cin nor$l del pro%r$$4n0); return ;}

    Comentarios.3 %ste programa muestra la forma de insertar par'metros atra5s de la l"nea de rdenes. A diferencia del anterior, lafuncin $in()admite los par'metros $r%c# $r%', a tra5s de los cuales

    se pasa informacin desde el sistema operatio hasta el programa. %n elcaso que nos ocupa, es preciso pasar al programa tres nmeros reales, quecorresponder'n a losargumentos $r%'1, $r%'2# $r%'3respectiamente /el nombre del

    programa corresponde a $r%'0. %stos alores deben traducirse despu5s

    al formato binario, lo cual se hace mediante llamadas a la funcin strtol.

    2na e: hecha la traduccin a binario, el programa prosigue sin cambio

    alguno respecto a la ersin anterior.

  • 7/25/2019 Estructura Switch

    8/10

    Ejercicios rouestos

    *. Ejercicio %&%!r%!.'Construir un programa capa: de resolerecuaciones de segundo grado. %l programa debe ser robusto, esto es,ser' capa: de resoler la ecuacin aunque los coeficientes tomen

    alor nulo.

    . Ejercicio %&%!r%".'%scribir un programa capa: de calculardeterminantes ( # -(-. %mplear el m5todo de desarrollo por unal"nea.

    -. Ejercicio %&%!r%(.'Construir un programa que resuela unsistema de dos ecuaciones con dos incgnitas empleandodeterminantes.

    . Ejercicio %&%!r%&.'Construir un programa que resuela un

    sistema de dos ecuaciones con dos incgnitas empleandodeterminantes. %l programa debe ser robusto, esto es, detectar'sistemas sin solucin # se lo comunicar' al usuario.

    . Ejercicio %&%!r%).'%scribir un programa que resuela sistemas( por sustitucin.

    D. Ejercicio %&%!r%*.'%scribir un programa que resuela sistemas-(- por sustitucin.

    E. Ejercicio %&%!r%+.' %scribir un programa que busque las ra"ces de

    una ecuacin de segundo grado por m5todos aleatorios. Nota. &aidea es emplear la funcin sr$ndo()para generar un nmeroaleatorio comprendido entre los dos que marcan los e(tremos delinteralo estudiado. Se an generando parejas de nmeros hastaencontrar una en que ha#a cambio de signo! entonces tiene quehaber una ra": en ese interalo. Se reduce all" el interalo debsqueda, # esta prosigue hasta que la distancia entre puntos seamenor que una cantidad dada.

    F. Ejercicio %&%!r%,.'%scribir un programa que calcule la integral deuna funcin por m5todos aleatorios. Nota. Bsquese en Internet el

    G5todo de Gontecarlo. &a idea es considerar un rect'ngulo quecontiene la cura considerada. Se generan puntos aleatorios en esterect'ngulo, # luego se cuentan los puntos generados # los que caenbajo la cura. &a relacin entre el nmero total de puntos generados# la superfice total del rect'ngulo es la misma que la relacin entre elnmero de puntos que han quedado bajo la cura # la superficie bajola misma, que es la integral buscada.

  • 7/25/2019 Estructura Switch

    9/10

    ESTRUCTURAS DE CONTROL ' SENTENCIA S-ITC

    Sentencia sMitc!.

    Importancia de re$N.

    Importancia de def$ult.

    Sentencia switch.%n las secciones anteriores se ha estudiado un tipo de flujo de controllimitado a las posibilidades ofrecidas por las sentencias alternatias /if-

    else0 # repetititias /for, M!ile0. &as sentencias alternatias permiten

    especificar la reaccin del programa en distintas circunstancias si la lgicadel algoritmo empleado se ajusta a un comportamiento m's o menosdicotmico, es posible construir un 'rbol de sentencias if()anidadas que

    generen el comportamiento necesario. Sin embargo, es frecuente hallargrupos de situaciones /# por tanto de respuestas de programa0 que sereducen a una lista de posibilidades mutuamente e(clu#entes. Ciertamente,se puede implementar un algoritmo de este tipo mediante mltiplessentenciasif()-elseanidadas, pero esta solucin resulta farragosa # poco

    eficiente, porque el cdigo tiene que ir comprobando una por una todas lasposibilidades /todas las condiciones if()0 hasta encontrar la correcta.

    %l lenguaje C ofrece otra posibilidad! construir una e(presin ordinal/posiblemente basada en un tipo enumerado0 que tipifique las posiblessituaciones # ejecutar el cdigo correspondiente a cada alor de estae(presin sin necesidad de e(aminar los dem's. &a sentencia sMitc!es un

    selector multi"a, que admite como argumento el alor de una e(presinordinal, # desencadena la ejecucin del cdigo correspondiente, identificadomediante uno o m's alores constantes del mismo tipo ordinal que lae(presin. &a sinta(is de esta sentencia es como sigue!

    http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0404.html#anchor813918http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0404.html#anchor814078http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0404.html#anchor814287http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0404.html#anchor813918http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0404.html#anchor814078http://maxus.fis.usal.es/fichas_c.web/04xx_PAGS/0404.html#anchor814287
  • 7/25/2019 Estructura Switch

    10/10

    sMitc!( expresin9ordin$l ){ c$se const$nte91 7Bloque91; re$N; c$se const$nte92 7

    Bloque92; re$N; c$se const$nte93 7 c$se const$nte98 7 c$se const$nte9O 7Bloque93; re$N; def$ult 7 Bloque98; re$N;}

    Al ealuar

    la expresin9ordin$lse

    obtiene un entero /qui:' el alor

    de una ariable de tipo enu0 o

    un car'cter. Si este alor es igual

    a la constante que acompaa a

    alguna de las

    cl'usulasc$sepresentes en el

    cuerpo de la sentencia sMitc!,

    entonces se ejecuta el bloque de

    cdigo situado a la derecha de

    los dos puntos que acompaan a

    la cl'usula c$se