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

Ξεκίνησε από Νίκος Αδαμόπουλος, 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

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