PDA

Visualizza la versione completa : [c++] classe contenente array di record


elevation
15-07-2003, 09:49
ciao a tutti,
devo implementare una classe "ElencoPrenotati" che deve contenere un array
contenente N record. La dimensione dell'array (allocato dinamicamente) viene
fornita come parametro al costruttore della classe. I record sono costituiti
da una struttura "Studente" che ha 3 campi (nome, cognome, matricola) di
tipo string. Devo implementare le seguenti funzioni:
-inserimento di uno studente il cui prototipo deve essere bool
insert(Studente e); //restituisce true se l'inserimento va abuon fine.
-stampa a video della rubrica, il prototipo deve essere void stampa();

la traccia dell'esercizio fornisce anche il main. Purtroppo ricevo questi
errori:
9 elencoprenotati.cpp `array' undeclared (first use this function)
l'errore è ovvio (l'array in insert() non è dichiarato) ma come porvi
rimedio???
ecco il codice:



**MAIN.CPP
#include <iostream>
#include <stdio.h>
#include "ElencoPrenotati.h"
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();
system("Pause");
return 0;
}

***ElencoPrenotati.h

#ifndef _ELENCOPRENOTATI_H
#define ELENCOPRENOTATI_H
#include <iostream>
#include <string>
struct Studente {
string nome;
string cognome;
string matricola;
};

typedef Studente* Record;

class ElencoPrenotati {
private:
int last; //punta all'ultimo elemento inserito nell'array
public:
ElencoPrenotati(int n);
~ElencoPrenotati();
bool insert(Studente &);
void stampa();
};
#endif

***ElencoPrenotati.cpp

#include "ElencoPrenotati.h"

ElencoPrenotati::ElencoPrenotati(int n){
Record array;
array=new Studente[n];
}

bool ElencoPrenotati::insert(Studente & r){
array[last].nome=r.nome;
array[last].cognome=r.cognome;
array[last].matricola=r.matricola;
last=last+1;
return true;
}

void ElencoPrenotati::stampa(){
for(int I=0; I<last; I++){
cout<<"cognome:"<< array[I].cognome << endl;
cout<<"nome:"<< array[I].nome << endl;
cout<<"matricola:"<< array[I].matricola << endl;
cout<<"************************" << endl;
}
}

ElencoPrenotati::~ElencoPrenotati(){
for(int i=0; i<last; i++){
delete [] array;
}
cout<<"array deallocato";
}

ciao!

ChReAn
15-07-2003, 13:05
Argh!!! Bacchettata sulle nocche per te!!! :nonono:

Devi dichiarare l'array nei membri privati della classe, altrimenti sarà visibile solo nello scope del costruttore (cosa assolutamente inutile in questo caso).
Inoltre dichiara così un array:

Record *array;

e non così:

Record array;

QUESTA E' LA DICHIARAZIONE DI UNA VARIABILE, non di un array.

:ciauz:

elevation
15-07-2003, 13:46
guarda che c'è il typedef:
typedef Studente* Record;

ho provato a dichiararla come dici ma mi da il seguente errore:
5 elencoprenotati.cpp
assignment to `Studente **' from `Studente *'

quanto alla dichiarazione nel private hai ragione, così non mi segnala errori ma il programma va in crash durante l'esecuzione..:(

elevation
15-07-2003, 14:01
ora funziona! avevo scordato di inizializzare last=0 anche se va ancora in crash quando dopo il system("pause") premo invio...

#include "ElencoPrenotati.h"

ElencoPrenotati::ElencoPrenotati(int n){
last=0;
N=n;
array=new Studente[n];

}

bool ElencoPrenotati::insert(Studente & r){
if (last<N){
array[last].nome=r.nome;
array[last].cognome=r.cognome;
array[last].matricola=r.matricola;
last=last+1;
return true;
} else return cout<<"errore";
}

void ElencoPrenotati::stampa(){
for(int I=0; I<last; I++){
cout<<"cognome:"<< array[I].cognome << endl;
cout<<"nome:"<< array[I].nome << endl;
cout<<"matricola:"<< array[I].matricola << endl;
cout<<"************************" << endl;
}
}

ElencoPrenotati::~ElencoPrenotati(){
for(int i=0; i<last; i++){
delete [] array;
}
cout<<"array deallocato";
}

ChReAn
15-07-2003, 14:13
Originariamente inviato da elevation
guarda che c'è il typedef:
typedef Studente* Record;[/B]

Sì, scusa, me ne ero dimenticato. :fagiano:
Di solito cmq se usi un typedef è meglio fare in modo che il nome del nuovo tipo chiarisca qualora si tratti di un puntatore (ad esempio pStudente o Studente_Pointer). :)

elevation
15-07-2003, 14:25
ho risolto anche il problema del crash alla chiusura bastava fare

"delete[] array" nel costruttore. Ora però ho un altro problema:
sto cercando di implementare una funzione di ordinamento per inserzione in base al campo cognome ma purtroppo va in crash pur non dando errori, ecco la funzione:



void ElencoPrenotati::ordina(){
int i;
int j;
bool found;
Studente elem;
for(i=0;i<N;i++){ //N contiene il numero di elementi inseriti
elem=array[i];
j=i;
found=false;
while((j>=1) && (!found)){
if (array[j].cognome>=array[j+1].cognome)
//(strcmp(array[j].cognome,array[j+1].cognome)<=0)
found=true;
else {
array[j]=array[j-1];
j--;
}
}
array[j]=elem;
}
}


ciao!

ChReAn
15-07-2003, 15:01
Ci sono un po' di errori concettuali nella funzione di ordinamento, ti consiglio di guardare uno dei tanti articoli o documenti sui vari tipi di ordinamento, o in alternativa di fare una ricerca su questo stesso forum. :)

elevation
15-07-2003, 15:22
Originariamente inviato da ChReAn
Ci sono un po' di errori concettuali nella funzione di ordinamento, ti consiglio di guardare uno dei tanti articoli o documenti sui vari tipi di ordinamento, o in alternativa di fare una ricerca su questo stesso forum. :)

a dire il vero l'ho copiata dal libro...:(

ChReAn
15-07-2003, 15:31
Originariamente inviato da elevation
a dire il vero l'ho copiata dal libro...:(

Ah vabbe'... Mi chiedo diverse cose allora:
1) perchè elem=array[j] viene eseguito comunque a ogni iterazione: sarebbe meglio eseguirlo solo quando c'è necessità di scambiare gli elementi confrontati
2) perchè partire da j=1 e decrementarla while (j >= 1). In pratica:

- assegna 1 a j
- mentre j è > o = a 1, decrementala.

Secondo me dovrebbe essere funzionale scritta nel seguente modo:

void ElencoPrenotati::ordina(){
int i;
int j;
Studente elem;
for(i=0;i<N;i++){ //N contiene il numero di elementi inseriti
for (j = i + 1; j < N; j++){
if (strcmp(array[j].cognome,array[i].cognome)<0)
elem = array[i];
array[i] = array[j];
array[j] = elem;
}
}
}

ChReAn
15-07-2003, 15:38
Confermo. Con rispetto parlando, mi sa che hai copiato male la funzione dal libro (se ha sbagliato il libro è più grave), infatti ho provato a compilarla su un array di interi e non funziona, come prevedevo (chissà mai - mi ero detto - che sia io a non capire... ).

:fagiano:

Loading