Sunteți pe pagina 1din 6

Programación II

Tema I. Relaciones entre clases.


CP # 1. Relación “tiene un”. Composición.

Caso de Estudio: Almacén de Piezas


En un almacén se recepciona diariamente, una cantidad no fija de piezas de diferentes
tipos, para cada tipo de pieza el almacén llena una ficha con la siguiente información:
 Nombre de la pieza
 Código de la pieza
 País de procedencia
 Cantidad en existencia
 Precio unitario de la pieza

Se desea que usted elabore un diagrama de clases que recoja toda la información
necesaria para elaborar un sistema que permita.

1. Obtener un listado de las piezas ordenado alfabéticamente por el


código.
2. El nombre de la pieza de mayor precio unitario.
3. El valor total de las piezas procesadas.
4. Un listado con todas las piezas de un país dado.
5. Permitir visualizar los datos de una pieza, conocido su código.

Nota:
Esta modelación fue previamente analizada en la conferencia 1, por lo que
procederemos a declarar e implementar las clases involucradas y desarrollar el
programa que dé solución al problema.

 Archivo pieza.h

#ifndef CPiezaH
#define CPiezaH

class CPieza // CPieza es una clase de entidad que representa a la ficha técnica de la pieza
{
private:
string nombre;
string codigo;
string pais;
int existencia;
float precioU;
public:
CPieza();
CPieza(string, string,string, int, float);
string GetNombre();
string GetCodigo();
string GetPais();
int GetExistencia();
float GetPrecioU();
};
#endif
 Archivo pieza.cpp

#include "pieza.h"

CPieza::CPieza()
{
nombre= "";
codigo= "";
pais= "";
existencia = 0;
precioU=0.0;
}

CPieza::CPieza(string pnombre, string pcodigo, string ppais, int pexistencia, float pprecioU)
{
nombre= pnombre;
codigo= pcodigo;
pais = ppais;
existencia = pexistencia;
precioU = pprecioU;
}

string CPieza::GetNombre()
{
return nombre;
}

string CPieza::GetCodigo()
{
return codigo;
}

string CPieza::GetPais()
{
return pais;
}

int CPieza::GetExistencia()
{
return existencia;
}

float CPieza::GetPrecioU()
{
return precioU;
}
 Archivo almacen.h

#ifndef CAlmacenH
#define CAlmacenH

#include "pieza.h"
#include <string.h>

class CAlmacen // Clase compuesta (controladora de CPieza)


{
private:
CPieza** fichasTec; // Arreglo dinámico de punteros a objetos tipo CPieza
int maximo; // Capacidad máxima del arreglo después de asignársele memoria
int cantReal; // Cantidad real de piezas registradas en el arreglo
public:
CAlmacen(int=50); // Inicializa atributos y reserva memoria para el arreglo
int GetCantReal(); // Retorna la cantidad real de piezas registradas
bool Adiciona(CPieza *pfichaTec); // Adiciona nueva pieza
bool Adiciona(string, string, string, int, float); // Adiciona nueva pieza
CPieza* getPieza(int pos);// Retorna referencia a pieza en posición indicada
int BuscaPosPieza(string codigo);
// Busca y retorna posición de pieza con código indicado ó -1 si no existe
~CAlmacen(); // Destructor - Libera la memoria ocupada por arreglo y piezas
float ValorTotal(); // Valor total de las piezas registradas
string NombreMayor(); // Nombre de pieza de mayor precio
CPieza** ListadoOrdenado(); // Ordena fichas por el código
CPieza** ListadoPorPais(string pais, int&); // Piezas de un país indicado
};
#endif

 Archivo almacen.cpp

#include "CAlmacen.h"

CAlmacen::CAlmacen(int ctdadMax)
{
maximo = ctdadMax;
cantReal = 0;
fichasTec = new CPieza *[maximo];

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


fichasTec[i]=NULL;
}

CAlmacen::~CAlmacen()
{
for(int i = 0; i < cantReal; i++)
delete fichasTec[i];
delete [] fichasTec;
}

int CAlmacen::GetCantReal()
{
return cantReal;
}

bool CAlmacen::Adiciona(CPieza *pfichaTec)


{
if(cantReal<maximo && pfichaTec!=NULL)
{
fichasTec[cantReal]= pfichaTec;
cantReal++;
return true;
}
return false;
}

bool CAlmacen::Adiciona
(string pnombre, string pcodigo, string ppais, int pexistencia, float pprecioU)
{
if(cantReal < maximo)
{
/* Se declara un nuevo puntero a pieza y se le asigna la dirección
de un nuevo objeto pieza construido dinámicamente en el heap */
CPieza* nueva = new CPieza(pnombre, pcodigo, ppais, pexistencia, pprecioU);
// Se registra la nueva ficha y se cuenta un nuevo registro
fichasTec [cantReal++] = nueva;
return true;
}
return false;
}

