Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: diamonroyor en 19 Junio 2012, 00:38 am



Título: Pasar codigo a lenguaje C++
Publicado por: diamonroyor en 19 Junio 2012, 00:38 am
Por favor me podrian ayudar a pasar este codigo a C++.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAXCAD 1000

enum {   Anyadir=1, BuscarPorTituloDisco, BuscarPorInterprete, BuscarPorTituloCancion,
         Mostrar, EliminarDisco, Salir};


struct Cancion {
  char * titulo;
  struct Cancion * sig;
};

typedef struct Cancion * TipoListaCanciones;

struct Disco {
  char * titulo;
  char * interprete;
  int anyo;
  TipoListaCanciones canciones;
  struct Disco * sig;
};

typedef struct Disco * TipoColeccion;

TipoListaCanciones crea_lista_canciones(void)
{
  return NULL;
}

TipoListaCanciones anyade_cancion(TipoListaCanciones lista, char titulo[])
{
  struct Cancion * nuevo = malloc(sizeof(struct Cancion));
 
  nuevo->titulo = malloc((strlen(titulo)+1)*sizeof(char));
  strcpy(nuevo->titulo, titulo);
  nuevo->sig = lista;
  lista = nuevo;
  return lista;
}

TipoListaCanciones libera_canciones(TipoListaCanciones lista)
{
  struct Cancion * aux, * siguiente;
 
  aux = lista;
  while (aux != NULL) {
    siguiente = aux->sig;
    free(aux->titulo);
    free(aux);
    aux = siguiente;
  }
  return NULL;
}

int contiene_cancion_con_titulo(TipoListaCanciones lista, char titulo[])
{
  struct Cancion * aux;

  for (aux=lista; aux!=NULL; aux=aux->sig)
    if (strcmp(aux->titulo, titulo)==0)
      return 1;
  return 0;
}

struct Disco * busca_disco_por_titulo_cancion(TipoColeccion coleccion, char titulo[])
{
  struct Disco * aux;
 
  for (aux=coleccion; aux!=NULL; aux=aux->sig)
    if (contiene_cancion_con_titulo(aux->canciones, titulo))
      return aux;
  return NULL;
}

struct Disco * busca_disco_por_titulo_disco(TipoColeccion coleccion, char titulo[])
{
  struct Disco * aux;
 
  for (aux=coleccion; aux!=NULL; aux=aux->sig)
    if (strcmp(aux->titulo, titulo) == 0)
      return aux;
  return NULL;
}

struct Disco * busca_disco_por_interprete(TipoColeccion coleccion, char interprete[])
{
  struct Disco * aux;
 
  for (aux=coleccion; aux!=NULL; aux=aux->sig)
    if (strcmp(aux->interprete, interprete) == 0)
      return aux;
  return NULL;
}

TipoColeccion borra_disco_por_titulo_e_interprete(  TipoColeccion coleccion, char titulo[],
                                                  char interprete[])
{
  struct Disco *aux, *atras;

  for (atras = NULL, aux=coleccion; aux != NULL; atras = aux, aux = aux->sig)
    if (strcmp(aux->titulo, titulo) == 0 && strcmp(aux->interprete, interprete) == 0) {
      if (atras == NULL)
        coleccion = aux->sig;
      else
        atras->sig = aux->sig;
      free(aux->titulo);
      free(aux->interprete);
      libera_canciones(aux->canciones);
      free(aux);
      return coleccion;
    }
  return coleccion;   
}

TipoColeccion crea_coleccion(void)
{
  return NULL;
}

TipoColeccion anyade_disco(  TipoColeccion lista, char titulo[], char interprete[],
                           int anyo, TipoListaCanciones canciones)
{
  struct Disco * disco;

  disco = malloc(sizeof(struct Disco));
  disco->titulo = malloc((strlen(titulo)+1)*sizeof(char));
  strcpy(disco->titulo, titulo);
  disco->interprete = malloc((strlen(interprete)+1)*sizeof(char));
  strcpy(disco->interprete, interprete);
  disco->anyo = anyo;
  disco->canciones = canciones;
  disco->sig = lista;
  lista = disco;
  return lista;
}

TipoColeccion libera_coleccion(TipoColeccion lista)
{
  struct Disco * aux, * siguiente;

  aux = lista;
  while (aux != NULL) {
    siguiente = aux->sig;
    free(aux->titulo);
    free(aux->interprete);
    aux->canciones = libera_canciones(aux->canciones);
    free(aux);
    aux = siguiente;
  }
  return NULL;
}

void muestra_canciones(TipoListaCanciones lista)
{
  struct Cancion * aux;

  for (aux=lista; aux!=NULL; aux=aux->sig)
    printf("  %s\n\n", aux->titulo);
}

void muestra_disco(struct Disco eldisco)
{
  printf("Titulo: %s\n", eldisco.titulo);
  printf("Interprete: %s\n", eldisco.interprete);
  printf("Fecha de edicion: %d\n", eldisco.anyo);
  printf("Canciones: ");
  muestra_canciones(eldisco.canciones);
}

void muestra_coleccion(TipoColeccion lista)
{
  struct Disco * aux;
 
  for (aux=lista; aux!=NULL; aux=aux->sig)
    muestra_disco(*aux);


int main(void)
{
  int opcion;
  TipoColeccion coleccion;
  char titulo_disco[MAXCAD+1], titulo_cancion[MAXCAD+1], interprete[MAXCAD+1];
  char linea[MAXCAD+1];
  int anyo;
  struct Disco * undisco;
  TipoListaCanciones lista_canciones;

  coleccion = crea_coleccion();
 
  do {
    printf("\n\nMenu\n");
    printf(" 1) Agregar disco\n");
    printf(" 2) Buscar por titulo del disco\n");
    printf(" 3) Buscar por interprete\n");
    printf(" 4) Buscar por titulo de cancion\n");
    printf(" 5) Mostrar todo\n");
    printf(" 6) Eliminar un disco por titulo e interprete\n");
    printf(" 7) Finalizar\n");
    printf("Opcion: "); gets(linea); sscanf(linea, "%d", &opcion);
    system ("cls");
    switch(opcion) {
      case Anyadir:
        printf("Titulo: "); gets(titulo_disco);
        printf("Interprete: "); gets(interprete);
        printf("Fecha de edicion: "); gets(linea); sscanf(linea, "%d", &anyo);
        lista_canciones = crea_lista_canciones();
        do {
          printf("Titulo de cancion (pulse esc para acabar):  ");
          gets(titulo_cancion);
          if (strlen(titulo_cancion) > 0)
            lista_canciones = anyade_cancion(lista_canciones, titulo_cancion);
        } while (strlen(titulo_cancion) > 0);
        coleccion = anyade_disco(coleccion, titulo_disco, interprete, anyo, lista_canciones);
        break;

      case BuscarPorTituloDisco:
        printf("Titulo: "); gets(titulo_disco);
        undisco = busca_disco_por_titulo_disco(coleccion, titulo_disco);
        if (undisco != NULL)
          muestra_disco(*undisco);
        else
          printf("No hay discos con titulo '%s'n", titulo_disco);
        break;

      case BuscarPorInterprete:
        printf("Interprete: "); gets(interprete);
        undisco = busca_disco_por_interprete(coleccion, interprete);
        if (undisco != NULL)
          muestra_disco(*undisco);
        else
          printf("No hay discos de %sn", interprete);
        break; 

      case BuscarPorTituloCancion:
        printf("Titulo: "); gets(titulo_cancion);
        undisco = busca_disco_por_titulo_cancion(coleccion, titulo_cancion);
        if (undisco != NULL)
          muestra_disco(*undisco);
        else
          printf("No hay discos con alguna cancion titulada '%s'n", titulo_cancion);
        break;

      case Mostrar:
        muestra_coleccion(coleccion);
        break;

      case EliminarDisco:
        printf("Titulo: "); gets(titulo_cancion);
        printf("Interprete: "); gets(interprete);
        coleccion = borra_disco_por_titulo_e_interprete(coleccion, titulo_cancion, interprete);
        break;
    }
  } while (opcion != Salir);

  coleccion = libera_coleccion(coleccion);

  return 0;
}


Título: Re: Pasar codigo a lenguaje C++
Publicado por: KLuffy en 19 Junio 2012, 00:54 am
Mira trata de convertirlo poco a poco en vez de printf(""); escribe cout<<""; y en vez de gets utiliza cin>> y nos avizas en donde te da error vale segun recuerdo los punteros se manejan igual, trata de hacerlo y nos avizas  ::)


Título: Re: Pasar codigo a lenguaje C++
Publicado por: Saberuneko en 19 Junio 2012, 12:00 pm
Por otro lado, sería también interesante si conviertes alguna de esas estructuras en objetos.

Las estructuras y los objetos son muy parecidos, la diferencia radica en que los objetos también pueden contener funciones.

Así que ya sabes, en los nuevos objetos, pon tanto los datos que ya tienes, como las funciones que trabajan sobre los mismos.

Dale un intento por tu cuenta y pregúntanos en caso de duda, cuando tengas algo ya hecho.

Un Saludo.