Title: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: George_RT on November 21, 2013, 14:32:11 pm Άσκηση D Με στόχο να δημιουργηθεί μια βιβλιοθήκη με διάφορες επικαλύψεις τελεστών οι οποίες να διαχειρίζονται πράξεις με πίνακες να οριστούν οι κλάσεις matrix και vector. Η κλάση matrix, η οποία να υλοποιεί έναν πίνακα δύο διαστάσεων, να ορίζει τις ακέραιες μεταβλητές r και c και ως έναν pointer σε pointer σε στοιχεία τύπου float τη μεταβλητή m. Ως συναρτήσεις μέλη της κλάσης matrix να οριστούν: α) Mια επικάλυψη του τελεστή () τέτοια ώστε η έκφραση a(n,k), όπου a αντικείμενο τύπου matrix και n και k ακέραιοι αριθμοί, να δεσμεύει δυναμικά μνήμη για έναν πίνακα δύο διαστάσεων, με στοιχεία τύπου float, με n γραμμές και k στήλες. Η επικάλυψη να θέτει r=n και c=k και να διαβάζει τιμές για τα στοιχεία του πίνακα. β) Μια επικάλυψη του τελεστή ! τέτοια ώστε η έκφραση !a, όπου a αντικείμενο τύπου matrix το οποίο υλοποιεί ένα τετραγωνικό πίνακα, να επιστρέφει την τιμή 0 αν ο πίνακας είναι διαγωνίως υπερτερών. Διαφορετικά να επιστρέφει την τιμή 1. γ) Μία επικάλυψη του τελεστή [ ] τέτοια ώστε η έκφραση a[j], όπου a αντικείμενο τύπου matrix και i και j ακέραιοι αριθμοί, να επιστρέφει την τιμή του στοιχείου του πίνακα που ορίζει το αντικείμενο a, το οποίο βρίσκεται στην i γραμμή και στην j στήλη του πίνακα. Η κλάση vector, η οποία να υλοποιεί ένα διάνυσμα, να ορίζει την ακέραια μεταβλητή n και ως έναν pointer σε στοιχεία τύπου float τη μεταβλητή v. Ως συναρτήσεις μέλη της κλάσης vector να οριστούν : α) Μια επικάλυψη του τελεστή ( ) τέτοια ώστε η έκφραση b(k), όπου b αντικείμενο τύπου vector και k ακέραιος αριθμός, να δεσμεύει δυναμικά μνήμη για ένα πίνακα με k στοιχεία τύπου float χρησιμοποιώντας τον pointer v, να θέτει n=k και να διαβάζει τιμές για τα στοιχεία του πίνακα. β) Μια δεύτερη επικάλυψη του τελεστή ( ) τέτοια ώστε η έκφραση b(d,e), όπου b και d αντικείμενα τύπου vector και e αριθμός τύπου float, να επιστρέφει την τιμή 1 αν |b.v-d.v|<e για i=0,…,n-1. Διαφορετικά να επιστρέφεται την τιμή 0. γ) Μια επικάλυψη του τελεστή = τέτοια ώστε η έκφραση b=a, όπου b αντικείμενο τύπου vector και a αντικείμενο τύπου matrix να καταχωρεί ως τιμές για τις συνιστώσες του διανύσματος που υλοποιεί το αντικείμενο b τα διαγώνια στοιχεία του πίνακα που υλοποιεί το αντικείμενο a. δ) Μια επικάλυψη του τελεστή * τέτοια ώστε η έκφραση b*d, όπου b και d αντικείμενα τύπου vector, να επιστρέφει ένα αντικείμενο του ίδιου τύπου για το οποίο, ως τιμές των συνιστωσών του διανύσματος που υλοποιεί, να έχουν καταχωρηθεί τα γινόμενα των αντιστοίχων συνιστωσών των διανυσμάτων που υλοποιούν τα αντικείμενα b και d. ε) Μια επικάλυψη του τελεστή - τέτοια ώστε η έκφραση b-d, όπου b και d αντικείμενα τύπου vector, να επιστρέφει ένα αντικείμενο του ίδιου τύπου για το οποίο, ως τιμές των συνιστωσών του διανύσματος που υλοποιεί, να έχουν καταχωρηθεί οι διαφορές των αντιστοίχων συνιστωσών των διανυσμάτων που υλοποιούν τα αντικείμενα b και d. στ) Μια επικάλυψη του τελεστή + τέτοια ώστε η έκφραση b+d, όπου b και d αντικείμενα τύπου vector, να επιστρέφει ένα αντικείμενο του ίδιου τύπου για το οποίο, ως τιμές των συνιστωσών του διανύσματος που υλοποιεί, να έχουν καταχωρηθεί τα αθροίσματα των αντιστοίχων συνιστωσών των διανυσμάτων που υλοποιούν τα αντικείμενα b και d . ζ) Μια επικάλυψη του τελεστή / τέτοια ώστε η έκφραση b/d, όπου b και d αντικείμενα τύπου vector, να επιστρέφει ένα αντικείμενο του ίδιου τύπου για το οποίο, ως τιμές των συνιστωσών του διανύσματος που υλοποιεί, να έχουν καταχωρηθεί τα πηλίκα των αντιστοίχων συνιστωσών των διανυσμάτων που υλοποιούν τα αντικείμενα b και d. η) Μια επικάλυψη του τελεστή [ ] τέτοια ώστε η έκφραση b, όπου b αντικείμενο τύπου vector, και i αριθμός τύπου int να επιστρέφει την τιμή του στοιχείου που βρίσκεται στην i θέση του πίνακα που υλοποιεί το αντικείμενο b. Ως αυτόνομη συνάρτηση να οριστεί ακόμη στο πρόγραμμα μια επικάλυψη του τελεστή * τέτοια ώστε η έκφραση a*b όπου a αντικείμενο τύπου matrix και b αντικείμενο τύπου vector να επιστρέφει ένα αντικείμενο τύπου vector στο οποίο, ο πίνακας που υλοποιεί, να περιέχει τις συνιστώσες του διανύσματος που θα προκύψει από τον πολλαπλασιασμό του τετραγωνικού πίνακα που υλοποιεί το αντικείμενο a επί το διάνυσμα που υλοποιεί το αντικείμενο b. Αφού δημιουργήσετε την πιο πάνω βιβλιοθήκη να ορίσετε την κλάση system_solve η οποία να υλοποιεί ένα σύστημα γραμμικών εξισώσεων. Η κλάση να ορίζει ένα αντικείμενο τύπου matrix που να υλοποιεί τον πίνακα των συντελεστών των αγνώστων και ένα αντικείμενο τύπου vector που να υλοποιεί το διάνυσμα των σταθερών όρων του συστήματος. Στην κλάση να ορίζεται η συνάρτηση vector solve(int k,float e) η οποία να επιστρέφει ένα αντικείμενο τύπου vector του οποίου ο πίνακας να περιέχει τη λύση του συστήματος. Για την επίλυση του συστήματος να χρησιμοποιηθεί η επαναληπτική μέθοδος xi+1=(b-a*xi+d*xi)/d όπου xi+1, b, xi και d είναι αντικείμενα τύπου vector και a αντικείμενο τύπου matrix. Το αντικείμενο b υλοποιεί το διάνυσμα των σταθερών όρων του συστήματος, το αντικείμενο a υλοποιεί τον πίνακα των συντελεστών των αγνώστων και το αντικείμενο d υλοποιεί ένα διάνυσμα που ως συνιστώσες περιέχει τα στοιχεία της κύριας διαγωνίου του πίνακα των συντελεστών των αγνώστων. Ο αλγόριθμος εφαρμόζεται επαναληπτικά δίνοντας μια αρχική τιμή για τη λύση στις συνιστώσες του διανύσματος που υλοποιεί το αντικείμενο xi και παίρνοντας μια νέα τιμή, πιο κοντά στη λύση του συστήματος, στις συνιστώσες του διανύσματος που υλοποιεί το αντικείμενο xi+1. Η διαδικασία επαναλαμβάνεται θέτοντας στη θέση του αντικειμένου xi το αντικείμενο xi+1 για να πάρουμε μια ακόμη καλύτερη λύση. Ο αλγόριθμος σχηματίζει μια ακολουθία διανυσμάτων xν οι συνιστώσες των οποίων συγκλίνουν προς τη λύση του συστήματος. Η διαδικασία επαναλαμβάνεται μέχρι, για δύο διαδοχικές προσεγγίσεις, οι απόλυτες τιμές των διαφορών των αντίστοιχων συνιστωσών των διανυσμάτων xi+1 και xi γίνουν όλες μικρότερες από τον αριθμό e που ορίζεται ως ακρίβεια για τη λύση. Επειδή ο αριθμός των επαναλήψεων μπορεί να είναι πολύ μεγάλος για να επιτευχθεί η ακρίβεια e, ως μέγιστος αριθμός επαναλήψεων να ορίζεται ο αριθμός k. Επειδή ο αλγόριθμος συγκλίνει προς τη λύση όταν ο πίνακας των συντελεστών των αγνώστων είναι διαγωνίως υπερτερών, πριν εφαρμόσετε τον αλγόριθμο, να κάνετε σχετικό έλεγχο χρησιμοποιώντας την επικάλυψη του τελεστή ! που ορίστηκε για τα αντικείμενα της κλάσης matrix. Η συνάρτηση main του προγράμματος να ορίζει ένα αντικείμενο στον τύπο της κλάσης system_solve και να καλεί την συνάρτηση solve() για να επιλύσει το αντίστοιχο σύστημα. Βοηθητικές παρατηρήσεις Το πρόγραμμα να ακολουθεί την αρχή της ενσωμάτωσης. Ένας τετραγωνικός πίνακας είναι διαγωνίως υπερτερών όταν, για κάθε ένα από τα στοιχεία του που βρίσκονται στην κύρια διαγώνιο του πίνακα, η απόλυτη τιμή του στοιχείου είναι μεγαλύτερη από το άθροισμα των απολύτων τιμών των υπολοίπων στοιχείων του πίνακα που βρίσκονται στην ίδια γραμμή ή από το άθροισμα των απολύτων τιμών των υπολοίπων στοιχείων του πίνακα που βρίσκονται στην ίδια στήλη. Ως συναρτήσεις μέλη μπορείτε να ορίσετε και όποια άλλη συνάρτηση νομίζετε αναγκαία για τη λειτουργία του προγράμματος. Οι συναρτήσεις επικάλυψης των τελεστών να ελέγχουν αν είναι δυνατή η αντίστοιχη πράξη. Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: AckermanMik on November 25, 2013, 17:47:29 pm Καμια ιδέα πως υλοποιείται το (γ) του Matrix?
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on November 25, 2013, 17:55:53 pm Καμια ιδέα πως υλοποιείται το (γ) του Matrix? ναι... εγω εκανα επικαλυψη τον [] ετσι ωστε οταν του δινεις α[2] να σου επιστρεφει εναν pointer τυπου float.. δλδ τον pointer που εχεις αποθηκευμενο στην θεση m[2] και αφου επιστρεψει αυτος ο Pointer μετα στο προγραμμα σου εχεις εναν ακομη δεικτη που σε στελνει εκει που θελεις.. Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: AckermanMik on November 25, 2013, 18:22:38 pm Θενκς θα το δω
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: AckermanMik on November 25, 2013, 20:35:21 pm Μήπως θα μπορούσες να βοηθήσεις παραπάνω? Δηλαδή τι θα κάνω θα ορίσω δυο επικαλύψεις?
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on November 25, 2013, 21:44:50 pm εχεις εναν πινακα τον m [j]..το κομματι m ειναι ενας pointer που σου δειχνει σε ποια μνημη ειναι αποθηκευμενη η i σειρα του πινακα.. οποτε εχοντας την i σειρα του πινακα(m) και βαζοντας εναν ακομη δεικτη (m[[j]) σε παει στον float που θελεις..τωρα κανοντας μια επικαλψη του Α μπορεις να επιστρεψεις την θεση μνημης της σειρας i στην main σου και εκει αφου θα μπει το [j] θα παρεις τον float που ζητας...χρησιμοποιεις ουσιαστικα τον τροπο αποθηκευσης ενος δισδιαστατου πινακα..
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: AckermanMik on November 25, 2013, 21:53:51 pm Δεν νομίζω να ζητάει αυτήν ακριβώς την υλοποίηση ο μερσιε κορτέσης αλλά σε ευαριστω
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on November 25, 2013, 21:56:37 pm δεν μου εμφανιζει καποια συμβολα οταν postαρω..απλα κανε επικαλυψη του A και επεστρεφε μεσω αυτης τον float* m του αντικειμενου.
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on November 25, 2013, 21:58:27 pm ζηταει να επικαλυψεις τον τελεστη [] ετσι ωστε η εκφραση Α(i)(j) να επιστρεφει το m(i)(j).. αυτο που εκανα εγω πληροι τα κριτηρια αλλα οπως νομιζεις..
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: AckermanMik on November 25, 2013, 22:04:22 pm γ) Μία επικάλυψη του τελεστή [ ] τέτοια ώστε η έκφραση a[j], όπου a αντικείμενο τύπου matrix και i και j ακέραιοι αριθμοί, να επιστρέφει την τιμή του στοιχείου του πίνακα που ορίζει το αντικείμενο a, το οποίο βρίσκεται στην i γραμμή και στην j στήλη του πίνακα.
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on November 25, 2013, 22:12:29 pm α δεν ειναι αυτο που ειπα εγω δλδ??? καλα δεν θα μαλωσουμε τωρα...
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: vasilis94 on November 25, 2013, 23:31:07 pm δεν μου εμφανιζει καποια συμβολα οταν postαρω..απλα κανε επικαλυψη του A και επεστρεφε μεσω αυτης τον float* m του αντικειμενου. Κι εμένα, όταν διαβάζω τα άλλα post δεν εμφανίζει το [ι] δίπλα στο [j], παρά μόνο όταν πάω να κάνω quote... τι φάση? :o Πάντως μια χαρά φαίνεται αυτό. Επίσης, υπάρχει και παρόμοια εργασία τη χρονιά 2011-12, ανεβασμένη στα downloads (strictly for help :P ) Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: AckermanMik on November 26, 2013, 00:40:00 am Δεν βρίσκω πως βοηθάει όταν έχω δυο αγκύλες.
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on November 26, 2013, 00:54:36 am Δεν βρίσκω πως βοηθάει όταν έχω δυο αγκύλες. αν το Α(i)=m(i) τοτε A(i)(j)=m(i)(j)...οποτε αν οταν δωσεις εντολη Α(i) επιστραφει το m(i) θα εχεις το ιδιο στοιχειο..δεν ξερω πως να τ εξηγησω αλλιως..ισως αν εριχνες μια ματια στο πως υλοποιειται ενας δισδιαστατος πινακας δυναμικα να καταλαβαινες τι εννοω.. Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: απλυτος on November 26, 2013, 04:35:13 am Δεν βρίσκω πως βοηθάει όταν έχω δυο αγκύλες. αν το Α(i)=m(i) τοτε A(i)(j)=m(i)(j)...οποτε αν οταν δωσεις εντολη Α(i) επιστραφει το m(i) θα εχεις το ιδιο στοιχειο..δεν ξερω πως να τ εξηγησω αλλιως..ισως αν εριχνες μια ματια στο πως υλοποιειται ενας δισδιαστατος πινακας δυναμικα να καταλαβαινες τι εννοω.. ισχύει στα σίγουρα. εκ του αποτελέσματος. η αλήθεια είναι ότι είναι σπαζοκεφαλιά. επιχειρώ βοήθεια, όπως το αντιλαμβάνομαι. ο τελεστής () -με την υπερφόρτωση που του κάνεις- σου επιστρέφει σε μορφή απλού pointer, τον διπλό pointer που βρίσκεται αριστερά του, επαυξημένο κατά i θέσεις. αρα έστω m[j] = (m + c*i*sizeof(float))[j] . και πάλι αριστερά του j υπάρχει ένας pointer, οπότε τελικά m[j]=(m + c*i*sizeof(float) )+ j*sizeof(float) Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: AckermanMik on November 26, 2013, 11:36:53 am Οκ αλλά πως γίνεται να σου επιστρέφει την τιμή του στοιχείου ο ίδιος ο τελεστής επικάλυψης όπως άλλωστε αναφέρει η εργασία??
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on November 26, 2013, 11:48:18 am δεν σου ζηταει να επιστρεφει η επικαλυψη το στοιχειο σου..σου ζηταει να γινει επικαλυψη του τελεστη ετσι ωστε η συνολικη εκφραση να επιστρεφει το στοιχειο σου(ουσιαστικα δεν ειναι αμεση επιστροφη του στοιχειου)..δλδ εσυ επιστρεφεις το Α(i) και αφου αλληλεπιδρασει με το (j) οπως αλληλεπιδρα κανονικα ενας pointer σου δινει το στοιχειο σου..
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on November 27, 2013, 19:55:54 pm στην εκφωνηση λεει "Οι συναρτήσεις επικάλυψης των τελεστών να ελέγχουν αν είναι δυνατή η αντίστοιχη πράξη". Ή δεν ξέρω τι σημαίνει αυτό ή εννοεί ότι παραδείγματος χάριν όταν εκτελέσεις !A (A αντικείμενο τύπου matrix που υλοποιει τετραγωνικο πινακα) να ελέγχει πρώτα αν όντως είναι τετραγωνικός και ούτω καθ'εξής σε όλους τους τελεστές που επικαλύπτεις. Αλλά άντε και έλεγξα εγώ. Αν βρω ότι δεν έπρεπε να καλεστεί αυτός ο τελεστής με αυτό το αντικείμενο τί κάνω; Κάνω exit απο τον τελεστή και μετά τί; Απλά αντιλαμβάνομαι ότι ο χρήστης δινει μ******* και τον πετάω;
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: vasilis1005 on November 29, 2013, 01:16:07 am το η του vector πως γινεται;
(βασικα δεν καταλαβαινω και τι ζηταει) Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: Mr K on November 29, 2013, 03:53:03 am στην εκφωνηση λεει "Οι συναρτήσεις επικάλυψης των τελεστών να ελέγχουν αν είναι δυνατή η αντίστοιχη πράξη". Ή δεν ξέρω τι σημαίνει αυτό ή εννοεί ότι παραδείγματος χάριν όταν εκτελέσεις !A (A αντικείμενο τύπου matrix που υλοποιει τετραγωνικο πινακα) να ελέγχει πρώτα αν όντως είναι τετραγωνικός και ούτω καθ'εξής σε όλους τους τελεστές που επικαλύπτεις. Αλλά άντε και έλεγξα εγώ. Αν βρω ότι δεν έπρεπε να καλεστεί αυτός ο τελεστής με αυτό το αντικείμενο τί κάνω; Κάνω exit απο τον τελεστή και μετά τί; Απλά αντιλαμβάνομαι ότι ο χρήστης δινει μ******* και τον πετάω; ακριβως αυτα που λες απο την αρχή μέχρι το τέλος :D :D Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: Mr K on November 29, 2013, 03:55:11 am το η του vector πως γινεται; (βασικα δεν καταλαβαινω και τι ζηταει) Διαβασε παραπάνω Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: alexampa on December 01, 2013, 01:24:28 am Μπορεί να βοηθήσει κάποιος στο πώς ακριβώς θα λειτουργεί ο αλγόριθμος της solve?? :-\ Και εκεί που λέει να δίνεται μια αρχική τιμή για τη λύση στις συνιστώσες του διανύσματος που υλοποιεί το αντικείμενο xi τι πρέπει να κάνουμε??
Επίσης, όταν λέει "Η κλάση system_solve να ορίζει ένα αντικείμενο τύπου matrix και ένα αντικείμενο τύπου vector" εννοεί να τα ορίσουμε στο σώμα της κλάσης στο public/private κομμάτι της?? Εγώ αυτό κατάλαβα αλλά έτσι τα αντικείμενα μου καταστρέφονται πριν τελειώσουν οι πράξεις... :S Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on December 01, 2013, 03:14:11 am πιστευω πως τον εξηγει καλα τον αλγοριθμο ο κορτεσης αλλα ας κανουμε μια προσπαθεια για παραπανω αναλυση.
αρχικοποιεις το d. μετα εχεις δυο vectors ενα που θα μπαινει στην επαναληψη και ενα που θα παιρνει την επομενη τιμη μεσα στην επαναληψη μεσω της εξισωσης. επειτα συγκρινεις με e το πριν και το μετα διανυσμα και αν σε ικανοποιει η ακριβεια βγαινεις αλλιως επομενη επαναληψη.στο τελος απλα στελνεις το τελικο vector. απλα στις αρχικοποιησεις θελει λιγη προσοχη αναλογα με το πως υλοποιησες τις επικαλυψεις Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: galletti on December 01, 2013, 17:54:41 pm Γινεται να ορισουμε στην κλαση system_solve αντικειμενα τυπου matrix και vector?
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on December 01, 2013, 18:01:33 pm ρωτας επειδη σου φαινεται παραξενο ή επειδη δεν ειδες οτι λεει στην εκφωνηση " Η κλάση να ορίζει ένα αντικείμενο τύπου matrix που να υλοποιεί τον πίνακα των συντελεστών των αγνώστων και ένα αντικείμενο τύπου vector που να υλοποιεί το διάνυσμα των σταθερών όρων του συστήματος.";
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: galletti on December 01, 2013, 18:09:18 pm το πρωτο :P
Γινεται παντως? Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: giorgos4934 on December 01, 2013, 18:13:00 pm ναι ρε. πως δεν γινεται??
Title: Re: [C++] Άσκηση Δ - 2013/2014 - Προθεσμία 01/12 Post by: galletti on December 01, 2013, 18:14:21 pm Ευχαριστω!
|