Está en la página 1de 56

UNIVERSIDAD DE EL SALVADOR FACULTAD DE INGENIERA Y ARQUITECTURA ESCUELA DE INGENIERA DE SISTEMAS INFORMTICOS INTRODUCCIN A LA INFORMTICA UNIDAD IV PROGRAMACION ESTRUCTURADA, LGICA

ESTRUCTURADA: ESTRUCTURAS SELECTIVAS Objetivo: Conocer y aplicar las estructuras selectivas en la solucin de problemas, tanto en su forma grfica como en cdigo o lenguaje de programacin. Contenido: I. II. III. IV. V. VI. Estructura Selectiva Concepto de Expresin Lgica o Condicin Jerarqua General de Operadores Estructura de Seleccin Simple Estructura de Seleccin Doble Estructura de Seleccin Anidada Estructura de Seleccin Mltiple Pg. 1 2 6 7 14 22 36

INTRODUCCIN En nuestra vida diaria, nos la pasamos decidiendo o seleccionando que hacer, por ejemplo: Cmo me voy a la U? Caminando, en bus, en carro propio, con un amigo?, o tal vez: Voy a clase de Informtica o me voy al cafetn? Y otras cosas tan sencillas como stas. En esta Unidad aprenderemos a tomar decisiones en la resolucin de problemas, unos tan sencillos como los que hasta ahora hemos resuelto y otros un poco ms complicados. Para tomar una decisin siempre nos hacemos una pregunta, aprenderemos tambin a formular esas preguntas correctamente, desde el punto de vista informtico, el ejemplo anterior la pregunta se puede formular as: Me voy a la U caminando? Me voy a la U en bus? Me voy a la U en mi carro? Me voy a la U con un amigo? Note que cada pregunta tiene una de dos posibles respuestas: Si bien No. Recordemos que, en los algoritmos no podemos permitir ambigedades, por lo tanto no es aceptable un tal vez o quizs como respuesta. Tambin es fcil notar que si a la primera pregunta la respuesta es afirmativa ya no es necesario preguntarse las siguientes. Los algoritmos que hemos diseado, hasta el momento, son completamente verticales, es decir que al correrlos (o probarlos), se van ejecutando cada uno de los pasos o bloques desde el principio hasta el fin, en el orden en que fueron diseados, no tomamos ninguna decisin, solo se ejecutan. Con las estructuras Selectivas podremos elegir hacer o no uno de esos bloques, o tambin elegir entre dos o ms rutas del algoritmo.

I. ESTRUCTURA SELECTIVA A los bloques que dentro de un algoritmo, nos permiten elegir que hacer en un momento determinado se les conoce como Estructuras Selectivas, normalmente se selecciona entre dos o ms acciones como clculos, lectura o impresin de datos. Estas estructuras se clasifican en los siguientes tipos: a. Estructura selectiva simple b. Estructura selectiva doble c. Estructura selectiva anidada y d. Estructura selectiva mltiple El smbolo que utilizaremos para representar la toma de una decisin es un rombo:

Este rombo nos permite bifurcar o multiplicar los caminos o rutas, que contienen las diferentes acciones a seleccionar, de acuerdo a la respuesta de la pregunta que se escribe dentro del mismo, a esta pregunta se le conoce como: proceso lgico, expresin lgica o simplemente condicin. El rombo, al igual que las estructuras secuenciales debe tener una nica flecha de entrada y una nica flecha de salida. II. CONCEPTO DE EXPRESIN LGICA O CONDICIN Es una expresin que al evaluarla se puede obtener uno de dos resultados posibles: verdadero (true) o falso (false). La condicin se escribe dentro del rombo y dependiendo del valor de verdad que tome, permite seguir un camino u otro, pero al final deben unirse de nuevo para indicar que la estructura selectiva ha terminado. Flecha de inicio de la Estructura o de Entrada a la misma

Falso
. . .

Condicin

Cierto
. . .

Flecha de fin de la Estructura o de Salida a la misma Para escribir las condiciones se necesitan operadores relacionales y operadores lgicos y de acuerdo a los que se utilicen se clasifican en: Simple y Compuesta. 1. CONDICIN SIMPLE Una condicin simple es una expresin que se construye con un solo operador relacional. Los operadores relacionales son aquellos que permiten comparar dos expresiones y obtener siempre un nico resultado, cierto o falso; se comparan dos expresiones para determinar si son iguales, diferentes o, si una es mayor que la otra.

Estos operadores, ya los conocemos y podemos utilizarlos, lo que cambia es la escritura de algunos de ellos: Operadores Relacionales Significado Ejemplo Menor que a<5 Mayor que b>0 Menor o igual que a <= b Mayor o igual que a >= 10 Igual que a == c Distinto de c != 5

Operador < > <= >= == !=

Debe tenerse en cuenta que el operador ==, solo compara dos datos no asigna nada y que es diferente del operador = que solo asigna, no compara. Ejemplo: Para realizar una de dos acciones posibles, se elige dependiendo del valor que tenga la variable A, si sta es 25 o ms elegimos un camino, de lo contrario se elige el otro:

Falso
. . .

A>= 25

Cierto
. . .

2. CONDICIN COMPUESTA Una condicin compuesta se construye a partir de dos o ms condiciones simples, lo cual indica que tiene ms de un operador relacional. Para escribir condiciones compuestas se hace necesario utilizar los operadores lgicos. Operador && || ! Significado Y O NO Ejemplo a > 8 && a < 10 b==3 || c>5 !(a != b)

El ejemplo con el que empezamos esta unidad ahora podemos escribirlo as: Me voy a la U caminando o ( || ) en bus o ( || ) en mi carro o ( || ) con un amigo? Otro ejemplo es aquel en el que se elige una accin a realizar dependiendo de los valores de tres variables: A, B y C. Si los tres son iguales se elige el camino de cierto si no son iguales el camino de falso. Matemticamente esto lo escribimos as: A=B=C Pero, en informtica, ya que en esta expresin existen dos operadores relacionales de igualdad, se DEBE escribir as:

A == B && B == C En flujograma se ve as:

Falso

A==B && B==C

Cierto . . .

. . .

Tablas de Verdad de los Operadores Lgicos El resultado, o valor de verdad, de una condicin compuesta depende de los operadores lgicos que se utilizan. En las siguientes tablas C1 y C2 son consideradas como 2 condiciones simples, teniendo cada una 2 posibles resultados: cierto o falso, al relacionarlas por medio de operadores lgicos, los resultados de la condicin compuesta cambia ya que cada operador genera un resultado de acuerdo a sus tablas de verdad: Operador && C2 C1 && C2 Cierto Cierto Falso Falso Cierto Falso Falso Falso

C1 Cierto Cierto Falso Falso

El operador && da como resultado CIERTO siempre que las dos condiciones, indicadas en la tabla como C1 y C2, sean ciertas, en caso contrario dar FALSO. Operador || C2 Cierto Falso Cierto Falso

C1 Cierto Cierto Falso Falso

C1 || C2 Cierto Cierto Cierto Falso

El operador || da como resultado FALSO siempre que las dos condiciones sean falsas, en caso contrario dar CIERTO. Operador ! C1 ! C1 Cierto Falso Falso Cierto

El operador ! cambia el valor de verdad de su operando o expresin lgica.

Las condiciones compuestas, pueden volverse complejas, por lo que se recomienda el uso de parntesis que encierren cada condicin simple, con lo que se facilita la comprensin de las mismas, y se indica que condicin queremos que se evale primero. 3. EVALUACIN DE EXPRESIONES LGICAS O CONDICIONES. La evaluacin de una expresin lgica o condicin consiste en ejecutar lo que indica cada operador que la forman y obtener un solo resultado cierto o falso; para hacerlo es necesario llevar cierto orden indicado por la jerarqua (u orden de ejecucin) de cada tipo de operadores. La jerarqua de los operadores, indica el orden en el que se deben aplicar los mismos a un dato o valor; es decir, los que tienen mayor jerarqua se aplican primero. Cuando en una condicin existen varios operadores del mismo nivel jerrquico, se utiliza adems de la jeraqua lo que se conoce como asociatividad. La asociatividad determina el orden de ejecucin de operadores del mismo nivel jerrquico; es decir, si una expresin tiene dos operadores con la misma jerarqua el orden de ejecucin de los mismos es determinado por la asociatividad, que puede ser de izquierda a derecha o de derecha a izquierda, por ejemplo la suma y la resta, tienen el mismo nivel jerarquico y la asociatividad es de izquierda a derecha, por lo tanto en la siguiente expresin: X = 3 a + 5 b 2 + 10

Como todos los operadores tienen el mismo nivel jerarquico, se evalan en orden de aparicin de izquierda a derecha: asociatividad

Jerarqua de Operadores de Relacin OPERADORES JERARQUIA Mayor >, <, >=, <=

Asociatividad

==, !=

Menor

Jerarqua de Operadores Lgicos OPERADOR JERARQUA ! MAYOR && || MENOR

Asociavitidad

4. JERARQUA GENERAL DE LOS OPERADORES Hasta el momento hemos estudiado tres tipos de operadores, aritmticos, relacionales y lgicos y cada tipo tiene una jerarqua propia (nos falta que estudiar 2 tipos ms en la prxima unidad); todos estos operadores nos sirven poder escribir expresiones. Recordemos que una expresin no es ms que un conjunto de datos (constantes y/o variables) que se interrelacionan entre si por medio de operadores, y para obtener un valor de ella, se debe evaluar todos y cada uno de los operadores. Para saber cual operador evaluar primero y cual despus, nos sirve la jerarqua de cada tipo de operadores, pero cuando la expresin tiene

ms de un tipo nos basamos en la jerarqua general de todos los operadores, que se muestra a continuacin: Operador Funciones Prioridad Mayor Asociatividad

- (Cambio de signo) *, /, %

+, -

>, <, <=, >=

==, !=

&& ||

Menor

Los parntesis ( ) se les conoce como signos de agrupacin (en algunos textos de C tambin son considerados como operadores de agrupacin), y nos sirven para agrupar, valga la redundancia, parte de las expresiones que nos interesa realizar primero; por lo que, podemos decir que los parntesis tienen el grado de prioridad ms alto y su asociatividad es de izquierda a derecha, de tal forma que, si en una expresin existe ms de un par de parntesis se evala el que est ms a la izquierda; y si dentro de un par de parntesis hay otro y otros, se evala primero el ms interno.

Ejemplo 1:

Evale la siguiente expresin, considere

F: Falso

C: Cierto

! ( 15 >= pow(7,2) ) || ( 43 8 * 2 % 4 != 3 * 2 / 2 )

Para resolver este ejercicio, se ha utilizado la jerarqua general de los operadores, que hemos visto hasta el momento, y en cada paso se ha subrayado la operacin que se realiza.

Paso 1: Paso 2: Paso 3: Paso 4: Paso 5: Paso 6: Paso 7: Paso 8: Paso 9: Paso 10: Paso 11:

! ( 15 >= pow(7,2) ) || ( 43 8 * 2 % 4 != 3 * 2 / 2 ) ! ( 15 >= 49.0) ) || ( 43 8 * 2 % 4 != 3 * 2 / 2 ) ! ( F ) || ( 43 8 * 2 % 4 != 3 * 2 / 2 ) ! F || ( 43 16 % 4 != 3 * 2 / 2 ) 3*2 / 2 )

! F || ( 43 0 !=

! F || ( 43 0 != 6 / 2 ) ! F || ( 43 0 != 3 ) ! F || ( 43 != 3 ) ! F || (C ) C || C C

En informtica, se considera que todo nmero (positivo o negativo) distinto de cero tiene un valor de verdad de cierto, y el cero es el nico cuyo valor de verdad o lgico es falso. Adems, se toma como 1 (uno) el valor numrico de Cierto y, 0 (cero) el valor numrico de Falso. Por lo tanto, el resultado numrico del ejemplo anterior es 1 (uno) Importante: Los resultados de sumar, restar, multiplicar y dividir dos operandos enteros, siempre es un ENTERO. Los resultados de sumar, restar, multiplicar y dividir dos operandos reales es siempre un nmero REAL. Si uno de los operandos es real y el otro entero el resultado siempre es REAL para suma, resta, multiplicacin y divisin. La divisin residual (%) solo se da entre operandos enteros y el resultado es siempre otro ENTERO. Las funciones matemticas (log, sin, sqrt ) generan un resultado REAL.

III. ESTRUCTURA DE SELECCIN SIMPLE La estructura de seleccin simple se utiliza cuando se tiene que ejecutar una accin si la condicin es verdadera. Es decir, se tienen dos alternativas o caminos a seguir, el camino verdadero tiene la accin a ejecutar; en el camino a seguir cuando la condicin es falsa no existe accin a realizar. La accin del lado del cierto puede estar formada por varios bloques de flujograma, pueden ser estructuras secuenciales, selectivas o como las que veremos ms adelante estructuras repetitivas. La forma general de representar esta estructura es la siguiente:

Falso

Condicin

Cierto Accin

Lo que esta dentro del punteado es la Estructura Selectiva Simple

En donde: La condicin puede ser Simple o Compuesta. Y la accin puede ser un bloque (o ms de uno) de: 1. Entrada de datos 2. Salida de datos 3. Clculo / asignacin 4. Otra estructura selectiva 5. Una combinacin de las anteriores En los flujogramas, la Estructura Selectiva, al igual que la secuencial tiene una flecha de llegada y una de salida, lo cual nos obliga a reunir las dos rutas despus de la accin. Con esta estructura, ya podemos incluir las restricciones de los datos en nuestro algoritmo. Ejemplo 2 En un almacn se realiza un 20% de descuento a los clientes cuya compra supere los $1000.00 Cul ser la cantidad de dinero que pagar una persona por su compra?

I. Planteamiento del Problema ENTRADA

SALIDA

Valor de la compra Porcentaje de Descuento (20%) Lmite de compra para descuento ($1000)

Total a Pagar por el cliente

II. Anlisis del Problema a. Definicin de Variables de Salida. Nombre pago_T Tipo Real Descripcin Almacena la cantidad total de dinero a pagar por el cliente

b. Datos de Entrada Definicin de Variables de Entrada. Nombre Tipo Descripcin valor Real Contiene el monto de la compra Definicin de Constante. Nombre Tipo Descripcin porcen Real Porcentaje de descuento a aplicar

Valor 0.20

c. Restricciones: Es necesario que se realice alguna compra, para calcular, por lo tanto: valor > 0 d. Proceso: Vamos a recordar que en esta parte, solo escribimos los procesos matemticos (clculos o asignaciones) y los procesos lgicos (comparaciones o condiciones), que se realizarn para resolver el problema, y si se escriben en orden nos facilita an ms el diseo de solucin. Aplicar las frmulas pago_T = valor desc; desc = porcen * valor; en donde desc es la cantidad a descontar. en donde porcen es el porcentaje 20% a descontar y es constante.

Los clculos anteriores se realizan siempre y cuando la compra (valor) sea mayor que $1000.00, de lo contrario pago_T ser igual al valor de la compra (valor), lo que quiere decir que no se le descuenta nada al cliente, es decir desc=0. Adems, debe haberse realizado alguna compra, esto es valor > 0, por lo tanto, lo primero que se hace es evaluar si hacemos o no descuento. Ahora si ordenamos la idea planteada anteriormente tenemos lo que debe detallarse en el proceso: porcen = 0.20 desc = 0 Es valor > 1000? S: desc = porcen * valor pago_T = valor - desc e. Definicin de Variables de Proceso. Nombre Tipo Descripcin desc Real Representa la cantidad de dinero a descontarle al cliente

III. Diseo de la Solucin: Flujograma


Inicio

porcen = 0.2

Definicin de la constante Valor inicial de desc

desc = 0 Digite el valor de la compra

valor

Falso

valor > 1000

Cierto

desc = porcen * valor

pago_T = valor -desc Total a pagar, pago_T, dolares

Fin

3.1 SINTXIS EN C DE LA ESTRUCTURA DE SELECCIN SIMPLE La escritura de la estructura de seleccin simple, es muy fcil, involucra como novedad, la palabra reservada if nicamente, y los separadores u operadores de agrupacin ( ) y { }. If, que en espaol significa si, nos indica que inicia la estructura y a continuacin se escribe la expresin lgica o condicin dentro de parntesis; la accin que se realiza se debe escribir en perfecto C, y si tiene ms de una estructura se debe de escribir dentro de llaves. En C, la seleccin simple, se puede escribir de diferentes formas, aunque se incluyen varias en este guin, indicaremos cual es la que se aconseja utilizar, como se muestra a continuacin en la siguiente tabla, en la que se ha resaltado las nuevas palabras reservadas con letras negritas:

10

Sintaxis if (condicin) lnea;

Utilizarla cuando Ejemplo La accin es una if ((x!=7) || (y==7)) a=4; estructura secuencial

Comentarios La accin a realizar es muy sencilla, una sola Estructura Secuencial; es decir, una sola lnea de cdigo. Note que la lnea de accin se escribe con un margen y que en la lnea de if no se escribe ; Repare en el uso de las llaves, se escriben ms adentro que if, y las lneas de la accin, ms adentro que stas.

if ( condicin ) lnea;

La accin est formada por una if ( (x!=7) || (y ==7) ) sola estructura a=4; //RECOMENDABLE secuencial. if ( condicin ) { lnea 1; lnea 2; . . . lnea N; }

La accin est formada por varias estructuras

if ( x>8 ) { a=2*x; b=a+x; }

Es importante recordar que: La condicin puede ser simple o compuesta, y se escribe dentro de parntesis. Si la condicin es verdadera se ejecutan la o las lneas que estn despus de la sentencia if, y se contina con la sentencia despus de la estructura if. Si la condicin es falsa la ejecucin del programa sigue despus de la estructura if. Si solo hay una sentencia dentro del if las llaves no son necesarias.

Las siguientes sugerencias ayudan mucho para depurar un programa: Cuando la condicin es compuesta, cada condicin simple debe estar dentro de parntesis, esto es opcional, pero ayuda a visualizar cada condicin simple y as revisarlas y corregirlas cuando es necesario. La marginacin es muy importante, facilita distinguir la accin a realizar si la condicin da como resultado cierto. La escritura o sintxis de la accin debe ser la correcta, terminando desde luego cada estructura secuencial (o lnea de cdigo) con un punto y coma (;).

11

El programa o codificacin del ejemplo 2 (pgs. 8, 9 y 10) se muestra a continuacin: // Programa que imprime el total a pagar en una tienda #include<stdio.h> #include<conio.h> #define porcen 0.2 main() { float valor, pago_T, desc=0; puts("Digite el valor de la compra"); scanf("%f", &valor); if (valor>1000) desc = porcen*valor; //El margen nos ayuda a distinguir fcilmente la accin del cierto pago_T = valor-desc; printf("\n\n\n Total a pagar \t %.2f", pago_T); getch(); return 0; }

Ejemplo 3 Disee un programa en C que lea un nmero entero, que lo imprima y adems agregue un mensaje de POSITIVO si el nmero es mayor que cero. DESARROLLO DE LA SOLUCIN

I. Planteamiento del problema


Entrada Salida

Un nmero entero

El nmero y un mensaje de positivo, cuando corresponda

II. Anlisis del Problema


a) Definicin de Variables de Salida Se desplegar el nmero con el que se va a trabajar y el mensaje requerido, si corresponde b) Datos de Entrada Definicin de Variables de Entrada Identificador Tipo Descripcin num entero Nmero dado Definicin de Constantes: No existen c) Restricciones: No hay d) Proceso: Es num > 0 ?
12

SI:

imprimir num POSITIVO

e) Definicin de Variables de proceso: No existen

III. Diseo de solucin:


Inicio

Flujograma

Digite un
nmero entero

num

num

num> 0

Si

Es POSITIVO

Fin

IV.

Codificacin // Programa que imprime si un numero es positivo #include <stdio.h> #include <conio.h> main () { int num; puts (Digite un numero entero); scanf (%i, &num); printf (\n %i , num); if (num > 0) printf (\t POSITIVO); getch(); return 0; } // Fin del programa

13

IV. ESTRUCTURA DE SELECCIN DOBLE La estructura de seleccin doble se utiliza cuando se pueden elegir entre dos acciones distintas, dependiendo del resultado obtenido al evaluar la condicin. En flujograma se representa de la siguiente forma:

Falso
Accin 2

Condicin

Cierto
Accin 1

Entre lo punteado tenemos la Estructura Selectiva Doble

La condicin puede ser simple o compuesta, la accin 1 y la accin 2 pueden estar formadas por ms de un bloque de estructuras secuenciales o selectivas. Si al evaluar la condicin el resultado es cierto se ejecuta la accin 1 o si al evaluarla el resultado es falso se ejecuta la accin 2. Ejemplo 4 Disee un algoritmo (flujograma) que calcule la raz cuadrada de un nmero y que le sume 2.1 y=x + 2.1 o bien: Resultado = numero + 2.1

I. Planteamiento del Problema: Entrada

Salida

Un nmero II. Anlisis del problema: a. Definicin de Variables de Salida Nombre res Tipo Real

Resultado del clculo

Descripcin Almacena el resultado del clculo

b. Datos de Entrada Definicin de Variables de Entrada: Nombre Tipo Descripcin num Real Almacena el nmero o dato Definicin de Constantes: No se utilizan, el valor de 2.1 que es constante nos lo dan en la frmula.

14

c. Restricciones: num>0

//el nmero debe ser positivo, para calcular la raz cuadrada.

d. Proceso: El clculo a realizar es muy sencillo: res = sqrt(num) + 2.1 siempre y cuando num sea positivo.

Por lo tanto lo primero que hacemos es verificar la restriccin, para saber si realizamos el clculo o no, nuestra condicin se escribe as: Es num>0? Si: res = sqrt(num) + 2.1 No: Imprimir No se puede calcular e. Definicin de Variables de Proceso: No se utilizan.

III.

Diseo de la Solucin:

Flujograma
Inicio

Digite, un nmero

num

No

num >0

Si

No se puede calcular

res= sqrt (num) + 2.1


El resultado es:, res

Fin

4.1 SINTXIS DE LA ESTRUCTURA DE SELECCIN DOBLE Para escribir en C esta estructura necesitamos adems de la palabra if, los parntesis y las llaves, la palabra else, que le daremos en espaol el significado de de otra forma o de lo contrario y nos sirve para indicar el inicio de la accin del lado Falso (o accin 2 en el dibujo del estructura de la pgina 14).

15

El lenguaje de programacin C tiene adems un operador condicional ?: que nos permite escribir estructuras selectivas dobles y simples, solo que stas deben ser muy sencillas, es decir la accin ha realizar en ambos lados del rombo, tiene que estar formada por una sola estructura secuencial. Este operador condicional (?:) necesita tres operandos, por eso se le conoce como operador ternario, un operando es la expresin lgica o condicin, el segundo es la accin del lado cierto y el tercer operando es la accin del falso: (Condicin)? Accin1 : Accin2; Este operando funciona de la siguiente manera: Se evala la condicin siendo el resultado el que determina que accin ejecutar, si el resultado es cierto (distinto de cero) se ejecuta la accin1; si por el contrario el resultado es falso (igual a cero) se ejecuta la accin2. Se puede utilizar tambin con una estructura de seleccin simple: (Condicin)? Accin1; El operador ?: tiene un grado de jerarqua superior al de asignacin (=) y uno menor que el o (||), es decir se ejecuta dentro de una expresin despus de || y antes de =. Su asociatividad es de derecha a izquierda. Por ejemplo, las sentencias: a=2; b=5; (a>=b)? c=a+2: c=b; printf(\n %i \t %i \t %i, a, b, c); a=2; b=3; (a!=b)? c=a: c=a+1; printf(\n %i \t %i \t %i, a, b, c);

Imprimen los siguientes valores:

A continuacin se muestran las posibles formas de escribir esta estructura, y desde luego, se indica cual es la recomendada:

16

Sintxis
if (condicin) sentencia; else sentencia;

(Condicin)? Accin 1: Accin 2;

if (condicin) sentencia; else sentencia; //RECOMENDADA if (expresin) { Lnea1 de accin1; Lnea2 de accin1; ... } else { Lnea1 de accin 2; Lnea2 de accin 2; ... } Recordar que:

Utilizarla cuando: Ejemplo La accion1 y la accin 2 tienen solo una sola if (a!=3) x=2*a; else x=a; estructura secuencial, que implica una lnea de cdigo. Igual que el anterior, las acciones 1 y 2 slo estn (a!=3)? x=2*a : x=a; formadas por una estructura secuencial y se escribe todo (z<=0)? puts(neg.); en la misma lnea. if ( a!= 3 ) La accin1 y la accin2 x = 2 * a; estn formadas cada una else por una sola lnea de cdigo. x = a;

Comentario Toda la estructura se escribe en la misma lnea

Normalmente las acciones 1 y 2 son asignaciones, clculos fciles o impresiones

Las palabras if y else deben de ir alineadas, al igual que las acciones.

La accin 1 y la accin2 estn formadas por ms de una lnea de cdigo. Si alguna de las acciones solo tiene una lnea, se omiten las llaves.

if ( a>= 5 ) { b = 2*a; x = b+a; t = a; } else { a=2; b= 2*a; }

Las palabras if y else, van alineadas, las llaves tambien tanto las del cierto (if) como las del falso (else) Y las acciones deben llevar un mismo margen, para que se distinga claramente cada parte de la estructura.

Si la condicin es verdadera se ejecutan la o las lneas que estn Si la condicin es falsa se ejecutan la o las lneas que estn despus de la sentencia if, y luego contina con la lnea que sigue despus de la palabra reservada else y contina con las lneas despus de la estructura. que siguen despus de la estructura. Si solo hay una lnea dentro del if o else las llaves no son necesarias. La marginacin es importante, facilita la depuracin del programa.
17

La condicin debe de ir dentro de parntesis.

Codificacin del ejemplo 4 pg. 14 y15 //Programa que hace clculos con raiz cuadrada #include<stdio.h> #include<conio.h> #include<math.h> main() { float num, res; puts("Digite un numero"); scanf("%f", &num); if (num>0) { res = sqrt(num) +2.1; printf("\n\n\n El resultado es: %.4f", res); } else puts("No se puede calcular"); getch(); return 0; }

//Estamos solicitando la salida con 4 decimales

Ejemplo 5 Disee un algoritmo que lea un nmero entero, lo imprima y agregue despus un comentario que indique si el nmero dado es mltiplo de 7 o no. DESARROLLO DE LA SOLUCIN

I. Planteamiento del Problema


Entrada Salida

El nmero a analizar

El nmero y el mensaje requerido

II. Anlisis del problema


a) Definicin de Variables de salida Se desplegar el nmero y un mensaje b) Datos de Entrada Definicin de Variables de Entrada Nombre Tipo de dato Descripcin dato Entero El nmero dado, el que se va a analizar Definicin de Constantes: siete (7) es el dato que se usa como divisor para verificar la multiplicidad c) Restricciones: No hay

18

d) Proceso:
Un nmero es mltiplo de 7, si al dividir el nmero entre 7 (divisin entera) el residuo es cero:

r = dato % 7 Es r = = 0? Si: imprimir Es multiplo de 7 No: imprimir No es multiplo de 7 e) Definicin de Variable de proceso Nombre Tipo de dato Descripcin r Entero El residuo de la divisin de dato entre 7

III. Diseo de solucin:


Flujograma
Inicio digite un nmero entero

IV Codificacin:

dato

/* Verifica si un numero es multiplo de 7 */ #include <stdio.h> #include<conio.h> main() { int dato; puts(digite un nmero entero); scanf (%i, &dato); printf (\n %i, dato); r = dato % 7; if ( r == 0) printf (\t es multiplo de 7); else printf (\t no es multiplo de 7); getch(); return 0;` }

dato r = dato%7
Si r == 0

No es multiplo de 7

Es multiplo de 7

Fin

Ejemplo 6 Disee un flujograma que permita imprimir la suma algebraica de dos nmeros reales y, un comentario de positivo o negativo de acuerdo al resultado, se deben imprimir tambin los datos originales.

19

DESARROLLO DE LA SOLUCIN I. Planteamiento del problema Entrada Salida

Dos nmeros reales

Suma de los nmeros Comentario sobre el resultado Desplegar los dos nmeros

II Anlisis del Problema a. Definicin de Variables de Salida Nombre Tipo suma Real

Descripcin Contiene el resultado de la suma

Recordar que los datos iniciales se desplegarn junto con el resultado y el comentario. El mensaje se toma como constante de caracteres esto es, un comentario impreso. b. Datos de Entrada Definicin de Variables de Entrada Nombre Tipo Descripcin num1 Real Representa el primer nmero num2 Real Representa el segundo nmero Definicin de Constantes: No hay c. Restricciones: No existen, los nmeros pueden ser positivos, negativos o igual a cero. d. Proceso: Para el proceso solo basta con sumar ambos nmeros y el resultado compararlo con cero, para elegir el comentario a imprimir, ntese que de acuerdo a los datos a sumar el resultado tambin puede ser cero: suma = num1 + num2 suma > 0? Si: imprimir Resultado positivo No: suma < 0? Si: imprimir Resultado negativo No: imprimir Resultado cero e. Definicin de Variables de proceso: No hay.

20

III

Diseo de la solucin:

Flujograma
Inicio

Digite los nmeros


num1, num2

suma = num1 + num2

Los datos son:,num1, num2, Resultado,suma

Falso

suma >0

Cierto

Falso

suma <0

Cierto

Resultado positivo
Cierto

Resultado cero

Resultado negativo

Fin

Prueba Lgica: Ejecute el flujograma tomando en cuenta los siguientes datos: 5, -8, 4, 2, -5, -1

Zona de Memoria (RAM)


num1 num2 suma

Zona de Proceso (ALU) suma = num1 + num2 = 5 + (-8) =58 = -3 suma>0? -3>0? FALSO suma <0? -3<0? CIERTO

Zona de Salida Digite los nmeros 5 -8 Los datos son 5 8 Resultado -3 Resultado negativo

-3

21

IV.

Codificacin:

//Suma de dos numeros #include <stdio.h> #include <conio.h> main() { float num1, num2, suma; puts("digite los numeros"); scanf("%f %f", &num1, &num2); suma = num1 +num2; printf("\n Los datos son: \t %.2f \t %.2f \n\n Resultado:\t %.2f\n",num1, num2, suma); if (suma>0) puts("Resultado positivo"); else if (suma<0) puts("Resultado negativo"); else puts("Resultdo cero"); getch(); return 0; }

En este ejemplo, la accin del lado del Falso de la condicin 1 (suma >0), es una nueva estructura selectiva (con suma<0, como condicin), a este tipo de estructura se le conoce como estructuras selectivas anidadas.

V. REPRESENTACIN GRFICA DE ESTRUCTURAS DE SELECCION ANIDADAS, Y SU


SINTAXIS EN C. Las Estructuras Selectivas Anidadas, son aquellas que como accin a realizar en cualquiera de las dos rutas (cierto o falso) existe otra estructura selectiva, y dentro de sus acciones pueden existir otras selecciones. El anidamiento puede ir al lado del cierto, al lado del falso o en ambos lados. 5.1 Sintxis de las Estructuras Selectivas Anidadas La escritura de esta estructura es igual a las anteriores, con las palabras reservadas if y else y los operadores de agrupacin ( ) y { }. Solo hay que recordar que siempre vamos a codificar primero la accin del lado de cierto (if) y despus el del lado del falso (o else) y que si una de esas acciones (o las dos) est formada por varias estructuras, se hacen obligatorias las llaves. Debe tenerse sumo cuidado al marginar esta estructura, para ello basta recordar que if y else deben de ir en un mismo margen, las llaves en otro y las acciones en otro. A continuacin se presentan los diferentes tipos de las estructuras selectivas generales- y su respectiva escritura en lenguaje de programacin C, pero se debe aclarar que stas, pueden cambiar de acuerdo al problema que resuelvan:

Un anidamiento al lado cierto, es el que tiene las condiciones al lado derecho. Esquemticamente lo podemos representar como:

22

Falso

Condicin 1

Cierto

Est. Selec. 1

Falso

Condicin 2

Cierto

Est. Selec. 2
Condicin 3

Accin 5 Accin 4

Falso

Cierto

Est. Selec. 3
Condicin 4

Accin 3

Falso

Cierto

Accin 2

Est. Selec. 4

Accin 1

Codificacin: if (condicin1) if (condicin2) if (condicin3) if (condicin4) { Accin 1; } else { Accin 2; } else { Accin 3; } else { Accin 4; } else { Accin 5; }

23

Tambin podemos tener un anidamiento hacia el lado del Falso, con las condiciones al lado izquierdo, de la siguiente forma:

No

Condicin 1

Si

No

Condicin 2

Si

Accin 1

No

Condicin 3

Si

Accin 2

No

Condicin 4

Si

Accin 3

Accin 5

Accin 4

Codificacin:
if (Condicin 1) { Accin 1; } else if (Condicin 2) { Accin 2; } else if (Condicin 3) { Accin 3; } else if (Condicin 4) { Accin 4; } else { Accin 5; }

24

En los problemas a veces es necesario combinar los anidamientos a ambos lados de la primera condicin, como en el esquema siguiente:
No Si

Condicin 1

No

Condicin 5
Si

Si

No

Condicin 2

Si

No

Condicin 6

Accin 5
No

Condicin 3
No

Si

Accin 6 Accin 4 Condicin 4


Si

Accin 1

Accin 3

Accin 2

Codificacin:
if (Condicin 1) if (Condicin 2) { Accin 1; } else if (Condicin 3) if (Condicin 4) { Accin 2; } else { Accin 3; } else { Accin 4; } else if (Condicin 5) { Accin 5; } else if (Condicin 6) { Accin 6; }

25

En las estructuras anteriores las condiciones pueden ser simples o compuestas, y las acciones, pueden estar formadas por uno o ms bloques, que pueden ser estructuras de entrada, de salida, de proceso matemtico o proceso lgico (o estructuras selectivas) y ambas dependen del problema que se est resolviendo. La numeracin de las condiciones, nos sirven para saber como se debe de ir diseando un flujograma que contenga estructuras selectivas anidadas: Por regla general, para disear un algoritmo que tiene estructuras selectivas anidadas se disean siempre la accin que se ejecutar si la primera condicin se cumple, si existe otra condicin(2) se disea siempre la accin del lado cierto, y as sucesivamente; esto es de arriba hacia abajo; cuando ya no hay ms condiciones y todas las acciones del lado del cierto se han diseado, se disean las acciones de los lados del falso, desde la ltima condicin hasta la primera. Una vez que todas las condiciones y sus acciones estn diseadas, se procede a cerrar de cada rombo sus dos caminos (cierto y falso), tarea que se realiza de abajo hacia arriba, es decir, del anidamiento ms interno al ms externo. La escritura en C de las estructuras selectivas anidadas, es igual a las otras estructuras selectivas (simple y doble), y se hace con las palabras reservadas if y else y los operadores de agrupacin ( ) y { }. Solo hay que recordar que siempre vamos a codificar primero la accin del lado de cierto (if) y despus el del lado del falso (o else) y que si una de esas acciones (o las dos) est formada por varias estructuras, se hacen obligatorias las llaves. Debe tenerse sumo cuidado al marginar esta estructura, para ello basta recordar que if y else deben de ir en un mismo margen, las llaves en otro y las acciones en otro. Como siempre debe recordar: Las condiciones se escriben dentro de parntesis Las acciones pueden estar formadas por una o ms lneas de cdigo Si la accin solo tiene una lnea de cdigo las llaves no son necesarias Solo una accin se ejecuta, dependiendo del resultado al evaluar la condicin. La marginacin es muy importante en la codificacin de estas estructuras.

Ejemplo 7 Disee un programa que lea un nmero, lo imprima e indique si este es: positivo, negativo o cero. DESARROLLO DE LA SOLUCIN

I. Planteamiento del problema.


Entrada Salida

Valor del nmero

Desplegar el nmero y su caracterstica (positivo, negativo o cero)

26

II. Anlisis del problema


a. Definicin de Variables de Salida Se desplegar el nmero dado o dato de entrada y un mensaje para indicar la caracterstica del Nmero dado. b. Datos de Entrada Definicin de Variables de Entrada Nombre Tipo dato Real Definicin de Constantes: No existen c. Restricciones: No existen d. Proceso: Basta con comparar el nmero con cero para saber si es positivo (>0), negativo (<0) o cero (==0) Es dato > 0? S: Imprimir el mensaje "Nmero es positivo" No: Es dato < 0? S: Imprimir el mensaje "Nmero es negativo" No: Imprimir el mensaje "Nmero es cero" e. Definicin de Variables de Proceso: No existen

Descripcin Contiene el valor del Nmero dado

27

III. Diseo de la Solucin: Flujograma


Inicio

Digite un numero dato El numero:, dato, es

No

dato > 0

Si

No

dato < 0

Si

POSITIVO

CERO

NEGATIVO

Fin

IV. Codificacin //Programa que imprime si un numero es pos., neg, o cero #include<stdio.h> #include<conio.h> main() { float dato; puts("Digite un numero"); scanf("%f", &dato); printf("\n\n\n El numero: \t %.2f \t es \t", dato); if (dato>0) printf("POSITIVO \n"); else if (dato<0) printf("NEGATIVO"); else printf("CERO"); getch(); return 0; }

28

Ejemplo 8 Disee un algoritmo que lea tres nmero enteros diferentes entre s, y que los imprima en orden descendente. Por ejemplo si los datos son: 3, 1, y 6 el flujograma debe imprimirlos: 6 3 1 DESARROLLO DE LA SOLUCIN I. Planteamiento del Problema Entrada Salida

Tres nmeros enteros

Desplegar los tres nmeros en orden descendente.

II. Anlisis del Problema a. Definicin de variables de Salida Se desplegarn los tres datos de entrada, en orden descendente b. Datos de Entrada Definicin de Variables de Entrada: Nombre Tipo Descripcin a Entero Contiene el valor del primer nmero b Entero Contiene el segundo nmero c Entero Contiene el valor del tercer nmero Definicin de Constantes: No se han utilizado c. Restricciones: Los nmeros deben ser diferentes entre s: a != b && b != c && a!=c d. Proceso: Para saber que es lo que vamos a hacer, primero haremos una lista de todas las combinaciones posibles: Cualquiera de los tres datos puede ser mayor a b c Si a es mayor, el intermedio puede ser b c; Si a es el mayor y b es el intermedio, c es el menor. Si a es mayor y c es el intermedio, b es menor Con lo que obtenemos 2 alternativas de impresin: a, b, c y a, c, b Al seguir analizando de la forma anterior, obtenemos todas las alternativas posibles: a a b b c c b c a c a b c b c a b a

Lo que vamos a hacer es comparar los nmeros de dos en dos para encontrar el mayor, el intermedio y el menor, siempre y cuando se cumpla la restriccin. El proceso debe quedar as:

29

Es a == b || b == c || a == c? //condicin 1, prueba la restriccin S: Imprimir Los nmeros son iguales.

No:

Es a>b? //condicin 2 Si: Es b>c? //condicin 3 Si: desplegar a, b, c No: Es a > c? Si: desplegar a, c, b No: desplegar c, a, b No: Es b>c? Si: Es a>c? Si: desplegar b, c, No: desplegar b, a, No: desplegar c, b, a

//condicin 4

//condicin 5 //condicin 6 a c

Ntese que cada condicin tiene sus dos respuestas posibles si (cierto) o no (falso) y la marginacin que se ha hecho facilita la distincin de ambas. Adems, siempre se va escribiendo la accin del lado del si o cierto, despus la del no o falso. e. Definicin de Variables de Proceso: No son necesarias

30

III. Diseo de la solucin:

Flujograma

Inicio

Esta es una de las posibles soluciones que se pueden disear, y tiene un anidamiento a la izquierda.

Digite tres numeros enteros

a, b, c

Aclaracin: Los nmeros deben ser diferentes, por lo que la restriccin es ! ( a!=b && b!=c && a!=c )

No
No

!(a!=b && b!=c && a!=c)

Si
No cumplen con restriccin

a>b

Si

No

b>c
No

Si Si b, a, c
No

No

b>c Si a, c, b

Si a, b, c

c, b, a

a>c

a>c

b, c, a

c, a, b

Los nmeros son iguales

Fin

31

IV Codificacin //Escribe 3 numeros en orden descendente #include<stdio.h> #include<conio.h> main() { int a, b, c; puts("Digite tres numeros enteros "); //Separe los numeros por un espacio en blanco scanf("%i %i %i", &a, &b, &c); if (!(a!=b && b!=c && a!=c)) { //Son necesarias, son 2 lineas printf puts("No cumplen con restricciones"); puts("Los numeros son iguales"); } else if (a>b) if (b>c) printf("\n\n\n %i \t %i \t%i", a,b,c); //Note la marginacin de if - else, else //las llaves y las sentencias de if (a>c) //las acciones printf("\n\n\n %i \t %i \t%i", a, c, b); else printf("\n\n\n %i \t %i \t%i", c, a, b); else if (b>c) if (a>c) printf("\n\n\n %i \t %i \t %i", b,a,c); else printf("\n\n\n %i \t %i \t %i", b,c,a); else printf("\n\n\n %i \t %i \t %i",c,b,a); getch(); return 0; }

Ejemplo 9 Calcular la utilidad que un trabajador recibe en el reparto anual de utilidades si ste se le asigna como un porcentaje de su salario mensual que depende de su antigedad en la empresa de acuerdo con la siguiente tabla: TIEMPO UTILIDAD Menos de 1 ao 5% del salario 1 ao o ms y menos de 2 aos 7% del salario 2 aos o ms y menos de 5 aos 10% del salario 5 aos o ms y menos de 10 aos 15% del salario 10 aos o ms 20% del salario

32

I.

Planteamiento del problema Entrada

Salida

Tiempo de trabajar en la empresa, en aos Salario actual

Utilidad

II

Anlisis del problema a) Definicin de Variables de Salida Nombre Tipo Descripcin u Real Utilidad que recibe el trabajador anualmente b) Datos de Entrada Definicin de Variables de Entrada Nombre Tipo Descripcin ta Real Tiempo de trabajar en la empresa s Real Salario actual del trabajador Constantes: Los porcentajes de utilidad: 0.05, 0.07, 0.1, 0.15, 0.2 Los lmites de tiempo en aos: 1, 2, 5, 10 c) Restricciones: ta >= 0 s>0 d) Proceso ta < 1 ? SI: u = s * 0.05 NO: ta < 2? SI: u = s * 0.07 NO: ta < 5 ? SI: u = s * 0.1 NO: ta < 10? SI: u = s * 0.15 NO: u = s * 0.2 e) Variables de Proceso: No se han utilizado

33

III

Diseo de solucin: Flujograma


Inicio

digite el tiempo

ta salario?

No

ta>=0 && s>0

Si

datos incorrectos

No

ta<1

Si

No

ta < 2

Si

u = 0.07*s
No

ta < 5

Si

No

ta<10

Si

u = 0.1*s

u= 0.05*s

u = 0.20*s

u = 0.15*s

Utilidad:, u, dolares

Fin

34

Realice tres pruebas diferentes del flujograma anterior con los siguientes datos: Primera vez: -5, 0, 8, 125.0 Segunda vez: 5, -10, Tercera vez: 10, 800.0, 7, 525.5 Zona de Memoria ta s u -5 100.0 Zona de Proceso Ta>=0 && s>0? -5>=0 && 100>0 F && C Falso Ta>=0 && s>0? 5>=0 && 0 >0 C && F Falso Zona de Salida Digite el tiempo -5 Salario? 100.0

Primera vez

Segunda vez

ta 5

s 0

Digite el tiempo 5 Salario? 0

Tercera vez

ta 15

s 800.00

u 16.0

Ta>=0 && s>0? 10>=0 && 800.0 >0 C && C Cierto ta<1? 15<1 FALSO ta<2? 15<2 FALSO taz5? 15<5 FALSO ta<10 15 <10 FALSO u= 0.2*s u= 0.2*800.0 u= 16.0

Digite el tiempo 5 Salario? 0

Utilidad: 16 dolares

35

IV. Codificacin /* Imprime la cantidad de dinero que recibe un trabajador al final del Ao, como reparto de utilidades */ #include<stdio.h> #include<conio.h> main() { int ta; float s, u; puts (Digite el tiempo de servicio, en aos); scanf (%i, &ta); puts (salario?); scanf("%f", &s); if ((ta>=0) &&(s>0)) { //Esta llave es necesaria ya que son 2 if (ta<1) //estructuras las que forman la accin 1 u= 0.05*s; //una selectiva anidada y una secuencial de else //impresin if (ta<2) u=0.07*s; else if (ta<5) u=0.1*s; else if (ta<10) u=0.15*s; else u=0.20*s; printf (\n \n La utilidad es de: %.2f \t dolares, u); } else puts (DATOS INCORRECTOS); getch(); return 0; }

VI. ESTRUCTURA DE SELECCIN MLTIPLE. Cuando tenemos ms de dos acciones posibles entre las cuales elegir, dependiendo de una misma variable, se utiliza esta estructura, que facilita el diseo de soluciones o flujogramas. En este caso se puede elegir un camino o accin a ejecutar entre varios posibles, segn el valor tomado por una variable de control o una expresin matemtica que se debe evaluar. Esta se ubica dentro del rombo. En esta estructura no se dibujan condiciones, la estructura misma las lleva implcitas, al igual que la evaluacin de las mismas.

36

Lo que nos permite elegir entre los varios caminos se le conoce como Selector y normalmente es una variable, aunque en ocasiones se escribe una expresin matemtica; el selector siempre debe de ser un dato de tipo entero o alfanumrico de un solo carcter. Y de acuerdo al valor que tenga, elige uno de los caminos; al igual que las estructuras secuenciales y selectivas ya estudiadas, solo existe una forma de entrar a la estructura y una nica forma de salir de la misma, en flujograma se representa as: Entrada a la estructura de Seleccin Mltiple

Selector

Valor 1

Accin 1
Valor 2

Accin 2
Valor 3

Accin 3

...
Valor n

Accin n

Lo que est dentro de la lnea punteada forma la Estructura de Seleccin Mltiple.

Excepcin

Accin de Excepcin

Salida de la estructura de Seleccin Mltiple

En donde: El selector es una variable de control o expresin matemtica que debe ser de tipo entero, o alfanumrico de un solo carcter (char). Los diferentes valores (Valor 1, Valor 2, . . . Valor N) son los datos que puede tomar la variable de control o expresin matemtica, estos valores deben de ser del mismo tipo de dato que el selector (enteros o de un solo carcter). Puede haber ms de un valor en cada camino, en tal caso se separan por comas. Estos valores pueden ser constantes o variables. La excepcin es opcional. Las acciones pueden ser de lectura, salida, proceso o una nueva seleccin.

37

Esta estructura funciona de la siguiente forma: Se evala el selector y su resultado se compara con la Valor 1, si ambos valores coinciden (son iguales), se ejecuta la accin 1 y se sale de la estructura, posteriormente se ejecuta la accin que sigue a la estructura. De lo contrario, (el valor del selector y el valor 1 no son iguales) lo compara con el Valor 2, si coincide se ejecuta la accin 2, y as sucesivamente. Si no coincide con ningn Valor de los casos en la estructura, se ejecuta la Excepcin, s existe, en caso contrario continua con el flujo fuera de esta estructura. La accin de Excepcin puede servirnos para probar las restricciones de los datos. Ejemplo 10 En una tienda se efecta una promocin en la cual se hace un descuento sobre el valor de la compra total, segn el color de la bolita que el cliente saque al pagar en caja. Si la bolita es blanca no se le har descuento alguno; si es verde se le har un 10% de descuento; si es amarilla un 25%, si es azul un 50% y si es roja un 100%. Disee un flujograma que determine la cantidad final que un cliente deber pagar por su compra. Se sabe que solo hay bolitas de los colores mencionados.

I.

Planteamiento del problema Entrada

Salida

Monto o valor de la compra Color de la bolita de la promocin Porcentajes de descuento (0,10,25,50,100%)

Cantidad de dinero que el cliente paga por su compra

II. Anlisis del problema a. Definicin de Variables de Salida


Nombre Tipo Descripcin total Real Representa la cantidad final de dinero que el cliente debe pagar

b. Datos de Entrada
Definicin de Variables de Entrada Los datos de entrada sern el monto de la compra y el color de la bolita y para trabajar o procesar con ms facilidad, ste ltimo se le asignar un cdigo numrico de acuerdo al color: 1 si la bolita es blanca; 2 si es verde; 3: si es amarilla y 4: si es azul. Nombre monto color Tipo Real entero Descripcin Representa el valor de la compra Representa el cdigo del color de la bolita que extrajo el cliente. (1: blanco; 2: verde; 3: amarillo y 4: azul y 5: roja)

38

Definicin de Constantes: No existen constantes simblicas, todas se maneja como constantes numricas (Porcentajes de descuento:0, .10, 0.25, 0.5, 1)

c. Restricciones:
monto>0 // el cliente debe de comprar algo color==1 || color ==2 || color==3 || color==4 || color==5 //solo estos colores existen

d. Proceso:
Para calcular lo que el cliente va a pagar, le restamos al monto comprado el descuento que se le realiza: total = monto desc En donde desc es una variable que contendr la cantidad a descontar: desc = d * monto Y d, depende del color de la bolita que saca el cliente: 1 2 color : 3 4 5 d=0 d = 0.1 d = 0.25 d = 0.5 d = 1.0

Adems, todo lo anterior se realiza si se cumplen las restricciones. Si ordenamos la idea anterior, el proceso nos queda as: Es monto>0? //Condicin que evala la restriccin Si: Es color == 1 || color == 2 || color == 3 || color == 4 || color == 5? 1 2 3 4 5 d=0 d=0.1 d=0.25 d=0.5 d=1.0

Si:

color :

//esta es una estructura de //Seleccin Mltiple

desc = d*monto total = monto desc No: desplegar No existe color con ese cdigo No: desplegar Error en el dato de compra

e. Definicin de Variables de proceso:


Nombre desc d Tipo Real Real Descripcin Almacena la cantidad de dinero a descontarle Almacena el porcentaje a descontarle al cliente

39

III

Diseo de Solucin: Flujograma

Inicio

Digite el monto de la compra

monto Digite el cdigo del color

color

No

monto >0

Si

No

color==1 || color==2 || color==3 || color==4 || color5

Si

color

Error, no existe color con ese cdigo

1 d=0 2 d = 0.10 3 d = 0.25

Error en el dato de compra

4 d = 0.50 5 d = 1.00

desc = d * monto total = monto - desc


El total a pagar es: $, total

Fin

40

6.1 SINTXIS DE ESTRUCTURA SELECTIVA MLTIPLE Para escribir esta estructura en C, necesitamos las palabras resevadas switch, que en espaol significa: cambiarse a o interruptor; case, que significa caso, break que significa: romper o cortar y default que se traduce como por defecto o excepcin. De nuevo se utilizaran separadores tales como { } ( ) : ; La palabra switch da inicio a la estructura, y a continuacin se escribe el selector dentro de parntesis ( ). Todas las opciones o rutas de la estructura deben de escribirse entre { }. Cada ruta (opcin o caso) inicia con la palabra case, seguido del valor (etiqueta) que la acompaa y dos puntos : Para finalizar cada opcin se escribe la palabra break. La opcin de Excepcin o defecto se indica con la palabra default seguida de : esta es la nica opcin que no necesita de break al finalizar ya que es la ltima opcin de la estructura. Estructura grfica Sintaxis en C

Selector

v1 Accin1 v2

1
Accin2

v3,v4
Accin3

vn
Exc

Accin n
Ac. Exc.

switch (selector) { case v1: Accin1; break; case v2: Accin 2; break; case v3: case v4: Accin 3; break; ... case vn: Accin n; break; default: Accin de excepcin; }

41

Se debe tomar en cuenta las siguientes consideraciones para obtener una buena sintaxis: El selector puede ser una variable int o char, o una expresin que devuelva un valor int. Los valores con los que se compara el selector se le conoce como etiqueta, si estos (el valor del selector y el de la etiqueta) son iguales se ejecutan las sentencias que forman la Accin dentro de esa etiqueta, indicadas en la figura por v1, v2, v3, v4 y vn. Si ninguna de las etiquetas coincide con el selector, entonces se ejecutan las sentencias que estn dentro de la instruccin default. La instruccin default es opcional; si no se coloca y el selector no coincide con ninguna etiqueta no se ejecuta ninguna sentencia dentro del switch. La ejecucin del programa puede tomar solo 1 entre n caminos posibles.

Cada una de las rutas, opciones o casos (case) se pueden escribir en una sola lnea, incluyendo el break; pero la estructura se distingue mejor en varias lneas y desde luego se lee ms fcilmente y se corrige mucho ms rpido. Una ruta u opcin puede ser elegida por 2 o ms valores o etiquetas, para codificar esto en C, se escriben las etiquetas, una despus de otra, con la palabra case y dos puntos al final de cada etiqueta o valor. La accin se escribe una sola vez.

Codificacin del ejemplo 10 pgs. 37, 38 y 39


//Monto a pagar por el cliente #include <stdio.h> #include <conio.h> main() { float total, monto, desc, d; int color; puts("Digite el monto de la compra"); scanf("%f",&monto); puts("Digite el codigo del color"); puts("1: blanco 2: verde 3: amarillo 4: azul 5: rojo"); scanf("%i", &color); if (monto>0) //Primera restriccion if ((color==1) || (color==2) || (color==3) || (color==4) || (color==5)) { switch (color) { case 1: d=0; break; case 2: d=0.10; break; case 3:

42

d=0.25; break; case 4: d=0.50; break; case 5: d=1.0; break; } desc = d*monto; total = monto-desc; printf("\n\n\n\n El total a pagar es: \t $%.2f", total); } else puts("Error, no existe color con ese codigo"); else puts("Error en el dato de compra"); getch(); return 0; } // Fin de programa

Ejemplo 6.b Disee un diagrama de flujo que permita calcular lo que hay que pagarle a un trabajador, teniendo en cuenta su sueldo y las horas extras trabajadas. Para el pago de horas extra se toma en cuenta la categora del trabajador: Categora Precio de Hora extra 1 $30.oo 2 $38.oo 3 $50.oo 4 $70.oo Cada trabajador puede tener como mximo 30 horas extras, si alguno tiene ms slo se le pagarn 30. A los trabajadores con categora mayor que 4 no se le debe pagar horas extras. I. Planteamiento del Problema Entrada

Salida

Salario del empleado Categora del empleado Nmero de horas extras laboradas Precios de las horas extra segn categora

Pago total al empleado

43

II. Anlisis del Problema a. Definicin de Variables de Salida Nombre Tipo Descripcin pago Real Representa el total a pagar al empleado b. Datos de Entrada Definicin de Variables de Entrada Nombre Tipo Descripcin sal Real Representa el salario del empleado cat Entero Representa la categora del empleado h_e Entero Representa las horas extras Los precios por hora de cada categora, se consideran constantes, y solo se utilizan los valores. Definicin de Constantes: Constantes simblicas no se han utilizado; como constantes numricas tenemos: Precio de una hora extra, segn categora: 30,38,50 y 70 (dlares) Mximo de horas extras permitidas: 30 (horas) c. Restricciones: sal>0 cat>0 h_e>=0 //El empleado tiene un salario //El empleado tiene una categora de 1 en adelante //El empleado tiene o no horas extras trabajadas

d. Proceso: Para calcular el pago total del empleado sumamos al salario, lo que le corresponde por horas extras: pago = sal + extra Donde extra es una variable que representa la cantidad de dinero que el empleado se ha ganado en concepto de horas extra, y depende tanto del nmero de horas extras trabajadas como de la categora: extra = horas * pre pre es la variable que contiene la cantidad a pagar por cada hora extra, segn las categoras: 1 2 cat : 3 4
Cualquier otro valor

pre=30.00 pre=38.00 pre=50.00 pre=70.00 pre=0.00 tanto,

Hay que recordar adems que el mximo de horas extras permitidas es 30; por lo se debe garantizar que paguen solo esas:

44

Si h_e> 30 entonces

horas=30, en caso contrario horas=h_e;

horas es una variable de proceso que nos sirve para controlar el nmero de horas extra realizadas por el empleado.

Ahora ordenando todo lo anterior, obtenemos el proceso que sigue: sal>0 && cat>0 && h_e>=0? //prueba de restricciones 1 pre=30.00 Si: cat : 2 pre=38.00 //Seleccin mltiple 3 pre=50.00 4 pre=70.00 Exc pre=0.00 h_e > 30? Si: horas = 30 No: horas= h_e extra = horas * pre pago = sal + extra No: Desplegar Error en los datos e. Definicin de Variables de proceso Nombre Tipo Descripcin extra real La cantidad de dinero ganada en concepto de horas extra horas entero La cantidad de horas extras laboradas, menor o igual que 30 pre real El precio de una hora extra . III Diseo de la Solucin: Flujograma:

45

Inicio

Digite el salario, la

categora y el nmero de horas extra realizadas

sal, cat, h_e

No i Error en los datos

Sal>0 && cat>0 && h_e>=0

Si

cat 1 2 3 4
pre=30

pre=38

pre=50 pre=70

Excep

pre=0

No horas=h_e

h_e > 30

Si

horas=h_e - 30

extra=pre*horas
pago = sal + extra
El total a pagar es: $, pago

Fin

46

Pruebe el flujograma con: 875.00, 3, 15 Zona de memoria Zona de proceso pago sal extra pre cat H_e horas sal>0 && cat>0 && h_e>0? 1625 875 750 50 3 15 15 875>0 && 3>0 && 15>0 C && 3>0 && 15>0 C && C && 15>0 C && C && C C && C CIERTO Cambio segn cat (3) Caso 1: Caso 2: Caso 3: Pre=50 h_e>30? 15>30 FALSO horas=h_e horas= 15 extra=pre*horas extra=50*15 extra=750 pago=sal+extra pago= 875 + 750 pago=1625.00

Zona de salida Digite el salario, la categora y el nmero de horas extra realizadas 875.0 3 15

El total a $1625.00

pagar

es:

47

IV. Codificacin //Calcula el pago total de un empleado #include<stdio.h> #include<conio.h> main() { float pago, sal, extra, pre; int cat, h_e, horas; puts("digite el salario y la categoria del empleado"); scanf("%f %i", &sal, &cat); puts("digite el numero de horas extra realizadas"); scanf("%i", &h_e); if ((sal>0) && (cat>0) && (h_e>=0)) { switch (cat) { case 1: pre=30; break; case 2: pre=38; break; case 3: pre=50; break; case 4: pre=70; break; default: pre=0; } if (h_e>30) horas=h_e-30; else horas=h_e; extra=pre*horas; pago=sal+extra; printf("\n\n\n El total a pagar es: \t $ %.2f dolares", pago); } else puts("Error en los datos"); getch(); return 0; }

48

Ejemplo 11 Disee un flujograma que simule una calculadora sencilla, con solo las cuatro operaciones aritmticas: suma, resta, multiplicacin y divisin. I. Planteamiento del problema Entrada

Salida

Datos o nmeros a operar Tipo de operacin a realizar II.

Nombre de la operacin realizada Resultado

Anlisis del Problema a. Definicin de Variables de Salida Nombre Tipo Descripcin res Real Almacena el resultado de la operacin realizada El nombre de la operacin se imprimir como mensaje o cadena de caracteres. b. Datos de Entrada Definicin de Variables de Entrada: Nombre Tipo Descripcin a Real Representa el primer dato a operar b Real Representa el segundo dato para operar op Caracter Representa el tipo de operacin a realizar: +: suma; -: resta;*: multiplicacin y /: divisin. Definicin de Constantes: No se han utilizado c. Restricciones: Los nmeros u operandos, pueden ser positivos, negativos o cero. op== + || op== - || op== * || op== / //Solo 4 operaciones permitidas d. Proceso: La operacin que se va realizar, depende del tipo de operacin que hemos digitado:

+ * /

si queremos sumar si queremos restar si queremos multiplicar si queremos dividir

Se debe recordar que en la divisin, el segundo operando o divisor no puede ser igual a cero. El proceso queda entonces as:

49

Es op==+ || op==- || op==* || op==/? Si: op : + - * / res = a + b res = a b res = a * b Es b!=0? Si: res = a / b No: desplegar No se puede dividir

No: Desplegar Error en el tipo de operacin


e. Definicin de Variables de proceso: No se han utilizado

III. Diseo de la Solucin:

Flujograma

50

Inicio

Digite los dos datos

op

+
a, b

res = a + b

SUMA, res

+: suma
-: resta *: multiplicacin /: divisin

res = a - b RESTA, res

Digite el smbolo deseado op

res = a * b MULTIPLICACION, res

/
No
op==+ || op==- || op==* || op==/

res = a / b No

Si

b!=0

Si

No se puede
dividir

res= a / b DIVISIN, res

Error en el tipo de operacin

Fin

51

IV. Codificacin //Programa que simula una calculadora sencilla #include <stdio.h> #include <conio.h> main() { float res, a, b; char op; puts("Digite los dos datos"); scanf("%f %f", &a, &b); //lectura de operandos puts(" +: suma"); //muestra los simbolos de las puts(" -: resta"); //operciones puts(" *: multiplicacion)"); puts(" /: division"); puts("Digite el simbolo de la operacion deseada"); scanf("%s", &op); //lectura del operador if ((op=='+') || (op=='-') || (op=='*') || (op=='/')) //prueba de restriccin de op switch (op) //inicio el lado cierto, solo es una estructura { //Selectiva multiple, no son necesarias llaves case '+': res = a+b; printf("\n\n\n SUMA \t %.2f", res); break; case '-': res = a-b; printf("\n\n\n RESTA \t %.2f", res); break; case '*': res = a*b; printf("\n\n\n MULTIPLICACION \t %.2f", res); break; case '/': if (b!=0) //verificacion del divisor (b) { res = a/b; printf("\n\n\n DIVISION \t %.2f", res); } else puts("No se puede dividir"); break; } else puts("Error en el tipo de operacion"); getch(); return 0; }

52

Ejemplo 12 Disee un programa que calcule el salario de un empleado, si la compaa aumentar a su personal de acuerdo a los aos de servicio de cada empleado, ver tabla de porcentajes. El programa debe imprimir el nombre y el nuevo salario del empleado. Aos de servicio Aumento, en % 10 7.5 15 12 20 18.25 30 25

I. Planteamiento del Problema


Entrada Salida

Nombre del empleado Salario del empleado Aos de servicio del empleado

Desplegar el nombre Nuevo salario del empleado

II. Anlisis del Problema


a. Variables de Salida Nombre Tipo Descripcin sal_nu Real Representa el nuevo salario del empleado Se desplegarn el nombre y la categora del empleado. b. Datos de Entrada Definicin de Variables de Entrada Nombre Tipo Descripcin nom alfanumrico Representa el nombre del empleado sal Real Representa el salario actual del empleado annio entero Representa los aos de servicio del empleado Constantes: Simblicas no se han utilizado.; sin embargo se toman como constantes numricas: los aos de servicios: 10, 15, 20, 30 Porcentajes de aumento 0.075, 0.12, 0.1825, 0.25

c. Restricciones

sal > 0

&&

annio >0

53

d. Proceso:

Es sal>0? Si: annio =

//Prueba de restriccin 10: aum = 0.075*sal 15: aum = 0.12*sal 20: aum = 0.1825*sal 30: aum = 0.25*sal Exc.. aum = 0 // Prueba de La otra restriccin

sal_nu = sal + aum No: Imprimir Error en el dato de salario

e. Variables de Proceso Nombre Tipo Descripcin aum Real Representa la cantidad de dinero que le aumentaran al empleado

III. Diseo de Solucin: Flujograma:

54

Inicio
Digite el nombre y los aos de trabajo de empleado

nom, annio

digite el salario

sal

No

sal>0

Si

annio

Error en el dato del salario

10 15 20 30
Excep

aum = 0.075s*sal

aum = 0.12*sal aum = 0.1825*sal aum = 0.25*sal aum = 0

sal_nu = sal+ aum

nom,

sal_nu

Fin

55

IV. Codificacin
//Calculo de nuevo salario #include<stdio.h> #include<conio.h> main() { float nu_sal, sal, aum; int annio; char nom[40]; puts("Digite el nombre y los aos de servicio del empleado"); scanf(" %[^n]s %i", &nom, &cat); puts("Digite el salario actual"); scanf("%f", &sal); if (sal>0) { switch (annio) { case 10: aum = 0.075*sal; break; case 15: aum = 0.12*sal; break; case 20: aum = 0.1825*sal; break; case 30: aum = 0.25*sal; break; default: //prueba restriccin de aos aum = 0; } nu_sal = sal + aum; printf("\n\n\n %s \t %i \t %.2f dolares", nom, nu_sal); } else puts("Error en el dato del salario"); getch(); return 0; }

Material editado por Carolina Ayala y Milagro Castillo Ciclo I 2012

56

También podría gustarte