seductor Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 δημιουργήστε ένα πρόγραμμα το οποίο θα διαβάζει 20 εγγραφές απο ένα αρχείο κειμένου ( με όνομα "eisodos.txt") και θα τις τυπώνει σε ένα δέυτερο αρχείο ( με όνομα "eksodos.txt") ταξινομημένες κατά αύξουσα σειρά.
παπι Δημοσ. 23 Δεκεμβρίου 2011 Δημοσ. 23 Δεκεμβρίου 2011 >#include <iostream> #include <fstream> #include <vector> #include <iterator> #include <algorithm> #include <string> class Record { std::string name; int age; char cls; public: bool operator < (Record& rec) { return this->age < rec.age; } bool operator > (Record& rec) { return this->age > rec.age; } bool operator ==(Record& rec) { return this->age == rec.age; } friend std::istream& operator >>(std::istream& is,Record& rec) { is>>rec.name>>rec.age>>rec.cls; return is; } friend std::ostream& operator <<(std::ostream& os,const Record& rec) { os<<rec.name<<" "<<rec.age<<" "<<rec.cls<<std::endl; return os; } }; int main(int, char**) { std::ifstream input("E:\\test\\tmp.txt"); std::ofstream output("E:\\test\\tmp_sorted.txt"); std::vector<Record> records; std::copy( std::istream_iterator<Record>(input), std::istream_iterator<Record>(), std::insert_iterator<decltype(records)>(records,records.end()) ); std::sort(records.begin(),records.end()); std::copy( records.begin(), records.end(), std::ostream_iterator<Record>(output) ); return 0;} και τωρα google
MitsakosGR Δημοσ. 23 Δεκεμβρίου 2011 Δημοσ. 23 Δεκεμβρίου 2011 @παπι Μου αρέσει η λύση... Ότι πρέπει για κάποιον που ζητάει έτοιμες ασκήσεις και δεν ξέρει ούτε τα βασικά... Πόσο μάλλον overloaded operators και <algorithm>...!!!! +1
bokarinho Δημοσ. 23 Δεκεμβρίου 2011 Δημοσ. 23 Δεκεμβρίου 2011 >#include <iostream> #include <fstream> #include <vector> #include <iterator> #include <algorithm> #include <string> class Record { std::string name; int age; char cls; public: bool operator < (Record& rec) { return this->age < rec.age; } bool operator > (Record& rec) { return this->age > rec.age; } bool operator ==(Record& rec) { return this->age == rec.age; } friend std::istream& operator >>(std::istream& is,Record& rec) { is>>rec.name>>rec.age>>rec.cls; return is; } friend std::ostream& operator <<(std::ostream& os,const Record& rec) { os<<rec.name<<" "<<rec.age<<" "<<rec.cls<<std::endl; return os; } }; int main(int, char**) { std::ifstream input("E:\\test\\tmp.txt"); std::ofstream output("E:\\test\\tmp_sorted.txt"); std::vector<Record> records; std::copy( std::istream_iterator<Record>(input), std::istream_iterator<Record>(), std::insert_iterator<decltype(records)>(records,records.end()) ); std::sort(records.begin(),records.end()); std::copy( records.begin(), records.end(), std::ostream_iterator<Record>(output) ); return 0;} και τωρα google Τώρα σε πάω με χίλια... :-D
defacer Δημοσ. 24 Δεκεμβρίου 2011 Δημοσ. 24 Δεκεμβρίου 2011 Με την παραπάνω υλοποίηση το μόνο σίγουρο είναι ότι ένα από τα δύο θα συμβεί: το παληκάρι θα περάσει δίνοντας σαν εργασία το copy/paste (κακό ενδεχόμενο) θα του είναι εντελώς άχρηστο οπότε απλά πόσταρες μια όμορφη λύση (καλό ενδεχόμενο) Οπότε λόγω του (1) δεν έπρεπε να δώσεις υλοποίηση όπως και να 'χει IMHO. Απο κει και πέρα αν μου επιτρέπεις μερικά σχόλια έτσι για να γουστάρουμε: Είναι "λάθος" να παντρέψεις τη δομή του record με το κριτήριο του sort βάζοντας comparison/equality operators. Αυτομάτως το class γίνεται άχρηστο αν δε θες να χρησιμοποιήσεις αυτά τα κριτήρια αλλά απλώς να αποθηκεύσεις πληροφορία. Λογικά ήθελες να υλοποιήσεις επίσης και τους i/o operators εκτός class και γι' αυτό τους έβαλες friend όπως είναι το προτιμητέο -- γιατί μέσα στην class και ταυτόχρονα friend όπως φυσικά ξέρεις δεν έχει νόημα. Καλύτερα (more idiomatic) θα ήταν να είναι struct αντί για class. Υπερβολή το decltype, εκτός κι αν το έκανες επίτηδες για να φάει πόρτα. BTW αφού χρησιμοποίησες decltype θα μπορούσες να βάλεις και τρίτο argument το comparison function με lambda, λύνοντας ταυτόχρονα και το πρώτο προβληματικό σημείο παραπάνω. Αλλά όπως και να χει σε πάω και γω!
MitsakosGR Δημοσ. 24 Δεκεμβρίου 2011 Δημοσ. 24 Δεκεμβρίου 2011 Πώς θα λειτουργήσει η sort αν δεν κάνεις overload τους operators; Και με το friend νομίζω κάτι χρειάζεται αλλά πάει καιρός που τα διάβασα!!!
defacer Δημοσ. 25 Δεκεμβρίου 2011 Δημοσ. 25 Δεκεμβρίου 2011 Πώς θα λειτουργήσει η sort αν δεν κάνεις overload τους operators; Και με το friend νομίζω κάτι χρειάζεται αλλά πάει καιρός που τα διάβασα!!! Υπάρχει οverload της std::sort που παίρνει ένα comparison functor για τρίτο όρισμα. Θα ήταν τραγικό να μην γινόταν αυτό γιατί τότε θα ήσουν αναγκασμένος να κάνεις αυτό που είπα παραπάνω: να "παντρέψεις" ένα struct με ένα και μόνο τρόπο ταξινόμησης (οπότε αν έχεις π.χ. struct person θα μπορούσες να ταξινομήσεις κατά ηλικία, αλλά αν ήθελες να ταξινομήσεις κατα όνομα θα έπρεπε να κάνεις άλλο struct κλπ). friend χρειάζεται να είναι π.χ. ο operator << όταν είναι υλοποιημένος σαν free function και θέλει πρόσβαση σε private members. Ο σωστός τρόπος να γίνει αυτό είναι όπως λέει εδώ. Στον παραπάνω κώδικα φαντάζομαι εκ παραδρομής μπήκαν όλα μέσα στην class.
MitsakosGR Δημοσ. 25 Δεκεμβρίου 2011 Δημοσ. 25 Δεκεμβρίου 2011 Υπάρχει οverload της std::sort που παίρνει ένα comparison functor για τρίτο όρισμα. Θα ήταν τραγικό να μην γινόταν αυτό γιατί τότε θα ήσουν αναγκασμένος να κάνεις αυτό που είπα παραπάνω: να "παντρέψεις" ένα struct με ένα και μόνο τρόπο ταξινόμησης (οπότε αν έχεις π.χ. struct person θα μπορούσες να ταξινομήσεις κατά ηλικία, αλλά αν ήθελες να ταξινομήσεις κατα όνομα θα έπρεπε να κάνεις άλλο struct κλπ). friend χρειάζεται να είναι π.χ. ο operator << όταν είναι υλοποιημένος σαν free function και θέλει πρόσβαση σε private members. Ο σωστός τρόπος να γίνει αυτό είναι όπως λέει εδώ. Στον παραπάνω κώδικα φαντάζομαι εκ παραδρομής μπήκαν όλα μέσα στην class. Στην ουσία με το Comparison Function Object του ορίζεις εσύ την συνάρτηση που θα καλεί όταν προσπαθεί να κάνει την ταξινόμηση -έτσι ώστε να μπορείς να έχεις πολλών τύπων ταξινομήσεις. Δεδομένου ότι έχουμε μόνο έναν τρόπο ταξινόμησης εδώ δεν υπάρχει τέτοιο θέμα όμως... Αν έπρεπε να κάνουμε ξεχωριστή ταξινόμηση κατά ηλικία ή όνομα ή και τα δύο μαζί τότε θα ήταν απαραίτητες οι Comparison Object Functions.
παπι Δημοσ. 25 Δεκεμβρίου 2011 Δημοσ. 25 Δεκεμβρίου 2011 Καλα λες, εφοσον χρησιμοποιω c++0x, ας βαλουμε και τα αλλα καλουδια > #include <iostream> #include <fstream> #include <vector> #include <iterator> #include <algorithm> #include <string> struct Record { std::string name; int age; char cls; Record(){} Record(Record&& r) { age = r.age; cls = r.cls; name = std::move(r.name); } friend std::istream& operator >>(std::istream& is,Record& rec) { is>>rec.name>>rec.age>>rec.cls; return is; } friend std::ostream& operator <<(std::ostream& os,const Record& rec) { os<<rec.name<<" "<<rec.age<<" "<<rec.cls<<std::endl; return os; } }; int main(int, char**) { std::ifstream input("E:\\test\\tmp.txt"); std::ofstream output("E:\\test\\tmp_sorted.txt"); std::vector<Record> records; std::copy( std::istream_iterator<Record>(input), std::istream_iterator<Record>(), std::insert_iterator<decltype(records)>(records,records.end()) ); std::sort( records.begin(), records.end(), [](Record& a,Record& -> bool { return a.age < b.age; } ); std::copy( records.begin(), records.end(), std::ostream_iterator<Record>(output) ); return 0; } ΥΓ Χρονια πολλα βρεεεε
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα