Διορθώσεις Βιβλίου Προγραμματισμός Υπολογιστών Γ ΕΠΑΛ

Ξεκίνησε από evry, 16 Νοε 2016, 09:52:57 ΠΜ

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

Γιάννης Αναγνωστάκης

#30
Έχουμε καμία επίισημη ενημέρωση για το πότε θα δημοσιευτούν οι διορθώσεις;

Επιπρόσθετα, εξακολουθούμε να υποστηρίζουμε ότι πρέπει να διδαχθεί-εξεταστεί το τελευταίο κεφάλαιο (11) ειδικά φέτος με τις καθυστερήσεις που υπάρχουν σε ύλη και βιβλία;

Επίσης θα ήθελα να ρωτήσω

1. Την διαδικασία του διαχωρισμού πως την διδάσκουμε εφόσον το βιβλίο την έχει λάθoς; Δεν θα ήταν καλύτερα με τη χρήση της εντολής append;

2. H σειριακή αναζήτηση και η ταξινόμηση με επιλογή πρέπει να διδαχθούν εφόσον απλά αναφέρονται στο σχολικό βιβλίο της Γ' Λυκείου και 'θεωρητικά' είναι γνωστοί απο το σχολικό βιβλίο της B; Ομοίως, ο αλγόριθμος του ΜΚΔ; Προσωπική άποψη: H σειριακή αναζήση απλά ως άσκηση για τον εντοπισμό θέσης, αφού έτσι και αλλιώς υπάρχει ο υπαρξιακός τελεστής in

3. Ο τελεστής : για τα substring μπορεί να χρησιμοποιηθεί; Η εντολή break; Προσωπική άποψη: όχι και στα 2

4. Για τη διαίρεση Στα παιδιά να δείξουμε το // ή να μείνουμε στο / ? Προσωπική άποψη: Mόνο /

aprekates

Όπως δίνεται η εξήγηση της λειτουργίας της file.seek(offset[, whence]) στην παρ. 6.2 προκύπτει
από το σχετικό συλλογισμό μια διαφορετική αναμενόμενη τιμή:

ΠαράθεσηΓια να αλλάξουμε την τρέχουσα θέση του αρχείου, μπορούμε να χρησιμοποιήσου-
με την fin.seek() (offset[, from_what]). Η θέση υπολογίζεται προσθέτοντας offset
(πλήθος bytes) σε ένα σημείο αναφοράς, το οποίο επιλέγεται από το from_what
όρισμα. Αν το from_what έχει τιμή 0, μετρά από την αρχή του αρχείου, αν έχει 1,
χρησιμοποιεί την τρέχουσα θέση του αρχείου και αν έχει 2, χρησιμοποιεί το τέλος
του αρχείου.

Κώδικας: python
>>> f = open('workfile', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5)      # Go to the 6th byte in the file
>>> f.read(1)
'5'
>>> f.seek(-3, 2)  # Go to the 3rd byte before the end
>>> f.read(1)
'd'


Αν η τρέχουσα θέση έχει τεθεί στο τέλος του αρχείου τότε η f.seek(-3,2) θα έπρεπε
προσθέτωντας το -3 σ'αυτήν να δείξει στον 'c' και όχι στον 'd'. Εκτός αν το σημείο αναφοράς
(το τέλος του αρχείου) είναι και αυτός χαρακτήρας. Μάλλον αυτό συμβαίνει.


bugman

Στο τέλος του αρχείου ο δρομέας αναζήτησης (seek) δεν δείχνει τίποτα. Λογικά πηγαίνει εκεί μετά το διάβασμα του τελευταίου στοιχείου. Οπότε το -3 πάει στο D. Αν ο δρομέας έδειχνε το f θα σήμαινε ότι έχουμε ακόμα κάτι να διαβάσουμε άρα δεν είμαστε στο τέλος του αρχείου.

aprekates

#33
Παράθεση από: bugman στις 27 Μαρ 2017, 08:50:35 ΜΜ
Στο τέλος του αρχείου ο δρομέας αναζήτησης (seek) δεν δείχνει τίποτα. Λογικά πηγαίνει εκεί μετά το διάβασμα του τελευταίου στοιχείου. Οπότε το -3 πάει στο D. Αν ο δρομέας έδειχνε το f θα σήμαινε ότι έχουμε ακόμα κάτι να διαβάσουμε άρα δεν είμαστε στο τέλος του αρχείου.

Αν όμως πάμε στο τέλος του αρχείου κατευθείαν με την seek(0,2) τότε το αποτέλεσμα που αναμένεις (εφόσον δεν είναι ξεκάθορο από τον ορισμό της συνάρτησης ) εξαρτάται από τη σημασία που έχει το 'τέλος του αρχείου' . Αν τέλος του αρχείου ειναι ο τελευταίος χαρακτήρας τότε το αποτέλεσμα που περιμένω είναι διαφορετικό απ'αυτό που προκύπτει.

Οπότε 'το τέλος του αρχείου' είναι μια θέση μετά τον τελευταίο χαρακτήρα.

Κώδικας: python
>>> f = open('workfile.txt', 'w')
>>> f.write("12345")
>>> f.close()
>>> f = open('workfile.txt')
>>> f.tell()
0L
>>> f.seek(0,2)
>>> f.tell()
5L


Το παράξενο είναι ότι:
>>> f.seek(10,0)
>>> f.tell()              # μήπως θα έπρεπε να επιστρέψει μήνυμα λάθους για το τέλος αρχείου.
10L
>>> f.read(1)
''


Είναι ενδιαφέρον από μια μικρή έρευνα στο διαδίκτυο ότι μια φαινομενικά μικρή λεπτομέρεια
οπως το αν η python υλοποιεί το EOF κρύβει από πίσω αρκετό προβληματισμό όπως πχ φαίνεται στο νήμα Status of EOF

bugman

Είναι φανερό τι συμβαίνει. Το tell() έχει βάση το 0. Οπότε τελευταία θέση είναι το 5 (όπου δεν έχει χαρακτήρα). Το Seek στο τύπο 2  έχει σχετική θέση, και το 0,2 σημαίνει τελευταία θέση του αρχείου (όχι τελευταίος χαρακτήρας), άρα μετά το χαρακτήρα 5.
Για να γίνει πιο κατανοητό, ας πούμε ότι οι θέσεις στο αρχείο είναι σαν θέσεις λεωφορείου. Το seek δείχνει στις πλάτες των θέσεων, και η τελευταία του ένδειξη δεν δείχνει καμία "πλάτη", ούτε βέβαια περιεχόμενο, αλλά μετά την τελευταία θέση, εκεί που μπορεί κάποιος να βάλει μια καινούργια (αυτό το σκοπό έχει να μπορεί να δείχνει εκεί).
Εδώ να πούμε ότι η Python όπως διάβασα κάνει το εξής αν το αρχείο είναι και προσθήκη append και για ανάγνωση (με το +). Μπορούμε να μετακινήσουμε το δρομέα (cursor λέγεται στα αγγλικά), αλλά όταν πάμε να γράψουμε δεν θα γράψει εκεί που το μετακινήσαμε αλλά στο τέλος και θα μείνει στο νέο τέλος.

aprekates

Παράθεση από: bugman στις 29 Μαρ 2017, 12:27:27 ΠΜ
Είναι φανερό τι συμβαίνει. Το tell() έχει βάση το 0. Οπότε τελευταία θέση είναι το 5 (όπου δεν έχει χαρακτήρα). Το Seek στο τύπο 2  έχει σχετική θέση, και το 0,2 σημαίνει τελευταία θέση του αρχείου (όχι τελευταίος χαρακτήρας), άρα μετά το χαρακτήρα 5.
....

Ο προβληματισμός μου ήταν καταπόσο η ερμηνεία της λειτουργίας της seek από το βιβλίο
είναι σαφής ή αφήνει περιθώρια για παρερμηνείες όταν λέει ότι υπολογίζουμε τη νεα θέση
προσθέτωντας το offset στο σημείο αναφοράς.

bugman

Οπωσδήποτε η παρερμηνεία είνα φυσικό επόμενο, όταν ο μαθητής δεν δοκιμάσει τις εντολές. Η έννοια του offset, είναι δυσνόητη, χωρίς επεξήγηση. Οι seek και tell χρησιμοποιούν τον δρομέα διαφορετικά. Παίζει ρόλο το είδος του αρχείου. Πχ ένα αρχείο με UTF-8 κωδικοποίηση, μπορεί για ένα χαρακτήρα να μεταθέσει τον δρομέα ένα ή δύο ή τέσσερα byte. Εκεί η seek...πώς θα ξεχωρίσει ποιο χαρακτήρα θέλουμε με offset;  Δεν είναι απλή υπόθεση η χρήση των εντολών αυτών.
Η ερμηνεία του βιβλίου θα έπρεπε να συμπεριλάβει το τι σημαίνει offset, είναι ανά byte,  ανά δύο, ή βάσει του μήκους σε bytes του εκάστοτε χαρακτήρα, για το όποιο ν δώσουμε στη seek.


aprekates

Παράθεση από: bugman στις 29 Μαρ 2017, 08:53:21 ΜΜ
Οπωσδήποτε η παρερμηνεία είνα φυσικό επόμενο, όταν ο μαθητής δεν δοκιμάσει τις εντολές. Η έννοια του offset, είναι δυσνόητη, χωρίς επεξήγηση. Οι seek και tell χρησιμοποιούν τον δρομέα διαφορετικά. Παίζει ρόλο το είδος του αρχείου. Πχ ένα αρχείο με UTF-8 κωδικοποίηση, μπορεί για ένα χαρακτήρα να μεταθέσει τον δρομέα ένα ή δύο ή τέσσερα byte. Εκεί η seek...πώς θα ξεχωρίσει ποιο χαρακτήρα θέλουμε με offset;  Δεν είναι απλή υπόθεση η χρήση των εντολών αυτών.
Η ερμηνεία του βιβλίου θα έπρεπε να συμπεριλάβει το τι σημαίνει offset, είναι ανά byte,  ανά δύο, ή βάσει του μήκους σε bytes του εκάστοτε χαρακτήρα, για το όποιο ν δώσουμε στη seek.

Αυτό ήθελα να πω συνάδελφε. Συμφωνώ. Και το θέμα του πως δουλεύουν οι seek αλλά και άλλες εντολές πχ read(x) με utf-8  είναι επίσης ενδιαφέρον θέμα συζήτησης. Χρειάζεται ένα ξεχωριστώ νήμα συζήτησης για το θέμα αυτό, 'υποστήριξη ελληνικων στην Python"

aprekates

Στο κεφάλαιο 6 σε αρκετά σημεία  (και στις ερωτήσεις ) πότε γίνεται λόγος για μεθόδους και πότε για συναρτήσεις. Προσωπικά δεν επηρεάζει την κατανόηση-ανάγνωση μου αλλά στους μαθητές δημιουργεί σύγχυση. Και η αναφορά σε μέθοδο fin.tell() δεν διευκολύνει  . Έχει γραφτεί στο φορουμ  και το παρατήρησα και με τους μαθητές μου ότι θεωρούν το fin ανεπαίσθητα ίσως μια δεσμευμένη λέξη.

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

Και υπάρχει και ένα θέμα : Στην ερώτηση με ποια συνάρτηση κλείνουμε ένα άρχειο , η απάντηση μπορεί να είναι ένα στεγνό : η συνάρτηση close() ;



evry

Το σκεπτικό είναι ότι δεν χρειάζεται να φτάσουμε στο κεφάλαιο του αντικειμενοστρεφούς για να μιλήσουμε για αντικείμενα. Γίνεται μια αναφορά στο βιβλίο της Β σχετικά με το τι είναι μέθοδος. Εκεί που περιγράφονται τα strings και οι λίστες αναφέρονται οι μέθοδοι ως εγγενείς λειτουργίες των αντικειμένων. Με αυτόν τον τρόπο όταν ο μαθητής βλέπει το dot notation θα πρέπει να αντιλαμβάνεται ότι καλεί μια μέθοδο του συγκεκριμένου αντικειμένου. Σε πρώτη φάση θέλουμε απλά να τα χρησιμοποιεί.
Για το κεφάλαιο 6 θα προσπαθήσουμε να διορθώσουμε τις αναφορές αυτές όπου μπορούμε.
Για την close που λες έχεις δίκιο, η ερώτηση πρέπει να επαναδιατυπωθεί.
Αυτή την εποχή κάνουμε έναν αγώνα δρόμου για να διορθώσουμε όλα τα λάθη στο βιβλίο και του χρόνου να βγει νέα έκδοση, οπότε είναι η κατάλληλη στιγμή για τέτοιες χρήσιμες παρατηρήσεις, ή προτάσεις.

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

Γιάννης Αναγνωστάκης

#41
Ευριπίδη υπάρχει σκέψη να μεταβείτε σε python 3? Υποθέτω πως όχι..

Δύο πράγματα που έρχονται στο μυαλό μου και θα σου γράψω ότι άλλο θεωρήσω καλό για διόρθωση ειναι τα εξής
1) Κατάργηση του τελεστή // από το βιβλίο
2) Στη δυαδική αναζήτηση να τονιστεί αυτή η μέθοδος που περιγράφεται στη σελίδα 75 της έντυπης έκδοσης ειναι για ταξινομημένη σε αύξουσα διάταξη λίστα και να τεθεί σαν ερώτημα στους μαθητές, τι πρέπει να αλλάξουμε για να λειτουργεί σε λίστα με φθίνουσα ταξινόμηση
3) Το κεφάλαιο 5 θα μπορούσε να τοποθετηθεί μετά το κεφάλαιο 8
4) Νομιζω οτι στην εικόνα 5.2 και στην εικόνα 5.4 οι δείκτες που υπάρχουν από πάνω (j=6, j=5, j=4 ktl) πρέπει να μετακινηθούν όλοι μία θέση δεξιά έτσι ώστε η λίστα που ειναι απο κάτω (και όχι η διπλανή της) να δείχνει το αποτέλεσμα της εκτέλεσης του κώδικα όταν π.χ j=6
5) Τετράδιο μαθητή, δραστηριότητα 13 / κεφαλαίου 8, στη λύση: Αντί για s=0, να γράφεί s=0.0 και
6) Τετράδιο μαθητή, δραστηριότητα 19 / κεφαλαίου 8, λέει "η εισαγωγή και η Ι" ενώ κανονικά θα έπρεπε να λέει "η ώθηση και η απώθηση"

evry

#42
Παράθεση από: Γιάννης Αναγνωστάκης στις 03 Απρ 2017, 05:24:06 ΜΜ
Ευριπίδη υπάρχει σκέψη να μεταβείτε σε python 3? Υποθέτω πως όχι..
όχι. Αυτή τη στιγμή προέχει να βγει μια νέα έκδοση με διορθωμένα όλα τα λάθη και κάποιες αναδιατυπώσεις. Επίσης κάποιες μικρές προσθήκες όπως ο τελεστής διαμέρισης : στην Γ, που είναι χρήσιμος.

Παράθεση
1) Κατάργηση του τελεστή // από το βιβλίο
έχει γίνει
Παράθεση
2) Στη δυαδική αναζήτηση να τονιστεί αυτή η μέθοδος που περιγράφεται στη σελίδα 75 της έντυπης έκδοσης ειναι για ταξινομημένη σε αύξουσα διάταξη λίστα και να τεθεί σαν ερώτημα στους μαθητές, τι πρέπει να αλλάξουμε για να λειτουργεί σε λίστα με φθίνουσα ταξινόμηση
οκ
Παράθεση
3) Το κεφάλαιο 5 θα μπορούσε να τοποθετηθεί μετά το κεφάλαιο 8
Θα μπορούσε αλλά δεν θα γίνει, γιατί το μάθημα έχει συνέχεια και οι μαθητές έχουν διδαχθεί λίστες στην Β όπου το μάθημα είναι 4ωρο. Είναι η πρώτη φορά που έχουμε προαπαιτούμενες γνώσεις στην πληροφορική και θα πρέπει να το συνηθίσουμε, αλλιώς ακυρώνουμε ουσιαστικά το μάθημα της Β.
Ωστόσο όποιος θέλει μπορεί να "υπενθυμίσει" στα παιδιά τις λίστες από το βιβλίο της Β. ;)

Παράθεση
4) Νομιζω οτι στην εικόνα 5.2 και στην εικόνα 5.4 οι δείκτες που υπάρχουν από πάνω (j=6, j=5, j=4 ktl) πρέπει να μετακινηθούν όλοι μία θέση δεξιά έτσι ώστε η λίστα που ειναι απο κάτω (και όχι η διπλανή της) να δείχνει το αποτέλεσμα της εκτέλεσης του κώδικα όταν π.χ j=6
Το σκεπτικό είναι να δείξει ποια στοιχεία συγκρίνονται μεταξύ τους πριν αλλάξουν θέση. Πιστεύεις ότι αυτό που προτείνεις είναι πιο κατανοητό από τους μαθητές?

Γιάννη ευχαριστώ πολύ για τις παρατηρήσεις σου
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

chris1997

Γεια σας παιδια, πρωτη φορα γραφω εδω. Λοιπον, στην σελιδα 199 του βιβλιου γραφει πως η self ειναι δεσμευμενη λεξη ενω το documentation της python γραφει πως ειναι απλα μια συμβαση.
Παραγραφο 5:
https://docs.python.org/2/tutorial/classes.html#random-remarks

Τι εχετε να πειτε;


Ευχαριστω.



evry

Έτσι ακριβώς είναι, η self δεν είναι δεσμευμένη λέξη, απλά είναι μια σύμβαση που χρησιμοποιούμε. Γενικά ότι παράμετρο βάλεις στην πρώτη θέση αναφέρεται στο αντικείμενο.
Καλύτερα όμως να μην μπλέξουμε τους μαθητές με τέτοιες λεπτομέρειες. Δεν έχει νόημα.

Πάντως το το έχουμε διορθώσει στη νέα έκδοση χωρίς να προκληθεί σύγχυση στους μαθητές.
Διάβασε και το παρακάτω άρθρο του δημιουργού της Python που εξηγεί το σκεπτικό αυτής της απόφασης:
http://neopythonic.blogspot.gr/2008/10/why-explicit-self-has-to-stay.html
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr