Αποστολέας Θέμα: Διορθώσεις Βιβλίου Προγραμματισμός Υπολογιστών Γ ΕΠΑΛ  (Αναγνώστηκε 18376 φορές)

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3145
  • to Iterate is human to Recurse divine
Σε αυτό το thread θα πρότεινα όσοι συνάδελφοι κάνουν το μάθημα και εντοπίσουν λάθη ή προβλήματα στο βιβλίο να τα αναφέρουν εδώ ώστε να τα μαζέψουμε και να τα διορθώσουμε στην επόμενη έκδοση.

Προς το παρόν ανεβάζω διορθωμένες τις σελίδες 73-74 και 143-145.
Τα σημεία που πρέπει να προσέξουμε είναι:
  • Στην εισαγωγή σε στοίβα και ουρά πρέπει να χρησιμοποιηθούν οι append και insert και όχι ο τελεστής + . Αντί της append μπορεί να χρησιμοποιηθεί και το ιδίωμα +=
  • στην εφαρμογή της στοίβας με την αντιστροφή αριθμών έχει ξεχαστεί ένα ! αντί για not προφανώς από κάποιον C programmer που ακόμα μαθαίνει Python
  • η δραστηριοτητα αφόρμησης της δυαδικής είναι διορθωμένη
  • Οι πίνακες της δυαδικής έχουν διορθωθεί γιατί έχουν χαλάσει στη σελιδοποίηση
  • Οι σελίδες δεν είναι ακριβώς ίδιες όσον αφορά τη σελιδοποίηση. Επέλεξα να βάλω όλον τον κώδικα σε μια σελίδα στην δυαδική γιατί νομίζω θα είναι καλύτερο

ΥΓ. Προσοχή!!! Οι διορθώσεις δεν είναι επίσημες. απλά για να διεκολυνθεί το δύσκολο έργο των συναδέλφων φέτος

edit: τελευταία έκδοση διορθώσεις 1.2
« Τελευταία τροποποίηση: 22 Φεβ 2017, 08:25:20 μμ από evry »
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

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

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 815
Ερώτηση

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

π.χ στην ηλεκτρονική έκδοση σελίδα 75 αναφέρεται η εντολή mid = ( first + last ) // 2, όπως και εδώ στις διορθώσεις υπάρχει η ίδια εντολή

Υπάρχει λόγος που δεν γράφεται απλά mid = ( first + last ) / 2 ; Δεν έχει διαφορά, απλά γιατί εισάγουμε νέο τελεστή ξαφνικά;


Επίσης μήπως θα έπρεπε στις διορθώσεις να ειναι
answer =raw_input(“Είναι ο αριθμός ο ” + str(mid) + “ ? (N/O)” )
αντί για answer = input(“Είναι ο αριθμός ο ” + str(mid) + “ ? (N/O)” )
« Τελευταία τροποποίηση: 20 Νοέ 2016, 02:56:20 μμ από Γιάννης Αναγνωστάκης »

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

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 815
.

polikarpos

  • Θαμώνας
  • ***
  • Μηνύματα: 40
  • www.sepchiou.gr
    • Σύλλογος Εκπαιδευτικών Πληροφορικής Χίου
διόρθωση σελίδα 71
το 15>8 να αντικασταθεί με  11>8


 Γιάννη Αναγνωστάκη
Η απάντηση στις ερωτήσεις σου, κατά τη γνώμη μου ,είναι η εξής
Το βιβλίο γράφτηκε από πολλούς συγγραφείς μερικοί εκ των οποίων χρησιμοποιούσαν python 2 ενώ άλλοι χρησιμοποιούσαν python 3. Κάποια στιγμή αποφασίστηκε για κάποιον περίεργο κατά τη γνώμη μου λόγο να χρησιμοποιηθεί  python 2   Όσοι έγραφαν σε python 3 βρέθηκαν στην άβολη θέση να πρέπει να αλλάξουν τον κωδικα τους με  αποτέλεσμα κάποια μικρά λαθάκια να ξεφύγουν.
www.sepchiou.gr
moodle.sepchiou.gr
museum.sepchiou.gr

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3145
  • to Iterate is human to Recurse divine
Ερώτηση

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

π.χ στην ηλεκτρονική έκδοση σελίδα 75 αναφέρεται η εντολή mid = ( first + last ) // 2, όπως και εδώ στις διορθώσεις υπάρχει η ίδια εντολή

Υπάρχει λόγος που δεν γράφεται απλά mid = ( first + last ) / 2 ; Δεν έχει διαφορά, απλά γιατί εισάγουμε νέο τελεστή ξαφνικά;

έχεις δίκιο Γιάννη, έπρεπε να είναι / , αλλά στην Python 2 μπορεί να χρησιμοποιηθεί και ο τελεστής //, Έχουν το ίδιο αποτέλεσμα.
Μπορεί να χρησιμοποιηθεί και ο τελεστής αυτός , δεν είναι λάθος. Θα έπρεπε όμως να αναφέρεται προηγουμένως.

Παράθεση
Επίσης μήπως θα έπρεπε στις διορθώσεις να ειναι
answer =raw_input(“Είναι ο αριθμός ο ” + str(mid) + “ ? (N/O)” )
αντί για answer = input(“Είναι ο αριθμός ο ” + str(mid) + “ ? (N/O)” )
Γιάννη έχεις δίκιο , το διόρθωσα, ευχαριστώ
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

dimitra

  • Βετεράνος
  • ****
  • Μηνύματα: 98
Στο κεφάλαιο 3.2 δεν αναφέρεται η προτεραιότητα των λογικών τελεστών.
Ενιαίο, δημόσιο και δωρεάν δωδεκάχρονο σχολείο.

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3145
  • to Iterate is human to Recurse divine
Πράγματι δεν αναφέρεται.
Αυτό είναι όμως και το καλό όταν χρησιμοποιείς μια πραγματική γλώσσα προγραμματισμού. Δεν χρειάζεται να μαντέψουμε ποια είναι η προτεραιότητα. Αρκεί να δούμε στο documentation της Python ( not > and > or )

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

Καλή παρατήρηση.
Θα προστεθεί μια επεξήγηση στην νέα έκδοση.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

nefeli

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

msoukara

  • Νέος
  • *
  • Μηνύματα: 1
Θεωρώ ότι έχει γίνει πολύ καλή δουλειά και συγχαρητήρια. Θα ήθελα όμως να κάνω κάποιες παρατηρήσεις κυρίως για το κεφάλαιο 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

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3145
  • to Iterate is human to Recurse divine
@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
  1. def test(mylist):
  2.     mylist[0] = mylist[1] = 100
  3.  
  4. >>> a = [2, 4, 5]
  5. >>> test( a )
  6. >>> print a

Επίσης η εντολή stack = stack + [item] θέλει πολύ προσοχή. Δεν προσθέτει στο stack ένα στοιχείο item. Μπορεί αυτό να φαίνεται από λειτουργικής πλευράς, δεν είναι όμως έτσι. Αυτό που συμβαίνει στην πραγματικότητα είναι ότι το stack επανορίζεται εσωτερικά. δηλαδή δημιουργείται νέο αντικείμενο. Αυτό μπορείς να το δεις με τη συνάρτηση id. (πάλι οι εκφράσεις που χρησιμοποιώ δεν είναι απολύτως σωστές, γιατί έχουμε binding μεταξύ τιμής και μεταβλητής)
Ένα απλό παράδειγμα για να δεις ότι στις παρακάτω εντολές το x δείχνει σε άλλη θέση μνήμης είναι αυτό:
Κώδικας: Python
  1. >>> x = 1
  2. >>> id( x )
  3. >>> x = x + 1
  4. >>> id(x)
Εδώ φαίνεται αν οι μαθητές έχουν καταλάβει ότι η εντολή “εκχώρησης” που κάποια στιγμή θα ήταν καλύτερο να την αναφέρουμε ως εντολή απόδοσης τιμής, δεν είναι εκχώρηση όπως την ξέρουμε αλλά επανορισμός/σύνδεση της μεταβλητής με μια νέα τιμή όπως φαίνεται από το παρακάτω παράδειγμα που είναι πιο χρηστικό/λειτουργικό/απλό:
Κώδικας: Python
  1. notype = 10
  2. notype = True
  3. notype = “δεν είμαι μεταβλητή της ΓΛΩΣΣΑΣ”
Εδώ είναι ένα από τα σημεία που για να τα εξηγήσουμε πρέπει να δείξουμε στους μαθητές ότι η μεταβλητή είναι απλά ένα όνομα που γίνεται bind με μια τιμή. Είναι σαν μια ετικέτα. Δεν πρόκειται δηλαδή για ένα κουτάκι μέσα στο οποίο μπαίνει η τιμή.

Όλα αυτά όμως είναι πέρα από τους στόχους του μαθήματος για τους μαθητές του Επαγγελματικού Λυκείου. Μην τους αποτρελάνουμε εντελώς. Η ιδέα είναι να χρησιμοποιήσουμε τα πλεονεκτήματα της python και ότι είναι δυσνόητο, να το αφήσουμε στην άκρη.
Για διδακτικούς λόγους λοιπόν τους εξηγούμε το πέρασμα παραμέτρων με δυο απλά παραδείγματα (ένα για απλή μεταβλητή και ένα για λίστα), και  εκεί σταματάμε. Εμείς όμως πρέπει να ξέρουμε τι ακριβώς συμβαίνει πίσω από τις …. κουρτίνες.
 
ΥΓ. Δεδομένου ότι η εργασία της συγγραφικής ομάδας είναι εθελοντική (και αδιάκοπη) νομίζω ότι όσοι προσπαθήσουν να διδάξουν αυτές τις έννοιες καλό θα ήταν να δώσουν ένα feedback στην συγγραφική ομάδα, για το κατά πόσο η προσέγγιση που ακολουθούμε, βοηθάει τους εκπαιδευτικούς και τους μαθητές ή δυσκολεύει τα πράγματα. Αν έχετε κάποια ιδέα που έχετε δοκιμάσει στην τάξη και δούλεψε καλύτερα καλό θα ήταν είτε να τη στείλετε σε κάποιον από τους συγγραφείς είτε να το ανεβάσετε εδώ, να το δούμε και να το συζητήσουμε, ώστε να βελτιώνουμε το βιβλίο συνεχώς.
Μπορούμε όλοι να συνεισφέρουμε ώστε το βιβλίο όχι μόνο να διορθωθεί αλλά και να βελτιώνεται κάθε χρόνο και παιδαγωγικά αλλά και με νέο υλικό (ασκήσεις, φύλλα εργασίας κλπ)
 
« Τελευταία τροποποίηση: 25 Νοέ 2016, 09:17:19 πμ από evry »
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

nefeli

  • Θαμώνας
  • ***
  • Μηνύματα: 45
Καλησπέρα σε όλους
Κάποιες παρατηρήσεις/ερωτήσεις στο κεφάλαιο 6:

1. Στον πίνακα της σελίδας 94 αναφέρεται τρόπος προσπέλασης "b" για "αρχείο δυαδικής μορφής". Νομίζω ότι το σωστό είναι "rb" (και αντίστοιχα rb+, wb, wb+, ab, ab+) εκτός αν ο συγγραφέας εννοεί κάτι άλλο που δεν κατάλαβα.  Πάντως η open("data.txt","b") δίνει μήνυμα λάθους.

2. Στη σελίδα 96:
Η φράση "σημειώνουμε την αλλαγή γραμμής με το χαρακτήρα '\n' " νομίζω ότι πρέπει να διορθωθεί σε "σημειώνουμε την αλλαγή γραμμής με την ακολουθία χαρακτήρων '\n'" ώστε να τονισθεί ότι πρόκειται για δύο χαρακτήρες και όχι έναν.

Και κάτι μικρής σημασίας, αλλά τους δικούς μου μαθητές τους μπέρδεψε: στο παράδειγμα εγγραφής αριθμού σε αρχείο στη σελίδα 96, αναφέρεται αρχείο με όνομα keimeno ενώ στα προηγούμενα και στα επόμενα παραδείγματα χρησιμοποιείται το fin. Ίσως είναι καλύτερα να αλλάξει και αυτό σε fin.

« Τελευταία τροποποίηση: 11 Δεκ 2016, 09:35:48 μμ από nefeli »

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3145
  • to Iterate is human to Recurse divine
1. Στον πίνακα της σελίδας 94 αναφέρεται τρόπος προσπέλασης "b" για "αρχείο δυαδικής μορφής". Νομίζω ότι το σωστό είναι "rb" (και αντίστοιχα rb+, wb, wb+, ab, ab+) εκτός αν ο συγγραφέας εννοεί κάτι άλλο που δεν κατάλαβα.  Πάντως η open("data.txt","b") δίνει μήνυμα λάθους.
Εννοεί ότι το b συνδυάζεται με τα υπόλοιπα, απλά δεν το λέει ξεκάθαρα εκεί. Αν έδινε όλες τις επιλογές που λες ο πίνακας θα έβγαινε μεγάλος. Απλά θέλει μια τέτοια παρατήρηση με παράδειγμα από κάτω, που να λέει ότι μπορούμε να έχουμε συνδυασμούς τύπων προσπέλασης.
Για παράδειγμα δες στη σελίδα 99 που ανοίγει ένα δυαδικό αρχείο για γράψιμο χρησιμοποιεί την παρακάτω εντολή:
Κώδικας: Python
  1.  fin = open( "foo.txt", "wb" )

Νομίζω ότι το παραπάνω παράδειγμα ξεδιαλύνει τα πράγματα

Παράθεση
2. Στη σελίδα 96:
Η φράση "σημειώνουμε την αλλαγή γραμμής με το χαρακτήρα '\n' " νομίζω ότι πρέπει να διορθωθεί σε "σημειώνουμε την αλλαγή γραμμής με την ακολουθία χαρακτήρων '\n'" ώστε να τονισθεί ότι πρόκειται για δύο χαρακτήρες και όχι έναν.
Το '\n' είναι ένας χαρακτήρας και όχι δυο, είναι ο γνωστός χαρακτήρας διαφυγής/τέλος γραμμής

Παράθεση
Και κάτι μικρής σημασίας, αλλά τους δικούς μου μαθητές τους μπέρδεψε: στο παράδειγμα εγγραφής αριθμού σε αρχείο στη σελίδα 96, αναφέρεται αρχείο με όνομα keimeno ενώ στα προηγούμενα και στα επόμενα παραδείγματα χρησιμοποιείται το fin. Ίσως είναι καλύτερα να αλλάξει και αυτό σε fin.
Δεν είναι καθόλου μικρής σημασίας. Το fin δεν είναι δεσμευμένη λέξη αλλά μια μεταβλητή. Μπορούμε να δώσουμε ότι όνομα θέλουμε. Το ότι μπερδεύει τους μαθητές σημαίνει ακριβώς ότι δεν έχουν καταλάβει ακριβώς αυτό, ότι μπορούν να δώσουν ότι όνομα θέλουν. Την ίδια ακριβώς παρανόηση έχουν και πολλοί μαθητές στο ΑΕΠΠ που νομίζουν ότι στις γραμμές ενός πίνακα 2D πρέπει να μπαίνει μόνο το i.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

nefeli

  • Θαμώνας
  • ***
  • Μηνύματα: 45
Καταρχήν οφείλω να σε ευχαριστήσω για την πάντα άμεση απάντηση. Εννοείται ότι οι όποιες παρατηρήσεις δεν έχουν σκοπό να υποτιμήσουν τη δουλειά κανενός, ούτε να ξεκινήσουν αντιπαραθέσεις που κατά κανόνα είναι στείρες.
Σημειώνω απλώς τα εξής:
1. Κατά τη δική μου γνώμη αυτό που πρέπει να αλλάξει είναι ο πίνακας γιατί η αναγραφή του "b" ως "όρισμα τρόπου προσπέλασης" όπως αναφέρεται σε αυτόν δεν είναι σωστή.
2. Ας μην εμπλακούμε στην κουβέντα αν το "\n" είναι ένας χαρακτήρας ή δύο. Αυτό που προσπάθησα να μεταφράσω είναι το "escape sequence". Πολύ πρόχειρα βρήκα και αυτό: http://www.computerhope.com/jargon/e/escasequ.htm.
3. Συμφωνώ απολύτως. Γιαυτό και θα πρότεινα να χρησιμοποιούνται και άλλα ονόματα εκτός από το fin στην ενότητα ώστε αυτό να είναι πιο σαφές. Αυτό που είπα είναι ότι το fin χρησιμοποιείται σε όλα τα παραδείγματα αυτής της ενότητας εκτός από το συγκεκριμένο που γίνεται η μετατροπή σε συμβολοσειρά ενισχύοντας την όποια παρανόηση.
Και κάτι τελευταίο: Η αγωνία μου -και πιστεύω και πολλών ακόμη- είναι ότι το βιβλίο χρησιμοποιείται για πανελλαδικές εξετάσεις. Θα ήταν τελείως διαφορετική η συζήτηση αν δεν ήταν έτσι. Πολλοί μαθητές προσπαθούν, καλώς ή κακώς, να μάθουν απέξω κάθετι που αναγράφεται γιατί το θεωρούν πιθανό θέμα στις εξετάσεις. Έτσι αναγκαζόμαστε και εμείς να βάζουμε στο μικροσκόπιο κάθε πρόταση.

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3145
  • to Iterate is human to Recurse divine
Δεν είναι κακό να γίνεται κριτική. Άλλωστε έχουμε ήδη μαζέψει αρκετά λάθη είτε τυπογραφικά είτε πιο σημαντικά και αυτό κατά μεγάλο βαθμό οφείλεται σε όσους συναδέλφους ασχολούνται με το μάθημα και μας στέλνουν σχόλια και παρατηρήσεις είτε μέσα από το στέκι είτε μέσω email.
Οι διορθώσεις θα σταλούν φέτος ως λίστα με παροράματα και του χρόνου θα ενσωματωθούν στο βιβλίο.
Η ουσία όμως είναι ότι θα πρέπει οι συνάδελφοι που μπαίνουν στην τάξη και κάνουν το μάθημα να δώσουν feedback ώστε να βελτίωσουμε το υλικό του χρόνου.

Τώρα σχετικά με τις παρατηρήσεις σου:

1) Για τα αρχεία αυτή τη στιγμή δεν μπορεί να γίνει κάτι. Θα το δούμε του χρόνου. Δεν ξέρω αν έχει νόημα να κάνουμε και δυαδικά αρχεία ή είναι καλύτερο να μείνουμε σε text
2) To escape sequence είναι δυο χαρακτήρες αλλά το αποτέλεσμα είναι ένας!! Για να πείσεις τους μαθητές σου, βάλτους στον διερμηνευτή να γράψουν το παρακάτω τμήμα κώδικα:
Κώδικας: Python
  1. >>> onlyone = '\n'
  2. >>> len( onlyone )
  3. 1
όπως βλέπεις το μήκος της συμβολοσειράς είναι 1 γιατί το βλέπει σαν ένα χαρακτήρα τον χαρακτήρα τέλους γραμμής.
Ένα άλλο καλύτερο παράδειγμα είναι ότι στην C++ μπορείς να γράψεις
Κώδικας: C++
  1.  char onlyone = '\n';
δηλαδή δέχεται αυτή την ακολουθία σε μεταβλητή που μπορεί να αποθηκευτεί μόνο ένας χαρακτήρας.

Σχετικά με το τελευταίο σου σχόλιο γιατί είναι αγωνία πολλών

Όταν γράφεται ένα βιβλίο για ένα μάθημα ο στόχος αυτών που το γράφουν είναι α) να ανταποκρίνεται όσο το δυνατόν καλύτερα στο αναλυτικό πρόγραμμα και β) να παρουσιάζει τις έννοιες με έναν όσο το δυνατόν πιο διδακτικό τρόπο.
Δεν γράψαμε ούτε βιβλίο ιστορίας, ούτε Χημείας, ούτε ΑΟΘ, αλλά βιβλίο προγραμματισμού το οποίο δεν έχει στόχο να το μάθεις απέξω. Επειδή η μαθησιακή διαδικασία έχει δηλητηριαστεί από τις εξετάσεις δε σημαίνει ότι πρέπει να σκεφτόμαστε έτσι, και να κάνουμε μάθημα ψάχνοντας να βρούμε πιθανά θέματα.
« Τελευταία τροποποίηση: 12 Δεκ 2016, 09:11:06 μμ από evry »
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

nefeli

  • Θαμώνας
  • ***
  • Μηνύματα: 45

Καταρχήν το ότι το πέρασμα είναι κατά τιμή (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.


Σχετικά με το αν οι παράμετροι περνούν κατά τιμή ή κατα αναφορά, πιστεύετε ότι μπορούμε να πούμε ότι όταν οι παράμετροι είναι mutable δομής -όπως η λίστα- το πέρασμα γίνεται κατά αναφορά, αλλιώς γίνεται κατά τιμή;