Προσπαθωντας και γω να μαθω να προγραμματιζω σε C++, ειπα να φτιαξω ενα προγραμματακι που να βγαζει 6 τυχαιους αριθμους. Τα IDE που χρησιμοποιω ειναι τα Dev-C++ και Code::Blocks.
Γραφω λοιπον τον κωδικα:
Κώδικας:#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { srand((int)time(0)); int num, i, h, k, j=0; int array[6]={0,0,0,0,0,0}; cout << "Random six numbers from 1 to 49 are:" << endl; // Here I will generate the 6 Lotto numbers and check for duplicates. The code is lacking and probably needs optimization. for (i = 0 ; i < 6 ; i++) { array[i] = rand() % 49 + 1; } for (h = 0; h < 6; h++) { num=array[h]; REPEAT: for (j = h+1; j < 6; j++) { if (array[j] == num) { array[j]=rand() % 49 + 1; goto REPEAT; } } } // Here I will print the 6 numbers for (k = 0 ; k < 6 ; k++) { cout << array[k] << endl; } return 0; }
Το κλασσικο προβλημα ειναι πως να κανεις ελεγχο, αν η rand() εδωσε τον ιδιο αριθμο περισσοτερο απο μια φορα. Αφου με μια λουπα for{} ειπα στην rand() να γεμισει τον πινακα με 6 αριθμους. Μετα εφτιαξα μια λουπα for για να κανω τον ελεγχο στον πινακα για duplicates. Και τελος με μια τελικη λουπα εκτυπωνει τους 6 αριθμους.
Εκεινο που θελω να μου πειτε ειναι αν η λουπα που κανει τον ελεγχο στον πινακα για duplicates ειναι σωστη.
Το επομενο βημα θα ειναι να τους βαλω σε σειρα, αλλα μην μου δωσετε παραδειγματα. Θα ηθελα να το σκεφτω μονος μου.
Εμφάνιση 1-15 από 32
-
10-02-18, 21:50 Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #1
-
10-02-18, 22:45 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #2
Αν δεν κάνω λάθος, με το loop όπως το έχεις τώρα σου ξεφεύγει μία περίπτωση. Για κάθε αριθμό ελέγχεις όλους τους επόμενους (j = h + 1), γιατί τους προηγούμενους τους έχεις ελέγξει και αν βρεις ίδιο τότε τον αλλάζεις. Τι θα γίνει όμως αν η αλλαγή τον κάνει ίδιο με κάποιον πιο πριν; Κάθε φορά που αλλάζεις κάτι θα πρέπει να ελέγχεις αν υπάρχει ίδιο σε όλο τον πίνακα ξανά!
Αυτή η μέθοδος γενικά δεν είναι πολύ καλή καθώς μπορείς να πέσεις σε άπειρα Loop μέχρι να πετύχεις μοναδικότητα! Μία μικρή βελτίωση θα ήταν να χρησιμοποιήσεις τα set της C++, τα οποία δέχονται μόνο μοναδικούς αριθμούς:
Κώδικας:std::set<int> myset; while(myset.size() < 6) myset.insert(rand() % 49 + 1);
Για να το αποφύγεις αυτόμπορείς να χρησιμοποιήσεις ένα list<int> στο οποίο θα καταχωρήσεις όλες τις τιμές (1..49) και μετά θα επιλέγεις τυχαία μία θέση. Προσθέτεις τον αριθμό της θέσης στις επιλογές σου και αφαιρείς από την λίστα την θέση αυτή. Έτσι ξέρεις ότι κανένας αριθμός δεν θα είναι πάνω από μία φορές. Προσοχή μόνο, όταν επιλέγεις θέσεις ότι θα πηγαίνει από 0 έως list.size().Τελευταία επεξεργασία από το μέλος MitsakosGR : 10-02-18 στις 23:53.
-
11-02-18, 02:59 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #3
goto!!! WOW!! Πού τι θυμήθηκες.
ένα καλό βιβλίο, για αργότερα όμως, είναι αυτό
Δες το παρακάτω
Βέβαια αυτός ο αλγόριθμός όσο πιο μεγάλο είναι το Μ τόσο πιο αργός γίνεται. Το αποτέλεσμα είναι πάντα ταξινομημένο κατά αύξουσα σειρά.
Τερματίζει όταν μία από τις δύο συνθήκες στη for είναι ψευδής.
Κώδικας:int n=49; // Σύνολο επιλογής int m=6; // Πλήθος ζητούμενων αριθμών int i,j; // Μετρητές int x; // πλήθος αριθμών του συνόλου επιλογής int y; // υπολοιπόμενο πλήθος ζητούμενων αριθμών j=0; for (i =0; i< n && j < m; ++i) { x = n - i; y = m - j; if (rand() % x < y) { array[j++] = i + 1; } }
ουδέν μονιμότερο του προσωρινού
-
11-02-18, 04:20 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #4
Και γιατί δεν κάνεις έλεγχο την στιγμή που παράγονται οι τυχαίοι αριθμοί;
Δηλαδή εισάγεις τον πρώτο αριθμό στον πίνακα.
Για τον δευτέρο αριθμό ελέγχεις αν είναι ίδιος με τον πρώτο αν ναι ξαναζητάς καινούργιο αριθμό.
Για τον τρίτο αριθμό ελέγχεις αν είναι ίδιος με τον πρώτο ή τον δευτέρο κτλ.
Οπότε για τον i-οστό αριθμό αρκεί να ελέγξεις αν είναι ίδιος με κάποιον από τους αριθμούς από την θέση 0 έως i -1.
H goto στον δομημένο προγραμματισμό ας πούμε σε ένα ποσοστό 99,99999999% απαγορευέται δια ροπάλου.
Την while δεν την μάθατε ακόμη;Τα όνειρα που κάνω από τα 20 παρκάρουν στον ακάλυπτο νωρίς. Μα εσύ που με κοιτάς σαν λύτρωση ζωή παρκαρισμένη μην δεχτείς.
-
11-02-18, 10:39 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #5
Σας ευχαριστω πολυ για τις συμβουλες. Μονος μου μαθαινω. Θα δω τις προτασεις σας και θα αλλαξω τον κωδικα.
Η goto παντως φευγει και θα μπει η while ή do-while κλπ. οταν χρειαστει.
π.χ. τωρα εδω το σκεφτομαι ετσι:
Κώδικας:for (h = 0; h < 6; h++) { num=array[h]; for (j = 0; j < 6; j++) { if (j != h) { do { array[j]=rand() % 49 + 1; }while (array[j] == num); } } }
Αν θελετε, δωστε μου προτασεις για βιβλια ή tutorials κλπ. για αρχαριους.Τελευταία επεξεργασία από το μέλος masterfaster : 11-02-18 στις 11:26.
-
11-02-18, 12:52 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #6
Αφού μαθαίνεις μόνος σου δες εδώ. Την goto μη την χρησιμοποιείς σε μεγάλα προγράμματα. Προκαλεί σύγχυση.
ουδέν μονιμότερο του προσωρινού
-
11-02-18, 14:06 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #7
Σας ευχαριστω πολυ και παλι για ολες τις προτασεις σας.
Καποια site που βλεπω:
www.w3schools.in
www.cplusplus.com
www.tutorialspoint.com
stackoverflow.com
www.sitesbay.com
Εψαξα στο internet και βρηκα τα βιβλια C - How to program και C++ - How to program των Deitel & Deitel. Τα εχετε διαβασει? Αξιζουν?
Αν εχετε καποια βιβλια να προτεινετε, παρακαλω μη διστασετε. Υποψιν ειμαι αρχαριος, αλλα σταδιακα θα ηθελα να γινω intermediate level C++ programmer.
[edit]
http://www.psounis.gr/
Πολυ καλο! Σ'ευχαριστω bazzilΤελευταία επεξεργασία από το μέλος masterfaster : 11-02-18 στις 17:26.
-
11-02-18, 14:42 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #8
Μην μπουκώνεσαι με πολλά βιβλία. Αυτά που έχεις είναι μια χαρά. Αφού κατανοήσεις τον τρόπο που πρέπει να σκέφτεσαι - προγραμματιστική σκέψη - μελέτησε αλγόριθμους όπως πχ το βιβλίο που σου πρότεινα η παρόμοια ώστε να διευρύνεις τις γνώσεις σου. Δεν έχει σχέση αν θα είναι σε c,, c++ ,java, python κ.α. αρκεί να κατανοήσεις την διαδικασία. Για παράδειγμα ο κώδικας που σου πρότεινα δεν χρησιμοποιεί το αποτέλεσμα της rand για να βρει τυχαίους αριθμούς αλλά οι τυχαίοι αριθμοί προκύπτουν απο τις προσπάθειες ικανοποίησης της συνθήκης που βρίσκεται η rand.
ουδέν μονιμότερο του προσωρινού
-
12-02-18, 00:01 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #9
Δεν ξέρω καλά C για να σου γράψω κώδικα, αλλά η λογική πρέπει να είναι η παρακάτω για να έχεις τον ταχύτερο δυνατό κώδικα:
1) Δημιουργείς ένα integer array με τα νούμερα από το 1 ως το 49.
2) Μέσα σε loop από 1 έως 6 (ή 0 έως 5)
α) καλείς τη rand()
β) με βάση το αποτέλεσμα διαλέγεις ένα νούμερο από το integer array
γ) δημιουργείς ένα νέο integer array με όσα νούμερα περίσεψαν (48)
δ) τέλος του loop, ξαναπάς στο α)
Με αυτή τη λογική δεν έχεις λόγο να ασχοληθείς για duplicates, και δεν έχεις performance penalty όσο αυξάνει το 6 σε μεγαλύτερα νούμερα.
-
12-02-18, 00:25 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #10
Σ'ευχαριστω tsigarid για την λογικη του αλγοριθμου. Κατι τετοιο περιπου σκεφτομουν. Θα ασχοληθω ξανα σε λιγες ημερες. Προς το παρον ξεκινησα να βλεπω το tutorial που ειπε ο bazzil. Εκτος απο τις εντολες σε αυτο το tutorial δινονται και tips καθως και πρακτικες προγραμματισμου (πραγμα πολυ σημαντικο).
Οταν τελειωσω με το tutorial θα ασχοληθω ξανα με το συγκεκριμενο προγραμμα.
-
12-02-18, 00:25 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #11
-
12-02-18, 00:35 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #12
Αν κάθε φορά δημιουργείς ένα νέο πίνακα (ή μετακινείς όλα τα στοιχεία από αυτό που βρέθηκε και δεξιά, μία θέση προς τα αριστερά) τότε θα κάνεις πολύ έξτρα δουλειά όπως είπε ο MitsakosGR. Μια άλλη λύση είναι αντί να δημιουργείται ένας νέος πίνακας με όλο και πιο λίγα στοιχεία απλά να "μηδενίζει" την τιμή του στοιχείου που έλαβε. Για παράδειγμα να δίνει τιμή -1 (ή και 0 εφόσον οι τιμές μας είναι 1 - 49). Έπειτα, αντί να ελέγχει κάθε φορά όλα τα προηγούμενα στοιχεία που έλαβε, απλά θα ελέγχει αν η τιμή που έδωσε η rand έχει 0 στον πίνακα (οπότε και έχει ληφθεί στο παρελθόν). Αυτό βέβαια, σε αντίθεση με την δική σου μέθοδο που δεν πάσχει από αυτό, έχει το ίδιο πρόβλημα που έχουν όλες αυτές οι μέθοδοι ότι μπορεί να τρέχει ο βρόχος για ώρα επειδή παίρνουμε τις ίδιες τιμές συνέχεια. Στην προκειμένη βέβαια δεν μας καίει και τόσο μια και μιλάμε για άσκηση (και επίσης 6 << 49).
Η λύση του MitsakouGR με λίστα όπου θα αφαιρείται απλά το στοιχείο που λήφθηκε και ο αλγόριθμος του knuth (ίσως να μην είναι του knuth, δεν θυμάμαι) που έδωσε ο basil είναι πιστεύω η καλύτερη λύση μια και δεν έχουν αυτά τα προβλήματα. Απλά δεν είναι και τόσο ευκολοδιάβαστοι για ένα αρχάριο.Τελευταία επεξεργασία από το μέλος imitheos : 12-02-18 στις 00:51. Αιτία: Λίγο πιο ευανάγνωστο.
"I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
12-02-18, 01:48 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #13
knuth!!! Μπράβο. Και δεν θυμόμουν πως λεγόταν. Με λίστα ακόμη καλύτερα και θα τελειώσει πιο γρήγορα αλλά για αρχάριο δεν είναι ακόμη η ώρα της. Ο knuth είναι πιο κατανοητός.
ουδέν μονιμότερο του προσωρινού
-
12-02-18, 14:56 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #14
Απαγορεύεται δια ροπάλου η goto σε κάθε στοιχειωδώς σοβαρό software.
Υπάρχει η break.Επιτέλους το ελάχιστο δυνατό, ευέλικτο, και ψηφιακό κράτος. Με διαρκή αξιολόγηση.
-
12-02-18, 19:00 Απάντηση: Προγραμμα για τυχαιους αριθμους ΛΟΤΤΟ σε C++ #15
Παρόμοια Θέματα
-
προγραμμα για μιξη τραγουδιων
Από teodgeor στο φόρουμ Audio, Video και ΦωτογραφίαΜηνύματα: 6Τελευταίο Μήνυμα: 27-11-17, 16:16 -
ΑΝΑΖΗΤΩ: Πρόγραμμα για audio streaming
Από Marios.v στο φόρουμ Software γενικάΜηνύματα: 0Τελευταίο Μήνυμα: 18-07-17, 12:16 -
Πρόγραμμα για μαζικό download αρχείων (pdf)
Από Anapiastos στο φόρουμ Internet, web surfing και online υπηρεσίεςΜηνύματα: 1Τελευταίο Μήνυμα: 17-06-17, 22:11 -
Κανενα καλο προγραμμα για θερμοκρασιες
Από kimiraik στο φόρουμ Software γενικάΜηνύματα: 8Τελευταίο Μήνυμα: 12-06-17, 16:46 -
Πρόγραμμα για άνοιγμα αρχείων bios και περιήγησης στο menu τους
Από outSSIDer στο φόρουμ Software γενικάΜηνύματα: 1Τελευταίο Μήνυμα: 11-03-17, 21:30
Bookmarks