Foros del Web » Programación para mayores de 30 ;) » C/C++ »

duda cargar , mostrar y ordenar estructura en c++[ayuda]

Estas en el tema de duda cargar , mostrar y ordenar estructura en c++[ayuda] en el foro de C/C++ en Foros del Web. Hola buenas , voy directo al grano , llevo ya dandole vueltas a como ordenar una estructura y nada me da errores y tal , ...
  #1 (permalink)  
Antiguo 31/01/2016, 05:28
 
Fecha de Ingreso: enero-2016
Mensajes: 2
Antigüedad: 8 años, 3 meses
Puntos: 0
duda cargar , mostrar y ordenar estructura en c++[ayuda]

Hola buenas , voy directo al grano , llevo ya dandole vueltas a como ordenar una estructura y nada me da errores y tal , os pongo el codigo , yo por ahora no encuentro el fallo

//OS PONGO TAMBIEN EL CARGAR Y MOSTRAR NO VAYA A SER QUE ESTE AHI EL FALLO .

//BIBLIOTECAS
#include <iostream>
using namespace std;
#include <string>
#include <fstream>

//VARIABLES CONSTANTES Y DEFINICIONES TYPEDEF
const int MAX_JUGADORES = 10;

typedef struct{

string name;
float puntuacion;

}tJugador;

//PROTOTIPOS
int cargarLista(tJugador players[]);
void mostrar(tJugador players[] , int num);
void ordenar(tJugador player[]);

//PROGRMA
int cargarLista(tJugador players[]){
ifstream cargar;
bool centinela;

int contador, numJugadores;

contador= 0;
numJugadores = 0;

centinela = false;

cargar.open("top.txt");

if (cargar.is_open()) {

cargar >> players[contador].name;

if (players[contador].name == "-1")//-1 centinela

centinela = true;

while ((centinela == false) && (num < MAX_JUGADORES)) {

cargar >> players[contador].puntuacion;

contador++;
numJugadores++;

cargar >> players[contador].name;

if (players[contador].name == "-1")

centinela = true;
}
}
else cout << "Error al cargar el fichero" << endl;





cargar.close();
return numJugadores;//PODRIAMOS DEVOLVER DIRECTAMENTE LA VARIABLE contador.
}

void mostrar(tJugador players[] , int num){


for(int contador = 0; contador < num; contador++) {
cout << players[contador].name << " " << players[contador].puntuacion << endl;
}
cout << endl;

}
void ordenar(tJugador player[]){

//-------------- Método de ordenación -----------------------------
for (int contador = 0; contador < MAX_JUGADORES - 1; contador++) { //SERIA MAX_JUGADORES O LE PASO LA VARIABLE NUM?
// Desde el primer elemento hasta el penúltimo
for (int j = MAX_JUGADORES - 1; j > contador; j--) {
// Desde el último hasta el siguiente a contador
if (players[cont].puntuacion < lista[cont - 1].puntuacion) {
int tmp;
tmp = players[cont].puntuacion;
players[cont].puntacion = players[cont - 1].puntuacion;
players[cont - 1].puntuacion = tmp;
}
}
}
//-----------------------------------------------------------------

}
//MAIN
int main(){
int num =0;
tJugador players[MAX_JUGADORES + 1];
//+1 debido a que contacmos con el jugador conectado.
num=cargarLista(players);
ordenar(players)
mostrar(players, num)

return 0;
}


//FICHERO
el fichero top.txt seria :


daniel 99
alfonso 77
pedro 100
laura 5
-1

//PUEDE QUE HABER ALGUN ERROR DE SINTAXIS , DEFINICION O ALGUN CARACTER , POR QUE LO HECHO POR ENCIMA , LA COSA ES SI EL ALGORITMO ESTA BIEN PLANTEADO

Última edición por dbr69; 31/01/2016 a las 05:42
  #2 (permalink)  
Antiguo 31/01/2016, 08:59
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: duda cargar , mostrar y ordenar estructura en c++[ayuda]

El código, si lo decoras con la etiqueta de código (mira el desplegable Highlight) conseguirás que sea legible y respetarás las normas del foro.

Cosillas de tu código:

C++ no es C

En C++ los struct funcionan de forma ligeramente diferente a como lo hacen en C.

En C++ no es necesario usar typedef con un struct. El siguiente ejemplo te lo demuestra:

Código C++:
Ver original
  1. struct tJugador{
  2.   string name;
  3.   float puntuacion;
  4. };
  5.  
  6. int main()
  7. {
  8.   tJugador objeto;
  9.   objeto.name = "test";
  10. }

Contenedores

C++ dispone de contenedores. Un contenedor es un objeto pensado para contener colecciones de elementos. Son los sustitutos naturales de los arrays de C. Las ventajas de usar contenedores en vez de arrays de C son varias:
  • Evitas errores con la memoria dinámica.
  • No tienes limitaciones de tamaño. El contenedor gestiona su memoria interna y tiene sus propias rutinas para redimensionar el tamaño de su lista.
  • Disponen de utilidades para manipular sus elementos
  • Cada tipo de contenedor se adapta a unas necesidades diferentes.

El contenedor más utilizado es vector. Esta clase almacena una lista de elementos sin ordenar, para no enrollarnos decir que es lo más parecido un array clásico de C.

La clase vector tiene un método push_back() para añadir elementos a la lista, un método size() que te indica el número de elementos en la lista. También puedes usar los corchetes [] para acceder a los elementos de la colección:

Código C++:
Ver original
  1. std::vector<tJugador> jugadores;
  2.  
  3. tJugador jugador;
  4. jugador.name="test";
  5.  
  6. jugadores.push_back(jugador);
  7.  
  8. std::cout << jugadores.size() << std::endl;
  9. std::cout << jugadores[0].name << std::endl;

No se si te dejarán utilizar contenedores a estas alturas, pero te interesa saber que existen y que su uso es muy recomendable.

Ordenar listas

Código C++:
Ver original
  1. void ordenar(tJugador player[]){
  2.   for (int contador = 0; contador < MAX_JUGADORES - 1; contador++) {
  3.     // Desde el primer elemento hasta el penúltimo
  4.     for (int j = MAX_JUGADORES - 1; j > contador; j--) { // <<--- 1
  5.       if (players[cont].puntuacion < lista[cont - 1].puntuacion) { // <<--- 2
  6.         int tmp;
  7.         tmp = players[cont].puntuacion;
  8.         players[cont].puntacion = players[cont - 1].puntuacion;  // <<--- 3
  9.         players[cont - 1].puntuacion = tmp;
  10.  
  11.         // 4
  12.       }
  13.     }
  14.   }
  15. }
  1. Un segundo bucle con j como índice... ¿Dónde usas esta variable?
  2. Si la variable que estás declarando en el for es contador... ¿por qué aquí usas cont? Nombres diferentes, variables diferentes y código que no compila.
  3. ¿Por qué asumes que SIEMPRE debes intercambiar el un registro y su inmediatamente anterior? ¿Y si cont vale 0? Tip: Tienes dos índices contador y [/i]j[/i]... úsalos.
  4. Ordenar la lista entiendo que debería significar ordenar TODO... no únicamente la puntuación. ¿Qué sucede con el nombre del jugador? Tienes los datos definidos en una estructura no? pues entonces copia estructuras:
    Código C++:
    Ver original
    1. tJugador jugador1;
    2. jugador1.name="test";
    3. jugador1.puntuacion = 3;
    4.  
    5. tJugador jugador2;
    6. jugador2 = jugador1;
    7.  
    8. std::cout << jugador2.name << " " << jugador2.puntuacion << std::endl;

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: estructura, int, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:12.