pantelisgeor Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Καλησπέρα σας. Έχω μια εργασία για το πανεπηστήμιο και έχω κολλήσει με τα vectors. Στην εκφώνηση λέει να φτιάξουμε ένα πρόγραμμα σε C++ που να δημιουργώ ένα abstract base class για σχήματα και derived classes για το κάθε σχήμα ξεχωριστά με virtual functions που να υπολογίζουν διάφορες παραμέτρους για το κάθε σχήμα. Επίσης ένα generic prism class που να παίρνει ένα 2d σχήμα να του προσθέτω βάθος και να υπολογίζει όγκο. Τέλος το τελευταίο κομμάτι είναι : • Use of vector class from STL to store library of shapes (e.g. use vector<shape *>) • Print out area and volume of each shape in vector. Στο vector έχω κολλήσει εδώ και δύο μέρες και οποιαδήποτε βοήθεια θα ήταν ευπρόσδεκτη. Είμαι φοιτητής φυσικής και ο προγραμματισμός δεν μου κάθεται και πολύ καλά οπότε αν μπορούσε κάποιος να βοηθήσει λίγο. Στο code είναι ένα μέρος του κώδικα, έβγαλα τα derived class για τα παραπάνω σχήματα για εξοικονόμιση χώρου: > #include <iostream> #include <cmath> #include <vector> #include <algorithm> using namespace std; const double pi(3.141592654) ; class shape { protected: double x,y,z; //x,y & z sides of an abstract shape public: shape(){x=y=z=0;} shape(double xin, double yin,double zin) {x=xin; y=yin; z=zin;} ~shape(){} double getx() {return x;} double gety() {return y;} double getz() {return z;} virtual double area()=0; virtual double diag()=0; //Diagonal virtual double per()=0; //Perimeter virtual double vol()=0; //Volume }; class square : public shape { public: double area() { double ar = getx()*getx() ; cout<<"The area of the square with side "<<getx()<<" is : "<<ar<<endl; return ar; } double diag() { double diagonal = sqrt(2*getx()*getx()); cout<<"The diagonal of the square with side "<<getx()<<" is : "<<diagonal<<endl; return diagonal; } double per() { double perimeter = 4*getx(); cout<<"The circumference of the square with side "<<getx()<<" is : "<<perimeter<<endl<<endl; return perimeter; } double vol() {return 0;} //public: square(double xin) : shape(x,y,z) {x=y=xin;z=0;} }; class prism //Generic prism class { private: double d; //Depth public: //Parameterized constructor taking a shape as an argument prism(double din, const shape &s) { d=din; } //Destructor ~prism(){} double getd() const {return d;} double volume_prism() const { double volume = 0; //volume = area() * getd(); return volume; } }; int main() { vector <shape> set; shape square(2); set.push_back(square); system("pause"); return 0; }
Directx Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Με μια γρήγορη ματιά, θα μπορούσες να εκμεταλλευθείς το hint που σου δίνει η εκφώνηση σαν vector<shape*>: > int main() { int Count; vector <shape*> set; // Allocate several squares.. for(Count = 0; Count < 10; Count++) { square *ptrSquare = new square(Count + 1); set.push_back(ptrSquare); cout << "["<<Count<<"] "<<set.at(Count)->getx()<<endl; } // Free square* allocated memory. for(Count = 0; Count < set.size(); Count++) delete set.at(Count); cin.get(); return 0; } Σε C++ Builder 2009 τρέχει κανονικά. Καλή τύχη!!
3c0r1z Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Πριν σου δώσω κάποιο κώδικα για να δεις πως δουλέυουν οι iterators, vector, polymorhism ρίξε μια ματιά στα παρακάτω Links για να καταλάβεις το κάθε θέμα. Απο τον κώδικα φαίνεται τουλάχιστον ότι δυσκολεύεσαι να κατανοήσεις βασικές έννοιες. http://www.cplusplus.com/doc/tutorial/polymorphism/ http://www.cplusplus.com/reference/stl/vector/ http://www.cprogramming.com/tutorial/stl/iterators.html Επίσης να προσθέσω ότι έτσι όπως έχω γράψει την main() συνάρτηση δημιουργούνται memory leaks, αλλά στο αφήνω αυτό σαν άσκηση να το λύσεις μόνο σου. >// Δεν έχω αλλάξει τπτ απο τις κλάσεις σου void Print(const std::vector<shape*>& shapes); int main() { vector <shape*> set; set.push_back(new square(2)); set.push_back(new square(3)); set.push_back(new square(4)); Print(set); return 0; } void Print(const std::vector<shape*>& shapes) { std::vector<shape*>::const_iterator beg = shapes.begin(); std::vector<shape*>::const_iterator end = shapes.end(); for(; beg != end; ++beg) { std::cout << "Area: " << (*beg) -> area() << '\n'; std::cout << "Volume: " << (*beg) -> vol() << '\n'; } } Edit: Σορρυ direct x δεν το είδα το post σου πριν ποστάρω
pantelisgeor Δημοσ. 3 Μαΐου 2010 Μέλος Δημοσ. 3 Μαΐου 2010 ευχαριστώ για τον χρόνο σας! θα το δοκιμάσω με switches ώστε να έχει επιλογή για το ποιό σχήμα να δημιουργείται κάθε φορά και θα σας ενημερώσω! Ξανά ευχαριστώ πολύ και όντως 3c0r1z δεν έχω πολυκαταλάβει τη λειτουργεία τους και έχω δει το cplusplus.com.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.