Ejercicios Resueltos de C++: Clases, Vectores y Matrices
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 5,68 KB
1. Herencia y Atributos de Objetos
Considerando las siguientes clases:
class C1 {
protected:
int a1;
public:
C1() { a1 = 5; }
C1(int x) { a1 = x; }
};
class C2 : public C1 {
private:
int a2;
public:
C2() { a2 = 6; }
C2(int x) : C1(x+3) {
a2 = x+4;
}
void C3(int x) {
a2 += x*x;
}
};
class C3: public C2 {
public:
int a3;
public:
C3() { a3 = 7; }
C3(int x): C2(x+1) {
a3 = x+2;
}
};
Y la siguiente declaración de objetos:
C1 obj1;
C1 obj2(10);
C2 obj3;
C2 obj4(11);
C3 obj5;
C3 obj6(12);
Indica los valores de TODOS los atributos de los objetos:
- Atributos de obj1: a1 = 5
- Atributos de obj2: a1 = 10
- Atributos de obj3: a1 = 5, a2 = 6
- Atributos de obj4: a1 = 14, a2 = 15
- Atributos de obj5: a1 = 5, a2 = 6, a3 = 7
- Atributos de obj6: a1 = 16, a2 = 17, a3 = 14
2. Sobrecarga de Operadores: Producto Escalar
Dada la clase Vector2D
, modifica la definición de la clase para sobrecargar el operador *
de manera que se pueda multiplicar un valor real por un objeto de la clase Vector2D
(emulando el producto de un escalar por un vector) y se pueda multiplicar dos objetos de la clase (emulando el producto escalar de vectores).
class Vector2D {
private:
float x, y;
public:
Vector2D() { x = y = 0; }
Vector2D(float val_x, float val_y) { x=val_x; y=val_y; }
void mostrar() { cout << "(" << x << "," << y << ")"; }
};
Ejemplo:
Vector2D v1(1.0, 2.0), v2, v3(3.0, 4.0);
float r;
v2 = 5.0 * v1;
v2.mostrar(); // Muestra por pantalla: (5,10)
r = v1 * v3;
cout << r << endl; // Muestra por pantalla: 11 (11=1*3+2*4)
class Vector2D {
private:
float x, y;
public:
Vector2D() { x = y = 0; }
Vector2D(float val_x, float val_y) {x=val_x; y=val_y;}
void mostrar() { cout << "(" << x << "," << y << ")"; }
float operator*(const Vector2D &); // Producto escalar
friend Vector2D operator*(float, const Vector2D &); // Producto escalar
};
float Vector2D::operator*(const Vector2D &oper2) {
float res;
res = x * oper2.x + y * oper2.y;
return res;
}
Vector2D operator*(float k, const Vector2D &oper2) {
Vector2D res;
res.x = k * oper2.x;
res.y = k * oper2.y;
return res;
}
3. Plantillas de Función: Sustitución en Vectores
Escribe una plantilla de función que permita cambiar los elementos de un contenedor vector (de la STL) de tipo genérico que contenga un cierto valor por un valor alternativo. La función recibirá a través de parámetros el vector, el valor a buscar y el valor por el cual se debe sustituir dicho valor buscado.
Ejemplo de uso de la plantilla:
vector vi;
vector vs;
... // Suponiendo que el contenido de vi es: 1 0 3 7 0
sustituir(vi,0,5); // Ahora es: 1 5 3 7 5
// Suponiendo que el contenido de vs es: "Ana" "Pepe" "Eva" "Pepe"
string buscar="Pepe";
string cambiar_por="Jose";
sustituir(vs, buscar, cambiar_por); // Ahora es: "Ana" "Jose" "Eva" "Jose"
template
void sustituir(vector & v, const T &anterior, const T &nuevo) {
for (int i = 0; i < v.size(); i ++ ) {
if ( v[i] == anterior ) {
v[i] = nuevo;
}
}
return;
}
4. Clases y Gestión de Memoria: Constructor Copia y Operador Asignación
Dado el siguiente programa:
class MatrizCuad {
private:
int tam, **datos;
public:
MatrizCuad (int t = 1) {
tam = t;
datos = new int *[t];
for ( int i = 0; i < t; i++ ) {
datos[i] = new int[t];
for ( int j = 0; j < t; j ++ ) {
if ( i == j ) {
datos[i][j] = 1;
} else {
datos[i][j] = 0;
}
}
}
}
~MatrizCuad() {
for (int i = 0; i < tam; i ++ ) {
delete []datos[i];
}
delete []datos;
}
friend void imprime(const MatrizCuad &);
};
void imprime(const MatrizCuad &m1) {
MatrizCuad m2 = m1, m3(5);
m3 = m2;
for (int i=0; i
int main() {
MatrizCuad m(3);
imprime(m);
imprime(m);
return 0;
}
Añade en la definición de la clase los métodos necesarios (sin modificar los que ya existen), de manera que el programa funcione correctamente y escriba dos veces por pantalla:
1 0 0
0 1 0
0 0 1
class MatrizCuad {
private:
int tam, **datos;
public:
MatrizCuad (int t = 1) {
tam = t;
datos = new int *[t];
for ( int i = 0; i < t; i++ ) {
datos[i] = new int[t];
for ( int j = 0; j < t; j ++ ) {
if ( i == j ) {
datos[i][j] = 1;
} else {
datos[i][j] = 0;
}
}
}
}
~MatrizCuad() {
for (int i = 0; i < tam; i ++ ) {
delete []datos[i];
}
delete []datos;
}
MatrizCuad(const MatrizCuad &); // Constructor copia
const MatrizCuad & operator=(const MatrizCuad &); // Operador asignación
friend void imprimeMat(const MatrizCuad &);
};
MatrizCuad::MatrizCuad(const MatrizCuad &otro) {
tam = otro.tam;
datos = new int *[tam];
for ( int i = 0; i < tam; i++ ) {
datos[i] = new int[tam];
for ( int j = 0; j < tam; j ++ ) {
datos[i][j] = otro.datos[i][j];
}
}
}
const MatrizCuad & MatrizCuad::operator=(const MatrizCuad &otro) {
if ( this != &otro ) {
for (int i = 0; i < tam; i ++ ) {
delete []datos[i];
}
delete []datos;
tam = otro.tam;
datos = new int *[tam];
for ( int i = 0; i < tam; i++ ) {
datos[i] = new int[tam];
for ( int j = 0; j < tam; j ++ ) {
datos[i][j] = otro.datos[i][j];
}
}
}
return *this;
}