Questo è un mio programma completo che fa quello che vuoi tu:
(non è ricorsivo)
La funzione + importante è disp()
codice:
#include <iostream>
#include <string>
// per system("PAUSE") e exit()
#include <cstdlib>
using namespace std;
void disp();
void init();
void show();
void filltable();
int tot_chars;
int *vals;
string parola;
int main()
{
// Spiege come formattare l'input
cout << "Inserisci una parola che contenga tutte le lettere da utilizzare e premi invio." << endl;
cout << "Scrivi 'alfa' se vui tutto l'alfabeto minuscolo." << endl;
cout << "Scrivi 'ALFA' se vui tutto l'alfabeto maiuscolo." << endl;
cout << "Scrivi 'Alfa' se vui tutto l'alfabeto minuscolo e maiuscolo." << endl;
cout << "Permi solo invio per le cifre da 0 a 9." << endl;
// 40 caratteri dovrebbero bastare a fondere qualsiasi computer
char buf[40];
// Qui chiede l'input con getline()
cin.getline(buf,40); parola = buf;
// Riempie la tabella dei caratteri (se ad esempio ha messo "Alfa"
filltable();
cout << "Quanto sarà lunga ogni combinazione?" << endl;
do {
cin >> tot_chars;
} while(tot_chars <= 0);
// Crea l'array delle combinazioni
vals = new int[tot_chars];
if(!vals)
{
cout << "Memoria insufficiente!!!"<<endl;
system("PAUSE");
exit(1);
}
// Inizializza con il primo valore
init();
// Mostra tutte le combinazioni
disp();
// Cancella l'array delle combinazioni
delete [] vals;
cout << "Grazie e arrivederci." << endl;
system("PAUSE");
return 0;
}
void filltable()
{
int i;
if(parola == "alfa")
{
parola = "";
// Riempie la tabella con lettere da 'a' a 'z'
for(i='a'; i<='z'; i++)
parola += i;
}
else if(parola == "ALFA")
{
parola = "";
// Riempie la tabella con lettere da 'A' a 'Z'
for(i='A'; i<='Z'; i++)
parola += i;
}
else if(parola == "Alfa")
{
parola = "";
// Riempie la tabella con lettere da 'a' a 'z'
for(i='a'; i<='z'; i++)
parola += i;
// Riempie la tabella con lettere da 'A' a 'Z'
for(i='A'; i<='Z'; i++)
parola += i;
}
else if(parola.size() == 0)
{
parola = "";
// Riempie la tabella con cifre da '0' a '9'
for(i='0'; i<='9'; i++)
parola += i;
}
}
void disp()
{
int last = tot_chars - 1;
int pos = last;
bool end_flag;
// Mostra la combinazione attuale (tutti zeri)
show();
for(end_flag = false; !end_flag; )
{
// Incrementa il valore alla posizione corrente
vals[pos]++;
// Mostra la combinazione attuale
show();
// Torna alla prima posizione.
pos = last;
// Vado avanti finchè non trovo un valore che non sia l'ultimo
while (vals[pos]==(parola.size()-1))
{
// Imposto la posizione corrente a 0
vals[pos] = 0;
// precedente
pos--;
// Se sono arrivato prima dell'inizio del vettore,
// cioè anche il primo carattere era un valore finale (come 9)
// allora ho finito.
if(pos < 0) end_flag = true;
}
}
}
void show()
{
for(int i=0; i<tot_chars; i++)
{
cout << parola[vals[i]];
}
cout << endl;
}
void init()
{
for(int i=0; i<tot_chars; i++)
vals[i] = 0;
}
Se trovi bug avvisami!