Valori positivi coda

di il
7 risposte

Valori positivi coda

Salve, ho realizzato questo codice dove vado ad inserire in una coda solo i valori positivi presenti in un'altra coda.
Perchè se la dichiarazione "Coda<int> P(dim);" si trova fuori dal while mi stampa questo output sbagliato: 3 3 3 3, mentre se la inserisco all'interno del while ottengo l'output corretto: 3 8 9 3 ?
Grazie.
testcoda.cpp
#include <iostream>
#include "codavt.h"

using namespace std;

int main(){
  int dim = 6;
  Coda<int> C(dim);

  C.inCoda(3);
  C.inCoda(8);
  C.inCoda(-36);
  C.inCoda(9);
  C.inCoda(0);
  C.inCoda(3);

  //Coda<int> P(dim); <---così non funziona
  int e;
  while(!C.codaVuota()){
  	  Coda<int> P(dim);  <---così funziona
	  e = C.leggiCoda();
	  if (e > 0){
		  P.inCoda(e);
	  	  cout << P.leggiCoda();
	  }
	  C.fuoriCoda();
  }

  system("pause");
  return 0;
}
codavt.h
#ifndef _CODAVT_
#define _CODAVT_

template < class tipoelem >
class Coda {

public:

  Coda(int n){
    maxlung = n;
    creaCoda();
  }

  ~Coda(){delete[] elementi;}

  void creaCoda(){
    elementi = new tipoelem[maxlung];
    testa = 0;
    lung = 0;
  }

  bool codaVuota(){
    return (lung == 0);
  }

  tipoelem leggiCoda(){
    if (!codaVuota())
      return (elementi[testa]);
  }

  void fuoriCoda(){
    if (!codaVuota()){
      testa = (testa + 1) % maxlung;
      lung--;
    }
  }

  void inCoda(tipoelem a){
    if (lung != maxlung){
      elementi[(testa+lung) % maxlung] = a;
      lung++;
    }
  }

 private:
  tipoelem *elementi;
  int testa, lung, maxlung;
};

#endif //CODAVT_

7 Risposte

  • Re: Valori positivi coda

    Se inserisci la linea all'interno del ciclo avrai "tante" code fatte tutte da un elemento in testa per ogni coda (che vedi tutti).

    Ma la linea

    Coda<int> C(dim);

    deve stare fuori dal ciclo.

    La leggiCoda restituisce sempre la testa della coda e finché in testa c'è il valore 3, non può che mostrarti quello ... rifletti.
  • Re: Valori positivi coda

    Nel ciclo while c'è la funzione C.fuoriCoda() che dovrebbe assegnare a testa il nuovo valore e quindi il valore in testa non dovrebbe più essere 3..
  • Re: Valori positivi coda

    Che c'entra P.leggiCoda() con C.fuoriCoda()?

    Forse dovresti fare
      tipoelem leggiCoda(){
        if (!codaVuota())
          return (elementi[lung - 1]);
        else
          return 0;
      }
  • Re: Valori positivi coda

    C è la coda di partenza dove ci sono tutti i valori, mentre P è la coda dove voglio inserire tutti i numeri positivi.
    Con cout << P.leggiCoda(); stampo i valori positivi man mano che vengono trovati all'interno di C.
    C.fuoriCoda() invece rinnova il valore di testa.
  • Re: Valori positivi coda

    Ma no ... rifletti....

    C è una coda e P un'altra.

    Nella coda P tu aggiungi sempre un nuovo valore ma quello di testa rimane lo stesso! Se restituisci sempre quello di testa è ovvio che vedi sempre quello!
  • Re: Valori positivi coda

    Ho realizzato le funzioni estraiPositivi e stampaCoda e sembrano funzionare. Che ve ne pare?
    template < class tipoelem >
    void Coda< tipoelem >::estraiPositivi(Coda< tipoelem >& C){
    	  Coda< tipoelem > CP(C.maxlung);
    	  int e;
    
    	  while(!C.codaVuota()){
    		  e = C.leggiCoda();
    		  if (e > 0){
    			  inCoda(e);
    		  }
    		  CP.inCoda(e);
    		  C.fuoriCoda();
    	  }
    
    	  while(!CP.codaVuota()){
    		  e = CP.leggiCoda();
    		  C.inCoda(e);
    		  CP.fuoriCoda();
    	  }
    	  CP.~Coda();
    }
    
    template <class tipoelem >
    void Coda< tipoelem >::stampaCoda(){
    	Coda< tipoelem > temp(maxlung);
    
    	while(!codaVuota()){
    		std::cout<< leggiCoda();
    		temp.inCoda(leggiCoda());
    		fuoriCoda();
    	}
    
    	while(!temp.codaVuota()){
    		inCoda(temp.leggiCoda());
    		temp.fuoriCoda();
    	}
    	temp.~Coda();
    }
  • Re: Valori positivi coda

    Se è per motivi didattici, cerca come viene fatta la queue (coda FIFO) in C++ che è nella standard template library
    Questo il primo esempio trovato su google
    https://gist.github.com/sudheesh001/703787
    Come vedi viene fatta in modo da non allocare memoria quando non serve.
    Parti da quella e poi aggiungi quello che vuoi. Ovviamente più avanti ti spingi più la tua classe assomiglierà a un vettore dinamico più che a una coda
Devi accedere o registrarti per scrivere nel forum
7 risposte