Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Al .NEXT 2026 di Chicago, Nutanix ha mostrato quanto sia cambiata: una piattaforma software che gestisce VM, container e carichi di lavoro IA ovunque, dall’on-premise al cloud pubblico. Con un’esecuzione rapidissima sulle partnership e sulla migrazione da VMware
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-06-2008, 12:06   #1
skull87
Member
 
Iscritto dal: Sep 2006
Messaggi: 69
[C++]Contare quante cifre di un numero intero sono presenti in un Altro [RISOLTO]

Ciao a tutti, vi allego un esercizio, penso che dal punto di vista dell'algoritmo che lavora sull'albero non ci siano problemi, ma non sono riuscito a far andare in controllo di quante cifre di un numero sono presenti in un altro, ho cercato di fare qualcosa ma con scarsissimi risultati, vi allego la traccia ed il mio codice.

Il file albero.txt di parteza può essere 312 124 458 114 320 123 586 4178

La funzione interessata è int somma(PAnodo);

Codice PHP:
/*
   Note              : Dato un albero binario le cui chiavi sono interi,
                       determinare la somma delle chiavi dei nodi che hanno 
                       almeno due cifre in comune con almeno uno dei due figli.
*/     

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <math.h>

#define TIPO_DATO int
#define OFFSET_SPACE 5

struct node {
    
int key;
    
struct nodeleft;
    
struct noderight;
};

struct node1{
        
TIPO_DATO *info;           //Puntatore all'informazione tenuta dal nodo
        
struct node1 *left;         //Puntatore sinistro
        
struct node1 *right;        //Puntatore destro
};

struct elemCoda{
       
struct node1 *elem;
       
struct elemCoda *next;
};


struct Anodo{
             
int key;
             
Anodo *left,*right;
             };

typedef Anodo *PAnodo;

using namespace std;

void StampaBST(PAnodo ,int );
void CreaAlberoDaFile(PAnodo &);
PAnodo AlberoCasualebst(int ); //Generazione Alberi Casuali Ord
void InsertSort2PAnodo &,int bool &);
void DammiChiave(PAnodo ,int &);
void writeLevelTree(struct node1 *root); //Per Stampa Grafica
struct node1 *buildTree();  //Per Stampa Grafica
struct node1 *insertInOrder(struct node1 *rootTIPO_DATO info);  //Per Stampa Grafica
void pfileorder(PAnodo );
int Altezza(PAnodo );
int somma(PAnodo);

int main(){
    
    
PAnodo A,B;
    
struct node1 *root NULL;
    
    
CreaAlberoDaFile(A);
    
//StampaBST(A,0);
    //system("pause");
    //Crea albero
    
printf("\n\t\t .: 1 :. Costruzione albero...\n");
    
root buildTree();
    if (
root==NULL) return 1;
    
    
//Stampa albero per livelli
    
system("cls");
    
writeLevelTree (root);
    
printf("\n\n\n");
    
system("pause");
    
    
cout<<"Somma: "<<somma(A)<<endl;
    
    
system("pause");
    return 
0;
    
}

int somma(PAnodo A){

    if(
A->left!=NULL || A->right!=NULL){
                     
int i=0,conta=0;
                     
chartemp=(char*)A->key;
                     
cout<<temp<<endl;
                     
int n=0;
                     while(
temp[n]!='\0'n++;
                     
system("pause");
                     if(
A->left!=NULL){ string temp1=(char*)A->left->key;
                     
                     for(
i=0;i<n-1;i++){
                     if(
temp1.find(temp[i])) conta++;
                     }}
                     
                     if(
conta<&& A->right!=NULL){
                                
string temp1=(char*)A->right->key;
                                for(
i=0;i<n-1;i++){
                                if(
temp1.find(temp[i])) conta++;
                     }
                     }
                   
                   if(
conta>=2) return somma(A->left)+somma(A->right)+A->key;
                   else return 
somma(A->left)+somma(A->right);
                   }}


int Altezza(PAnodo A)  
// CALCOLA L’ALTEZZA DELL’ALBERO A
  
int HsHd;
  if (
A==NULL)
     return -
1;
  else   {
         
Hs=Altezza(A->left); Hd=Altezza(A->right);
         if (
Hs Hd)
                return ++
Hs;
         else
                return ++
Hd;
 }
}

void visita(PAnodo aint livelloint iofstream &outlista) {

// Check Livello
if (== livello) {
outlista<<a->key<<"\t";
return;
}
// Incrementa contatore livello
i++;
// Visita Nodo Sinistro
if (a->left != NULL)
visita(a->leftlivelloi,outlista);
// Visita Nodo Destro
if (a->right != NULL)
visita(a->rightlivelloi,outlista);
}

void pfileorder(PAnodo Tree){
     
    
int num;
    
//cout<<"Salva Albero su FILE:"<<endl;
    
string NomeLn,NomeOut;
    
ifstream filista;
    
ofstream outlista;
    
NomeOut="albero.txt";
    
outlista.open(NomeOut.c_str());
    if(!
outlista){
        
cerr<<"Non si puo' aprire il file!"<<endl;
        
system("pause");
    }
    
    for(
int k=0;k<=Altezza(Tree);k++)
    
visita(Tree,k,0,outlista);
    
    
outlista.close();
}

void DammiChiave(PAnodo TNodeint &TheKey)
//ritorna il key field del nodo puntato da Tnode, se Tnode è 
                              // NULL allora ritorna il valore di -100
    
if (TNode != NULL )
        
TheKeyTNode ->key;
    else
     
TheKey= -100;
}


void StampaBST(PAnodo Tree,int i){
    if(
Tree!=NULL){
        
StampaBST(Tree->right,i+1);
        for(
int j=1;j<=i;j++)
            
cout<<" ";
        
cout<<Tree->key;
        
cout<<endl;
        
StampaBST(Tree->left,i+1);
    }
}

void CreaAlberoDaFile(PAnodo &Tree){
    
int num;
    
cout<<"Crea Albero da FILE:"<<endl;
    
Tree=NULL;
    
string NomeLn,NomeOut;
    
ifstream filista;
    
ofstream outlista;
    
NomeLn="albero.txt";
    
filista.open(NomeLn.c_str());
    if(!
filista){
        
cerr<<"Non si puo' aprire il file!"<<endl;
        
system("pause");
    }
   
filista>>num;  
   while (!
filista.eof()) { 
      
bool temp=false;
      
InsertSort2Treenumtemp); 
      if (
temp==falsecout<<"Numero preesistente ="<<num<<endl;
      else 
cout<<" Inserito numero= "<<num<<endl;
      
filista>>num;;
      }
      
system("pause");
    
filista.close();
}

void InsertSort2PAnodo &A,int mbool &inserito)   { //OK
      
if(A==NULL)  {
         
A=new Anodo;
         
A->key m;
         
A->left=NULL;
         
A->right=NULL;
         
inserito=true;
         }          
      else if(
A->key<m)  InsertSort2(A->right,m,inserito);
      else if(
A->key>m)  InsertSort2(A->left,m,inserito);
      else 
inserito=false;
}

/*
 Helper function that allocates a new node
 with the given data and NULL left and right
 pointers.
*/
struct nodeNewNode(int data) {
  
struct nodenode = new(struct node);    // "new" is like "malloc"
  
node->key data;
  
node->left NULL;
  
node->right NULL;

  return(
node);


/*
 Give a binary search tree and a number, inserts a new node
 with the given number in the correct place in the tree.
 Returns the new root pointer which the caller should
 then use (the standard trick to avoid using reference
 parameters).
*/

struct nodeinsert(struct nodenodeint data) {
  
// 1. If the tree is empty, return a new, single node
  
if (node == NULL) {
    return(
NewNode(data));
  }
  else {
    
// 2. Otherwise, recur down the tree
    
if (data <= node->keynode->left insert(node->leftdata);
    else 
node->right insert(node->rightdata);

    return(
node); // return the (unchanged) node pointer
  
}



struct node1 *buildTree(){
      
/* int info;
       struct node1 *root = NULL;

       for(;info!=0;){
          printf("\n\tInserire elementi (0 per terminare): ");
          scanf("%d",&info);
          if (info!=0){
             printf("\tInserisco elemento %d nell'albero\n",info);
             root = insertInOrder(root,info);
             }
          }
       return root;*/
    
int num;
    
cout<<"Crea Albero da FILE:"<<endl;
    
struct node1 *root=NULL;
    
string NomeLn,NomeOut;
    
ifstream filista;
    
ofstream outlista;
    
NomeLn="albero.txt";
    
filista.open(NomeLn.c_str());
    if(!
filista){
        
cerr<<"Non si puo' aprire il file!"<<endl;
        
system("pause");
    }
    
filista>>num;
    while(!
filista.eof()){
        
root insertInOrder(root,num);
        
filista>>num;
    }
    
filista.close();
    return 
root;
}

/* 2 */
       /* 2.1 */
       
struct node1 *newNode(TIPO_DATO x){
              
struct node1 *elem = (struct node1 *)malloc (sizeof(struct node1));
              
TIPO_DATO *info = (TIPO_DATO *)malloc (sizeof(TIPO_DATO));

              if ((
elem==NULL)||(info==NULL)) return NULL;

              *
info =  x;
              
elem->info info;
              
elem->left NULL;
              
elem->right NULL;

              return 
elem;
       }

struct node1 *insertInOrder(struct node1 *rootTIPO_DATO info){
       
//Caso base
       
if (root == NULL) return (newNode(info));

       
//Ricorsione
       
if (info > *(root->info))
          
root->right insertInOrder(root->rightinfo);
       else
          
root->left insertInOrder(root->leftinfo);
       return 
root;
}

/* 5 */
        /* 5.1 */
        /*     Restituisce il numero di livelli dell'albero   */
        /*     (Necessario per una corretta spaziatura)       */
        
int contaLivelli(struct node1 *rootint nLeftint nRight){
            
int x,y;

            if (
root==NULL) return 0;
            
contaLivelli(root->leftnLeft+1nRight);
            
contaLivelli(root->rightnLeftnRight+1);

            if (
x>y) return (x+1);
            return (
y+1);
        }

        
/* 5.2 */
        /*     Inserisce in coda alla lista puntata da "coda" il nodo x       */
        
struct elemCoda *insertInTail(struct elemCoda *coda,struct node1 *x){
               
struct elemCoda *tmp = (struct elemCoda *) malloc (sizeof(struct elemCoda));
               
struct elemCoda *conta;

               if (
tmp==NULL) return NULL;
               if (
x==NULL){
                  
tmp->elem NULL;
                  
tmp->next NULL;
               } else{
                    
tmp->elem x;
                    
tmp->next NULL;
                 }

               if (
coda==NULL) return tmp;

               for(
conta=coda;conta->next!=NULL;conta=conta->next);

               
conta->next tmp;

               return 
coda;
        }


void writeLevelTree (struct node1 *root){
     
struct elemCoda *coda=NULL,
                     *
tmp=NULL;
                                        
/* Per una "corretta" spaziatura        */
     
int nLevel,                        //#livelli
         
nNodesCurrentLevel,            //#nodi del livello correntemente elaborato
         
currentLevel=0,                //#livello correntemente elaborato
         
conta,                         //var. per ciclo spaziatura
         
nCurrentNode=0;                //#nodo correntemente in esame

     //Calcolo numero livelli dell'albero
     
nLevel contaLivelli(root,1,1);  /* 5.1 */

     //Inserimento radice albero in coda alla lista
     
coda insertInTail(coda,root);   /* 5.2 */

     //Fin quando la coda dei nodi è piena...
     
for(;coda!=NULL;){

              
nNodesCurrentLevel=(int)pow (2currentLevel); //#nodi del corrente livello (per spaziatura)
              
++nCurrentNode;                                //#nodo corrente rispetto al livello (per spaziatura)

              //Spaziatura prima del valore del nodo
              
for (conta=0conta<(OFFSET_SPACE*nLevel/nNodesCurrentLevel); ++conta)
                  
printf(" ");

              
//Valore del nodo (se il nodo non esiste, NULL, due spazi)
              
if (coda->elem!=NULL)
                 
printf("%d",*(coda->elem->info));
              else 
printf("  ");

              
//Spaziatura dopo il valore del nodo
              
for (conta=0conta<(OFFSET_SPACE*nLevel/nNodesCurrentLevel); ++conta)
                  
printf(" ");

              
//Se sono stati stampati tutti i nodi di questo livello
              // vai a capo, azzera il #nodo corrente e incrementa
              // il valore del livello corrente
              
if (nCurrentNode == nNodesCurrentLevel){
                 
currentLevel++;
                 
nCurrentNode=0;
                 
//cout<<"\n L "<<currentLevel<<"     \n";
                
printf("\n\n\n");
              }

              
//Inserisci in coda i due figli (destro e sinistro) del nodo corrente.
              
tmp coda;
              
coda coda->next;
              if (
tmp->elem!=NULL){
                 
coda insertInTail(coda,tmp->elem->left);
                 
coda insertInTail(coda,tmp->elem->right);
              } else
                    
//Se il nodo corrente è NULL e questo in corso di elaborazione
                    // non è l'ultimo livello, inserisci in coda due figli NULL
                    // (destro e sinistro del nodo NULL) in coda (per una
                    //  "corretta" spaziatura)
                    
if (currentLevel<nLevel-1){
                       
coda insertInTail(coda,NULL);
                       
coda insertInTail(coda,NULL);
                    }
     }



Graze 1000 a tutti
__________________
MondoLibero: Informazione Libera, Varia ed Eventuale
Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

Ultima modifica di skull87 : 19-06-2008 alle 15:04.
skull87 è offline   Rispondi citando il messaggio o parte di esso
Old 19-06-2008, 15:03   #2
skull87
Member
 
Iscritto dal: Sep 2006
Messaggi: 69
Risolto con queste due funzioni modificate ed adattate. La funzione occorrenze ritengo sia molto utile per quello che svolge, può sempre servire infatti contare quante cifre in comune vi sono tra due numeri interi.

Codice PHP:
int occorrenze(int numint num1)
{
 
int j 0;
 
bool check=false;
 
int a,b;
 
int k;
 
int cont 0;
 
char buff1[10], buff2[10],buff3[10];
 
itoa(numbuff110);
 
itoa(num1buff210);
 for (
k=0k<strlen(buff1); k++)
 {
  while(
strlen(buff2) && !check){
          
a=(int) buff1[k] - (int) '0';
          
b=(int) buff2[j] - (int) '0';
    if(
a==b){
     
cont++; check=true;
     }
     
j++;
     }
    
j=0;check=false;
 }
 if(
num<&& num1<0cont-=1;
 return 
cont;
}  

int somma(PAnodo A){

    if(
A!=NULL){
                   if(
A->left!=NULL && occorrenze(A->key,A->left->key)>=2)
                   return 
somma(A->left)+somma(A->right)+A->key;
                   
                   else if(
A->right!=NULL && occorrenze(A->key,A->right->key)>=2)
                   return 
somma(A->left)+somma(A->right)+A->key;
                   
                   else return 
somma(A->left)+somma(A->right);
                   }
                   else return 
0;
                   } 
Grazie a tutti cmq
__________________
MondoLibero: Informazione Libera, Varia ed Eventuale
Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.
skull87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
6000 mAh, 5G e 108MP a meno di 200€: ecc...
FRITZ!Mesh Set 2700: Wi-Fi 7 in tutta la...
Amazfit Cheetah 2 Pro: lo smartwatch per...
Intel, focus su GPU workstation e datace...
Addio definitivo a iOS 26.4, Apple blocc...
EPYC di nuova generazione: AMD supporter...
AMD, Arm e Qualcomm scommettono su Wayve...
Intel potrebbe estendere la vita del soc...
Windows, gli aggiornamenti di aprile for...
Addio cavi perimetrali: il robot tosaerb...
Google Pixel 10 oggi proposto a soli 549...
I robot di Boston Dynamics possono inter...
Tech, gadget e accessori a meno di 5€ su...
Ford riorganizza la divisione elettrica:...
Elon Musk trasforma xAI in fornitore di ...
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: 13:55.


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