View Full Version : [C++] Rendere coda circolare
Salve a tutti ragazzi
vorrei capire che cosa rende circolare una pila, da quello che ho capito io la dichiarazione della classe non cambia ma cambiano le implementazioni delle funzioni che la gestiscono.
considerando una dichiarazione di una classe coda del genere
typedef int E;
//definizione della classe
class Coda{
private:
static const int NMAX=100;
int nelem;
E *coda;
int t, c;
int presenti;//per verificare gli elementi effettivamente presenti
public:
//costruttore
Coda(int n=0);
//distruttore
~Coda(){delete []coda;}
//costruttore di copia
Coda(const Coda& ) ;
//overloading operatore =
const Coda & operator=(const Coda & ) ;
void push(E);
bool pop(E& ) ;
bool top(E& ) ;
bool empty()const{if(presenti==0)return true; else return false;}
bool full()const{if(presenti==nelem)return true; else return false;}
considerando queste funzioni
void Coda::push(E e){
if ( !full()){
coda[t]=e;
t=(t+1)%nelem;//fa la divisione e prende il modulo
è questo tipo di comando che mi fa diventare la coda circolare? cioè l'operazione col modulo?
presenti++;
}
else cout<<"\ncoda piena impossibile inserire ulteriori elementi"<<endl;
}
bool Coda::pop(E& e){
if( !empty()){
e=coda[c];
c=(c+1)%nelem;
è questo tipo di comando che mi fa diventare la coda circolare? cioè l'operazione col modulo?
presenti--;
return true;
}
else{
cout<<"\ncoda vuota impossibile eliminare ulteriori elementi"<<endl;
return false;
}
}
bool Coda::top(E& e){
if( !empty()){
e=coda[c];
return true;
}
else{
cout<<"\ncoda vuota nessun elemento presente"<<endl;
return false;
}
}
sottovento
11-03-2013, 09:05
Qual e' la domanda, esattamente? Il codice sembra ok, a parte il fatto che non capisco perche' hai usato nelem al posto di NMAX, ma e' un dettaglio....
ciao sottovento :)
grazie per avermi risposto
la domanda in altre parole rispetto al titolo è: che differenza c'è a livello di codice tra una coda ed una coda circolare?
quell'istruzione commentata in rosso, rende una coda circolare, giusto?quella con il modulo?
sottovento
11-03-2013, 13:25
ciao sottovento :)
grazie per avermi risposto
la domanda in altre parole rispetto al titolo è: che differenza c'è a livello di codice tra una coda ed una coda circolare?
quell'istruzione commentata in rosso, rende una coda circolare, giusto?quella con il modulo?
In linea di massima, si: inserisci i dati nella coda all'indice t ed estrai all'indice c, sempre se e' permesso (i.e. se la coda non e' piena/vuota).
La circolarita' e' data dal fatto che all'ultimo elemento segue il primo.
Ovviamente questa struttura e' utile in una pletora di situazioni, non ultima quelle relativi alla trasmissione di dati (se ne fa un ampio uso).
La differenza fra una coda pero' potrebbe non fermarsi qui: come detto, inserisci ad un indice ed estrai da un altro. Dipende dall'implementazione, ma normalmente questo non e' necessario in una coda 'plain'; quindi puoi mettere anche questo fra le differenze :D
grazie mille per la chiarezza :D
io trovo che i libri che mi hanno suggeriti, non sono chiari, e cmq non fanno avere il quadro completo delle cose.
Che poi quando serve non ce l'hai, e quindi mi devo chiedere io le cose per semplificarmi la vita.
ciao sottovento
in tema di mancanza di quadro generale
quando si scrivono le classi ed in particolare i costruttori e le funzioni come ci si regola col punto e virgola finale? bisogna sempre metterlo
esempio
col costruttore
AUTO (): cilindrata(0), nome (0) {};
con le altre funzioni
col distruttore non serve il punto e virgola finale?
~AUTO() {delete []cilindrata; }
con una funzione qualsiasisi
void stampadati();
sottovento
12-03-2013, 05:32
Scusa il ritardo nella risposta, ma non e' colpa mia, e' solo un problema di fuso orario.
ciao sottovento
in tema di mancanza di quadro generale
quando si scrivono le classi ed in particolare i costruttori e le funzioni come ci si regola col punto e virgola finale? bisogna sempre metterlo
esempio
col costruttore
AUTO (): cilindrata(0), nome (0) {};
con le altre funzioni
Il codice non e' chiarissimo: stai dichiarando il costruttore o lo stai implementando?
In ogni caso, il punto e virgola non ci vuole.
Ti accorgerai pero' che il codice viene compilato anche se lo metti. In effetti non e' un errore, e' solo un'operazione nulla che hai inserito.
col distruttore non serve il punto e virgola finale?
~AUTO() {delete []cilindrata; }
Stessa cosa di cui sopra, non ci sono eccezioni. Ovviamente immagino ti riferisca al punto e virgola che hai messo dopo la graffa. No, non ne hai mai bisogno dopo la dichiarazione di un metodo. Qualunque esso sia
con una funzione qualsiasisi
void stampadati();
Qui stai dichiarando un prototipo di funzione, vale a dire avverti il compilatore che nel seguito del file utilizzerai la stampadati(), e gli dici com'e' fatta (i.e. non accetta parametri e non restituisce valori di sorta).
La stampadati sara' poi definita da qualche altra parte, per esempio in una libreria, in un altro file o addirittura all'interno dello stesso file in cui hai messo il prototipo di cui sopra. Il compilatore sara' in grado di valutare se l'uso che ne fai e' corretto. In caso contrario sara' in grado di produrti l'adeguato messaggio di errore.
Se lo scopo del codice che mi hai mostrato NON e' quello di dichiarare un prototipo di funzione ma, per esempio, e' l'inizio della definizione della funzione stessa, allora il punto e virgola non ci va ma dovrai aprire la graffa ;)
ciao sottovento :D
figurati
ti devo ringraziare sempre sempre :)
come sempre chiarissimo
ho sbagliato a digitare :
quando ho scritto
void stampadati();
mi riferivo ad una funzione qualsiasi all'interno del file di specifica di una classe
se il ragionamento è quello che mi hai detto per il costruttore ed il distruttore: se metto il corpo della funzione con le parentesi graffe, allora non serve il punto e virgola, mentre invece se è come quella che ho scritto allora ci vuole.
giusto?
sottovento
14-03-2013, 06:43
se il ragionamento è quello che mi hai detto per il costruttore ed il distruttore: se metto il corpo della funzione con le parentesi graffe, allora non serve il punto e virgola, mentre invece se è come quella che ho scritto allora ci vuole.
giusto?
Non si sarebbe potuto dire meglio!! Giusto!
grazie mille ;) ;) ;)
sto imparando e mettendo a posto tante cose
grazie
ciao sottovento ti posso chiedere un'ulteriore cosa? e con questa mi fermo perchè c'è già troppo da imparare.
Ho visto nel libro che nella stesura della classe Pila realizzata con array statico, nel parte private mette il costruttore di copia e l'overload dell'operatore = , entrambi con corpo vuoto.
Poi quando va a graficare il codice, non ce lo mette.
A questo ti chiedo: ce li devo mettere ugualmente? visto che il corpo delle due funzioni è vuoto?
e poi nella realizzazione della pila dinamica, credo che ce lo devo mettere sia il costruttore di copia che l'overload dell'operatore =, ma in questo ccaso devo esplicitarlo il corpo delle due funzioni?
il problema dei problemi è se ci vuole non so come devo realizzarlo
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.