Funzione di controllo
Salve a tutti sto facendo un progetto per il corso di informatica.
Il testo del progetto è questo:
http://web.math.unifi.it/users/bernini/ ... 4_2015.pdf
Praticamente devo inizializzare un vettore che contenga le ordinate dei punti del cammino di Dyck.
Ad esempio:
(0,1,2,1,0) è un cammino di Dyck
mentre (0,1,2,1,2) non lo è
e neanche (0,1,0,-1,0) e neanche (0,2,1,0,1) (l'ultimo non lo è per due motivi)
In pratica devo avere un vettore di dimensione dispari (in modo che gli intervalli siano pari)
che comincia con zero e finisce con zero, la differenza tra due componenti successive deve essere più o meno 1,
e tutte le componenti devono essere positive (maggiori o uguali a zero).
A questo punto ho fatto una funzione di controllo che mi dica se il vettore inserito è buono oppure no.
Ecco il problema, il codice che ho scritto è questo:
Non riesco a capire cosa non vada a volte fa altre no:
se inserisco (0,-1,0,1,0) mi restituisce 0 e va bene perchè il vettore ha una componente negativa,
se inserisco (0,1,2,3,4) mi restituisce 0 e va bene perchè l'ultima componente del vettore non è nulla,
invece
se inserisco (0,1,0,-1,0) mi restituisce 1 e NON VA BENE perchè c'è una componente negativa (ma non se ne accorge)
e ancora
se inserisco (0,1,0,-1,-2) mi restituisce 1 e VA MALISSIMO perchè due componenti sono negative e inoltre l'ultima non è zero
Se qualcuno riesce a darmi una mano lo ringrazierò di cuore.
Un saluto.
Il testo del progetto è questo:
http://web.math.unifi.it/users/bernini/ ... 4_2015.pdf
Praticamente devo inizializzare un vettore che contenga le ordinate dei punti del cammino di Dyck.
Ad esempio:
(0,1,2,1,0) è un cammino di Dyck
mentre (0,1,2,1,2) non lo è
e neanche (0,1,0,-1,0) e neanche (0,2,1,0,1) (l'ultimo non lo è per due motivi)
In pratica devo avere un vettore di dimensione dispari (in modo che gli intervalli siano pari)
che comincia con zero e finisce con zero, la differenza tra due componenti successive deve essere più o meno 1,
e tutte le componenti devono essere positive (maggiori o uguali a zero).
A questo punto ho fatto una funzione di controllo che mi dica se il vettore inserito è buono oppure no.
Ecco il problema, il codice che ho scritto è questo:
int CONTROL(int v[]){ int l=1; int i=0; int dim=sizeof(v)/sizeof(v[0]); if(v[0]==0){ for(i=1;i<=dim;i++){ if(v[i]>=0){ l=abs(v[i]-v[i-1]); if(l!=1) return 0; l=0; } else return 0; } } else return 0; if (v[dim]!=0) return 0; return 1; }
Non riesco a capire cosa non vada a volte fa altre no:
se inserisco (0,-1,0,1,0) mi restituisce 0 e va bene perchè il vettore ha una componente negativa,
se inserisco (0,1,2,3,4) mi restituisce 0 e va bene perchè l'ultima componente del vettore non è nulla,
invece
se inserisco (0,1,0,-1,0) mi restituisce 1 e NON VA BENE perchè c'è una componente negativa (ma non se ne accorge)
e ancora
se inserisco (0,1,0,-1,-2) mi restituisce 1 e VA MALISSIMO perchè due componenti sono negative e inoltre l'ultima non è zero
Se qualcuno riesce a darmi una mano lo ringrazierò di cuore.
Un saluto.
Risposte
il codice non è venuto indentato!!
NdM: Ti ho modificato il codice in modo che sia indentato. Per indentarlo lo devi inserire tra tag code (cioè scrivere [ code ] e [ /code ] senza spazi intorno al codice).
Una prima cosa che noto è l'uso di
per ottenere la dimensione dell'array passato come argomento. Sfortunatamente in C non è così facile ottenere la dimensione di un array. Un array passato come argomento è convertito in un puntatore e quindi sizeof(v) sarà semplicemente 4 o 8 a seconda del tipo di architettura. Quell'espressione non restituirà quindi la dimensione corretta. È quindi necessario passare la dimensione come argomento alla funzione. Cioè:
Un secondo errore è il for interno alla selezione:
gli indici in C vanno da 0 a dim-1. Il codice che hai scritto leggerà valori oltre il termine dell'array. Lo stesso discorso vale per l'uso di v[ dim ] alla fine del codice.
Direi che a parte questi errori, l'idea dietro al codice è corretta.
Una prima cosa che noto è l'uso di
sizeof(v)/sizeof(v[0]);
per ottenere la dimensione dell'array passato come argomento. Sfortunatamente in C non è così facile ottenere la dimensione di un array. Un array passato come argomento è convertito in un puntatore e quindi sizeof(v) sarà semplicemente 4 o 8 a seconda del tipo di architettura. Quell'espressione non restituirà quindi la dimensione corretta. È quindi necessario passare la dimensione come argomento alla funzione. Cioè:
int CONTROL(int dim, int v[])
Un secondo errore è il for interno alla selezione:
for(i=1;i<=dim;i++){
gli indici in C vanno da 0 a dim-1. Il codice che hai scritto leggerà valori oltre il termine dell'array. Lo stesso discorso vale per l'uso di v[ dim ] alla fine del codice.
Direi che a parte questi errori, l'idea dietro al codice è corretta.
Ok grazie
Per quanto riguarda:
sizeof(v)/sizeof(v[0]);
Ora sto usando DEV-C++5.11 e mi restituisce il valore esatto, è a causa del programma particolare o magari altro?
Per quanto riguarda:
sizeof(v)/sizeof(v[0]);
Ora sto usando DEV-C++5.11 e mi restituisce il valore esatto, è a causa del programma particolare o magari altro?
Se anche restituisse il risultato corretto, non è una buona idea utilizzarlo. Il metodo corretto è quello di passare la dimensione come argomento.