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");
}
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.
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 =.
ok muchísimas gracias ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)
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.
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 ;-)
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:
A->siguiente = B;
Lo que hace es:
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
muchas gracias de corazón ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) esot esta mucho mejor sobro hago las de doblemente enlazadas
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.
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 ?
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
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
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>):
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