Prácticas de C++

Anuncio
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
Descargar