Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

Îåêßíçóå áðü ôï ìÝëïò tommaσ. Τελευταία δημοσίευση από το μέλος tommaσ στις 11-03-2008, 19:20. Υπάρχουν 11 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  07-03-2008, 21:33 40769

    Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

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

    π.χ. δείτε τον παρακάτω κώδικα

     #include <iostream>

    using namespace std;

    int main()
    {
            char sen[15];
            cin.getline(sen,10);

            cout << sen;

                while(true)
                    {
                        cout << endl;

                        char sen[15];
                        cin.getline(sen,10);

                        cout<< sen;

                    }

    }
    Αν πατήσετε λάθος ενα νούμερο παραπάνω απο 10 , τότε το cin.getline από εδώ και πέρα αγνοείται σε κάθε επανάληψη .

    Το ίδιο συμβαίνει αν έχεις case(με defult) και δεν έχεις βάλεις π.χ. το "a" σε case ! Τη ακριβώς συμβένει; Γιατί στις επόμενες επανάληψη αγνοείται ;
     

  •  08-03-2008, 00:06 40773 σε απάντηση της 40769

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

    Αν ρίξεις μία ματιά στον ορισμό της getline θα δεις το εξής: "If the function extracts no elements or _Count - 1 elements, it calls setstate(failbit). ". Αυτό μπορείς να το διαπιστώσεις ελέγχοντας την τιμή της cin.good(). Ενώ η τιμή της είναι true όσο περνάς λιγότερο από 9 χαρακτήρες, γίνεται false όταν περάσεις 9 ή περισσότερους. Από εκεί και πέρα η getline επιστρέφει πάντα "".

    Πριν χρησιμοποιήσεις οποιαδήποτε stream function καλό είναι να κοιτάξεις τον ορισμό της γιατί η κάθε μία έχει τους δικούς της περιορισμούς.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  08-03-2008, 09:23 40774 σε απάντηση της 40773

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

     Σε ευχαριστώ πολύ για την απάντηση σου.

    Κατα την γνώμη σου , ποιος είναι ο καλύτερος τρόπος να διορθώσω αυτό το πρόβλημα; Να ελέγχω τα δεδομένα πριν περάσουν; ή να χρησιμοποιώ άλλες βιβλιοθήκες με συναρτήσεις; π.χ stdio

    Αποφάσισα να αρχίσω την stdio(Γιατί είναι και πιο γρήγορη).

     

  •  08-03-2008, 13:12 40775 σε απάντηση της 40774

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

    Είναι τόσο απαραίτητη η ταχύτητα ή έστω παρατηρήσιμη ακόμα, για να λάβεις μερικές τιμές από τον χρήστη; Προσωπικά θα επέμενα σε streams, καθώς κατά τη γνώμη μου είναι πιο μοντέρνος τρόπος του να κάνεις αυτά που κάνεις με το stdio.h.

    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  08-03-2008, 15:32 40776 σε απάντηση της 40775

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

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

    Τώρα για απλά πράγματα και τέτοια , δεν έχει καμιά απολύτως σημασία(εκτός και αν έχεις τεράστια δεδομένα να χειριστείς)

  •  08-03-2008, 15:46 40777 σε απάντηση της 40776

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

    Το "καλύτερες βιβλιοθήκες" δεν έχει νόημα. Καλύτερες ως προς τι; Ταχύτητα ανάπτυξης; Ταχύτητα εκτέλεσης; Τότε στο πρώτο η καλύτερη όλων των είναι η πλατφόρμα Ruby on Rails και στο δεύτερο η assembly.
    Άλλωστε, και η περίπτωση που αναφέρεις δεν θα ήταν το σημείο κλειδί σε κάποιον διαγωνισμό, ούτε χειρίζεσαι τεράστια δεδομένα. Δεν υπάρχει silver bullet.

    Μάλλον ανησυχείς χωρίς λόγο. Άλλωστε, για να αντιγράψω τον Knuth, We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil."

    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  08-03-2008, 16:51 40778 σε απάντηση της 40777

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

    Οι διαγωνισμοί συνήθως γίνονται σε c++ σε περιβάλλον linux,άρα το assembly εξαιρείται ,  και είναι σχετικοί με την Ταχύτητα εκτέλεσης.
  •  08-03-2008, 17:09 40779 σε απάντηση της 40778

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

    Θες να συμμετάσχεις σε διαγωνισμό ή να φτιάξεις μια εφαρμογή; Γιατί οι προτεραιότητες είναι αντιδιαμετρικά αντίθετες στις δυό περιπτώσεις. Αν αναφέρεσαι σε διαγωνισμό, ναι η ταχύτητα έχει σημασία (αν και το παράδειγμα αυτό είναι άκυρο, γιατί η διαφορά σε 2-3 picosecond κατά την εκτέλεση της εφαρμογής λόγω του τρόπου της λήψης τιμών από έναν χρήστη είναι μάλλον το τελευταίο πράγμα που θα κοιτάξει κάποιος βαθμολογητής).

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

    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  08-03-2008, 17:20 40780 σε απάντηση της 40779

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

    Mitsaras:
    Θες να συμμετάσχεις σε διαγωνισμό ή να φτιάξεις μια εφαρμογή; Γιατί οι προτεραιότητες είναι αντιδιαμετρικά αντίθετες στις δυό περιπτώσεις. Αν αναφέρεσαι σε διαγωνισμό, ναι η ταχύτητα έχει σημασία (αν και το παράδειγμα αυτό είναι άκυρο, γιατί η διαφορά σε 2-3 picosecond κατά την εκτέλεση της εφαρμογής λόγω του τρόπου της λήψης τιμών από έναν χρήστη είναι μάλλον το τελευταίο πράγμα που θα κοιτάξει κάποιος βαθμολογητής).

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

     Θέλω να συμμετάσχω σε διαγωνισμό. Συμφωνώ απόλυτα με αυτό που λες σχετικά με τις εφαρμογές.

    Δεν υπάρχει βαθμολογητής(άνθρωπος) , ο βαθμολογητής είναι ένα πρόγραμμα το οποίο εξετάζει αν το αρχείο σου είναι μέχρι τόσα π.χ. kb και από εκεί και πέρα μετράει η ταχύτητα . Έχω προσέξει ότι ένας είχε βγει μια θέση παραπάνω απο τον άλλο , μόνο και μόνο επειδή χρησιμοποίησε διαφορετική βιβλιοθήκη. Είναι φυσικό π.χ. οι 5 πρώτοι σε ένα διαγωνισμό να έχουν φτιάξει τον πιο γρήγορο(σε ταχύτητα) υλοποίηση αλγορίθμου και να τους χωρίζουν μικρές διαφορές όπως αυτές , αλλιώς πως θα συγκρίνουν αυτούς που είχαν τον ίδιο αλγόριθμο;


     

  •  08-03-2008, 17:34 40781 σε απάντηση της 40780

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

    Χμ, μάλιστα. Αν είναι έτσι τα πράγματα, συμφωνώ.

    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  10-03-2008, 21:06 40799 σε απάντηση της 40781

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

    Μου φαίνεται το τραβήξατε κάπως μακριά το πράγμα. Το αν θα επιλέξει κανείς την stdio ή την iostream δεν έχει να κάνει με τα μερικά microsecond διαφορά. Απλά, η stdio είναι η παλιά βιβλιοθήκη που κληρονομήθηκε από την C, ενώ η iostream είναι η βιβλιοθήκη της ίδιας της C++. Η iostream καταλαβαίνει από references, από templates, από buffers, επιτρέπει το συνδυασμό διαφόρων stream, κλπ, κλπ, κλπ, κλπ.
    Αν θέλει κάποιος να οδηγήσει το αυτοκίνητο που λέγεται C++, η stdio είναι η 1η ταχύτητα. Τα streams είναι οι επόμενες 6 σύν η όπισθεν.

    Όσον αφορά την basic_istream (σε αυτήν βασίζεται η cin), έχει αρκετά function για να διαβάσει δεδομένα, το καθένα με διαφορετική συμπεριφορά. Δεν υπάρχει κάποια καλύτερη. Ανάλογα με το τί θέλει να κάνει κάποιος, θα χρησιμοποιήσει την αντίστοιχη συνάρτηση. Τί γίνεται αν ο χρήστης δώσει παραπάνω από 9 χαρακτήρες? Θεωρώ ότι υπάρχει κάποιο πρόβλημα? Πετάω τους παραπανήσιους χαρακτήρες?

    Για παράδειγμα, ο παρακάτω κώδικας διαβάζει 10 χαρακτήρες το πολύ από την cin. Αν υπάρχουν περισσότεροι από 10 χαρακτήρες, θα τους διαβάσει στο επόμενο loop. Αυτό θα συνεχιστεί μέχρι να τελειώσεουν οι χαρακτήρες.  Ο κώδικας χρησιμοποιεί την setw η οποία καθορίζει ότι το stream θα χειρίζεται 10 χαρακτήρες τη φορά.

    while(cin.good())
    {
       cout << endl;
       char sen[15];
       cin >> setw(10) >> sen;          
       cout<< sen;
    }

    Ο παρακάτω κώδικας όμως θέτει το cin.failbit==true αν βρει παραπάνω από 10 χαρακτήρες. Μόνο 10 χαρακτήρες θα μπουν στη μεταβλητή sen. Καλώντας την cin.fail() ελέγχο αν συνέβει κάτι τέτοιο και αν θεωρώ ότι πρέπει να συνεχίσω, καλώ την cin.clear(). Στο επόμενο loop ο κώδικας θα διαβάσει και τα υπόλοιπα δεδομένα.

    while(cin.good())
    {
       cout << endl;
       char sen[15];
       cin.getline(sen,11);
       cout<< sen;
       if (cin.fail())
          cin.clear();
    }


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  11-03-2008, 19:20 40811 σε απάντηση της 40799

    Απ: Περίεργος ατερμονας βρόγχος σε c++(Απλος κώδικας)

     Σε ευχαριστώ πολύ!

    Για την ταχύτητα των iostream  και stdio ποια η γνώμη σου; Πιστεύεις ότι δεν έχουν διαφορά;

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems