Επαγγελματικό Λύκειο > Προγραμματισμός Υπολογιστών

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

<< < (2/15) > >>

dimitra:
Στο κεφάλαιο 3.2 δεν αναφέρεται η προτεραιότητα των λογικών τελεστών.

evry:
Πράγματι δεν αναφέρεται.
Αυτό είναι όμως και το καλό όταν χρησιμοποιείς μια πραγματική γλώσσα προγραμματισμού. Δεν χρειάζεται να μαντέψουμε ποια είναι η προτεραιότητα. Αρκεί να δούμε στο documentation της Python ( not > and > or )

https://docs.python.org/2/reference/expressions.html
(προς το τέλος operator precedence)

Καλή παρατήρηση.
Θα προστεθεί μια επεξήγηση στην νέα έκδοση.

nefeli:
Έχω την εξής παρατήρηση σε σχέση με την επεξήγηση-ανάλυση του αλγορίθμου της φυσαλίδας στη σελίδα79.
Ενώ στην αρχή της σελίδας αναφέρεται ότι "πρέπει να εκτελέσουμε το παραπάνω τμήμα κώδικα τόσες φορές όσες είναι τα στοιχεία της, δηλαδή Ν", αμέσως παρακάτω "καταλήγουμε στον αλγόριθμο" που όμως εκτελείται για Ν-1 φορές (for i in range(1,N,1)).
Προφανώς ο συντάκτης έχει λάβει υπόψη του την παρατήρηση που αναφέρει στη συνέχεια: "φαίνεται ότι δεν χρειάζονται Ν επαναλήψεις, αλλά Ν-1" και  που οδηγούν στον βελτιωμένο τελικό αλγόριθμο της σελίδας 80.
Πιστεύω ότι πρέπει να διορθωθεί η εξωτερική for του αλογορίθμου της σελίδας 79 σε  for i in range(0,N,1): έτσι ώστε αφενός να υπάρχει αντιστοιχία με το κείμενο και αφετέρου να είναι πιο κατανοητές οι παρατηρήσεις που οδηγούν στη βελτίωση του αλγορίθμου της σελ.80.

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


Στο κεφάλαιο 5 στην σελίδα 143 το:
def push(stack, item) :
      stack = stack + [item]

push(stack, number)

πρέπει να αντικατασταθεί με:

def push(stack, item) :
        stack = stack + [item]
   return stack

stack=push(stack, number)

ή
 
def push(stack, item) :
      stack.append(item)

push(stack, number)


Όμοια και στην σελίδα 145 για την ουρά

Κεφάλαιο 7

Στην σελίδα 113 το παράδειγμα που προσπαθεί να εξηγήσει στους μαθητές το πέρασμα παραμέτρων με αναφορά μπορεί να μπερδέψει τους μαθητές καθώς στηρίζεται στο πώς λειτουργεί η append ( η οποία ανήκει στην κατηγορία των συναρτήσεων που αλλάζουν το αντικείμενο στο οποίο καλούνται), ενώ γενικά το πέρασμα παραμέτρων στην Python είναι με τιμή, κάτι που δεν αναφέρεται πουθενά.
(η  C και η Pascal υποστηρίζουν το πέρασμα με αναφορά - όχι η Python). Ίσως λοιπόν θα ήταν καλύτερα να εξηγηθεί θεωρητικά και παράλληλα να δοθεί μια εικόνα της μνήμης.

Επίσης η προσέγγιση για τις καθολικές – τοπικές μεταβλητές ίσως δημιουργήσει σύγχυση καθώς στη σελίδα 116 :
x = 50
def func(x):
     print('Το x είναι', x)    ο λόγος που το x είναι 50 είναι επειδή περνά σαν παράμετρος. Στην προηγούμενη παράγραφο αναφέρεται ότι οι παράμετροι είναι τοπικές μεταβλητές.       
     x = 2
     print('Το τοπικό x άλλαξε σε', x)
func(x)
print('Το x είναι ακόμα', x)

Αν δεν περνούσε το x σαν παράμετρο δηλαδή:
x = 50
def func():
     print('Το x είναι', x)          
     x = 2
     print('Το τοπικό x άλλαξε σε', x)
func()
print('Το x είναι ακόμα', x)

θα έβγαζε σφάλμα γιατί μέσα στη συνάρτηση υπερισχύει η τοπική μεταβλητή x και προηγείται το  print('Το x είναι', x) από το  x = 2
Καλό θα ήταν να τονιστεί ότι η τοπική υπερισχύει της καθολικής μέσα στην συνάρτηση, εκτός αν τη δηλώσουμε global.

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

evry:
@nefeli
Σωστή η παρατήρηση, μάλλον θέλει ένα έξτρα βήμα για την εξήγηση του ενός περάσματος και άλλον ένα τμήμα κώδικα. Θα το δούμε στην επόμενη έκδοση

@msoukara

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

Καταρχήν το ότι το πέρασμα είναι κατά τιμή (call by value) αναφέρεται και αναλύεται στο βιβλίο της Β. Είναι όμως λάθος!!!  :laugh: (αν το δούμε αυστηρά) Ο λόγος που επιλέξαμε να το προσεγγίσουμε έτσι ήταν ότι αν το δεις το θέμα χρηστικά/λειτουργικά φαίνεται σαν να είναι κατά τιμή. Ο εσωτερικός μηχανισμός όμως που χρησιμοποιείται δεν είναι αυτός.  Στη βιβλιογραφία υπάρχει μια σύγχυση για το θέμα αυτό. Υπάρχουν βιβλία που το παρουσιάζουν ως πέρασμα κατά τιμή και άλλα που το παρουσιάζουν ως πέρασμα κατά αναφορά. Αν έχεις όρεξη για διάβασμα δες τους παρακάτω συνδέσμους οι οποίοι είναι αρκετά επεξηγηματικοί:
https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/
http://www.python-course.eu/passing_arguments.php

εδώ κάποιοι χρησιμοποιούν τον όρο call by assignment.

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

--- Κώδικας: Python ---def test(mylist):    mylist[0] = mylist[1] = 100 >>> a = [2, 4, 5]>>> test( a ) >>> print a
Επίσης η εντολή stack = stack + [item] θέλει πολύ προσοχή. Δεν προσθέτει στο stack ένα στοιχείο item. Μπορεί αυτό να φαίνεται από λειτουργικής πλευράς, δεν είναι όμως έτσι. Αυτό που συμβαίνει στην πραγματικότητα είναι ότι το stack επανορίζεται εσωτερικά. δηλαδή δημιουργείται νέο αντικείμενο. Αυτό μπορείς να το δεις με τη συνάρτηση id. (πάλι οι εκφράσεις που χρησιμοποιώ δεν είναι απολύτως σωστές, γιατί έχουμε binding μεταξύ τιμής και μεταβλητής)
Ένα απλό παράδειγμα για να δεις ότι στις παρακάτω εντολές το x δείχνει σε άλλη θέση μνήμης είναι αυτό:

--- Κώδικας: Python --->>> x = 1>>> id( x )>>> x = x + 1>>> id(x)Εδώ φαίνεται αν οι μαθητές έχουν καταλάβει ότι η εντολή “εκχώρησης” που κάποια στιγμή θα ήταν καλύτερο να την αναφέρουμε ως εντολή απόδοσης τιμής, δεν είναι εκχώρηση όπως την ξέρουμε αλλά επανορισμός/σύνδεση της μεταβλητής με μια νέα τιμή όπως φαίνεται από το παρακάτω παράδειγμα που είναι πιο χρηστικό/λειτουργικό/απλό:

--- Κώδικας: Python ---notype = 10notype = Truenotype = “δεν είμαι μεταβλητή της ΓΛΩΣΣΑΣ”Εδώ είναι ένα από τα σημεία που για να τα εξηγήσουμε πρέπει να δείξουμε στους μαθητές ότι η μεταβλητή είναι απλά ένα όνομα που γίνεται bind με μια τιμή. Είναι σαν μια ετικέτα. Δεν πρόκειται δηλαδή για ένα κουτάκι μέσα στο οποίο μπαίνει η τιμή.

Όλα αυτά όμως είναι πέρα από τους στόχους του μαθήματος για τους μαθητές του Επαγγελματικού Λυκείου. Μην τους αποτρελάνουμε εντελώς. Η ιδέα είναι να χρησιμοποιήσουμε τα πλεονεκτήματα της python και ότι είναι δυσνόητο, να το αφήσουμε στην άκρη.
Για διδακτικούς λόγους λοιπόν τους εξηγούμε το πέρασμα παραμέτρων με δυο απλά παραδείγματα (ένα για απλή μεταβλητή και ένα για λίστα), και  εκεί σταματάμε. Εμείς όμως πρέπει να ξέρουμε τι ακριβώς συμβαίνει πίσω από τις …. κουρτίνες.
 
ΥΓ. Δεδομένου ότι η εργασία της συγγραφικής ομάδας είναι εθελοντική (και αδιάκοπη) νομίζω ότι όσοι προσπαθήσουν να διδάξουν αυτές τις έννοιες καλό θα ήταν να δώσουν ένα feedback στην συγγραφική ομάδα, για το κατά πόσο η προσέγγιση που ακολουθούμε, βοηθάει τους εκπαιδευτικούς και τους μαθητές ή δυσκολεύει τα πράγματα. Αν έχετε κάποια ιδέα που έχετε δοκιμάσει στην τάξη και δούλεψε καλύτερα καλό θα ήταν είτε να τη στείλετε σε κάποιον από τους συγγραφείς είτε να το ανεβάσετε εδώ, να το δούμε και να το συζητήσουμε, ώστε να βελτιώνουμε το βιβλίο συνεχώς.
Μπορούμε όλοι να συνεισφέρουμε ώστε το βιβλίο όχι μόνο να διορθωθεί αλλά και να βελτιώνεται κάθε χρόνο και παιδαγωγικά αλλά και με νέο υλικό (ασκήσεις, φύλλα εργασίας κλπ)
 

Πλοήγηση

[0] Λίστα μηνυμάτων

[#] Επόμενη σελίδα

[*] Προηγούμενη σελίδα

Μετάβαση στην πλήρη έκδοση