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

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

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

evry

Αυτό δεν είναι σωστό. Μπορεί να δουλεύει, δηλαδή χρηστικά να φαίνεται έτσι, όμως ο μηχανισμός μεταβίβασης παραμέτρων δεν έχει καμία σχέση με το mutability ενός αντικειμένου. π.χ. στο παρακάτω παράδειγμα
Κώδικας: python
def byvalueString( s ):
    s = s + " version 3 "

s = "python"
byvalue(s)

το αποτέλεσμα θα είναι "python". Το αντικείμενο δεν θα αλλάξει. Αυτό όμως θα συμβεί όχι γιατί το πέρασμα είναι κατά τιμή αλλά επειδή χρησιμοποιούμε το τελεστή ανάθεσης τιμής για να "τροποποιήσουμε" το αντικείμενο. Στην πραγματικότητα δεν τροποποιούμε το αντικείμενο αλλά δημιουργούμε ένα νέο το οποίο όμως ορίζεται μόνο τοπικά μέσα στη συνάρτηση. Εδώ θα πρέπει να διευκρινήσουμε τα εξής:
Περνιέται αντίγραφο όχι όλου του αντικειμένου αλλά μόνο της αναφοράς του. Άρα αν πειράξουμε την αναφορά αυτή η αλλαγή δεν περνάει στο κύριο πρόγραμμα. Θα πρέπει να πειράξουμε το αντικείμενο αλλά δεν μπορούμε γιατί είναι immutable.
Η ιδέα μοιάζει λίγο με τον τρόπο με τον οποίο περνιούνται τα αντικείμενα στη Java. Δεν λέω ότι είναι το ίδιο αλλά είναι κάτι κοντινό για να καταλάβουμε τι συμβαίνει.
Δες τώρα το παρακάτω παράδειγμα:
Κώδικας: python
def byvalueList( L ):
    L = L + [100]
L = [1,2,3]
byvalueList(L)
print L

που θα εμφανίσει [1,2,3]. Η λίστα δεν θα αλλάξει παρόλο που είναι mutable, αφού έχει δημιουργηθεί μια νέα λίστα με τον τελεστή "="
Κοίτα όμως παρακάτω:
Κώδικας: python
def byrefList( L ):
    L.append(100)
L = [1,2,3]
byvalueList(L)
print L

Τώρα η λίστα θα αλλάξει γιατί έχουμε καλέσει μια member function. Τέτοια μέθοδος δεν υπάρχει σε string γιατί είναι immutable.

Καλό θα ήταν οι παραπάνω έννοιες να παρουσιαστούν με τη μορφή παραδειγμάτων στον διερμηνευτή και να γίνει συζήτηση με τους μαθητές.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

anastasd7

Συνάδελφοι θα ήθελα να επισημάνω και εγώ με τη σειρά μου ένα λαθάκι που εντόπισα. Στο πρόγραμμα με την range στη σελίδα 139 του βιβλίου το αποτέλεσμα θα είναι 4950 και όχι 5050 όπως φαίνεται στο βιβλίο.

Dimitris365

#17
Ουδέν σχόλιον.

evry

#18
Σε πολλά προβλήματα αρκεί να ελέγξουμε την ύπαρξη και όχι τη θέση.
Αυτό είναι πολύ πιο γενικό, διότι κανείς δεν σου εξασφαλίζει ότι αυτό που ψάχνεις εμφανίζεται το πολύ μια φορά. Άρα και από θέμα απλότητας για τα παιδιά πολύ καλά κάνει και επιστρέφει True ή False.
Μπορεί κανείς να ζητήσει σαν άσκηση μια δυαδική αναζήτηση που θα επιστρέφει τη θέση.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Dimitris365

#19
Ουδέν σχόλιον.

evry

οκ γράψαμε λάθος τη δυαδική αναζήτηση.
Στείλε όμως ένα email και στους συγγραφείς ενός από τα πιο δημοφιλή βιβλία για αλγορίθμους σε Python  (σελ. 155)
Problem Solving with Algorithms and Data Structures
να το διορθώσουν και αυτοί, μια και το παρατήρησες εσύ. Εγώ θα ενημερώσω τη συγγραφική ομάδα.
Επίσης στείλε και στους διαχειριστές της διαδικτυακής έκδοσης του βιβλίου
https://interactivepython.org/runestone/static/pythonds/SortSearch/TheBinarySearch.html
να διορθώσουν και αυτοί το λάθος τους.

Α και στείλε και ένα μήνυμα αν θες και στους καθηγητές των αντίστοιχων μαθημάτων στα πανεπιστήμια του Toronto και του Wisconsin να το διορθώσουν και αυτοί γιατί έχουν κάνει το ίδιο λάθος.
http://pages.cs.wisc.edu/~bobh/367/SORTING.html#bin
http://www.cs.toronto.edu/~reid/search/bincode.html
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

mipap

Συνάδελφοι, ο αλγόριθμος στη συνάρτηση της σελίδας 84 δεν δουλέυει. Αν αλλάξει το range του 2ου for και μειωθεί η εσοχή από το 2ο for και μετά οπως παρακάτω, τοτε δουλεύει:
def insertionSort(array):
    for i in range(1,len(array)):
        value=array
        pos=i
        # αναζήτηση
        while pos>0 and array[pos-1]>value:
            pos=pos-1
        #μετακινηση των στοιχείων μια θέση δεξια
        for j in range(i-1,pos-1,-1):
            array[j+1]=array[j]
        #το στοιχειο τοποθετειται στη θέση pos
        array[pos]=value

evry

έχεις δίκιο, η έκδοση που δίνεις είναι η σωστή.
Ο αλγόριθμος πάντως είναι εκτός ύλης.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

aprekates

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

Νομίζω το λάθος στη σελ 79 δεν ειναι στο (1,Ν,1) αλλά στο μέσα fοr
που πρέπει να γίνει range(N-1,0,-1)  αλλιώς δεν θα συμμετέχει στις συγκρίσεις το στοιχείο array[0].

Το δοκίμασα και σε κώδικα . Ο κωδικας του βιβλιου αφηνει το πρωτο στοιχειο απειραχτο.




evry

@aprekates
έχεις δίκιο, τουλάχιστον η τελική έκδοση του αλγορίθμου στην επόμενη σελίδα είναι σωστή.
Έχουμε μαζέψει αρκετές διορθώσεις οι οποίες θα μπουν στην νέα έκδοση του βιβλίου. Προς το παρόν θα βγει μια λίστα με παροράματα.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

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

Δεν θέλω να υποβάλλω διόρθωση αλλά μία πρόταση. Σελίδα 139, δείχνει τους τρόπους διάσχισης μίας λίστας

Δεν θα ήταν ένας επίσης ωραίος τρόπος για να παρουσιάζεται στα παιδιά και ο παρακάτω:
for i in range(len(L)):
   print L[i]


evry

Στη σελίδα 139 αφού παρουσιαστεί η range έχει μερικά παραδείγματα διάσχισης λίστας με τον τρόπο που αναφέρεις
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Λάμπρος Μπουκουβάλας

Παράθεση από: evry στις 21 Φεβ 2017, 12:59:34 ΜΜ
Έχουμε μαζέψει αρκετές διορθώσεις οι οποίες θα μπουν στην νέα έκδοση του βιβλίου. Προς το παρόν θα βγει μια λίστα με παροράματα.

Θα ανεβάσεις εδώ σε pdf όλες τις έως τώρα καταγεγραμμένες διορθώσεις; Μέχρι στιγμής υπάρχει η έκδοση 1.1 των διορθώσεων.
Λάμπρος Μπουκουβάλας
MSc - MRes

http://blogs.sch.gr/lambrosbouk

Ο Θουκυδίδης  (που τον διαβάζουν οι ξένοι, αλλά όχι εμείς)  έγραφε: «Αταλαίπωρος τοις πολλοίς η ζήτησις της αληθείας, και επί τα ετοίμα μάλλον τρέπονται» (Ι, 20, 3). Οι περισσότεροι δηλαδή αναζητούν αβασάνιστα την αλήθεια και στρέφονται σε ό,τι βρίσκουν έτοιμο. Δεν προβληματίζονται...

evry

Ανέβασα στο πρώτο μήνυμα του thread την τελευταία έκδοση των διορθώσεων.
Προσοχή όμως!!! Αυτές είναι διορθώσεις που έχω συγκεντρώσει εγώ για τα κεφάλαια 5,8 μαζί με τις παρατηρήσεις των συναδέλφων σε αυτό το thread τους οποίους και ευχαριστώ πολύ.
Αυτές οι διορθώσεις δεν είναι επίσημες. Οι επίσημες διορθώσεις θα περιλαμβάνουν και άλλες που έχουν σημειωθεί και από τα άλλα μέλη της συγγραφικής ομάδας και θα δημοσιευθούν επίσημα από το ΙΕΠ.
Όποιος συνάδελφος έχει παρατήρηση, πρόταση ή διόρθωση μπορεί να το αναφέρει εδώ ώστε να είμαστε έτοιμοι για τη νέα έκδοση του βιβλίου του χρόνου στην οποία θα έχουν διορθωθεί όλα τα λάθη.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr