Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [c++] classe contenente array di record

    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:

    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!
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  2. #2
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    Argh!!! Bacchettata sulle nocche per te!!!

    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.

    ChReAn
    -------------------

    Slackware 9.1 powered

  3. #3
    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..
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  4. #4
    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";
    }
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  5. #5
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    Originariamente inviato da elevation
    guarda che c'è il typedef:
    typedef Studente* Record;[/B]
    Sì, scusa, me ne ero dimenticato.
    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).
    ChReAn
    -------------------

    Slackware 9.1 powered

  6. #6
    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:

    codice:
    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!
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  7. #7
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    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.
    ChReAn
    -------------------

    Slackware 9.1 powered

  8. #8
    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...
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  9. #9
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    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:rdina(){
    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
    -------------------

    Slackware 9.1 powered

  10. #10
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    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... ).

    ChReAn
    -------------------

    Slackware 9.1 powered

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.