THMMY.gr

Μαθήματα Βασικού Κύκλου => Αντικειμενοστραφής Προγραμματισμός => Topic started by: nikitas350 on November 21, 2010, 16:50:20 pm



Title: [C++] 5η Εργασία 2010
Post by: nikitas350 on November 21, 2010, 16:50:20 pm
Εργασία Ε (Hμ/νία λήξης δηλώσεων: 28/11/2010)

     Με στόχο να δημιουργηθεί μια βιβλιοθήκη η οποία να διαχειρίζεται πράξεις με πίνακες, να γραφεί το λογισμικό στο οποίο να ορίζεται η κλάση array η οποία ως private στοιχεία να διαθέτει τις ακέραιες μεταβλητές n και m και τον pointer σε pointer a σε στοιχεία τύπου float.
     Στο λογισμικό να ορίζονται ακόμη:

α)  Μια επικάλυψη του τελεστή ( ) τέτοια ώστε η έκφραση ar(r,c), όπου ar αντικείμενο τύπου array και r και c τιμές τύπου int, να δεσμεύει
     δυναμικά μνήμη, χρησιμοποιώντας τον pointer a, για την καταχώρηση ενός πίνακα με r γραμμές και c στήλες θέτοντας ταυτόχρονα
     n=r και m=c. Η επικάλυψη να επιστρέφει το αντικείμενο ar.
b)  Μια επικάλυψη του τελεστή ~ τέτοια ώστε η έκφραση ~ar, όπου ar αντικείμενο τύπου array, να επιστρέφει ένα αντικείμενο του ιδίου
     τύπου στο οποίο ο πίνακας που ορίζεται να είναι ο ανάστροφος του πίνακα που ορίζει το αντικείμενο ar.
γ)  Μια επικάλυψη του τελεστή * τέτοια ώστε η έκφραση ar*ap, όπου ar και ap αντικείμενα τύπου array, να επιστρέφει ένα αντικείμενο του
     ιδίου τύπου στο οποίο ο πίνακας που ορίζεται να περιέχει το γινόμενο των πινάκων που ορίζουν τα αντικείμενα ar και ap. Η συνάρτηση
     επικάλυψης να ελέγχει αν είναι δυνατή η πράξη του πολλαπλασιασμού για τους συγκεκριμένους πίνακες.
δ)  Μια επικάλυψη του τελεστή = τέτοια ώστε η έκφραση ar=ap, όπου ar και ap αντικείμενα τύπου array, να καταχωρεί στον πίνακα που
     ορίζει το αντικείμενο ar τα στοιχεία του πίνακα που ορίζει το αντικείμενο ap. Η συνάρτηση επικάλυψης να ελέγχει αν είναι δυνατή η
     καταχώρηση. Τέλος η συνάρτηση επικάλυψης να επιστρέφει το αντικείμενο ar.
ε)  Μια επικάλυψη του τελεστή ++ τέτοια ώστε η έκφραση ++ar όπου ar αντικείμενο τύπου array να διαβάζει και να καταχωρεί τις τιμές
     των στοιχείων του πίνακα που ορίζει το αντικείμενο ar.
ζ)  Μια επικάλυψη του τελεστή ! τέτοια ώστε η έκφραση !ar, όπου ar αντικείμενο τύπου array, να εκτυπώνει τα στοιχεία του πίνακα που
     ορίζει το αντικείμενο ar.
η)  Μια επικάλυψη του τελεστή << τέτοια ώστε η έκφραση p<<ar, όπου p ένας pointer σε pointer σε στοιχεία τύπου float και ar αντικείμενο
     τύπου array, αφού δεσμεύσει δυναμικά την κατάλληλη μνήμη χρησιμοποιώντας τον pointer p, να καταχωρεί στον πίνακα που
     δημιουργήθηκε τα στοιχεία του πίνακα που ορίζει το αντικείμενο ar. Ως επιστρεφόμενη τιμή για τη συνάρτηση επικάλυψης να είναι ο
     τύπος void.

     Στο λογισμικό να οριστεί ακόμη η συνάρτηση void make_pos η οποία να δέχεται ως όρισμα έναν πίνακα δύο διαστάσεων στον οποίο να αντικαθιστά τα στοιχεία του που είναι αρνητικά με τις απόλυτες τιμές τους.

     Η συνάρτηση main του προγράμματος να ορίζει τα αντικείμενα a και b τύπου array και τον pointer σε pointer p σε στοιχεία τύπου float. Το πρόγραμμα να διαβάζει τις τιμές των n και m για το αντικείμενο a και χρησιμοποιώντας της επικαλύψεις που ορίστηκαν, να δημιουργεί τον αντίστοιχο πίνακα για το αντικείμενο a και να διαβάζει τις τιμές αυτού του πίνακα. Στη συνέχεια, αφού καταχωρίσει το αντικείμενο που επιστρέφει η έκφραση a*(~a) ως τιμή για το αντικείμενο b, να χρησιμοποιεί την έκφραση p<<b για να δημιουργήσει τον πίνακα p και να καταχωρίσει σε αυτόν τα στοιχεία του πίνακα που ορίζει το αντικείμενο b. Τέλος αφού κληθεί η συνάρτηση make_pos για τον πίνακα p, να εκτυπώνεται ο πίνακας p που θα προκύψει μετά την κλήση της συνάρτησης καθώς και ο πίνακας που όρισε το αντικείμενο b. Με το τέλος του προγράμματος να απελευθερώνεται η όποια μνήμη δεσμεύτηκε δυναμικά.

     Σημείωση: Εφόσον είναι δυνατόν οι συναρτήσεις επικάλυψης να οριστούν ως μέλη της κλάσης στην οποία ανήκουν τα αντίστοιχα
     αντικείμενα.    


Title: Re: [C++] 5η Εργασία 2010
Post by: Groucho on November 23, 2010, 22:49:05 pm
η ηλιθιοτερη εργασια ολων των εποχων!!!


Title: Re: [C++] 5η Εργασία 2010
Post by: Room on November 24, 2010, 00:17:44 am
Γιατί έτσι;


Title: Re: [C++] 5η Εργασία 2010
Post by: Orfikoss on November 24, 2010, 01:36:33 am
μεγάλη κουβάντα...


Title: Re: [C++] 5η Εργασία 2010
Post by: mafalda on November 26, 2010, 20:00:24 pm
Πώς θα επιστραφεί ο πίνακας στο p στην main,αφού ο operator<< πρέπει να είναι void;


Title: Re: [C++] 5η Εργασία 2010
Post by: sabpap on November 27, 2010, 13:59:31 pm
Πώς θα επιστραφεί ο πίνακας στο p στην main,αφού ο operator<< πρέπει να είναι void;

Για να επιστραφει ο πινακας p  νομιζω πως δηλωνεις τη συναρτηση ως εξης:  friend void operator<<(float **&p,array ar);


Title: Re: [C++] 5η Εργασία 2010
Post by: The Stig on November 27, 2010, 19:50:28 pm
Πολλαπλασιασμό εννοεί το matrix product ή elementary-wise??


Title: Re: [C++] 5η Εργασία 2010
Post by: Τσαμπίκα on November 28, 2010, 22:57:25 pm
Στη συνάρτηση free θέλω να ελευθερώσω τη μνήμη που καταλαμβάνει
ο πίνακας που ορίζει το αντικείμενο α.Όμως βάζω free(a); και εμφανίζει error.Ξέρει κάποιος τι μπορώ να κάνω?


Title: Re: [C++] 5η Εργασία 2010
Post by: proud_metalhead on November 29, 2010, 00:31:08 am
Στη συνάρτηση free θέλω να ελευθερώσω τη μνήμη που καταλαμβάνει
ο πίνακας που ορίζει το αντικείμενο α.Όμως βάζω free(a); και εμφανίζει error.Ξέρει κάποιος τι μπορώ να κάνω?
επειδη ο πινακας ειναι δισδιαστατος πρεπει πρωτα να κανεις μια for μεσα στην οποια ελευθερωνεις τισ στηλες και μετα να κανεις την τελικη free

Code:
for(i=0; i<c; i++)
{
free a[i];
}
free (a);
οπου c ο αριθμος των στηλων
καπως ετσι


Title: Re: [C++] 5η Εργασία 2010
Post by: Tius on December 01, 2010, 22:49:05 pm
Πώς θα επιστραφεί ο πίνακας στο p στην main,αφού ο operator<< πρέπει να είναι void;

Για να επιστραφει ο πινακας p  νομιζω πως δηλωνεις τη συναρτηση ως εξης:  friend void operator<<(float **&p,array ar);

Kanonika einai xoris to & giati i p einai idi pointer se pointer alla doulebei kai etsi (dokimasmeno se compiler dev c++).


Title: Re: [C++] 5η Εργασία 2010
Post by: nikitas350 on December 02, 2010, 17:38:31 pm
Πώς θα επιστραφεί ο πίνακας στο p στην main,αφού ο operator<< πρέπει να είναι void;

Για να επιστραφει ο πινακας p  νομιζω πως δηλωνεις τη συναρτηση ως εξης:  friend void operator<<(float **&p,array ar);

Kanonika einai xoris to & giati i p einai idi pointer se pointer alla doulebei kai etsi (dokimasmeno se compiler dev c++).

Αν το φέρεις χωρίς το & πρέπει να έχεις κάνει την δέσμευση μνήμης για το p στην main, γιατί ουσιαστικά φέρνεις ένα αντίγραφο του διπλού pointer...


Title: Re: [C++] 5η Εργασία 2010
Post by: varvoutis on January 24, 2011, 20:36:48 pm
Καλησπερα παδια,

προσπαθωντας να τρεξω τη λυση της φετινης εργασίας Ε, μου χτυπησε ο compiler ( Xcode Version 3.2.5 64-bit ) ( Mac OS X Version 10.6.6 ) στη γραμμη

b=a*(~a);

με μηνυμα

no match for 'operator*' in 'a * a. array::operator~()'

Η λυση ειναι των διδασκοντων. Ξερει κανεις τι παιζει και γιατι χτυπαει;

Ευχαριστω





Title: Re: [C++] 5η Εργασία 2010
Post by: nikitas350 on January 25, 2011, 03:31:02 am
Καλησπερα παδια,

προσπαθωντας να τρεξω τη λυση της φετινης εργασίας Ε, μου χτυπησε ο compiler ( Xcode Version 3.2.5 64-bit ) ( Mac OS X Version 10.6.6 ) στη γραμμη

b=a*(~a);

με μηνυμα

no match for 'operator*' in 'a * a. array::operator~()'

Η λυση ειναι των διδασκοντων. Ξερει κανεις τι παιζει και γιατι χτυπαει;

Ευχαριστω


Χτυπάει επειδή καλείς μια επικάλυψη (η οποία δέχεται όρισμα array&) με όρισμα ένα temporary αντικείμενο (τα οποία είναι const). Αυτό μπορεί να οδηγήσει σε error ή warning (ανάλογα με τον compiler). Για να το διορθώσεις αλλάζεις τις παρακάτω γραμμές ως εξής:

Γραμμή 11: array operator*(const array &b);
Γραμμή 12: array operator=(const array &b);
Γραμμή 51: array array::operator*(const array &b)
Γραμμή 69: array array::operator*(const array &b)


Title: Re: [C++] 5η Εργασία 2010
Post by: varvoutis on January 25, 2011, 13:09:43 pm
Ευχαριστω Νικητα, ειχες δικιο! Μπορεις μηπως να μου πεις κι ολας πού να ανατρεξω στο βιβλιο ή εστω στις σημειωσεις του Κορτεση για να ξεδιαλυνω αυτο το λεπτο σημειο;

Ευχαριστω  ;)


Title: Re: [C++] 5η Εργασία 2010
Post by: nikitas350 on January 25, 2011, 13:31:49 pm
Στις σημειώσεις δεν λέει πουθενά για const. Στο βιβλίο έχει κάποια διάσπαρτα κομμάτια. Ούτως ή άλλως δεν έχουμε πει στην τάξη για const οπότε είναι εκτός. Κατά τα άλλα μπορείς να δείς εδώ http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter08_015.html
και πιο γενικά όλο αυτό:
http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter08.html


Title: Re: [C++] 5η Εργασία 2010
Post by: varvoutis on January 25, 2011, 13:34:04 pm
ευχαριστω πολυ!  ^peace^