Práctica #8

Anuncio
Fecha de efectividad: _______________
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
FACULTAD DE INGENIERÍA (UNIDAD MEXICALI)
DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prácticas de laboratorio
CARRERA
LSC
PLAN DE
ESTUDIO
CLAVE
ASIGNATURA
NOMBRE DE LA ASIGNATURA
2009-2
11294
PROGRAMACION ESTRUCTURADA
PRÁCTICA
No.
LABORATORIO
DE
8
NOMBRE DE
LA PRÁCTICA
DURACIÓN
(HORA)
Licenciado en Sistemas Computacionales
Realizar programas utilizando parámetros por referencia
2
1. INTRODUCCIÓN
Cuando una función debe modificar el valor del parámetro pasado y devolver este valor
modificado a la función llamadora, se ha de utilizar el método de paso de parámetro por
referencia o dirección.
En este método el compilador pasa la dirección de memoria del valor del parámetro a la función.
Cuando se modifica el valor del parámetro (la variable local), este valor queda almacenado en la
misma dirección de memoria, por lo que al retornar a la función llamadora la dirección de la
memoria donde se almaceno el parámetro contendrá el valor modificado. Para pasar una
variable por referencia, el símbolo & debe preceder al nombre de la variable y el parámetro
variable correspondiente de la función debe declararse como puntero.
2. OBJETIVO (COMPETENCIA)
El alumno será capaz de elaborar programas de cómputo utilizando funciones con parámetros
por referencia para mejorar la eficiencia de los mismos, con una actitud analítica y responsable.
Formuló
L.I. Hilda Olivia
Albarrán Padilla
Maestro
Revisó
Aprobó
M.C. Mónica Cristina
Lam Mora
Coordinador de Programa
Educativo
Autorizó
M.C. Miguel Ángel
Martínez Romero
Gestión de Calidad
Director de la Facultad
Código GC-N4-017
Revisión 1
Página 1
de 10
Fecha de efectividad: ______________________
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
FACULTAD DE INGENIERÍA (UNIDAD MEXICALI)
DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prácticas de laboratorio
3. FUNDAMENTO
C permite utilizar punteros para implementar parámetros por referencia, ya que por defecto en
C el paso de parámetros es por valor.
*/ método de paso por referencia, mediante punteros*/
void intercambio(int *a, int *b)
{ int aux = *a;
*a = *b;
*b = aux;
}
En la llamada siguiente, la función intercambio() utiliza las expresiones *a y *b para acceder a
los enteros referenciados por las direcciones de las variables I y j.
int i=3 , j=50;
printf(“i=%d y j=%d \n”, I, j );
intercambio(&I, &j );
printf(“i=%d y j=%d \n”, I, j );
La llamada a la función intercambio() debe pasar las direcciones de las variables
intercambiadas. El operador & delante de una variable significa “dame la dirección de la
variable”.
double x;
&x; /*dirección en memoria de x */
Una variable, o parámetro puntero se declara poniendo el asterisco ( * ) antes del nombre de la
variable. Las variables p, r y q son punteros a distintos tipos.
char *p;
int *r ;
double *q;
/*variable puntero a char */
/*variable puntero a int */
/* variable puntero a double */
Diferencias entre paso de parámetros por valor y por referencia.
Las reglas que se han de seguir cuando se transmiten variables por valor y por referencia son
las siguientes:
• Los parámetros valor reciben copias de los valores de los argumentos que se les pasan.
Código GC-N4-017
Revisión 1
Página 2
de 10
Fecha de efectividad: ______________________
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
FACULTAD DE INGENIERÍA (UNIDAD MEXICALI)
DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prácticas de laboratorio
• La asignación a parámetros valor de una función nunca cambian el valor del argumento
original pasado a los parámetros.
• Los parámetros para el paso por referencia (declarados con * , punteros), reciben la
dirección de los argumentos pasados; a estos se les debe preceder el operador & ,
excepto los arrays.
• En una función las asignaciones a parámetros referencia (punteros) cambian los valores
de los argumentos originales.
Por ejemplo, la escritura de una funcion potrat() para cambiar los contenidos de dos
variables, requiere que los datos puedan ser modificados.
PASO POR VALOR
float a, b:
potrat1( float x, float y)
{
……..
}
PASO POR REFERENCIA
float a, b;
potrat2( float *a, float *b)
{
……..
}
Solo en el caso de potrat2 los valores de a y b se cambiaran. Veamos una aplicación
completa de ambas funciones:
include <stdio.h>
include <math.h>
void potrat1( float , float );
void potrat2( float *, float *);
void main()
{
float a,b;
a=5.0; b=1.0;
potrat1( a, b);
printf( “\n a = %.1f b = %.1f”,a ,b );
potrat1( a, b);
printf( “\n a = %.1f b = %.1f”,a ,b );
}
void potrat1( float x , float y )
{
x = x * x;
y = sqrt ( y );
}
Código GC-N4-017
Revisión 1
Página 3
de 10
Fecha de efectividad: ______________________
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
FACULTAD DE INGENIERÍA (UNIDAD MEXICALI)
DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prácticas de laboratorio
void potrat2( float *x, float *y )
{
*x = (*x) * (*x);
*y = sqrt (*y );
}
La ejecución del programa producirá:
a = 5.0
b = 100.0
a = 25.0
b = 10.0
NOTA.- Todos los parámetros en C se pasan por valor, C no tiene parámetros por referencia,
hay que hacerlo con punteros y el operador &.
Se puede observar en el programa como se accede a los punteros, el operador * precediendo
al parámetro puntero devuelve el contenido.
UTILIZACION DE ARRAYS COMO PARAMETROS
En C, todos los arrays se pasan por referencia (dirección). Esto significa que cuando se llama a
una función y se utiliza un array como parámetro, se debe tener cuidado de no modificar los
arrays en una función llamada. C, trata automáticamente la llamada a la función como si
hubiera situado el operador de dirección & delante del nombre del array.
Para pasar un vector como argumento a una función, en la llamada a la función se escribe
simplemente el nombre del vector, sin índices. Esto sirve para pasar a la función la dirección de
memoria donde se almacena el primer elemento del vector. Como C guarda todos los
elementos de los vectores en posiciones de memoria consecutivas, conociendo la dirección del
primer elemento es posible acceder a todas las demás.
El hecho de que a la función se le pase la dirección del vector y no sus valores provoca un
efecto importante: que los arrays siempre se pasan por referencia, nunca por valor. Esto incluye
a los vectores, que son arrays unidimensionales. Por lo tanto, si algún elemento del vector se
modifica en una función, también será modificado en la función desde la que fue pasado.
Como siempre se pasan por referencia, no es necesario utilizar el símbolo & delante del
parámetro. Por ejemplo, supongamos que serie es un vector de 15 números enteros. Para
pasarlo como parámetro a una función llamada funcion1 escribiríamos simplemente esto:
int serie[15];
funcion1(serie);
En cuanto a la definición de la función, la declaración de un parámetro que en realidad es un
vector se puede hacer de tres maneras diferentes:
Código GC-N4-017
Revisión 1
Página 4
de 10
Fecha de efectividad: ______________________
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
FACULTAD DE INGENIERÍA (UNIDAD MEXICALI)
DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prácticas de laboratorio
void funcion1 (int sere[15]); /* Array delimitado */
void funcion1 (int serie[]); /* Array no delimitado */
void funcion1 (int *serie); /* Puntero */
El resultado de las tres declaraciones es, en principio, idéntico, porque todas indican al
compilador que se va a recibir la dirección de un vector de números enteros. En la práctica, sin
embargo, las dos últimas pueden darnos problemas en algunos compiladores, así que
preferiremos la primera declaración (la que utiliza un array delimitado)
Dentro de la función, el vector puede usarse del mismo modo que en el programa que la llama,
es decir, no es preciso utilizar el operador asterisco.
Por ejemplo: Un programa que sirve para leer 50 números por teclado, y calcular la suma, la
media y la desviación típica de todos los valores. La desviación es una magnitud estadística
que se calcula restando cada valor del valor medio, y calculando la media de todas esas
diferencias.
Observe el siguiente programa de ejemplo detenidamente, prestando sobre todo atención al
uso de los vectores y a cómo se pasan como parámetros.
Los números de la serie se almacenarán en un vector float de 50 posiciones llamado valores.
La introducción de datos en el vector se hace en la función introducir_valores(). No es necesario
usar el símbolo & al llamar a la función, porque los vectores siempre se pasan por variable. Por
lo tanto, al modificar el vector dentro de la función, también se modificará en el algoritmo
principal.
Después, se invoca a tres funciones que calculan las tres magnitudes. El vector también se
pasa por variable a estas funciones, ya que en C no hay modo de pasar un vector por valor.
#include <ncurses.h>
#include <math.h>
void introducir_valores(float N[50]);
calcular_suma(float N[50], float *suma);
float calcular_media(float N[50], float suma);
float calcular_desviacion(float N[50], float media);
int main()
{
float valores[50];
float suma=0, media, desviacion;
initscr()
introducir_valores(valores);
calcular_suma(valores, &suma);
media = calcular_media(valores, suma);
Código GC-N4-017
Revisión 1
Página 5
de 10
Fecha de efectividad: ______________________
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
FACULTAD DE INGENIERÍA (UNIDAD MEXICALI)
DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prácticas de laboratorio
desviacion = calcular_desviacion(valores, media);
printw("La suma es %f, la media es %f y la desviación es %f", suma, media, desviacion);
endwin();
return 0;
}
/* Lee 50 números y los almacena en el vector N pasado por variable */
void introducir_valores(float N[50])
{
int i;
for (i=1; i<=49; i++)
{
printw("Introduzca el valor nº %d: ", i);
scanw("%f", &N[i]);
}
}
/* Devuelve la suma todos los elementos del vector N */
void calcular_suma(float N[50], float *suma)
{
int i;
for (i=1; i<=49; i++)
*suma = (*suma) + N[i];
}
/* Devuelve el valor medio de los elementos del vector N. Necesita conocer la suma de los
elementos para calcular la media */
float calcular_media(float N[50], float suma)
{
int i;
float media;
media = suma / 50;
return media;
}
/* Calcula la desviación típica de los elementos del vector N. Necesita conocer la media para
hacer los cálculos */
float calcular_desviacion(float N[50], float media)
{
int i;
float diferencias;
diferencias = 0;
Código GC-N4-017
Revisión 1
Página 6
de 10
Fecha de efectividad: ______________________
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
FACULTAD DE INGENIERÍA (UNIDAD MEXICALI)
DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prácticas de laboratorio
for (i=1; i<=49; i++)
diferencias = diferencias + abs(N[i] – media) ;
diferencias = diferencias / 50;
return diferencias;
}
A continuación se muestra un ejemplo en el cual se pasa como parámetro un vector, se pasa
por referencia un contador, el cual es modificado en la función altas(), que posteriormente es
pasado como parámetro por valor a otra función llamada mostrar().
#include <ncurses.h>
void altas (int vec[15], int *p_conta);
void mostrar (int vec[15] , int conta);
int main()
{ int vec[15], conta=0;
initscr(); clear();
altas( vec, &conta);
mostrar( vec, conta);
getch();
endwin();
return 0;
}
void altas(int vec[15], int *p_conta)
{ char r;
do
{
printw("Proporciona un número del renglón %d\n",(*p_conta)+1);
scanw("%d",&vec[*p_conta]);
*p_conta = (*p_conta) + 1;
printw(“Deseas continuar?[s/n]”);
scanw(“*%c”, &r);
}while (r==’s’ && (*p_conta)< 15);
}
void mostrar(int vec[15] ,int conta)
{ int i;
printw("VECTOR\tM A T R I Z\n");
for(i=0;i<conta;i++)
printw( " %d\n", vec[i]);
}
4. PROCEDIMIENTO (DESCRIPCIÓN)
A)
EQUIPO NECESARIO
Computadoras con Linux instalado
MATERIAL DE APOYO
Práctica impresa
Código GC-N4-017
Revisión 1
Página 7
de 10
Fecha de efectividad: ______________________
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
FACULTAD DE INGENIERÍA (UNIDAD MEXICALI)
DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prácticas de laboratorio
B)
DESARROLLO DE LA PRÁCTICA
Desarrollar los siguientes programas dependiendo del día que corresponda, utilizando arrays
con funciones y paso de parámetros por referencia. No utilizar variables globales. Mostrar los
totales que se piden en main().
LUNES
En una empresa se conocen los siguientes datos de un máximo de 40 empleados:
Nombre, antigüedad y salario. Se desea elaborar un programa que permita dar de alta a estos
empleados (podrían darse de alta menos). Se tendrá el siguiente menú:
1. Altas
2. Reporte general
3. Reporte de salarios
4. Fin
1. Altas.- En esta opción se darán de alta los datos de empleados.
2. Reporte general.- Se mostrara un reporte general de todos los datos dados de alta y al
final mostrar el total de empleados que ganan más de $5,000.00, así como los sueldos
acumulados de los empleados con más de 15 años en la empresa. Mostrar los totales en
main().
3. Reporte de salarios.- Esta opción permitirá mostrar todos los datos ordenados por
nombre y la suma total de todos los salarios (mostrar este total en main().
4. Fin.- Permitirá la salida del programa.
En caso de no encontrar los datos solicitados, se mostrara un mensaje en ese sentido.
MARTES
En un hospital se desea llevar el control de los pacientes y se desea un programa con las
siguientes opciones
1.- Altas.- Esta opción permitirá dar de alta: Numero de afiliación, nombre, género, edad
y padecimiento, se podrá tener un máximo de 20 pacientes (podrían ser menos).
2.- Reporte por enfermedad.- En esta opción el usuario proporcionara la enfermedad y
mostrara los nombres de los pacientes con este padecimiento, el total de estos y cuantos
menores de edad tienen este padecimiento.
3.- Reporte general.- Esta opción mostrara un reporte de todos los datos contenidos en
los arreglos, mostrando cuantas mujeres mayores de edad padecen de “Gastritis”, la edad
promedio de los hombres, y cuál es el padecimiento mas común.
4.- Fin.- Esta opción permitirá la salida del programa mostrando un mensaje de cortesía.
En caso de no encontrar los datos solicitados, se mostrara un mensaje en ese sentido.
Código GC-N4-017
Revisión 1
Página 8
de 10
Fecha de efectividad: ______________________
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
FACULTAD DE INGENIERÍA (UNIDAD MEXICALI)
DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prácticas de laboratorio
MIERCOLES
Una agencia de Autos desea un programa con el siguiente menú de opciones:
1.- Altas.- En esta opción se darán de alta Número de serie, Agencia, Modelo, Color, Año
y Costo. Podrían darse de alta un máximo de 25 autos.
2.- Reporte General.- Mostrar los datos ordenados por número de serie, y además el
total de autos de un modelo y color proporcionado por el usuario.
3.- Reporte de Agencia.- El usuario proporcionara una agencia y se mostraran todos los
autos de dicha agencia, así como el total de automóviles de la agencia proporcionada, el total
de autos del modelo proporcionado del año 2010 y el total en pesos de los autos de la agencia
dada.
4.- Salir.- Esta opción permitirá la salida del programa.
En caso de no encontrar los datos solicitados, se mostrara un mensaje en ese sentido.
JUEVES
En una escuela se ha solicitado un programa que permita mostrar el siguiente menú de
opciones:
1.- Altas.- Esta opción permitirá dar de alta la matricula, nombre, grado que cursa (primero,
segundo, tercero, etc.,), grupo (A, B, C) y calificación. Podrían darse de alta un máximo de 30
alumnos.
2.- Reporte general.- Esta opción permitirá obtener un reporte general ordenado por
matricula, mostrando los datos completos de cada alumno, así como el total de alumnos
aprobados y la calificación promedio de los alumnos de sexto grado.
3.- Consulta por grupo.- El usuario proporcionara el grado y grupo y mostrara el nombre y
matricula de los datos proporcionados, así como el promedio de los alumnos encontrados, el
total de reprobados de ese grado y grupo, y el nombre del alumno con el promedio más bajo.
4.- Fin.- Esta opción permitirá la salida del programa, mostrando un mensaje de cortesía.
En caso de no encontrar los datos solicitados, se mostrara un mensaje en ese sentido.
VIERNES
Se desea elaborar un programa que permita manejar una agenda de amigos con los siguientes
datos: Clave, Nombre, fecha de cumpleaños, signo zodiacal, edad, animal preferido.
a).- Altas.- Se darán de alta un máximo de 20 amigos.
b).- Consulta general.- Esta opción permitirá mostrar los datos de todos los amigos, así
como el total de los que tienen más de 20 años y el total de los que tienen mi signo del zodiaco.
Código GC-N4-017
Revisión 1
Página 9
de 10
Fecha de efectividad: ______________________
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
FACULTAD DE INGENIERÍA (UNIDAD MEXICALI)
DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prácticas de laboratorio
e).- Consulta mes de cumpleaños.- Se proporcionara mes y mostrara los datos de
todos los amigos que cumplan años en el mes proporcionado, la edad promedio de los amigos
cuyo animal preferido es el perro,
f).- Fin.- Esta opción permitirá la salida del programa.
En caso de no encontrar los datos solicitados, se mostrara un mensaje en ese sentido.
C)
CÁLCULOS Y REPORTE
El maestro revisará los programas realizados por el alumno, probando que estos funcionen de
manera eficiente.
5. RESULTADOS Y CONCLUSIONES
Los resultados serán solo a nivel visualización, no serán impresos, éstos podrán variar
dependiendo de los ejercicios que el alumno realice.
6. ANEXOS
7. REFERENCIAS:
Código GC-N4-017
Revisión 1
Página 10
de 10
Descargar