Ordinamento array di record

di il
6 risposte

Ordinamento array di record

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

  • Re: Ordinamento array di record

    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'è.
  • Re: Ordinamento array di record

    Non ti conviene definire l'operatore assegnazione? Così hai risolto sia con l'ordinamento che con l'inserimento.
  • Re: Ordinamento array di record

    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.
  • Re: Ordinamento array di record

    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).
  • Re: Ordinamento array di record

    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.
  • Re: Ordinamento array di record

    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