|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Apr 2006
Messaggi: 2
|
[C] Aiuto!! uno strano comportamento per una istruzione condizionale
Ciao a tutti.
Sono nuovo di questo forum e non so se posso postare programmi interi. Nel caso ho riscontrato un problema curioso in questo programma in C. Brevemente, quello che fa è generare tutte le permutazioni di {1,2,3,4,5,6,7,8,9,10} e verificare su ogni permutazione due condizioni: whist1 e whist2. Se la permutazione soddisfa entrambe la printa, altrimenti non fa nulla. Premetto che il programma per generare permutazioni l'ho scaricato da internet e funziona benissimo. Ho solo aggiunto i test da fare. Ora, il problema sorge nel passo della funzione perm if( whist1(permutazione) && whist2(permutazione)) printf(permutazione); else 'continua a generare la prossima permutazione'; L'espressione condizionale if si comporta in maniera strana: se la scrivo come sopra, ottengo anche permutazioni che soddifano whist1 ma non soddisfano whist2. Nota bene che whist1 e' sempre soddisfatta, ma a volte whist2 no e NON ottengo tutte le permutazioni che soddisfano la sola whist1, quindi qualche volta whist2 viene controllata. Se invece inverto l'ordine di controllo nell'espressione condizionale, facendo testare prima whist2 di whist1: if( whist2(permutazione) && whist1(permutazione))..... ottengo permutazioni che in effetti soddisfano entrambe le condizioni. Com'è possibile? Premetto che whist1 è il test più veloce da effettuare e quindi preferirei testarlo per primo, visto che poi avro' bisogno di far girare il programma su numeri grossi (e non su solo 10 numeri). Inoltre whist1 e whist2 funzionano a dovere se isolati dal ciclo che genera permutazioni, quindi il problema non dovrebbe essere li. Vi posto il codice nella speranza che qualcuno abbia la pazienza di scoprire dove sta il problema. L'ho (forse troppo!) commentato per agevolare la lettura. Codice:
/*
* Un test sulle differenze fra gli elementi delle permutazioni di una stringa
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DIM 10
#define MOD 11
#define TWICEDIM 20
/*DEFINISCO I DUE TEST*/
/* mod (ausiliaria) fonisce il resto della divisione per MOD*/
int mod(int dividendo)
{
Ultima modifica di sunra : 09-04-2006 alle 15:30. Motivo: INDENTAZIONE CODICE |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ciao, innanzitutto non credo che ci siano problemi a postare sorgenti interi, purché, penso, non siano delle cose di lunghezza spropositata! Inoltre, per rendere il sorgente più leggibile, ti conviene indentare correttamente il codice e postarlo all'interno del marcatore [CODE][/code].
Veniamo al tuo sorgente. Io lo sto verificando adesso e pur non conoscendo nei dettagli il funzionamento e il suo obiettivo finale, ho già trovato una cosa che non va. Nel sorgente usi degli array di char di lunghezza DIM (costante che vale 10). Tu usi tutti i 10 caratteri dell'array. In alcuni punti del sorgente, usi la funzione strlen per ottenere la lunghezza di una stringa. Occhio!! Perché facendo così le tue stringhe non sono terminate dal carattere nullo!!! Sto debuggando il tuo programma e, ad esempio, nella funzione remchr la lunghezza di str mi risulta di 41. Ma potrebbe essere qualunque altro valore perché le tue stringhe non sono correttamente terminate!!!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Apr 2006
Messaggi: 2
|
Ciao e grazie per la risposta innanzitutto.
Probabilmente il problema sta tutto in quello che dici tu, in effetti forse sarebbe meglio lavorare con stringhe di lunghezza fissata, mettiamo di 50 char e ogni volta settare un '\0' al punto giusto. Il problema e' che il codice che genera le permutazioni non lo capisco tanto bene, non sono un programmatore di lungo corso ed e' la prima volta che uso funzioni ricorsive. In particolare ero tentato di riscrivere il programma in una forma piu' adatta ai miei gusti, usando stringhe di lunghezza fissata invece di puntatori. Solo mi preoccupa un po' la funzione free( ), che non conosco anche se ne intuisco la funzione. Provero' a fare degli esperimenti, vediamo cosa succede... Ciao |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
A proposito, ma sei sicuro che il codice per le permutazioni funzioni?
Tempo fa, ho utilizzato il codice presentato qui. Un possibile esempio con l'algoritmo di Bogomolyn: Codice:
#include <stdio.h>
#include <string.h>
#define DIM 10
int Indici[DIM];
char Stringa[DIM+1];
void print()
{
char tmp[DIM+1];
int i;
for (i = 0; i < DIM; ++i)
tmp[i] = Stringa[Indici[i]-1];
tmp[DIM] = '\0';
puts(tmp);
}
void visit(int k)
{
static int level = -1;
Indici[k] = ++level;
if (level == DIM)
print();
else {
int i;
for (i = 0; i < DIM; i++)
if (Indici[i] == 0)
visit(i);
}
--level;
Indici[k] = 0;
}
int main(void)
{
int i;
strcpy(Stringa, "prosciutto");
for (i = 0; i < DIM; i++) {
Indici[i] = 0;
}
visit(0);
return 0;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:31.



















