Fundamentos de la Informática. Primero de Industriales. Mecánica, Química, Electricidad y Electrónica Departamento de Tecnologías de la Información PRACTICA 9. PROCEDIMIENTOS. PARÁMETROS POR VARIABLE O POR REFERENCIA. 1) Introducción. Como ya hemos visto en la práctica anterior la única forma posible de pasarle información a una función cuando la llamamos es mediante los parámetros, que no son más que variables locales a la función que se inicializan con los valores que existen en la llamada. Existen dos tipos de parámetros, según la forma en la que los pasemos: parámetros pasados por valor (vistos en la Práctica 9) y parámetros pasados por variable o por referencia, que se verán en la presente práctica. 2) Conceptos nuevos. Los conceptos nuevos introducidos son: 1) Parámetros por referencia. 2) Creación y utilización de variables tipo puntero. 3) Lenguaje C. Las nuevas características de C que ha aprendido y que necesita saber para la realización de las prácticas. 1) Declaración y utilización de variables tipo puntero. 2) Paso de parámetros por referencia. 4) Entorno Turbo C. El EID de Dev-C++, nos ofrece una nueva funcionalidad a la hora de depurar un programa que contiene funciones. Es la opción Depurar --> Siguiente Paso. Proponemos al alumno que averigüe la diferencia que hay entre ejecutar un programa Avanzando paso a paso y usando esta nueva opción de siguiente paso, para ello utilice cualquier programa que contenga al menos dos funciones definidas por el usuario y que sean llamadas desde la función principal 5) Ejercicios propuestos. A continuación se propone el enunciado de una serie de ejercicios que el alumno tiene que realizar antes de asistir a la sesión de prácticas, con el fin de presentar las dudas que hayan aparecido en la realización de los mismos durante la sesión de prácticas. 1) Realizar un programa que lea tres valores enteros por teclado y calcule el máximo. Para realizar el programa es imprescindible utilizar las siguientes funciones: o void leer_datos (int * n1, int * n2, int *n3); Fundamentos de la Informática. Primero de Industriales. Mecánica, Química, Electricidad y Electrónica Departamento de Tecnologías de la Información - Valores de entrada: tres variables vacías donde guardar los tres valores que se lean por teclado. - Valores de salida: ninguno; o int maximo (int n1, int n2, int n3); - Valores de entrada: tres valores enteros. - Valores de salida: el máximo de los tres valores. 2) Realizar un programa que pida por teclado un array de números. El array se declará de la forma: int num[50]. El usuario deberá introducir por teclado cuántos números quiere escribir en el array. La carga o introducción de números en el array se realizará a través de la función: void leer_numeros(int n,int num[50]), donde n indica cuántos números se van a leer. A través de otra función calcula_max_min (int n,int num[50],int *max, int *min) calcula el máximo y mínimo de los elementos introducidos en el array. 3) Realizar un programa que pida dos números enteros por teclado y muestre por pantalla el siguiente menú: MENU + --> Sumar - --> Restar * --> Multiplicar / --> Dividir ^ --> Potencia ! --> Factorial s --> Salir Elija opción: El usuario deberá elegir introducir dos valores y a continuación elegir una opción (pulsando el carácter correspondiente), el programa deberá mostrar el resultado por pantalla. En este caso para calcular el resultado habrá que llamar a una función con el siguiente prototipo: void operacion (int n1, int n2, char oper, float* resul, int *error); siendo: • • • n1, n2: dos parámetros pasados por valor que representan los dos números sobre los que se quiere operar. oper: un parámetro pasado por valor que indica el tipo de operación que se debe realizar sobre n1 y n2. Así si queremos realizar una suma este parámetro deberá tener el valor ‘+’, siendo para el resto de los casos: resta ‘-‘, multiplicación: ‘*’, división ‘/’, potencia ’^’, factorial ‘!’. result: es un parámetro pasado por referencia donde se almacenará el resultado de la operación. Fundamentos de la Informática. Primero de Industriales. Mecánica, Química, Electricidad y Electrónica Departamento de Tecnologías de la Información • error: es un parámetro pasado por referencia donde se almacenará si la operación se ha resuelto o no con éxito. Los posibles valores que puede tomar son: o -1: si ha habido problemas al realizar la operación, como por ejemplo una división entre cero o el factorial de un número negativo. o 1: si la operación concluyó con éxito. 4) Mejorar el programa anterior añadiendo una función menu que muestre el menú por pantalla. Dicha función deberá tener el siguiente prototipo: o int menu (void) --> La opción elegida por el usuario se devuelve 4) Realizar una función a la que se le pase un carácter y determine si éste es una letra, un número u otro carácter que no sea ni letra ni número. 5) Realizar un procedimiento que reciba como entrada una frase acabada en punto, y devuelva el número de vocales y el número total de caracteres leídos sin incluir los espacios en blanco. 6) Realizar un procedimiento que reciba un array de caracteres y devuelva en una variable por referencia el número de palabras que hay en el array. 7) Realizar un procedimiento que recibe una cadena de caracteres, y cambia todas las vocales por punto. 8) Realizar un programa que pida por teclado un array de 10 números, y un procedimiento toma este array y devuelve en una variable por referencia el resultado de multiplicarlos todos, y en otra variable el resultado de sumarlos todos. Realizar otro procedimiento que reciba el array, y una variable por referencia la cual actualizará con el número de pares encontrados en el array. 9) Realizar un procedimiento que reciba como entrada una tabla de 5x5 elementos, y devuelva la suma de las filas pares, y la suma de las filas impares. 10) Realizar un procedimiento que reciba como entrada una tabla de 4x5 elementos, y un valor entero, de modo que devuelva la fila y la columna en la que dicho elemento se encuentra en la tabla. Los valores devueltos serán fila=1 y columna=-1 en el caso de no haber encontrado el valor que se estaba buscando. 6) Ejercicios propuestos de un nivel de dificultad mayor. 11) Realizar un procedimiento que reciba como entradas un día, un mes y un año, y devuelva la fecha del día siguiente a través de los mismos parámetros, además de un código de error (0 si todo ha ido bien, y 1 si no se ha podido calcular). Habrá que tener en cuenta que un año es bisiesto si es múltiplo de 4, excepto Fundamentos de la Informática. Primero de Industriales. Mecánica, Química, Electricidad y Electrónica Departamento de Tecnologías de la Información cuando es múltiplo de 100 y no lo es de 400 (por ejemplo, 1984 y 2000 son bisiestos, pero 1800 no lo es). Este procedimiento se apoyará en una función que también deberá realizar el alumno, la cual comprobará si la fecha que se le pasa por parámetro es correcta o no (siguiendo los mismos criterios para el año bisiesto). 12) Realizar un procedimiento que reciba como entrada las concentraciones de CO2 en el ambiente, medidas a lo largo del mes de Enero, a razón de una toma cada hora, y devuelva en qué momento (día y hora), entre las 10h del día 12 hasta las 15h del día 20, se alcanzó la mayor concentración. 13) Realizar un programa que lea un nombre con apellidos por teclado y a continuación muestre el siguiente menú: MENU 1. Convertir en mayúsculas. 2. Convertir en minúsculas. 3. Convertir en mayúsculas las primeras letras de cada palabra. 4. Contar vocal. 5. Salir. Elija opción: Para realizar cada opción será necesario definir funciones. El alumno deberá considerar cual es el prototipo más adecuado para cada opción. La opción 4 deberá pedir una vocal por teclado y a continuación llamar a una función para contar el número de veces que aparece esa vocal en el nombre recogido por teclado. 5) La Frase. "Aquel que duda y no investiga, se torna no sólo infeliz, sino también injusto." Blaise Pascal