Esercizio lieste e OOP con c++

di il
7 risposte

Esercizio lieste e OOP con c++

Salve a tutti. Spero che qualcuno mi possa chiarire tutto, anche perchè non so più dove sbattere la testa . Ho il seguente esercizio:
" Siano date due classi per la gestione di un ente pubblico . Le classi sono: 1) Settore : nome , numero,ecc 2) classe Ufficio derivata pubblica da Settore con i seguenti dati: nome ufficio,numero impiegati ,metodi di accesso ai dati,ecc. (Parte che non ho capito) "Sviluppare un main in cui vi sia un'opportuna struttura dati Ente ( lista) degli elementi trattati che contiene tutte le informazioni sui relativi settori e uffici . Si organizzi un menu che : 1) permetta inserimento dati settore e ufficio ; 2) Visualizza uffici,il relativo settore ..bla bla.
Ora, so di creare queste due classi ; ma non so come collegare la lista a queste classi! So creare una lista ,ma non ho idea di come inserire dati provenienti dalle classi E' fattibile ,anzi , ha senso, considerare le due classi Settore e Ufficio come nodi? Il fatto è che la struttura deve unire i dati di entrambi le classi,quindi dovrei creare ogni nodo con tutte le informazioni delle due classi..ma come si fa?
EDIT:
Ho provato a farlo, non so se è la maniera più corretta:
//
// main.cpp

#include <iostream>
using namespace std;


/*struct Nodo { // quello che volevo aggiungere all'inizio solo che non l'ho incluso . Mi conveniva usare questo ? Solo che così facendo, non aveva senso dichiarare tutte quelle variabili nelle due classi ( visto che poi li avrei dovuto copiare qui )

int numReparti;
string Nome;
int numImpiegati;
int numPratiche;

Nodo * succ;



};*/

class Settore {

public:
int numReparti;
string codSector;

Settore (){
numReparti = 0;
codSector ="";
}
void pova();
};

void Settore::pova() {

}
class Ufficio: public Settore
{
public:

string Nome;
int numImpiegati;
int numPratiche;


Ufficio*head;
Ufficio*succ;

Ufficio() {

head = NULL;
Nome ="";
numImpiegati=0 ,numPratiche =0;
}


void InseriscidatisuLista(string sector,int ni , int numpr,string uff);
void visualizzaUfficiConCondizione();
void visualizzaUfficioPerSettore(string Settore);


};

void Ufficio::visualizzaUfficiConCondizione() {

if (head==NULL) {
cout <<"lista vuota";

}else
{
Ufficio*alias = head;
cout << "-----Funzione pratiche assegnate----"<< endl ;

while (alias!=NULL ) {

if ((alias->numPratiche)*3 >numImpiegati) {

cout <<"Settore: " << alias->Nome<<"| | Ufficio: " << alias->Nome << endl ;

}
alias = alias->succ;
}
}

}
void Ufficio::visualizzaUfficioPerSettore(string Settore) {

if (head==NULL) {
cout <<"lista vuota";

}else
{
Ufficio*alias = head;
cout << "-----Funzione visualizza ufficio perSettore----"<< endl ;

while (alias!=NULL ) {

if (alias->codSector==Settore) {

cout <<"Ufficio: " << alias->Nome << endl ;


}
alias = alias->succ;
}
}

}
void Ufficio::InseriscidatisuLista(string sector,int ni , int numpr,string uff){


if (head==NULL) {


this->head= new Ufficio;
this->head->codSector = sector;
this->head->numImpiegati = ni;
this->head->numPratiche = numpr;
this->head->Nome = uff;


}else

{

Ufficio* alias = new Ufficio;
alias->codSector = sector;
alias->numImpiegati = ni;
alias->numPratiche = numpr;
alias->Nome = uff;

alias->succ = head;
head = alias;

}

}

int main(int argc, const char * argv[]) {

Ufficio uff ;

uff.InseriscidatisuLista("B",44,22,"02");
uff.InseriscidatisuLista("A",44,22,"01");
uff.InseriscidatisuLista("A",434,22,"023");
uff.InseriscidatisuLista("B",443,2423,"12");
uff.InseriscidatisuLista("A",44,22,"02");
uff.InseriscidatisuLista("D",44,223,"21");
uff.InseriscidatisuLista("A",434,224,"123");
uff.InseriscidatisuLista("A",443,22,"1692");

uff.visualizzaUfficioPerSettore("A");
uff.visualizzaUfficiConCondizione();

return 0;
}

7 Risposte

  • Re: Esercizio lieste e OOP con c++

    Ciao, non sono sicuro di aver pienamente capito l'esercizio, ma credo che la "struttura dati Ente" sia realizzabile effettivamente come struttura, contenente l'Ufficio e il Settore:
    
    
    class Ente
    {
    	Settore settore;
    	Uffici uffici[n];
    	Ente *next;
    };
    
    
    Per accedere ai dati del settore puoi usare l'operatore '.' (es: foo.settore.numReparti ), e così anche per gli uffici...
    Spero sia d'aiuto in qualche modo

    (La prossima volta che scrivi un codice, se non altro per dare una mano a chi potrebbe aiutarti, ricorda di scrivere il codice fra "[ code]" e "[/code ]" e di identare le righe per migliorare la leggibilità )
  • Re: Esercizio lieste e OOP con c++

    Ciao,grazie mille per la risposta. Si ,avevo pensato di usare una struttura simile, ma avrei riscritto tutte le variabili (il che non aveva senso), non ci pensavo a scrivere le variabili che mi permettono di accedere al contenuto della classe; Rifarò tutto in questo modo ! Per la quetione codice, è la prima volta che uso il forum , non ci avrò neanche fatto caso ,sorry >.< Grazie ancora
  • Re: Esercizio lieste e OOP con c++

    Ciao , ho rivisto il tutto . Ho solo una perplessità: ogni nodo della lista contiene la struttura "Ente" ; essendo una lista posso eliminare ogni ente ,ovvero ogni "settore" e modificare ogni elemento (settore e uffici); tuttavia,se volessi Inserire nuovi uffici di un settore già presente? Oppure eliminare alcuni degli uffici relativi a un settore = nodo ? . Come è sstata dichiarata la struttura, tutti gli oggetti "uffici" sono in un array che posso creare dinamicamente,ma nel momento in cui decido di eliminare un elemento o aggiungerne un altro come dovrei comportarmi? Creare un'altra lista dedicata a queste operazioni? L'unica difficoltà sta proprio nel fatto che , al contrario dell'attributo "settore " che è unico per ogni nodo, "uffici" sono tanti oggetti presenti in un nodo ;
  • Re: Esercizio lieste e OOP con c++

    Ciao!
    Ho posto "uffici" come vettore poiché dal testo avevo supposto che il numero fosse noto a priori e costante (non parla di inserire nuovi uffici, da qui la mia interpretazione); se invece devi far si che il numero di uffici in ogni ente sia variabile, allora puoi modificare la classe Ufficio affinché anch'essa sia dotata di un puntatore a Ufficio, così da poter creare una lista di uffici in ogni Ente
  • Re: Esercizio lieste e OOP con c++

    E quindi in ente troverò un puntatore che mi permette di accedere ,fra le altre cose , ad un eventuale puntatore "testa" presente nella classe ufficio giusto? Ultima cosa: in questo caso se entre mi rappresenta il nodo della lista generale , quest'ultima la inizializzo dal main direttamente? MI spiego meglio , mi conviene creare un apposita classe "lista o simile" che gestisce il tutto e poi la richiamo nel main ,oppure creo ,nel mai, un puntatore head della struttra e da lì mi creo normalmente tutti i vari nodi? Grazie ancora per la disponibilità!
  • Re: Esercizio lieste e OOP con c++

    Quel "Ufficio *head;" che hai messo... Non sono così convinto che serva.
    Mi spiego:
    Modifichiamo la classe Ente creata pochi post addietro
    class Ente
    {
       public:
       Settore settore;
       Ufficio *uffici;
       Ente *next;
    };
    Dopodiché, creiamo una classe Uffici che contenga un puntatore *next a uffici:
    class Ufficio
    {
        //Mettiamo le varie funzioni che hai scritto in precedenza...
        Ufficio *next;
    };
    Nel main, poi, per scorrere le liste mi basta creare due puntatori (a Ufficio e a Ente) che puntano al primo elemento della lista:
    int main(int args, const char* argv[])
    {
      Ente *lista; //Primo elemento della lista, eventualmente con un costruttore per inizializzare la lista di uffici e settare *next = nullptr
      Ente *ente = lista; //Puntatore al primo elemento della lista
      Ufficio *uff = (ente->uffici); //Puntatore al primo elemento 'ufficio' dell'ente puntato
      //Per passare all'ufficio successivo nell'ente:
      uff = uff->next;
      //Per passare all'elemento successivo della lista di enti:
      ente = ente->next;
      uff = ente->uffici;
      //Per ri-puntare al primo elemento, senza bisogno di head (se era questo il suo scopo, in caso contrario mi sa che non ho capito cosa fosse D:  ):
      ente = lista;
      ...
      ...
      return 0;
    }
    Può andare o ho dimenticato qualcosa?
  • Re: Esercizio lieste e OOP con c++

    Head in sostanza è uguale a " lista" . Per il resto effettivamente così è molto meglio..Spero di non dover fare altre domande ahah grazie mille per il tuo aiuto appena posso implemento tutto!
Devi accedere o registrarti per scrivere nel forum
7 risposte