Σελ. 1 από 3 123 ΤελευταίαΤελευταία
Εμφάνιση 1-15 από 32
  1. #1
    Εγγραφή
    05-12-2008
    Μηνύματα
    2.853
    Downloads
    3
    Uploads
    0
    ISP
    Not for public
    Προσπαθωντας και γω να μαθω να προγραμματιζω σε 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 ειναι σωστη.

    Το επομενο βημα θα ειναι να τους βαλω σε σειρα, αλλα μην μου δωσετε παραδειγματα. Θα ηθελα να το σκεφτω μονος μου.

  2. #2
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.441
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Αν δεν κάνω λάθος, με το loop όπως το έχεις τώρα σου ξεφεύγει μία περίπτωση. Για κάθε αριθμό ελέγχεις όλους τους επόμενους (j = h + 1), γιατί τους προηγούμενους τους έχεις ελέγξει και αν βρεις ίδιο τότε τον αλλάζεις. Τι θα γίνει όμως αν η αλλαγή τον κάνει ίδιο με κάποιον πιο πριν; Κάθε φορά που αλλάζεις κάτι θα πρέπει να ελέγχεις αν υπάρχει ίδιο σε όλο τον πίνακα ξανά!

    Αυτή η μέθοδος γενικά δεν είναι πολύ καλή καθώς μπορείς να πέσεις σε άπειρα Loop μέχρι να πετύχεις μοναδικότητα! Μία μικρή βελτίωση θα ήταν να χρησιμοποιήσεις τα set της C++, τα οποία δέχονται μόνο μοναδικούς αριθμούς:
    Κώδικας:
    std::set<int> myset;
    while(myset.size() < 6)
      myset.insert(rand() % 49 + 1);
    Αλλά και αυτό μπορεί να πέσει σε άπειρο Loop.

    Για να το αποφύγεις αυτόμπορείς να χρησιμοποιήσεις ένα list<int> στο οποίο θα καταχωρήσεις όλες τις τιμές (1..49) και μετά θα επιλέγεις τυχαία μία θέση. Προσθέτεις τον αριθμό της θέσης στις επιλογές σου και αφαιρείς από την λίστα την θέση αυτή. Έτσι ξέρεις ότι κανένας αριθμός δεν θα είναι πάνω από μία φορές. Προσοχή μόνο, όταν επιλέγεις θέσεις ότι θα πηγαίνει από 0 έως list.size().
    Τελευταία επεξεργασία από το μέλος MitsakosGR : 10-02-18 στις 23:53.

  3. #3
    Εγγραφή
    09-09-2005
    Περιοχή
    Θεσσαλονίκη
    Ηλικία
    51
    Μηνύματα
    1.079
    Downloads
    32
    Uploads
    0
    Τύπος
    FTTH
    Ταχύτητα
    200Mbps/200Mbps
    ISP
    INALAN - OTE
    DSLAM
    ΟΤΕ - ΒΑΡΝΑΣ
    Router
    HAUWEI HG8546M
    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;
        }    
    }
    ουδέν μονιμότερο του προσωρινού

  4. #4
    Εγγραφή
    12-02-2005
    Περιοχή
    ΚΑΤΕΡΙΝΗ
    Ηλικία
    49
    Μηνύματα
    2.674
    Downloads
    9
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    89836/10996
    ISP
    Forthnet
    DSLAM
    Forthnet - ΚΑΤΕΡΙΝΗ
    Router
    ZTE H288A
    SNR / Attn
    9.7(dB) / 6.1(dB)
    Path Level
    Interleaved
    Και γιατί δεν κάνεις έλεγχο την στιγμή που παράγονται οι τυχαίοι αριθμοί;

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

    Για τον τρίτο αριθμό ελέγχεις αν είναι ίδιος με τον πρώτο ή τον δευτέρο κτλ.

    Οπότε για τον i-οστό αριθμό αρκεί να ελέγξεις αν είναι ίδιος με κάποιον από τους αριθμούς από την θέση 0 έως i -1.

    H goto στον δομημένο προγραμματισμό ας πούμε σε ένα ποσοστό 99,99999999% απαγορευέται δια ροπάλου.
    Την while δεν την μάθατε ακόμη;
    Τα όνειρα που κάνω από τα 20 παρκάρουν στον ακάλυπτο νωρίς. Μα εσύ που με κοιτάς σαν λύτρωση ζωή παρκαρισμένη μην δεχτείς.

  5. #5
    Εγγραφή
    05-12-2008
    Μηνύματα
    2.853
    Downloads
    3
    Uploads
    0
    ISP
    Not for public
    Σας ευχαριστω πολυ για τις συμβουλες. Μονος μου μαθαινω. Θα δω τις προτασεις σας και θα αλλαξω τον κωδικα.


    Η 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);
            }
          }
       }
    Και παλι ο παραπανω κωδικας δεν εξασφαλιζει 100% οτι δεν θα υπαρξουν duplicates. Οποτε θα προσπαθησω να εφαρμοσω τις δικες σας προτασεις.


    Αν θελετε, δωστε μου προτασεις για βιβλια ή tutorials κλπ. για αρχαριους.
    Τελευταία επεξεργασία από το μέλος masterfaster : 11-02-18 στις 11:26.

  6. #6
    Εγγραφή
    09-09-2005
    Περιοχή
    Θεσσαλονίκη
    Ηλικία
    51
    Μηνύματα
    1.079
    Downloads
    32
    Uploads
    0
    Τύπος
    FTTH
    Ταχύτητα
    200Mbps/200Mbps
    ISP
    INALAN - OTE
    DSLAM
    ΟΤΕ - ΒΑΡΝΑΣ
    Router
    HAUWEI HG8546M
    Αφού μαθαίνεις μόνος σου δες εδώ. Την goto μη την χρησιμοποιείς σε μεγάλα προγράμματα. Προκαλεί σύγχυση.
    ουδέν μονιμότερο του προσωρινού

  7. #7
    Εγγραφή
    05-12-2008
    Μηνύματα
    2.853
    Downloads
    3
    Uploads
    0
    ISP
    Not for public
    Σας ευχαριστω πολυ και παλι για ολες τις προτασεις σας.

    Καποια 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.

  8. #8
    Εγγραφή
    09-09-2005
    Περιοχή
    Θεσσαλονίκη
    Ηλικία
    51
    Μηνύματα
    1.079
    Downloads
    32
    Uploads
    0
    Τύπος
    FTTH
    Ταχύτητα
    200Mbps/200Mbps
    ISP
    INALAN - OTE
    DSLAM
    ΟΤΕ - ΒΑΡΝΑΣ
    Router
    HAUWEI HG8546M
    Μην μπουκώνεσαι με πολλά βιβλία. Αυτά που έχεις είναι μια χαρά. Αφού κατανοήσεις τον τρόπο που πρέπει να σκέφτεσαι - προγραμματιστική σκέψη - μελέτησε αλγόριθμους όπως πχ το βιβλίο που σου πρότεινα η παρόμοια ώστε να διευρύνεις τις γνώσεις σου. Δεν έχει σχέση αν θα είναι σε c,, c++ ,java, python κ.α. αρκεί να κατανοήσεις την διαδικασία. Για παράδειγμα ο κώδικας που σου πρότεινα δεν χρησιμοποιεί το αποτέλεσμα της rand για να βρει τυχαίους αριθμούς αλλά οι τυχαίοι αριθμοί προκύπτουν απο τις προσπάθειες ικανοποίησης της συνθήκης που βρίσκεται η rand.
    ουδέν μονιμότερο του προσωρινού

  9. #9
    Εγγραφή
    06-07-2005
    Περιοχή
    Νέα Υόρκη
    Ηλικία
    48
    Μηνύματα
    11.618
    Downloads
    6
    Uploads
    2
    Τύπος
    Cable
    Ταχύτητα
    300 Mbps down/10 Mbps up
    ISP
    Spectrum
    Δεν ξέρω καλά C για να σου γράψω κώδικα, αλλά η λογική πρέπει να είναι η παρακάτω για να έχεις τον ταχύτερο δυνατό κώδικα:

    1) Δημιουργείς ένα integer array με τα νούμερα από το 1 ως το 49.
    2) Μέσα σε loop από 1 έως 6 (ή 0 έως 5)
    α) καλείς τη rand()
    β) με βάση το αποτέλεσμα διαλέγεις ένα νούμερο από το integer array
    γ) δημιουργείς ένα νέο integer array με όσα νούμερα περίσεψαν (48)
    δ) τέλος του loop, ξαναπάς στο α)

    Με αυτή τη λογική δεν έχεις λόγο να ασχοληθείς για duplicates, και δεν έχεις performance penalty όσο αυξάνει το 6 σε μεγαλύτερα νούμερα.

  10. #10
    Εγγραφή
    05-12-2008
    Μηνύματα
    2.853
    Downloads
    3
    Uploads
    0
    ISP
    Not for public
    Σ'ευχαριστω tsigarid για την λογικη του αλγοριθμου. Κατι τετοιο περιπου σκεφτομουν. Θα ασχοληθω ξανα σε λιγες ημερες. Προς το παρον ξεκινησα να βλεπω το tutorial που ειπε ο bazzil. Εκτος απο τις εντολες σε αυτο το tutorial δινονται και tips καθως και πρακτικες προγραμματισμου (πραγμα πολυ σημαντικο).

    Οταν τελειωσω με το tutorial θα ασχοληθω ξανα με το συγκεκριμενο προγραμμα.

  11. #11
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.441
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Παράθεση Αρχικό μήνυμα από tsigarid Εμφάνιση μηνυμάτων
    Δεν ξέρω καλά C για να σου γράψω κώδικα, αλλά η λογική πρέπει να είναι η παρακάτω για να έχεις τον ταχύτερο δυνατό κώδικα:

    1) Δημιουργείς ένα integer array με τα νούμερα από το 1 ως το 49.
    2) Μέσα σε loop από 1 έως 6 (ή 0 έως 5)
    α) καλείς τη rand()
    β) με βάση το αποτέλεσμα διαλέγεις ένα νούμερο από το integer array
    γ) δημιουργείς ένα νέο integer array με όσα νούμερα περίσεψαν (48)
    δ) τέλος του loop, ξαναπάς στο α)

    Με αυτή τη λογική δεν έχεις λόγο να ασχοληθείς για duplicates, και δεν έχεις performance penalty όσο αυξάνει το 6 σε μεγαλύτερα νούμερα.
    Καλύτερα αυτό να γίνει με λίστες αντί με πίνακες για να μην έχεις να φτιάχνεις συνεχώς πίνακες, οπότε δεσμεύεις-αποδεσμεύεις μνήμη!

  12. #12
    Εγγραφή
    20-12-2005
    Μηνύματα
    3.196
    Downloads
    4
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    49997/4997
    ISP
    ΟΤΕ Conn-x
    DSLAM
    ΟΤΕ - ΞΑΝΘΗ
    Router
    Speedport W 724V
    SNR / Attn
    24,4(dB) / (dB)
    Παράθεση Αρχικό μήνυμα από tsigarid Εμφάνιση μηνυμάτων
    Δεν ξέρω καλά C για να σου γράψω κώδικα, αλλά η λογική πρέπει να είναι η παρακάτω για να έχεις τον ταχύτερο δυνατό κώδικα:

    1) Δημιουργείς ένα integer array με τα νούμερα από το 1 ως το 49.
    2) Μέσα σε loop από 1 έως 6 (ή 0 έως 5)
    α) καλείς τη rand()
    β) με βάση το αποτέλεσμα διαλέγεις ένα νούμερο από το integer array
    γ) δημιουργείς ένα νέο integer array με όσα νούμερα περίσεψαν (48)
    δ) τέλος του loop, ξαναπάς στο α)

    Με αυτή τη λογική δεν έχεις λόγο να ασχοληθείς για duplicates, και δεν έχεις performance penalty όσο αυξάνει το 6 σε μεγαλύτερα νούμερα.
    Παράθεση Αρχικό μήνυμα από MitsakosGR Εμφάνιση μηνυμάτων
    Καλύτερα αυτό να γίνει με λίστες αντί με πίνακες για να μην έχεις να φτιάχνεις συνεχώς πίνακες, οπότε δεσμεύεις-αποδεσμεύεις μνήμη!
    Αν κάθε φορά δημιουργείς ένα νέο πίνακα (ή μετακινείς όλα τα στοιχεία από αυτό που βρέθηκε και δεξιά, μία θέση προς τα αριστερά) τότε θα κάνεις πολύ έξτρα δουλειά όπως είπε ο 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
    Γα.... την πολιτική ορθότητα.

  13. #13
    Εγγραφή
    09-09-2005
    Περιοχή
    Θεσσαλονίκη
    Ηλικία
    51
    Μηνύματα
    1.079
    Downloads
    32
    Uploads
    0
    Τύπος
    FTTH
    Ταχύτητα
    200Mbps/200Mbps
    ISP
    INALAN - OTE
    DSLAM
    ΟΤΕ - ΒΑΡΝΑΣ
    Router
    HAUWEI HG8546M
    knuth!!! Μπράβο. Και δεν θυμόμουν πως λεγόταν. Με λίστα ακόμη καλύτερα και θα τελειώσει πιο γρήγορα αλλά για αρχάριο δεν είναι ακόμη η ώρα της. Ο knuth είναι πιο κατανοητός.
    ουδέν μονιμότερο του προσωρινού

  14. #14
    Εγγραφή
    02-11-2003
    Περιοχή
    Επαναπατρισθείς στην Αθήνα
    Ηλικία
    49
    Μηνύματα
    56.427
    Downloads
    64
    Uploads
    73
    Τύπος
    VDSL2
    Ταχύτητα
    102400/10240
    ISP
    Vodafone
    Path Level
    Fastpath
    Απαγορεύεται δια ροπάλου η goto σε κάθε στοιχειωδώς σοβαρό software.

    Υπάρχει η break.
    Επιτέλους το ελάχιστο δυνατό, ευέλικτο, και ψηφιακό κράτος. Με διαρκή αξιολόγηση.

  15. #15
    Το avatar του μέλους turboirc
    turboirc Guest
    Παράθεση Αρχικό μήνυμα από WAntilles Εμφάνιση μηνυμάτων
    Απαγορεύεται δια ροπάλου η goto σε κάθε στοιχειωδώς σοβαρό software.

    Υπάρχει η break.
    Η comefrom επιτρεπεται?

Σελ. 1 από 3 123 ΤελευταίαΤελευταία

Παρόμοια Θέματα

  1. προγραμμα για μιξη τραγουδιων
    Από teodgeor στο φόρουμ Audio, Video και Φωτογραφία
    Μηνύματα: 6
    Τελευταίο Μήνυμα: 27-11-17, 16:16
  2. ΑΝΑΖΗΤΩ: Πρόγραμμα για audio streaming
    Από Marios.v στο φόρουμ Software γενικά
    Μηνύματα: 0
    Τελευταίο Μήνυμα: 18-07-17, 12:16
  3. Πρόγραμμα για μαζικό download αρχείων (pdf)
    Από Anapiastos στο φόρουμ Internet, web surfing και online υπηρεσίες
    Μηνύματα: 1
    Τελευταίο Μήνυμα: 17-06-17, 22:11
  4. Κανενα καλο προγραμμα για θερμοκρασιες
    Από kimiraik στο φόρουμ Software γενικά
    Μηνύματα: 8
    Τελευταίο Μήνυμα: 12-06-17, 16:46
  5. Μηνύματα: 1
    Τελευταίο Μήνυμα: 11-03-17, 21:30

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας