Practica Final Casos Practicos(1)
-
Upload
javier-alberto-martinez-guadarrama -
Category
Documents
-
view
22 -
download
5
description
Transcript of Practica Final Casos Practicos(1)
Caso Práctico 1. Presentación de un nombre en formatos
múltiples
PROBLEMA
Usted está comenzando a trabajar en un problema que necesita producir nombres en varios
formatos junto con el número de seguro social correspondiente. Como inicio, decide escribir un
programa corto en C++ que introduce el número de seguro social y un solo nombre, y los muestra
en diferentes formatos de modo que pueda estar seguro de que todas sus expresiones de cadena
son correctas.
ENTRADA El número de seguro social y el nombre en tres partes, en el archivo name.dat, cada una
separada por uno o más espacios en blanco.
SALIDA El nombre se escribirá en cuatro formatos distintos en el archivo name.out:
1. Nombre, segundo nombre, apellido, número de seguro social
2. Apellido, nombre, segundo nombre, número de seguro social
3. Apellido, nombre, inicial del segundo nombre, número de seguro social
4. Nombre, inicial del segundo nombre, apellido
ANÁLISIS
Fácilmente podría escribir el número de seguro social y el nombre en los cuatro formatos como
literales de cadena en el código, pero el propósito de este ejercicio es desarrollar y probar las
expresiones en cadena que necesita para un problema más grande. El enunciado del problema no
dice en qué orden se introducen las partes del nombre en el archivo, pero dice que van separadas
por espacios en blanco. Se supone que el orden es nombre, segundo nombre o inicial y apellido.
Debido a que los datos están en un archivo, no necesita solicitar los valores. Una vez que ya tiene
el número de seguro social y el nombre, sólo los escribe en los distintos formatos.
SUPOSICIÓN El orden del nombre en el archivo es nombre, segundo nombre y apellido.
El paso “Obtener el número de seguro social” se puede ejecutar de modo directo mediante lectura
hacia la variable de cadena. Así, no se requiere expansión en el nivel 1 del diseño.
¿Hay algún problema al leer el segundo nombre si hay en su lugar una inicial en vez del segundo
nombre? En realidad no. Sólo se supone que se introduce el segundo nombre y se extrae la inicial
de éste cuando la necesita para los formatos tercero y cuarto. Si se introdujo la inicial para el
segundo nombre, entonces las formas de salida tercera y cuarta serán las mismas. ¿Qué hay
acerca de la puntuación en la salida? Si el apellido viene primero, debe ir seguido de una coma, y
la inicial del segundo nombre debe ir seguida de un punto. Así, si se introduce la inicial en vez del
segundo nombre, debe ir seguida de un punto. Esto se debe agregar a las suposiciones.
SUPOSICIÓN El orden del nombre es: nombre, segundo nombre y apellido, y si se introduce la
inicial del segundo nombre en lugar del segundo nombre, debe ir seguida de un punto.
Lo único que falta definir es la inicial del segundo nombre. Se puede usar el método substr para
tener acceso al primer carácter en el segundo nombre.
Caso Práctico 2: Costo total de hipoteca (parte 1)
PROBLEMA
Sus padres están pensando en refinanciar su hipoteca y le piden ayuda con los cálculos. Ahora que
está aprendiendo C++, comprende que puede ahorrarse el trabajo de teclear en la calculadora si
escribe un programa que realice los cálculos de manera automática.
ANÁLISIS
En el caso práctico del capítulo 1, se dijo que con frecuencia hay pasos obvios en casi cualquier
problema de este tipo:
1. Obtener los datos.
2. Calcular los resultados.
3. Producir los resultados.
Los datos necesarios en este programa son la cantidad de dinero por ahorrar, el número de años
para el préstamo y la tasa de interés. De estos tres valores, se puede calcular el pago mensual.
Aunque es posible resolver este problema con lápiz y papel, también podría escribir un programa
para resolverlo. Por ahora puede hacer constantes los valores de datos y después, cuando aprenda
cómo introducir valores, puede reescribir el programa.
Después de intercambiar ideas con sus padres, encuentra que deben $50 000 y tienen
exactamente 7 años para pagar la deuda. La última cotización de su institución de crédito es por
una tasa de interés de 5.24 sin costos de finiquito.
Usted recuerda vagamente haber visto la fórmula para determinar pagos por medio del interés
compuesto, pero no la recuerda, así que decide buscar en Internet.
En realidad esto parece más fácil de hacer en una computadora que en una calculadora. Dos
valores tomados para la potencia número de pagos parece desalentador. Por fortuna, el archivo
de encabezado <cmath> de C++, que se examinó antes, contiene varias funciones matemáticas
que incluyen la función de potencia. Antes de introducir los valores en la fórmula, es necesario
calcular dos valores intermedios: la tasa de interés mensual y el número de pagos.
Ahora todo lo que queda es imprimir la respuesta en un formato claro y conciso.
Del algoritmo se pueden crear tablas de constantes y variables como ayuda para escribir las
declaraciones del programa.
A continuación se muestra una pantalla de la salida.
Caso Práctico 3: Costo total de hipoteca (parte 2)
PROBLEMA
En el caso práctico anterior usted escribió un programa de calculadora para sus padres con el fi n
de ayudarlos a decidir si refinanciaban su hipoteca. Este ejercicio lo hizo pensar. Todos los
anuncios, desde automóviles hasta aparatos para amueblar las casas, afirman que usted paga
“sólo tanto al mes”. ¿Cuánto está pagando en realidad por una casa o cualquier producto
comprado a plazos? Decide insertar su calculadora en un programa que le dice cuánto en realidad
está pagando sin importar lo que esté financiando. Puesto que ahora sabe usar los ciclos, decide
hacer el proceso dentro de un ciclo, para que el usuario pueda ver cómo un cambio en la tasa de
interés o duración del contrato afecta lo que paga en realidad.
ENTRADA
La calculadora permite que el usuario introduzca los distintos valores. Estos valores se introducen
al programa.
Cantidad total del préstamo (flotante)
Tasa de interés anual (flotante)
Número de años (entero)
SALIDA
Los valores de entrada se imprimen por eco en una tabla que también muestra la cantidad pagada
realmente al término del préstamo.
ANÁLISIS
Este programa es un ciclo simple controlado por suceso, dentro del cual se pide al usuario que
introduzca la cantidad prestada, la tasa de interés y el número de años. Usted decide usar aquí un
ciclo controlado por centinela, con un valor negativo para la cantidad prestada como el centinela.
Esta decisión requiere que usted use una lectura principal, leer la primera cantidad prestada fuera
del ciclo y las siguientes cantidades prestadas al final del ciclo.
Esto parece un diseño muy complicado para un problema tan simple. ¿En realidad es necesario
representar cada módulo como una función de C++? La respuesta depende de su propio estilo.
Algunos módulos tal vez no deben ser funciones; por ejemplo, OpenOutputFile y CloseOutputFile.
Los módulos de operación de archivo son sólo una línea de código cada uno, así que no es
necesario encapsularlos en una función de C++. Si el problema expresa que los nombres de los
archivos de entrada o salida, o ambos, se leerán desde el teclado, entonces este proceso sería
parte del módulo de apertura, lo cual permite representar el módulo en una función.
Si los otros módulos se ejecutan como funciones es una cuestión de estilo. Como se dijo, la
pregunta es si usar una función o no hace que el programa sea más fácil de entender. La expresión
“más fácil de entender” está abierta a interpretación individual. Aquí se elige hacer las funciones
PrintHeading y PrintResults, pero no los otros módulos. En el ejercicio 1 de seguimiento de caso
práctico se pide que ejecute los otros módulos como funciones y determine cuál es más fácil de
entender para usted.
Caso Práctico 4: Perfil de Salud
PROBLEMA
Su abuela ha regresado del consultorio del médico y está confundida respecto a los números que
él usó para evaluar su salud. La enfermera la pesó, le tomó la tensión arterial, anotó su nivel de
colesterol tomado del examen de laboratorio, le pidió que se sentara y le dijo que no tardaría el
médico. Después de media hora entró el médico, examinó su gráfica, sonrió y le dijo que estaba
bien. Al revisar el informe que le entregaron a su abuela, usted comprende que podría haber un
mercado para un programa que explique esta información a los pacientes médicos. Usted tiene un
proyecto programado en su clase de ingeniería de software, de modo que decide escribir un
programa que haga exactamente eso. Antes de que pueda expresar la entrada y la salida de este
programa, necesita hacer una investigación en la red. Encuentra que hay dos partes importantes
para una lectura de colesterol: HDL (bueno) y LDL (malo). La relación de los dos es también
importante. Encuentra varias referencias que proveen interpretaciones para un intervalo de
valores de entrada. La interpretación de su peso depende de la relación entre su peso y su
estatura representado por el índice de masa corporal (IMC). Grandioso, usted ya cuenta con un
programa para calcular el IMC. La tensión arterial está conformada por dos valores: sistólico y
diastólico. Al hablar de tensión arterial, las lecturas están dadas, por lo común, como “algo” sobre
“algo”, tal como 120/80. El primer valor es la tensión sistólica y el segundo es la tensión diastólica.
Ahora, ya tiene información suficiente para determinar la entrada para su programa.
ENTRADA
Nombre del paciente, HDL, LDL, peso en libras, estatura en pulgadas, tensión sistólica y tensión
diastólica.
SALIDA
El nombre del paciente y una interpretación de las lecturas de colesterol, peso y tensión arterial se
escriben en el archivo “Perfil”.
DISCUSIÓN
La descomposición de este problema en tareas es muy directa. Los datos se solicitan, se
introducen y se evalúan. La única pregunta es si se introducen todos los datos a la vez y se evalúan
o se pide que cada módulo de evaluación introduzca sus propios datos. El principio de ocultación
de información sugiere que se inserten los datos dentro de las funciones que evalúan los datos.
Aquí están las interpretaciones que encontró en Internet en relación con el colesterol.
Por fortuna, ya tiene una calculadora de IMC que simplemente puede convertir en una función (al
eliminar las sugerencias de alimento). ¿Qué hay acerca de las lecturas de tensión arterial? De
nuevo, aquí tiene lo que halló en la red al respecto.
El nombre se ha agregado a la lista de parámetros para que el usuario pueda solicitar datos
específicos del paciente. Las dos primeras líneas y las última línea pueden ser traducidas
directamente en C++.
El algoritmo para evaluar el IMC está en el capítulo 5 y la forma de evaluar la tensión arterial es
idéntica, así que se deja la escritura de su diseño como ejercicio 1 del seguimiento de caso
práctico.
¿Qué módulos deben ser funciones y cuáles deben ser codificados en línea? Obtener nombre
(GetName) debe ser obviamente una función de devolución de valor; evaluar colesterol
(EvaluateCholesterol), evaluar índice de masa corporal (EvaluateBMI) y evaluar la tensión arterial
(EvaluateBloodPressure) deben ser funciones void. La pregunta es si los módulos evaluar entrada
(EvaluateInput) deben ser codificados como funciones separadas. Si este programa se fuera a
codificar en un lenguaje que permitiera insertar una función dentro de una función, el buen estilo
sugeriría elaborar funciones separadas de los módulos EvaluateInput. Sin embargo, C++ no
permite anidar funciones. Los módulos EvaluateInput tendrían que codifi carse al mismo nivel que
las funciones que los llaman. Así, estos módulos se deben codifi car en línea. Otra razón para
proceder así es que EvaluateCholesterol, EvaluateBMI y EvaluateBloodPressure son funciones muy
unidas con un propósito e interfaz claramente expresados.
Caso Práctico 5. Calcular estadísticas de
examen
PROBLEMA
Usted es el evaluador en su clase de Política. El maestro le
ha pedido que prepare la siguiente estadística para el
último examen: promedio de calificación, calificación
máxima, calificación mínima, cantidad de calificaciones
arriba del promedio, y cantidad de calificaciones debajo del
promedio. Puesto que se trata del primer examen, usted
decide escribir un programa para calcular estas estadísticas,
de modo que pueda usar el programa también para el resto
de los exámenes.
ANÁLISIS
Vamos a abstraer este problema del contexto dado para
asomarnos a las tareas de manera aislada.
Hay tres cosas separadas que se deben hacer con este
problema: calcular un promedio de valores en un archivo, buscar el valor mínimo y el valor
máximo en un archivo, y comparar cada valor con el promedio. Existen diferentes planteamientos
para la solución de este problema. En el siguiente capítulo examinaremos una técnica de solución
de problemas completamente distinta; sin embargo, aquí basamos nuestra solución sobre el
hecho de que los valores en la lista son entre 0 y 100.
Usamos un array donde los índices tienen un contenido semántico: cada índice representa una
calificación. La analogía a mano es marcar 101 líneas en una hoja de papel y numerar (o etiquetar)
las líneas de 0 a 100. Cada número de línea representa una posible calificación. Conforme se lee
una calificación, se asienta el símbolo # en la línea cuyo número es el mismo que la calificación.
Después de registrar cada calificación de este modo, se realiza la suma de las calificaciones,
sumando los productos de cada calificación (número de línea) multiplicado por el número de
símbolos # en esta línea. El número de calificaciones se puede calcular ya durante la lectura o
cuando se calcula la suma.
Para calcular la calificación más baja, empiece viendo la línea número 0 y vea hacia delante; el
número de línea de la primera línea con un símbolo # es la calificación más baja. Para calcular la
calificación más alta, empiece a ver hacia atrás desde la línea número 100, y el número de línea de
la primera línea que contenga un símbolo # es la calificación más alta. Para determinar cuántas
calificaciones están arriba del promedio, empiece en la línea cuyo número es el promedio de
calificación más 1, y cuente los símbolos # en las líneas desde ahí hasta la línea 100. Para
determinar cuántas calificaciones están debajo del promedio, sume los símbolos # desde la línea
cuyo número es el promedio truncado hasta la línea 0.
El equivalente de la estructura de datos de su hoja de papel es un array de enteros declarado a ser
de un tamaño de 101. El índice es el número de línea;
El componente corresponde a donde se asientan los símbolos # (incremente el componente) cada
vez que ocurra la calificación que corresponde al índice.
ENTRADA
Archivo cuyo nombre es introducido desde el teclado y que contenga calificaciones del examen.
SALIDA
Archivo cuyo nombre es introducido desde el teclado y que muestra las siguientes estadísticas,
correctamente etiquetada
Número de califi caciones Califi cación promedio Califi cación más baja Califi cación más alta Número de califi caciones arriba del promedio Número de califi caciones abajo del promedio
Podemos utilizar las mismas funciones para abrir archivos, que hemos usado en otros programas.
Sin embargo, es necesario cambiar el encabezado impreso en la salida.