Integrantes del Grupo (o Individual) Nro. Nombre C.I. 1 Yusneyi Carballo Barrera 00.000.000 UNIVERSIDAD CENTRAL DE VENEZUELA ESCUELA DE COMPUTACIÓN ALGORITMOS Y PROGRAMACIÓN TAREA Nro 2. REPASO Ciclos, Acciones, Funciones y Pase de Parámetros EJEMPLOS DE SOLUCIÓN OBJETIVOS: Repasar Ciclos (tema 5) y Procedimientos (tema 6). Repasar y consolidar los elementos conceptuales y prácticos de la materia, de manera que estemos a punto para el momento de la realización del quiz y parcial 2. EJEMPLO DE SOLUCIÓN, EJERCICIO 2: 2. Escribe una acción Principal que lea un conjunto de N números, los sume y llame a funciones encargadas de calcular la media, la varianza y la desviación estándar de cada número leído. La media y varianza de los N números X1, X2, X3... Xn se pueden calcular usando las siguientes fórmulas: 1 media n n x i i 1 1 var ianza n n i 1 xi2 1 2 n n i 1 xi 2 desv.Estándar varianza Caracas, 17-Marzo-2014 Análisis del Ejercicio Las sumatorias ( ) se calculan utilizando ciclos, en este caso el más natural es el ciclo Para, pero también puede usarse Repetir o Mientras. En las sumatorias se utiliza además de la variable i o índice del Para, una variable acumuladora, por ejemplo llamada S, la cual inicializamos en 0 porque va a ir acumulando o sumándose en ella los valores de cada iteración o repetición del ciclo. Las productorias ( ) también se calculan utilizando ciclos. Su calculo es parecido al de la sumatoria, se utiliza la variable i o índice del Para, una variable acumuladora, por ejemplo llamada P, la cual inicializamos en 1 porque va a ir acumulando resultados de multiplicaciones (si la iniciamos en 0 el resultado de 0 * nuevo valor, siempre será 0). La Media se calcula utilizando un ciclo Para, que va desde i=1 hasta n, sumando los valores x dados por el usuario La Varianza se calcula utilizando dos ciclos Para, ambos desde i=1 hasta n, el primer ciclo suma los valores de x2 y el segundo los valores de X, pero estos valores son los mismos que la media calculada antes, elevada al cuadrado (media2) La Desviación Estándar no necesita un ciclo porque es la raíz cuadrada de la varianza que calculamos antes y que debemos tener almacenada en una variable. Profa. Yusneyi Carballo Barrera. 20.04.2014 1 ¿Cómo se traducen estas series o fórmulas en Pseudocódigo? Acción CalculosEstadísticos // utiliza funciones para calcular los estadísticos media, varianza y desviación estándar // se asume que los valores X dados por el usuario son de tipo Entero, pero también pueden ser de tipo Real Entero n; Real media, varianza, desvEstándar; // Solicitamos al usuario la cantidad de valores para el cálculo, es decir el valor de n y lo validamos Repetir Escribir (“Indique la cantidad de valores que se va a procesar, el valor de n”); Leer (n); Hasta (n 1); // llamada a las funciones que realizarán los cálculos media = calcularMedia(n); varianza = calcularVarianza(n, media); desvEstándar = calcularDesvEstándar(varianza); Escribir (“Resultado del cálculo de la Media: ” + media + “ resultado del cálculo de la Varianza: ” + varianza + “ resultado del cálculo de la Desviación Estándar: ” + desvEstándar); FAcción; // funciones llamadas o invocadas en la Acción Principal Función calcularMedia(Entero n): Real // calcula la sumatoria de la fórmula estadística Media Entero i, X; Real M, S; n x S = 0; // inicializando la variable acumuladora i // Realizamos el ciclo Para que calcula la sumatoria de los valores de X Para i=1 hasta n en 1 hacer i 1 S es // solicitamos cada valor de X al usuario Escribir (“Suministre el valor ” + i + “ de X”); Leer (X); S = S + X; // acumulamos o sumamos cada valor de x, desde el primer X hasta el último X FPara; // terminamos de calcular la fórmula de la media M = 1 / n * S; Retornar (M); // la función retorna o devuelve el resultado que calculó FFunción; Función calcularVarianza(Entero n; Real Media): Real // calcula la fórmula estadística de la Varianza, aprovechando el resultado ya calculado de la media Entero i, X; Real V, S; S = 0; // inicializando la variable acumuladora n x i Profa. Yusneyi Carballo Barrera. 20.04.2014 S es i 1 2 2 // Realizamos el ciclo Para que calcula la primera sumatoria de los valores de X2 Para i=1 hasta n en 1 hacer // solicitamos cada valor de X al usuario Escribir (“Suministre el valor ” + i + “ de X”); Leer (X); S = S + X ^ 2; // acumulamos o sumamos cada valor de X2, desde el primer X hasta el último X FPara; // terminamos de calcular la fórmula de la varianza, reutilizando o aprovechando el valor // previamente calculado de la media V = 1 / n * S – (1 / n ^ 2) * media ^ 2 ; // 1 / n * S es la traducción a pseudo-código de la sumatoria de la izquierda // (1 / n ^ 2) * media ^ 2 es la traducción a pseudo-código de la sumatoria de la derecha Retornar (V); // la función retorna o devuelve el resultado que calculó FFunción; Función calcularDesvEstándar(Real Varianza): Real // calcula la fórmula estadística Desviación Estándar Real D; // esta cálculo no necesita sumatoria ni ciclos, es una fórmula directa en donde se calcula la raíz cuadrada D = Varianza ^ (1 / 2); Retornar (D); // la función retorna o devuelve el resultado que calculó FFunción; Profa. Yusneyi Carballo Barrera. 20.04.2014 3 EJEMPLO DE SOLUCIÓN, EJERCICIO 3: Construye una acción a la cual se le suministra un valor en segundos y calcula los segundos que le faltan para obtener la siguiente cantidad exacta en minutos (esto implica utilizar pase de parámetros por valor y por referencia). Luego utilice esta acción, en una acción Principal en donde se escriba la cantidad de segundos que hacen falta y los minutos que se obtienen. Considere que sólo debe llamar a la acción que calcula los segundos faltantes si la cantidad de segundos suministrada por el usuario no es múltiplo de 60; si la cantidad de segundos de entrada es múltiplo de 60 se debe informar directamente desde la acción Principal los minutos a que equivalen. Alcance de Variables: Identifique para las acciones y funciones creadas por Usted las variables globales, locales y no locales a cada procedimiento, parámetros actuales y parámetros formales. Análisis del Ejercicio Este ejercicio nos pide básicamente convertir una cantidad en segundos a su equivalente en minutos. Para resolverlo debemos utilizar las operaciones de división de números enteros div y mod, dividiendo entre 60 ya que 1 minuto tiene 60 segundos. El ejercicio nos pide considerar dos posibilidades: 1. Si la cantidad de segundos, por ejemplo llamada s, es múltiplo exacto de 60, informamos en la Acción Principal la cantidad de minutos a la que equivale. 2. Si la cantidad de segundos no equivale a una cantidad exacta de minutos, entonces llamamos a una acción que deberá calcular la cantidad de segundos faltantes para completar el próximo minuto exacto. Los resultados deben escribirse en la Acción Principal, por lo tanto debemos hacer buen uso del pase de parámetros por valor y por referencia. Parte 1. ¿Cómo se traduce este análisis en Pseudocódigo? Acción procesarSegundos // acción Principal que solicita y valida datos de entrada, además de invocar a procedimientos de apoyo y // escribir los resultados del algoritmo Entero seg, min, seg2; // Solicitamos al usuario la cantidad de segundos a procesar y validamos que sea una cantidad positiva Repetir Escribir (“Suministre una cantidad positiva de segundos a procesar”); Leer (seg); // validación adicional y recordatorio en caso de que el usuario suministre un valor negativo Si (seg < 0) Entonces Escribir (“Estimado usuario, le recordamos que la cantidad de segundos debe ser positiva”); FSi; Hasta (seg 0); Profa. Yusneyi Carballo Barrera. 20.04.2014 4 // verificamos la cantidad de segundos suministrada y descartamos los posibles casos Si (seg == 0) Entonces Escribir (“La cantidad de minutos es cero (0), porque la cantidad de segundos también es cero (0)”); Sino Si (seg mod 60 == 0) Entonces min = seg div 60; // con la división entera entre 60 transformamos los segundos a minutos Escribir (“Se suministraron “ + seg + “ segundos, equivalentes a “ + min + “ minutos.”); Sino transformarSegundos(seg, min,seg2); // se llama a la acción encargada de realizar la transformación Escribir (“Se suministraron “ + seg + “ segundos, equivalentes a “ + min + “ minutos, faltan “ + seg2 + “ segundos para completar el minuto ” + (min + 1) ); FSi; FSi; FAcción procesarSegundos; // termina la acción principal // acciones invocadas en la Acción Principal Acción transformarSegundos(Entero s; Var Entero m, s2) // Transforma la cantidad de segundos s a su equivalente en minutos, y calcula segundos faltantes // para el próximo minuto exacto m = s div 60; // mediante esta división entera calculamos los minutos contenidos en la variable s s = s mod 60; // mediante esta división calculamos el resto o segundos que sobran // NOTA: siempre nos va a sobrar aunque sea 1 segundo, porque esta acción sólo es // llamada si la división de seg / 60 no es exacta en la acción Principal s2 = 60 - s; // calculamos la cantidad de segundos para llegar el próximo minuto // NOTA, USO DEL PASE DE PARÁMETROS: // Importante ver que las únicas variables que se devuelven a la acción principal con un nuevo valor o // cambiadas con m y s2, que son las pasadas por Referencia. // en cambio la variable s, como es pasada por Valor, cambia dentro de esta acción transformarSegundos, pero // mantiene su valor original en la acción que la invoca, es decir, no cambia en procesarSegundos. FAcción transformarSegundos; Profa. Yusneyi Carballo Barrera. 20.04.2014 5 Parte 2. Alcance de Variables Alcance de Variables: Globales del Algoritmo, Locales y No Locales procesarSegundos >> Variable Globales seg, min, seg2 Son las variables declaradas en la acción o función Principal del algoritmo Locales No Locales Variables, parámetros y procedimientos invocados dentro de la acción o función Variables locales y no locales de quien lo invocó, sin incluir, las que estén re-declaradas dentro del procedimiento, es decir, identificadas con el mismo nombre de variable. Todo procedimiento es no local a sí mismo. procesarSegundos seg, min, seg2, transformarSegundos procesarSegundos (porque todo procedimiento es no local a sí mismo) transformarSegundos s, m, s2 (parámetros formales de la acción) seg, min, seg2, procesarSegundos No tiene variables declaradas internamente, ni llama a otros procedimientos. (identificadores locales y no locales de quien la llama) transformarSegundos (porque todo procedimiento es no local a sí mismo) Parámetros Actuales y Parámetros Formales: procesarSegundos transformarSegundos Parámetros Formales Parámetros Actuales Son las variables indicadas en la declaración formal, cabecera o firma de la acción o función. Son las variables o procedimientos utilizados en la llamada al procedimiento dentro de otra acción o función. Esta acción principal no tiene parámetros formales en su cabecera. seg, min,seg2; La mayoría de las veces no los usamos para la acción principal. transformarSegundos(seg, min,seg2) Entero s; Var Entero m, s2 usada en la llamada No tiene, no llama internamente a ningún procedimiento. Parte 3. Corrida en frío del Algoritmo Caso de prueba 1: cantidad de segundos suministrados seg = 0 Tabla de variables de la acción Principal procesarSegundos seg min seg2 -(declaradas, pero no inicializadas) -(declaradas, pero no inicializadas) -(declaradas, pero no inicializadas) 0 -- -- Acciones, mensajes al usuario y salidas Escribir (“Suministre una cantidad positiva de segundos a procesar”) Leer(0); seg no es <0, no se ejecuta el condicional seg 0, salimos del repetir de validación seg == 0, se cumple la condición del primer condicional de procesamiento Respuesta mostrada al usuario: Escribir (“La cantidad de minutos es cero (0), porque la cantidad de segundos también es cero (0)”); Fin del algoritmo. Profa. Yusneyi Carballo Barrera. 20.04.2014 6 Caso de prueba 2: cantidad de segundos suministrados seg = -3.720 Tabla de variables de la acción Principal procesarSegundos seg min seg2 -- -- -- Acciones, mensajes al usuario y salidas Escribir (“Suministre una cantidad positiva de segundos a procesar”) Leer(-3720) -3720 seg es <0, se ejecuta el condicional Escribir (“Estimado usuario, le recordamos que la cantidad de segundos debe ser positiva”) Como seg < 0, se ejecuta nuevamente el ciclo Repetir de validación Escribir (“Suministre una cantidad positiva de segundos a procesar”) Leer(3720) 3720 62 seg no es <0, no se ejecuta el condicional seg 0, salimos del repetir de validación seg == 3720, se cumple la condición Sino del condicional de procesamiento se cumple el condicional seg mod 60 == 0, porque 3720 es múltiplo de 60, es decir 3720 mod 60 tiene residuo 0 min = seg div 60, por lo tanto min = 62 Respuesta mostrada al usuario: Escribir (“Se suministraron “ + 3720 + “ segundos, equivalentes a “ + 62 + “ minutos.” ); Fin del algoritmo. Caso de prueba 3: cantidad de segundos suministrados seg = 3.728 Tabla de variables de la acción Principal procesarSegundos seg min seg2 -- Acciones, mensajes al usuario y salidas Escribir (“Suministre una cantidad positiva de segundos a procesar”) Leer(3728) 3728 -- -- (declaradas, pero no inicializadas) (declaradas, pero no inicializadas) seg no es <0, no se ejecuta el condicional seg 0, salimos del repetir de validación seg == 3728, se cumple la condición Sino del condicional de procesamiento seg no múltiplo de 60, porque 3728 mod 60 tiene residuo, sobran 8 segundos se entra por el Sino y se llama a la acción transformarSegundos(seg, min,seg2) // ver tabla de variables de la acción transformarSegundos, próx. pág. 3728 62 52 (pase por valor, no cambia) (pase por referencia, si cambia) (pase por referencia, si cambia) Al regresar de transformarSegundos, se actualizan los valores de las variables pasadas por parámetro Respuesta mostrada al usuario: Escribir (“Se suministraron “ + 3728 + “ segundos, equivalentes a “ + 62 + “ minutos, faltan “ + 52 + “ segundos para completar el minuto ” + 63 ); Fin del algoritmo. Profa. Yusneyi Carballo Barrera. 20.04.2014 7 Tabla de variables de la acción Principal transformarSegundos s m s2 Acciones, mensajes al usuario y salidas 3728 -- -- se invoca a la acción con los valores transformarSegundos(3728, indefinido, indefinido) 3728 62 52 m = s div 60, por lo tanto, m = 3728 div 60; m = 62 s = s mod 60, por lo tanto, s = 3728 mod 60; s = 8 s2 = 60 - s, por lo tanto, s2 = 60 - 8; s2= 52 Los valores de las variables m y s2 se informan a la acción Principal procesarSegundos por ser pasadas por referencia. Fin de la acción y regresamos a la acción invocante, en este caso regresamos al punto de ejecución en la acción Principal. Profa. Yusneyi Carballo Barrera. Ciudad Universitaria de Caracas 20.Abril.2014 Profa. Yusneyi Carballo Barrera. 20.04.2014 8