Bubble sort ad una struttura con puntatori

di il
4 risposte

Bubble sort ad una struttura con puntatori

Salve a tutti. Ho un problemino con il seguente programma che prende in input una struttura nuotatore con 4 campi: nome, età, minuti e secondi. Il programma dovrebbe stilare la graduatoria finale mettendo al primo posto il nome del nuotatore che ovviamente ha realizzato un tempo minore (confrontando i minuti ad esempio). Ho utilizzato a proposito il bubble sort, rispettando credo la logica dell'algoritmo, ma il problema e che in output non funziona e mi stampa caratteri strani tranne per il primo nuotatore. Qualche dritta? Grazie mille.

#include <iostream>

using namespace std;

struct nuotatore
{
      char nome[20];
      int eta;
      int minuti;
      int secondi;
};

void inserisci (nuotatore *ptr);

int main ()
{
    int aux;
    nuotatore *p, *q;
    nuotatore n[5];
    p=&n[0];
    
    for (int i=0; i<5; i++)
    inserisci(p);
    
    for (int i=5; i>0; i--)
    {
      p=&n[0];
      q=&n[1];
         for(int j=0; j<i; j++, p++, q++)
                  if((p -> minuti) > (q -> minuti))
                  {
                            
                       aux=p -> minuti;
                       p -> minuti=q -> minuti;
                       q -> minuti=aux;
                  }
    }
      q=&n[0];
      for (int i=0; i<5; i++, q++)
      cout << "Nome nuotatore: " << q -> nome << endl;
      
    cout << endl << endl;   
    
    system ("PAUSE");
    return 0;
}

void inserisci (nuotatore *ptr)
{
     cout << "Nome nuotatore: "; 
     cin.sync();
     cin.getline (ptr -> nome,20);
     
     cout << "Eta': ";
     cin >> ptr -> eta;
     
     cout << "Minuti: ";
     cin >> ptr -> minuti;
     
     cout << "Secondi: ";
     cin >> ptr -> secondi;
}

4 Risposte

  • Re: Bubble sort ad una struttura con puntatori

    
    for (int i=0; i<5; i++)
        inserisci(p);
    
    Sempre alla prima cella inserisci i valori?
  • Re: Bubble sort ad una struttura con puntatori

    Non me n'ero proprio accorto. Cmq l'algoritmo con questo aggiustamento funziona e mi ordina i minuti, e volendo anche i secondi facendo la stessa cosa. La ciliegina sulla torta sarebbe scambiare e quindi ordinare anche i nomi dei nuotatori. Ho provato con la funzione strcpy della libreria string ma non mi dà i risultati giusti, ed ho provato la funzione swap ma il compilatore mi segnala un errore! Idee. Ora posto il codice completo e corretto con la segnalazione di skynet:
    
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    struct nuotatore
    {
          char nome[20];
          int eta;
          int minuti;
          int secondi;
    };
    
    void inserisci (nuotatore *ptr);
    
    int main ()
    {
        int auxm, auxs;
        nuotatore *p, *q;
        nuotatore n[5];
        p=&n[0];
        
        for (int i=0; i<5; i++, p++)
        inserisci(p);
        
        for (int i=5; i>0; i--)
        {
          p=&n[0];
          q=&n[1];
             for(int j=0; j<i; j++, p++, q++)
                      if((p -> minuti) > (q -> minuti))
                      {
                                
                           auxm=p -> minuti; //scambio i minuti
                           p -> minuti=q -> minuti;
                           q -> minuti=auxm;
                           
                           auxs=p -> secondi; // scambio i secondi
                           p -> secondi=q -> secondi;
                           q -> secondi=auxs;
                           
                           strcpy(p -> nome, q -> nome);
                      }
        }
          q=&n[0];
          cout << endl;
          for (int i=0; i<5; i++, q++)
          {
          cout << "Nome nuotatore: " << q -> nome << endl;
          cout << "Minuti: " << q -> minuti << endl;
          cout << "Secondi: " << q -> secondi << endl << endl;
          }
        cout << endl << endl;   
        
        system ("PAUSE");
        return 0;
    }
    
    void inserisci (nuotatore *ptr)
    {
         cout << "Nome nuotatore: "; 
         cin.sync();
         cin.getline (ptr -> nome,20);
         
         cout << "Eta': ";
         cin >> ptr -> eta;
         
         cout << "Minuti: ";
         cin >> ptr -> minuti;
         
         cout << "Secondi: ";
         cin >> ptr -> secondi;
    }
    
  • Re: Bubble sort ad una struttura con puntatori

    Che ne dici di procedere nella stessa maniera?
    
    char auxn[20];
    strcpy(auxn,p->nome);
    strcpy(p->nome,q->nome);
    strcpy(q->nome,auxn);
    
  • Re: Bubble sort ad una struttura con puntatori

    Grazie skynet! Gentilissimo.
Devi accedere o registrarti per scrivere nel forum
4 risposte