PDA

Visualizza la versione completa : [C] Controllo elementi consecutivi nella matrice


JErikaM
12-01-2012, 17:53
Buonasera a tutti :)
Ringrazio di nuovo per l'aiuto ricevuto nel problema di ricerca di un valore in array di liste :)

Mi trovo ora ad affrontare un altro problema che sti cercando di risolvere da quasi tutto il pomeriggio...
il mio scopo è quello di controllare se 4 elementi consecutivi orizzontalmente, siano uguali, e in tal caso, stampare a video se è vero o no...

Questo è il codice


int controllo_orizz(int griglia[6][6])
{
int giusto = 0;
int i;
int j;
for(i=0;i<5;i++)
{
for(j=0;j<2;j++) //2 è perchè basta controllare 2 volte iniziando dalla prima e seconda cella
{
if(griglia[i][j] == 'X' || griglia[i][j] == 'O')
{
if(griglia[i][j] == griglia[i][j+1])
{
if(griglia[i][j+1] == griglia[i][j+2])
{
if(griglia[i][j+2] == griglia[i][j+3])
{
printf("i 4 elementi sono consecutivi\n\n");
giusto++;
}
}
}
}
}
}
return giusto;
}

il mio problema è che gli elementi NON risultano mai consecutivi, neanche quando io li metto di proposito consecutivi..
quello che ho voluto "dire" al programma attraverso il mio codice è di controllare che l'elemento consecutivo (della stessa riga ma colonna successiva) sia uguale al primo.... tuttavia questo codice non mi va...
:messner:

Sapete darmi delle dritte?
Grazie infinite

web_pirate
12-01-2012, 18:45
Gli indici del vettore vanno da 0 a 5. Se tu nel primo for() metti i=0;i<5; i assumerà i valori da 0 a 4, escluso il 5. E' il primo errore che mi salta all'occhio, ma non so se è quello "giusto". :D Prova a mettere i<=5 o i<6 e vedi come va...

JErikaM
12-01-2012, 18:50
Originariamente inviato da web_pirate
Gli indici del vettore vanno da 0 a 5. Se tu nel primo for() metti i=0;i<5; i assumerà i valori da 0 a 4, escluso il 5. E' il primo errore che mi salta all'occhio, ma non so se è quello "giusto". :D Prova a mettere i<=5 o i<6 e vedi come va...

purtroppo non è quello l'errore :( comunque grazie :)

web_pirate
12-01-2012, 19:01
Aspetta un attimo... Il vettore che hai tu è di int. Quindi non potresti mai leggere una X da esso, né se nell'if metti griglia[i][j]=='0' sarà mai uguale, perché mettendo lo 0 tra apici, diventa anch'esso un carattere e l'if dovrebbe constatare se griglia[i][j], che è int, è uguale a un carattere di tipo char, quindi questa condizione non sarà mai vera... Prova a togliere gli apici dallo 0 e dovrebbe funzionare laddove ci sono 4 zeri consecutivi, ma comunque non 4 X.

JErikaM
12-01-2012, 19:06
Originariamente inviato da web_pirate
Aspetta un attimo... Il vettore che hai tu è di int. Quindi non potresti mai leggere una X da esso, né se nell'if metti griglia[i][j]=='0' sarà mai uguale, perché mettendo lo 0 tra apici, diventa anch'esso un carattere e l'if dovrebbe constatare se griglia[i][j], che è int, è uguale a un carattere di tipo char, quindi questa condizione non sarà mai vera... Prova a togliere gli apici dallo 0 e dovrebbe funzionare laddove ci sono 4 zeri consecutivi, ma comunque non 4 X.

grandissimo!! hai proprio ragione!
sono sempre abituata ad usare INT per tutto...nel senso che la maggior parte delle cose che uso sono int int int...e il char non mi capita quasi mai di usarlo...per cui me lo scordo!!
grazie davvero!
odiosi errorucci!

provo a modificare e spero non incappino altri problemi!

web_pirate
12-01-2012, 19:11
Prego... :ciauz:

JErikaM
12-01-2012, 19:43
ho modificato il codice mettendo <6 nel primo for e char al posto di int...
ma c'è un altro problema...

se nella mia griglia faccio 4 elementi consecutivi a partire dalla prima cella mi dice giustamente che i 4 el sono consecutivi, se invece gli elementi consecutivi sono a partire dalla seconda cella, non mi dice niente..ma mi fa andare avanti con l'inserimento degli elementi ç_ç


MODIFICA ore 20.40
sono riuscita a risolvere il problema :unz:
tuttavia non riesco ancora a fare una cosa (grrr)
io vorrei passare il valore che prende GIUSTO (che dovrebbe incrementarsi a 1 in seguito al fatto che i 4 elementi sono consecutivi) ad una variabile nel main del programma.....


conteggio = controllo_orizz(griglia);

vorrei che il valore 1 andasse a conteggioche mi serve per farmi uscire dal programma...
ovviamente conteggio l'ho dichiarato come INT

ma non passa alcun valore..
e giusto dentro la funzione è incrementato correttamente (ho controllato con un printf)

web_pirate
12-01-2012, 20:56
La funzione controllo_orizz ti ritorna il numero di serie trovate.. Non ho comunque ben capito cosa vuoi dire?

JErikaM
12-01-2012, 21:01
All'interno del MAIN io ho

if(conteggio == 1)
{
printf("\n vuoi inserire ancora simboli? \n (s: SI' / n: NO): "); fflush(stdin);
scanf("%c", &programma); //per prendere la scelta dell'utente
if(programma == 'n')
{
exit(0);
}
}

e quindi ho bisogno di avere conteggio = 1 non appena ho controllato il fatto di avere 4 elementi consecutivi..così da poter scegliere di ripartire con il programma o uscire da questo...

web_pirate
15-01-2012, 22:12
Se alla variabile conteggio tu assegni il valore di ritorno di controllo_orizz, avrai un valore compreso da 0 a 6(al minimo non hai nessuna serie nella matrice, al massimo ne hai sei). Se vuoi fare in modo che il programma richieda un nuovo carattere da ricercare nella stringa all'utente nell'if devi porre conteggio come > 0.

ma non passa alcun valore..
e giusto dentro la funzione è incrementato correttamente (ho controllato con un printf)
Hai controllato la variabile conteggio dopo averle assegnato il valore di ritorno della funzione controllo_orizz? Oppure hai soltanto controllato l'incremento della variabile "giusto" all'interno della stessa funzione? Perché il problema può essere, come ho detto sopra, che il tuo controllo(if(conteggio == 1)) sia falso nel momento in cui all'interno della matrice ci sono più di una sola serie. Prova a mettere if(conteggio>0) e vedi come va...

Loading