Newsgroup: it.comp.lang.c
Titolo: Grattacapo...

Devo realizzare un programma che mi scriva su un file tutte le combinazioni
possibili di n caratteri ascii da "a" a "z" e da 0 a 9. Per un numero finito
di caratteri non ho problemi (n cicli for annidati) ma per un numero
variabile di caratteri inseriti dall'utente come posso fare? Invece di
utilizzare un array di stringhe ho pensato di utilizzare un array di interi
contenenti i relativi valori ascii dei caratteri per poi farli covertire
dalla fscanf().
Grazie per l'aiuto.


Puoi specificare un po' meglio il problema ?
non riesco a capire esattamente quale deve essere l'output.
cioe' se in input hai 2 devi generare tutte le stringhe di 2 caratteri
da aa,ab,ac,....,az,a0,a1,...a9,ba,bb,...fino a 9a,9b,...,99 ?
(cioe' 36x36 stringhe ?)
se hai 3 devi generare 36x36x36 stringhe ? etc.etc. ?
oppure hai un sottoinsieme di n caratteri (ogni carattere essendo
compreso in a..z e 0..9) e devi generare gli anagrammi ?
cioe' dato
bx4 devi generare bx4 b4x x4b xb4 4bx 4xb ?
chiarisci meglio.
g.


esattamente, l'utente inserisce il numero di caratteri in input (fino ad un
max di 8) e il programma scrive sul file txt tutte le possibili combinazioni
dei caratteri ascii per il numero di caratteri indicati dall'utente. Es.
n=3, aaa,aab...aaz,aba...abz,999.


allora. Hai 36 caratteri (26 caratteri + 10 numeri).
Considerando che ogni stringa sia separata dall'altra da un carettere
i file che generi sarebbero lunghi:
n| bytes
-------------------------
1| 2x36^1=72
2| 3x36^2=3888
3| 4x36^3=186624
4| 5x36^4=8398080
5| 6x36^5=362797056
6| 7x36^6=
15237476352
7| 8x36^7=626913312768
8| 9x36^8=25389989167104
--------------------------
in particolare per i casi 6,7 e 8 abbiamo rispettivamente
dei files lunghi 14, 583, 23646 Gigabytes.
Considerando che su alcuni sistemi operativi e' difficile
manipolare files piu' lunghi di 2Gb direi che i casi 6,7, e 8
o non si presentano, oppure hai una bella gatta da pelare,
se proprio vuoi salvare su files questi valori.
(a parte che con dati cosi' semplici e' piu' facile generarli
al momento piuttosto che leggerli da un file)
Comunque, ritornando al problema.
Io se fossi in te, considerando che hai solo 8 (o forse meno!!) casi
possibili, invece di perdere tempo a scrivere un codice generale
(non che ci voglia molto, ma dalla domanda che fai presumo tu non
abbia molta esperienza di programmazione) farei piuttosto
uno switch e tratterei i vari casi separatamente, tanto
con un po' di cut and paste te la dovresti cavare in pochi minuti.
ciao,
g.

 ciao,
e se volessi scrivere un codice generale?

 e se volessi scrivere un codice generale?
dammi 5 minuti....
g.

 e se volessi scrivere un codice generale?
ecco la routine. scrivi(n, "nome") scrive il file nome per n dato.
la variabile codice tiene i caratteri che vuoi usare nell'ordine
che vuoi usare (cosi' puoi facilmente passare da maiuscole
a minuscole o mettere i numeri prima delle lettere).
la variabile V e' un array di valori tra 0 e 35 ed e' usata come
un contatore. Questo contatore viene poi "codificato" usando la
variabile codice in una parola (var. parola) che viene poi scritta.
Naturalmente e' solo un esempio. Ora poi le modifiche te le fai tu.
ciao.
g.
void scrivi(int n, char *nomefile)
{
   char codice[]="abcdefghijklmnopqrstuvwxyz0123456789";
   char parola[9];
   unsigned char V[8];
   int i;
   FILE *f;
   f=fopen(nomefile,"w");
   parola[n]=0;
// inizializzazione 00...0 corrispondente a aaa..aa
   for (i=0; i<n; i++) V[i]=0;
   do
     {
       // stampa
       for (i=0; i<n; i++) parola[i]=codice[V[i]];
       fprintf(f,"%s\n",parola);
       // aggiornamento
       V[n-1]++;
       for (i=n-1; i>0 && V[i]==36; i--) {V[i]=0;V[i-1]++;}
     }
   while (V[0]<36);
   fclose(f);
}
int main()
{
   scrivi(1,"uno");
   scrivi(2,"due");
   scrivi(3,"tre");
   return 0;
}

why not un ricorsivo??
...non l'ho testato quindi ci sarà qualche errore...
void scrivi(int n, int l, char *s)
{
    char codice[]="abcdefghijklmnopqrstuvwxyz0123456789";
    int i=0;
    if (l!=n)
        do
        {
            c=codice[i];
            i++;
            p[l]=c;
            scrivi(n,l+1,p);
        }while (c);
    else
    {
        p[n]=0;
        printf("%s\n",p);
    }
}
void main ()
{
    char p[30];
    scrivi (3,0,p);
}

> void scrivi(int n, int l, char *s)
ecco tanto per iniziare qui era *p
sorry
Fra

 why not un ricorsivo??
forse perche' non hai abbastanza memoria per inseguire tutto l'albero in
stack ???
se gia' si parlano di file da 2gb si andra' ad occupare almeno la meta' in
memoria solo per temporanei di stack ...
ciao

 stack ???
! effettivamente... :D
sorry!