Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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:
Falso
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
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
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
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
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:
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:
! 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
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?
SALIDA
Valor de la compra Porcentaje de Descuento (20%) Lmite de compra para descuento ($1000)
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
porcen = 0.2
valor
Falso
Cierto
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
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; }
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
Un nmero entero
SI:
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
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
Salida
Un nmero II. Anlisis del problema: a. Definicin de Variables de Salida Nombre res Tipo Real
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
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
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);
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;
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;
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.
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
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; }
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
El nmero a analizar
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
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
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
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
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 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.
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 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
26
27
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
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
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
Flujograma
Inicio
Esta es una de las posibles soluciones que se pueden disear, y tiene un anidamiento a la izquierda.
a, b, c
Aclaracin: Los nmeros deben ser diferentes, por lo que la restriccin es ! ( a!=b && b!=c && a!=c )
No
No
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
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.
Salida
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
digite el tiempo
ta salario?
No
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
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
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
Excepcin
Accin de Excepcin
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.
Salida
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 :
desc = d*monto total = monto desc No: desplegar No existe color con ese cdigo No: desplegar Error en el dato de compra
39
III
Inicio
color
No
monto >0
Si
No
Si
color
4 d = 0.50 5 d = 1.00
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.
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
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
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 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
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
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:
+ * /
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
Flujograma
50
Inicio
op
+
a, b
res = a + b
SUMA, res
+: suma
-: resta *: multiplicacin /: divisin
/
No
op==+ || op==- || op==* || op==/
res = a / b No
Si
b!=0
Si
No se puede
dividir
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
Nombre del empleado Salario del empleado Aos de servicio del empleado
c. Restricciones
sal > 0
&&
annio >0
53
d. Proceso:
//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
e. Variables de Proceso Nombre Tipo Descripcin aum Real Representa la cantidad de dinero que le aumentaran al empleado
54
Inicio
Digite el nombre y los aos de trabajo de empleado
nom, annio
digite el salario
sal
No
sal>0
Si
annio
10 15 20 30
Excep
aum = 0.075s*sal
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; }
56