PDA

View Full Version : [JAVA] Non mi funziona questo algoritmo che calcola le permutazioni di una parola...


PaVi90
03-11-2007, 11:51
Ciao a tutti,
chi mi dice perchè il programma restituisce come permutazioni "null" seguito dalla prima lettera della parola immessa dall'utente?


import java.io.*;
import java.math.*;
public class permutazioni {

public static void main(String[] args) throws IOException {
// Costruisce l'oggetto di accesso alla tastiera
BufferedReader input=new BufferedReader(
new InputStreamReader(System.in)
);
// TODO code application logic here
String parola="";
double x;
int p;
int I=0;
int Y=0;
int flag=0;
int riempimento=0;
int K=0;

System.out.println("Inserire la parola di cui eseguire le permutazioni: ");
parola=input.readLine();
int lungh=parola.length(); //lunghezza parola di cui calcolarne il fattoriale
System.out.println(lungh);

int dim=1;
do{
dim=dim*lungh;
lungh--;
} while ((lungh-1)>0);

String vet[] = new String [dim]; //crea il vettore di permutazioni [l'indice andrà da 0 a (dim-1) ]
vet[0]=parola;


for(I=1; I<dim; I++) {

do {
flag=0;
for(Y=0; Y<lungh; Y++){
x=Math.random();
p=(int)(x*lungh);
vet[I]=vet[I]+parola.charAt(p);
}

for (K=0; K<riempimento; K++) {
if(vet[I]==vet[K]){
flag=1;
}
}
} while (flag==1);
riempimento++;

}

System.out.println("Le permutazioni della parola inserita sono:");
for(I=0; I<dim; I++){
System.out.println(vet[I]);
}


}

}

wingman87
03-11-2007, 13:01
for(I=1; I<dim; I++) {

do {
flag=0;
for(Y=0; Y<lungh; Y++){
x=Math.random();
p=(int)(x*lungh);
vet[i]=vet[i]+parola.charAt(p);
}

for (K=0; K<riempimento; K++) {
if(vet[i]==vet[K]){
flag=1;
}
}
} while (flag==1);
riempimento++;

}
Se l'hai scritto tu mi spieghi cosa stessi tentando di fare? ^^
No comunque seriamente, in questo tipo di problemi non si usano mai funzioni random...

PaVi90
03-11-2007, 13:04
for(I=1; I<dim; I++) {

do {
flag=0;
for(Y=0; Y<lungh; Y++){
x=Math.random();
p=(int)(x*lungh);
vet[i]=vet[i]+parola.charAt(p);
}

for (K=0; K<riempimento; K++) {
if(vet[i]==vet[K]){
flag=1;
}
}
} while (flag==1);
riempimento++;

}
Se l'hai scritto tu mi spieghi cosa stessi tentando di fare? ^^
No comunque seriamente, in questo tipo di problemi non si usano mai funzioni random...
Il ciclo esterno for si preoccupa di scorrere il vettore riempendolo di permutazioni e, per fare ciò, innanzitutto il do while controlla che la permutazione generata non sia uguale ad una già precedentemente generata e memorizzata nel vettore di permutazioni vett.
Il primo for genera la permutazione, invertendo in maniera random la posizione delle lettere, mentre il secondo si preoccupa di stabilire se flag=1 (cioè se la permutazione è già presente nel vettore di permutazioni).
Non so se mi sono spiegato bene...

Comunque, perchè non si usa il random in questo caso? Sclera con le stringhe?

PaVi90
03-11-2007, 19:00
Preciso che il programma, così com'è, non calcola le permutazioni bensì le disposizioni con ripetizione, dato che non è stato fatto il controllo ad ogni generazione random dell'indice; se viene generato, su quattro volte, più di una volta lo stesso valore, la nuova stringa conterrà due lettere uguali...
Magari ponendo i numeri prima in un vettore e poi controllando con un flag che nessun numero sia uguale all'altro il problema si risolve.
Tuttavia resta quello del "null" in output seguito dalla prima lettera della parola immessa dall'utente di cui eseguire le permutazioni...
Avete qualche idea per risolvere il problema???
Grazie

PaVi90
04-11-2007, 11:13
up

wingman87
04-11-2007, 18:40
Comunque, perchè non si usa il random in questo caso? Sclera con le stringhe?
No, perchè in questo modo in via del tutto teorica l'esecuzione dell'algoritmo potrebbe andare avanti all'infinito, bisogna invece usare un procedimento che passo passo in modo ordinato trova tutte le permutazioni. Con un procedimento del genere puoi anche dire a priori, data la lunghezza della parola quanti cicli impiegherà il programma x generare il risultato.

PaVi90
04-11-2007, 18:45
No, perchè in questo modo in via del tutto teorica l'esecuzione dell'algoritmo potrebbe andare avanti all'infinito, bisogna invece usare un procedimento che passo passo in modo ordinato trova tutte le permutazioni. Con un procedimento del genere puoi anche dire a priori, data la lunghezza della parola quanti cicli impiegherà il programma x generare il risultato.
Ok grazie! :)

wingman87
04-11-2007, 19:01
Prego, comunque ho trovato gli errori x cui ti scrive sempre null + la prima lettera, te li ho segnati in rosso:
import java.io.*;
import java.math.*;
public class permutazioni {

public static void main(String[] args) throws IOException {
// Costruisce l'oggetto di accesso alla tastiera
BufferedReader input=new BufferedReader(
new InputStreamReader(System.in)
);
// TODO code application logic here
String parola="";
double x;
int p;
int i=0;
int y=0;
int flag=0;
int riempimento=0;
int k=0;

System.out.println("Inserire la parola di cui eseguire le permutazioni: ");
parola=input.readLine();
int lungh=parola.length(); //lunghezza parola di cui calcolarne il fattoriale
System.out.println(lungh);

int dim=1;
do{
dim=dim*lungh;
lungh--;
} while ((lungh-1)>0);
lungh=parola.length(); //Nel ciclo precedente avevi modificato il valore di lungh, quindi il random veniva sempre 0

String vet[] = new String [dim]; //crea il vettore di permutazioni [l'indice andrà da 0 a (dim-1) ]
vet[0]=parola;


for(i=1; i<dim; i++) {

do{
flag=0;
vet[i]=""; //Non avevi inizializzato vet[i] che inizialmente vale proprio "null"
for(y=0; y<lungh; y++){
x=Math.random();
p=(int)(x*lungh);
vet[i]=vet[i]+parola.charAt(p);
}
for (k=0; k<riempimento; k++) {
if(vet[i]==vet[k]){
flag=1;
}
}
} while (flag==1);
riempimento++;

}

System.out.println("Le permutazioni della parola inserita sono:");
for(i=0; i<dim; i++){
System.out.println(vet[i]);
}


}

}

PaVi90
04-11-2007, 19:04
Grazie mille!!!!
Solo ora, grazie a te, mi sono accorto di quegli stupidi errori.
Grazie!!!

PaVi90
04-11-2007, 19:05
Ora funziona!!!!!!!!!!!!!!!!!!