Τελευταία μηνύματα

#91
Γ΄ Λυκείου / Απ: Θέματα ΟΕΦΕ 2022
Τελευταίο μήνυμα από gthal - 15 Μαΐου 2022, 02:14:38 ΜΜ
Παναγιώτη, μελέτησα πολύ καλά το μήνυμά σου, ευχαριστώ για τη λεπτομέρειά του. Είναι όλα πολύ "to the point"!
Ακριβώς όπως το λες, εγώ δε μπορώ να αποσυνδέσω το συγκεκριμένο είδος πολυμορφισμού από την κληρονομική σχέση!
Παράθεση από: pgrontas στις 13 Μαΐου 2022, 12:40:35 ΜΜΣτο παράδειγμα σου με τη λίστα η μία Εισαγωγή πολυμορφίζει την άλλη.
Δες στον παρακάτω κώδικα (μη υπαρκτής αλλά pythonοειδούς γλώσσας προγραμματισμού) τι πλεονέκτημα έχει αυτό:
Από το παράδειγμά σου κατάλαβα αμέσως δύο πράγματα.
  • είναι ζήτημα ορισμού (δηλ αν θα ονομάσω την επίμαχη περίπτωση πολυμορφισμό ή όχι - και εν τέλει είναι απλά θεωρητικό ζήτημα, γιατί αν ο προγραμματιστής "θέλει" την ευκολία τού να έχει δύο μεθόδους με το ίδιο όνομα σε ασυσχέτιστες κλάσεις και αν αυτό μπορεί να το κάνει αφ' ενός και δουλεύει αφ' ετέρου, ποσώς τον ενδιαφέρει αν είναι πολυμορφισμός ή όχι)
  • ανήκουμε σε διαφορετικές "σχολές": εγώ είμαι επηρεασμένος κατά βάση από την Java, ενώ εσύ μάλλον από την python. Και είναι γεγονός ότι το παράδειγμά σου θα δούλευε στην python αλλά όχι στην Java. 
Η λίστα των δύο Λιστών που φτιάχνεις (παρακάτω τη λέω "μεγάλη" λίστα) θα ήταν αποδεκτή στην python, νομίζω χάρη στην χαλαρότητά της με τους τύπους.
Η Java δεν θα άφηνε να φτιάξουμε μια τέτοια λίστα, με αντικείμενα διαφορετικού τύπου. Θα μας "ανάγκαζε" λοιπόν να δούμε τις δύο λίστες μας (ταξινομημένη και αταξινόμητη) ως υποκλάσεις ενός κοινού τους προγόνου (το οποίο κάνει και πολύ νόημα, μιας και οι Λίστες μας δεν είναι άσχετα πράγματα αλλά έχουν ειδοποιούς ομοιότητες). Ο κοινός αυτός πρόγονος θα όριζε πως κάθε μέλος του θα διαθέτει μια μέθοδο εισαγωγή (την οποία κάθε μέλος μπορεί να πολυμορφίσει αν θέλει) και για αυτό και μόνο το λόγο θα μπορούσε να κληθεί η εισαγωγή σε κάθε αντικείμενο της "μεγάλης" μας λίστας. Αν δεν ορίσουμε έναν κοινό τους πρόγονο με αυτό το χαρακτηριστικό, και ο άμεσος κοινός τους πρόγονος θεωρηθεί το Object (δηλαδή προστεθούν οι δύο λίστες στην "μεγάλη" λίστα ως Objects), δεν θα είναι δυνατή η κλήση στην εισαγωγή, παρότι την διαθέτουν και οι δύο, γιατί δεν είναι ορατή αν τα βλέπουμε ως απλά Objects.
Ανέτρεξα τελικά στη βιβλιογραφία  :laugh:
Πώς ορίζεται τελικά ο πολυμορφισμός;; Πρέπει να σου πω ότι τα πρώτα 7-8 άρθρα που διάβασα έλεγαν αυτό που λέω εγώ (είναι πάντα μια προγονική μέθοδος η οποία υπερκαλύπτεται) κι ετοιμαζόμουν να σου πω ότι κάνεις λάθος. Αυτά τα άρθρα είχαν αναφορές σε java, c++, c# και 1-2 άλλες γλώσσες που δεν θυμάμαι τώρα και έχασα τα tabs. Τελικά αναζήτησα συγκεκριμένα για τον πολυμορφισμό στην python και βρήκα όντως άρθρο που αναφέρει και την περίπτωση που λες κι εσύ. Σωστά και τα δύο λοιπόν! Αναλόγως σε ποια "σχολή" είσαι.
Δεν θα αποφύγω να πω όμως δυο λόγια υπέρ της "αυστηρής" σχολής  :angel:
Έχω βλαστημήσει τη java άπειρες φορές που δε με άφηνε να κάνω αυτό που διαισθητικά ήθελα! Τελικά την ευγνωμονώ γιατί με ανάγκασε να καταλάβω καλύτερα τι κάνω. Και τελικά πάντα υπήρχε ένας τρόπος να το κάνω. Πιο σωστός και πιο δομημένος. Όπως ακριβώς βλαστημούσα τον δομημένο προγραμματισμό όταν τον πρωτοδιδάχτηκα, μαθημένος-αυτοδίδακτος στην "ελευθερία" της BASIC και της GOTO. Κάποια στιγμή αντιλήφθηκα τη μαγεία του και πόσο νόημα έχει να υποχρεωθείς να μείνεις στη δομή. Και πάντα υπήρχε ο τρόπος να γίνει αυτό που ήθελα. Και σωστότερα!
Από την άλλη, η python μου έχει λύσει προβλήματα "γρήγορα και βρώμικα" (δόξα τω Θεώ), πολλές φορές μάλιστα χωρίς να καταλαβαίνω ακριβώς τι κάνω, και δε με νοιάζει γιατί δεν σκοπεύω να επανέλθω. Με νοιάζει που δούλεψε χωρίς να με ταλαιπωρήσει. Δε μπορώ όμως να διανοηθώ πώς θα μπορούσα να βρω άκρη στον ίδιο τον δικό μου κώδικα αν έγραφα ένα μεγάλο πρόγραμμα και συνέχιζα να εκμεταλλεύομαι τις ελευθερίες που παρέχει. (γιαυτό και έχω δεύτερες σκέψεις αν είναι καλή γλώσσα για τον αρχάριο που δομεί τη γνώση του σε όλα αυτά- κλείνει η παρένθεση)
Θέλω να καταλήξω στο ότι υπάρχει καλή και "λιγότερο καλή" αντικειμενοστραφής σχεδίαση. Μια καλή σχεδίαση προκύπτει από καλή κατανόηση των σχέσεων των κλάσεών μας, των αλληλεξαρτήσεων και φυσικά των συνεργασιών τους. Διαφορετικά μπορεί να καταλήξει το πρόγραμμά μας να είναι ένας σωρός από κλάσεις και αντικείμενα σκόρπια και "ξέμπαρκα" που με κάποιον τρόπο προσπαθούν να συνεργαστούν μεταξύ τους.
Η 1η υλοποίηση στο σχήμα που είχα στείλει είναι καλύτερη από τη 2η και ακόμα καλύτερη από κάποια 3η στην οποία δεν θα είχαμε καν κοινό πρόγονο στα δύο είδη Λιστών μας. Ο 1ος προγραμματιστής έχει καταλάβει καλύτερα από τους άλλους δύο (και έχει αξιοποιήσει) τις σχέσεις και την ειδοποιό ομοιότητα των αντικειμένων του. Έχει καταλάβει πως υπάρχει αιτίαση για τις κοινές μεθόδους και τα ονόματά τους (και δεν τα αντιμετώπισε ως "συμπτώσεις", που επιμένω να το λέω για να γίνει κατανοητό τι εννοώ). Ο κώδικας του 1ου, θα είναι πολύ πιο εύκολος στο να αλλαχθεί, να διορθωθεί και να επεκταθεί χωρίς να προκύψουν bugs, σε αντίθεση με των άλλων δύο, που σε κάθε αλλαγή θα τρέμει το φυλλοκάρδι τους, μην τυχόν ξεχάσουν να ενημερώσουν κατάλληλα και τις άλλες υποκλάσεις.
Δε θα μπορούσα να συμφωνώ περισσότερο με αυτό που λες εδώ, γιαυτό και λέω όσα λέω
Παράθεση από: pgrontas στις 13 Μαΐου 2022, 12:40:35 ΜΜΟ προγραμματιστής επιλέγει. Όμως οι επιλογές έχουν συνέπειες. Έτσι, αν κάποιος ονομάσει με το ίδιο όνομα πετάει() δύο άσχετες μεθόδους (ενώ για τη μία εννοεί ίπταται() ενώ για την άλλη ρίχνει()), θα μπορεί να τις καλέσει πολυμορφικά αλλά το πρόγραμμα πιθανώς να μη βγάζει νόημα και έτσι να δημιουργηθούν bugs.
Γι' αυτό σου έγγραψα (και επιμένω) ότι όταν επιλέγουμε κάποιο όνομα πρέπει να είμαστε συνειδητοποιημένοι γιατί αυτό έχει συνέπειες.
Λέμε το ίδιο. Ο προγραμματιστής που δεν καταλαβαίνει ότι οι δύο μέθοδοι πετάει() έχουν το ίδιο όνομα από σύμπτωση και όχι γιατί υπάρχει κάποια αιτίαση για αυτό (ακόμα κι αν επιλέγει αυτή τη σύμπτωση για ευκολία και να μη θυμάται πολλά ονόματα μεθόδων) ίσως να έχει πρόβλημα αργότερα! Αν μάλιστα θεωρεί κιόλας ότι η μία πολυμορφίζει την άλλη επειδή απλά και μόνο έχουν το ίδιο όνομα, βρίσκεται σε μεγάλη πλάνη. Δεν του λέω να αλλάξει όνομα αλλά να καταλαβαίνει τι σημαίνει το ένα και τι το άλλο και να αντιλαμβάνεται την ειδοποιό διαφορά τους. Αυτές οι δύο δε μπορεί να συσχετιστούν και υπάρχει αιτία για αυτό (και όπως έχεις καταλάβει, για μένα είναι η μη κοινή "καταγωγή" τους)
Ομοίως, εκείνος που δεν καταλαβαίνει ότι οι δύο μέθοδοι εισαγωγή() δεν έχουν ίδιο όνομα από τύχη (ή απλά από επιλογή για την ευκολία) αλλά έχουν ειδοποιό ομοιότητα, ώστε να την αποδώσει στην υπερκλάση, επίσης κάτι χάνει από την ουσία.
Το ίδιο και εκείνος που επιλέγει να μην πει τη μέθοδο συνένωση() για να την κρατήσει σε αντιστοιχία με την πρόσθεση(), δε θα πρέπει να του διαφύγει το γεγονός ότι όλα τα αντικείμενα που θέλει να "προσθέσει" ανήκουν σε μια ευρύτερη οικογένεια, των "προσθέσιμων", και χάρη σ' αυτό το γεγονός μπορεί να ενοποιήσει τις μεθόδους που τα "προσθέτουν", παραλλάσσοντας φυσικά την καθεμιά. Αν δε συνειδητοποιήσει δηλαδή πως η επιλογή του δεν αφορά στιγμιαία/τοπικά μόνο τη μέθοδό του και το όνομά της αλλά αφορά τη Δομή ολόκληρου του συστήματός του, νομίζω ότι κι αυτός θα συναντήσει προβλήματα στη συνέχεια.
Αυτά τα λίγα :)
Τη χάρηκα τη συζήτηση.
#92
Γ΄ Λυκείου / Απ: Αποθετήριο Ασκήσεων Πληροφ...
Τελευταίο μήνυμα από dpa2006 - 15 Μαΐου 2022, 01:35:50 ΜΜ
Ευχαριστούμε για την προσφορά!  :)
#93
Θεωρία / Απ: συντομες επαναληπτικές σημ...
Τελευταίο μήνυμα από dpa2006 - 15 Μαΐου 2022, 01:32:47 ΜΜ
https://en.wikipedia.org/wiki/Binary_tree

Types of binary trees[edit]
Tree terminology is not well-standardized and so varies in the literature.
  • A rooted binary tree has a root node and every node has at most two children.



A full binary tree




An ancestry chart which can be mapped to a perfect 4-level binary tree.

  • A full binary tree (sometimes referred to as a proper[15] or plane binary tree)[16][17] is a tree in which every node has either 0 or 2 children. Another way of defining a full binary tree is a recursive definition. A full binary tree is either:[11]

    • A single vertex.
    • A tree whose root node has two subtrees, both of which are full binary trees.
  • A perfect binary tree is a binary tree in which all interior nodes have two children and all leaves have the same depth or same level.[18] An example of a perfect binary tree is the (non-incestuous) ancestry chart of a person to a given depth, as each person has exactly two biological parents (one mother and one father). Provided the ancestry chart always displays the mother and the father on the same side for a given node, their sex can be seen as an analogy of left and right children, children being understood here as an algorithmic term.
  • A complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes at the last level h.[19] A perfect tree is therefore always complete but a complete tree is not necessarily perfect. An alternative definition is a perfect tree whose rightmost leaves (perhaps all) have been removed. Some authors use the term complete to refer instead to a perfect binary tree as defined above, in which case they call this type of tree (with a possibly not filled last level) an almost complete binary tree or nearly complete binary tree.[20][21] A complete binary tree can be efficiently represented using an array.[19]



A complete binary tree (that is not full)

  • In the infinite complete binary tree, every node has two children (and so the set of levels is countably infinite). The set of all nodes is countably infinite, but the set of all infinite paths from the root is uncountable, having the cardinality of the continuum. That's because these paths correspond by an order-preserving bijection to the points of the Cantor set, or (using the example of a Stern–Brocot tree) to the set of positive irrational numbers.
  • A balanced binary tree is a binary tree structure in which the left and right subtrees of every node differ in height by no more than 1.[22] One may also consider binary trees where no leaf is much farther away from the root than any other leaf. (Different balancing schemes allow different definitions of "much farther".[23])
  • A degenerate (or pathological) tree is where each parent node has only one associated child node.[24] This means that the tree will behave like a linked list data structure.

Discrete Mathematics:Proofs, Structures and Applications, Third Edition, Third Edition. CRC Press. p. 620. ISBN 978-1-4398-1280-8.

#94
Θεωρία / Απ: συντομες επαναληπτικές σημ...
Τελευταίο μήνυμα από dkonetas - 15 Μαΐου 2022, 11:35:56 ΠΜ
Παράθεση από: evry στις 14 Απρ 2022, 05:50:41 ΜΜΟ ορισμός που ισχύει είναι ότι όταν λέμε δυαδικό δέντρο είναι default διατεταγμένο, δηλαδή υπάρχει διάκριση αριστερού/δεξιού παιδιού. Για αυτό υπάρχει στην βιβλιογραφία το unordered binary tree που είναι αυτό ακριβώς που λες.
Απλά κάποιοι όταν μιλάνε για ordered εννοούν ταξινομημένο και όχι διάκριση left/right και εκεί υπάρχει η σύγχυση
Ακριβώς αλλιώς πχ δεν θα υπήρχε preorder, inorder, postorder διάσχιση των δυαδικών δένδρων
#95
Γ΄ Λυκείου / Απ: Αποθετήριο Ασκήσεων Πληροφ...
Τελευταίο μήνυμα από limitcracker - 14 Μαΐου 2022, 03:03:10 ΜΜ
Θέμα Δ - Τράπεζα Θεμάτων

Δισδιάστατοι Πίνακες  ◇  Υποπρογράμματα  ◇  Κλήση Συνάρτησης σε Επανάληψη  ◇  Max Συνεχόμενα σε Πίνακα
#96
Γ΄ Λυκείου / Απ: Θέματα ΟΕΦΕ 2022
Τελευταίο μήνυμα από evry - 14 Μαΐου 2022, 11:27:45 ΠΜ
Παράθεση από: KosTzag στις 13 Μαΐου 2022, 08:35:59 ΠΜΣυμφωνώ ότι σαν πρώτη σκέψη είναι λάθος.

Αλλά έχω την εξής δεύτερη σκέψη:
Το ότι δεν αναγράφονται οι ιδιότητες της κλάσης Α στην κλάση Β δεν σημαίνει ότι δεν είναι ιδιότητες της κλάσης Β (προφανώς δεν αναγράφονται στην κλάση Β γιατί κληρονομούνται).
Μήπως θα έπρεπε η πρόταση να είναι «Ένα αντικείμενο της κλάσης Β θα έχει μόνο τις ιδιότητες και τις μεθόδους που αναγράφονται στην κλάση Β»;

Εξάλλου αν δεχτούμε την 8η πρόταση ως σωστή, γιατί η 6η να είναι λάθος;
Πολύ σωστή παρατήρηση. Το συγκεκριμένο ΣΛ είναι απαράδεκτο, αφού η Β κληρονομεί από την Α και προφανώς θα έχει και όλα όσα έχει η Α. Αν μιλάγαμε για Private και Protected ίσως να είχε κάποιο νόημα αλλά και πάλι ελέγχεται.
Ήθελε άλλη διατύπωση.
Το έσωσαν με την λέξη μόνο, ώστε όλοι να καταλάβουν τι εννοούν αλλά και πάλι δεν είναι σωστό.

Για άλλη μια φορά με τις αλχημείες αυτού του μαθήματος έχουμε φτάσει να μιλάμε για ένα νέο είδους αντικειμενοστρεφούς προγραμματισμού αυτόν που λέει το σχολικό βιβλίο.
#97
Γ΄ Λυκείου / Απ: VOL2: Επαναληπτικό διαγώνι...
Τελευταίο μήνυμα από Λαμπράκης Μανώλης - 13 Μαΐου 2022, 11:17:50 ΜΜ
Καλησπέρα σε όλους

Ο τελευταίος κόμβος της λίστας θα είναι αυτός με τον πρώτο δείκτη null που θα συναντήσουμε,  τα υπόλοιπα περιεχόμενο της μνήμης σύμφωνα και με το  βιβλίο δε ""διαγράφονται ""αλλά σωστά αναφέρετε πως ""παραχωρούνται για άλλη  χρήση"".. εγώ θα τα έγραφα ξανά, αυτο θεωρώ πως είναι το πιο σωστό,  εφόσον γίνεται μια προσπάθεια αναπαράσταση της μορφής της μνήμης
#98
Γ΄ Λυκείου / Απ: Επαναληπτικό διαγώνισμα γι...
Τελευταίο μήνυμα από dpa2006 - 13 Μαΐου 2022, 03:11:26 ΜΜ
Δεν υποστηρίζεται Multiple Inheritance από Java
https://courses.e-ce.uth.gr/ECE326/doku.php?id=java:multiple_inheritance
#99
Γ΄ Λυκείου / Απ: Θέματα ΟΕΦΕ 2022
Τελευταίο μήνυμα από pgrontas - 13 Μαΐου 2022, 12:40:35 ΜΜ
Γιώργο,

έχεις δίκιο ότι το παράδειγμα πολυμορφισμού με πρόσθεση είναι διαφορετικό είδος πολυμορφισμού (μεν), αλλά είναι πολυμορφισμός (δε).
Με την λογική σου λοιπόν ΔΕΝ απαιτείται η πρόσθεση αλφαριθμητικών να ονομάζεται προσθεση, αλλά θα μπορούσε να ονομάζεται συνένωση. Ναι αλλά τότε ο προγραμματιστής όμως δεν θα μπορούσε να εκμεταλλεύεται το χαρακτηριστικό του πολυμορφισμού με αποτέλεσμα ο κώδικας να είναι πιο σύνθετος καθώς θα έπρεπε να σκέφτεται κάθε φορά τι προσθέτει. Δηλαδή, πολυμορφικά θα μπορούσε να πει Πρόσθεση(χ1,χ2) χωρίς να τον νοιάζει τι είναι τα χ1, χ2. Μη πολυμορφικά θα έπρεπε να σκεφτεί τι τύπο έχουν τα χ1, χ2 ώστε να χρησιμοποιήσει την κατάλληλη μέθοδο.

Ο προγραμματιστής επιλέγει. Όμως οι επιλογές έχουν συνέπειες. Έτσι, αν κάποιος ονομάσει με το ίδιο όνομα πετάει() δύο άσχετες μεθόδους (ενώ για τη μία εννοεί ίπταται() ενώ για την άλλη ρίχνει()), θα μπορεί να τις καλέσει πολυμορφικά αλλά το πρόγραμμα πιθανώς να μη βγάζει νόημα και έτσι να δημιουργηθούν bugs.
Γι' αυτό σου έγγραψα (και επιμένω) ότι όταν επιλέγουμε κάποιο όνομα πρέπει να είμαστε συνειδητοποιημένοι γιατί αυτό έχει συνέπειες.


Στο παράδειγμα σου με τη λίστα η μία Εισαγωγή πολυμορφίζει την άλλη.
Δες στον παρακάτω κώδικα (μη υπαρκτής αλλά pythonοειδούς γλώσσας προγραμματισμού) τι πλεονέκτημα έχει αυτό:
Α=νέα ΜηΤαξινομένηΛιστα()
Β=νέα ΤαξινομημένηΛιστα()
Για χ σε [Α,Β]
   Για υ σε [9,8,7,6,5]
      χ.Εισαγωγη(υ)

Στη μία περίπτωση θα κληθεί η ταξινομημένη εισαγωγή στην άλλη η μη ταξινομημένη. Ο προγραμματιστής δεν χρειάζεται να βάλει if, δεν χρειάζεται να κάνει διπλή δουλειά. Η 'μαγεία' του πολυμορφισμού απλοποιεί έτσι κατά πολύ τον κώδικα.
Θα μπορούσες να το ονομάσεις παρεμβολή, αλλά τότε θα έχανες την ευκολία.

Κατά τη γνώμη μου το λάθος της διαίσθησής σου είναι ότι νομίζεις ότι υποχρεωτικά πρέπει να χρησιμοποιηθεί πολυμορφισμός μέσω κληρονομικότητας επειδή υπάρχει σχέση κλάσης-υποκλάσης. Όμως αυτό δεν ισχύει κατ' ανάγκη. Έτσι ενώ στην ερώτηση του akouts (συμφωνούμε ότι) δεν υπάρχει πολυμορφισμός μέσω κληρονομικότητας (αφού δεν ορίζουμε τη μέθοδο στην υπερκλάση), εσύ αποκλείεις να υπάρχει άλλου είδους πολυμορφισμός ενώ εγώ δέχομαι ότι μπορεί να υπάρχει. Θεωρώ ότι αυτό όχι μόνο δεν απαγορεύεται ούτε από την πραγματικότητα ούτε από τη θεωρία του βιβλίου αλλά υλοποιεί τόσο το πνεύμα όσο και το γράμμα του πολυμορφισμού.
#100
Γ΄ Λυκείου / Απ: Θέματα ΟΕΦΕ 2022
Τελευταίο μήνυμα από KosTzag - 13 Μαΐου 2022, 08:35:59 ΠΜ
Παράθεση από: George Eco στις 13 Μαΐου 2022, 12:16:28 ΠΜΕίναι ξεκάθαρα λάθος, επειδή έχει και της Α.

Συμφωνώ ότι σαν πρώτη σκέψη είναι λάθος.

Αλλά έχω την εξής δεύτερη σκέψη:
Το ότι δεν αναγράφονται οι ιδιότητες της κλάσης Α στην κλάση Β δεν σημαίνει ότι δεν είναι ιδιότητες της κλάσης Β (προφανώς δεν αναγράφονται στην κλάση Β γιατί κληρονομούνται).
Μήπως θα έπρεπε η πρόταση να είναι «Ένα αντικείμενο της κλάσης Β θα έχει μόνο τις ιδιότητες και τις μεθόδους που αναγράφονται στην κλάση Β»;

Εξάλλου αν δεχτούμε την 8η πρόταση ως σωστή, γιατί η 6η να είναι λάθος;