Ύπαρξη κοινής ιδιότητας στα δεδομένα

Ξεκίνησε από Νίκος Αδαμόπουλος, 15 Νοε 2009, 07:35:56 ΜΜ

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

Νίκος Αδαμόπουλος

Άσκηση: Να γράψετε αλγόριθμο ο οποίος να διαβάζει 100 αριθμούς και στο τέλος να εμφανίζει ανάλογα το κατάλληλο μήνυμα: «Ήταν άρτιοι όλοι οι αριθμοί» ή «Δεν ήταν άρτιοι όλοι οι αριθμοί».

Έχω δει ότι αρκετοί μαθητές σκέφτονται και προτείνουν την παρακάτω αρχική λύση (ελεγμένο ότι δεν την έχουν ακούσει από αλλού!):

Αλγόριθμος Έλεγχος_άρτιων
π<-0
Για i από 1 μέχρι 100 
   Διάβασε α
   Αν α mod 2 = 0 τότε
      π<=π+1
   Τέλος_αν
Τέλος_επανάληψης
Αν π=100 τότε 
   Εμφάνισε "Ήταν άρτιοι όλοι οι αριθμοί"
αλλιώς
   Εμφάνισε "Δεν ήταν άρτιοι όλοι οι αριθμοί"
Τέλος_αν
Τέλος Έλεγχος_άρτιων


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

Σε πολλές περιπτώσεις, όταν θέλω να κάνω τους μαθητές να σκεφτούν και να προσεγγίσουν μόνοι τους κάποια αλγοριθμική λύση, παίζουμε ένα παιχνίδι όπου τους λέω συνεχώς αριθμούς με σκοπό στο τέλος να μου πουν την απάντηση. Και στη συνέχεια προσπαθούμε να καταγράψουμε αυτό που σκέφτονταν τη στιγμή που άκουγαν έναν έναν αριθμό, να αποκωδικοποιήσουμε δηλαδή τη διαδικασία που ακολουθούσαν, ώστε να δώσουμε στο τέλος τη λύση σε αλγοριθμική μορφή. Αυτό το παιχνίδι δουλεύει καλά για εύρεση πλήθους, αθροίσματος, γινομένου, μεγίστου, ελαχίστου, κ.ά, από πολλούς αριθμούς... (Βλ. σε σχετικό post  https://alkisg.mysch.gr/steki/index.php?topic=2361.msg19088#msg19088 )

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

Αρχικά τους λέω αριθμούς που να μην είναι όλοι άρτιοι: 10, 18, 6, 17, 20, 22, -15, 0, 18, 10, ...
Στο τέλος μου απαντούν:
- "Δεν ήταν άρτιοι όλοι οι αριθμοί"!  8)
- Πώς το καταλάβατε; Μετράγατε όλους τους άρτιους; Πόσοι ήταν;   >:D
- Όχι δεν τους μετράγαμε!   :o
- Τι κάνατε;  :angel:

pgrontas

Κάτι ανάλογο έχω συναντήσει και εγώ όταν με ρωτούν οι μαθητές πώς να φτιάξουν έναν αλγόριθμο από το μηδέν. Όταν καταλαβαίνουν δηλαδή, έναν αλγόριθμο που βλέπουν γραμμένο, αλλά δυσκολεύονται να τον κατασκευάσουν οι ίδιοι. Προσωπικά δεν μου έχει τύχει να με ρωτήσουν στην ΑΕΠΠ τέτοια ερώτηση, αλλά σε μάθημα ΙΕΚ. Αυτό που απαντάω είναι παρόμοιο με την τεχνική που ανέφερες και εσύ. Δηλαδή να σκεφτούν σε slow motion οι ίδιοι τι κάνουν για να λύσουν ένα πρόβλημα και μετά να το εκφράσουν με τις διάφορες δομές (δες και πέρσι μία σχετική αν και σύντομη συζήτηση - https://alkisg.mysch.gr/steki/index.php?topic=1828.msg13252#msg13252).

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

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


Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

lykos

Συμφωνώ (πως δεν μέτρησαν τους άρτιους)!

Μπορεί οι μαθητές να σκέφτονται σωστά, αλλά δυσκολεύονται στην μεταφορά της σκέψης τους στον αλγόριθμο. Χρειάζονται εκπαίδευση και αυτό προσπαθούμε να κάνουμε. Έλα όμως που, άλλους "κανόνες" τους μαθαίνω εγώ και άλλους - ενδεχομένως - ακούν στο φροντιστήριο. Είναι ένα πρόβλημα...

Εμένα το ίδιο (χρήση μετρητή), μου το κάναν κάποιοι μαθητές στο "αν οι αριθμοί είναι σε αύξουσα σειρά". Βέβαια, να μην ξεχνάμε πως σημασία έχει να "δουλεύει" ο αλγόριθμος...

Εγώ προσπαθώ να τους μάθω, πως κάποιες φορές είναι ευκολότερο να αποδείξουμε το αντίθετο απ' αυτό που μας ζητάνε. (ΟΧΙ όλοι άρτιοι=ένας περιττός, ΟΧΙ ταξινομημένοι=ένας αταξινόμητος, κτλ).
Ενα καλό παράδειγμα που χρησιμοποιώ για το σκοπό αυτό είναι το "έλεγχος ακεραίου, αν είναι πρώτος".

andreas_p

Αλγόριθμος Έλεγχος_άρτιων
άρτιοι <- αληθής
ι <-1
Όσο ι <= 100 και άρτιοι = αληθής επανάλαβε
  Διάβασε α   
  Αν α mod 2 <> 0 τότε
     άρτιοι <- ψευδής
Τέλος_αν
ι <- ι+1
Τέλος_επανάληψης

Αν άρτιοι = αληθής τότε   
     Εμφάνισε "Ήταν άρτιοι όλοι οι αριθμοί"
αλλιώς   
    Εμφάνισε "Δεν ήταν άρτιοι όλοι οι αριθμοί"
Τέλος_αν
Τέλος Έλεγχος_άρτιων

Αν τον παραπάνω αλγόριθμο τον παρουσιάσεις κατ' ευθείαν ,μάλλον 'κολλάνε'.

Αν όμως προηγηθεί συζήτηση του τύπου :
Έστω ότι είναι όλοι άρτιοι. Αν όμως συναντήσω (τον πρώτο που θα βρω) περιττό ΔΕΝ συνεχίζω (και είναι λογικό).
Μπαίνουν έτσι σιγά - σιγά στη λογική  και εκεί ακούνε για χρήση λογικής μεταβλητής.

gpapargi

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

Κατάλαβα λοιπόν ότι αυτό που θέλουν είναι μια break που να κόβει μια "ΓΙΑ" μόλις συμβεί κάτι συγκεκριμένο.   Έτσι λειτουργεί ενστικτωδώς το κεφάλι μας από ότι κατάλαβα. Οπότε κάνω το εξής:

Τους εξηγώ ότι η παρακάτω δομή:

τερμάτισε<-ψευδής
ι<-1
Οσο ι<=πλήθος_στοιχείων και  τερμάτισε = ψευδής επανάλαβε


  ι<-ι+1
Τέλος_επανάληψης

είναι ουσιαστικά μια "Για" λόγω της συμπεριφοράς του μετρητή. Θέλω να μάθουν με το μάτι της φαντασίας τους να τη βλέπουν σα "Για". Μόνο που έχει και τη δυνατότητα να τερματίσει πρόωρα με νόμιμο τρόπο αλλάζοντας την τιμή της λογικής μεταβλητής (σηκώνοντας σημαία). Έτσι διατηρώ τη φυσική σκέψη τους που θέλει μια "Για" να τερματίζεται πρόωρα χωρίς άσχημα παιχχνίδια με το μετρητή. Την παραπάνω δομή την αποκαλώ  "ενισχυμένη Για" στην "αργκώ" που χρησιμοποιώ με τους μαθητές μου.

Μέσα στο βρόχο το μόνο που έχεις να κάνεις είναι να βάλεις μια εντολή επιλογής της μορφής
Αν συνθήκη τότε
    τερμάτισε <- αληθής
Τέλος_αν

Και έχεις κατά κάποιο τρόπο τη break.

Η τεχνική αυτή είναι πολύ χρήσιμη. Με αυτή αντιμετωπίζω μεθοδικά προβλήματα όπως:
αναζήτηση (μόλις βρεις αυτό που ψάχνεις σταματάς)
Σάρωση πίνακα μέχρι να συμβεί κάτι (γενίκευση του προηγούμενου)
προβλήματα απόφασης (όπως αν είναι όλοι άρτιοι, αν είναι 2 πίνακες ίσοι, αν είναι ένας αριθμός πρωτος)

Στα τελευταία η βασική σκέψη είναι η εξής:
Μπορείς είτε να μετράς πόσοι έχουν την ιδιότητα (ελέγχοντας αν την έχουν όλοι) ή αν υπάρχει τουλάχιστον ένας που δεν την έχει. Με την παραπάνω στατηγική κάνεις το δεύτερο το οποίο είναι ασύγκριτα καλύτερο από το πρώτο. Πχ σκέψου να σου δώσουν 10^6 αριθμούς από τους οποίους ο πρώτος είναι περιττός. Γιατί να κάτσεις να μετράς τους άλλους τζάμπα.

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

P.Tsiotakis

Μπορεί να διδαχθεί όπως η σειριακή;

1ο βήμα: λύση με Για όπως παρατίθεται από το Νίκο.
συζήτηση για το οτι πρέπει να τους εξετάσω όλους!!

2ο βήμα: να λυθεί με Όσο (που όμως είναι το Για αφού κάνει όλες τις επαναλήψεις)

3ο βήμα: διακόπτης τερματισμού (είτε με λογική μεταβλητή είτε με το μετρητή)

πχ Όσο i <= 100 και όχι_άρτιοι <> 0 επανάλαβε

Νίκος Αδαμόπουλος

Παράθεση από: andreas_p στις 15 Νοε 2009, 09:26:53 ΜΜΑν τον παραπάνω αλγόριθμο τον παρουσιάσεις κατ' ευθείαν ,μάλλον 'κολλάνε'.
Παράθεση από: lykos στις 15 Νοε 2009, 08:57:07 ΜΜΜπορεί οι μαθητές να σκέφτονται σωστά, αλλά δυσκολεύονται στην μεταφορά της σκέψης τους στον αλγόριθμο. Χρειάζονται εκπαίδευση και αυτό προσπαθούμε να κάνουμε.
Παράθεση από: gpapargi στις 16 Νοε 2009, 09:05:10 ΠΜστο μάθημα αυτό καλείσαι να καταλάβεις τι ακριβώς κάνει μηχανικά ο εγκέφαλός σου και να το γράψεις σε ψευδογλώσσα. Αν αυτό το συνηδειτοποιήσουν οι μαθητές έχουν ένα έξτρα κίνητρο. Για μένα θα ήταν αποκαρδιωτικό το να γράφω αλγορίθμους και ο εγκέφαλός μου να εκτελεί μηχανικά κάτι άλλο. Θα μου δημιουργούσε μια αίσθηση ματαιότητας.

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

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


Παράθεση από: pgrontas στις 15 Νοε 2009, 08:38:46 ΜΜΤο πρόβλημα είναι πάντως πιο έντονο στο παράδειγμα που αναφέρεις εξαιτίας της δυσκολίας που έχουν οι μαθητές με τις λογικές μεταβλητές.
Παράθεση από: andreas_p στις 15 Νοε 2009, 09:26:53 ΜΜ
Αν όμως προηγηθεί συζήτηση του τύπου : Έστω ότι είναι όλοι άρτιοι. Αν όμως συναντήσω (τον πρώτο που θα βρω) περιττό ΔΕΝ συνεχίζω (και είναι λογικό). Μπαίνουν έτσι σιγά - σιγά στη λογική και εκεί ακούνε για χρήση λογικής μεταβλητής.

Και εγώ σε αυτό το θέμα θέλω να σταθώ. Στην εισαγωγή της χρήσης των λογικών μεταβλητών.

Δηλαδή θέλω να πω ότι σε αυτή τη φάση δεν με απασχολεί (ακόμα) να σταματήσουν οι επαναλήψεις με το που θα διαβαστεί κάποιος περιττός. Η άσκηση λέει να διαβαστούν οι 100 αριθμοί. Μπορεί να χρειάζονται έτσι κι αλλιώς και για άλλους υπολογισμούς - βέβαια θα μου πείτε πως η άσκηση δεν ζητάει κάτι άλλο... Οκ συμφωνώ, αλλά ...

...θα εστιάσω την κουβέντα μόνο στη χρήση των λογικών μεταβλητών (χρησιμότητα, αξία, κ.λπ.).  Η χρήση της Όσο που να σταματάει νωρίτερα είναι κάτι που μπορεί να γίνει πιο μετά... Ας μην τα μπλέκουμε όλα μαζί από την αρχή γιατί θα μπλεχτούν και οι μαθητές!

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

- Εντάξει, αλλά τα ίδια δεν γίνονται και με τη χρήση αριθμητικών ή/και αλφαριθμητικών μεταβλητών; Γιατί να μπλέκουμε τα παιδιά με τις λογικές μεταβλητές που δεν τις καταλαβαίνουν εύκολα, αλλά και που δεν επιμένει και τόσο το σχολικό βιβλίο...;

(συνεχίζεται)

pgrontas

Ένα θέμα στο οποίο θα με βοηθούσαν κάποιες απόψεις είναι το πώς μπορούμε να δικαιολογήσουμε πειστικά την αρχική τιμή της λογικής μεταβλητής.
Στο παράδειγμα δηλαδή του Νίκου, πώς εξηγούμε ικανοποιητικά για ποιον λόγο υποθέτουμε αρχικά  ότι όλοι είναι άρτιοι;
Η μέθοδος που έχω δοκιμάσει δεν με ικανοποιεί. Εξηγώ δηλαδή αρχικά τον αλγόριθμο με την παραπάνω υπόθεση και τον γράφουμε μετά στον πίνακα έτσι. Στην σίγουρη ερώτηση, 'Δεν θα μπορούσαμε να πούμε ότι έχουν_κοινή_ιδιότητα<- ψευδής' που συνοδεύεται συνήθως από μια αλλαγή στο Αν μέσα στο βρόχο, απαντάω κάνοντας παράδειγμα και δείχνοντας ότι δεν δουλεύει.
Ξέρετε κάποιον τρόπο, με τον οποίο μπορούμε εκ των προτέρων να δικαιολογήσουμε το πώς επιλέγουμε αρχική τιμή;
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

P.Tsiotakis

εις άτοπον απαγωγή:
"έστω ότι είναι όλοι άρτιοι, θα προσπαθήσουμε να το καταρρίψουμε, εντοπίζοντας έστω και έναν απου να μην είναι, διακόπτοντας την επαναληπτική διαδικασία"

pgrontas

Παράθεση από: Τσιωτάκης Παναγιώτης στις 18 Νοε 2009, 09:03:17 ΜΜ
εις άτοπον απαγωγή:
"έστω ότι είναι όλοι άρτιοι, θα προσπαθήσουμε να το καταρρίψουμε, εντοπίζοντας έστω και έναν απου να μην είναι, διακόπτοντας την επαναληπτική διαδικασία"
Πώς τους 'κατευθύνουμε' όμως να μάθουν να σκέφτονται έτσι;
Δηλαδή σίγουρα κάποιος μπορεί να πει: έστω ότι όλοι περιττοί. θα προσπαθήσω να το καταρρίψω για τον καθενα.
Αυτό βέβαια είναι πολύ πιο δύσκολο και γι αυτό όπως είπα και πριν δεν το καταφέρνουν.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

Νίκος Αδαμόπουλος

#10
(συνέχεια από προηγούμενο)

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

Αλγόριθμος Έλεγχος_άρτιων
ΕίναιΌλοιΆρτιοι<-αληθής
Για i από 1 μέχρι 100 
   Διάβασε α
   Αν α mod 2 <> 0 τότε
      ΕίναιΌλοιΆρτιοι<-ψευδής
   Τέλος_αν
Τέλος_επανάληψης

Αν ΕίναιΌλοιΆρτιοι=αληθής τότε 
   Εμφάνισε "Ήταν άρτιοι όλοι οι αριθμοί"
αλλιώς
   Εμφάνισε "Δεν ήταν άρτιοι όλοι οι αριθμοί"
Τέλος_αν
Τέλος Έλεγχος_άρτιων


Η λύση αυτή είναι πιο κοντά στην ανθρώπινη λογική - όντως οι μαθητές δεν μέτραγαν τους άρτιους!

Και βέβαια η συνθήκη στην τελευταία Αν θα μπορούσε να γραφτεί:

Αν ΕίναιΌλοιΆρτιοι τότε  ...


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

Αλγόριθμος Έλεγχος_άρτιων
Άρτιοι<-1
Για i από 1 μέχρι 100 
   Διάβασε α
   Αν α mod 2 <> 0 τότε
       Άρτιοι<-0
   Τέλος_αν
Τέλος_επανάληψης

Αν Άρτιοι=1 τότε 
   Εμφάνισε "Ήταν άρτιοι όλοι οι αριθμοί"
αλλιώς
   Εμφάνισε "Δεν ήταν άρτιοι όλοι οι αριθμοί"
Τέλος_αν
Τέλος Έλεγχος_άρτιων


Και βέβαια το ίδιο θα μπορούσε να γίνει με οποιοδήποτε ζεύγος αριθμητικών τιμών (π.χ. 1 και -1) σε αντιστοιχία με τις λογικές τιμές αληθής και ψευδής.

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

Αλγόριθμος Έλεγχος_άρτιων
Άρτιοι<-"1"
Για i από 1 μέχρι 100 
   Διάβασε α
   Αν α mod 2 <> 0 τότε
       Άρτιοι<-"0"
   Τέλος_αν
Τέλος_επανάληψης

Αν Άρτιοι="1" τότε 
   Εμφάνισε "Ήταν άρτιοι όλοι οι αριθμοί"
αλλιώς
   Εμφάνισε "Δεν ήταν άρτιοι όλοι οι αριθμοί"
Τέλος_αν
Τέλος Έλεγχος_άρτιων


Και βέβαια το ίδιο θα μπορούσε να γίνει με οποιοδήποτε ζεύγος αλφαριθμητικών τιμών σε αντιστοιχία με τις λογικές τιμές αληθής και ψευδής. Μάλιστα, αν χρησιμοποιηθούν οι αλφαριθμητικές τιμές "Ήταν άρτιοι όλοι οι αριθμοί" και "Δεν ήταν άρτιοι όλοι οι αριθμοί" τότε η λύση μπορεί να βγει πιο συνοπτική:

Αλγόριθμος Έλεγχος_άρτιων
Αποτέλεσμα<-"Ήταν άρτιοι όλοι οι αριθμοί"
Για i από 1 μέχρι 100 
   Διάβασε α
   Αν α mod 2 <> 0 τότε
       Αποτέλεσμα <-"Δεν ήταν άρτιοι όλοι οι αριθμοί"
   Τέλος_αν
Τέλος_επανάληψης

Εμφάνισε Αποτέλεσμα
Τέλος Έλεγχος_άρτιων



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

(συνεχίζεται)

Νίκος Αδαμόπουλος

Παράθεση από: pgrontas στις 18 Νοε 2009, 06:31:00 ΜΜ
Ένα θέμα στο οποίο θα με βοηθούσαν κάποιες απόψεις είναι το πώς μπορούμε να δικαιολογήσουμε πειστικά την αρχική τιμή της λογικής μεταβλητής.
Στο παράδειγμα δηλαδή του Νίκου, πώς εξηγούμε ικανοποιητικά για ποιον λόγο υποθέτουμε αρχικά  ότι όλοι είναι άρτιοι;
Η μέθοδος που έχω δοκιμάσει δεν με ικανοποιεί. Εξηγώ δηλαδή αρχικά τον αλγόριθμο με την παραπάνω υπόθεση και τον γράφουμε μετά στον πίνακα έτσι. Στην σίγουρη ερώτηση, 'Δεν θα μπορούσαμε να πούμε ότι έχουν_κοινή_ιδιότητα<- ψευδής' που συνοδεύεται συνήθως από μια αλλαγή στο Αν μέσα στο βρόχο, απαντάω κάνοντας παράδειγμα και δείχνοντας ότι δεν δουλεύει.
Ξέρετε κάποιον τρόπο, με τον οποίο μπορούμε εκ των προτέρων να δικαιολογήσουμε το πώς επιλέγουμε αρχική τιμή;

Με έχει απασχολήσει κι εμένα αυτό και έχω καταλήξει σε μία πρόταση-διατύπωση-τυφλοσούρτη... Βέβαια γιατί να χρησιμοποιήσουν τυφλοσούρτη και να μην προσπαθήσουν απλά να καταλάβουν και να καταγράψουν στον αλγόριθμο αυτό που ήδη σκέφτονται... Πάω για ύπνο και τα λέμε...

gpapargi

Παράθεση από: pgrontas στις 18 Νοε 2009, 06:31:00 ΜΜ
Ένα θέμα στο οποίο θα με βοηθούσαν κάποιες απόψεις είναι το πώς μπορούμε να δικαιολογήσουμε πειστικά την αρχική τιμή της λογικής μεταβλητής.
Στο παράδειγμα δηλαδή του Νίκου, πώς εξηγούμε ικανοποιητικά για ποιον λόγο υποθέτουμε αρχικά  ότι όλοι είναι άρτιοι;
Η μέθοδος που έχω δοκιμάσει δεν με ικανοποιεί. Εξηγώ δηλαδή αρχικά τον αλγόριθμο με την παραπάνω υπόθεση και τον γράφουμε μετά στον πίνακα έτσι. Στην σίγουρη ερώτηση, 'Δεν θα μπορούσαμε να πούμε ότι έχουν_κοινή_ιδιότητα<- ψευδής' που συνοδεύεται συνήθως από μια αλλαγή στο Αν μέσα στο βρόχο, απαντάω κάνοντας παράδειγμα και δείχνοντας ότι δεν δουλεύει.
Ξέρετε κάποιον τρόπο, με τον οποίο μπορούμε εκ των προτέρων να δικαιολογήσουμε το πώς επιλέγουμε αρχική τιμή;


Δεν έχει σημασία η αρχική τιμή της μεταβλητής. Αρκεί να αλλάξει τιμή για να καταλάβουμε ότι μπήκε του λάχιστο μια φορά στην Αν. Η βασική ιδέα είναι ότι αν μπει στην Αν πρέπει να αλλάξει κάτι για να καταλάβουμε ότι μπήκε (για αυτό και αυτό που θα αλλάξει πρέπει να μπει στη συνθήκη της Όσο). Μπορεί να γίνει με λογική μεταβλητή, με ακέραιο (αλλάγή από 0 σε 1 ή ανάποδα), με χαρακτήρες, ότι θες. Να ένας κουλός τρόπος με λογική μεταβλητή:

όλοι_ζυγοί<-ψευδής
Όσο ι <=100 και όλοι_ζυγοί = ψευδής επανάλαβε
   Διάβασε χ
   Αν χ mod 2=1 τότε
       όλοι_ζυγοί<-αληθής
   Τέλος_αν
   ι<-ι+1
Τέλος_επανάληψης
Αν όλοι_ζυγοί=αληθής τότε
   Εμφάνισε "Δεν ήταν όλοι ζυγοί"
αλλιώς
   Εμφάνισε "Ήταν όλοι ζυγοί"
Τέλος_αν

Ο λόγος που προτιμάμε να κάνουμε το:

όλοι_ζυγοί<-αληθής
Όσο ι <=100 και όλοι_ζυγοί = αληθής επανάλαβε
   Διάβασε χ
   Αν χ mod 2=1 τότε
       όλοι_ζυγοί<-ψευδής
   Τέλος_αν
   ι<-ι+1
Τέλος_επανάληψης

είναι καθαρά η εντολή "όλοι_ζυγοί<-ψευδής" μέσα στην Αν, η οποία ταιριάζει με τις έννοιες που έχουν οι λέξεις στα νέα ελληνικά. Εμάς τους ανθρώπους διευκολύνει. Για τη μηχανή είναι το ίδιο. Η μηχανή "καταλαβαίνει" μόνο την αλλαγή της τιμής όχι το εννοιολογικό περιεχόμενο.
Γιώργος Παπαργύρης

Νίκος Αδαμόπουλος

Παράθεση από: pgrontas στις 18 Νοε 2009, 06:31:00 ΜΜ
Ένα θέμα στο οποίο θα με βοηθούσαν κάποιες απόψεις είναι το πώς μπορούμε να δικαιολογήσουμε πειστικά την αρχική τιμή της λογικής μεταβλητής.
Στο παράδειγμα δηλαδή του Νίκου, πώς εξηγούμε ικανοποιητικά για ποιον λόγο υποθέτουμε αρχικά  ότι όλοι είναι άρτιοι;

Για να δούμε όλες τις πιθανές αρχικές τιμές:

1. ΕίναιΌλοιΆρτιοι<-αληθής   (οκ)
2. ΕίναιΌλοιΆρτιοι<-ψευδής
3. ΔενΕίναιΌλοιΆρτιοι<-αληθής
4. ΔενΕίναιΌλοιΆρτιοι<-ψευδής    (οκ)

Εκτός από την επιλογή 1, σωστά δουλεύει και η 4:

Αλγόριθμος Έλεγχος_άρτιων 
ΔενΕίναιΌλοιΆρτιοι <- ψευδής
Για i από 1 μέχρι 100 
   Διάβασε α 
   Αν α mod 2 <> 0 τότε 
      ΔενΕίναιΌλοιΆρτιοι <- αληθής
   Τέλος_αν 
Τέλος_επανάληψης 

Αν ΔενΕίναιΌλοιΆρτιοι = ψευδής τότε 
   Εμφάνισε "Ήταν άρτιοι όλοι οι αριθμοί" 
αλλιώς 
   Εμφάνισε "Δεν ήταν άρτιοι όλοι οι αριθμοί" 
Τέλος_αν 
Τέλος Έλεγχος_άρτιων


Προφανώς είναι ισοδύναμη με την επιλογή 1 γιατί και η μία και η άλλη ελέγχουν μέσα στην επανάληψη τη συνθήκη α mod 2 <> 0 ώστε να αλλάξουν την αρχική υπόθεση.

Ομοίως ισοδύναμες μεταξύ τους θα ήταν οι επιλογές 2 και 3 αφού η λύση τους ελέγχει τη συνθήκη α mod 2 = 0 ώστε να αλλάξει την αρχική υπόθεση:

Αλγόριθμος Έλεγχος_άρτιων 
ΕίναιΌλοιΆρτιοι <- ψευδής
Για i από 1 μέχρι 100 
   Διάβασε α 
   Αν α mod 2 = 0 τότε 
      ΕίναιΌλοιΆρτιοι <- αληθής
   Τέλος_αν 
Τέλος_επανάληψης 

Αν ΕίναιΌλοιΆρτιοι = ?????  τότε 
   Εμφάνισε "Ήταν άρτιοι όλοι οι αριθμοί" 
αλλιώς 
   Εμφάνισε "Δεν ήταν άρτιοι όλοι οι αριθμοί" 
Τέλος_αν 
Τέλος Έλεγχος_άρτιων


... που προφανώς είναι λάθος αφού δεν οδηγεί σε ασφαλές συμπέρασμα!!!

Γενικότερα, λοιπόν, για να δούμε αν όλα τα στοιχεία έχουν μια κοινή ιδιότητα, κάνουμε αρχικά την υπόθεση εκείνη που να πρέπει να ελεγχθούν όλα τα στοιχεία για να μην διαψευστεί. Και μέσα στις επαναλήψεις ελέγχουμε για κάθε στοιχείο το αντίθετο από αυτό που υποθέσαμε αρχικά.

Έτσι αν η αρχική υπόθεση ήταν ότι δεν_έχουν_την_κοινή_ιδιότητα τότε το να διαψευστεί από κάποιο στοιχείο που_την_έχει δεν αποδεικνύει τίποτα για όλα τα στοιχεία. Έτσι θα πρέπει αρχικά να υποθέσουμε ότι έχουν_την_κοινή_ιδιότητα και προφανώς για μην διαψευστεί θα πρέπει να ελεγχθούν όλα τα στοιχεία. Εκτός κι διαψευστεί νωρίτερα οπότε η ιστορία τελειώνει...  Μέσα στις επαναλήψεις ελέγχουμε το αντίθετο από την αρχική υπόθεση: Αν α mod 2 <>0 τότε...

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

Αρχικά έχουμε να διαλέξουμε ανάμεσα: 1) στην υπόθεση ότι υπάρχει το στοιχείο, ή 2) στην υπόθεση ότι δεν υπάρχει το στοιχείο αυτό στον πίνακα. Όμως με ποια αρχική υπόθεση θα πρέπει να γίνει έλεγχος όλων των στοιχείων έτσι ώστε να μην διαψευστεί; Προφανώς κάνοντας την υπόθεση ότι δεν υπάρχει το στοιχείο! Για αυτό και λέμε στην αρχή: done<-ψευδής και μέσα στις επαναλήψεις ελέγχουμε το αντίθετο από την αρχική υπόθεση: Αν table = key τότε ...

gpapargi

Νίκο νόμιζω το μπλέκεις πολύ το πράγμα. Δες λίγο αυτό που έγραψα πιο πριν.
Γιώργος Παπαργύρης

Νίκος Αδαμόπουλος

Παράθεση από: gpapargi στις 20 Νοε 2009, 10:28:45 ΠΜ
Νίκο νόμιζω το μπλέκεις πολύ το πράγμα. Δες λίγο αυτό που έγραψα πιο πριν.

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

Δεν διαφωνώ με αυτό που λες! Παρόμοια είχα απαντήσει κι εγώ σε προηγούμενο post. Όμως νομίζω ότι η ερώτηση του pgrontas δεν έχει να κάνει με το τεχνικό μέρος της υπόθεσης (που θέλω να πιστεύω ότι δεν προβληματίζει κανέναν από εμάς) αλλά με την παιδαγωγική προσέγγιση του θέματος.

Όταν για παράδειγμα εσύ λες:

  Αν χ mod 2=1 τότε
       όλοι_ζυγοί<-αληθής

ή παρακάτω:

Αν όλοι_ζυγοί=αληθής τότε
   Εμφάνισε "Δεν ήταν όλοι ζυγοί"

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

Ο συνάδελφος νομίζω δεν ρωτάει ποια είναι η σωστή λύση αλλά με ποιο τρόπο θα την παρουσιάσει στους μαθητές, ή τι θα απαντήσει στους μαθητές αν τον ρωτήσουν "Δεν θα μπορούσαμε να πούμε ότι έχουν_κοινή_ιδιότητα<- ψευδής"...

Δε νομίζω ότι το έμπλεξα πολύ αφού κατέληξα στο ότι: "κάνουμε αρχικά την υπόθεση εκείνη που να πρέπει να ελεγχθούν όλα τα στοιχεία για να μην διαψευστεί. Και μέσα στις επαναλήψεις ελέγχουμε για κάθε στοιχείο το αντίθετο από αυτό που υποθέσαμε αρχικά".

Αυτό έκαναν και οι μαθητές όταν άκουγαν τους αριθμούς και αυτό θα κάνουμε αργότερα στην σειριακή αναζήτηση...

gpapargi

Έβγαλα το συμπέρασμα από την παρακάτω φράση
Παράθεση από: pgrontas στις 18 Νοε 2009, 06:31:00 ΜΜ
απαντάω κάνοντας παράδειγμα και δείχνοντας ότι δεν δουλεύει.
Μπορεί να κατάλαβα λάθος το ερώτημα.

Εγώ το θέμα αυτό το χειρίζομαι ως εξής:
Θέλουμε μια μεταβλητή να αλλάζει τιμή. Διαλέγω όνομα λογικής μεταβλητής κάτι που να δένει με την ερμηνεία στα νέα ελληνικά. Αρχικά λοιπόν γράφω

Όσο ι<=100 και !(το αφήνω άδειο σε πρώτη φάση)
   Διάβασε χ
   Αν χ mod 2 =1 τότε
      όλοι_άρτιοι<-ψευδής ! στηρίζομαι στην ερμηνεία στα νέα ελληνικά
   Τέλος_αν
   ι<-ι+1
Τέλος_επανάληψης

Δηλαδή σε πρώτη φάση απλά στηρίζομαι στα νέα ελληνικά για επιλογή ονόματος μεταβλητής και τιμής μέσα στην Αν. Μετά συμπληρώνω την αρχική τιμή της ως αντίθετη αυτής που παίρνει μέσα στην Αν (αφού πρέπει να αλλάξει κάτι). Τέλος την ενσωματώνω στη συνθήκη της Όσο 
Γιώργος Παπαργύρης

pgrontas

#17
Παράθεση από: gpapargi στις 20 Νοε 2009, 09:32:49 ΠΜ
όλοι_ζυγοί<-ψευδής
Όσο ι <=100 και όλοι_ζυγοί = ψευδής επανάλαβε
   Διάβασε χ
   Αν χ mod 2=1 τότε
       όλοι_ζυγοί<-αληθής
   Τέλος_αν
   ι<-ι+1
Τέλος_επανάληψης
Αν όλοι_ζυγοί=αληθής τότε
   Εμφάνισε "Δεν ήταν όλοι ζυγοί"
αλλιώς
   Εμφάνισε "Ήταν όλοι ζυγοί"
Τέλος_αν
Γιώργο, διαβάζω το παραπάνω και με πονάνε τα μάτια μου! :D
Αυτό που ήθελα να συζητήσουμε είναι το πώς επιλέγουμε την προσέγγιση, με βάση την οποία μετά μπορούμε να  διαλέξουμε και ονόματα μεταβλητών και αρχικές τιμές.

Παράθεση από: gpapargi στις 20 Νοε 2009, 11:14:06 ΠΜ
Έβγαλα το συμπέρασμα από την παρακάτω φράση
Παράθεση από: pgrontas στις 18 Νοε 2009, 06:31:00 ΜΜ
απαντάω κάνοντας παράδειγμα και δείχνοντας ότι δεν δουλεύει.
Μπορεί να μην το εξέφρασα και εγώ σωστά, αλλά το παραπάνω το ανέφερα επειδή βλέπω ότι τα παιδιά δεν πείθονται και πάντα προσπαθούν να πειράξουν κάποια αρχική τιμή, κάποια συνθήκη μέσα στο loop, με αποτέλεσμα στην μεγαλη πλειοψηφία να κάνουν λάθος (μου συνέβη μάλιστα αυτή την εβδομάδα με τον έλεγχο για το αν κάποιος είναι πρώτος). Μου φαίνεται ότι πάνε να αποδείξουν το ανάποδο. Ήθελα λοιπόν κάποια ωραία δικαιολογία για το πώς να τους κατευθύνεις εξαρχής στην σωστή κατεύθυνση.

Παράθεση από: Νίκος Αδαμόπουλος στις 20 Νοε 2009, 09:53:27 ΠΜ
Γενικότερα, λοιπόν, για να δούμε αν όλα τα στοιχεία έχουν μια κοινή ιδιότητα, κάνουμε αρχικά την υπόθεση εκείνη που να πρέπει να ελεγχθούν όλα τα στοιχεία για να μην διαψευστεί. Και μέσα στις επαναλήψεις ελέγχουμε για κάθε στοιχείο το αντίθετο από αυτό που υποθέσαμε αρχικά.
Παράθεση από: gpapargi στις 20 Νοε 2009, 11:14:06 ΠΜ
Όσο ι<=100 και !(το αφήνω άδειο σε πρώτη φάση)
   Διάβασε χ
   Αν χ mod 2 =1 τότε
      όλοι_άρτιοι<-ψευδής ! στηρίζομαι στην ερμηνεία στα νέα ελληνικά
   Τέλος_αν
   ι<-ι+1
Τέλος_επανάληψης
Αυτά τα δύο μου φαίνονται ισοδύναμα. Κάτι ανάλογο είχε πει και Παναγιώτης  ο Τσιωτάκης νωρίτερα. Μάλλον αυτό ίσως πρέπει να πεις αρχικά. Ίσως να βοηθάει κιολας ότι ταιριάζει πιο πολύ με την εκφώνηση.

Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

gthal

Απ' ότι έχω καταλάβει ψάχνουμε μια ικανοποιητική δικαιολογία για την αρχική τιμή της λογικής μεταβλητής (και ίσως για το όνομά της)

Όσο για το όνομα, εγώ τους λέω να φροντίζουν να είναι μια ερώτηση που να απαντιέται με "ναι" ή "όχι"
στο παράδειγμά μας  : "είναι όλοι άρτιοι ;"  αλλά θα μπορούσαμε και "βρέθηκε περιττός;"
ή σε άλλες περιπτώσεις :  "βρέθηκε ;", "συνεχίζω;", "διακόπτω;", "πήγαν όλα καλά;"  κλπ

Όσο για μια πειστική δικαιολογία, έχω δύο τις οποίες χρησιμοποιώ συνδυαστικά (καμιά δε φτάνει από μόνη της νομίζω):
1)  Καλή πίστη - αισιοδοξία  :)   (το παραβάλλω και με το "αθώος μέχρι αποδείξεως του εναντίου")
Είμαι αισιόδοξος και θεωρώ ότι πράγματι θα είναι όλοι άρτιοι, γιαυτό είναι_όλοι_άρτιοι <-- αληθής
αυτό ίσως πείσει μερικούς
2)  Τους πιο αυστηρά σκεπτόμενους θα πείσει η επισήμανση ότι θα είναι πιο εύκολο να καταρρίψω την υπόθεση (γιατί αρκεί να βρω έναν περιττό) παρά δείξω ότι ΚΑΙ ο 1ος ΚΑΙ ο 2ος ΚΑΙ ο 3ος κλπ είναι άρτιοι.

Πάντως, αφού προηγηθεί η παραπάνω κουβέντα (περί κατάρριψης) βρίσκω τη μεταβλητή βρήκα_περιττό πιο "εύπεπτη" :

βρήκα_περιττό <-- ψευδής    ! που ταιριάζει με τη διαίσθηση αφού ακόμα δεν έχω βρει περιττό
για ι από 1 μέχρι 100
   Διάβασε χ
   Αν χ mod 2 =1 τότε
      βρήκα_περιττό <-- αληθής
   τέλος_αν
τέλος_επανάληψης

Αν βρήκα_περιττό τότε
   Εμφάνισε "Δεν ήταν όλοι άρτιοι"
Αλλιώς
   Εμφάνισε "Ήταν όλοι άρτιοι"
Τέλος_αν
Φιλικά,
Γιώργος Θαλασσινός

evry


  Σχετικά με την αιτιολόγηση της αρχικής τιμής μιας λογικής μεταβλητής. Ας υποθέσουμε ότι θέλουμε να γράψουμε έναν αλγόριθμο ο οποίος θα ελέγχει αν όλοι οι αριθμοί είναι θετικοί. Το ερώτημα αν κατάλαβα καλά είναι τι τιμή θα έχει αρχικά η μεταβλητή μας ή για την ακρίβεια πως θα πείσουμε τους μαθητές για αυτήν.
   Ας υποθέσουμε ότι η μεταβλητή λέγεται θετικοί.
Η μεταβλητή αυτή θα είναι αρχικά αληθής.  Γιατί όμως? Κάνουμε τον παρακάτω διάλογο με τους μαθητές
Κ: Πόσες μεταβλητές έχουμε διαβάσει πριν μπούμε στην επανάληψη?
Μ: Καμία
Κ: Ωραία. Άρα τι τιμή πρέπει να έχει η μεταβλητή? Ισχύει η συνθήκη?
Μ: Δεν ξέρουμε, δεν έχουμε στοιχεία.
Κ: Ναι εντάξει, αλλά είναι λογική μεταβλητή, πρέπει να πάρει κάποια τιμή, και αφού δεν έχουμε στοιχεία όπως λέτε να την πούμε Ψευδή?
Μ: Έγινε
Κ: Τι σημαίνει θετικοί = Ψευδής?
Μ: Ότι δεν είναι όλοι θετικοί
Κ: Άρα υπάρχει ένας τουλάχιστον αριθμός που δεν είναι θετικός, σωστά?
Μ: Όχι δεν υπάρχει αφού ακόμα δεν έχουμε διαβάσει κανέναν αριθμό
Κ: Τέλεια, άρα η πρόταση είναι αληθής

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

Αν πάλι δεν πείθονται οι μαθητές μπορείτε να επιλέξετε ένα πιο τραβηγμένο παράδειγμα όπως :
"Όλοι οι κάτοικοι της Σελήνης είναι πράσινοι", αληθής ή ψευδής?
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr