Funzione di controllo

damianormaximus
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:

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
damianormaximus
il codice non è venuto indentato!!

apatriarca
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
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.

damianormaximus
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?

apatriarca
Se anche restituisse il risultato corretto, non è una buona idea utilizzarlo. Il metodo corretto è quello di passare la dimensione come argomento.

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