50.docx

38

Click here to load reader

Upload: oscar-melton

Post on 16-Sep-2015

278 views

Category:

Documents


17 download

DESCRIPTION

docuento 50

TRANSCRIPT

50Captulo 3 Programacin estructuradaSi llueve, llevar el paraguas.La expresin condicionalLacondicines una expresin booleana.Si el resultado de la expresin: escero, se considera una condicinfalsa.no es cero, se considera una condicincierta.x59;if (x) //Lacondicinesverdadera.if (5.7)//La condicin es falsa, comparamosdos valores.El ltimo ejemplo es el ms utilizado durante este curso.Existen tres tipos de estructuras de control selectivas; stas se basan en una condicin o en una opcin:a) Simpleif.b) Dobleif-else.c) Mltipleswitch-break.Bloque de sentencias o instruccin compuestaSe denomina bloque de sentencias a un conjunto de instrucciones delimitadas, por ejemplo en lenguaje C,C11, Java se utilizan llaves que abren ycierran { }.En lenguajes como Pascal, Modula, Delphi, Ada, se utiliza Begin y End.Estas instrucciones se toman como una solasentencia en las estructuras de control.PseudocdigoLenguajeCinicio{inst1inst 1inst2inst 2inst3inst 3..instninst nfin}3.5.1Estructura decontrolselectiva simplesi (if)Estructura de control que dirige a la computadora para ejecutar una o ms instrucciones solamente si lacondicin es verdadera. Si la condicin esfalsa no realiza ninguna accin.El trmino condicin lo utilizaremos a lo largo de estelibro para referirnos a una o mscondiciones.Existen dos formas de representarlo, dependiendo del nmero de instrucciones que se desean realizarsi la condicin se cumple:1.Si se requiere ejecutar una sola instruccin, cuando se cumpla la condicin se representa de la siguienteforma:DiagramadeflujoPseudocdigoLenguajeCsi(condicin)if (condicin)FVInst 1condicininst1inst 1EjemplosEjemplosEjemplos

3.5Estructura de control selectiva o alternativa51Si la condicin se cumple se realizala instruccin 1.Una posibilidad en el cdigo sera:if(i)printf(%d, i/2);2.Si se requiereejecutar un bloque deinstrucciones, cuando secumpla la condicin se representa de lasiguiente forma:DiagramadeflujoPseudocdigoLenguajeCsi(condicin)if (condicin)Inst 1Inst 2Inst 3condicinFVinicio{inst1inst 1inst2inst 2inst3inst 3fin}Nota:Si existe ms de una instruccin para realizar, es necesario utilizar inicio y fin para agrupar las instrucciones,es su alcance sintctico, si no se usa el inicio y fin slo se ejecuta la primera instruccin, mientras que las siguientesinstrucciones se realizarn siempre. En la tabla 3.2 vemos unos ejemplos de las distintas formas que puede adoptar laexpresin dentro de unif.Tabla 3.2Formas de utilizar la instruccinifEjemplosObservacionesif (x.y)if ((x.y) !50 )Las dos expresiones son vlidasy equivalentes. Es ms frecuente la primera; unacondi-cin es verdadera si es diferente de cero.if (x)if (x !50)Las dos expresiones son correctas e iguales. Es ms usual la segunda expresin en estecurso.if (!x)if (x550 )Las dos expresiones son permitidas ysemejantes. Esms comn lasegunda expresin;una condicin es falsa si esigual a cero.if ( x5y )La expresin es incorrecta; recuerde que el operador relacional en lenguaje Ces 55,por lo que debe ser if ( x55y ). Un soloigual es asignacin.3.5.2Estructura decontrolselectiva doblesi/si-no (if/else)Estructura de control que dirige a la computadora para ejecutar una accin si la condicin es verdadera, yotra accin en caso de que sea falsa. Cabe mencionar que las instrucciones debern ser diferentes en cadacaso, ya que sifueran iguales no se requerira una estructura selectiva, con la estructura secuencial se resol-vera el problema.Existen dos formas derepresentarlo, dependiendo del nmero de instrucciones que sedesean realizar sila condicin se cumple o no:52Captulo 3 Programacin estructuradaDiagramadeflujoPseudocdigoLenguajeCcondicinInst 2Inst 1FVsi(condicin)if (condicin)inst1inst 1sinoelseinst2inst 2Si la condicin se cumple se realiza lainstruccin 1, pero si la condicin no se cumple se realiza la instruc-cin 2.DiagramadeflujoPseudocdigoLenguajeCsi(condicin)if (condicin)FVInst 1Inst 2condicinInst 3Inst 4inicio{inst1inst 1inst2inst 2fin}sinoelseinicio{inst3inst 3inst4inst 4fin}Si la condicin se cumple se realizan las instrucciones 1 y 2, pero si no se cumple se realizarn las instruc-ciones 3 y 4.3.5.3Anidamientooescalonamientosi-sino-si(if-else-if)El concepto de anidamiento es muy utilizadoen la programacin y consiste eninsertar (anidar) una estruc-tura dentro de otra.La expresin si anidados se refiere a que podemos utilizar una sentenciasi (if)dentro de otra sentenciasi (if). Esto seemplea cuando se tienen que cumplir varias condiciones para poder ejecutar una accin.Uno de los aspectos ms confusos de las sentenciassi (if)en el lenguaje de programacin es elsi (if)anidado. Unsi (if)anidado es una sentenciasi (if)que es el objeto de otrosi (if)osi no (else). La razn por laque lossi (if)anidados son tanproblemticos es que resulta confuso saberquelsese asocia con qusi (if).

3.5Estructura de control selectiva o alternativa53Sintaxis:PseudocdigoLenguajeCsi(condicin1)if (condicin1)inst1(s)inst1(s);sinoelsesi(condicin2)if (condicin2)inst2(s)inst2(s);sino si(condicin3)elseif(condicin3)inst3(s)inst3(s);......sinoelseinst(s)inst (s);La computadora evalala expresin condicional de arribaabajo. Tan pronto como lacomputadora encuen-tra una condicin verdadera, ejecuta la instruccin(es) y salta el resto de la escalera. Si no esverdad ningunacondicin, la computadora ejecutar elelsefinal. ste acta frecuentemente como condicin por defecto; esdecir si fallan todaslas pruebas anteriores, la computadora realiza la ltima instruccin(es)else. Si no hayelsefinal y son falsas las condiciones, nose hace nada.3.5.4Ejercicios resueltosde laestructura decontrol selectivasimple si (if) y doble si/si-no (if/else)Ejercicio 1.Segn una calificacin, imprimir si sta es aprobada.DiagramadeflujoPseudocdigoLenguajeC#includecalcal.560VFAprobada#includeprincipal()main()inicio{real calfloat cal;imprimir Dame la calificacin:printf(Dame la calificacin: );leer calscanf(%f,&cal);si(cal.560)if (cal.560)imprimirAprobadaprintf (Aprobada);getch();return 0;fin}En el ejercicio 1 se utiliza la estructura selectiva simple. Lacondicinde este ejemplo y la mayora que ve-remos en el presente curso consisten en comparar dos valores (la variable cal y 60), y si dicha condicin es

54Captulo 3 Programacin estructuradaDiagramadeflujoPseudocdigoLenguajeC#include#includecalFVcal.560ReprobadaAprobadaprincipal()main()inicio{realcalfloat cal;imprimir Dame lacalificacin: printf(Dame la calificacin: );leercalscanf(%f,&cal);si(cal.560)if ( cal.560 )imprimirAprobadaprintf (Aprobada);sinoelseimprimirReprobadaprintf(Reprobada);getch();return0;fin}verdadera serealiza unadeterminada accin.Serevisala calificacin(cal), si es mayor o igual que 60, seimprimeaprobada, de lo contrario no imprime nada el programa, es decir slo pasa porparte del programadependiendo de una condicin. Ejemplo: sical585el programa imprime Aprobada, pero sical559, elprograma no imprime nada.Ejercicio 2.Segn una calificacin, imprimir si es aprobada o reprobada.EjemplosA diferencia del ejercicio 1, el ejercicio 2 utiliza laselectiva doble, ya que revisala condicin; si sta se cum-ple (es verdadera) imprimir Aprobada, pero, si la condicin no se cumple imprimir Reprobada, es decirel programa pasa por una u otra instruccin pero no por ambas.Ejemplo: sical585el programa imprimeAprobada, pero sical559, el programa imprime Reprobada. La alternativa doble es ms rpida; en esteejemplo slo evala una condicin, a diferencia de lasimple, que evaluara dos.Para calcular un promedio primero se debern sumar lasncalificaciones y luego dividir el resultadoentren; en este caso especfico son tres calificaciones,as que primero se le piden al usuariocal1,cal2,cal3.Se suman las calificaciones yel resultado se divide entre tres,guardando el resultado en la variablepromedio,tomando en cuenta la necesidad de los( )en la expresin para indicarle al compilador que primero se hacela suma y luego la divisin. Luego se revisa la condicin; si promedi.95 se modificar el valor deprome-dioasignndole el valor de 100, pero si la calificacin fuera menor o igual al 95 el valor de la variablepro-mediono se modifica, es decir queda almacenado el mismo resultado. La ltima instruccin muestra elresultado del promedio.cal1580, cal2590, cal35100. El programa imprimirEl promedio es: 90,0pero sical1598, cal2590,cal35100el programa imprimirEl promedio es: 100ya que el promedio de las tres calificacionesanteriores es de 96.0 y al ser mayor que 95 modifica el valor del promedio a 100 y es el valor que semuestra.Nota:La ltima instruccin (imprimir)se realiza se cumpla o no lacondicin, ya que se encuentra fuera de la estructurade control

Ejercicios complementarios de la estructura de control selectiva simple y doble en psudocdigo y diagrama de flujo65principal ()inicioenterohoras, horas_ext__________________precio_hora, pagaimprimir Introduce elnmero dehoras trabajadasleer_________________imprimir _____________________________________leer precio_horasi (horas.40)iniciohoras_ext________________________________paga_____________________________________finsi nosi_________________pagahoras * precio_horasi no_________________horas*precio_hora* 0.88imprimir pagafinEjercicio 5.Complete el siguiente pseudocdigo que utiliza la estructura selectiva doble anidada, paraimprimir si la persona es nio,adolescente, adulto o anciano, segn el rango de edades siguiente:a)0 a 12es nio.b)13 a17 es adolescente.c)18 a80 es adulto.d)Mayor que 80 esanciano.principal ()inicioentero edadimprimir Cul es la edad?leer __________________si (edad,5____________)imprimir Es niosi no_________( edad,517 )imprimir es adolescentesinosi________________________________imprimiresadultosi no__________________________________fin

66Captulo 3 Programacin estructuradaEjercicios complementarios de la estructura de controlselectiva simple y doble enlenguaje CElaborar la codificacin en Lenguaje C de los siguientes programas (realizando el clculo e impresinrespectiva):1.Leer una fecha (da, mes, ao) y diga si escorrecta o no.2.Leer un ao e imprimir si esbisiesto o no.3.Un millonario tena tres hijos: Juan, Luis y Rosa. Al morir dej el siguiente legado: A Luis le dej 4/3 delo que le dej a Juan. A Juan le dej 1/3 de su fortuna. A Rosa le dej la mitad de lo que le dej a Luis.Adems el licenciado les cobrar por sus serviciosun porcentaje de lo que reciban cada uno de herencia:si el monto esmenor a la tercera parte dela herencia cobrar 3%, encaso contrario 5%. Imprimir cuntorecibirn cada heredero y el abogado.4.El domingo de Pascua es el primer domingo despus de la primera luna llena posterior al equinoccio deprimavera y sedetermina mediante el siguiente clculo:a5ao % 19b5ao % 4c5ao % 7d5(19 * a124) % 30e5(2 *b14 * c16 * d15) % 7n5(221d1e)Dondenindica el nmero del da del mes de marzo (sines igual o menor que 31), en caso contrario elmes de abril se obtiene como (d1e29). Imprimir la fecha del domingo de Pascua a partir de un ao dado.5.Leer un nmero entero (entre 0 y 32 700) e imprimir el nmero de cifras de dicho nmero.6.Leer la hora de unda (0 a 23 horas y minutos, por ejemplo para las 18:30 deber leer18 y 30), e imprimirla misma hora pero en formato de12 horas mostrando las horas, los minutos y el indicador demeridiano.No es posible especificar PM cuando la hora es 0. Cuando se especifica AM tambin representa las horasantes del medioda. Si se especifica PM representa las horas despus del medioda. Si se especifica AM,representa la medianoche. Si se especifica PM, representa el medioda. 12:01 es 1 minuto despus delmedioda, como 12:01 PM, mientras que 12:01 AM es 1 minuto despus de medianoche. Especificar12:01 AM es lomismo que 00:01 o 00:01 AM. Para las 18:30deber imprimir 6:30 PM.7.Leer unnmeroenteroe imprimir sies:a) Cero, positivo o negativo;b) Par o impar (cuando sea positi-vo);c) Mltiplo de 7o no mltiplo de 7(cuando sea impar). Para el nmero 35, imprimir: Esun nmeropositivo, es impar y es mltiplo de 7.8.Leer 5 nmeros eimprimir el menory el mayor deellos.9.Conversin de temperatura expresada en grados Celsius a Fahrenheit : f5(9/5)c132 y viceversa(Fahrenheit a Celsius). Permita elegir entre estas dosopciones.10.Dados dos de los ngulos de un tringulo, calcular el tercer ngulo y determinar si el tringulo es rectngulo(un ngulo igual a 90 grados), acutngulo (sus tres ngulos menores a 90 grados) u obtusngulo (unngulo mayor a 90 grados).11.Leer las horas trabajadas y la paga por hora para calcular el sueldo semanal de un empleado. Cuandolas horas de trabajo exceden de 40 se consideran horas extra; las primeras 8 se pagan al doble; si las horasextra exceden de 8 se pagan las primeras 8 al doble delo que se pagan las horas normales y el resto al triple.12.En un estacionamiento se cobra dela siguiente manera: los primeros 10 minutos songratis, los siguientes15 minutos subsecuentes cuestan $3, la primera hora $10 y cada hora subsecuente $5. A partir de laprimera hora se cobran horas completas. Si es domingo se hace un descuento de 10% sobre elmontototal. Leer los minutos y horase imprimir cunto se pagar.13.Ordenar dosnmeros con un solo if.14.Leer 4 nmeros. Imprimir el mayor, el menor y la suma de ambos.15.Leer 3 nmeros y ordenarlos de manera ascendente.

Ejercicios complementarios de la estructura de control selectiva y doble en lenguaje C6716.Existen cuatro cuadrantes dependiendo del signo de x y y. Lee las coordenadas x y yde un punto eimprime si est en los ejesde coordenadas, en el origen obien en qu cuadrante se encuentra localizado.Segundocuadrante(0,0)PrimercuadranteOrigenTercercuadranteCuartocuadranteY17.Leer el nmero de das transcurridos del ao e imprimir a qu mes pertenece. Por ejemplo si se captura32 se imprimir el mes esfebrero.18.Leer la fecha de nacimiento (da, mes y ao) de una persona y la fecha actual (da, mes y ao), paraposteriormente imprimir la edad alda de hoy. Por ejemplo usted tiene 19 aos 7meses y 14 das.19.Resolver el ejercicio 8 resuelto con una versin diferente, por ejemplo los valores de la condicin puedenir entre apstrofos.20.Leer el nombre de un determinado mes e imprimir cuntos das tiene dicho mes. Utilizar la funcinstrcmp (vea el captulo deprogramacin modular).21.Calcular alguna de las cuatro operaciones bsicas, con el nombre respectivo. Por ejemplo suma. Utilizarla funcin strcmp (veael captulo de programacin modular).3.5.5Estructura decontrolselectiva mltiplesegun_sea (switch)Esta estructura selecciona entre varias posibilidades, dependiendo del valor de la expresin. Cuando en laestructurasi (if)todas las condiciones utilizan laigualdaddeuna variable determinada con constantes pre-definidas, se puede utilizar la instruccinsegun_sea(switch), en dicha instruccin existen ms de dos op-ciones. La estructurasegun_sea(switch)evala una expresin que puede tomarnvalores distintos; segncon cul de estos valores coincida, se ejecutarn ciertas acciones, es decir, el programa o algoritmo seguirun determinado camino entre losnposibles. Dicha expresin slo acepta valoresenterosocaracterespa-ra entrar a la opcin yel operador de relacin es el igual.DiagramadeflujoPseudocdigoLenguajeCsegun_sea(expresin)switch (expresin)inicio{casoexp_const_1: inst1case exp_const_1 : inst1;salirbreak;expresininst 4inst 2inst 3inst 1inst ncasoexp_const_2 : inst2case exp_const_2 : inst2inst3inst3salirbreak;----casoexp_const_n : inst ncase exp_const_n : inst nsalirbreak;casocontrario: inst 10default:inst10fin}Se compara laexpresin(puede ser una sola variable) con cada una de las opciones const y en el mo-mento de encontrar una constante idntica se ejecutanla(s) instruccin(es) correspondiente(s) a esecaso. Al

A veces puede resultar difcil ver claro donde usar un else o qu instrucciones de las que siguen a un if deben ir entre llaves y cuales no. Generalmente la dificultad est en el hecho de intentar teclear directamente un programa en C, en vez de pensar en el problema que se pretende resolver.Para ayudarnos a centrarnos en el problema, existen notaciones grficas, como los diagramas de flujo, que nos permiten ver mejor qu se debe hacer y cuando.En primer lugar, vamos a ver los 4 elementos bsicos de un diagrama de flujo, y luego los aplicaremos a un caso concreto.

El inicio o el final del programa se indica dentro de un crculo. Los procesos internos, como realizar operaciones, se encuadran en un rectngulo. Las entradas y salidas (escrituras en pantalla y lecturas de teclado) se indican con un paralelogramo que tenga su lados superior e inferior horizontales, pero no tenga verticales los otros dos. Las decisiones se indican dentro de un rombo.Vamos a aplicarlo al ejemplo de un programa que pida un nmero al usuario y diga si es positivo, negativo o cero:

El paso de aqu al correspondiente programa en lenguaje C (el que vimos en el ejemplo 19) debe ser casi inmediato: sabemos como leer de teclado, como escribir en pantalla, y las decisiones sern un if, que si se cumple ejecutar la sentencia que aparece en su salida si y si no se cumple (else) ejecutar lo que aparezca en su salida no.Ejercicios propuestos: Crear el diagrama de flujo y la versin en C de un programa que d al usuario tres oportunidades para adivinar un nmero del 1 al 10. Crear el diagrama de flujo para el programa que pide al usuario dos nmeros y dice si uno de ellos es positivo, si lo son los dos o si no lo es ninguno. Crear el diagrama de flujo para el programa que pide tres nmeros al usuario y dice cul es el mayor de los tres.3.1.9. Operador condicional: ?En C hay otra forma de asignar un valor segn se d una condicin o no. Es el operador condicional ? : que se usacondicion ? valor1 : valor2;y equivale a decir si se cumple la condicin, toma el valor v1; si no, toma el valor v2. Un ejemplo de cmo podramos usarlo seranumeroMayor = (a>b) ? a : b;que, aplicado a un programa sencillo, podra ser/*---------------------------*//* Ejemplo en C n 23: *//* C023.C *//* *//* El operador condicional *//* *//* Curso de C, *//* Nacho Cabanes *//*---------------------------*/#include int main(){ int a, b, mayor; printf("Escriba un nmero: "); scanf("%d", &a); printf("Escriba otro: "); scanf("%d", &b); mayor = (a>b) ? a : b; printf("El mayor de los nmeros es %d.\n", mayor); return 0;}Un segundo ejemplo, que sume o reste dos nmeros segn la opcin que se escoja, sera:/*---------------------------*//* Ejemplo en C n 24: *//* C024.C *//* *//* Operador condicional - 2 *//* *//* Curso de C, *//* Nacho Cabanes *//*---------------------------*/#include int main(){ int a, b, resultado; int operacion; printf("Escriba un nmero: "); scanf("%d", &a); printf("Escriba otro: "); scanf("%d", &b); printf("Escriba una operacin (1 = resta; otro = suma): "); scanf("%d", &operacion); resultado = (operacion == 1) ? a-b : a+b; printf("El resultado es %d.\n", resultado); return 0;}Ejercicios propuestos: Crear un programa que use el operador condicional para mostrar un el valor absoluto de un nmero de la siguiente forma: si el nmero es positivo, se mostrar tal cual; si es negativo, se mostrar cambiado de signo. Crear un programa que use el operador condicional para dar a una variable llamada iguales (entera) el valor 1 si los dos nmeros que ha tecleado el usuario son iguales, o el valor 0 si son distintos. Usar el operador condicional para calcular el mayor de dos nmeros.3.1.10. switchSi queremos ver varios posibles valores, sera muy pesado tener que hacerlo con muchos if seguidos o encadenados. La alternativa es la orden switch, cuya sintaxis esswitch (expresin){ case valor1: sentencia1; break; case valor2: sentencia2; sentencia2b; break; ... case valorN: sentenciaN; break; default: otraSentencia;};

Es decir, se escribe tras switch la expresin a analizar, entre parntesis. Despus, tras varias rdenes case se indica cada uno de los valores posibles. Los pasos (porque pueden ser varios) que se deben dar si se trata de ese valor se indican a continuacin, terminando con break. Si hay que hacer algo en caso de que no se cumpla ninguna de las condiciones, se detalla tras default.Vamos con un ejemplo:/*---------------------------*//* Ejemplo en C n 25: *//* C025.C *//* *//* La orden switch *//* *//* Curso de C, *//* Nacho Cabanes *//*---------------------------*/#include int main(){ char tecla; printf("Pulse una tecla y luego Intro: "); scanf("%c", &tecla); switch (tecla) { case ' ': printf("Espacio.\n"); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': printf("Dgito.\n"); break; default: printf("Ni espacio ni dgito.\n"); } return 0;}Ejercicios propuestos: Crear un programa que lea una letra tecleada por el usuario y diga si se trata de una vocal, una cifra numrica o una consonante. Crear un programa que lea una letra tecleada por el usuario y diga si se trata de un signo de puntuacin, una cifra numrica o algn otro carcter. Repetir los dos programas anteriores, empleando if en lugar de switch.