CPieza * CAlmacen::getPieza(int pos)


{
return fichasTec [pos];
}

CPieza** CAlmacen::ListadoOrdenado()
{
CPieza *tempfichas;
for(int i =0; i < cantReal-1; i++)
for( int j =i+1; j<cantReal; j++ )
{
if( fichasTec[i]->GetCodigo() > fichasTec[j]->GetCodigo())
{
tempfichas = fichasTec[j];
fichasTec[j] = fichasTec [i];
fichasTec[i] = tempfichas;
}
}
return fichasTec;
}

string CAlmacen::NombreMayor()
{
float mayor=fichasTec[0]->GetPrecioU();
int pos=0;
for(int i=1;i<cantReal;i++)
if(mayor<fichasTec[i]->GetPrecioU())
{
mayor=fichasTec[i]->GetPrecioU();
pos =i;
}
return fichasTec[pos]->GetNombre();
}
float CAlmacen::ValorTotal()
{
float suma=0;
for(int i=0;i<cantReal;i++)
suma+=fichasTec[i]->GetPrecioU()*fichasTec[i]->GetExistencia();
return suma;
}

CPieza** CAlmacen::ListadoPorPais(string pais, int &cont)


{
cont=0; int aux_pos=0;
for(int i=0;i<cantReal;i++)
{
if(pais==fichasTec[i]->GetPais())
{
cont++;
}
}
CPieza* *listado=new CPieza*[cont];
for(int i=0;i<cantReal;i++)
{
if(pais==fichasTec[i]->GetPais())
{
listado[aux_pos]=fichasTec[i];
aux_pos++;
}
}
return listado;
}

int CAlmacen::BuscaPosPieza(string codigo)


{
int pos = -1;
for(int i=0;i<cantReal;i++)
if(codigo==fichasTec[i]->GetCodigo())
pos = i;
return pos;
}
 Archivo mainAlmacen.cpp

#include <iostream.h>
#include "CAlmacen.h"
#include "CPieza.h"

void MostrarDatosPieza(CPieza * p)
{
cout<<"\nFicha técnica de la pieza: "<<p->GetNombre()<<endl;
cout<<"Codigo: "<<p->GetCodigo()<<endl;
cout<<"Pais: "<<p->GetPais()<<endl;
cout<<"Existencia: "<<p->GetExistencia()<<endl;
cout<<"Precio unitario: "<<p->GetPrecioU()<<endl;
}

void main()
{
int cant, e; float pu;
string nomb, codigo, pais;

do { cout << "Entre la cantidad de piezas del almacen: "; cin >> cant; } while (cant <= 0);
CAlmacen *almacen=new CAlmacen(cant);

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


{
cout<<"\nDatos de la pieza # " << i+1;
cout<< "\nNombre: "; cin>>nomb; cout<<"Codigo: "; cin>>codigo;
cout<<"Pais: "; cin>>pais; cout<<"Existencia: "; cin>>e;
cout<<"Precio unitario: "; cin>>pu;
// CPieza* pieza = new CPieza(nomb, codigo, pais, e, pu);
// if (!almacen->Adiciona(pieza))
if (!almacen->Adiciona(nomb, codigo, pais, e, pu))
cout << "La pieza no se pudo agregar.\n";
}
cout<<"\n Listado de las piezas ordenado alfabeticamente por codigo: "<<endl;
CPieza* *pz=almacen->ListadoOrdenado();
for(int i =0; i <almacen->GetCantReal() ; i++) cout<<pz[i]->GetCodigo()<<endl;
cout<<"\n Nombre de pieza de mayor precio unitario: "<<almacen->NombreMayor();
cout<<"\n Valor total de las piezas procesadas: "<<almacen->ValorTotal()<<endl;
cout<<"\n Listado con todas las piezas de un pais dado";
cout<<"\n Entre el pais: "; cin>>pais; int contt=0;
CPieza** lp = almacen->ListadoPorPais(pais, contt);
if(contt!=0)
for(int i =0; i <contt; i++)
cout<<lp[i]->GetNombre()<<endl;
else
cout<< "No existen piezas de ese pais.\n";

cout<<"\n Datos de una pieza conocido su codigo";


cout<<"\n Entre el codigo: "; cin>>codigo;
int pos = almacen-> BuscaPosPieza(codigo);
if (pos == -1)
cout<<"\n No existe ninguna pieza con el código indicado!\n";
else
MostrarDatosPieza(almacen->getPieza(pos));
delete almacen;
system("pause");
}

S-ar putea să vă placă și