Αποστολέας Θέμα: Ύπαρξη κοινής ιδιότητας στα δεδομένα  (Αναγνώστηκε 4319 φορές)

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

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2780
  • Πύργος Ηλείας
    • ΚΕΠΛΗΝΕΤ Ηλείας
Ύπαρξη κοινής ιδιότητας στα δεδομένα
« στις: 15 Νοέ 2009, 07:35:56 μμ »
Άσκηση: Να γράψετε αλγόριθμο ο οποίος να διαβάζει 100 αριθμούς και στο τέλος να εμφανίζει ανάλογα το κατάλληλο μήνυμα: «Ήταν άρτιοι όλοι οι αριθμοί» ή «Δεν ήταν άρτιοι όλοι οι αριθμοί».

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

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

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

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

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

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

pgrontas

  • Ομάδα διαγωνισμάτων 2016
  • *
  • Μηνύματα: 1319
  • There are always possibilities...
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #1 στις: 15 Νοέ 2009, 08:38:46 μμ »
Κάτι ανάλογο έχω συναντήσει και εγώ όταν με ρωτούν οι μαθητές πώς να φτιάξουν έναν αλγόριθμο από το μηδέν. Όταν καταλαβαίνουν δηλαδή, έναν αλγόριθμο που βλέπουν γραμμένο, αλλά δυσκολεύονται να τον κατασκευάσουν οι ίδιοι. Προσωπικά δεν μου έχει τύχει να με ρωτήσουν στην ΑΕΠΠ τέτοια ερώτηση, αλλά σε μάθημα ΙΕΚ. Αυτό που απαντάω είναι παρόμοιο με την τεχνική που ανέφερες και εσύ. Δηλαδή να σκεφτούν σε slow motion οι ίδιοι τι κάνουν για να λύσουν ένα πρόβλημα και μετά να το εκφράσουν με τις διάφορες δομές (δες και πέρσι μία σχετική αν και σύντομη συζήτηση - http://alkisg.mysch.gr/steki/index.php?topic=1828.msg13252#msg13252).

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

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


A man provided with paper, pencil, and rubber, and subject to strict discipline is in effect a universal machine - Alan Turing

lykos

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 143
  • Καλύτερα ταξιδάκια, παρά project
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #2 στις: 15 Νοέ 2009, 08:57:07 μμ »
Συμφωνώ (πως δεν μέτρησαν τους άρτιους)!

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

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

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

andreas_p

  • Ομάδα διαγωνισμάτων 2010
  • *
  • Μηνύματα: 1015
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #3 στις: 15 Νοέ 2009, 09:26:53 μμ »
Αλγόριθμος Έλεγχος_άρτιων
άρτιοι <- αληθής
ι <-1
Όσο ι <= 100 και άρτιοι = αληθής επανάλαβε
  Διάβασε α   
  Αν α mod 2 <> 0 τότε
     άρτιοι <- ψευδής
 Τέλος_αν
 ι <- ι+1
Τέλος_επανάληψης

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

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

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

gpapargi

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2450
  • I 'm not young enough to know everything
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #4 στις: 16 Νοέ 2009, 09:05:10 πμ »
Προφανώς δε μετράνε τους αρτίους. Ακούνε συνεχώς αριθμούς και μόλις ακούσουν περιττό σταματάνε τη διαδικασία και δε χρειάζεται να ακούσουν τίποτε άλλο. Μάλιστα αρκετοί έξυπνοι μαθητές που φημίζονταν για την απλή και καθαρή σκέψη τους άλλαξαν το μετρητή της "Για" προκειμένου να τερματίσουν.

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

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

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


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

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

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

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

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

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

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

Παναγιώτης Τσιωτάκης

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 3192
  • I love you 3000
    • Panagiotis Tsiotakis
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #5 στις: 16 Νοέ 2009, 08:51:09 μμ »
Μπορεί να διδαχθεί όπως η σειριακή;

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

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

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

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

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

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2780
  • Πύργος Ηλείας
    • ΚΕΠΛΗΝΕΤ Ηλείας
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #6 στις: 17 Νοέ 2009, 02:16:28 μμ »
Αν τον παραπάνω αλγόριθμο τον παρουσιάσεις κατ' ευθείαν ,μάλλον 'κολλάνε'.

Μπορεί οι μαθητές να σκέφτονται σωστά, αλλά δυσκολεύονται στην μεταφορά της σκέψης τους στον αλγόριθμο. Χρειάζονται εκπαίδευση και αυτό προσπαθούμε να κάνουμε.

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

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

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


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

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

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

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

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

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

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

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

pgrontas

  • Ομάδα διαγωνισμάτων 2016
  • *
  • Μηνύματα: 1319
  • There are always possibilities...
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #7 στις: 18 Νοέ 2009, 06:31:00 μμ »
Ένα θέμα στο οποίο θα με βοηθούσαν κάποιες απόψεις είναι το πώς μπορούμε να δικαιολογήσουμε πειστικά την αρχική τιμή της λογικής μεταβλητής.
Στο παράδειγμα δηλαδή του Νίκου, πώς εξηγούμε ικανοποιητικά για ποιον λόγο υποθέτουμε αρχικά  ότι όλοι είναι άρτιοι;
Η μέθοδος που έχω δοκιμάσει δεν με ικανοποιεί. Εξηγώ δηλαδή αρχικά τον αλγόριθμο με την παραπάνω υπόθεση και τον γράφουμε μετά στον πίνακα έτσι. Στην σίγουρη ερώτηση, 'Δεν θα μπορούσαμε να πούμε ότι έχουν_κοινή_ιδιότητα<- ψευδής' που συνοδεύεται συνήθως από μια αλλαγή στο Αν μέσα στο βρόχο, απαντάω κάνοντας παράδειγμα και δείχνοντας ότι δεν δουλεύει.
Ξέρετε κάποιον τρόπο, με τον οποίο μπορούμε εκ των προτέρων να δικαιολογήσουμε το πώς επιλέγουμε αρχική τιμή;
A man provided with paper, pencil, and rubber, and subject to strict discipline is in effect a universal machine - Alan Turing

Παναγιώτης Τσιωτάκης

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 3192
  • I love you 3000
    • Panagiotis Tsiotakis
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #8 στις: 18 Νοέ 2009, 09:03:17 μμ »
εις άτοπον απαγωγή:
"έστω ότι είναι όλοι άρτιοι, θα προσπαθήσουμε να το καταρρίψουμε, εντοπίζοντας έστω και έναν απου να μην είναι, διακόπτοντας την επαναληπτική διαδικασία"

pgrontas

  • Ομάδα διαγωνισμάτων 2016
  • *
  • Μηνύματα: 1319
  • There are always possibilities...
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #9 στις: 18 Νοέ 2009, 09:45:57 μμ »
εις άτοπον απαγωγή:
"έστω ότι είναι όλοι άρτιοι, θα προσπαθήσουμε να το καταρρίψουμε, εντοπίζοντας έστω και έναν απου να μην είναι, διακόπτοντας την επαναληπτική διαδικασία"
Πώς τους 'κατευθύνουμε' όμως να μάθουν να σκέφτονται έτσι;
Δηλαδή σίγουρα κάποιος μπορεί να πει: έστω ότι όλοι περιττοί. θα προσπαθήσω να το καταρρίψω για τον καθενα.
Αυτό βέβαια είναι πολύ πιο δύσκολο και γι αυτό όπως είπα και πριν δεν το καταφέρνουν.
A man provided with paper, pencil, and rubber, and subject to strict discipline is in effect a universal machine - Alan Turing

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

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2780
  • Πύργος Ηλείας
    • ΚΕΠΛΗΝΕΤ Ηλείας
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #10 στις: 19 Νοέ 2009, 01:34:54 πμ »
(συνέχεια από προηγούμενο)

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

Κώδικας: [Επιλογή]
Αλγόριθμος Έλεγχος_άρτιων
ΕίναιΌλοιΆρτιοι<-αληθής
Για 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 τότε
       Αποτέλεσμα <-"Δεν ήταν άρτιοι όλοι οι αριθμοί"
   Τέλος_αν
Τέλος_επανάληψης

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


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

(συνεχίζεται)
« Τελευταία τροποποίηση: 20 Νοέ 2009, 10:29:09 πμ από Νίκος Αδαμόπουλος »

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

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2780
  • Πύργος Ηλείας
    • ΚΕΠΛΗΝΕΤ Ηλείας
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #11 στις: 19 Νοέ 2009, 01:43:26 πμ »
Ένα θέμα στο οποίο θα με βοηθούσαν κάποιες απόψεις είναι το πώς μπορούμε να δικαιολογήσουμε πειστικά την αρχική τιμή της λογικής μεταβλητής.
Στο παράδειγμα δηλαδή του Νίκου, πώς εξηγούμε ικανοποιητικά για ποιον λόγο υποθέτουμε αρχικά  ότι όλοι είναι άρτιοι;
Η μέθοδος που έχω δοκιμάσει δεν με ικανοποιεί. Εξηγώ δηλαδή αρχικά τον αλγόριθμο με την παραπάνω υπόθεση και τον γράφουμε μετά στον πίνακα έτσι. Στην σίγουρη ερώτηση, 'Δεν θα μπορούσαμε να πούμε ότι έχουν_κοινή_ιδιότητα<- ψευδής' που συνοδεύεται συνήθως από μια αλλαγή στο Αν μέσα στο βρόχο, απαντάω κάνοντας παράδειγμα και δείχνοντας ότι δεν δουλεύει.
Ξέρετε κάποιον τρόπο, με τον οποίο μπορούμε εκ των προτέρων να δικαιολογήσουμε το πώς επιλέγουμε αρχική τιμή;

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

gpapargi

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2450
  • I 'm not young enough to know everything
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #12 στις: 20 Νοέ 2009, 09:32:49 πμ »
Ένα θέμα στο οποίο θα με βοηθούσαν κάποιες απόψεις είναι το πώς μπορούμε να δικαιολογήσουμε πειστικά την αρχική τιμή της λογικής μεταβλητής.
Στο παράδειγμα δηλαδή του Νίκου, πώς εξηγούμε ικανοποιητικά για ποιον λόγο υποθέτουμε αρχικά  ότι όλοι είναι άρτιοι;
Η μέθοδος που έχω δοκιμάσει δεν με ικανοποιεί. Εξηγώ δηλαδή αρχικά τον αλγόριθμο με την παραπάνω υπόθεση και τον γράφουμε μετά στον πίνακα έτσι. Στην σίγουρη ερώτηση, 'Δεν θα μπορούσαμε να πούμε ότι έχουν_κοινή_ιδιότητα<- ψευδής' που συνοδεύεται συνήθως από μια αλλαγή στο Αν μέσα στο βρόχο, απαντάω κάνοντας παράδειγμα και δείχνοντας ότι δεν δουλεύει.
Ξέρετε κάποιον τρόπο, με τον οποίο μπορούμε εκ των προτέρων να δικαιολογήσουμε το πώς επιλέγουμε αρχική τιμή;


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

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

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

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

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

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2780
  • Πύργος Ηλείας
    • ΚΕΠΛΗΝΕΤ Ηλείας
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #13 στις: 20 Νοέ 2009, 09:53:27 πμ »
Ένα θέμα στο οποίο θα με βοηθούσαν κάποιες απόψεις είναι το πώς μπορούμε να δικαιολογήσουμε πειστικά την αρχική τιμή της λογικής μεταβλητής.
Στο παράδειγμα δηλαδή του Νίκου, πώς εξηγούμε ικανοποιητικά για ποιον λόγο υποθέτουμε αρχικά  ότι όλοι είναι άρτιοι;

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

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

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2450
  • I 'm not young enough to know everything
Απ: Ύπαρξη κοινής ιδιότητας στα δεδομένα
« Απάντηση #14 στις: 20 Νοέ 2009, 10:28:45 πμ »
Νίκο νόμιζω το μπλέκεις πολύ το πράγμα. Δες λίγο αυτό που έγραψα πιο πριν.