Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-01-2004, 14:58   #1
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
[C++]Albero

Codice:
struct STree
{
	int item;
	STree *l, *r;
	STree(int Item, STree *L, STree *R)
	{
	  item = Item;
		l = L;
		r = R;
	}
};

typedef STree *node;

class CTree
{
	private:
		node tree;
		int rad;
	public:
 		CTree();
 		CTree(int n);
    ~CTree();	
    void add(int n);
    int serch(int n);
};

CTree::CTree()
{
	rad = 0;
	tree = new STree(0, NULL, NULL);
}
// init tree
CTree::CTree(int n)
{
	rad = n;
	tree = new STree(n, NULL, NULL);
}

CTree::~CTree()
{
}

void CTree::add(int n)
{
	node p = tree;
	while( (p->l != NULL) && (p->r != NULL) )
	{
		if(n > rad)
		{
			p = p->l;
		}
    else
    {
    	p = p->r;
    }
	}
	if(p->l == NULL)
	{
		p->r->item = n;
	}
	else if(p->r == NULL)
	{
		p->l->item = n;
	}
}

int CTree::serch(int n)
{
	node p = tree;
	while( (p->l != NULL) && (p->r != NULL) && (p->item != n) )
	{
	  if(n > rad)
		{
			p = p->l;
		}
    else
    {
    	p = p->r;
    }
  }
  return p->item;
}
Dove sbaglio??



Tnk 100000000000
__________________
Gnu/Linux User

Ultima modifica di Luc@s : 15-01-2004 alle 15:02.
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2004, 15:19   #2
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Codice:
#include "STree.hpp"

class CTree
{
	private:
		node tree;
		int rad;
	public:
 		CTree();
 		CTree(int n);
    ~CTree();	
    void add(int n);
    int serch(int n);
};

CTree::CTree()
{
	rad = 0;
	tree = new STree(0, NULL, NULL);
}
// init tree
CTree::CTree(int n)
{
	rad = n;
	tree = new STree(n, NULL, NULL);
}

CTree::~CTree()
{
}

void CTree::add(int n)
{
	node p = tree;
	while( (p->l != NULL) && (p->r != NULL) )
	{
		if(n > rad)
		{
			p = p->l;
		}
    else
    {
    	p = p->r;
    }
	}
	if(p->l == NULL)
	{
	  // ERRORE QUI
		p->r = new STree(n, NULL, NULL);
	}
	else if(p->r == NULL)
	{
	  // QUI
		p->l = new STree(n, NULL, NULL);
	}
}

int CTree::serch(int n)
{
	node p = tree;
	while( (p->l != NULL) && (p->r != NULL) && (p->item != n) )
	{
	  if(n > rad)
		{
			p = p->l;
		}
    else
    {
    	p = p->r;
    }
  }
  return p->item;
}
Risolto
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2004, 15:39   #3
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Codice:
#include "STree.hpp"
#define DEBUG

class CTree
{
 private:
  node tree;
  int rad;
 public:
   CTree();
   CTree(int n);
    ~CTree(); 
    void add(int n);
    int serch(int n);
};

CTree::CTree()
{
 rad = 0;
 tree = new STree(0, NULL, NULL);
}
// init tree
CTree::CTree(int n)
{
 rad = n;
 tree = new STree(n, NULL, NULL);
}

CTree::~CTree()
{
}

void CTree::add(int n)
{
 node p = tree;
 while( (p->l != NULL) && (p->r != NULL) )
 {
   // SE è MINORE VA A SINISTRA
  if(n > rad)
  {
   p = p->l;
  }
  // SE è MAGGIORE VA A DESTRA
    else if(n < rad)
    {
     p = p->r;
    }
 }
  p->r = new STree(n, NULL, NULL);
    #ifdef DEBUG
    #include <iostream>
     std::cout << "Stato elemento => " << p->item << "\n";
    std::cout << "Stato l =>" << ((p->l == NULL) ? " NODO ESTERNO" : " NODO INTERNO") << "\n";
       std::cout << "Stato r =>" << ((p->r == NULL) ? " NODO ESTERNO" : " NODO INTERNO") << "\n";
    #endif
}
// NON VA
int CTree::serch(int n)
{
 node p = tree;
 while( (p->l != NULL) && (p->r != NULL) && (p->item != n) )
 {
   if(n > rad)
  {
   p = p->l;
  }
    else if(n < rad)
    {
     p = p->r;
    }
    #ifdef DEBUG
    #include <iostream>
   std::cout << "Siamo all ' elemento " << p->item << "\n";
    #endif
  }
  return p->item;
}
Cosi me li mette sempre su r..............come mai???
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2004, 17:10   #4
verloc
Senior Member
 
