Download ejemplo 1 - Universidad Central de Venezuela

Document related concepts
no text concepts found
Transcript
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
n

1 
 2
xi 
n  i 1 

2
desv.Estándar  var ianza
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