[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