Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] Generare Casualmente un Albero di Nomi

    Ciao a tutti, sto affrontando il problema di scrivere una funzione che mi permetta di generare alberi non ordinati di nomi in maniera casuale, le funzioni che ho scritto sono indicate dal commento //Generazione Alberi Casuali NN Ord. Queste non funzionano perchè il codice che da un array di stringhe mi va a creare in maniera random un array di caratteri, poi utilizzato in tutto il resto del programma non funziona. Più specificatamento, con qualche cout ho notato che la generazione di nomi casuali( o meglio pseudocasuali) funziona, ma poi nella parte di codice che vi evidenzio non viene riportato come dovrebbe e sul monitor compaiono caratteri indecifrabili.


    codice:
    /*
       Nome del programma: AlberiCaratteri.cpp   
    */     
    
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <math.h>
    #include <time.h> //Genera Numeri Casuali Tutti Diversi
    #include <string>
    
    struct Anodo{
                 char key[20];
                 Anodo *left,*right;
                 };
    
    typedef Anodo *PAnodo;
    
    
    using namespace std;
    
    void CreaAlberoDaFile(PAnodo &);
    PAnodo InsertA(char [] ,PAnodo ,PAnodo );
    PAnodo InsertSort(char [],PAnodo );
    void InsertSort2( PAnodo &,char [], bool &);
    int Altezza(PAnodo );
    void StampaBST(PAnodo ,int );
    void pfileorder(PAnodo );
    PAnodo Insert(char [], PAnodo , PAnodo ); //Generazione Alberi Casuali NN Ord
    PAnodo AlberoCasuale(int ); //Generazione Alberi Casuali NN Ord
    
    
    int main(){
        
        PAnodo A;
        
        //CreaAlberoDaFile(A);
        A=AlberoCasuale(3);
        StampaBST(A,0);
    
        cout<<endl;
        
        system("pause");
        return 0;
        
    }
    
    PAnodo Insert(char info1[], PAnodo As, PAnodo Ad) {
    // PER INSERIRE UNA FOGLIA SI CHIAMA CON Insert(Numero,NULL,NULL)                       
      PAnodo A2;
      A2= new Anodo;
      strcpy(A2->key,info1);
      A2->left=As;
      A2->right=Ad;
      return A2;
    }
    
    string v[10]={"Marco","Giulio","Rocco","Vincenzo","Andrea","Giulietta",
                  "Alfa","Romeo","Domenico","Francesco"};
                  
    void copiastingachar(char *mioArray){
         
         srand ( time ( NULL ) );
         string att=v[rand()%10];
         cout<<att<<endl;
         system("pause");
         int quantiElementi=att.size();
         int i;   // Indice per scorrere l'array
         // Alloco il mio array:
         mioArray = (char *) malloc(quantiElementi * sizeof(char));
         
         // Lo riempio:
        for(i=0; i<quantiElementi; i++) mioArray[i] = att[i];
         
         }
    
    
    PAnodo AlberoCasuale(int n) 
    {
    //Dato un intero n restituisce un albero di interi di altezza n NON ORDINATO
      if (n==0) {
                char *vett;
                copiastingachar(vett);
                
        return Insert(vett,NULL,NULL);
    }
                                        
      else{
                char vett[20];
                copiastingachar(vett);
        return Insert(vett,AlberoCasuale(n-1),AlberoCasuale(n-1));     
      }
    }
    
    int Altezza(PAnodo A)  
    { // CALCOLA L’ALTEZZA DELL’ALBERO A
      int Hs, Hd;
      if (A==NULL)
         return -1;
      else   {
         	Hs=Altezza(A->left); Hd=Altezza(A->right);
         	if (Hs > Hd)
            		return ++Hs;
         	else
            		return ++Hd;
     }
    }
    
    /*
    * Visita Ricorsivamente l'albero e salva i valori dei nodi che si trovano
    * al livello specificato
    */
    
    
    void visita(PAnodo a, int livello, int i, ofstream &outlista) {
    
    // Check Livello
    if (i == livello) {
    outlista<<a->key<<"\t";
    return;
    }
    // Incrementa contatore livello
    i++;
    // Visita Nodo Sinistro
    if (a->left != NULL)
    visita(a->left, livello, i,outlista);
    // Visita Nodo Destro
    if (a->right != NULL)
    visita(a->right, livello, i,outlista);
    }
    
    
    void pfileorder(PAnodo Tree){
         
        char* num;
        //cout<<"Salva Albero su FILE:"<<endl;
        string NomeLn,NomeOut;
        ifstream filista;
        ofstream outlista;
        NomeOut="alberocar.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 CreaAlberoDaFile(PAnodo &Tree){
        char num[20];
        cout<<"Crea Albero da FILE:"<<endl;
        Tree=NULL;
        string NomeLn,NomeOut;
        ifstream filista;
        ofstream outlista;
        NomeLn="alberocar.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;
          InsertSort2( Tree, num, temp); 
          if (temp==false) cout<<"Numero preesistente ="<<num<<endl;
          else cout<<" Inserito numero= "<<num<<endl;
          filista>>num;;
          }
          system("pause");
        filista.close();
    }
    
    void InsertSort2( PAnodo &A,char m[], bool &inserito)   { //OK
          if(A==NULL)  {
             A=new Anodo;
             strcpy(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;
    }
    
    PAnodo InsertA(char* key1,PAnodo TreeS,PAnodo TreeD){
        PAnodo A2;
        A2=new Anodo;
        strcpy(A2->key,key1);
        A2->left=TreeS;
        A2->right=TreeD;
        return A2;
    }
    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);
        }
    }
    Se esiste un codice migliore segnalatemelo, vi ringrazio.
    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.

  2. #2
    ciao
    ti posto il codice per creare un albero casuale di interi

    Tnodo AlberoCasuale(int n) {
    //Dato un intero n restituisce un albero di interi di altezza n NON ORDINATO
    if (n==0)
    return Insert(rand()%100,NULL,NULL);
    else
    return Insert(rand()%100,AlberoCasuale(n-1),AlberoCasuale(n-1));
    }

  3. #3
    Originariamente inviato da wgd-developer
    ciao
    ti posto il codice per creare un albero casuale di interi

    Tnodo AlberoCasuale(int n) {
    //Dato un intero n restituisce un albero di interi di altezza n NON ORDINATO
    if (n==0)
    return Insert(rand()%100,NULL,NULL);
    else
    return Insert(rand()%100,AlberoCasuale(n-1),AlberoCasuale(n-1));
    }

    Questo lo conosco anche io, ma non sono riuscito ad adattarlo per la creazione di un albero casuale di Nomi.
    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.

  4. #4
    Nessuno conosce un codice per fare questo?

    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.

  5. #5

    Re: [C++] Generare Casualmente un Albero di Nomi

    codice:
    PAnodo AlberoCasuale(int n) {
    
        const char *v[10]={
           "Marco",
           "Giulio",
           "Rocco",
           "Vincenzo",
           "Andrea",
           "Giulietta",
           "Alfa",
           "Romeo",
           "Domenico",
           "Francesco"
       };
       
       if (n==0)
          return Insert(v[rand() % 10], NULL, NULL);                            
       else
         return Insert(v[rand() % 10], AlberoCasuale(n-1), AlberoCasuale(n-1));     
    
    }

  6. #6

    Re: Re: [C++] Generare Casualmente un Albero di Nomi

    Originariamente inviato da menphisx
    codice:
    PAnodo AlberoCasuale(int n) {
    
        const char *v[10]={
           "Marco",
           "Giulio",
           "Rocco",
           "Vincenzo",
           "Andrea",
           "Giulietta",
           "Alfa",
           "Romeo",
           "Domenico",
           "Francesco"
       };
       
       if (n==0)
          return Insert(v[rand() % 10], NULL, NULL);                            
       else
         return Insert(v[rand() % 10], AlberoCasuale(n-1), AlberoCasuale(n-1));     
    
    }
    Gentilissimo, grazie mille
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.