[C con Clase] Consulta de Programita y Pago
Ezequiel Hernan Di Giorgi
hernan.digiorgi en gmail.com
Dom Mar 11 13:42:32 CET 2012
Hola yo la materia la rendi en C, por lo que los ejercicios que me quedaron
de esa epoca son en c, ya que en C++ esta el STL. En fin, hace poco rendi
esto y me hice unos resumenes, en mi web personal, de un solo post, esta:
http://blog.amvaz.com/final-de-estructuras/
Pero siendo mas puntual copio y pego algo que hice hace bastante (listas
doblemente enelazadas):
NO COMPILA EN C, por que aunque vimos C estructurado usabamos el dev c++.
Pero conceptualmente espero que te sea de ayuda.
#include <iostream>
using namespace std;
//=====================================
// Tipo de datos definidos por el usr
//=====================================
typedef unsigned short int u32;
typedef enum
{
DIRECTOR=0,
CODIGO,
GENERO
}Modo;
typedef enum
{
COMEDIA=0,
DRAMA,
ACCION,
INFANTILES
}Genero;
enum
{
ant=0,
sig,
pri=0,
ult
};
typedef struct TNodoRetiro* pTNodoRetiro;
typedef struct TPelicula
{
u32 codigo;
string nombre;
string director;
Genero genero;
u32 cantidad;
pTNodoRetiro pRetiro[2];
}TPelicula;
typedef struct TRetiro
{
u32 codigo;
string socio;
u32 fecha [3];
}TRetiro;
typedef struct TNodoRetiro
{
TRetiro retiro;
pTNodoRetiro pRetiro[2];
}TNodoRetiro;
typedef struct TNodoPelicula* pTNodoPelicula;
typedef struct TNodoPelicula
{
TPelicula pelicula;
pTNodoPelicula pDirector[2];// 0->ant 1->sig
pTNodoPelicula pCodigo[2];//0->ant 1->sig
pTNodoPelicula pGenero[2];
}TNodoPelicula;
typedef struct TVideoClub
{
pTNodoPelicula pDirector[2];
pTNodoPelicula pCodigo[2];
pTNodoPelicula pGenero[2];
}TVideoClub;
//=====================================
// Prototipos
//=====================================
bool agregar (const TPelicula& pelicula, TVideoClub &club);
void listar (const TVideoClub& club, Modo modo=CODIGO);
bool agregar (const TRetiro& retiro, TPelicula& pelicula);
//=====================================
// Funcion main
//=====================================
int main ()
{
TVideoClub club;
club.pDirector[pri]=club.pDirector[ult]=0;
club.pCodigo[pri]=club.pCodigo[ult]=0;
club.pGenero[pri]=club.pGenero[ult]=0;
TPelicula pelicula;
pelicula.codigo=1; pelicula.director="Mar"; pelicula.genero=COMEDIA;
agregar (pelicula, club);
pelicula.codigo=5; pelicula.director="Matrix"; pelicula.genero=DRAMA;
agregar (pelicula, club);
pelicula.codigo=4; pelicula.director="COD"; pelicula.genero=INFANTILES;
agregar (pelicula, club);
pelicula.codigo=2; pelicula.director="Nota"; pelicula.genero=COMEDIA;
agregar (pelicula, club);
listar (club,GENERO);
std::cin.get();
}
//=====================================
// Agregar:
// Agrega una pelicula al videoblub
//=====================================
bool agregar (const TPelicula& pelicula, TVideoClub &club)
{
//Busco el lugar que ucuparia por codigo, de repetirse
//el codigo se sale
pTNodoPelicula pR; //Nodo de recorrido;
pR=club.pCodigo[pri]; //Primer nodo de peliculas ord. por cod.
while (pR && pelicula.codigo>pR->pelicula.codigo)
pR= pR->pCodigo[sig];
//Si se repite el codigo salgo
if (pR && pR->pelicula.codigo==pelicula.codigo)
return false;
//Creo nodo y lo inicializo
pTNodoPelicula pNuevo = new TNodoPelicula;
pNuevo->pelicula=pelicula;
pNuevo->pDirector[ant]=pNuevo->pDirector[sig]=0;
pNuevo->pCodigo[ant]=pNuevo->pCodigo[sig]=0;
pNuevo->pGenero[ant]=pNuevo->pGenero[sig]=0;
//Creo anterior
pTNodoPelicula pAnt = (pR)? pR->pCodigo[ant] : club.pCodigo[ult];
if (pAnt)
pAnt->pCodigo[sig]=pNuevo;
else
club.pCodigo[pri]=pNuevo;
if (pR)
pR->pCodigo[ant]=pNuevo;
else
club.pCodigo[ult]=pNuevo;
pNuevo->pCodigo[ant]=pAnt;
pNuevo->pCodigo[sig]=pR;
//Ahora por director
pR=club.pDirector[pri];
while (pR && pelicula.director>pR->pelicula.director)
pR= pR->pDirector[sig];
pAnt = (pR)? pR->pDirector[ant]: club.pDirector[ult];
if (pAnt)
pAnt->pDirector[sig]=pNuevo;
else
club.pDirector[pri]=pNuevo;
if(pR)
pR->pDirector[ant]=pNuevo;
else
club.pDirector[ult]=pNuevo;
pNuevo->pDirector[sig]=pR;
pNuevo->pDirector[ant]=pAnt;
//Finalmente se agrupan por genero
pR=club.pGenero[pri];
pAnt=0;
while (pR && pelicula.genero>pR->pelicula.genero)
pR= pR->pGenero[sig];
pAnt = (pR)? pR->pGenero[ant]: club.pGenero[ult];
if (pAnt)
pAnt->pGenero[sig]=pNuevo;
else
club.pGenero[pri]=pNuevo;
if (pR)
pR->pGenero[ant]=pNuevo;
else
club.pGenero[ult]=pNuevo;
pNuevo->pGenero[sig]=pR;
pNuevo->pGenero[ant]=pAnt;
return true;
}
//=====================================
// Ver:
// imprime pelicula
//=====================================
void ver (const TPelicula& pelicula)
{
cout<<"cod: "<<pelicula.codigo
<<" director: "<<pelicula.director
<<" genero: "<<pelicula.genero
<<" cantidad: "<<pelicula.cantidad
<<endl;
}
//=====================================
// Listar:
// lista las peliculas
//=====================================
void listar (const TVideoClub& club, Modo modo)
{
pTNodoPelicula pR;
switch (modo)
{
default:
case (CODIGO):
pR=club.pCodigo[ult];
while (pR)
{
ver (pR->pelicula);
pR=pR->pCodigo[ant];
}
break;
case (DIRECTOR):
pR=club.pDirector[ult];
while (pR)
{
ver (pR->pelicula);
pR=pR->pDirector[ant];
}
break;
case (GENERO):
pR=club.pGenero[ult];
while (pR)
{
ver (pR->pelicula);
pR= pR->pGenero[ant];
}
}
}
bool agregar (const TRetiro& retiro, TPelicula& pelicula)
{
//Si no hay peliculas no agrego
if (pelicula.cantidad<1)
return false;
//Se agrega igual un retiro,se repita o no el codigo
pTNodoRetiro pNuevo = new TNodoRetiro;
pNuevo->retiro=retiro;
pNuevo->pRetiro[ant]=0;
pNuevo->pRetiro[sig]=0;
pTNodoRetiro pR = pelicula.pRetiro[pri];
while (pR && retiro.codigo>pR->retiro.codigo)
pR=pR->pRetiro[sig];
pTNodoRetiro pAnt= (pR)? pR->pRetiro[ant]: pelicula.pRetiro[ult];
if (pR)
pR->pRetiro[ant]=pNuevo;
else
pelicula.pRetiro[ult]=pNuevo;
if (pAnt)
pAnt->pRetiro[sig]=pNuevo;
else
pelicula.pRetiro[pri]=pNuevo;
pNuevo->pRetiro[sig]=pR;
pNuevo->pRetiro[ant]=pAnt;
return true;
}
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120311/14a9badc/attachment.html>
Más información sobre la lista de distribución Cconclase