Dev - C++ - Ayuda con un código

   
Vista:

Ayuda con un código

Publicado por Miguel (6 intervenciones) el 14/05/2015 19:09:32
Hola soy nuevo en este forum y necesito ayuda con un código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Registro::addvehiculo(Vehiculo*v){
	if(!lista) {
	  lista = new Vehiculo[++tamano];
	  lista[tamano] = v;
		}
	  else{
	  	Vehiculo *temp = new Vehiculo[tamano] ;	  /
	  	temp = lista;
		delete  [] lista;
		lista = new Vehiculo [tamano];
		lista = temp;
		lista = v;
		delete []temp;
	  }
}

Lo que trato es de crear un arreglo que contenga elementos de tipo Vehiculos que es una clase que tengo creada, lista es un puntero a esa clase
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

Ayuda con un código

Publicado por vangodp (287 intervenciones) el 14/05/2015 22:33:42
se trata de listas?? Aqui tienes un ejemplo completo: https://www.dropbox.com/s/e7u36uz8pvbxk7e/lista_cpp.zip

Y aquí más o menos la teoría en C http://www.c.conclase.net/edd/?cap=001.

Creo que mejor mires el ejemplo y luego lo adaptas a lo que necesitas. Algo falla en tu teoría creo.

Vamos a dar una mirada a su código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
crea una lista para incertar un vehiculo.
if ( !lista ){//si la lista esta vacia
    //crea una lista para incertar un vehiculo.
    lista = new Vehiculo[++tamano]; //suponiendo que tamano vale 0, antes de crear la lista tamano incrementa quedando así en uno.
    lista[tamano] = v;  //guardamos el primer coche en la posicion 1??? Es eso cierto?? No deberias guardarla en la posicion 0 de la lista el primer coche? Seria lista[tamano-1] = v; o directamente lista[0] = v;
 
}else{ // por otro lado si la lista ya existe aqui creo que cometes otro fallo
    Vehiculo *temp = new Vehiculo[tamano]; //has creado una lista nueva del mismo tamaño que la primera
    temp = lista; // <-que es esto O_O. ahora que temp apuntaba a la nueva lista vas y lo pierdes haciendo que apunte a la vieja lista, sin deletarla antes. Resumiendo... MEMORY LEAKS
    delete [] lista; // ahora vas y borras la vieja lista que tanto temp como list apuntaban, o sea que ya no te queda lista XD.
    lista = new Vehiculo [tamano]; //No contento creas otr lista XD
    lista = temp; // y nuevamente la pierdes XDDD
    lista = v; //termina apuntando al coche y todo listo con lo que viene a continuacion.
    delete []temp; //O sea que has terminado con un puntero al coche, sin ninguna lista, con la memoria echa un queso de tantos agujeros.... madre mia jaja
}

No se que quieres hacer pero lo correcto es que cada nodo apunte al siguiente. En ningún momento haces eso.
Simplemente estas creando nodo y borrando nodo, creando nodo y borrando nodo todo el tiempo.
Si tengo 2 punteros apuntando a un mismo contenido, si hago delete[] al contenido de uno de ellos, pierdo ambos, ya que apuntan a lo mismo.

No puedo intuir que quieres hacer exactamente por que has puesto apenas un fragmento pero creo que te falla la lógica y mucho. Si quieres poner toda la clase seria mejor, o mejor aun todo el código, puedes comprimirlo y adjuntar al tema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con un código

Publicado por Miguel (6 intervenciones) el 14/05/2015 22:53:17
Muchas gracias por tu ayuda vangodp:

Te adjunto el examen y el código que tengo hecho hasta el momento, se que debía haberlo hecho por listas pero es que no se como hacerlo y por arreglos me lo aceptan, quisiera poder solucionarlo por ambas vías si pudieras ayudarme te lo agradecería muchísimo ya que es más o menos como debe salir el examen final y tengo que hacerlo en dev-c++.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Ayuda con un código

Publicado por vangodp (287 intervenciones) el 15/05/2015 08:57:22
Después de analizar tu código me he dado cuenta que no se trata de lista si no de colas. Como es un tunel al que entra coches, el primer que entra es el primer que sale, es como una cola.

El ejemplo de colas lo tienes aquí: http://www.c.conclase.net/edd/?cap=003#inicio

el código va adjunto pero si lo quieres descargar desde la pagina ese u otro, esta al lado izquierdo al final de la lista donde pone "Descarga de ejemplos" Ahí hay uno para c++.

Solo lo adapte y listo. Pero no lo termine 100%. a ver si consigues terminarlo o si no me lo dices y lo termino.
va adjunto en winrar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con un código

Publicado por Miguel (6 intervenciones) el 15/05/2015 15:53:04
Muchas gracias vangodp es usted un experto en esto de c++, yo aún estoy aprendiendo esto y me resulta bastante dificil, espero que con este ejemplo que me ha resuelto ya pueda realizar otros, ahora voy a intentar hacerlo como si fuera una pila y luego como una lista.

Quisiera que me aconsejara si debo hacerlo así como este ejercicio o debo utilizar las clases lista, pila y cola que ya están hechas y adaptarlas a mi problema.

Muchas gracias y disculpa la molestia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Ayuda con un código

Publicado por vangodp (287 intervenciones) el 15/05/2015 19:44:34
Sea lo que sea, practique todo sobre esos contenedores. Pilas, colas, listas simples y doblemente enlazadas etc etc.

En realidad en C++ para no agobiarnos tanto usamos las STL, hace que nos despreocupemos por esos problemas y centrémonos en programar, pero es bueno entender como funciona todo a más bajo nivel antes de volar alto. XD

Tu ejemplo aun no está terminado. hacia falta implementar cosas como cuantos tipos de coches hay etc etc.

Primero creo que deberías hacer por ti mismo algunos de esos ejemplo en base a los textos. Es muy fácil copiar, bueno... Al menos más que crearlo de la nada.

Lo que debes quedar es con el concepto de listas colas etc.

Por ejemplo el concepto de cola. una cola solo funciona de la siguiente forma. imagine que vamos a comprar pan existe una cola. Lógicamente el primer que llega es el primer que es atendido, entonces tienes una clase que hace de nodo, una cola esta conpuesto de nodos, en tu ejemplo los nodos eran los vehiculos y una lista nada más es que un puntero de la clase nodo que inicia en vacio, claro, pues aun no contiene ningún nodo, entonces vamos añadiendo nodos y haciendo que cada uno apunte al siguiente.

En el ejemplo de colas nos interesa saber cual es el primer nodo y el ultimo... Por que si vamos sacar un nodo de la cola siempre será el primer, aun que nada nos impide de sacar uno del medio o de los extremos, o incluso uno en concreto, pero eso no seria una cola entonces.

La cuestión es quedar con el concepto, ya que todos son creados y destruidos de forma similar pero hay que respectar el concepto según las necesidades. en el caso del túnel, esta claro que si un coche entra primer sale primer, aun que en teoría no siempre es así, por ejemplo, un coche corre más que otro, se supone que si un coche va a 50km y entra primer al túnel pero luego de tras va otro a 100km, si el túnel es lo suficientemente largo el segundo coche va ultrapasarlo. Entonces hace que nos preguntemos...¿Qué tipo de contenedor necesitamos realmente? Pues creo que seria una lista, la que se pueda quitar coche de cualquier parte de ella. habría que hacer una especie de calculo especial de hora de entrada al túnel, velocidad, longitud, etc etc, para obtener por ejemplo el tiempo en que tarda cada coche en cruzar el túnel y cual es el primer que va salir. No creo que sea muy complicado, pero desde luego el menú 2 en el que sale los coches tendría que recorrer toda la lista y ver el que saliera primer. ¿Seria genial realizar algo así en tiempo real no crees? =)

Realice todos los ejemplos de la pagina que te pase en orden para pillar practica ese es mi concejo. Porque cada uno se basa en el anterior, se te será más facil entender.

Hasta a mí me dan ganas de hacer el ejemplo del tunel en tiempo real jeje.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con un código

Publicado por Miguel (6 intervenciones) el 15/05/2015 22:50:56
vangodp ya pude entender todo en las colas, y me salio todo como quería ya el ejemplo está solucionado y corre perfecto gracias a su ayuda.

Ahora lo estoy solucionando pero como si fuera una pila y ya implemente las funciones de adicionar y eliminar de la pila pero me gustaría me gustaría mostrar la pila completa para ver si realmente se está llenando pero no me sale, si pudieras ayudarme te lo agradecería.

Disculpa por molestarte tanto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Ayuda con un código

Publicado por vangodp (287 intervenciones) el 16/05/2015 01:16:05
pon lo que llevas echo y veremos que podemos sacar ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con un código

Publicado por Miguel (6 intervenciones) el 16/05/2015 05:51:19
ya tengo solucionado el código para las pilas, ya me funciona de maravilla.

vangodp si pudieras ayudarme a realizar el ejercicio como si fuera una lista te lo agradeciera mucho, es la única forma que me falta y no logro insertar ni borrar en la lista.

Muchas gracias, sus conocimientos me han ayudado mucho.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con un código

Publicado por Miguel (6 intervenciones) el 16/05/2015 06:22:40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void lista::Insertar(Vehiculo *v)
{
  pnodo anterior;
 
   // Si la lista está vacía
   if(ListaVacia() ) {
 
      	primero = new Vehiculo;
      	primero->set_mat(v->get_mat());
		primero->set_velocidad(v->get_vel());
		primero->set_tipo(v->get_tipo());
 
 
   }
   else {
 
      anterior = primero;
        while(anterior->siguiente)
        anterior = anterior->siguiente;
   		anterior->siguiente = new Vehiculo();
        anterior->set_mat(v->get_mat());
		anterior->set_velocidad(v->get_vel());
		anterior->set_tipo(v->get_tipo());
   }


El error que tengo es que al insertar mas de un elemento en la lista siempre pierdo el primero y no se como hacer la función borrar para eliminar un elemento de esta lista
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar