Codificación aprenderaprogramar.com: CU00214A
EJERCICIO
Desarrollar el pseudocódigo y el diagrama de flujo para un programa con las siguientes opciones:
a) Introducir un valor entero impar comprendido entre 1 y 19
b) Calcular la serie numérica 1 + 3 + 5 + ··· + n
c) Calcular 1 * 3 * 5 * ··· * n
d) Salir del programa.
Nota: Los cálculos se han de realizar a través de un vector que almacene los valores impares comprendidos entre 1 y n.
SOLUCIÓN:
Variables Enteras: E, Dato, Cantidad, Valor() 1. Inicio 2. Mientras E <> 4 Hacer 2.1 Si E = 1 Entonces Llamar Genera FinSi 2.2 Si E = 2 y Dato <> 0 Entonces Llamar CalculaSuma(Cantidad) PorValor FinSi |
|
2.3 Si E = 3 y Dato <> 0 Entonces Llamar CalculaMult(Cantidad) PorValor FinSi 2.4 Mostrar “Elija opción: 1. Introducir dato 2. Calcular 1 + 3 + 5 + ··· + n 3. Calcular 1 * 3 * 5 * ··· * n 4. Salir” 2.5 Pedir E Repetir 3. Fin
Módulo Genera Variables Enteras: Impar, i Booleanas: Par 1. Dato = 0 2. Mientras Dato <= 0 ó Dato > 19 ó Par = Verdadero Hacer Par = Falso Mostrar “Introduzca un número impar entre 1 y 19” Pedir Dato Si Dato mod 2 = 0 Entonces Par = Verdadero : Mostrar “El número debe ser impar” FinSi Repetir 3. Impar = - 1 : i = 0 4. Hacer i = i + 1 Impar = Impar + 2 Redimensionar Valor(i) Valor(i) = Impar Repetir Mientras Impar < Dato 5. Cantidad = i FinMódulo
Módulo CalculaSuma(Numero: Enteros) Variables Enteras: i, Suma 1. Suma = 0 2. Desde i = 1 hasta Numero Hacer Suma = Suma + Valor(i) Siguiente 3. Mostrar “La suma 1 + 3 + 5 + ··· + n vale”, Suma FinMódulo
Módulo CalculaMult(Cifra: Enteros) Variables Enteras: i, Acumulado 1. Acumulado = 1 2. Desde i = 1 hasta Cifra Hacer Acumulado = Acumulado * Valor(i) Siguiente 3. Mostrar “El producto 1 * 3 * 5 * ··· * n vale”, Acumulado FinMódulo
|
|
Comentarios: El programa consta del algoritmo principal y 3 módulos. En el módulo Genera se pide un número impar entre 1 y 19 no permitiendo la salida hasta que se tiene un dato válido. Tras ello se generan una serie de valores: Valor(1), Valor(2), ... que contienen los números impares comprendidos entre el 1 y el proporcionado por el usuario.
Obsérvese que por cada impar que se procesa en el bucle se produce un redimensionamiento de la matriz Valor. El proceso es algo así:
Detectar valor -> Redimensionar matriz -> Asignar valor -> Repetir si procede |
Esto no es demasiado eficiente ya que nos obliga a redimensionar en cada paso del bucle. Una alternativa sería la siguiente:
1. Sabemos que entre 1 y 19 podemos tener entre 1 y 10 elementos en el vector de número impares.
2. Asignamos un valor inicial de 10 al localizador (suponemos 10 elementos).
3. Asignamos todos los impares que existan a elementos de la matriz existentes.
4. Conocidos los elementos válidos, redimensionamos la matriz eliminando los innecesarios.
El cambio en el pseudocódigo sería:
3. Impar = - 1 : i = 0 4. Redimensionar Valor(10) 5. Hacer i = i + 1 Impar = Impar + 2 Valor(i) = Impar Repetir Mientras Impar < Dato 6. Redimensionar Valor(i) 7. Cantidad = i |
Hemos sustituido la repetición de un proceso de redimensionar n veces por redimensionar dos veces, lo cual nos resulta ventajoso casi en cualquier circunstancia.
Si i = 10 Redimensionar Valor(i) resulta redundante pero no nos afecta al no crearse ni destruirse datos. Si se quiere evitar la redundancia se puede poner una condición de entrada Si i <> 10.
¿Qué hubiera pasado si en vez de entre 1 y 19 se admitieran datos entre 1 y 1999? Antes de entrar a valorar el por qué de los extremos 1 y 19, pensemos en la asignación de contenido al vector Valor en el módulo Genera. Si el número de impares puede ser muy grande, mantener un redimensionamiento por bucle hará más lento y pesado todavía el proceso. Pero por otro lado ya no son 10 unidades el rango de variación posible del vector, sino 1000. Y crear un vector gigante para después usarlo mínimamente tampoco es demasiado eficiente. Es como contratar un gran camión container para al final... transportar en él una caja de zapatos.
Para acceder a la información general sobre este curso y al listado completo de entregas pulsa en este link: Ver curso completo.
Para hacer un comentario o consulta utiliza los foros aprenderaprogramar.com, abiertos a cualquier persona independientemente de su nivel de conocimiento.