Prácticas de C++ Practica Nº 10 Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Practica Nº 10 Programación en C++ Pág. 1 ÍNDICE ÍNDICE ........................................................................................................................................ 1 1. Introducción...................................................................................................................... 1 1.1 Ejercicio 1: Mi clase String, versión 1.0 .................................................................... 1 1.2 Ejercicio 2: Mi clase Point. ........................................................................................ 2 1.3 Ejercicio 3: Base de datos de Alumnos...................................................................... 2 1. Introducción. En esta práctica afianzaremos un poco más nuestros conceptos de las clases, seguiremos creando objetos, y comprendiendo mejor la encapsulación y abstracción de datos, es decir, todo lo relacionado con la Programación Orientada a Objetos. 1.1 Ejercicio 1: Mi clase String, versión 1.0 Hasta ahora hemos utilizado muchas veces las funciones para manejo de cadenas de caracteres. En este ejercicio vamos a hacer una clase que permita de forma definitiva utilizar de manera más intuitiva las cadenas, como por ejemplo crear una nueva variable de la siguiente forma: String cadena1 = “Hola”; Este proyecto se llamará Ejer1. Debe crear tres ficheros String.h, String.cpp y main.cpp. Estos ficheros se listan a continuación: //String.h class String { char *str; public: String(); String(char *t); ~String(){ //cadena delete [] str; } //destructor void operator=(char *t){ //sobrecarga delete [] str; str = new char[ strlen(t)+1 ]; strcpy(str,t); } int GetLen(){ return strlen(str); } char GetAt(int); void Add(char *t){ //funcion char *tmp; tmp = new char[strlen(str)+strlen(t)+1]; strcpy(tmp,str); //guardar strcat(tmp,t); delete [] str; str = tmp; //cambiamos de puntero } void Prt(){ cout << str; } }; //String.cpp String::String() { str = new char[1]; } str[0]=0; String::String(char *text) Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra Practica Nº 10 Programación en C++ Pág. 2 { str = new char[ strlen(text)+1 ]; strcpy(str,text); } char String::GetAt(int i) { return str[i]; } //main.cpp void main() { char tmp[200]; cout << "\nDame tu nombre y apellidos:"; cin.getline(tmp,200); String cs1(tmp); //crear objeto int len = cs1.GetLen(); cout << "\nLong. de tus datos: " << len; cout << "\nAhora tus datos invertidos:\n"; for (int i=len-1;i>=0;i--) cout << cs1.GetAt(i); //funcion GetLen() cout << "\nAhora usando la sobrecarga:\n"; String cs2 = "Escuela Superior de Ingenieros"; for (i=0; i<cs2.GetLen();i++) cout << cs2.GetAt(i); cout << "\nAdios " << endl; } Compile el proyecto y ejecútelo, observando el resultado. 1.2 Ejercicio 2: Mi clase Point. El siguiente ejercicio consiste en crear una clase Point que tenga dos datos miembro que representen un punto en un plano cartesiano (x,y). Dicha clase debe tener un método Distancia que permita hallar la distancia que hay entre el objeto que le llama y otro punto que se le pasa como argumento. Debe además implementar el constructor y el método Prt() que permita imprimir los puntos en la consola. class Point { double x,y; public: Point(double, double); double Distancia(Point p); void Prt(); }; Cree un nuevo proyecto llamado Ejer2 en su directorio de trabajo y en él escriba todos los ficheros fuente que le hagan falta. Recuerde que desde main se deben pedir al usuario los dos puntos a encontrar la distancia entre ello. 1.3 Ejercicio 3: Base de datos de Alumnos En este ejercicio se va a hacer un programa que permita implementar una pequeña base de datos para Alumnos (aunque en el ejemplo se han puesto pocas variables, se deben agregar más, como dirección, número de carné, etc.). Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra Practica Nº 10 Programación en C++ Pág. 3 Para desarrollar este ejercicio se debe crear una nueva clase, la clase Alumno, la cual tiene la particularidad de que usa la clase String creada en el ejercicio 1 (por lo cual se recomienda tener bien claro el ejercicio 1). En la función principal main se debe hacer un menú que permita elegir las opciones de introducir y ver los datos de los alumnos. Se puede ver que se utiliza un vector de punteros a objetos *als[200] que permite ir creando dinámicamente los objetos. También se usa una variable static para ir contando el número de alumnos que se van introduciendo a la base de datos. A continuación se puede ver el programa completo. class Alumno { String name; int edad,telefono; public: static int num; Alumno(char *t="", int edad=0, long telf=0){ name.Add(t); this->edad = edad; telefono = telf; num++; } ~Alumno(){ num--; } //el destructor de name se encarga de lo suyo void Prt(){ name.Prt(); cout << "," << edad << "," << telefono << endl;; } }; int Alumno::num=0; void main() { char tmp[120]; int edad,telf; int opc; Alumno *als[200]; //array de punteros para 200 objetos dinámicos while(true){ cout << "\n***** Menu *****\n"; cout << "1.Introducir datos"<<endl; cout << "2.Ver datos"<<endl; cout << "3.Salir"<<endl; cout << "Opc:?"; cin >> opc; cin.ignore(1); if (opc==1) { cout << "Nombres:"; cin.getline(tmp,120); cout << "Edad:"; cin >> edad; cout << "Telfono:"; cin >> telf; int n = Alumno::num; als[n] = new Alumno(tmp,edad,telf); //dinamico } Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra Practica Nº 10 Programación en C++ Pág. 4 else if (opc==2) { cout << "\n *** datos:\n"; for (int i=0;i<Alumno::num;i++) als[i]->Prt(); } else if (opc==3) { int n = Alumno::num; for (int i=0;i<n;i++) //liberar la memoria delete als[i]; break; //salir } } } Cree un nuevo proyecto llamado Ejer3 en su directorio de trabajo y en él escriba todos los ficheros fuente que le hagan falta. Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra