elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 23:25  


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  ayuda con codigo de c++ programa para hacer sorteo usando listas y colas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con codigo de c++ programa para hacer sorteo usando listas y colas  (Leído 563 veces)
carles24

Desconectado Desconectado

Mensajes: 4


Ver Perfil
ayuda con codigo de c++ programa para hacer sorteo usando listas y colas
« en: 30 Octubre 2011, 22:29 »

hola!
necesito ayuda para hacer un programa en c++ para simular un sorteo donde se dispone de:
 una lista de n nombres que participan en el sorteo.
 una cola de m premios (m<=n)
 una lista de premiados (pareja de premio-premiado)

estoy intentando el primer punto pero no se como agregar nombres en una lista, ya que solo he visto lista con enteros y no caracteres, aparte debo modificar el codigo visto en clase para poder realizarlo.

Agradezco la guia o ayuda q me puedan dar en este foro.
Código
#include <iostream>
using namespace std;
 
class nodo {// guarda la informacion que vamos a manejar en la lista, valor de informacion int entero
  public:
   nodo(int v, nodo *sig = NULL)//constructor que tiene dos parametros, puede se un valor y no null tambien
   {
      valor = v;
      siguiente = sig;
   }
 
  private:
   int valor;//nodo de tipo entero
   nodo *siguiente;//puede apuntar a cualquier instancia de la clase nodo,puntero hacia una instancia
 
  friend class lista;//nodo le da permiso a lista para trabajar con la class private                                                                
};
 
typedef nodo *pnodo;//tipo de dato llamado pnodo(nombre del dato) que apunta hacia una instancia de tipo nodo y * es el puntero
 
class lista {//tiene varios metodos, permite crear nodos y manejarlos
  public:
   lista() { primero = actual = NULL; }//cuando se crea la lista primero y actual quedan null
   ~lista();// destructor de la clase ~(alt 126), se llama igual que la clase, no retorna a nada ni recibe parametros y sirve para limpiar la lista, vaciar el espacio en memoria
 
   void Insertar(int v);//inserta un valor en la lista y debe ser entero
   void Borrar(int v);//se debe indicar el elemento a borrar, entoces se llama al elemento a borrar
   bool ListaVacia() { return primero == NULL; }//si la lista da null es porque esta vacia
   void Mostrar();//lo que hace es recorrer la lista y la muestra
   void Siguiente();//pasa al siguiente elemento
   void Primero();
   void Ultimo();
   bool Actual() { return actual != NULL; }
   int ValorActual() { return actual->valor; }
 
  private:
   pnodo primero;// es un puntero a alguna instacia de nodo
   pnodo actual;//es un puntero hacia un nodo
};
 
lista::~lista()
{
  pnodo aux;
 
  while(primero) {
     aux = primero;
     primero = primero->siguiente;
     delete aux;//
  }
  actual = NULL;
}
 
void lista::Insertar(int v)
{
  pnodo anterior;
 
  // Si la lista est&#225; vac&#237;a
  if(ListaVacia() || primero->valor > v) {
     // Asignamos a lista un nuevo nodo de valor v y
     // cuyo siguiente elemento es la lista actual  
 
     primero = new nodo(v, primero);//se crea un nuevo nodo
  }
  else {
     // Buscar el nodo de valor menor a v
     anterior = primero;//anterior apunte hacia donde esta apuntando primero (el puntero lo que va va hacer es guardar una direccion de memoria)
     // Avanzamos hasta el &#250;ltimo elemento o hasta que el siguiente tenga
     // un valor mayor que v
 
     while(anterior->siguiente && anterior->siguiente->valor <= v)
        anterior = anterior->siguiente;
     // Creamos un nuevo nodo despu&#233;s del nodo anterior, y cuyo siguiente
     // es el siguiente del anterior
     anterior->siguiente = new nodo(v, anterior->siguiente);//anterior siguiente va a apuntar hacia un nuevo nodo osea la ubicacion de memoria donde lo vamos a crear
  }  //anterior siguiente vale null
}
 
void lista::Borrar(int v)
{
  pnodo anterior, nodo;
 
  nodo = primero;
  anterior = NULL;
  while(nodo && nodo->valor < v) {
     anterior = nodo;
     nodo = nodo->siguiente;
  }
  if(!nodo || nodo->valor != v) return;
  else { // Borrar el nodo
     if(!anterior) // Primer elemento
        primero = nodo->siguiente;
     else  // un elemento cualquiera
        anterior->siguiente = nodo->siguiente;
     delete nodo;
  }  
}
 
void lista::Mostrar()
{
  nodo *aux;
 
  aux = primero;
  while(aux) {
     cout << aux->valor << "-> ";
     aux = aux->siguiente;
  }
  cout << endl;
}
 
void lista::Siguiente()
{
  if(actual) actual = actual->siguiente;
}
 
void lista::Primero()
{
  actual = primero;
}
 
void lista::Ultimo()
{
  actual = primero;  
  if(!ListaVacia())
     while(actual->siguiente) Siguiente();
}
 


« Última modificación: 30 Octubre 2011, 22:30 por madpitbull_99 » En línea
alx128

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: ayuda con codigo de c++ programa para hacer sorteo usando listas y colas
« Respuesta #1 en: 1 Noviembre 2011, 08:06 »

Hola
Para hacer una lista de caracteres debes cambiar en el nodo el tipo de valor es decir en lugar de que sea int seria char declarar el "int v;" seria "char c"...Es lógico que también debes de modificar varias funciones para que reciban como parámetro o regresen un tipo char y no un tipo int.

Bueno en tu caso como quieres almacenar nombres entonces puedes usar un arreglo de caracteres "char c[];"...El modo de recorrer la lista seria el mismo lo que cambia es el nodo ahora tendrías nodos que almacenan un arreglo de caracteres...

O y para saber cuantos nombres hay en la lista puedes agregar un valor entero en el nodo indicando que numero de nombre es, o sea que tendrías nodos que almacenan un arreglo de cadenas y también un valor de tipo entero...


En línea
carles24

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: ayuda con codigo de c++ programa para hacer sorteo usando listas y colas
« Respuesta #2 en: 2 Noviembre 2011, 04:45 »

Hola
Para hacer una lista de caracteres debes cambiar en el nodo el tipo de valor es decir en lugar de que sea int seria char declarar el "int v;" seria "char c"...Es lógico que también debes de modificar varias funciones para que reciban como parámetro o regresen un tipo char y no un tipo int.

Bueno en tu caso como quieres almacenar nombres entonces puedes usar un arreglo de caracteres "char c[];"...El modo de recorrer la lista seria el mismo lo que cambia es el nodo ahora tendrías nodos que almacenan un arreglo de caracteres...

O y para saber cuantos nombres hay en la lista puedes agregar un valor entero en el nodo indicando que numero de nombre es, o sea que tendrías nodos que almacenan un arreglo de cadenas y también un valor de tipo entero...

Gracias por tu respuesta voy a intentarlo para ver si puedo avanzar con el programa
En línea
carles24

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: ayuda con codigo de c++ programa para hacer sorteo usando listas y colas
« Respuesta #3 en: 5 Noviembre 2011, 19:10 »

hola! espero que me puedan ayudar con esto
Ya cambie los valores y pase  de int v a char c[] pero me da errores a la hora de compilar:
in constructor ´nodo::nodo(char*, nodo*)´:
'v' undeclared (first use this function)
ese error lo tengo entodas las funciones del programa:

#include <iostream>
using namespace std;

class nodo {// guarda la informacion que vamos a manejar en la lista, valor de informacion int entero
   public:
    nodo(char c[], nodo *sig = NULL)//constructor que tiene dos parametros, puede se un valor y no null tambien
    {
       valor = v;
       siguiente = sig;
    }

   private:
    char valor;//nodo de tipo entero
    nodo *siguiente;//puede apuntar a cualquier instancia de la clase nodo,puntero hacia una instancia
       
   friend class lista;//nodo le da permiso a lista para trabajar con la class private                                                                 
};

typedef nodo *pnodo;//tipo de dato llamado pnodo(nombre del dato) que apunta hacia una instancia de tipo nodo y * es el puntero

class lista {//tiene varios metodos, permite crear nodos y manejarlos
   public:
    lista() { primero = actual = NULL; }//cuando se crea la lista primero y actual quedan null
    ~lista();// destructor de la clase ~(alt 126), se llama igual que la clase, no retorna a nada ni recibe parametros y sirve para limpiar la lista, vaciar el espacio en memoria
   
    void Insertar(char c[]);//inserta un valor en la lista y debe ser entero
    void Borrar(char c[]);//se debe indicar el elemento a borrar, entoces se llama al elemento a borrar
    bool ListaVacia() { return primero == NULL; }//si la lista da null es porque esta vacia
    void Mostrar();//lo que hace es recorrer la lista y la muestra
    void Siguiente();//pasa al siguiente elemento
    void Primero();
    void Ultimo();
    bool Actual() { return actual != NULL; }
    char ValorActual() { return actual->valor; }
   
   private:
    pnodo primero;// es un puntero a alguna instacia de nodo
    pnodo actual;//es un puntero hacia un nodo
};

lista::~lista()
{
   pnodo aux;
   
   while(primero) {
      aux = primero;
      primero = primero->siguiente;
      delete aux;//
   }
   actual = NULL;
}

void lista::Insertar(char c[])
{
   pnodo anterior;
 
   // Si la lista está vacía
   if(ListaVacia() || primero->valor > v) {
      // Asignamos a lista un nuevo nodo de valor v y
      // cuyo siguiente elemento es la lista actual 
                       
      primero = new nodo(v, primero);//se crea un nuevo nodo
   }
   else {
      // Buscar el nodo de valor menor a v
      anterior = primero;//anterior apunte hacia donde esta apuntando primero (el puntero lo que va va hacer es guardar una direccion de memoria)
      // Avanzamos hasta el último elemento o hasta que el siguiente tenga
      // un valor mayor que v
     
      while(anterior->siguiente && anterior->siguiente->valor <= v)
         anterior = anterior->siguiente;
      // Creamos un nuevo nodo después del nodo anterior, y cuyo siguiente
      // es el siguiente del anterior
      anterior->siguiente = new nodo(v, anterior->siguiente);//anterior siguiente va a apuntar hacia un nuevo nodo osea la ubicacion de memoria donde lo vamos a crear
   }  //anterior siguiente vale null
}

void lista::Borrar(char c[])
{
   pnodo anterior, nodo;
   
   nodo = primero;
   anterior = NULL;
   while(nodo && nodo->valor < v) {
      anterior = nodo;
      nodo = nodo->siguiente;
   }
   if(!nodo || nodo->valor != v) return;
   else { // Borrar el nodo
      if(!anterior) // Primer elemento
         primero = nodo->siguiente;
      else  // un elemento cualquiera
         anterior->siguiente = nodo->siguiente;
      delete nodo;
   }   
}

void lista::Mostrar()
{
   nodo *aux;
   
   aux = primero;
   while(aux) {
      cout << aux->valor << "-> ";
      aux = aux->siguiente;
   }
   cout << endl;
}

void lista::Siguiente()
{
   if(actual) actual = actual->siguiente;
}

void lista::Primero()
{
   actual = primero;
}

void lista::Ultimo()
{
   actual = primero; 
   if(!ListaVacia())
      while(actual->siguiente) Siguiente();
}

este es el codigo del archivo cpp:

#include <iostream>
#include <conio.h>
#include "listas.h"

using namespace std;

int main(){
   
      lista Lista;//se crea la instancia de lista
      Lista.Insertar(carlos);
      Lista.Insertar(luis);
      Lista.Mostrar();
     
      if (Lista.ListaVacia())
         
          cout<< "Lista esta vacía...";
     
      else
          cout<< "Lista no esta vacía...";
         
      getch();     



En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines