Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    7

    [VBS] Shuffle Array

    Slave a tutti,
    Dovrei creare uno script che partendo da un triplo array o meglio ancora da 3 file (ad esempio. nomi.txt, cognomi.txt, domini.txt) generi in modo casuale tutte le combinazioni dei tre.

    Esempio:

    names.txt
    Luca
    Mario
    Pippo
    Franco

    surnames.txt
    Lancellotti
    Lancetti
    Landi
    Landini
    Lapi
    Lassani
    Lazarini
    Lelli
    Lisardo
    Litta
    Locatelli
    Lodovici

    domains.txt
    hotmail.it
    hotmail.com
    libero.it
    aol.com

    Lo script dovrebbe produrre come output una cosa del tipo (ovviamente sfruttando tutte le combinazioni):

    Luca.Landi@hotmail.it
    Luca.Landi@hotmail.com
    Luca.Landi@aol.cm
    Luca.Landi@libero.it

    Luca.Litta@hotmail.it
    Luca.Litta@hotmail.com
    Luca.Litta@aol.com

    Luca.Lassani@hotmail.it
    Luca.Lassani@hotmail.com
    Luca.Lassani@aol.com
    Luca.Lassani@libero.it

    etc...etc..etc..

    Qualcuno sa darmi due dritte ??

    Grazie,
    Dennis

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288

    Moderazione

    Originariamente inviato da Ihyae
    Qualcuno sa darmi due dritte ??
    Devi spiegare cosa non ti riesce di preciso.

    Avrai iniziato ad analizzare e affrontare il problema in qualche modo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Non è difficile.
    Analizzando il problema, hai 3 campi da modificare, ciascuno dei quali ha un lista di valori assumibili.
    i campi sono nome-cognome-dominio
    Pensa al sistema numerico decimale: è strutturato in modo da formare ogni combinazione possibile delle cifre. Per ottenere ogni combinazione possibile dei valori {0,1,2,3,4,5,6,7,8,9}
    in 3 campi ti basterebbe inizializzare un numero a 0 e aumentarlo di 1 fino a 999.
    Fai al stessa cosa con i tuoi tre campi.
    Inizializzi a 0 (prendi il primo valore in lista per ognuno dei tre campi) e aumenti di 1.
    Per aumentare di 1 passi al prossimo elemento nella lista del campo più a destra (come nei numeri, in realtà non devi seguire necessariamente lo stesso ordine, ma lo facciamo per precisione e comodità).
    Se il prossimo valore in lista per il campo più a destra fosse successivo all'ultimo (ovvero il valore attuale del campo è già l'ultimo della lista), riporti questo campo al suo valore iniziale e aumenti di 1 quello del campo più a sinistra.

    Stesso ragionamento per la funzione "aumenta di uno" lo applichi al campo più a sinistra appena aumentato.

    Quando tutti e tre i campi hanno raggiunto l'ultimo valore nella loro lista-valori hai esaurito le combinazioni possibili.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    7
    So che per alcuni è molto banale, purtroppo io faccio il sistemista e con la programmazione non siamo tanto "amici", mi servirebbe un sample da cui prendere spunto...

    Il mio concetto di array arriva fino a:

    Dim name(7)
    name(0) = "Luca"
    name(1) = "Francesco"
    name(2) = "Alex"
    name(3) = "Luca"
    name(4) = "Pippo"
    name(5) = "Valeria"
    name(6) = "Lucia"

    Dim surname(3)
    surname(0) = "Valenti"
    surname(1) = "Graziani"
    surname(2) = "Garzanti"

    dim domain(5)
    domain(0) = "hotmail.it"
    domain(1) = "libero.it"
    domain(2) = "tiscali.it"
    domain(3) = "aol.com"
    domain(4) = "gmail.com"

    wscript.echo name(0) & "." & surname(0) & "@" & domain(1)

    Non ho ben chiaro però come implementare il tutto.. devo scrivere una funzione che aumenti il counter ??

    In oltre, in questo modo dovrei scrivere un array per i nomi uno per i domini e uno per i cognomi, quello che mi chiedo però è:
    ogni volta che si aggiunge o si toglie un nome/cognome/dominio, bisogna modificare il parametro che indica quante voce ha l'array.. speravo di poter caricare tutto in 3 file .txt e come dimensione dell'array fare il conteggio delle righe (dando per scontato che ci sia una voce per riga) presenti nel file.

    A livello teorico mi è tutto molto chiaro, non so bene come buttar giù l'idea a livello di codice..

    Anche solo un piccolo esempio potrebbe indirizzarmi nella giusta direzione!

  5. #5
    Codice visual basic? non ti so più aiutare, sbaglio o avevi postato in c++?

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    7
    Si, il codice è VBS ma non sono vincolato al linguaggio, fosse anche in C/C++ non ci sono problemi!
    Ho scelto il vbs perchè non c'è bisogno di compilarlo ma, non ho problemi a passare ad un altro linguaggio nel caso risultasse più semplice!

  7. #7
    Più semplice è sicuramente in VB.net , solo che non posso aiutarti perchè non ricordo più quel linguaggio
    Posso fornirti un esempio in C++, se aspetti te lo faccio

  8. #8
    codice:
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #define MAXLEN 100  //lunghezza massima delle stringhe di nomi,cognimi,domini.
    struct chunk
    {
       chunk()
       {
          data = NULL;
          next = NULL;
       }
       char* data;
       chunk* next;
    };
    struct list //struttura per le liste di valori per campo
    {
           list() //inizializza la lista
           {
              first = NULL;
              count = 0;
           }
           chunk* first;
           chunk* last;
           int count; //numero di valori nella lista
           char* FindString(int ID) //trova il valore con id ID
           {
                 int i = 0;
                 chunk* c = first;
                 while(i < ID) {c = c->next; i++;}
                 return(c->data);
           }
           void AddValue(char* value)
           {
                chunk* c = new chunk;
                memcpy(c->data,value,strlen(value)+1);
                if(first == NULL) {first = c; last = first;}
                else {last->next = c; last = last->next;}
                count++;
           }
    };
    list* CreaListaDaFile(char* fname)
    {
          list* lista = new list;
          FILE* file = fopen(fname);
          char c[2];
          char str[MAXLEN+1];
          int pos = 0;
          while(!feof(file))
          {
              fread(c,sizoef(char),2,file);
              if(c[0] == 13 && c[1] == 10) // a capo!
              {
                 str[pos] = NULL;
                 lista->AddValue(str);
                 pos = 0;
              }
              else
              {
                  fseek(file,-2,SEEK_CUR);
                  fread(str+pos,sizeof(char)1,file);
                  pos++;
              }
          }
          fclose(file);
          return(lista);
    }
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        list* nomi = CreaListaDaFile("C:/nomi.txt");
        list* cognomi = CreaListaDaFile("C:/cognomi.txt");
        list* domini = CreaListaDaFile("C:/domini.txt");
        //nomi.cognomi.domini
        int campi[3]; //creo 3 campi, ognuno è un numero che va da 0 all'indice dell'ultimo valore della sua lista (==sua_lista.count-1, se diamo al primo indice 0)
        campi[0] = 0;
        campi[1] = 0;
        campi[2] = 0; //ho messo l'indice di ogni campo al primo della loro lista.
        //campo0 è quello più a sinistra, poi viene 1 e 2.
        while(true)
        { //finchè il campo più a sinistra non ha raggiunto il fondo della sua lista
          cout << nomi->FindString(campi[0]) << "." << cognomi->FindString(campi[1]) << "@" << domini->FindString(campi[2]) << endl;
          campi[2]++;
          if(campi[2] == domini->count)
          {
             campi[2] = 0;
             campi[1]++;
             if(campi[1] == cognomi->count)
             {
                 campi[1] = 0;
                 campi[0]++;
                 if(campi[0] == nomi->count)
                 {
                     break;
                 }
             }
          }
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Dovrebbe andare ma non ho controllato

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    7
    Grazie mille davvero..lo provo subito e ti faccio sapere!

  10. #10
    c'erano degli errori, ho corretto e provato, così funziona.
    codice:
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #define MAXLEN 100  //lunghezza massima delle stringhe di nomi,cognimi,domini.
    using namespace std;
    struct chunk
    {
       chunk()
       {
          data = NULL;
          next = NULL;
       }
       char* data;
       chunk* next;
    };
    struct list //struttura per le liste di valori per campo
    {
           list() //inizializza la lista
           {
              first = NULL;
              count = 0;
           }
           chunk* first;
           chunk* last;
           int count; //numero di valori nella lista
           char* FindString(int ID) //trova il valore con id ID
           {
    		     if(ID == 0) return(first->data);
                 int i = 0;
                 chunk* c = first;
                 while(i < ID) {c = c->next; i++;}
                 return(c->data);
           }
           void AddValue(char* value)
           {
                chunk* c = new chunk;
    			c->data = new char[strlen(value)+1];
                memcpy(c->data,value,strlen(value)+1);
                if(count == 0){
    				first = c;
    				last = first;
    			}
                else {last->next = c; last = last->next;}
                count++;
           }
    };
    list* CreaListaDaFile(char* fname)
    {
          list* lista = new list();
    	  ifstream fin(fname);
    	  char buffer[MAXLEN];
    	  fin.getline(buffer,MAXLEN);
    	  if(strlen(buffer)>0) lista->AddValue(buffer);
    	  while(!fin.eof())
    	  {
    		  fin.getline(buffer,MAXLEN);
    		  lista->AddValue(buffer);
    	  }
    	  fin.close();
    	  return(lista);
    }
    
    
    int main(int argc, char *argv[])
    {
        list* nomi = CreaListaDaFile("C:/nomi.txt");
        list* cognomi = CreaListaDaFile("C:/cognomi.txt");
        list* domini = CreaListaDaFile("C:/domini.txt");
        //nomi.cognomi.domini
        int campi[3]; //creo 3 campi, ognuno è un numero che va da 0 all'indice dell'ultimo valore della sua lista (==sua_lista.count-1, se diamo al primo indice 0)
        campi[0] = 0;
        campi[1] = 0;
        campi[2] = 0; //ho messo l'indice di ogni campo al primo della loro lista.
        //campo0 è quello più a sinistra, poi viene 1 e 2.
        while(true)
        { //finchè il campo più a sinistra non ha raggiunto il fondo della sua lista
          cout << nomi->FindString(campi[0]) << "." << cognomi->FindString(campi[1]) << "@" << domini->FindString(campi[2]) << endl;
          campi[2]++;
          if(campi[2] == domini->count)
          {
             campi[2] = 0;
             campi[1]++;
             if(campi[1] == cognomi->count)
             {
                 campi[1] = 0;
                 campi[0]++;
                 if(campi[0] == nomi->count)
                 {
                     break;
                 }
             }
          }
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }

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.