Laboratorio de Programación II. Grupo C PRACTICA 3: FUNCIONES Y PUNTEROS(I) EJERCICIO GUIADOS Ejercicio 1 Se va a implementar una sencilla función que calcule el área de un triángulo. Para calcular el área de un triángulo es necesario conocer la base y la altura. Estos dos datos se deben pedir al usuario y luego calcular el área por medio de la función. Probar el siguiente código: #include <iostream.h> float AreaTriangulo( float , float ); void main(void) { float base,alt; cout << "Escribe la base: " ; cin >> base; cout << "Escribe la altura: " ; cin >> alt; cout << "El area del triangulo es: " << AreaTriangulo(base,alt); } float AreaTriangulo( float b, float h) { float tmp = b*h/2.0; return tmp; } Ejercicio 2 En este ejercicio se va a hacer uso de algunas funciones definidas en el estándar del C++ para obtener los datos de fecha y hora del PC. Probar el código siguiente: #include <iostream.h> #include <time.h> void ImprimeHora(void); void Delay(double seg); void main(void) { ImprimeHora(); Delay(2.5); //retardo de 2.5 seg. ImprimeHora(); } void ImprimeHora(void) { long t1; tm *mihora; //estructura para time time(&t1); //obtener los datos actuales (en long) mihora = localtime(&t1); //convierte long a struct tm cout << "Fecha: " << mihora->tm_mday << "/" ; cout << mihora->tm_mon+1<<"/"<<mihora->tm_year+1900; cout << " Hora: " << mihora->tm_hour << ":" ; cout << mihora->tm_min << ":“ <<mihora->tm_sec << endl; } void Delay(double seg) { long start; long end; time(&start); end = start; while( difftime(end,start) < seg){ time(&end); } 1 Laboratorio de Programación II. Grupo C } Explicación: 1. Todas las funciones se encuentran definidas en el fichero time.h, el cual se debe incluir al comienzo del programa. 2. La función time(long&) obtiene en una variable del tipo long un valor que representa la fecha y hora a partir del 1 de enero de 1900. Se le debe pasar la dirección de la variable (&t1), ya que la función tiene que escribir el dato. 3. El valor obtenido con time() se introduce como parámetro a la función localtime(), la cual se encarga de convertir ese long en “algo más inteligible” La función devuelve un puntero a una estructura tm (por eso se define tm *mihora) definida en el fichero time.h, que tiene los siguientes miembros: struct tm { int tm_sec; /* seconds after the minute - [0,59] */ int tm_min; /* minutes after the hour - [0,59] */ int tm_hour; /* hours since midnight - [0,23] */ int tm_mday; /* day of the month - [1,31] */ int tm_mon; /* months since January - [0,11] */ int tm_year; /* years since 1900 */ int tm_wday; /* days since Sunday - [0,6] */ int tm_yday; /* days since January 1 - [0,365] */ int tm_isdst; /* daylight savings time flag */ }; 4. Una vez que se tiene la estructura, se puede sacar la hora, minutos, segundos, día, etc., por medio de los miembros de la estructura. 5. Existe también una función difftime(time1, time2) que obtiene la diferencia de dos tiempos, la cual se utiliza para medir el tiempo que ha transcurrido entre una operación y otra. En el caso del ejemplo, se usa para crear una función delay() que hace que el programa se quede en un bucle while un tiempo determinado, dado como argumento a delay(double seg). Ejercicio 3 Tomando como contexto el cálculo de la posición de un cuerpo en caída libre y la ecuación que rige este movimiento es: y=h-(g*t2 / 2.0) donde h: altura inicial(metros) g: 9.81 m/s2 se pide implementar un programa que saque por la consola las posiciones del cuerpo para un determinado diferencial de tiempo (dt), hasta que el cuerpo llegue a la superficie. Los datos que el usuario debe dar son dos: 1) Altura de la caída del cuerpo (en metros.). 2) Diferencial de tiempo para el cálculo (en milisegundos). El esqueleto del programa podría ser el siguiente: #include <iostream.h> #include <math.h> void Calcula(float alt, float dt); void main(void) { 2 Laboratorio de Programación II. Grupo C float alt, dt; cout << "Escribe la altura de la caida: " ; cin >> alt; cout << "Escribe el dt(ms) para el calculo: " ; cin >> dt; Calcula(alt,dt); } void Calcula(float alt, float dt) { //escribir el código de la función } Recordar que el tiempo al inicio es cero. Luego va incrementando de acuerdo a lo que el usuario ha especificado, por medio de dt. EJERCICIO PROPUESTOS Ejercicio 1 Se pide crear una función AreaCirculo, la cual recibirá como único argumento el radio del círculo (que se debe pedir al usuario) y devolverá el área calculada. Recordar que se debe definir la función y declararla. Ejercicio 2 3 Laboratorio de Programación II. Grupo C Se pide crear un programa que pida una serie de números al usuario y halle el máximo, el mínimo y la media aritmética de ellos. Para ello se debe crear una variable puntero tipo float , pedir al usuario que introduzca el número de datos, y después los datos a calcular. Recordar que se debe reservar memoria de forma dinámica para almacenar el vector de dato. La salida del programa debe ser algo así: Numero de datos: 10 Máximo: 25 Minimo: 4 Media Aritmética: 14.6 Ejercicio 3 Se pide crear un programa que permita trabajar sumar, restar y multiplicar dos números complejos. Para lo cual se debe crear una estructura Complejo de la forma: struct Complejo{ float real; float imag; }; El programa debe pedir al usuario que seleccione de un menú la operación que desea realizar: sumar, restar o multiplicar dos complejos y como resultado debe mostrar el complejo resultante, su módulo y su fase. Se puede usar la función getch() para capturar la tecla presionada o usar cin para pedir que elija la opción el usuario y se deberán utilizar las funciones matemáticas ( sqrt(), atan() ) que se encuentran definidas en el fichero math.h. Ejercicio 4 Realizar un programa mediante el uso de funciones para controlar las plazas de un aparcamiento. El aparcamiento dispone de 24 plazas de dos tamaños diferentes: 14 pequeñas y 10 grandes con la disposición que se muestra a continuación: G G G G G G G G G G 1 2 3 4 5 6 7 8 9 10 P P P P P P P P P P P P P P 1 2 3 4 5 6 7 8 9 10 11 12 13 14 La asignación se realizará automáticamente según el tamaño del vehículo que se quiere aparcar con el siguiente algoritmo: -Cada vehículo solamente ocupará una plaza. -Un vehículo pequeño siempre ocupará una plaza pequeña, salvo que estén todas ocupadas y exista alguna grande libre. -Un vehículo grande sólo puede aparcar en una plaza grande. Si todas están ocupadas no podrá aparcar aunque estén todas las pequeñas libres. -De todas las plazas libres, siempre se ocupará primero la de número menor. El programa tendrá un menú con 4 opciones básicas: Aparcar coche, Retirar coche, Ver situación del parking y Terminar. Además observar que en la información que se introduce al programa se debe concretar: Entrada: es necesario indicar el tamaño del coche (P/G). Salida: es necesario indicar la plaza que se deja libre. Por ejemplo P 5. Situación del aparcamiento: indicando las plazas libres y las ocupadas. 4 Laboratorio de Programación II. Grupo C Ejercicio 5 Realizar un programa mediante el uso de funciones que simule un cajero automático de monedas. Los tipos de monedas que dispone el cajero son de 1,5,25,50,100 y 500 pesetas. Inicialmente el cajero tiene 100 monedas de cada tipo, que se van consumiendo para proporcionar las cantidades solicitadas. El cajero debe obtener la cantidad solicitada con los tipos de moneda que tenga en cada momento, tratando siempre de utilizar las monedas de mayor valor. El programa debe tener un menú con tres opciones: Pedir dinero al cajero, Ver estado del cajero o Salir del programa. Observar que el cajero no puede dar más dinero del que tiene. Ejercicio 6 Este ejercicio consiste en calcular el valor del Seno de un ángulo X, cuyo desarrollo en serie es: sen(x)=x-(x3/3!)+(x5/5!)-(x7/7!)+… (x en radianes) Este ejercicio se va a desarrollar en dos partes: 1. Hacer una función seno1 que reciba como argumentos el ángulo y el número de iteraciones y tiene que devolver el valor de la serie como double. La declaración de dicha función puede ser de la siguiente manera. double seno1( double x, int N ) 2. Hacer otra función seno2 que reciba como argumentos el ángulo, el error entre una iteración y otra y un puntero a una variable entera para que devuelva el número de iteraciones empleadas. La declaración de esta función puede ser de la siguiente manera: double seno2( double x, double error, int *num) Para probar las funciones crear un main(). Ejercicio 7 En este ejercicio se va a hallar el valor de la función ex, utilizando los dos criterios de terminación: 1. Por número de iteraciones. 2. Por error entre una iteración y otra. El desarrollo en series de ex es: ex=1+(x/1!)+(x2/2!)+(x3/3!)+… Recordar que en el caso del criterio de terminación Nº2 se debe devolver y sacar por la consola el número de iteraciones empleadas para el cálculo. Se puede usar la función exp(x), definida en math.h, de la librería estándar del C++, para contrastar los resultados. Ejercicio 8 Se pide crear implementar un programa mediante las funciones que sean necesarias que simule una pequeña calculadora que realizas las cuatro operaciones básicas (suma, resta, multiplicación y división) tiene 4 posiciones de memoria (A, B, C y D) para guardar resultados intermedios y además indica los errores que se producen al introducir las operaciones a realizar. Se pueden introducir todas las operaciones que se necesiten separadas por punto y coma (;). Cada operación está formada por el primer operando, el correspondiente operador (+,-,*,/) y el segundo operando. Un operando puede ser 5 Laboratorio de Programación II. Grupo C cualquiera de las 4 posiciones de memoria o un valor numérico. Los valores numéricos se indican mediante una secuencia de dígitos del 0 al 9 sin blancos ni ningún otro carácter entre ellos. El resultado de una operación se puede guardar en una posición de memoria indicándolo a continuación de la operación con el símbolo (->) seguido de la posición (A, B, C, D). Se finaliza el programa con un punto (.). El programa detecta errores en los operandos, en los operadores y la falta de algunos de los símbolos necesarios. La salida del programa debe ser algo así: ¿Cálculo? 23+56 -> A; A*5 -> B; H Error 1: Operando (Número o Variable) ¿Cálculo? 12+P Error 1: Operando (Número o Variable) ¿Cálculo? 12+450M Error 5: Falta punto y coma ¿Cálculo? A+B; A-B. La variable A mantiene el valor …. La variable B mantiene el valor … La variable C mantiene el valor…. La variable D mantiene el valor…. ¿Cálculo? ENTREGA DE LOS EJERCICIOS La forma de entregar la práctica será a través de la asignatura virtualizada en el campus virtual. En la asignatura virtualizada verás una serie de enlaces, entre ellos, hay uno titulado como prácticas. Navega sobre dicho enlace, y verás que hay un grupo con los apellidos de los integrantes de los grupos. Dicho grupo de trabajo tiene asociado una carpeta sobre la que puedes subir , eliminar o editar archivos(Accedes usando Editar Archivos). Zippea el trabajo correspondiente, y dentro del zip incluye un archivo de texto en que aparezcan los nombres de los que formáis el grupo. Etiqueta el archivo zip con el nombre LabnApellidoApellido.zip. Por ejemplo si Juan Martínez Martin y Silvia Pérez García están en el laboratorio 1, y forman un grupo etiquetan su zip como Lab1MartinezPerez.zip. A continuación usa la opción cargar que hay en la parte derecha del área donde te encuentras, y te permitirá subir archivos desde tu disco duro. Almacénalo en la carpeta correspondiente al grupo al que perteneces. Tenéis de plazo para subir la correspondiente práctica 3 hasta este viernes día 26 de Noviembre. Acabado el plazo no se podrán subir las prácticas, y se considerará como práctica no entregada. Si tienes alguna duda o problema sobre el procedimiento de entrega no dudes en preguntar. 6