Programmino in C
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??
di trovare cicli di lunghezza massima. Come devo fare ?? dove posso prendere dei spunti??
Risposte
le devo stampare per il momento
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..
per quello mi serve una mano,perchè non mi trovo
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.
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); }
Infatti non hai definito la funzione stampaVett.. ma l'hai usata nella funzione genTPerm. Ma l'altro codice che problemi aveva? Mi sembrava migliore..
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.
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; } }
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; }
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) { .. }
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; }
come va fatto precisamente???
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; } }
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; }
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???
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 */ }
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.
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.
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
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
come faccio a far stampare la permutazione correttamente????
ho risolto. però come posso modificare la procedura genTperm() in modo da generare le permutazioni solo sui prossimi vertici adiacenti??