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