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

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

Δημοσ.

Καλησπέρα σας παιδιά, 

Θέλω να γεμίσω ένα μονοδιάστατο πίνακα 5 κελιών με αριθμούς τους αριθμούς 0,1,2,3,4(δηλαδή να μη υπάρχει σε δύο κελιά ίδιος αριθμός) 

Το κομμάτι του κώδικα είναι παρακάτω...μου εμφανίζει όμως συνέχεια τους ίδιους αριθμούς με την ίδια σειρά :(  Τι μαλακία κάνω; 


#include <stdio.h>

#include <time.h>
int board[5],i,j,flag,temp;
int main()
{
  
board[0]=rand()%4;

    for (i=1;i<=4;i++)

    {
        
     
   
        do
       {   
           flag=0;
             temp=rand()%4;            
             for (j=0;j==i;j++)
             {
                 if (temp==board[j])
                 {
                     
                     flag=1;
                     break;
                 }
                  
             }   
               
        }
        while(flag==1);     
        board[i]=temp;
        
           }
     for (i=0;i<=4;i++)
     {
     printf("%d\n",board[i]);
     }
     system ("PAUSE")
}

 

Ακόμη θέλω να εμφανίσω από δομή και δε εμφανίζει αυτό που έχω αποθηκεύσει, εμφανίζει αυτό στη συνημμένη εικόνα.

  

post-214449-0-22453000-1360420436_thumb.png

Δημοσ.

Όχι δεν ισχύει το i είναι δείκτης που σου υποδηλώνει πόσα στοιχεία έχουν εισαχθεί ενώ το j σου υποδηλώνει πόσα πρέπει να κάνω έλεγχο για την εύρεση διπλοστοιχείων

Δημοσ.

μου φαίνεται δε ξέρεις τι κάνει το for loop

 

for (j=0;j<i;j++){

'Kwdikas'
}

 

j=0, οσο j<i τρεξε το 'Kwdikas' και αύξησε το j κατα ένα.

 

Αμά το αλλάξεις τι σφάλμα σου βγάζει? 

Δημοσ.

Καλά μεγάλη μαλακία-κόλλημα μου... Σορρυ

 

Μετά τρέχει αλλά φαίνεται σαν να υπάρχει ατέρμων βρόγχος...

Δημοσ.

Το κανείς "λίγο ανάποδα" φίλε...

Μια καλή ιδέα θα ήταν να γεμίζεις τον πίνακα με {0, 1, 2, 3, 4} και μετά να κάνει swap το κάθε στοιχείο με ένα άλλο τυχαίο. (κάπως έτσι δουλεύει νομίζω και η Collections.shuffle() της java)

  • Like 1
Δημοσ.

Ένας άλλος τρόπος για σχετικά "αμερόληπτο" ανακάτεμα .

 

Οι 5 αριθμοί έχουν 5!=120 συνδυασμούς.  

α) διάλεξε έναν τυχαίο αριθμό  0 - 119 δλδ rand()%120

β) βάλε στον πίνακα τον συνδυασμό που αντιστοιχεί σε αυτό το νούμερο.

 

Tο n! πρέπει να χωράει σε int η long  (να μην έχεις πολλά κελιά )

 

Για το β) δεν χρειάζεται να απαριθμήσεις ένα-ένα τους συνδυασμούς .

δες και εδώ  http://projecteuler.net/problem=24

Δημοσ.

Ένας άλλος τρόπος για σχετικά "αμερόληπτο" ανακάτεμα .

 

Οι 5 αριθμοί έχουν 5!=120 συνδυασμούς.  

α) διάλεξε έναν τυχαίο αριθμό  0 - 119 δλδ rand()%120

β) βάλε στον πίνακα τον συνδυασμό που αντιστοιχεί σε αυτό το νούμερο.

 

Tο n! πρέπει να χωράει σε int η long  (να μην έχεις πολλά κελιά )

 

Για το β) δεν χρειάζεται να απαριθμήσεις ένα-ένα τους συνδυασμούς .

δες και εδώ  http://projecteuler.net/problem=24

Σαν ιδεα ειναι καλο, αλλα σαν υλοποιηση καπως περιπλοκο, εκτος αν κανεις "καταχρηση" του %

Δημοσ.

Ας βάλω και εγώ κώδικα από αντίστοιχο θέμα (shuffle)..

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define BOARDSIZE 10

void swap(int *, int *);
void populateBoard(int *, int);
void shuffleBoard(int *, int);
void printBoard(int *, int);
int continueOrStop(void);

int main(int argc, char *argv[])
{
	srand ((unsigned)time(NULL));
	int board[BOARDSIZE];

	printf("Populating board...\n");
	populateBoard(board, BOARDSIZE);
	printBoard(board, BOARDSIZE);

	printf("Shuffling...\n");
	shuffleBoard(board, BOARDSIZE);
	printBoard(board, BOARDSIZE);

	while(continueOrStop())
	{
		printf("Shuffling...\n");
		shuffleBoard(board, BOARDSIZE);
		printBoard(board, BOARDSIZE);
	}
}

void swap(int *i, int *j)
{
	*i += *j;
	*j = *i - *j;
	*i -= *j;
}

void populateBoard(int board[], int boardSize)
{
	int i;
	for(i = 0; i < boardSize; i++)
		board[i] = i;
}

void shuffleBoard(int board[], int boardSize)
{
	int numberA, numberB;
	for(numberA = 0; numberA < boardSize; numberA++)
	{
  		numberB = rand() % boardSize;
  		if(numberB != numberA)
    			swap(&board[numberA], &board[numberB]);
	}

}

void printBoard(int board[], int boardSize)
{
	int i;

	for (i = 0; i < boardSize; i++)
		printf("%d ", board[i]);
	printf("\n");
}

int continueOrStop(void)
{
	printf("Continue (y/n)?: ");

	while (1)
	{
		char c = getchar();
		if (c == 'y' || c == 'Y')
			return 1;
		else if (c == 'n' || c == 'N')
			return 0;
	}
}
Δημοσ.

Ένας άλλος τρόπος για σχετικά "αμερόληπτο" ανακάτεμα .

 

Οι 5 αριθμοί έχουν 5!=120 συνδυασμούς.  

α) διάλεξε έναν τυχαίο αριθμό  0 - 119 δλδ rand()%120

β) βάλε στον πίνακα τον συνδυασμό που αντιστοιχεί σε αυτό το νούμερο.

 

Tο n! πρέπει να χωράει σε int η long  (να μην έχεις πολλά κελιά )

 

Για το β) δεν χρειάζεται να απαριθμήσεις ένα-ένα τους συνδυασμούς .

δες και εδώ  http://projecteuler.net/problem=24

 

Έξυπνο για να θυμόμαστε λίγο και τη Συνδυαστική,αλλά κατάχρηση όσο αφορά τον προγραμματισμό.

Σκέψου να είχες πίνακα με 1000 αριθμούς...1000!

 

Η λύση του Nilos με το shuffle θεωρώ είναι το πιο εύκολο και ταχύ.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...