ayuda lista simple imprecion de datos

Iniciado por jorgecotrinax, 22 Septiembre 2019, 19:10 PM

0 Miembros y 1 Visitante están viendo este tema.

jorgecotrinax

trabajo con visual studio 2015 el problema es que al imprimir los datos estos no se muestran solo se muestra caracteres sin sentido por favor ayúdenme :-( :-( :-(

pdt : ignoren la funcion burbuja trataba de ordenar la lista simpre por ese metodo seleccionado ponderado pero creo que solo muevo el dato y no todos xD :xD :xD :xD :xD


#include<iostream>
#include<string.h>
using namespace std;

class Estudiante {
public:
char codigo[5];
string nombre;
float poderado;
Estudiante* siguiente;
Estudiante( char* cod, string nom,float pode ) {

cod=codigo;
nom =nombre;
pode = poderado;
siguiente = NULL;
}
};

class NodoSimple {
public:
Estudiante* cabeza;
NodoSimple() {
cabeza = NULL;
}

void insertar(char* cod, string nom, float pode) {
Estudiante * nuevo = new Estudiante(cod, nom, pode);
if (!cabeza) {
cabeza = nuevo;
}
else {
nuevo->siguiente = cabeza;
cabeza = nuevo;
}
}


void imprimirburbuja() {
float t;
Estudiante* aux = cabeza;
while (cabeza->siguiente)
{
aux = cabeza->siguiente;
while (aux)
{
if (cabeza->poderado>aux->poderado) {
t = aux->poderado;
aux->poderado = cabeza->poderado;
cabeza->poderado = t;
}
aux = aux->siguiente;
}
cabeza = cabeza->siguiente;
aux = cabeza->siguiente;
}
}

void imprimir() {
Estudiante* aux = cabeza;
while (aux)
{

cout << "listade alumnos" << endl;
cout << aux->codigo << endl;
cout << aux->nombre.c_str() << endl;
cout << aux->poderado << endl;
aux = aux->siguiente;


}
cout <<"-----------------------------"<< endl;
}
};

int main() {
NodoSimple milista;
milista.insertar("asas", "carlos", 18);
milista.insertar("asss", "lucas", 11);
milista.insertar("aaaa", "mateo", 10);
milista.insertar("asss", "marcos", 8);

milista.imprimir();

system("pause");
}

K-YreX

Sólo he llegado hasta la clase <Estudiante> pero ya te puedo decir que el error (o al menos uno de ellos) está en el constructor.
Código (cpp) [Seleccionar]

class Estudiante{
    public:
        char codigo[5];
        string nombre;
        float poderado;
        Estudiante* siguiente;
       
        Estudiante( char* cod, string nom,float pode ){
            cod=codigo; // esta al reves
            nom =nombre; // esta al reves
            pode = poderado; // esta al reves
            siguiente = NULL;
        }
};

Cada objeto de la clase <Estudiante> tiene 4 datos miembros que son: <codigo>, <nombre>, <poderado> y <siguiente>. Los datos miembros no son <cod>, <nom> y <pode>. Estos últimos son los nombres que tendrán los parámetros del constructor mientras este se ejecuta. Estos nombres son temporales y en cada función pueden tener nombres distintos.

Aparte de eso cuidado al guardar el código. Para "copiar" cadenas de tipo C (o dicho de otra manera, arrays de <char>) debes usar métodos como <strcpy()> o más recomendable <strncpy()>. No vale con usar el operador de igual =.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

jorgecotrinax


Beginner Web

Cita de: YreX-DwX en 22 Septiembre 2019, 19:24 PM
Sólo he llegado hasta la clase <Estudiante> pero ya te puedo decir que el error (o al menos uno de ellos) está en el constructor.
Código (cpp) [Seleccionar]

class Estudiante{
    public:
        char codigo[5];
        string nombre;
        float poderado;
        Estudiante* siguiente;
       
        Estudiante( char* cod, string nom,float pode ){
            cod=codigo; // esta al reves
            nom =nombre; // esta al reves
            pode = poderado; // esta al reves
            siguiente = NULL;
        }
};

Cada objeto de la clase <Estudiante> tiene 4 datos miembros que son: <codigo>, <nombre>, <poderado> y <siguiente>. Los datos miembros no son <cod>, <nom> y <pode>. Estos últimos son los nombres que tendrán los parámetros del constructor mientras este se ejecuta. Estos nombres son temporales y en cada función pueden tener nombres distintos.

Aparte de eso cuidado al guardar el código. Para "copiar" cadenas de tipo C (o dicho de otra manera, arrays de <char>) debes usar métodos como <strcpy()> o más recomendable <strncpy()>. No vale con usar el operador de igual =.

Perdon que interrumpa pero me gustaría saber como trabajas con ese atributo Estudiante* siguiente;

Como sabes cual es su siguiente si creas secuencialmente a los estudiantes A, B y C por ejemplo
estudiante A luego B, C o sea como es que A va a tener a B y B a C,
u otro caso al crear A, B, C este A tendrá a B y C, y B a C y C a NULL, bueno algo asi ;-)
7w7

K-YreX

Cita de: Beginner Web en 25 Septiembre 2019, 07:53 AM
Perdon que interrumpa pero me gustaría saber como trabajas con ese atributo Estudiante* siguiente;

Como sabes cual es su siguiente si creas secuencialmente a los estudiantes A, B y C por ejemplo
estudiante A luego B, C o sea como es que A va a tener a B y B a C,
u otro caso al crear A, B, C este A tendrá a B y C, y B a C y C a NULL, bueno algo asi ;-)
Al parecer la función <insertar()> trabaja como si de una pila se tratase. Crea el primer estudiante A y hace <cabeza = A>. Luego crea al estudiante B pero en lugar de hacer:
Código (cpp) [Seleccionar]

A->siguiente = B;

Lo que hace es:
Código (cpp) [Seleccionar]

B->siguiente = cabeza; // en este caso cabeza es A
cabeza = B;

Por lo que si inserta los estudiantes A, B, C, D, la lista quedaría de la siguiente manera:

D(cabeza)->C->B->A->NULL
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

jorgecotrinax

muchas gracias de corazón  ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) esot esta mucho mejor sobro hago las de doblemente enlazadas 

jorgecotrinax

Cita de: YreX-DwX en 22 Septiembre 2019, 19:24 PM
Sólo he llegado hasta la clase <Estudiante> pero ya te puedo decir que el error (o al menos uno de ellos) está en el constructor.
Código (cpp) [Seleccionar]

class Estudiante{
    public:
        char codigo[5];
        string nombre;
        float poderado;
        Estudiante* siguiente;
       
        Estudiante( char* cod, string nom,float pode ){
            cod=codigo; // esta al reves
            nom =nombre; // esta al reves
            pode = poderado; // esta al reves
            siguiente = NULL;
        }
};

Cada objeto de la clase <Estudiante> tiene 4 datos miembros que son: <codigo>, <nombre>, <poderado> y <siguiente>. Los datos miembros no son <cod>, <nom> y <pode>. Estos últimos son los nombres que tendrán los parámetros del constructor mientras este se ejecuta. Estos nombres son temporales y en cada función pueden tener nombres distintos.

Aparte de eso cuidado al guardar el código. Para "copiar" cadenas de tipo C (o dicho de otra manera, arrays de <char>) debes usar métodos como <strcpy()> o más recomendable <strncpy()>. No vale con usar el operador de igual =.

si se eso que esta al reves es que no me lo aceptaba me parecio raro probe quitando la cantidad de datos que quiero "[4]" y me permitio hacerlo como es correctamente pero como hago cunado me piden una cantidad fija de datos ?

K-YreX

Cita de: jorgecotrinax en 30 Septiembre 2019, 04:45 AM
si se eso que esta al reves es que no me lo aceptaba me parecio raro probe quitando la cantidad de datos que quiero "[4]" y me permitio hacerlo como es correctamente pero como hago cunado me piden una cantidad fija de datos ?
No sé a que te refieres con eso último. Si tienes un constructor con 3 parámetros, cuando crees un objeto, debes hacerlo con 3 parámetros. Si a lo que te refieres es a poder crear objetos pasando 3 parámetros o pasando otro número de parámetros lo que debes hacer es sobrecargar el constructor con otro número de parámetros.
Si no te refieres a eso, intenta explicármelo otra vez de otra forma para que pueda ayudarte. Podrías ponerme cómo lo tenías y qué era lo que no te dejaba o qué es lo que quieres poder hacer. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

jorgecotrinax

Cita de: YreX-DwX en 30 Septiembre 2019, 15:38 PM
No sé a que te refieres con eso último. Si tienes un constructor con 3 parámetros, cuando crees un objeto, debes hacerlo con 3 parámetros. Si a lo que te refieres es a poder crear objetos pasando 3 parámetros o pasando otro número de parámetros lo que debes hacer es sobrecargar el constructor con otro número de parámetros.
Si no te refieres a eso, intenta explicármelo otra vez de otra forma para que pueda ayudarte. Podrías ponerme cómo lo tenías y qué era lo que no te dejaba o qué es lo que quieres poder hacer. :-X

esto lo ise a proposito por que me daba error si lo ponia correctamente
Estudiante( char* cod, string nom,float pode ){
            cod=codigo; // esta al reves
            nom =nombre; // esta al reves
            pode = poderado; // esta al reves
            siguiente = NULL;
        }

al parecer era por la cantidad de datos que puse [5]

char codigo[5];

lo quite  [5]y me codigo se ejecuto correctamente
la pregunta como hago para yo elegir la cantidad de datos de cada archivo o debo usar
solamente uso el tipo de dato correcto al fina solo trato de hacer esto
-> https://drive.google.com/open?id=1LD0zBfxs1FsDMGSTp1th0zlob7P6HxkR

K-YreX

Cita de: jorgecotrinax en 30 Septiembre 2019, 16:07 PM
esto lo ise a proposito por que me daba error si lo ponia correctamente
Estudiante( char* cod, string nom,float pode ){
            cod=codigo; // esta al reves
            nom =nombre; // esta al reves
            pode = poderado; // esta al reves
            siguiente = NULL;
        }

al parecer era por la cantidad de datos que puse [5]

char codigo[5];

lo quite  [5]y me codigo se ejecuto correctamente
la pregunta como hago para yo elegir la cantidad de datos de cada archivo o debo usar
solamente uso el tipo de dato correcto al fina solo trato de hacer esto
-> https://drive.google.com/open?id=1LD0zBfxs1FsDMGSTp1th0zlob7P6HxkR
Lo siento pero sigues sin ser específico. Igual soy yo pero sigo sin entender tu duda... pusiste [5], dónde?? :huh: :huh:
Citar
como hago para yo elegir la cantidad de datos de cada archivo
Te refieres al largo de la variable <cod> y <codigo>?? Eso tienes que controlarlo con otra variable. Cuando pasas a esa función el parámetro <cod>, estás pasando la dirección de memoria en la que empieza el código <cod> pero para saber cuándo acaba o cómo de largo es, debes pasar otro parámetro que sea el largo.
Si te da igual lo largo que sea <cod> porque en <codigo> vas a copiar sus X primeros caracteres podrías hacer algo como (de paso te pongo cómo hacer estas cosas sin andar cambiando nombres usando la partícula <this>):
Código (cpp) [Seleccionar]

Estudiante(char *codigo, string nombre, float poderado){
    this->nombre = nombre; // this->nombre es el del objeto y nombre solo es el parametro
    this->poderado = poderado;
    this->siguiente = NULL; // se puede omitir pero poniendolo se ve mejor que es un atributo del objeto
    strncpy(this->codigo, codigo, X); // asi copias en this->codigo los X primeros caracteres de codigo
}

Si una vez más no he acertado con la interpretación pues bueno, una explicación que te llevas de regalo... :rolleyes: :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;