Αντιμετάθεση 3 μεταβλητών

Ξεκίνησε από evry, 12 Δεκ 2008, 07:36:57 ΜΜ

« προηγούμενο - επόμενο »

evry

  Έβαλα στο γυμνάσιο μια άσκηση να αντιμεταθέσουν τρεις μεταβλητές τις X1, X2, X3 έτσι ώστε X1 -> X2 -> X3 -> Χ1 και τους έδωσα και σχετικό παράδειγμα, έχοντας στο μυαλό μου ότι θα χρησιμοποιήσουν μια βοηθητική μεταβλητή. Ένας μαθητής απάντησε το παρακάτω

Κώδικας: ΓΛΩΣΣΑ
Υ1 <- Χ1
Υ2 <- Χ2
Υ3 <- Χ3
Χ1 <- Υ3
Χ2 <-Υ1
Χ3 <-Υ2

>:D


What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

P.Tsiotakis

χρειάζονται όμως για την υλοποίηση του αλγορίθμου αυτού ένα ολόκληρο σερβίτσιο με ποτήρια  :D

Καρκαμάνης Γεώργιος

  Every το ίδιο παθαίνω και εγώ με ορισμένους μαθητές λυκείου όπου το πρώτο που τους έρχεται στο μυαλό για την αντιμετάθεση δύο μεταβλητών, είναι η χρήση άλλων δύο επιπλέον μεταβλητών.

Πάντως ομολογώ  πως τον  μαθητής σου που το πραγματοποίησε αυτό στο Γυμνάσιο τον βλέπω πολύ προχωρημένο για την εποχή του!!!

EleniK

Αχ Ευριπίδη, υπήρχε ασάφεια στην εκφώνηση και δεν το καταλαβες  :D!!!! Αν ηθελες με χρηση 1 βοηθητικής μεταβλήτης, επρεπε να το δηλωσεις στην εκφώνηση.  >:D  >:D   ;D
Ελένη Κοκκίνου
Καθηγήτρια Πληροφορικής, ΠΕ19

papet

Υποθέτω πως όλοι έχουμε παρόμοιες ιστορίες... Δράττομαι της ευκαιρίας να διηγηθώ ένα περυσινό περιστατικό.
Έχω ζητήσει να μου προτείνουν τρόπους για την αντιμετάθεση των περιεχομένων 2 μεταβλητών δίνοντάς τους χρόνο να σκεφτούν... Οι περισσότεροι έχουν κολλήσει, τη στιγμή που ένας όχι ιδιαίτερα δραστήριος, ούτε "καλός", μαθητής γράφει μανιωδώς... Λίγες στιγμές αργότερα και ενώ η πολυπόθητη απάντηση δεν έχει βρεθεί ακόμα, ο εν λόγω μαθητής μου δείχνει αυτό που είχε γράψει...

α <- α + β
β <- α - β
α <- α - β

... (έμεινα άφωνος)

Όταν τους έδειξα τη "συμβατική" λύση, ο ίδιος μαθητής μου είπε πάνω-κάτω:
- Πω πω, μπέρδεμα είναι... Γιατί να μπλέκουμε με άλλες μεταβλητές; Αφού και με αυτές που έχουμε την κάνουμε τη δουλειά μας...
- ... (έμεινα άφωνος για δεύτερη φορά)  ;D
May the Force b with u...
papet

perge

Απ' όταν μπήκε στο περσινή προσομοίωση εδώ, έχει κυκλοφορήσει σε όλα τα φροντιστήρια η λύση αυτή.

Φυσικά αφορά μόνο αριθμητικές μεταβλητές, κι όταν την αναφέρουν μαθητές μου, τους επισημαίνω ότι προγραμματιστικά αποτελεί λύση στο «κόκκινο», αν και ολόσωστη υπολογιστικά /μαθηματικά*.

Κι αυτό γιατί μπορεί καθεμιά από τις τιμές των δύο μεταβλητών ως μέγεθος και ακρίβεια (αν είναι κινητής υποδιαστολής) να μην έχει πρόβλημα παράστασης /αποθήκευσης στη μνήμη, ωστόσο το άθροισμα ή/και η διαφορά τους, παρότι απαιτούνται μόνο προσωρινά, πιθανόν να υπολογιστούν λανθασμένα, λόγω υπερχείλισης ή "side effect" της κινητής υποδιαστολής στην ακρίβεια. Έτσι, τελικά η εναλλαγή των τιμών των δύο μεταβλητών θα είναι λανθασμένη.

Με ακέραιες μεταβλητές του ενός byte [-128..127] μπορεί κανείς να πιστοποιήσει εύκολα ότι η σειρά των τριών εκχωρήσεων δεν επιφέρει πάντοτε την επιθυμητή εναλλαγή τους.

* έτσι έχω την ευκαιρία και να τους εξηγήσω γιατί bug σαν αυτό με το excel πριν μερικούς μήνες δεν είναι απίθανο να εμφανίζονται.

evry


  Ο τρόπος αντιμετάθεσης χωρίς προσωρινή μεταβλητή είναι αρκετά γνωστός και έχει αρκετό ενδιαφέρον να τον δείξεις βήμα βήμα στην τάξη ή να "οδηγήσεις" τα παιδιά προς τα εκεί. Από τη στιγμή που δουλεύουμε σε ψευδογλώσσα  το παρακάτω τμήμα αλγορίθμου δουλεύει μια χαρά

Κώδικας: ΓΛΩΣΣΑ
Α <- Α + Β
Β <- Α - Β
Α <- Α - Β


και φυσικά το χρησιμοποιείς μόνο για ακέραιες μεταβλητές από τη στιγμή που ο στόχος σου είναι σε πρώτη φάση διδακτικός και σε επίπεδο ψευδογλώσσας-αλγορίθμου και όχι συγκεκριμένων χαρακτηριστικών γλώσσας προγραμματισμού ή αρχιτεκτονικής υπολογιστή. Διότι ακόμα και στη ΓΛΩΣΣΑ θα μπορούσαμε να χρησιμοποιήσουμε μια βιβλιοθήκη "μεγάλων αριθμών" όπου θα μπορούσαμε να αναπαριστούμε ακεραίους με πάρα πολλά ψηφία.

Άρα δε νομίζω ότι μπορείς να κάνεις κουβέντα για αναπάρασταση κινητής υποδιαστολής και λάθη υπερχείλισης σε αυτό το επίπεδο και σε αυτό το μάθημα.

Αν τώρα θέλεις να κάνεις μια τέτοια κουβέντα θα πρέπει να πας σε κάποια συγκεκριμένη γλώσσα προγραμματισμού για να δεις το πρόβλημα.
Ας πάμε για παράδειγμα στη C. Μπόρουμε εκεί να κάνουμε αντιμετάθεση 2 μεταβλητών χωρίς προσωρινή μεταβλητή και να μην ανησυχούμε για υπερχείλιση?
Προφανώς ναι χρησιμοποιώντας τον τελεστή XOR της C δηλαδή το ^

Α <- Α ^ Β
Β <- Α ^ Β
Α <- Α ^ Β


ή ακόμα καλύτερα αν είμαστε σε C++

A ^= B ^= A ^= B ;


επειδή το τελευταίο είναι πολύ δύσκολο να το σκεφτεί μαθητής αμέσως (μιλάω για κάποιον που μαθαίνει C) το κόλπο με την πρόσθεση δρα σαν ενδιάμεσο βήμα στον συλλογισμό του για να φτάσει εδώ.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

perge

Παράθεση από: evry στις 21 Δεκ 2008, 11:03:28 ΠΜΟ τρόπος αντιμετάθεσης χωρίς προσωρινή μεταβλητή είναι αρκετά γνωστός και έχει αρκετό ενδιαφέρον να τον δείξεις βήμα βήμα στην τάξη ή να "οδηγήσεις" τα παιδιά προς τα εκεί...

Επιτρέψτε μου να διαφωνήσω για τη χρησιμότητα. Αποτελεί μια απλή διανοητική άσκηση χωρίς νόημα: από τη σκοπιά της μαθηματικής οπτικής του μαθητή, έτσι κι αλλιώς η εκχώρηση που αλλάζει την τιμή μιας μεταβλητής χρησιμοποιώντας την τρέχουσα τιμή της ίδιας πάντα αποτελεί ένα μικρό πρόβλημα (καθώς στα μαθηματικά που διδάσκονται σε αυτό το επίπεδο τα παιδιά απουσιάζει η χρονική συνιστώσα)· από τη σκοπιά του προγραμματισμού, έτσι κι αλλιώς η απουσία τρίτης μεταβλητής μόνο επιπλέον φόρτο σε μνήμη και υπολογισμούς θα επιφέρει στον compiler και πιθανότατα καμία βελτίωση στο εκτελέσιμο πρόγραμμα (φυσικά, δεν αναφέρομαι καν σε τάξη μεγέθους).

Σε μια τάξη που έχει διδαχθεί τα μαθήματα επιλογής Εφαρμογές Πληροφορικής και Εφαρμογές Υπολογιστών όπως υποδεικνύει ο οδηγός σπουδών, και έχει αφομοιώσει την παράσταση προσημασμένων ακεραίων σταθερού μήκους με συμπλήρωμα ως προς 2, και την παράσταση κινητής υποδιαστολής, η σύνδεση και η διδασκαλία είναι και εύκολη και αποδοτική. Και απαντά, εν προκειμένω, και σε ένα από τα συχνά ερωτήματα των μαθητών «τί μας χρειάζονται αυτά, κύριε;».

Με δεδομένο ότι καμία διδασκαλία δεν πρέπει να αποτελεί για το διδάσκοντα αφορμή αναίτιας επίδειξης γνώσεων ή διανοητικών ικανοτήτων, ο καθένας επιλέγει, από κει και πέρα, αν θα μείνει μόνο σε επίπεδο φροντιστηριακού μαθήματος προετοιμασίας για μία τελική εξέταση, προσφέροντας μόνο αλγόριθμους επιτυχίας, :) , ή θα επιδιώξει στα συγκεκριμένα χρονικά περιθώρια να περάσει και πέντε πράγματα από τη μεγάλη εικόνα.

evry

Παράθεση από: perge στις 21 Δεκ 2008, 12:42:50 ΜΜ
Παράθεση από: evry στις 21 Δεκ 2008, 11:03:28 ΠΜΟ τρόπος αντιμετάθεσης χωρίς προσωρινή μεταβλητή είναι αρκετά γνωστός και έχει αρκετό ενδιαφέρον να τον δείξεις βήμα βήμα στην τάξη ή να "οδηγήσεις" τα παιδιά προς τα εκεί...

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

Ενώ το να διδάξεις σε μαθητές την αναπαράσταση των αριθμών με τη μορφή κινητής υποδιαστολής έχει νόημα έτσι?

Παράθεση
καθώς στα μαθηματικά που διδάσκονται σε αυτό το επίπεδο τα παιδιά απουσιάζει η χρονική συνιστώσα
Δηλαδή τα παιδιά δεν ξέρουν την έννοια του χρόνου? περιμενουν από τα μαθηματικά για να τη μάθουν? Και επειδή δεν το κατάλαβα αυτό μπορείς να μου πεις σε ποια μαθηματικά ακριβώς μαθαίνουν τα παιδιά την εννοια του χρόνου?

Παράθεση
από τη σκοπιά του προγραμματισμού, έτσι κι αλλιώς η απουσία τρίτης μεταβλητής μόνο επιπλέον φόρτο σε μνήμη και υπολογισμούς θα επιφέρει στον compiler και πιθανότατα καμία βελτίωση στο εκτελέσιμο πρόγραμμα (φυσικά, δεν αναφέρομαι καν σε τάξη μεγέθους).
Επιπλέον φόρτο σε μνήμη? μα η απουσία μιας μεταβλητής σημαίνει μια θέση μνήμης λιγότερη, πως είναι δυνατόν έτσι να έχει παραπάνω μνήμη?  :-\ . Και γιατί πρέπει να ξέρει ο μαθητής τι συμβαίνει μέσα στον compiler όταν ακόμα δεν έχει μάθει τα βασικά του προγραμματισμού? Μήπως αυτό εννοούσες όταν έλεγες ότι  καμία διδασκαλία δεν πρέπει να αποτελεί για το διδάσκοντα αφορμή αναίτιας επίδειξης γνώσεων ή διανοητικών ικανοτήτων ?

Παράθεση
Σε μια τάξη που έχει διδαχθεί τα μαθήματα επιλογής Εφαρμογές Πληροφορικής και Εφαρμογές Υπολογιστών όπως υποδεικνύει ο οδηγός σπουδών, και έχει αφομοιώσει την παράσταση προσημασμένων ακεραίων σταθερού μήκους με συμπλήρωμα ως προς 2, και την παράσταση κινητής υποδιαστολής, η σύνδεση και η διδασκαλία είναι και εύκολη και αποδοτική.
Τι ποσοστό των μαθητών πιστεύεις ότι έχει αφομοιώσει τη συγκεκριμένη ύλη που λες? Είναι πάνω από 5-6 %?

Παράθεση
Με δεδομένο ότι καμία διδασκαλία δεν πρέπει να αποτελεί για το διδάσκοντα αφορμή αναίτιας επίδειξης γνώσεων ή διανοητικών ικανοτήτων, ο καθένας επιλέγει, από κει και πέρα, αν θα μείνει μόνο σε επίπεδο φροντιστηριακού μαθήματος προετοιμασίας για μία τελική εξέταση, προσφέροντας μόνο αλγόριθμους επιτυχίας, :) , ή θα επιδιώξει στα συγκεκριμένα χρονικά περιθώρια να περάσει και πέντε πράγματα από τη μεγάλη εικόνα.
Αν έχεις χρόνο να το κάνεις αυτό στο μάθημα της Ανάπτυξης με τις 2 ώρες που διδάσκεται την εβδομάδα θα ήθελα να μάθω πως?
Αλήθεια ποια είναι η μεγάλη εικόνα?
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr