Programmino in C

mikael2
devo scrivere un programmino in C che genera un grafo p-casuale e ne enumera i vertici ricorsivamente al fine
di trovare cicli di lunghezza massima. Come devo fare ?? dove posso prendere dei spunti??

Risposte
mikael2
le devo stampare per il momento

apatriarca
Ma allora cosa c'è che non va bene dei codici che hai postato? Non hanno nulla a che fare con il codice precedente per cui puoi semplicemente unire i due codici insieme senza problemi..

mikael2
per quello mi serve una mano,perchè non mi trovo

apatriarca
Ma devi semplicemente copiare il codice di uno dei due nel file dell'altro. Devi poi mettere insieme il codice dei due main insieme scrivendo quello di uno dei due sotto l'altro.. Immagino che ci possano poi essere errori di compilazione, ma immagina a fare quello. Se hai già provato a fare qualcosa per metterli insieme comunque, prova a postare il codice così vedo che cosa c'è che non va.

mikael2
mi da errore su stampaVett:undefined reference to 'StampaVett'

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 *vett,k, *val, n;
  

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

apatriarca
Infatti non hai definito la funzione stampaVett.. ma l'hai usata nella funzione genTPerm. Ma l'altro codice che problemi aveva? Mi sembrava migliore..

mikael2
nessuno per il prof era troppo complicato, ho fatto una versione più semplice speriamo che vada bene. se la metto nel main cmq da errore:undefinided reference.

mikael2
sotto ho linkato il codice come lo vuole il prof.Mi serve una mano ad aggiustarlo in modo che funzioni
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;
       }
      }
    }
}


/*

DEVI SCRIVERE UN MAIN() DEL TIPO:

 for n
  for h /* h TIENE CONTO DEL NUMERO DI GRAFI G GENERATI SU CUI CALCOLARE LE STATISTICHE */
   {p=1/2;supp=1;infp=0;
    flag=1;
    while(flag)
     {GENERA GRAFO p-CASUALE G CON N VERTICI;
      genTPerm(0);
      if(succ==0)
       {infp=p;p=(supp+p)/2;}
      else 
       {supp=p;p=(p+infp)/2;}
      if(abs(infp-supp)<.05) flag=0;
      media[n]=media[n]+supp;
      }
  }

mikael2
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;
     }

apatriarca
Non c'è alcuna ragione di usare delle variabili globali per fare quello che desideri. Per esempio, Succ è in pratica definito come il valore di ritorno di getTPerm, ma allora perché stai usando una variabile globale invece di usare i normali meccanismi per restituire valori da una funzione. Se la funzione getTPerm deve restituire un valore interno, allora il suo valore di ritorno deve essere int e ci dovrà essere qualcosa come return 0; oppure return 1; nel corpo della funzione! Perché Chr e Chr1 sono array monodimensionali di lunghezza due? Che succederebbe se volessi calcolare due permutazioni indipendenti? Forse non è il caso in questo codice, ma non è di certo il modo di scrivere una funzione. Passa tutto attraverso argomenti e Succ come valore di ritorno. Per cui devi avere qualcosa come
int genTPerm(int perm[], int invPerm[], int n, nChr) { .. }

mikael2
cosi mi è stato scritto dal prof. è possibile farlo funzionare secondo i suoi parametri?? ho provato a farlo mi controlli sia il main perchè non ho capito come impostare i parametri e sia la procedura.
int genTPerm(int perm[], int invPerm[], int n,int nChr)
 {
  int i;
  
  if(k>n-1)
   {
 	for ( i = 0; i<n; i++)
	{
		printf ("%d ", perm[i]);
	}
	printf("\n");
    
    nChr++;
    Succ=1;
    return 1;
    if(nChr>n*n)
     {
       Succ=0;
       return 0 ;
     }
   }
  else
   for(i=0;i<n;i++)
    {if(invPerm[i]==n)
      {perm[k]=i;
       invPerm[i]=k;
       genTPerm(k+1);
       invPerm[i]=n;
       perm[k]=n;
       }
      }
    }



int  main(){
  
  int i, k,n;
 
genTPerm();
 
   return 0;
     }

mikael2
come va fatto precisamente???

mikael2
e come faccio a sviluppare il codice con un main di questo tipo???
for n
  for h /* h TIENE CONTO DEL NUMERO DI GRAFI G GENERATI SU CUI CALCOLARE LE STATISTICHE */
   {p=1/2;supp=1;infp=0;
    flag=1;
    while(flag)
     {GENERA GRAFO p-CASUALE G CON N VERTICI;
      genTPerm(0);
      if(succ==0)
       {infp=p;p=(supp+p)/2;}
      else 
       {supp=p;p=(p+infp)/2;}
      if(abs(infp-supp)<.05) flag=0;
      media[n]=media[n]+supp;
      }
  }

apatriarca
Il tuo main dovrebbe essere qualcosa come quello che segue. In questo caso ho messo i limiti entro cui prendere n e h come costanti, ma puoi anche definirli diversamente.
#define N0 /* mettici il valore che ti interessa.. */ 
#define N /* mettici il valore che ti interessa.. */
#define H0 /* mettici il valore che ti interessa.. */ 
#define H /* mettici il valore che ti interessa.. */

/* ... */

int main(void)
{
    int n = N0;
    double[N] = {0};
    for ( ; n < N; ++n) {
        int h = H0;
        for ( ; h < H; ++h) {
            double p = 0.5, supp = 1.0, infp = 0.0;
            int flag = 1;
            while (flag) {
                int m[N][N] = { 0 };
                generaGrafo(m, n, p);
                int succ = genTPerm(/*..quello che ti avevo scritto di dover passare qui o solo il numero se preferisci .. */
                if (succ == 0) { infp = p; p = 0.5*(supp + p); }
                else { supp = p; p = 0.5*(p + infp); }
                if (fabs(infp - supp) < .05) { flag = 0; }
                media[n] += supp;
            }
        }
    }
    return 0;
}

mikael2
la procedura genTperm la vuole nel seguente modo,il codice viene eseguito però non stampa nessun valore, dove è l'errore??
secondo me quel return va cambiato oppure manca qualche inizializzazione di qualche variabile.puoi dare una controllata???
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

/*
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[100];  /* vettore soluzione (permutazione) */
int Chr1[100]; /* soluzione inversa */
int nChr=0;    /* numero soluzioni costruite dalla procedura esaustiva */
int Succ=1;    /* flag che indica il successo della procedura esaustiva */
int n;	       /* numero vertici digrafi */
 
/* procedura di inizializzazione dei vettori soluzione (Chr[] e Chr1[]) */

void initChr()
 {
  int i=0;

  for(i=0;i<n;i++)
   {Chr[i]=n;
    Chr1[i]=n;
   }
 }

/* procedura di stampa di Chr[] */

void stampaVett()
 {
  int i=0;

  for(i=0;i<n;i++)
   printf ("%d ",Chr[i]);
  printf("\n");
 }

/* procedura esaustiva di calcolo soluzioni */

void genTPerm(int k)
 {
  int i=0;
  
  if(k>(n-1))
   {
    stampaVett();

    /* verifica se la soluzione trovata è un ciclo: se si succ=1 e termina genTPerm */
    
    nChr++;
    if(nChr>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;
      }
    }
 }

/* programma principale */

int  main(void)
 {
  
  int i=0, k=0;
  
/* inizializza variabili, vettori e strutture dati */

  nChr = 0;
  initChr(); /* procedura che inizializza Chr e Chr1 */
  genTPerm(6); /* procedura esaustiva per il calcolo di soluzioni */
 
  }

apatriarca
In questo momento sono al lavoro e poi parto per gli USA per una decina di giorni.. Non credo di riuscire ad aiutarti più di tanto. In questo caso l'errore è comunque probabilmente che non hai inizializzato \(n\) per cui parte con un valore del tutto casuale..

Il mio consiglio è quello di imparare ad usare il debugger.. e probabilmente imparare qualcosa di più del linguaggio. Non capisco come mai il tuo professore pretenda che il codice sia strutturato in questo modo. Non credo sia un buon modo per implementarlo.. Impedisce ad esempio la possibilità di modificare un giorno il codice per lavorare in parallelo su più \(n\) in contemporanea.

mikael2
scusami ancora se ti disturbo, volevo risolvere solo questo problema
ho messo n=4 è stampa: 4 4 4 4 è normale??? tipo per n=7 stampa:
7 7 7 7 7 7 0
7 7 7 7 7 7 1
7 7 7 7 7 7 2
7 7 7 7 7 7 3
7 7 7 7 7 7 4
7 7 7 7 7 7 5
7 7 7 7 7 7 6

mikael2
come faccio a far stampare la permutazione correttamente????

mikael2
ho risolto. però come posso modificare la procedura genTperm() in modo da generare le permutazioni solo sui prossimi vertici adiacenti??

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.