C+ + PRACTICA Nº5 Practica Nº5 Programación en C++ Pág. 1 ÍNDICE ÍNDICE ........................................................................................................................................0 1.1 Ejercicio 1: Mi primera Función ................................................................................1 1.2 Ejercicio 2: Función AreaCirculo...............................................................................1 1.3 Ejercicio 3: Función Calculo ......................................................................................1 1.4 Ejercicio 4: Ordenar Palabras .....................................................................................2 1.5 Ejercicio 5: Obteniendo los datos de fecha y hora del PC..........................................4 1.1 Ejercicio 1: Mi primera Función El primer ejercicio pretende introducirte en el uso de las funciones. Para ello vamos a hacer una sencilla función que calcule el área de un triángulo. Como bien sabrás, para calcular el área de un triángulo es necesario conocer la base y la altura. Estos dos datos debes pedirlos al usuario y luego calcular el área por medio de la función. Crea un proyecto nuevo Ejer1 y en él el fichero AreaTriangulo.cpp. Introduce 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; } 1.2 Ejercicio 2: Función AreaCirculo Una vez que has visto cómo se hace una función, debes crear tu propia función AreaCirculo, la cual recibirá como único argumento el radio del círculo (que debes pedirlo al usuario) y devolverá el área calculada. Recuerda que debes definir la función y declararla. Para hacer este ejercicio puedes usar el mismo proyecto anterior y agregar un nuevo fichero Circulo.cpp, en el cual harás el programa. 1.3 Ejercicio 3: Función Calculo Vamos a introducirnos en el cálculo de la posición de un cuerpo en caída libre. La ecuación que rige este movimiento es: g *t2 y =h− h: altura inicial (mts.) g: 9.81m/s^2 2 .0 Informática II – Fundamentos de Programación - Tecnun Practica Nº5 Programación en C++ Pág. 2 El ejercicio consiste en ir sacando 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 mts.). 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) { 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 } Recuerda que el tiempo al inicio es cero. Luego va incrementando de acuerdo a lo que el usuario ha especificado, por medio de dt. Para hacer este programa crea el proyecto Ejer3 y en el el fichero CaidaLibre.cpp. 1.4 Ejercicio 4: Ordenar Palabras Vamos a hacer un ejercicio que permita introducir al usuario una número determinado de palabras y el resultado será sacarlas por consola ordenadas de forma descendente. Para ello vamos a utilizar la función strcmp(char*, char*) de la librería estándar del C++ que permite comparar dos cadenas de caracteres. Dicha función está declarada en el fichero string.h. Crea un nuevo proyecto Ejer4 y el fichero Ordena.cpp, en el cual vas a escribir el siguiente código: #include <iostream.h> #include <string.h> void Ordena(char **, int); void ImprimePalabras(char **, int); char** ReservayPide(int); void Libera( char **, int); void main(void) { char **palabras; int num; cout << "Numero de palabras:"; cin >> num; palabras = ReservayPide(num); Informática II – Fundamentos de Programación - Tecnun Practica Nº5 Programación en C++ Pág. 3 cout << "Palabras Introducidas: " << endl; ImprimePalabras(palabras,num); Ordena(palabras,num); cout << "Palabras Ordenadas: " << endl; ImprimePalabras(palabras,num); } char** ReservayPide(int num) { char tmp[120]; char **words; words = new char*[num]; for (int i=0;i<num;i++){ cout << "Introduce la " << i+1 << " palabra:"; cin >> tmp; words[i] = new char[ strlen(tmp)+1 ]; strcpy( words[i], tmp); } return words; //devuelve matriz } void Ordena(char **words, int num) { for (int i=0;i<num-1;i++){ for (int j=i+1;j<num;j++){ if ( strcmp( words[i], words[j]) < 0) { //al cambiar hay que destruir los vectores int len1 = strlen(words[i]); int len2 = strlen(words[j]); char *tmp1 = new char[len1 +1]; char *tmp2 = new char[len2 +1]; strcpy(tmp1,words[i]); //copiar antes de borrar strcpy(tmp2,words[j]); delete [] words[i]; //eliminar vectores delete [] words[j]; words[i] = new char[len2+1]; //nuevos vectores words[j] = new char[len1+1]; strcpy(words[i],tmp2); //Permutar las cadenas strcpy(words[j],tmp1); delete [] tmp1; //eliminar vectores temporales delete [] tmp2; } } } } void ImprimePalabras(char ** words, int Num) { for (int i=0;i<Num;i++){ cout << "\t" << words[i] << endl; } } void Libera( char **words, int Num) { for (int i=0;i<Num;i++) delete [] words[i]; delete [] words; } Como puedes ver, aprovechamos las ventajas de las funciones para darle mudularidad a nuestro ejercicio, con lo cual logramos que la función principal main() tenga poco código, sólo incluye las llamadas a las funciones. Informática II – Fundamentos de Programación - Tecnun Practica Nº5 Programación en C++ Pág. 4 Hemos creado 4 funciones: 1. Función char** ReservayPide(int num): Esta función reserva memoria para almacenar las cadenas y pide al mismo tiempo los datos de cada palabra. Devuelve el vector de cadenas. 2. Función Ordena(char **, int): Esta función se encarga de ordenar de forma descendente las palabras que hay en el vector de cadenas. Para ello utiliza la función strcmp(...). Notar que si hay que cambiar las palabras, se deben copiar las cadenas primero, luego borrar el espacio que cada cadena ocupa (esto debido a que la longitud de las cadenas pueden ser diferentes). Finalmente se reserva nuevamente memoria para almacenar las cadenas cambiadas. 3. Funcion Imprime(char **, int): Se encarga de imprimir a la consola las cadenas que hay en el vector. 4. Función Libera(char **, int): Su función es liberar la memoria utilizada. 1.5 Ejercicio 5: Obteniendo los datos de fecha y hora del PC En este ejercicio vamos a hacer uso de algunas funciones definidas en el estándar del C++ para obtener los datos de fecha y hora del PC. Para ello vamos a crear un nuevo proyecto Ejer5 y el fichero Hora.cpp, en el cual copiarás el código que te daré a continuación. #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); } } Informática II – Fundamentos de Programación - Tecnun Practica Nº5 Programación en C++ Pág. 5 Explicación: 1. Todas las funciones se encuentran definidas en el fichero time.h, el cual debes 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 definimos tm *mihora) definida en el fichero time.h, que tiene los siguientes miembros: struct tm { int int int int int int int int int }; tm_sec; tm_min; tm_hour; tm_mday; tm_mon; tm_year; tm_wday; tm_yday; tm_isdst; /* /* /* /* /* /* /* /* /* seconds after the minute - [0,59] */ minutes after the hour - [0,59] */ hours since midnight - [0,23] */ day of the month - [1,31] */ months since January - [0,11] */ years since 1900 */ days since Sunday - [0,6] */ days since January 1 - [0,365] */ daylight savings time flag */ 4. Una vez que tenemos la estructura, podemos 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 utilizo para medir el tiempo que ha transcurrido entre una operación y otra. En el caso de nuestro ejemplo, la uso 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). Nota: Debes tratar de hacer todos los ejercicios, no solo de las prácticas, sino también los ejercicios que se dan en los cuadernillos de clase. Informática II – Fundamentos de Programación - Tecnun