Ordinamento array di record

di Anonimizzato8637 il
6 risposte
Salve a tutti. Ho un problemino con la funzione ordina di questo programma che mi dovrebbe ordinare in base al cognome un array di record. L'algoritmo richiesto per l'ordinamento è quello per inserzione del quale il codice l'ho preso dal libro. L'inserimento e la stampa va alla grande, l'ordinamento no. Grazie per gli eventuali aiuti...posto il codice:

File ElencoPrenotati.h

#ifndef ELENCOPRENOTATI_H
#define ELENCOPRENOTATI_H

using namespace std;

struct Studente
{
       string nome;
       string cognome;
       string matricola;
};

class ElencoPrenotati
{
      public:
              ElencoPrenotati (int);
              ~ElencoPrenotati ();
              bool insert (Studente);
              void ordina ();
              void stampa ();
      private:
              int N;
              Studente *stu;
};

#endif
File ElencoPrenotati.cpp

#include <iostream>
#include <string>
#include <cstdlib>
#include "ElencoPrenotati.h"

using namespace std;

ElencoPrenotati :: ElencoPrenotati (int n) : N(n)
{ stu = new Studente[N]; }

ElencoPrenotati :: ~ElencoPrenotati ()
{ delete [] stu; }

bool ElencoPrenotati :: insert (Studente e)
{        
     for (int i=0; i<N; i++)
     {
         if (stu[i].nome.length() == 0)
         {
             stu[i].nome = e.nome;
             stu[i].cognome = e.cognome;
             stu[i].matricola = e.matricola;
             return true;
         }
     }
}

void ElencoPrenotati :: ordina ()
{
     int i, j;
     
     for (i=1; i<N; i++)
     {
         j=i;
         
         while (j>0 && stu[i].cognome[0] < stu[j-1].cognome[0])
         {
               stu[j] = stu[j-1];
               j--;
         }
         stu[j] = stu[i];
     }
}

void ElencoPrenotati :: stampa ()
{
     for (int i=0; i<N; i++)
     {
         if (stu[i].nome.length() != 0)
         {
             cout << "Nome: " << stu[i].nome << endl;
             cout << "Cognome: " << stu[i].cognome << endl;
             cout << "Matricola: " << stu[i].matricola << endl << endl;
         }
     }
}
File main.cpp

#include <iostream>
#include <string>
#include <cstdlib>
#include "ElencoPrenotati.h"

using namespace std;


int main()
{
          Studente r;
          ElencoPrenotati elenco(10);
          r.cognome="Esposito"; r.nome="Francesco"; r.matricola="36596";
          elenco.insert(r);
          r.cognome="Paccado"; r.nome="Maurizio"; r.matricola="36296";
          elenco.insert(r);
          r.cognome="Zamboni"; r.nome="Stefano"; r.matricola="36291";
          elenco.insert(r);
          elenco.stampa();
          r.cognome="Accardo"; r.nome="Domenico"; r.matricola="36293";
          elenco.insert(r);
          elenco.stampa();
          elenco.ordina();
          elenco.stampa();
          
          cout << endl << endl;
          system ("PAUSE");
          return 0;
}

6 Risposte

  • Qui
    
    if(stu[i].nome.length() == 0)
    
    basta questo
    
    if(stu[i].nome.empty())
    
    il return true lo metti fuori dal for non dentro.

    Edit: Ho sbagliato io. Va bene lì dov'è.
  • Non ti conviene definire l'operatore assegnazione? Così hai risolto sia con l'ordinamento che con l'inserimento.
  • Lo avevo pensato ma mi devo attenere alla traccia di esame, che mi dice esplicitamente di definire una funzione membro void ordina() che mi ordini sul campo cognome i vari studenti, tramite algoritmo per inserzione.
  • Io nella classe ElencoPrenotati inserirei anche una varibile che mi tiene conto del numero dei studenti inseriti. Così non hai bisogno del for e tutto si trasforma in:
    
    struct Studente
    {
           string nome;
           string cognome;
           string matricola;
           
           Studente & operator= (const Studente & altro)
           {
                 if(this != &altro)
                 {
                       nome = altro.nome;
                       cognome = altro.cognome;
                       matricola = altro.matricola;
                }
                return *this;
           };
    };
    
    class ElencoPrenotati
    {
          public:
                  ElencoPrenotati (int);
                  ~ElencoPrenotati ();
                  bool insert (Studente);
                  void ordina ();
                  void stampa ();
          private:
                  int N;
                  int inseriti;
                  Studente *stu;
    };
    
    .....
    ElencoPrenotati :: ElencoPrenotati (int n) : N(n) , inseriti(0)
    { stu = new Studente[N]; }
    
    ............
    
    bool ElencoPrenotati :: insert (Studente e)
    {       
         if(inseriti < N)
         {
             stu[inseriti] = e;
             inseriti++;
             return true;
         }
         return false;
    }
    
    Anche nell'ordinamento dovrebbe funzionarti tutto senza cambiare una virgola (sempre se la funzione è OK).
  • Funziona come funzionava il mio al primo post. I risultati sono gli stessi. Il problema come avevo detto è la funzione ordina (che ocntinua a non funzionare) le altre due sono fatte bene visto che il risultato con la ridefinizione o senza è lo stesso.
  • L'insertion sort è così
    
    insertionSort(array A)
         for i ? 1 to length[A]-1 do
            value ? A[i]
            j ? i-1
            while j >= 0 and A[j] > value do
                A[j + 1] ? A[j]
                j ? j-1
            A[j+1] ? value
    
    cambia la fua funzione così che rispecchia l'algoritmo.Ci sono un paio di righe da cambiare.
Devi accedere o registrarti per scrivere nel forum
6 risposte