THMMY.gr

Μαθήματα Βασικού Κύκλου => Αντικειμενοστραφής Προγραμματισμός => Topic started by: pepper ann on December 01, 2011, 23:56:03 pm



Title: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: pepper ann on December 01, 2011, 23:56:03 pm
Για την επίλυση ενός συστήματος γραμμικών εξισώσεων a*x=b, όπου a τετραγωνικός πίνακας, x το διάνυσμα των αγνώστων και  b το διάνυσμα των σταθερών όρων,  μπορεί να εφαρμοστεί ένας επαναληπτικός αλγόριθμος ο οποίος υλοποιείται από τη σχέση  xi+1=(b-a*xi+d*xi)/d , όπου d το διάνυσμα που έχει ως συνιστώσες τα διαγώνια στοιχεία του πίνακα a. Η εφαρμογή του αλγορίθμου δημιουργεί μια ακολουθία διανυσμάτων xν η οποία τείνει στη λύση του συστήματος. Η σύγκληση του αλγορίθμου δεν είναι εξασφαλισμένη σε κάθε περίπτωση. Ικανή συνθήκη για τη σύγκληση είναι ο πίνακας των συντελεστών να είναι διαγωνίως υπερτερών. Αυτό σημαίνει ότι για κάθε διαγώνιο στοιχείο του πίνακα πρέπει να ισχύει τουλάχιστον μια από τις σχέσεις
│ai,i│>

│ai,j│j=1,…,n (σχέση 1)
ή
│ai,i│>

│aj,i│ j=1,…n (σχέση 2).
 
j≠i
 
 
 
j≠i
 
Η ταχύτητα της σύγκλισης του αλγορίθμου εξαρτάται από το πόσο ισχυρές είναι οι πιο πάνω ανισότητες.
Για να ελεγχθεί αν ένας τετραγωνικός πίνακας είναι διαγωνίως υπερτερών να γραφεί το λογισμικό στο οποίο να ορίζονται
1) Η κλάση matrix η οποία, ως private στοιχεία, να ορίζει έναν pointer σε pointer σε στοιχεία τύπου float και την ακέραια μεταβλητή n. Με τη δημιουργία αντικειμένων στον τύπο της κλάσης να χρησιμοποιείται, ως όρισμα σε μία συνάρτηση αρχικών συνθηκών, η τιμή της n, να χρησιμοποιείται ο pointer για να δεσμευτεί δυναμικά μνήμη για έναν τετραγωνικό πίνακα τύπου nxn  και να διαβάζονται τα στοιχεία του πίνακα.
2) Η κλάση vector η οποία, ως private στοιχεία, να ορίζει έναν pointer για στοιχεία τύπου float και την ακέραια μεταβλητή n. Με τη δημιουργία αντικειμένων στον τύπο της κλάσης να χρησιμοποιείται, ως όρισμα σε μία συνάρτηση αρχικών συνθηκών, η τιμή της n και να χρησιμοποιείται ο pointer για να δεσμευτεί δυναμικά μνήμη για έναν πίνακα με n στοιχεία
Η κλάση matrix να διαθέτει ακόμη
α) Μία επικάλυψη του τελεστή [ ] τέτοια ώστε η έκφραση a[j], όπου a αντικείμενο στον τύπο της κλάσης, να επιστρέφει το στοιχείο που βρίσκεται στην i γραμμή και στην j στήλη του πίνακα που όρισε το αντικείμενο.
β) Μία επικάλυψη του τελεστή ! τέτοια ώστε η έκφραση !a, όπου a αντικείμενο στον τύπο της κλάσης, να επιστρέφει ένα αντικείμενο τύπου vector για το οποίο, στην i θέση του πίνακα, να έχει καταχωρηθεί το μικρότερο από τα αθροίσματα που ορίζονται στις σχέσεις 1 ή 2.
Η κλάση vector να διαθέτει ακόμη
α) Μία επικάλυψη του τελεστή > τέτοια ώστε η έκφραση d>v, όπου d και v αντικείμενα στον τύπο της κλάσης,  να επιστρέφει μια μη μηδενική τιμή αν κάθε στοιχείο του πίνακα που όρισε το αντικείμενο d είναι μεγαλύτερο από τo αντίστοιχο στοιχείο του πίνακα που όρισε το αντικείμενο v.
 β) Μία επικάλυψη του τελεστή = τέτοια ώστε η έκφραση d = a όπου d αντικείμενο στον τύπο της κλάσης και a αντικείμενο τύπου matrix να καταχωρεί ως στοιχεία για τον πίνακα που όρισε το αντικείμενο d τις απόλυτες τιμές των διαγώνιων στοιχείων του πίνακα που ορίζει το αντικείμενο a.
γ) Μία επικάλυψη του τελεστή - τέτοια ώστε η έκφραση v-w, όπου v και w αντικείμενα στον τύπο της κλάσης,  να επιστρέφει ένα αντικείμενο τύπου vector για το οποίο ο πίνακας που ορίζει να έχει ως στοιχεία τις διαφορές των αντίστοιχων στοιχείων των πινάκων που ορίζουν τα αντικείμενα v και w.
δ) Μία επικάλυψη του τελεστή ++ τέτοια ώστε η έκφραση ++v, όπου v αντικείμενο στον τύπο της κλάσης, να επιστρέφει το άθροισμα των στοιχείων του πίνακα που ορίζει το αντικείμενο v.
Η συνάρτηση main του προγράμματος να ορίζει ένα αντικείμενο a στον τύπο matrix και χρησιμοποιώντας της επικαλύψεις που ορίστηκαν στις κλάσεις matrix και vector να ελέγχει αν ο πίνακας που όρισε το αντικείμενο a είναι διαγωνίως υπερτερών. Το πρόγραμμα, για αυτόν το σκοπό, να ελέγχει την τιμή της έκφρασης d>v, όπου d το αντικείμενο που προέκυψε από την εντολή d = a; και v το αντικείμενο που προέκυψε από την εντολή v = !a;. Αν ο πίνακας διαπιστωθεί ότι είναι διαγωνίως υπερτερών να τυπώνεται ο πίνακας του αντικειμένου w που θα προκύψει από την εντολή w = d – v;  καθώς και η τιμή που θα επιστρέψει η έκφραση ++w.
Βοηθητικές παρατηρήσεις:
Το άθροισμα που δηλώνει η σχέση 1 είναι το άθροισμα των απολύτων τιμών των στοιχείων της i γραμμής εάν από αυτά εξαιρεθεί το στοιχείο που βρίσκεται στην κύρια διαγώνιο του πίνακα. 
Το άθροισμα που δηλώνει η σχέση 2 είναι το άθροισμα των απολύτων τιμών των στοιχείων της i στήλης εάν από αυτά εξαιρεθεί το στοιχείο που βρίσκεται στην κύρια διαγώνιο του πίνακα.


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: kostas4 on December 03, 2011, 21:25:02 pm
μηπως εχει κανει λαθος στον αλγόριθμο προσεγγισης λύσης?γιατι α*χι-->δινει πινακα ν*1
d*χι-->στοιχειο (αφου παιρνουμε d(1*ν) για να γινεται ο πολλαπλασιασμος... :o


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: pentium4 on December 03, 2011, 22:18:23 pm
μηπως εχει κανει λαθος στον αλγόριθμο προσεγγισης λύσης?γιατι α*χι-->δινει πινακα ν*1
d*χι-->στοιχειο (αφου παιρνουμε d(1*ν) για να γινεται ο πολλαπλασιασμος... :o

ξεκινησαν οι αποριες οποτε αναγκαστικα σβηνω τα παραπανω .. προτεινω να κανουμε τοπικ για τα απωθημενα μας παντως(αναφορικα με τη c++  :D )


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: mark333 on December 06, 2011, 18:53:38 pm
Πως μπορώ να κάνω διπλή επικάλυψη του τελεστή []..??? Έχω ψάξει σε 100 site και λένε ότι δεν γίνεται ενώ γίνεται με ( ) .. Μήπως αυτό εννοεί??

edit: Το βρήκα οκ..


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: eleni on December 06, 2011, 19:15:17 pm
αφού το βρήκες πες το και σε μας... :)


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: mark333 on December 06, 2011, 19:36:07 pm
αφού το βρήκες πες το και σε μας... :)

Code:
float * operator[] (int i)
           {
                 return table[i];
           }

Για κάποιο λόγο πρέπει να επιστρέφει pointer και όχι σκέτο float οπότε επιστρέφεις την θέση κάθε γραμμής.


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: pepper ann on December 07, 2011, 02:13:27 am
να σαι καλά φίλε
δεν μπορούσα να το βρω με τίποτα
:)


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Δον on December 07, 2011, 10:59:37 am
Eγώ έχω μια άλλη απορία 

 

│ai,i│>

│ai,j│j=1,…,n (σχέση 1)
ή
│ai,i│>

│aj,i│ j=1,…n (σχέση 2).
 
j≠i
 
 
 
j≠i
 


Τι σημαίνει ai,i???? :S


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Ναταλία on December 07, 2011, 11:42:16 am
αφού το βρήκες πες το και σε μας... :)

Code:
float * operator[] (int i)
           {
                 return table[i];
           }

Για κάποιο λόγο πρέπει να επιστρέφει pointer και όχι σκέτο float οπότε επιστρέφεις την θέση κάθε γραμμής.

table ειναι ο δισδιαστατος σου πινακας σωστα?


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: princess_of_the_dawn on December 07, 2011, 14:57:35 pm
Quote
Η κλάση matrix η οποία, ως private στοιχεία, να ορίζει έναν pointer σε pointer σε στοιχεία τύπου float και την ακέραια μεταβλητή n. Με τη δημιουργία αντικειμένων στον τύπο της κλάσης να χρησιμοποιείται, ως όρισμα σε μία συνάρτηση αρχικών συνθηκών, η τιμή της n, να χρησιμοποιείται ο pointer για να δεσμευτεί δυναμικά μνήμη για έναν τετραγωνικό πίνακα τύπου nxn  και να διαβάζονται τα στοιχεία του πίνακα.
???
επίσης μάθαμε να δεσμεύουμε μνήμη με new;



Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: princess_of_the_dawn on December 07, 2011, 15:17:29 pm
Eγώ έχω μια άλλη απορία 

 

│ai,i│>

│ai,j│j=1,…,n (σχέση 1)
ή
│ai,i│>

│aj,i│ j=1,…n (σχέση 2).
 
j≠i
 
 
 
j≠i
 


Τι σημαίνει ai,i???? :S

a(i)(i) λογικά

εδιτ:όπου (=[ απλά για κάποιον λόγο δεν μου το εμφανίζει όταν το γράφω έτσι


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Niobe on December 07, 2011, 15:19:16 pm
Quote
Η κλάση matrix η οποία, ως private στοιχεία, να ορίζει έναν pointer σε pointer σε στοιχεία τύπου float και την ακέραια μεταβλητή n. Με τη δημιουργία αντικειμένων στον τύπο της κλάσης να χρησιμοποιείται, ως όρισμα σε μία συνάρτηση αρχικών συνθηκών, η τιμή της n, να χρησιμοποιείται ο pointer για να δεσμευτεί δυναμικά μνήμη για έναν τετραγωνικό πίνακα τύπου nxn  και να διαβάζονται τα στοιχεία του πίνακα.
???
επίσης μάθαμε να δεσμεύουμε μνήμη με new;



+1


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: lab_irs on December 07, 2011, 20:26:00 pm
 Μία επικάλυψη του τελεστή ! τέτοια ώστε η έκφραση !a, όπου a αντικείμενο στον τύπο της κλάσης, να επιστρέφει ένα αντικείμενο τύπου vector για το οποίο, στην i θέση του πίνακα, να έχει καταχωρηθεί το μικρότερο από τα αθροίσματα που ορίζονται στις σχέσεις 1 ή 2.


Πως γινεται αυτο?


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Niobe on December 07, 2011, 22:26:24 pm
Μία επικάλυψη του τελεστή = τέτοια ώστε η έκφραση d = a όπου d αντικείμενο στον τύπο της κλάσης και a αντικείμενο τύπου matrix να καταχωρεί ως στοιχεία για τον πίνακα που όρισε το αντικείμενο d τις απόλυτες τιμές των διαγώνιων στοιχείων του πίνακα που ορίζει το αντικείμενο a

Και σε αυτο οποιος μπορεσει τα φωτα του....

εδιτ:βρεθηκε


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Avraam on December 08, 2011, 14:46:18 pm
Μία επικάλυψη του τελεστή = τέτοια ώστε η έκφραση d = a όπου d αντικείμενο στον τύπο της κλάσης και a αντικείμενο τύπου matrix να καταχωρεί ως στοιχεία για τον πίνακα που όρισε το αντικείμενο d τις απόλυτες τιμές των διαγώνιων στοιχείων του πίνακα που ορίζει το αντικείμενο a

Και σε αυτο οποιος μπορεσει τα φωτα του....

εδιτ:βρεθηκε


Δωσε μας τα φωτα σου panourge γιατι δεν την παλευουμε αλλο...Ρε μπας και οι κλασεις κληρονομουνται και δεν το λεει...?????  >:(


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: JakeLaMotta on December 09, 2011, 18:49:21 pm
Φιλική συμβουλή:
Τσεκάρετε την εργασία E της χρονιάς 2009-2010,είναι παρόμοια με αυτήν κ πιθανόν να σας βοηθήσει σε αρκετά σημεία.Μόνο προσεχτικά,μοιάζουν απλά,δεν είναι ίδιες.

Οι εργασίες της χρονιάς 2009-10 υπάρχουν στα downloads του μαθήματος(και της χρονιάς 2010-11).


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: JakeLaMotta on December 09, 2011, 19:36:28 pm
Μία επικάλυψη του τελεστή = τέτοια ώστε η έκφραση d = a όπου d αντικείμενο στον τύπο της κλάσης και a αντικείμενο τύπου matrix να καταχωρεί ως στοιχεία για τον πίνακα που όρισε το αντικείμενο d τις απόλυτες τιμές των διαγώνιων στοιχείων του πίνακα που ορίζει το αντικείμενο a

Και σε αυτο οποιος μπορεσει τα φωτα του....

εδιτ:βρεθηκε


Δωσε μας τα φωτα σου panourge γιατι δεν την παλευουμε αλλο...Ρε μπας και οι κλασεις κληρονομουνται και δεν το λεει...?????  >:(

Μην εκνευρίζεσαι άδικα.Αυτό ειδικά υπάρχει ίδιο στην εργασία Ε της χρονιάς 2009-2010,είναι το α) πιο συγκεκριμένα.


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: ttheocha on December 09, 2011, 21:27:05 pm
Re paidia uparxei kapoios pou na kserei pws ulopoieitai o copy constructor gia pinakes????  

ελληνικους χαρακτηρες .ξαναγραψτο


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: princess_of_the_dawn on December 10, 2011, 00:53:14 am
υπάρχει καμιά έτοιμη συνάρτηση για την απόλυτη τιμή;


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: pentium4 on December 10, 2011, 01:01:55 am
υπάρχει καμιά έτοιμη συνάρτηση για την απόλυτη τιμή;

abs() στη math.h νομιζω


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: christineL on December 10, 2011, 04:03:51 am
πως γινεται η επικαλυψη του τελεστη ! ,τετοια ωστε η εκφραση να επιστρεφει ενα αντικειμενο τυπου vector ενω το α ειναι τυπου Matrix?? εννοω η δηλωση της ..ψαχνω εδω και ποση ωρα στο google αλλα τιποτα. Προφανως με friend,αλλα πώς???????


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Ναταλία on December 10, 2011, 12:37:29 pm
πως γινεται η επικαλυψη του τελεστη ! ,τετοια ωστε η εκφραση να επιστρεφει ενα αντικειμενο τυπου vector ενω το α ειναι τυπου Matrix?? εννοω η δηλωση της ..ψαχνω εδω και ποση ωρα στο google αλλα τιποτα. Προφανως με friend,αλλα πώς???????


εγω το εκανα καπως ετσι:
vector operator!(); και επιστρεφει ενα αντικειμενο vector!


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: christineL on December 10, 2011, 12:46:38 pm
το εκανα ευχαριστω . Και μια αλλη απορια , χρησιμοποιουμε σαν ορισμα μεσα σε μια κλαση μια διαφορετικη κλαση. Οπότε κάνω απλά μια δήλωση της matrix πχ ως class matrix; πριν δηλώσω τη vector.Γράφω τον κώδικα της vector,μετά της matrix αλλα συνεχίζει ν μου λεει  forward declaration of `struct matrix' , και αναποδα να το κανω το ιδιο προβλημα.κανεις καμμια ιδεα?


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: christineL on December 10, 2011, 13:05:30 pm
Εὑρέθη


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Salvation on December 10, 2011, 13:19:47 pm
Μια ερώτηση και εγώ. Στον τελεστή !α θα πρέπει να καταχωρήσουμε το τιμές στον πινακα ενός προσωρινού αντικειμένου τύπου vector. Αυτό το κάνετε μεσω συνάρτησης έτσι; Δλδ φτιάξατε μια set(int i) μέσα στη vector που συμπληρώνει το i στοιχείο του πινακα;


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: anchelon on December 10, 2011, 13:52:25 pm
παιδιά τι προτείνετε?Συναρτήσεις μέλους ή φιλικές συν/σεις για επικάλυψη? :???:


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Kle on December 10, 2011, 14:26:50 pm
Φιλικες συναρτησεις θα κανεις ΜΟΝΟ οταν δεν μπορεις να κανεις συναρτησεις μελους
Αυτο ειπε ο συμεω τουλαχιστον


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: anchelon on December 10, 2011, 16:08:23 pm
Φιλικες συναρτησεις θα κανεις ΜΟΝΟ οταν δεν μπορεις να κανεις συναρτησεις μελους
Αυτο ειπε ο συμεω τουλαχιστον
οκ tnx αν και οι φιλικές τουλ εμένα μου φαινονται πιο κατανοητές.


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: anchelon on December 10, 2011, 17:31:14 pm
Στο ερώτημα β) της matrix το i είναι τυχαίο, το διαβάζουμε από κάπου ή τπτ από τα 2?Τι είναι τελος πάντων?


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: anchelon on December 10, 2011, 17:34:09 pm
Στο ερώτημα β) της matrix το i είναι τυχαίο, το διαβάζουμε από κάπου ή τπτ από τα 2?Τι είναι τελος πάντων?
Βασικά πως γίνεται αυτό το ερώτημα?? :o


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: ForestBlack on December 10, 2011, 20:34:42 pm




Quote
table ειναι ο διδιαστατος σου πινακας σωστα?

ναι και εγώ έτσι επιστρέφω τιμές για τον δισδιάστατο πίνακα μου.


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: pentium4 on December 10, 2011, 21:55:28 pm
ποιος μπορει να εξηγησει τι παζει με το i ;
το παιρνουμε ως ορισμα ;


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Andre on December 11, 2011, 12:45:34 pm
ποιος μπορει να εξηγησει τι παζει με το i ;
το παιρνουμε ως ορισμα ;

Αν εννοείς αύτο το i:
Στο ερώτημα β) της matrix το i είναι τυχαίο, το διαβάζουμε από κάπου ή τπτ από τα 2?Τι είναι τελος πάντων?

δεν το διαβάζεις. Σε κάθε θέση του διανύσματος vector θα υπάρχει το μικρότερο εκ των δύο αθροισμάτων. Πχ για την θέση i=0 του πίνακα-διανύσματος vector, συγκρίνεις τα Σ|α0,j| και Σ|αj,0|, που αναφέρονται στον πίνακα matrix, και βάζεις το μικρότερο από τα δύο στην 1η (i=0) θέση του vector.


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Andre on December 11, 2011, 15:14:19 pm
πως γινεται η επικαλυψη του τελεστη ! ,τετοια ωστε η εκφραση να επιστρεφει ενα αντικειμενο τυπου vector ενω το α ειναι τυπου Matrix?? εννοω η δηλωση της ..ψαχνω εδω και ποση ωρα στο google αλλα τιποτα. Προφανως με friend,αλλα πώς???????


εγω το εκανα καπως ετσι:
vector operator!(); και επιστρεφει ενα αντικειμενο vector!

Έτσι όμως τον float pointer της vector δε μπορεί να το δει ο operator.
Πάω να γράψω:
Code:
if (sum1[i]<sum2[i])
                  temp.p[i]=sum1[i];
             else
                  temp.p[i]=sum2[i];
και μου βγάζει αυτό:

In member function `vector matrix::operator!()':
`float*vector::p' is private
within this context (όπου context o operator)


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: mafalda on December 11, 2011, 15:24:51 pm
Εγώ πάντως την έκανα friend στις κλάσεις matrix,vector και μια χαρά δουλεύει.Δεν ξέρω πώς γίνεται να υλοποιηθεί σαν συνάρτηση μέλους σε μια από τις κλάσεις...

εδιτ:έτσι δλδ...
Code:
vector operator!(matrix a){
       int i,j,n;
       n=a.n;
       vector temp(n);
       for(i=0;i<n;i++){
                        float s1=0.0,s2=0.0;
                        for(j=0;j<n;j++){
                                         if(j!=i){
                                                  s1=s1+abs(a.matr[i][j]);
                                                  s2=s2+abs(a.matr[j][i]);
                                                  }
                                         }
                        if(s1<s2) temp.vect[i]=s1;
                        else temp.vect[i]=s2;
                        }
       return temp;
       }


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Andre on December 11, 2011, 15:44:24 pm
Σαν friend την έχω κάνει κι εγώ (ξέχασα να πω) και τρέχει κανονικά.
Απλά επειδή πιο πάνω είδα ότι την κάνανε μέλος της matrix, ήθελα να δω πώς γίνεται, αν γίνεται.


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: JakeLaMotta on December 11, 2011, 16:09:07 pm
Εγώ πάντως την έκανα friend στις κλάσεις matrix,vector και μια χαρά δουλεύει.Δεν ξέρω πώς γίνεται να υλοποιηθεί σαν συνάρτηση μέλους σε μια από τις κλάσεις...


Δηλαδή τη βάζεις μέσα και στις δύο κλάσεις τη δήλωσή της??Μπορούμε να το κάνουμε έτσι??Γιατί από την εκφώνηση εγώ έβγαλα το συμπέρασμα ότι η συνάρτηση που κάνει την επικάλυψη του !,θα πρέπει να είναι μόνο μέλος της κλάσης matrix.Πάντως,έτσι γίνεται σίγουρα πιο εύκολα,γιατί η συνάρτηση θα έχει κατευθείαν πρόσβαση στα private στοιχεία και των δύο κλάσεων.


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: pentium4 on December 11, 2011, 16:45:30 pm
ποιος μπορει να εξηγησει τι παζει με το i ;
το παιρνουμε ως ορισμα ;

Αν εννοείς αύτο το i:
Στο ερώτημα β) της matrix το i είναι τυχαίο, το διαβάζουμε από κάπου ή τπτ από τα 2?Τι είναι τελος πάντων?

δεν το διαβάζεις. Σε κάθε θέση του διανύσματος vector θα υπάρχει το μικρότερο εκ των δύο αθροισμάτων. Πχ για την θέση i=0 του πίνακα-διανύσματος vector, συγκρίνεις τα Σ|α0,j| και Σ|αj,0|, που αναφέρονται στον πίνακα matrix, και βάζεις το μικρότερο από τα δύο στην 1η (i=0) θέση του vector.


ευχαριστω αλλα πλεον νιωθω το  iq μου γυρω στο 50


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: alexis2044 on December 11, 2011, 16:46:23 pm
Εγώ πάντως την έκανα friend στις κλάσεις matrix,vector και μια χαρά δουλεύει.Δεν ξέρω πώς γίνεται να υλοποιηθεί σαν συνάρτηση μέλους σε μια από τις κλάσεις...

εδιτ:έτσι δλδ...
Code:
vector operator!(matrix a){
       int i,j,n;
       n=a.n;
       vector temp(n);
       for(i=0;i<n;i++){
                        float s1=0.0,s2=0.0;
                        for(j=0;j<n;j++){
                                         if(j!=i){
                                                  s1=s1+abs(a.matr[i][j]);
                                                  s2=s2+abs(a.matr[j][i]);
                                                  }
                                         }
                        if(s1<s2) temp.vect[i]=s1;
                        else temp.vect[i]=s2;
                        }
       return temp;
       }

Περί αυτού, εγώ φτιάχνω μια float set_vect(int i,float num){vect[ i ]=num;} μέλος της vector και κάνω

Code:
vector operator!(matrix a){
       int i,j,n;
       n=a.n;
       vector temp(n);
       for(i=0;i<n;i++){
                        float s1=0.0,s2=0.0;
                        for(j=0;j<n;j++){
                                         if(j!=i){
                                                  s1=s1+abs(a.matr[i][j]);
                                                  s2=s2+abs(a.matr[j][i]);
                                                  }
                                         }
                        if(s1<s2) temp.set_vect(i,s1);
                        else temp.set_vect(i,s2);
                        }
       return temp;
       }


Και αυτό μου φαίνεται δουλεύει...

Υ.Γ Δηλώνω την vector οperator! μονο στην matrix και χωρίς όρισμα.


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: JakeLaMotta on December 11, 2011, 16:55:25 pm


Περί αυτού, εγώ φτιάχνω μια float set_vect(i,num){vect[ i ]=num;} μέλος της vector και κάνω

Code:
vector operator!(matrix a){
       int i,j,n;
       n=a.n;
       vector temp(n);
       for(i=0;i<n;i++){
                        float s1=0.0,s2=0.0;
                        for(j=0;j<n;j++){
                                         if(j!=i){
                                                  s1=s1+abs(a.matr[i][j]);
                                                  s2=s2+abs(a.matr[j][i]);
                                                  }
                                         }
                        if(s1<s2) temp.set_vect(i,s1);
                        else temp.set_vect(i,s2);
                        }
       return temp;
       }


Και αυτό μου φαίνεται δουλεύει...

Υ.Γ Δηλώνω την vector οperator! μονο στην matrix και χωρίς όρισμα.

Ναι,λογικά αυτό που κάνεις είναι πιο σωστό,αλλά μόλις μου δούλεψε(επιτέλους!!)με τον άλλο τρόπο,οπότε δεν ψήνομαι να δοκιμάσω πάλι να το αλλάξω...


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: alexis2044 on December 11, 2011, 17:02:02 pm
If it works don't fix/touch it  ;D


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Andre on December 11, 2011, 17:13:19 pm
alexis2044

Η συνάρτηση που έφτιαξες επιστρέφει το i στοιχείο του πίνακα vector έτσι; Δηλ.:
..
return vect[ i ];     // όπου vect o float pointer που είναι private στην κλάση


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: alexis2044 on December 11, 2011, 17:26:54 pm
οχι return, θετει την τιμή, όπως την παιρνει από τα ορίσματα.

float set_vect(int i,float num){vect[ i ]=num;};


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: alexis2044 on December 11, 2011, 18:03:01 pm
Τον operator++ μπορεσε κανείς να τον κάνει overload? Και αν ναι πως; Γιατί το

float operator++(vector v);

χτυπάει μόνιμως λέγοντας συνέχεια ότι θέλει για όρισμα μόνο int...


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Andre on December 11, 2011, 19:05:45 pm
Τον operator++ μπορεσε κανείς να τον κάνει overload? Και αν ναι πως; Γιατί το

float operator++(vector v);

χτυπάει μόνιμως λέγοντας συνέχεια ότι θέλει για όρισμα μόνο int...

δεν ξέρω γιατί σου χτυπάει, πάντως δε χρειάζεται όρισμα, μιας κι επιστρέφει τον εαυτό του αλλαγμένο.

ΕΔΙΤ: alexis2044 δλδ δεν την έχεις τρέξει την εργασία;


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: jingsaw on December 11, 2011, 19:21:14 pm
Όταν λες δηλώνεις την vector operator! χωρίς όρισμα εννοείς ότι μέσα στη matrix έγραψες vector operator ! (); έτσι? Και μετά έξω από τη matrix, vector matrix::operator ! (matrix a){...}.Kάνοντας το ίδιο μου βγάζει 2 λάθη.Στη δήλωση μου βγάζει το λάθος ISO C++ forbids declaration of 'vector' with no type και πιο κάτω στο vector matrix::operator ! (matrix a){...} μου λέει 'vector' does not name a type.Mήπως υπάρχει καμιά ιδέα για το τι κάνω λάθος?


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: vagouras on December 11, 2011, 23:46:21 pm
Μάγκες help.Σε περίπτωση που ανέβασα εργασία με λάθος και τελικά την διόρθωσα μπορώ να την ξανανεβάσω ή πιάνεται μόνο η πρώτη?


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Αιμιλία η φτερωτή χελώνα on December 11, 2011, 23:49:11 pm
αν την ανεβασεις με το ιδιο ονομα, οσες φορες θες


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: pentium4 on December 11, 2011, 23:49:28 pm
Μάγκες help.Σε περίπτωση που ανέβασα εργασία με λάθος και τελικά την διόρθωσα μπορώ να την ξανανεβάσω ή πιάνεται μόνο η πρώτη?

μπορεις..και αν αλλαζουν τα ΜΒ που πιανει η εργασια θα το δεις (στο εμφανιζει διπλα στο ονομα) για σιγουρια

ps : με προλαβαν


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: vagouras on December 11, 2011, 23:50:48 pm
Thank you very much για την άμεση απάντηση


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: Ναταλία on December 12, 2011, 00:28:56 am
Όταν λες δηλώνεις την vector operator! χωρίς όρισμα εννοείς ότι μέσα στη matrix έγραψες vector operator ! (); έτσι? Και μετά έξω από τη matrix, vector matrix::operator ! (matrix a){...}.Kάνοντας το ίδιο μου βγάζει 2 λάθη.Στη δήλωση μου βγάζει το λάθος ISO C++ forbids declaration of 'vector' with no type και πιο κάτω στο vector matrix::operator ! (matrix a){...} μου λέει 'vector' does not name a type.Mήπως υπάρχει καμιά ιδέα για το τι κάνω λάθος?

νομιζω δεν χρειαζεται (matrix a), δοκιμασε με  vector matrix::operator ! (){...}.


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: alexis2044 on December 12, 2011, 00:45:29 am
Τον operator++ μπορεσε κανείς να τον κάνει overload? Και αν ναι πως; Γιατί το

float operator++(vector v);

χτυπάει μόνιμως λέγοντας συνέχεια ότι θέλει για όρισμα μόνο int...

δεν ξέρω γιατί σου χτυπάει, πάντως δε χρειάζεται όρισμα, μιας κι επιστρέφει τον εαυτό του αλλαγμένο.

ΕΔΙΤ: alexis2044 δλδ δεν την έχεις τρέξει την εργασία;

Την έχω τρέξει και έχει παίξει.

Τελικά δεν ήθελε όρισμα όντως. :)


Title: Re: [C++] ΕΡΓΑΣΙΑ D [2011-2012]
Post by: alexis2044 on December 12, 2011, 00:52:19 am
Όταν λες δηλώνεις την vector operator! χωρίς όρισμα εννοείς ότι μέσα στη matrix έγραψες vector operator ! (); έτσι? Και μετά έξω από τη matrix, vector matrix::operator ! (matrix a){...}.Kάνοντας το ίδιο μου βγάζει 2 λάθη.Στη δήλωση μου βγάζει το λάθος ISO C++ forbids declaration of 'vector' with no type και πιο κάτω στο vector matrix::operator ! (matrix a){...} μου λέει 'vector' does not name a type.Mήπως υπάρχει καμιά ιδέα για το τι κάνω λάθος?

Ποια η σειρά με την οποία έχεις τις κλάσεις; Πρώτα η Matrix και μετά η vector; Γιατί αν είναι έτσι, όταν επικαλύπτεις έναν operator που επιστρέφει vector μέσα στη matrix, ενώ δηλώνεις τη vector κλάση μετά,  επειδή ο compiler διαβάζει σειριακά από πάνω μέχρι κάτω, θα δει το vector μέσα στη matrix σου και θα πελαγώσει, γιατί δεν ξέρει σε εκείνο το σημείο τι θα πει vector...

Θα χρειαστεί να κάνεις αναφορά στη vector πριν τη matrix, λέγοντας

class vector;

και μετά κανονικά

class matrix{....};

class vector{....};

κ.ο.κ

To λεγόμενο forward declaration (http://www-subatech.in2p3.fr/~photons/subatech/soft/carnac/CPP-INC-1.shtml) που ειπώθηκε και νωρίτερα αλλά δεν πολυεξηγήθηκε...