Προς το περιεχόμενο

C πρόβλημα με αναδρομή


marsel

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

έχω μια άσκηση για το μάθημα του προγραμματισμού.

Σκοπός της άσκησης είναι να γράψουμε το παιχνίδι ColorPop σε C.

Αντιμετωπίζω όμως ένα πρόβλημα με την αναδρομική συνάρτηση που σκάει τα "μπαλονάκια"

(αριθμοί στον πίνακα).

 

>
void recursiveWay(int** matrix,int row,int column,int* cntr,int* ball)

{

int number = matrix[row][column];

if(*cntr == 0);

{

	if (matrix[row+1][column] == number)

	{

		if(*cntr != 4)

		{

			*cntr = 1;

			recursiveWay(matrix, (row+1), column, cntr, ball);

			*cntr = 0;

		}

	}

	else if (matrix[row][column-1] == number)

	{

		if(*cntr != 3)

		{

			*cntr = 2;

			recursiveWay(matrix, row, (column-1), cntr, ball);

			*cntr = 0;

		}

	}

	else if (matrix[row][column+1] == number)

	{

		if(*cntr !=2)

		{			

			*cntr=3;

			recursiveWay(matrix, row, (column+1), cntr, ball);

			*cntr=0;

		}

	}

	else if (matrix[row-1][column] == number)

	{

		if(*cntr != 1)

		{

			*cntr == 4;

			recursiveWay(matrix, (row-1), column, cntr, ball);

			*cntr == 0;

		}

	}

}

matrix[row][column]=0;
ball = ball--;

deleteItem(matrix, row, column);

}

 

το ball είναι ο αριθμός των μπαλονιών που υπάρχουν κάθε φορά στον πίνακα,

αλλά δεν αλλάζει ποτέ, ενώ θα έπρεπε... μάλλον ούτε ο cntr που είναι βοηθητική μεταβλητή.

αν κάποιος εντοπίσει το λάθος παρακαλώ ας απαντήσει.

ευχαριστώ.

Δημοσ.

Το ball είναι δείκτης οπότε αντί για

 

ball = ball-- ;

 

πρέπει να γράψεις

 

*ball = *ball-- ;

 

Δηλαδή πρέπει να αλλάξεις την τιμή της μεταβλητής στην οποία δείχνει ο δείκτης και όχι το περιεχόμενο του δείκτη δηλαδή τη μεταβλητή στην οποία δείχνει.

Δημοσ.
Το ball είναι δείκτης οπότε αντί για

 

ball = ball-- ;

 

πρέπει να γράψεις

 

*ball = *ball-- ;

 

Δηλαδή πρέπει να αλλάξεις την τιμή της μεταβλητής στην οποία δείχνει ο δείκτης και όχι το περιεχόμενο του δείκτη δηλαδή τη μεταβλητή στην οποία δείχνει.

 

Ναι έχεις δίκιο ξέχασα να το αλλάξω, όταν έγραψα το άρθρο, στον κώδικα μου το έχω διορθώσει.

 

Από δοκιμές που έκανα το πρόγραμμα σκάει στο 4ο if, αλλά δεν βλέπω κάποιο λάθος.

 

>
void recursiveWay(int** matrix,int row,int column,int* cntr,int* ball)

{

int number = matrix[row][column];
int flag = *cntr;
printf("flag : %d\n",flag);

	if (*cntr !=1)

	{

		if(matrix[row-1][column] == number)

		{

			*cntr = 4;
			printf("cntr : %d\n",*cntr);

			recursiveWay(matrix, (row-1), column, cntr, ball);

			*cntr = flag;
			printf("cntr : %d\n",*cntr);

		}

	}

	if (*cntr !=3)

	{

		if(matrix[row][column-1] == number)

		{

			*cntr = 2;
			printf("cntr : %d\n",*cntr);

			recursiveWay(matrix, row, (column-1), cntr, ball);

			*cntr = flag;
			printf("cntr : %d\n",*cntr);

		}

	}

	if (*cntr !=2)

	{

		if(matrix[row][column+1] == number)

		{			

			*cntr = 3;
			printf("cntr : %d\n",*cntr);

			recursiveWay(matrix, row, (column+1), cntr, ball);

			*cntr = flag;
			printf("cntr : %d\n",*cntr);

		}

	}

	/*if (*cntr !=4)						//edw skaei

	{

		if(matrix[row+1][column] == number)

		{

			*cntr = 1;
			printf("cntr : %d\n",*cntr);

			recursiveWay(matrix, (row+1), column, cntr, ball);

			*cntr = flag;
			printf("cntr : %d\n",*cntr);

		}

	}*/

matrix[row][column]=0;
deleteItem(matrix, row, column);
*ball = (*ball-1);
printf("balloons: %d\n",(*ball));

}

 

Παραθέτω και τον διορθωμένο κώδικα ως τώρα.

Ως έχει δηλαδή χωρίς το 4ο if δουλεύει αλλά δεν κινείται προς τα κάτω,μόνο πάνω,δεξιά και αριστερά.

Δημοσ.

/*if (*cntr !=4) //edw skaei

 

{

//εδώ

if(matrix[row+1][column] == number)

 

{

 

 

για βάλε ένα

printf("\nrow+1=%d",(row+1));

πριν το if ισως να έχει τιμή μεγαλύτερη από την διάσταση του πίνακα.

Δημοσ.

Sorry αλλά δεν ξέρω το παιχνίδι colorpop. Αν θες να μας πεις λίγα παραπάνω λόγια για το πως δουλεύει η συνάρτηση σου ευχαρίστως να βοηθήσω .... Επίσης όταν λες σκάει τί ακριβώς εννοείς? Σου βγάζει κάποιο μήνυμα λάθους ?

Δημοσ.
Sorry αλλά δεν ξέρω το παιχνίδι colorpop. Αν θες να μας πεις λίγα παραπάνω λόγια για το πως δουλεύει η συνάρτηση σου ευχαρίστως να βοηθήσω .... Επίσης όταν λες σκάει τί ακριβώς εννοείς? Σου βγάζει κάποιο μήνυμα λάθους ?

 

 

-ούτε και εγώ το έχω ξανακούσει και δεν βρήκα και κάτι σχετικό σε μια πρόχειρη

αναζήτηση στο Google.Καλό θα ήταν να μας το ανάλυε λίγο καθώς και να μας έδινε και τον κώδικα που καλεί την συγκεκριμμένη συνάρτηση όπως και την δήλωση του πίνακα

που χρησιμοποιεί.

 

-όσον αφορά τώρα το <<σκάει εδώ>>,είναι κλασικό πρόβλημα αρχαρίου!

δεν ξέρουν να απομονώσουν την επίμαχη εντολή που προκαλεί το πρόβλημα πόσο μάλλον να το λύσουν.Γι αυτό σου λέει σκάει εδώ κάπου μέσα στον βρόγχο

του if.

 

 

-Ωστόσο υποπτεύομαι όμως από τον κώδικα που έστειλε ότι πρόκειται για υπέρβαση των ορίων του πίνακα,αφού δεν τα ελέγχει κάπου.

Δημοσ.

-Ωστόσο υποπτεύομαι όμως από τον κώδικα που έστειλε ότι πρόκειται για υπέρβαση των ορίων του πίνακα,αφού δεν τα ελέγχει κάπου.

 

Λογικά τους ελέγχους θα τους έχει στην main() αλλά ποτέ δεν ξέρεις ...

Δημοσ.
Λογικά τους ελέγχους θα τους έχει στην main() αλλά ποτέ δεν ξέρεις ...

 

όταν μέσα στην συνάρτηση έχει αυτό

...........

if(matrix[row+1][column] == number)

.............

 

δεν θα πρέπει πρώτα να εξασφαλίσει ότι υπάρχει?

 

αν π.χ.

.........

int matrix[10][10];

matrix[20][5]=5; //δεν θα βγάλει λάθος?

........

 

αυτό εννοώ.

Δημοσ.
if(*cntr !=2)

 

{

 

*cntr=3;

 

recursiveWay(matrix, row, (column+1), cntr, ball);

 

*cntr=0;

 

}

 

}

 

else if (matrix[row-1][column] == number)

 

{

 

if(*cntr != 1)

 

{

 

*cntr == 4;

 

recursiveWay(matrix, (row-1), column, cntr, ball);

 

δεν είμαι προγραμματιστής

 

.

Δημοσ.
if(*cntr !=2)

 

{

 

*cntr=3;

 

recursiveWay(matrix, row, (column+1), cntr, ball);

 

*cntr=0;

 

}

 

}

 

else if (matrix[row-1][column] == number)

 

{

 

if(*cntr != 1)

 

{

 

*cntr == 4;

 

recursiveWay(matrix, (row-1), column, cntr, ball);

 

δεν είμαι προγραμματιστής

 

.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...