Arctic Δημοσ. 9 Φεβρουαρίου 2013 Δημοσ. 9 Φεβρουαρίου 2013 Καλησπέρα σας παιδιά, Θέλω να γεμίσω ένα μονοδιάστατο πίνακα 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") } Ακόμη θέλω να εμφανίσω από δομή και δε εμφανίζει αυτό που έχω αποθηκεύσει, εμφανίζει αυτό στη συνημμένη εικόνα.
Technology fan Δημοσ. 9 Φεβρουαρίου 2013 Δημοσ. 9 Φεβρουαρίου 2013 βάλε το srand ( time(NULL) ); στην αρχή του προγράμματος...
Arctic Δημοσ. 9 Φεβρουαρίου 2013 Μέλος Δημοσ. 9 Φεβρουαρίου 2013 Το έβαλα και δουλεύει τυχαία. Ευχαριστώ Και πάλι όμως υπάρχουν διπλά στοιχεία...
Technology fan Δημοσ. 9 Φεβρουαρίου 2013 Δημοσ. 9 Φεβρουαρίου 2013 for (j=0;j==i;j++) μήπως πρέπει να είναι for (j=0;j<i;j++)
Arctic Δημοσ. 9 Φεβρουαρίου 2013 Μέλος Δημοσ. 9 Φεβρουαρίου 2013 Αυτό δε ισχύει έτσι κι αλλιώς; Tο i το ξεκινάω από 1 στο πρώτο βρόγχο και το j από 0 στο δεύτερο
Technology fan Δημοσ. 9 Φεβρουαρίου 2013 Δημοσ. 9 Φεβρουαρίου 2013 Όχι δεν ισχύει το i είναι δείκτης που σου υποδηλώνει πόσα στοιχεία έχουν εισαχθεί ενώ το j σου υποδηλώνει πόσα πρέπει να κάνω έλεγχο για την εύρεση διπλοστοιχείων
Arctic Δημοσ. 9 Φεβρουαρίου 2013 Μέλος Δημοσ. 9 Φεβρουαρίου 2013 Ναι αλλά j<i αφού το j=0 και i=1. Δε το τρέχει καθόλου
Technology fan Δημοσ. 9 Φεβρουαρίου 2013 Δημοσ. 9 Φεβρουαρίου 2013 μου φαίνεται δε ξέρεις τι κάνει το for loop for (j=0;j<i;j++){ 'Kwdikas'} j=0, οσο j<i τρεξε το 'Kwdikas' και αύξησε το j κατα ένα. Αμά το αλλάξεις τι σφάλμα σου βγάζει?
Arctic Δημοσ. 9 Φεβρουαρίου 2013 Μέλος Δημοσ. 9 Φεβρουαρίου 2013 Καλά μεγάλη μαλακία-κόλλημα μου... Σορρυ Μετά τρέχει αλλά φαίνεται σαν να υπάρχει ατέρμων βρόγχος...
nilosgr Δημοσ. 9 Φεβρουαρίου 2013 Δημοσ. 9 Φεβρουαρίου 2013 Το κανείς "λίγο ανάποδα" φίλε... Μια καλή ιδέα θα ήταν να γεμίζεις τον πίνακα με {0, 1, 2, 3, 4} και μετά να κάνει swap το κάθε στοιχείο με ένα άλλο τυχαίο. (κάπως έτσι δουλεύει νομίζω και η Collections.shuffle() της java) 1
albNik Δημοσ. 9 Φεβρουαρίου 2013 Δημοσ. 9 Φεβρουαρίου 2013 Ένας άλλος τρόπος για σχετικά "αμερόληπτο" ανακάτεμα . Οι 5 αριθμοί έχουν 5!=120 συνδυασμούς. α) διάλεξε έναν τυχαίο αριθμό 0 - 119 δλδ rand()%120 β) βάλε στον πίνακα τον συνδυασμό που αντιστοιχεί σε αυτό το νούμερο. Tο n! πρέπει να χωράει σε int η long (να μην έχεις πολλά κελιά ) Για το β) δεν χρειάζεται να απαριθμήσεις ένα-ένα τους συνδυασμούς . δες και εδώ http://projecteuler.net/problem=24
Arctic Δημοσ. 9 Φεβρουαρίου 2013 Μέλος Δημοσ. 9 Φεβρουαρίου 2013 Παιδιά ευχαριστώ πολύ για τις απαντήσεις, το έλυσα αλλιώς, μπακαλίστικα μεν αλλά....
nilosgr Δημοσ. 9 Φεβρουαρίου 2013 Δημοσ. 9 Φεβρουαρίου 2013 Ένας άλλος τρόπος για σχετικά "αμερόληπτο" ανακάτεμα . Οι 5 αριθμοί έχουν 5!=120 συνδυασμούς. α) διάλεξε έναν τυχαίο αριθμό 0 - 119 δλδ rand()%120 β) βάλε στον πίνακα τον συνδυασμό που αντιστοιχεί σε αυτό το νούμερο. Tο n! πρέπει να χωράει σε int η long (να μην έχεις πολλά κελιά ) Για το β) δεν χρειάζεται να απαριθμήσεις ένα-ένα τους συνδυασμούς . δες και εδώ http://projecteuler.net/problem=24 Σαν ιδεα ειναι καλο, αλλα σαν υλοποιηση καπως περιπλοκο, εκτος αν κανεις "καταχρηση" του %
akisk Δημοσ. 9 Φεβρουαρίου 2013 Δημοσ. 9 Φεβρουαρίου 2013 Ας βάλω και εγώ κώδικα από αντίστοιχο θέμα (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; } }
Lanike71 Δημοσ. 9 Φεβρουαρίου 2013 Δημοσ. 9 Φεβρουαρίου 2013 Ένας άλλος τρόπος για σχετικά "αμερόληπτο" ανακάτεμα . Οι 5 αριθμοί έχουν 5!=120 συνδυασμούς. α) διάλεξε έναν τυχαίο αριθμό 0 - 119 δλδ rand()%120 β) βάλε στον πίνακα τον συνδυασμό που αντιστοιχεί σε αυτό το νούμερο. Tο n! πρέπει να χωράει σε int η long (να μην έχεις πολλά κελιά ) Για το β) δεν χρειάζεται να απαριθμήσεις ένα-ένα τους συνδυασμούς . δες και εδώ http://projecteuler.net/problem=24 Έξυπνο για να θυμόμαστε λίγο και τη Συνδυαστική,αλλά κατάχρηση όσο αφορά τον προγραμματισμό. Σκέψου να είχες πίνακα με 1000 αριθμούς...1000! Η λύση του Nilos με το shuffle θεωρώ είναι το πιο εύκολο και ταχύ.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα