PDA

View Full Version : correzione programma in C


mikael_c
09-07-2013, 08:12
ho scritto questa semplice permutazione però non mi funziona perchè manca qualcosa nel codice e non sono molto pratico di C. mia aiutate a farlo funzionare???

#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

/*genera tutte le permutazioni sui valori 0,1,...,n-1,
inizialmente k = -1 e val[i] = 0, per 0=i<n.
prec: vett != NULL && val != NULL;
*postc: stampa a video tutte le permutazioni su 0,1,...,n-1, memorizzate in vett.*/

//vett=un parametro di tipo vettore,di interi per la permutazione//
//n= Un parametro di tipo intero per la lunghezza del vettore vett//
//k=un parametro di tipo intero per la posizione corrente nella permutazione//
//val=un parametro di tipo vettore di interi per i valori già usati//

void genTPerm(int *vett,int k,int *val,unsigned int n){
int i;
if (k == n - 1){
stampaVett(vett,n);
}else{

for(i=0;i<n;i++){
if (val[i] == 0){
vett[k+1] = i;
val[i] = 1;
genTPerm(vett,k+1,val,n);
val[i] = 0;
}
}
}
}


int main(void){
int i;
int vett[i];


genTPerm(vett,-1,0, 3);

}

sottovento
10-07-2013, 08:51
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

/*genera tutte le permutazioni sui valori 0,1,...,n-1, inizialmente k = -1 e val[i] = 0, per 0=i<n.
prec: vett != NULL && val != NULL;
*postc: stampa a video tutte le permutazioni su 0,1,...,n-1, memorizzate in vett.*/

//vett=un parametro di tipo vettore,di interi per la permutazione//
//n= Un parametro di tipo intero per la lunghezza del vettore vett//
//k=un parametro di tipo intero per la posizione corrente nella permutazione//
//val=un parametro di tipo vettore di interi per i valori già usati//

void stampaVett(int *vett, int n)
{
for (int i = 0; i < n; i++)
{
printf ("%d ", vett[i]);
}
printf("\n");
}

void genTPerm(int *vett,int k,int *val, int n)
{
int i;
if (k == n - 1)
{
stampaVett(vett,n);
}
else
{
for(i=0; i<n; i++)
{
if (val[i] == 0)
{
vett[k+1] = i;
val[i] = 1;
genTPerm(vett,k+1,val,n);
val[i] = 0;
}
}
}
}


int main(void)
{
int vett[5];
int val[5] = {0, 0, 0, 0, 0};


genTPerm(vett,-1, val, 5);
printf ("Fine permutazioni\n");

}



Comunque si puo' migliorare...

mikael_c
11-07-2013, 09:19
come faccio a farlo funzionare se scritto in questo modo:
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

/* Correzione */

/*
VARIABILI GLOBALI:
n
nChr = numero di permutazioni alcolate (inizialmente 0)
Chr = permutazione
Chr1 = permutazione inversa (Chr1[i] = n equivale ad elemento di permutazione non definito
(se Chr[i]=j, allora Chr1[i]=j)
Succ = risposta della procedura genTPerm (inizialmente 1)
*/

void genTPerm(int k)
{
int i;

if(k>n-1)
{
stampaVett(Chr);
/* verifica se la soluzione trovata è un ciclo: se si succ=1 e termina genTPerm */
nChr++;
if(nChr>n*n)
{Succ=0;
/* Termina la procedura ricorsiva */
}
}
else
for(i=0;i<n;i++)
{if(Chr1[i]==n)
{Chr[k]=i;
Chr1[i]=k;
genTPerm(k+1);
Chr1[i]=n;
Chr[k]=n;
}
}
}
}
int main(){
}

mikael_c
11-07-2013, 15:40
ho provato ad aggiustare la prima parte del codice viene eseguito però secondo me è sballato ho fatto qualche errore nelle variabili globali e nel main ed inoltre manca (/* verifica se la soluzione trovata è un ciclo: se si succ=1 e termina genTPerm */).
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

/* Correzione */

/*
VARIABILI GLOBALI:
n
nChr = numero di permutazioni alcolate (inizialmente 0)
Chr = permutazione
Chr1 = permutazione inversa (Chr1[i] = n equivale ad elemento di permutazione non definito
(se Chr[i]=j, allora Chr1[i]=j)
Succ = risposta della procedura genTPerm (inizialmente 1)
*/
int Chr[2];
int Chr1[2];
int nChr=0;
int Succ=1;
int n;

void genTPerm(int k)
{
int i;

if(k>n-1)
{
printf("%d",Chr);
printf("\n");
/* verifica se la soluzione trovata è un ciclo: se si succ=1 e termina genTPerm */
nChr++;
if(nChr>n*n)
{
Succ=0;
return ;
}
}
else
for(i=0;i<n;i++)
{if(Chr1[i]==n)
{Chr[k]=i;
Chr1[i]=k;
genTPerm(k+1);
Chr1[i]=n;
Chr[k]=n;
}
}
}

int main(){

genTPerm(2);

return 0;
}