Está en la página 1de 42

Proyecto 0151-14 UNA

Mora & Coto, 2015

Programacin Orientada a
Objetos

Compilado por:
Mag. Sonia Mora.
Dra. Mayela Coto.
EIF200 FUNDAMENTOS DE INFORMTICA
Ejercicio: clase Colonia
Suponga que se quiere analizar el comportamiento de
colonias de bacterias que se desarrollan en alimentos.
Bsicamente se almacena informacin de la existencia de
la bacteria x en el alimento y.
Se define entonces la clase Colonia, representando a
colonias de bacterias que se desarrollan o no en una serie
de alimentos.

EIF200 FUNDAMENTOS DE INFORMTICA


Imgenes en esta diapositiva son de dominio pblico
Ejercicio: clase Colonia
Se representa con un 1 la existencia de la bacteria i
en un alimento j, y con un 0 la no existencia de la
misma.
[0] 1 0 0 1
bacteria [1] 0 1 1 1
[2] 1 0 1 0
[3] 1 1 0 0
[0] [1] [2] [3]
alimento

EIF200 FUNDAMENTOS DE INFORMTICA Imgenes en esta diapositiva son de dominio pblico


Arreglos multidimensionales
Un arreglo multidimensional
es un arreglo donde los
elementos se encuentran
organizados en varias
dimensiones.
matriz [x] [y]

Para su definicin se usa una


sintaxis similar a la usada
para declarar arreglos
unidimensionales, pero
separando las diferentes
dimensiones.
matriz [x] [y] [z]
Imgenes en esta diapositiva son de dominio pblico
Arreglos bidimensionales
En lo particular un arreglo bidimensional (matriz) es un arreglo
de dos dimensiones.
Para crear arreglos bidimensionales en C++, hay que indicar:
El tipo de los elementos (ejemplo, int, char, float, bool,
string o un tipo definido por el programador)
El nombre del arreglo
El nmero de filas y el nmero de columnas del arreglo
(ambas entre [ ])

<tipo de los elementos> <nombre del arreglo> [<filas >] [<columnas >]

EIF200 FUNDAMENTOS DE INFORMTICA


Arreglos bidimensionales
Ejemplo: 25 4 13 14 5
[0]
[1] 2 42 18 32 52
int valores [3][5];
[2] 54 23 37 60 15
[0] [1] [2] [3] [4]

Para acceder a cada elemento se usa el nombre del arreglo y


un ndice por cada dimensin.
En el caso de las matrices se necesitan dos ndices: uno para
las filas y otro para las columnas.
cout <<valores[2][3] 60

EIF200 FUNDAMENTOS DE INFORMTICA


Tamao
Clase Contenedor bsica fijo

const int tam=4;


class Contenedor{
Dos tipos de
private: constructores
int matriz[tam][tam];
public:
Contenedor(){
for (int i = 0; i<tam; i++)
for (int j = 0; j<tam ; j++)
matriz[i][j]=0; }
Contenedor(int a){
for (int i = 0; i<tam; i++)
for (int j = 0; j<tam ; j++)
matriz[i][j]= a; }

EIF200 FUNDAMENTOS DE INFORMTICA


Clase Contenedor bsica
void setPos (int i, int j, int val) {
matriz[i][j] = val; }

int getPos (int i, int j){


return matriz[i][j]; }
Llena la matriz
void llenarMatriz() { con valores dados
int valor; por el usuario
for (int i = 0; i<tam;i++)
for (int j = 0; j<tam;j++)
{ cout<<"valor["<<i<<"]["<<j<<"]: ";
cin>>valor;
setPos(i,j,valor); } }

~ Contenedor() { // memoria esttica } EIF200 FUNDAMENTOS DE INFORMTICA


Clase Contenedor bsica
En el main() la creacin de objetos puede ser de
diversas formas:
0 0 0 0
0 0 0 0
int main(){
0 0 0 0 5 5 5 5
.
0 0 0 0 5 5 5 5
Contenedor mat1;
5 5 5 5
Contenedor mat2(5);
5 5 5 5

cout<<"Llenando la matriz"<<endl;
1 2 9 3
mat1.llenarMatriz(); 5 6 7 8
. 9 3 2 3
} EIF200 FUNDAMENTOS DE INFORMTICA 8 4 1 6
class Contenedor
{ private:

Clase Contenedor bsica


int matriz[tam][tam];

En la clase Contenedor defina un mtodo que


permita imprimir la matriz de forma ordenada
por filas y columnas.
Ejemplo:
1 2 9 3
<<
5 6 7 8
9 3 2 3
8 4 1 6

EIF200 FUNDAMENTOS DE INFORMTICA


Imgenes usadas en esta diapositiva son de dominio pblico
class Contenedor
{ private:

Clase Matriz bsica


int matriz[tam][tam];

string toString() {
stringstream s;
for (int i = 0; i< tam;i++){
for (int j = 0; j< tam;j++)
s<<matriz[i][j]<<" ";
s<<endl;
}
s<<endl;
return s.str();
}
En el main
cout<<mat1.toString();
EIF200 FUNDAMENTOS DE INFORMTICA
class Contenedor
{ private:

Clase Contenedor bsica


int matriz[tam][tam];

En la clase Contenedor defina un mtodo que


devuelva la suma de todos los elementos de la
matriz.
Por ejemplo, si la matriz es:

1 2 9 3
5 6 7 8
9 3 2 3
8 4 1 6

La suma es 77

EIF200 FUNDAMENTOS DE INFORMTICA Imgenes usadas en esta diapositiva son de dominio pblico
class Contenedor
{ private:

Clase Contenedor bsica


int matriz[tam][tam];

int suma() {
int sum = 0;
for (int i = 0; i<tam;i++)
for (int j = 0; j<tam;j++)
sum += matriz[i][j];
return sum;
}

EIF200 FUNDAMENTOS DE INFORMTICA

En el main
cout<<"La suma de los valores de la matriz es "<<mat1.suma()<<endl;
class Contenedor
{ private:

Clase Contenedor bsica


int matriz[tam][tam];

En la clase Contenedor defina un mtodo que


devuelva el promedio de todos los elementos de
la matriz.
1 2 9 3
5 6 7 8
9 3 2 3
8 4 1 6

EIF200 FUNDAMENTOS DE INFORMTICA Imgenes usadas en esta diapositiva son de dominio pblico
class Contenedor
{ private:

Clase Contenedor bsica


int matriz[tam][tam];

float promedio() {
float suma = 0;
for (int i = 0; i<tam;i++)
for (int j = 0; j<tam;j++)
suma += matriz[i][j];
return (float)suma/(tam*tam);
}

En el main
cout<<"El promedio de los valores de la matriz es "<<mat1.promedio()<<endl;

EIF200 FUNDAMENTOS DE INFORMTICA


class Contenedor
{ private:

Clase Contenedor bsica


int matriz[tam][tam];

En la clase Contenedor defina un mtodo que


multiplique todos los elementos de la matriz por
un escalar (dado por el usuario)
Por ejemplo, si el escalar = 2

1 2 9 3 2 4 18 6
5 6 7 8 10 12 14 16
9 3 2 3 18 6 4 6
8 4 1 6 16 8 2 12

EIF200 FUNDAMENTOS DE INFORMTICA


class Contenedor
{ private:

Clase Contenedor bsica


int matriz[tam][tam];

void multiplicarEscalar (int escalar){


for (int i = 0; i<tam;i++)
for (int j = 0; j<tam;j++)
matriz[i][j]*= escalar;
}

En el main
cout<<"Digite el valor por el que desea multiplicar la matriz ";
cin>>valor;
mat1.multiplicarEscalar(valor);
mat1.toString();
EIF200 FUNDAMENTOS DE INFORMTICA
class Contenedor
{ private:
int matriz[tam][tam];
Bsqueda de un elemento
En la clase Contenedor defina un mtodo que
devuelva true si un elemento determinado se
encuentra en la matriz y false si no.

1 2 9 3
5 6 7 8
9 3 2 3
8 4 1 6

EIF200 FUNDAMENTOS DE INFORMTICA

Imgenes usadas en esta diapositiva son de dominio pblico


class Contenedor
{ private:
int matriz[tam][tam];
Bsqueda de un elemento
bool encuentraElem(int num) {
for(int i = 0;i <tam;i++)
for(int j = 0;j <tam;j++)
if (matriz[i][j]== num)
return true;
return false;
}
EIF200 FUNDAMENTOS DE INFORMTICA

En el main
cout<<"Digite el valor que desea buscar ";
cin>>valor;
if (mat1.encuentraElem(valor))
cout <<"El valor " <<valor<<" SI se encuentra en la matriz "<<endl;
else
cout <<"El valor " <<valor<<" NO se encuentra en la matriz "<<endl;
class Contenedor
{ private:
int matriz[tam][tam];
Mayor elemento
En la clase Contenedor defina un mtodo que
retorne el mayor valor de la matriz.

[i]>max

EIF200 FUNDAMENTOS DE INFORMTICA

Imagen : Peter Murphy. CC-BY-SA Pedro Figueiredo. Tomado de : https://flic.kr/p/9qf5c


class Contenedor
{ private:
int matriz[tam][tam];
Mayor elemento
int buscaMaximo()
{
int max=matriz[0][0];
for(int i = 0;i <tam;i++)
for(int j = 0;j <tam;j++)
if (matriz[i][j] > max)
max=matriz[i][j];
return max;
}

En el main
cout<<"El valor maximo de la matriz es "<<mat1.buscaMaximo()<<endl;

EIF200 FUNDAMENTOS DE INFORMTICA


Ejercicio: Clase Colonia (cont..)
Se representa con un 1 la existencia de la bacteria i en un
alimento j, y con un 0 la no existencia de la misma.

class Colonia {
private:
int matriz [tam] [tam]; //tam valor constante definido previamente

[0] 1 0 0 1
};
[1] 0 1 1 1
bacteria
[2] 1 0 1 0

[3]
1 1 0 0

[0] [1] [2] [3]


Imgenes en esta diapositiva son de dominio pblico alimento
Ejercicio: Clase Colonia(cont..)
1. Mtodo que determine la existencia de la
bacteria k en el alimento p.
2. Mtodo que devuelva en cuantos alimentos se
encuentra la bacteria i.
3. Mtodo que muestre que bacterias estn
presentes en el alimento j.

EIF200 FUNDAMENTOS DE INFORMTICA

Imgenes usadas en esta diapositiva son de dominio pblico


class Contenedor
{ private:
int matriz[tam][tam];
Ejercicio: Clase Colonia(cont..)
1. Mtodo que determine la existencia de la
bacteria k en el alimento p.

bool existeBacteria(int k, int p)


{
if (matriz[k][p]== 1)
return true;
else
return false;
}

Imgenes usadas en esta


EIF200 FUNDAMENTOS DE INFORMTICA diapositiva son de dominio
pblico
class Contenedor
{ private:
int matriz[tam][tam];
Ejercicio: Clase Colonia(cont..)
2. Mtodo que devuelva en cuantos alimentos se
encuentra la bacteria i.
int numAlimentos(int i) {
int cont = 0;
for (int j = 0; j<tam; j++)
cont += matriz[i][j]; Imgenes usadas en esta
diapositiva son de
return cont; dominio pblico

EIF200 FUNDAMENTOS DE INFORMTICA


class Contenedor
{ private:
int matriz[tam][tam];
Ejercicio: Clase Colonia(cont..)
3. Mtodo que muestre qu bacterias estn
presentes en el alimento j.

void bacteriasAlimento(int j) {

for (int i = 0; i<tam; i++)


if (matriz[i][j]== 1)
cout<<"El alimento"<<j<<"tiene la bacteria "<<i;

Imgenes usadas
en esta
diapositiva son de
EIF200 FUNDAMENTOS DE INFORMTICA dominio pblico
class Contenedor
{ private:

Suma diagonal
int matriz[tam][tam];

En la clase Contenedor defina un mtodo que calcule la


suma de los elementos de la diagonal principal de la
matriz.
Por ejemplo, si la matriz es:
1 2 9 3
5 6 7 8
9 3 2 3
8 4 1 6

La suma de la diagonal es 15
A la suma de los elementos de la diagonal principal de una
matriz cuadrada se le llama traza de la matriz
EIF200 FUNDAMENTOS DE INFORMTICA
class Contenedor
{ private:

Suma diagonal
int matriz[tam][tam];

int sumaDiagonal(){
int i = 0, suma=0;
while (i<tam){
suma = suma + matriz[i][i];
i++;
}
return suma;
}

En el main
cout<<"La suma de la diagonal es "<<mat1.sumaDiagonal()<<endl;

EIF200 FUNDAMENTOS DE INFORMTICA


Ejercicios
En la clase Contenedor :
1. Escriba un mtodo que busque un elemento
determinado en una matriz y devuelva cuantas veces lo
encuentra.
2. Escriba un mtodo que devuelva la posicin del
elemento menor de una matriz.
3. Defina un mtodo que calcule la suma de los elementos
de la diagonal inversa de la matriz.
1 2 9 3
2 6 7 8
9 7 2 3
3 8 3 6
Imgenes usadas en
esta diapositiva son de
EIF200 FUNDAMENTOS DE INFORMTICA dominio pblico
class Contenedor
{ private:

Ejercicio #1
int matriz[tam][tam];

int cuentaElem(int num)


{ int cont=0;
for(int i = 0;i <tam;i++)
for(int j = 0;j <tam;j++)
if (matriz[i][j]== num)
cont++;
return cont;
} EIF200 FUNDAMENTOS DE INFORMTICA

En el main
cout<<"Digite el valor que desea contar ";
cin>>valor;
cout<<"El valor "<<valor<<" se encuentra "<<mat1.cuentaElem(valor)<<" veces"<<endl;
class Contenedor
{ private:

Ejercicio #2
int matriz[tam][tam];

void buscaPosMinimo(int &fil, int &col)


{ int min=matriz[0][0];
fil=0;
col=0;
for(int i = 0;i <tam;i++)
for(int j = 0;j <tam;j++)
if (matriz[i][j] < min)
{ min=matriz[i][j];
fil=i;
col=j; }
} EIF200 FUNDAMENTOS DE INFORMTICA

En el main
int x,y;
mat1.buscaPosMinimo(x,y);
cout<< "La posicion del valor minimo en la matriz es ["<<x<<"]["<<y<<"]"<<endl;
class Contenedor
{ private:

Ejercicio #3
int matriz[tam][tam];

int sumaDiagonalInversa(){
int suma=0;
for (int i=0; i<tam; i++)
suma = suma + matriz[i][tam-1-i];
return suma;
}

En el main
cout<<"La suma de la diagonal inversa es "<<mat1.sumaDiagonalInversa()<<endl;

EIF200 FUNDAMENTOS DE INFORMTICA


class Contenedor
{ private:

Matriz identidad
int matriz[tam][tam];

Una matriz se dice que es la matriz identidad


si tiene todos sus elementos nulos excepto los
de la diagonal principal que son iguales a 1

1 0 0 0 Imgenes usadas en esta


diapositiva son de dominio
0 1 0 0 pblico

0 0 1 0
0 0 0 1

En la clase Contenedor defina un mtodo que


retorne true si la matriz es la matriz identidad
y false si no
EIF200 FUNDAMENTOS DE INFORMTICA
class Contenedor
{ private:

Matriz identidad
int matriz[tam][tam];

bool esIdentidad()
{ for(int i=0;i<tam;i++)
for(int j=0;j<tam;j++)
if (i == j)
{ if (matriz[i][j] != 1)
return false; }
else { if (matriz[i][j] != 0)
return false; }
return true; }
EIF200 FUNDAMENTOS DE INFORMTICA

En el main
if (mat1.esIdentidad())
cout <<"La matriz SI es la matriz identidad "<<endl;
else
cout <<"La matriz NO es la matriz identidad "<<endl;
class Contenedor
{ private:

Matriz simtrica
int matriz[tam][tam];

Una matriz A de tamao mxn se dice que es una matriz


simtrica si:
m=n y
si cumple que Ax,y = Ay,x para 1<= x<= m y 1<= y <= n.

[0] 1 2 9 3
[1] 2 6 7 8
[2] 9 7 2 3
[3] 3 8 3 6
[0] [1] [2] [3]

Disee un mtodo que determine si la matriz es simtrica


o no
EIF200 FUNDAMENTOS DE INFORMTICA
class Contenedor
{ private:

Matriz simtrica
int matriz[tam][tam];

bool esSimetrica()
{
for(int i = 1;i <tam;i++)
for(int j = 0;j < i;j++)
if (matriz[i][j]!= matriz[j][i])
return false;
return true;
}
EIF200 FUNDAMENTOS DE INFORMTICA

En el main
if (mat1.esSimetrica())
cout <<"La matriz SI es simetrica "<<endl;
else
cout <<"La matriz NO es simetrica "<<endl;
class Contenedor
{ private:

Matriz Transpuesta
int matriz[tam][tam];

La transpuesta de una matriz se obtiene


cambiando filas por columnas

[0] 1 2 9 3 [0] 1 5 9 8
[1] 5 6 7 8 [1] 2 6 3 4
[2] 9 3 2 3 [2] 9 7 2 1
[3] 8 4 1 6 [3] 3 8 3 6
[0] [1] [2] [3] [0] [1] [2] [3]

Disee un mtodo que cambie la matriz por su


transpuesta
EIF200 FUNDAMENTOS DE INFORMTICA
class Contenedor
{ private:

Matriz Transpuesta
int matriz[tam][tam];

void transponerMatriz(){ //usando set y get


int aux;
for (int i = 1; i<tam ;i++)
for (int j = 0; j< i ;j++)
{ aux=getPos(i,j);
setPos(i,j,getPos(j,i));
setPos(j,i,aux);
}
}

En el main
cout<<"La matriz transpuesta es"<<endl;
mat1.transponerMatriz();
cout<<mat1.toString();

EIF200 FUNDAMENTOS DE INFORMTICA


const int fil=4;
const int col=7;
class Contenedor
Ejercicio { private:
int matriz[fil][col];

Suponga que se tiene creada una instancia Contenedor


mat2 de n filas y 2*n-1 columnas.
Escriba un mtodo que calcule la suma de los elementos
que forman un tringulo en la matriz. Por ejemplo si
n=4, el mtodo debe sumar los elementos contenidos en
las casillas marcadas con x
0 1 2 3 4 5 6

0 x
1 x x x
2 x x x x x
3 x x x x x x x

EIF200 FUNDAMENTOS DE INFORMTICA


const int fil=4;
const int col=7;
class Contenedor
Ejercicio { private:
int matriz[fil][col];

int sumaTrianguloMatriz ()
{
int ini=0;
int fin=col-1;
int suma=0;
for (i=fil-1;i>=0;i--)
{ for (j=ini;j<=fin;j++)
suma=suma+matriz[i][j];
ini++;
fin--; }
return suma;
}

En el main
cout<<"La suma del triangulo de la matriz es "<<mat1.sumaTrianguloMatriz()<<endl;

EIF200 FUNDAMENTOS DE INFORMTICA


TAREA: Clase Colonia
1. Un alimento est imposibilitado para el consumo
humano si presenta al menos tam/2 existencias de
bacterias. Disee un mtodo que devuelva cuntos
alimentos estn deshabilitados para el consumo
humano.
2. Un alimento es enviado a estudios bacterilogos si se
encuentra en l la presencia de cierta cantidad de
bacterias continuas (por ejemplo las bacterias 1,2,3, o
2,3,4,5, o 3,4,5,6,7 etc). Disee un mtodo que devuelva
el mximo nmero de bacterias que se encuentran de
manera consecutiva para el alimento m.

EIF200 FUNDAMENTOS DE INFORMTICA


Proyecto 0151-14 UNA
Mora & Coto, 2015

Uso didctico curso EIF 200


Escuela de Informtica
Universidad Nacional
Costa Rica

EIF200 FUNDAMENTOS DE INFORMTICA

También podría gustarte