L'Avatar di verloc
 
Iscritto dal: Jan 2000
Messaggi: 551
per non saper ne leggere e ne scrivere
(2 secondi dedicati alla lettura perché non devi postare l'intera classe se vuoi che qualcuno ti aiuti)

e se è UGUALE?
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2004, 17:14   #5
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Quote:
Originariamente inviato da verloc
per non saper ne leggere e ne scrivere
(2 secondi dedicati alla lettura perché non devi postare l'intera classe se vuoi che qualcuno ti aiuti)

e se è UGUALE?
cominciamo a partire dal fatto che nn ci saranno duplicati
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2004, 17:24   #6
verloc
Senior Member
 
L'Avatar di verloc
 
Iscritto dal: Jan 2000
Messaggi: 551
ammempar che come va va lo metti sempre in r

(mannaggie a capa tua!)

...

p->r = new STree(n, NULL, NULL);


ps.search non serch
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2004, 18:37   #7
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Codice:
//////////////////////////////////////////////
//                  CTree.hpp               //
//////////////////////////////////////////////
#include "STree.hpp"

class CTree
{
	private:
		node tree;
		int rad;
	public:
 		CTree();
 		CTree(int n);
    ~CTree();	
    void add(int n);
    int search(int n);
};

CTree::CTree()
{
	rad = 0;
	tree = new STree(0, NULL, NULL);
}
// init tree
CTree::CTree(int n)
{
	rad = n;
	tree = new STree(n, NULL, NULL);
}

CTree::~CTree()
{
}

void CTree::add(int n)
{
	node p = tree;
	while( (p->L() != NULL) && (p->R() != NULL) )
	{
	  // SE è MINORE VA A SINISTRA
		if(n < rad)
		{
			p = p->L();
     #ifdef DEBUG
	      #include <iostream>
		      std::cout << "Stato elemento => " << p->item << "\n";
      #endif
		}else if(n > rad) // SE è MAGGIORE VA A DESTRA
    {
    	p = p->R();
	    #ifdef DEBUG
	      #include <iostream>
		      std::cout << "Stato elemento => " << p->item << "\n";
      #endif
    }
	}
		if(p->R() == NULL)
		{
			p->r = new STree(n, NULL, NULL);
	    #ifdef DEBUG
			  #include <iostream>
				 std::cout << "Stato l =>" << ((p->L() == NULL) ? " NODO ESTERNO" : " NODO INTERNO") << "\n";
	       std::cout << "Stato r =>" << ((p->R() == NULL) ? " NODO ESTERNO" : " NODO INTERNO") << "\n";
	    #endif
    }else if(p->L() == NULL)
    {
	   	p->l = new STree(n, NULL, NULL);
	    #ifdef DEBUG
			  #include <iostream>
				 std::cout << "Stato l =>" << ((p->L() == NULL) ? " NODO ESTERNO" : " NODO INTERNO") << "\n";
	       std::cout << "Stato r =>" << ((p->R() == NULL) ? " NODO ESTERNO" : " NODO INTERNO") << "\n";
	    #endif
    }
}
// TODO:
// da Migliorare
int CTree::search(int n)
{
	node p = tree;
	while( (p->Empty() != true) && (p->item != n) )
	{
	  if(n < rad)
		{
			p = p->L();
		}
    else if(n > rad)
    {
    	p = p->R();
    }
    #ifdef DEBUG_C
		  #include <iostream>
			std::cout << "Siamo all ' elemento " << p->Item() << "\n";
    #endif
  }
  return (p->Item());
}
Cosi nn va lo stesso
__________________
Gnu/Linux User

Ultima modifica di Luc@s : 15-01-2004 alle 18:49.
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2004, 22:41   #8
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Primo errore che ho notato:
Codice:
CTree::CTree()
{
	rad = 0;
	tree = new STree(0, NULL, NULL);
}

CTree::CTree(int n)
{
	rad = n;
	tree = new STree(n, NULL, NULL);
}
con questo codice, che differenza c'e' tra un albero vuoto e uno che contiene solo lo zero ? O meglio: che differenza c'e' tra un albero costruito con
Codice:
CTree x(0);
e uno costruito
Codice:
CTree x;
x.add(0);
(a rigore dovrebbero essere uguali, o no ? )
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2004, 22:50   #9
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Seconda osservazione, di tipo stilistico:
Se vuoi che gli altri riescano a leggere il tuo codice
( e vuoi riuscirci tu dopo una settimana che l'hai scritto )
devi usare una certa coerenza nella stesura.
Se decici che le classi/strutture cominciano con le maiscole, fallo sempre, altrimenti poi uno si trova un node che non sa se e' un node classe (cioe' un Node) o un node istanza (cioe' node).
Cerca di tenere il codice strutturato in modo uniforme; un blocco di codice dovrebbe essere piu' indentato della funzione che lo contiene, spezzoni del tipo
Codice:
if ( something )
{
        while( something_else )
  {
do_it(); }
       }
non aiuta di certo.

Evita poi di cospargere il codice di #include, ancor piu' di includere venti volte la stessa intestazione.
Se ti serve una libreria aggiungi
Codice:
#ifdef DEBUG
#include <iostream>
#endif
solo all'inizio invece che ogni volta, e invece di tanti #ifdef per il codice raccoglili in un punto solo, ad esempio in una funzione di debug

Codice:
void debug( const string& s )
{
#ifdef DEBUG
    cerr << string << endl;
#endif
}
Nel caso DEBUG non sia definito il compilatore sapra' eliminare completamente la chiamata.
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2004, 23:01   #10
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
dimenticavo: mescolare spazi e tabulazione e' come mescolare birra e vodka: divertente finche' si vuole ma i risultati poi sono nefasti.
Quindi sempre o l'uno o l'altro (vale sia per il C++ che per gli alcolici )

Codice:
void CTree::add(int n)
{
	while( (p->L() != NULL) && (p->R() != NULL) )
	{
	  // blah
	}
	if(p->R() == NULL)
	  // blah
	}
	else if(p->L() == NULL)
	{
	  // blah
	}
}
domandone: che succede quando sia il figlio sinistro sia quello destro della radice sono presenti ? Dove viene inserito il nodo ?
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2004, 23:05   #11
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Per il debug:

se vuoi scrivere in output qualcosa di piu' elaborato di una stringa puoi fare qualcosa di piu' evoluto:

Codice:
class Debugger
{
  public:
    template <class T>
    Debugger& operator << (const T& t )
    {
#ifdef DEBUG
        cerr << t;
#endif
        return *this;
    }
  private:
    std::ostream& out;
};
In questo modo puoi scrivere
Codice:
d << "5+2=" << 5+2 << endl;
che verra' eseguito solo in caso di debug
(dovrebbe, non ho testato il codice, ma l'idea e'quella)
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2004, 07:08   #12
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Quote:
Originariamente inviato da /\/\@®¢Ø

domandone: che succede quando sia il figlio sinistro sia quello destro della radice sono presenti ? Dove viene inserito il nodo ?
Ottima domanda.
Non so pero la risposta
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2004, 09:28   #13
verloc
Senior Member
 
L'Avatar di verloc
 
Iscritto dal: Jan 2000
Messaggi: 551
devi assicurarti di aver capito bene l'argomento,scrivere codice di getto porta a questo(non sapere cosa si sta facendo).

Aia studià !
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2004, 10:08   #14
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da Luc@s
Ottima domanda.
Non so pero la risposta
Vediamo: non puoi mettere il nuovo numero come figlio del nodo radice perche' il posto e' gia' occupato; pero' il figlio e' a sua volta e' un albero, e puoi quindi provare a inserire il nodo in quell'albero; procedi cosi' finche' non trovi uno spazio libero.
il tuo codice dovrebbe quindi somigliare a qualcosa del genere:

Codice:
void CTree::add(Int n)
{
  root = insert( root , n );
}

void CTree::insert( node r , int n )
{  // abbiamo spazio per un nuovo nodo
  if ( r == 0 )
    return new node(n,0,0);
  // non c'e' spazio, riproviamo con i figli
  if ( n <= r->rad )
    r->l = insert( r->l , n );
  else
    r->r = insert( r->r , n );
}
Ti torna come funziona l'algoritmo ?
In ogni caso per argomenti come questo dovresti dotarti di una minima base teorica; consigliatissimo "Introduzione agli algoritmi" di Cormen,LEiserson.Rivest, una lettura non facile ma utilissima.
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2004, 10:23   #15
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da /\/\@®¢Ø
e' come mescolare birra e vodka: divertente finche' si vuole ma i risultati poi sono nefasti.
Ah sì ?!?!?!? Ecco perchè ieri sera

Comunque Luc@s non ti scoraggiare...non era poi così male...e continua con gli esercizi sugli alberi binari
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2004, 13:31   #16
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Il tuo algo mi da errore /\/\@®¢Ø
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2004, 14:54   #17
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da Luc@s
Il tuo algo mi da errore /\/\@®¢Ø
Ma come ho scritto il mio era un esempio di come puo' venire implementato, non l'ho provato col tuo codice; capire come funziona un algoritmo e riuscire ad implementarselo e' la cosa piu' importante, se vai avanti di copia/incolla tanto vale usare le librerie gia' pronte
(Si' avete ragione, e' pure un per il fatto che non funziona )
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2004, 16:38   #18
verloc
Senior Member
 
L'Avatar di verloc
 
Iscritto dal: Jan 2000
Messaggi: 551
Marco sta tentando di farti capire la cosa fondamentale(e che doveva essere chiaro fin dall'inizio prima di scrivere codice):
che gli a.b nella loro implementazione classica sono


STRUTTURE RICORSIVE.

non abbiamo tenuto conto ancora che la classe ha bisogno di un distruttore dell'albero(dato che si allocano i nodi dinamicamente).


adesso facciamo prima così:
senò ci schiatt' a cap'

http://www.stickysauce.com/tutorials...s/lesson18.htm

e come esercizio potresti aggiungere un metodo che stampi sul video l'albero ordinato.

Domandone secondo:e se invece di interi fossero double oppure CMele?
suggerimento:quando può dirsi che una mela è + grande di un'altra?

Ultima modifica di verloc : 16-01-2004 alle 16:43.
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2004, 17:10   #19
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Secondo me per fare quello che voelva fare Luc@s era più semplice un approccio di questo tipo:
Codice:
class bin_tree {
   bin_tree *sx;
   bin_tree *dx;
   int info;
   bin_tree() { };
public:
   bin_tree(int in):sx(NULL),dx(NULL),info(in) { };
   int height();
   bin_tree *add(int in);
   bin_tree *search(int in)
};

int bin_tree::height()
{
   if(sx && dx)
      return 1+(sx->height() < dx->height()) ? sx->height() : dx->height();
   return 0;
}

bin_tree *bin_tree::add(int in)
{
   if(sx && dx)
   {
      return (sx->height() > dx->height())?dx->add(in):sx->add(in);
   }
   bin_tree *tmp = new bin_tree(in);
   if(sx) dx = tmp;
   else sx = tmp;
   return tmp;
}

bin_tree *bin_tree::search(int in)
{
   bin_tree *res = NULL;
   if(info == in)
     return this;
   if(sx)
      res = sx->search(in);
   if(!res && dx)
      res = dx->search(in);
   return res;
}
Poi volendo si può inserire qualche interfaccia per visitare l'albero...
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Oracle NetSuite si potenzia con nuove fu...
Musica generata con l'IA: Sony lavora a ...
Cyberpunk 2077 in versione PC su smartph...
BYD si gioca un grosso jolly: pronta Rac...
Samsung annuncia l'arrivo in Italia dei ...
Offerta lancio Pixel 10a: come ottenere ...
Google presenta Pixel 10a: poche le novi...
Caos F1 2026: 14 monoposto senza omologa...
Tesla festeggia il primo Cybercab prodot...
Desktop piccolo e potente? NZXT H2 Flow ...
Polestar spinge sull'acceleratore: arriv...
Nuovo record mondiale nel fotovoltaico: ...
L'ultimo baluardo cade: fine supporto pe...
'Il mondo non ha mai visto nulla di simi...
La Commissione europea mette sotto indag...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:12.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v