Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

δημιουργήστε ένα πρόγραμμα το οποίο θα διαβάζει 20 εγγραφές απο ένα αρχείο κειμένου ( με όνομα "eisodos.txt") και θα τις τυπώνει σε ένα δέυτερο αρχείο ( με όνομα "eksodos.txt") ταξινομημένες κατά αύξουσα σειρά.

Δημοσ.

>#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 happy.gif

Δημοσ.

@παπι

Μου αρέσει η λύση... Ότι πρέπει για κάποιον που ζητάει έτοιμες ασκήσεις και δεν ξέρει ούτε τα βασικά... Πόσο μάλλον overloaded operators και <algorithm>...!!!!

 

+1

Δημοσ.

>#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 happy.gif

 

Τώρα σε πάω με χίλια...

:-D :-D :-D

Δημοσ.

Με την παραπάνω υλοποίηση το μόνο σίγουρο είναι ότι ένα από τα δύο θα συμβεί:

 

  1. το παληκάρι θα περάσει δίνοντας σαν εργασία το copy/paste (κακό ενδεχόμενο)
  2. θα του είναι εντελώς άχρηστο οπότε απλά πόσταρες μια όμορφη λύση (καλό ενδεχόμενο)

 

Οπότε λόγω του (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, λύνοντας ταυτόχρονα και το πρώτο προβληματικό σημείο παραπάνω.

 

Αλλά όπως και να χει σε πάω και γω! ^_^

Δημοσ.

Πώς θα λειτουργήσει η sort αν δεν κάνεις overload τους operators;

Και με το friend νομίζω κάτι χρειάζεται αλλά πάει καιρός που τα διάβασα!!! :P

Δημοσ.

Πώς θα λειτουργήσει η sort αν δεν κάνεις overload τους operators;

Και με το friend νομίζω κάτι χρειάζεται αλλά πάει καιρός που τα διάβασα!!! :P

 

Υπάρχει οverload της std::sort που παίρνει ένα comparison functor για τρίτο όρισμα. Θα ήταν τραγικό να μην γινόταν αυτό γιατί τότε θα ήσουν αναγκασμένος να κάνεις αυτό που είπα παραπάνω: να "παντρέψεις" ένα struct με ένα και μόνο τρόπο ταξινόμησης (οπότε αν έχεις π.χ. struct person θα μπορούσες να ταξινομήσεις κατά ηλικία, αλλά αν ήθελες να ταξινομήσεις κατα όνομα θα έπρεπε να κάνεις άλλο struct κλπ).

 

friend χρειάζεται να είναι π.χ. ο operator << όταν είναι υλοποιημένος σαν free function και θέλει πρόσβαση σε private members. Ο σωστός τρόπος να γίνει αυτό είναι όπως λέει εδώ. Στον παραπάνω κώδικα φαντάζομαι εκ παραδρομής μπήκαν όλα μέσα στην class.

Δημοσ.

Υπάρχει οverload της std::sort που παίρνει ένα comparison functor για τρίτο όρισμα. Θα ήταν τραγικό να μην γινόταν αυτό γιατί τότε θα ήσουν αναγκασμένος να κάνεις αυτό που είπα παραπάνω: να "παντρέψεις" ένα struct με ένα και μόνο τρόπο ταξινόμησης (οπότε αν έχεις π.χ. struct person θα μπορούσες να ταξινομήσεις κατά ηλικία, αλλά αν ήθελες να ταξινομήσεις κατα όνομα θα έπρεπε να κάνεις άλλο struct κλπ).

 

friend χρειάζεται να είναι π.χ. ο operator << όταν είναι υλοποιημένος σαν free function και θέλει πρόσβαση σε private members. Ο σωστός τρόπος να γίνει αυτό είναι όπως λέει εδώ. Στον παραπάνω κώδικα φαντάζομαι εκ παραδρομής μπήκαν όλα μέσα στην class.

Στην ουσία με το Comparison Function Object του ορίζεις εσύ την συνάρτηση που θα καλεί όταν προσπαθεί να κάνει την ταξινόμηση -έτσι ώστε να μπορείς να έχεις πολλών τύπων ταξινομήσεις.

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

Δημοσ.

Καλα λες, εφοσον χρησιμοποιω 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;
}

 

 

ΥΓ Χρονια πολλα βρεεεε

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...