>> [Παίζει μουσική]
>> DAVID J MALAN: Εντάξει, καλωσορίσω πίσω στο CS50.
Αυτή είναι η αρχή της δεύτερης εβδομάδας.
Μια λέξη από έναν από μας φίλους στην πανεπιστημιούπολη -
αν σας ενδιαφέρει, ενδεχομένως, είτε τώρα ή σε κάποια μελλοντική θητεία
ακόμη, για μια ακόμη φορά άνετα, διδασκαλία μεσαία μαθητές λίγο
κάτι για την επιστήμη των υπολογιστών, κάνει το κεφάλι σε αυτό το URL.
Είναι ιδιαίτερη ανάγκη αυτή τη στιγμή από εκπαιδευτικοί, ιδιαίτερα εάν έχετε
είχε κάποια έκθεση για την επιστήμη των υπολογιστών.
>> Έτσι Υπενθυμίζεται ότι την περασμένη φορά, εισαγάγαμε μερικοί τύποι δεδομένων σε C, και
μπορεί να έχετε αρχίσει να αποκτήσετε τα εισιτήριά σας τα χέρια βρώμικα με αυτά μέχρι στιγμής
στο πρόβλημα που έχει ένα.
Και είχαμε μια χαρα.
Έτσι κάπως τεχνικούς όρους, αυτό είναι μια χαρα όπως το γνωρίζουμε σήμερα;
>> Έτσι είναι ένας χαρακτήρας, αλλά ας είναι πιο ακριβής τώρα.
Τι εννοούμε με τον χαρακτήρα ή ατομι;
Ένα μη-αριθμητικό χαρακτήρα -
έτσι δεν είναι απαραίτητα.
Αποδεικνύεται ότι ακόμα και αριθμούς, ακόμη και στίξης και γράμματα είναι
αντιπροσωπεύονται με τα στοιχεία τύπου που είναι γνωστό ως char.
Έτσι δεν είναι κατ 'ανάγκην με αλφαβητική σειρά.
Ναι;
>> Έτσι είναι ένα ASCII χαρακτήρα.
Έτσι, αν νομίζετε ότι πίσω στην εβδομάδα το μηδέν, όταν είχαμε byte των εθελοντών
έρχονται και είτε να κρατήσει τα χέρια τους μέχρι ή όχι όλα, αντιπροσώπευαν bits.
Αλλά συλλογικά ως ομάδα των οκτώ, αντιπροσώπευαν ένα byte.
Και εμείς εισήγαγε την έννοια της ASCII εκείνη τη διάλεξη, η οποία είναι απλά μια
χαρτογράφηση μεταξύ αριθμών και γραμμάτων.
Και ASCII χρήσεις, όπως οι άνθρωποι σιωπηρή, οκτώ bits
να αντιπροσωπεύει ένα χαρακτήρα.
>> Έτσι, κατά συνέπεια, αν οκτώ bits μπορούν να λάβει κάθε μία από τις δύο τιμές -
μηδέν ή ένα -
Αυτό σημαίνει ότι υπήρχαν δύο δυνατότητες για αυτό το άτομο -
μηδέν ή ένα -
δύο για αυτό το άτομο, δύο για το σκοπό αυτό πρόσωπο, δύο για αυτό.
Έτσι, ένα σύνολο από δύο φορές δύο φορές δύο φορές δύο φορές δύο -
έτσι δύο η όγδοη συνολικά.
Έτσι, υπάρχει ένας συνολικός αριθμός των χαρακτήρων 256 δυνατό ότι μπορείτε να
αντιπροσωπεύουν με οκτώ bits.
>> Τώρα, όσοι από εσάς μιλούν ασιατικές γλώσσες θα μπορούσε να γνωρίζει ότι υπάρχει περισσότερο
χαρακτήρες στον κόσμο ό, τι ακριβώς Όπως και B και Cs και DS.
Και πράγματι, ASCII δεν αρκεί για πολλές γλώσσες του κόσμου.
Αλλά περισσότερα για αυτό άλλη φορά.
Προς το παρόν, γνωρίζουμε ότι σε C, αν θέλετε να αντιπροσωπεύει ένα γράμμα, ένα κομμάτι
στίξης, ή απλά χαρακτήρα κάτι στη φύση, χρησιμοποιούμε μια χαρα.
Και αυτό είναι ένα byte ή οκτώ bits.
>> Τι θα λέγατε για έναν int;
Λοιπόν, ένας int είναι ένας ακέραιος.
Πόσα bits, αν θυμάστε, ήταν ένας ακέραιος τυπικά;
Θυμάμαι κανέναν;
Έτσι είναι συνήθως 32.
Εξαρτάται πραγματικά για τον υπολογιστή που χρησιμοποιείτε.
Αλλά στην συσκευή, και σε πολλές υπολογιστές, είναι 32 bit ή τέσσερις
bytes - οκτώ φορές τέσσερα.
Και ints είναι μόνο που χρησιμοποιούνται για την αποθήκευση αριθμοί, είτε αρνητική,
θετικό ή μηδέν.
>> Και αν έχεις 32 bits και το μόνο που φροντίδα για θετικούς αριθμούς, μπορεί να
εξέδρα κανείς πόσα δυνατό ακέραιοι ένας υπολογιστής μπορεί να αντιπροσωπεύει από
μηδέν σε πάνω;
Έτσι, θα είναι δύο στο 32, το οποίο είναι περίπου τέσσερα δισεκατομμύρια.
Έτσι, οι αρμοδιότητες των δύο θα είναι επαναλαμβανόμενα θέματα στην επιστήμη των υπολογιστών.
Όπως θα δούμε, είναι αρκετά βολικό να συνεργαστεί με ακόμα κι αν δεν είναι αρκετά
εύκολο να κάνετε τα μαθηματικά στο κεφάλι κάποιου.
>> Έτσι, εμείς θα πούμε περίπου τέσσερα δισεκατομμύρια.
Τώρα, ένα πολύ μακρύ -
μπορείτε να το είδος της εικασία.
Είναι περισσότερο από έναν int.
Πόσα κομμάτια;
Έτσι, 64 bits ή οκτώ bytes.
Αυτό σημαίνει απλά μπορείτε να εκπροσωπεί ακόμη μεγαλύτερους αριθμούς, μεγαλύτερο θετικό ή
μεγαλύτερο αρνητικούς αριθμούς.
>> Και πώς για να επιπλέουν;
Αυτό είναι ένα πλωτό σημείο αξία των 32 bits.
Αυτό είναι ακριβώς ένας πραγματικός αριθμός, κάτι με ένα δεκαδικό ψηφίο.
Αλλά εάν χρειάζεστε αντί περισσότερες θέσεις μετά την υποδιαστολή ή θέλετε να
αντιπροσωπεύουν μεγαλύτερο αριθμό με κάποια κλάσμα μετά από αυτό, μπορείτε να χρησιμοποιήσετε ένα
διπλό, το οποίο είναι 64 bits.
>> Αλλά υπάρχει μια ενδιαφέρουσα takeaway εδώ.
Έτσι, εάν ints περιορίζονται κατά 32 bits και ακόμα και καιρό επιμήκη περιορίζεται από 64
bits, αυτό το είδος της θέτει το ερώτημα, Τι εάν πραγματικά θέλετε να μετρήσετε
υψηλότερο από ό, τι δισ. ευρώ για έναν int 4;
Λοιπόν, μπορείτε να χρησιμοποιήσετε μόνο μια πολύ καιρό.
Τι γίνεται όμως αν θέλετε να μετρήσετε υψηλότερα από δύο έως την 64η, ή να δώσει;
>> Τώρα, αυτό είναι ένα τεράστιο αριθμό.
Αλλά τελικά, ίσως στην πραγματικότητα νοιάζονται για αυτά τα είδη των τιμών,
ειδικά αν χρησιμοποιείτε μια βάση δεδομένων και αρχίζουν να συγκεντρώνουν πολλά και πολλά
και τα μέρη των δεδομένων και την ανάθεση μοναδική αριθμοί σε κάθε κομμάτι των δεδομένων.
Γι 'αυτό το είδος της έχουν ένα πρόβλημα.
Και ομοίως, με κυμαινόμενο σημείο τιμές - πλωτήρες ή δίκλινα -
αν έχετε μόνο έναν πεπερασμένο αριθμό bits, πόσα αριθμούς θα μπορούσε να σας
ενδεχομένως αντιπροσωπεύουν;
>> Λοιπόν, αυτό είναι λιγότερο σαφής όταν περιλαμβάνει μια υποδιαστολή.
Αλλά είναι σίγουρα πεπερασμένη.
Εάν έχετε έναν πεπερασμένο αριθμό bits, ένας πεπερασμένος αριθμός των ανθρώπων, μια πεπερασμένη
τον αριθμό των λαμπτήρων, σίγουρα μπορείτε να αντιπροσωπεύουν μόνο ένα πεπερασμένο αριθμό
τιμές κινητής υποδιαστολής.
Αλλά πόσοι πραγματικοί αριθμοί Δεν τους στον κόσμο;
Υπάρχει μια άπειρη.
Έτσι, αυτό είναι το είδος του προβλήματος, γιατί δεν έχουν απεριόριστο ποσό των
μνήμη RAM ή στο εσωτερικό των υπολογιστών μας.
Έτσι, κάποια προκλητικά πράγματα μπορούν να συμβούν.
>> Οπότε ας πάμε μπροστά και να προσπαθήσουμε για να εκφράσουν αυτό εδώ.
Επιτρέψτε μου να πάμε μπροστά και να ανοίξει το gedit.
Πάω να πάει μπροστά και να αποθηκεύσετε ένα αρχείο που ονομάζεται "floats0.c" ακριβώς για να είναι
συνεπείς με ένα παράδειγμα που είναι διαθέσιμα στο διαδίκτυο, αν θέλετε.
Και Πάω να προχωρήσει και ορίσετε ως εξής: -
Πάω να προχωρήσει και να πω, int κύριο κενό, όπως κάνουμε συχνά.
>> Και στη συνέχεια, σε αυτό το πρόγραμμα, Πάω να κηρύξει τον εαυτό μου ένα float, έτσι, ένα 32-bit
μεταβλητή που ονομάζεται f, αυθαίρετα.
Και τότε είμαι πρόκειται να αποθηκεύσετε σε αυτό Δεν ξέρω, το ένα δέκατο, έτσι ώστε 0.1.
Έτσι, Πάω να εκφράσει ότι ως ένα διαιρούμενο με 10, η οποία είναι απολύτως
νόμιμη C.
>> Και στη συνέχεια, στη δεύτερη γραμμή, εγώ απλά θέλετε να εκτυπώσετε αυτή την τιμή.
Έτσι, υπενθυμίζουν ότι μπορούμε να χρησιμοποιήσουμε το γνωστό printf.
Δεν θέλουμε να χρησιμοποιήσετε το% i για έναν int.
Θέλουμε να χρησιμοποιήσετε f% για ένα πλωτήρα.
Και τότε εγώ πάω να κάνω backslash n, Κλείσιμο απόσπασμα, κόμμα, f, τελεία.
>> Έτσι, εδώ είναι το πρόγραμμά μου.
Υπάρχει ήδη ένα bug.
Μήπως κάποιος για τον οποίο αυτό το κλικ ήδη θέλουν να δείχνουν ότι υπάρχει τουλάχιστον
ένα bug που έχω κάνει;
Ναι;
Ναι.
Ξέχασα "# include" στο κορυφή, σύμπτωμα της οποίας αν προσπαθώ να
καταρτίζουν αυτό πρόκειται να είναι ότι η compiler πρόκειται να μου φωνάζεις,
λέγοντας απροσδιόριστη σύμβολο ή κάτι για το σκοπό αυτό.
Δεν καταλαβαίνω κάτι όπως printf.
>> Έτσι, Πάω να κάνω "# include ", Αποθηκεύστε το αρχείο.
Και τώρα είναι σε καλύτερη κατάσταση.
Αλλά είμαι επίσης πρόκειται να επισημάνω έξω ένα νέο λεπτομερώς σήμερα.
Εκτός από τον ορισμό χώρα κατόχων, όπως% f% i% s, μπορείτε να
μερικές φορές επηρεάζουν τη συμπεριφορά της εν λόγω κράτησης θέσης.
Για παράδειγμα, στην περίπτωση μιας πλωτής Σημείο αξία, αν θέλω απλώς
για να εμφανιστεί ένα δεκαδικό ψηφίο μετά την περίοδο, δεν μπορώ πραγματικά να κάνουμε 0.1f.
Έτσι, με άλλα λόγια, χωρίζω το f και το σύμβολο του ποσοστού με το 0.1, απλά
λέει printf, μπορεί να έχετε μια ολόκληρη δέσμη των αριθμών μετά την υποδιαστολή
σημείο για μένα.
Αλλά θέλω μόνο να δω ένα από αυτά.
>> Έτσι, Πάω να προχωρήσει τώρα και εξοικονομήστε Αυτό το πρόγραμμα, πηγαίνετε στο τερματικό μου
παράθυρο, και είμαι πρόκειται να πάει μπροστά και ο τύπος κάνει 0 float, εισάγετε.
Βλέπω ότι κάπως αινιγματικά γραμμή που θα αρχίσουν να έχουν περισσότερο νόημα, όπως εμείς
πειράζω χώρια αυτή την εβδομάδα και την επόμενη.
Τώρα είμαι πρόκειται να πάει μπροστά και να τρέξει το μηδέν float.
Και, γαμώτο.
>> Έτσι, υπάρχει ένα άλλο bug εδώ για κάποιο λόγο.
Είμαι σίγουρος ότι το ένα δέκατο, ή ένα διαιρούμενο με το 10, δεν είναι 0,0.
Ίσως είμαι απλά δεν ψάχνει σε αρκετά ψηφία.
Γιατί, λοιπόν, δεν μπορώ να πω δύο .2 να δείτε δύο δεκαδικά ψηφία και όχι μόνο ένα.
Επιτρέψτε μου να πάω πίσω στο παράθυρο τερματικού μου εδώ και να χτυπήσει μια-δυο φορές για να
δείτε την ιστορία μου.
Κάνετε επιπλέουν μηδέν και πάλι, και στη συνέχεια και πάλι.
Και τώρα αρχίζει.
>> Και τώρα είμαι απόλυτα σίγουρος ότι αυτό είναι λάθος.
Και θα μπορούσα να κάνω τρία και τέσσερα, και είμαι κατά πάσα πιθανότητα θα συνεχίσω να βλέπω μηδενικά.
Επομένως, πού είναι το σφάλμα;
Ένα διαιρούμενο με το 10 θα πρέπει να είναι 0,1.
Κάποιος θέλει να λάβει μια μαχαιριά σε ό, τι το θεμελιώδες ζήτημα είναι;
Ναι;
Είναι και οι δύο ακέραιοι.
Και τι έγινε;
Έτσι, με ένα διαιρούμενο με το 10, που είναι Τι να κάνω στην αριθμητική.
Και παίρνω 0.1.
>> Ναι.
Και γι 'αυτό είναι πράγματι το ζήτημα.
Όταν παίρνετε έναν ακέραιο σε έναν υπολογιστή και μπορείτε να το διαιρέσετε με άλλο ακέραιο,
ο υπολογιστής από προεπιλογή πρόκειται να υποθέσουμε ότι θέλετε έναν ακέραιο.
Το πρόβλημα όμως, φυσικά, είναι ότι 0,1 δεν είναι ένας ακέραιος αριθμός.
Είναι ένας πραγματικός αριθμός.
Και έτσι αυτό που ο υπολογιστής κάνει με την προεπιλογή είναι απλά πετάει μακριά
τα πάντα μετά την υποδιαστολή.
Δεν στρογγυλοποίηση προς τα κάτω ή πάνω per se.
Είναι απλά πετάει τα πάντα μετά την υποδιαστολή.
Και τώρα που έχει νόημα.
Διότι τώρα είμαστε σαφώς έφυγε με μηδέν.
>> Αλλά περιμένετε ένα λεπτό.
Δεν βλέπω μια int μηδέν.
Βλέπω στην πραγματικότητα 0.00.
Λοιπόν, πώς μπορώ να συμβιβάσει αυτό τώρα;
Αν κάποιος διαιρούμενο με το 10 είναι μηδέν, αλλά είμαι βλέποντας 0.00, όταν είναι να πάρει
μετατραπεί ξανά σε ένα πραγματικό αριθμό;
Ναι.
Ακριβώς.
>> Έτσι, εδώ στη γραμμή πέντε, όταν στην πραγματικότητα αποθηκεύετε τα 0,1, το οποίο στη συνέχεια
περικοπεί στο μηδέν, μέσα από ένα πλωτήρα, Αυτό είναι στην πραγματικότητα ισοδύναμη με
αποθήκευσή όχι ως int, αλλά, Πράγματι, ως float.
Επιπλέον, είμαι στη συνέχεια, χρησιμοποιώντας printf για να ρητά να εκτυπώσετε τον αριθμό αυτό σε δύο
δεκαδικά ψηφία, ακόμη κι αν υπάρχουν δεν μπορεί στην πραγματικότητα να είναι οποιαδήποτε.
>> Έτσι, αυτό το είδος της χάλια, έτσι δεν είναι;
Προφανώς δεν μπορείτε να κάνετε τα μαθηματικά, τουλάχιστον σε αυτό το επίπεδο
ακρίβεια, σε έναν υπολογιστή.
Αλλά σίγουρα υπάρχει μια λύση.
Ποια είναι η πιο απλή αποτύπωση θα μπορούσαμε ίσως κάνει, έστω και μόνο διαισθητικά εδώ
λύσει αυτό;
Ναι;
Γυρίστε τους ακέραιους σε -
ναι.
Ακόμα κι αν δεν είμαι βέβαιος τι είναι πραγματικά συμβαίνει εδώ, αν
ουσιαστικά έχει να κάνει με αυτά τα δύο είναι ints, καλά, γιατί δεν μπορώ να
κάνουν ότι 10,0, κάνοντας αυτό 1.0, αποθηκεύστε ξανά το αρχείο.
Επιτρέψτε μου να πάω πίσω στο πυθμένα και recompile.
Επιτρέψτε μου τώρα να επαναπροσδιοριστούν.
Και εκεί -
τώρα, έχω ένα δέκατο μου εκπροσωπήθηκαν ως 0.10.
>> Εντάξει.
Έτσι, αυτό δεν είναι κακό.
Και επιτρέψτε μου να επισημάνω ένα άλλο τρόπο θα μπορούσε να λύσει αυτό.
Επιτρέψτε μου πραγματικά κυλήσει πίσω στο χρόνο για το πότε είχαμε αυτό ως ένα
δέκατο πριν από λίγο.
Και επιτρέψτε μου να πάει μπροστά και να αποθηκεύσετε ξανά αυτό το αρχείο ως διαφορετικό όνομα αρχείου, απλά για να
έχουν ένα μικρό σημείο ελέγχου.
Έτσι, αυτό ήταν η μία εκδοχή.
Και τώρα επιτρέψτε μου να προχωρήσει και κάνουμε μία πιο βελτιωμένη έκδοση.
Θα το ονομάσουμε έκδοση δύο μηδέν ευρετήριο.
>> Και Πάω να κάνουμε αντ 'αυτού Αυτό - ξέρετε τι;
Προσθέτοντας dot μηδέν λειτουργεί σε αυτή την περίπτωση.
Αλλά ας υποθέσουμε ότι κάποιος ήταν μια μεταβλητή.
Υποτίθεται ότι 10 ήταν μια μεταβλητή.
Με άλλα λόγια, ας υποθέσουμε ότι δεν θα μπορούσα μόλις hard-code .0 στο τέλος
αυτής της αριθμητικής έκφρασης.
Λοιπόν, μπορώ να κάνω πραγματικά κάτι σε παρένθεση ονομάζεται χύτευση.
Μπορώ να ρίξει ότι ακέραιος 10 σε float, και μπορώ να ρίχνει ότι ακέραιος ένα προς ένα
επιπλέουν, καθώς και.
Στη συνέχεια, τα μαθηματικά που πρόκειται να γίνει αποτελεσματικά 1.0 διαιρείται με 10,0,
το αποτέλεσμα της οποίας πηγαίνει στο f όπως και πριν.
Έτσι, αν μεταγλωττίσετε αυτό το κάνει όπως επιπλέει 2, και επιπλέει τώρα 2, Παίρνω το ίδιο
απαντήσει, καθώς και.
>> Έτσι, αυτό είναι μια αρκετά σκηνοθετημένη παράδειγμα, για να λύσει αυτό το πρόβλημα
με την εισαγωγή casting.
Αλλά σε γενικές γραμμές, χύτευση πρόκειται να είναι ένα ισχυρό πράγμα, ιδιαίτερα για
πρόβλημα που δύο σε μία εβδομάδα, όταν θέλετε να μετατρέψετε έναν τύπο δεδομένων
άλλο ότι στο τέλος της ημέρας εκπροσωπούνται με τον ίδιο τρόπο.
Στο τέλος της ημέρας, κάθε ενιαία πράγμα που έχουμε μιλήσει μέχρι στιγμής είναι
μόνο ints κάτω από το καπό.
Ή αν αυτό είναι πάρα πολύ χαμηλό επίπεδο για σας, είναι ακριβώς οι αριθμοί
κάτω από το καπό.
Ακόμα και χαρακτήρες, και πάλι, υπενθυμίζουν από το μηδέν εβδομάδα, οι αριθμοί
κάτω από το καπό.
>> Δηλαδή, μπορούμε να μετατρέψουμε μεταξύ διαφορετικούς τύπους αριθμών, αν
είναι απλά bits.
Μπορούμε να μετατρέψετε μεταξύ των αριθμών και τα γράμματα, εάν είναι απλά
bits, και το αντίστροφο.
Και χύτευση με τον τρόπο αυτό είναι ένας μηχανισμός στον προγραμματισμό που σας επιτρέπει να δια της βίας
αλλαγή ενός τύπου δεδομένων σε μια άλλη.
Δυστυχώς, αυτό δεν είναι τόσο απλή, όπως ίσως θα ήθελαν.
>> Πάω να πάει πίσω στο πλωτήρες 1, το οποίο ήταν το πιο απλό, πιο
ένα με απλή Προστέθηκε στις 0.0 για το καθένα.
Και ακριβώς όπως μια γρήγορη επανεκπαίδευση, επιτρέψτε μου να πάω μπροστά και να μεταγλωττίσετε ξανά
αυτό, να επιπλέει 2 -
Συγγνώμη, αυτό είναι να επιπλέει 1.
Και τώρα ας τρέχει πλωτήρες 1.
Και στο κάτω, παρατηρήστε ότι έχω όντως 0.1.
Έτσι, το πρόβλημα λύθηκε.
>> Αλλά όχι ακόμη.
Είμαι τώρα πρόκειται να πάρει λίγο περίεργο, και είμαι πρόκειται να πάει πίσω στο μου
printf δήλωση και ας πούμε, ξέρετε τι;
Θα ήθελα να επιβεβαιώσω ότι αυτό είναι πραγματικά ένα δέκατο.
Και Πάω να θέλουν να δουν αυτό , ας πούμε, πέντε δεκαδικά ψηφία.
Δεν είναι ένα πρόβλημα.
Μπορώ να αλλάξω τα δύο σε πέντε, I ξαναμεταγλωττίσετε με κάνουν.
I επανάληψη επιπλέει σαν 1.
Κοιτάζοντας πολύ καλή.
Ελέγχους λογική μου μπορεί να καταλήξει εκεί, αλλά Παίρνω λίγο πιο τολμηροί.
Πάω να αλλάξει 0,5 έως 0,10.
Θέλω να δω 10 ψηφία μετά το δεκαδικό ψηφίο.
>> Και Πάω να προχωρήσει και να μεταγλωττίσετε ξανά αυτό και να επαναπροσδιοριστούν επιπλέει 1.
Ι το είδος της λύπης αφού δοκίμασε αυτό περαιτέρω, επειδή τα μαθηματικά μου δεν είναι τόσο
διορθώσει πια, φαίνεται.
Αλλά περιμένετε ένα λεπτό, ίσως αυτό είναι απλά ένα λάθος.
Ίσως ο υπολογιστής ενεργεί λίγο παράξενο.
Επιτρέψτε μου να πάω μπροστά και να κάνουμε 20 δεκαδικά ψηφία και εγώ διαβεβαιώσω ότι γνωρίζω
πώς να κάνει τα μαθηματικά.
Ξέρω πώς να το πρόγραμμα.
Κάντε πλωτήρες 1, recompile και γαμώτο.
Αυτό είναι πραγματικά, πραγματικά να πάρει μακριά από το σήμα.
>> Λοιπόν, τι συμβαίνει εδώ;
Διαισθητικά, με βάση τις παραδοχές μας νωρίτερα σχετικά με το μέγεθος των τύπων δεδομένων,
τι πρέπει να συμβαίνει εδώ κάτω από την κουκούλα;
Ναι;
Ακριβώς.
Αν θέλετε αυτό το πολύ ακρίβεια, και αυτό είναι ένα καλό των πολύ ακριβείας -
20 αριθμούς μετά την υποδιαστολή.
Μπορείτε δεν μπορεί να εκπροσωπεί ενδεχομένως μια αυθαίρετο αριθμό, εκτός αν έχετε ένα
αυθαίρετο αριθμό από bits.
Αλλά δεν το κάνουμε.
Για μια float, έχουμε μόνο 32 bits.
>> Έτσι, εάν 32 bits μπορούν να μετατεθούν σε ένα τρόπο - ακριβώς όπως τους ανθρώπους μας, το στάδιο
τα χέρια επάνω ή προς τα κάτω - σε ένα πεπερασμένο αριθμό τρόπους, υπάρχει μόνο ένας πεπερασμένος αριθμός
των πραγματικών αριθμών που μπορεί να αντιπροσωπεύει με εκείνα τα κομμάτια.
Και έτσι ο υπολογιστής τελικά πρόκειται να πρέπει να
αρχίσετε την κοπή γωνίες.
Ο υπολογιστής μπορεί να κρύψει τις λεπτομέρειες από εμάς για λίγο διάστημα.
Αλλά αν αρχίσουμε να σπρώχνει τους αριθμούς και αναζητούν όλο και πιο Κατά την
καταληκτικά αριθμούς στο ακέραιο αριθμό, τότε θα αρχίσουμε να βλέπουμε ότι είναι
στην πραγματικότητα προσεγγίζει το ιδέα του ενός δεκάτου.
>> Και έτσι αποδεικνύεται, κατά τραγικό τρόπο, υπάρχει ένας άπειρος αριθμός των αριθμών
δεν μπορούμε να αντιπροσωπεύει ακριβώς μια υπολογιστή, τουλάχιστον με έναν πεπερασμένο
αριθμός των bits, μια πεπερασμένη ποσό της μνήμης RAM.
Τώρα, δυστυχώς, αυτή η ενίοτε έχει στον πραγματικό κόσμο συνέπειες.
Εάν οι άνθρωποι δεν εκτιμούν αρκετά αυτό ή είδος θεωρούμε δεδομένο το γεγονός
ότι ο υπολογιστής τους θα κάνουμε ό, τι θα πει να το κάνει και δεν
κατανοήσουν αυτά τα υποκείμενα λεπτομέρειες εκπροσώπησης -
τα οποία, ειλικρινά, σε ορισμένες γλώσσες είναι κρυμμένο από τον χρήστη, σε αντίθεση με C -
κάποια κακά πράγματα μπορούν να συμβούν.
>> Και ό, τι νόμιζα ότι θα κάνουμε είναι να κάνουμε ένα βήμα πίσω.
Και αυτό είναι περίπου μία οκτώ λεπτών βίντεο.
Είναι προβλήθηκε πριν από λίγα χρόνια, και δίνει γνώσεις σε πραγματικά ό, τι μπορεί να πάει
στραβά, όταν υπο-εκτιμήσουν αυτά είδη λεπτομέρειες στο πολύ-πολύ όλα
πραγματικό κόσμο.
Αν μπορούσαμε χαμηλώστε τα φώτα για μερικά λεπτά.
>> ΟΜΙΛΗΤΗΣ 1: Και τώρα επιστρέφουμε στη μηχανική
καταστροφές σε σύγχρονα θαύματα.
>> Υπολογιστές -
όλοι έχουμε έρθει για να δεχτεί το συχνά απογοητευτικό προβλήματα
που πάνε μαζί τους.
Bugs, ιούς και δυσλειτουργίες λογισμικού είναι μικρές τιμές να πληρώσουν για την
ευκολία.
Όμως, σε τομείς υψηλής τεχνολογίας και υψηλής ταχύτητας στρατιωτικών και διαστημικό πρόγραμμα
εφαρμογές, το μικρότερο πρόβλημα μπορεί να μεγεθυνθεί σε καταστροφή.
>> Στις 4 Ιουνίου του 1996, οι επιστήμονες έτοιμοι να ξεκινήσει ένα μη επανδρωμένο πύραυλο Ariane 5.
Μετέφερε επιστημονικούς δορυφόρους σχεδιαστεί για να προσδιοριστεί με ακρίβεια το πώς
μαγνητικό πεδίο της Γης αλληλεπιδρά με τους ηλιακούς ανέμους.
Ο πύραυλος κατασκευάστηκε για την Ευρωπαϊκή Υπηρεσίας Διαστήματος και ανασηκωμένη από της
εγκατάσταση στην ακτή της Γαλλικής Γουιάνας.
>> JACK GANSSLE: Σε περίπου 37 δευτερόλεπτα σε η πτήση, που παρατηρήθηκε για πρώτη φορά
κάτι δεν πήγαινε καλά.
Τα ακροφύσια, γυρίζοντας στο ένας τρόπος που πραγματικά δεν θα έπρεπε.
Περίπου 40 δευτερόλεπτα στην πτήση, σαφώς το όχημα ήταν σε μπελάδες.
Και αυτό είναι, όταν έκαναν ένα απόφαση να το καταστρέψουν.
Ο ανώτερος υπάλληλος ασφάλειας, με τεράστια κότσια, πιέζεται το κουμπί,
ανατίναξαν τον πύραυλο προτού να μπορέσει να να γίνει ένας κίνδυνος για τη δημόσια ασφάλεια.
>> ΟΜΙΛΗΤΗΣ 1: Αυτό ήταν το παρθενικό ταξίδι του Ariane 5, και την καταστροφή του
έλαβε χώρα εξαιτίας του ενσωματωμένου ενός ελαττώματος στο λογισμικό του πυραύλου.
>> JACK GANSSLE: Το πρόβλημα για την Ariane ήταν ότι υπάρχει ένας αριθμός
ότι οι απαιτούμενες 64 bits για να εκφράσουν.
Και ήθελαν να μετατρέψουν σε μια 16-bit αριθμό.
Υπέθεσαν ότι ο αριθμός δεν ήταν ποτέ πρόκειται να είναι πολύ μεγάλο, ότι το μεγαλύτερο μέρος των
τα ψηφία του 64-bit αριθμός ήταν μηδενικά.
Θα ήταν λάθος.
>> ΟΜΙΛΗΤΗΣ 1: Η αδυναμία ενός λογισμικού πρόγραμμα για να δεχθεί το είδος της
αριθμός που παράγεται από ένα άλλο ήταν στη ρίζα της αποτυχίας.
Ανάπτυξη λογισμικού είχε γίνει μια πολύ δαπανηρό μέρος της νέας τεχνολογίας.
Η Ariane 4 πύραυλος ήταν πολύ επιτυχής, τόσο μεγάλο μέρος του λογισμικού
δημιουργήθηκε για αυτό ήταν επίσης που χρησιμοποιούνται για την Ariane 5.
>> PHILIP COYLE: Το βασικό πρόβλημα ήταν ότι η Ariane 5 ήταν ταχύτερη,
επιταχύνθηκε γρηγορότερα.
Και το λογισμικό δεν είχε αντιπροσώπευε γι 'αυτό.
>> ΟΜΙΛΗΤΗΣ 1: Η καταστροφή του πυραύλου ήταν μια τεράστια οικονομική καταστροφή,
όλα οφείλονται σε ένα λεπτό σφάλμα λογισμικού.
Αλλά αυτή δεν ήταν η πρώτη φορά, δεδομένα προβλήματα μετατροπής είχε ταλαιπωρήσει σύγχρονες
πυραυλικής τεχνολογίας.
>> JACK GANSSLE: Το 1991, με την έναρξη του πρώτου Πολέμου του Κόλπου, ο Patriot
πυραύλων βιώσει ένα παρόμοιο είδος ενός προβλήματος μετατροπής αριθμό.
Ως αποτέλεσμα, 28 Αμερικανοί στρατιώτες ήταν σκοτώθηκαν και περίπου 100 τραυματίες
όταν το Patriot, η οποία υποτίθεται ότι για την προστασία από τις εισερχόμενες Scuds,
απέτυχε να βάλει φωτιά σε ένα βλήμα.
>> ΟΜΙΛΗΤΗΣ 1: Όταν το Ιράκ εισέβαλε στο Κουβέιτ και Αμερική ξεκίνησε Καταιγίδα της Ερήμου στο
αρχές του 1991, συστοιχίες πυραύλων Patriot είχαν αναπτυχθεί για την προστασία της Σαουδικής Αραβίας
και το Ισραήλ από το Ιράκ Scud πυραυλικές επιθέσεις.
Το Patriot είναι μια αμερικανική μεσαίου βεληνεκούς επιφανείας-αέρος του συστήματος κατασκευάζονται από
η εταιρεία Raytheon.
>> ΘΕΟΔΩΡΟΣ Postol: Το μέγεθος του Patriot αναχαίτισης είναι η ίδια περίπου
20 πόδια μακρύ.
Και ζυγίζει περίπου 2000 κιλά.
Και αυτό φέρνει μια κεφαλή περίπου -
Νομίζω ότι είναι περίπου 150 κιλά.
Και η κεφαλή πυραύλου η ίδια είναι ένα εκρηκτικών που έχει
θραύσματα γύρω από αυτό.
Το περίβλημα της εκρηκτικής κεφαλής είναι σχεδιασμένο να ενεργεί σαν σκάγια.
>> ΟΜΙΛΗΤΗΣ 1: Τα βλήματα που τέσσερις ανά περιέκτη και μεταφέρονται
από ένα ημι ρυμουλκούμενο.
>> PHILIP COYLE: Ο πατριώτης αντιπυραυλική το σύστημα πηγαίνει πίσω στο
τουλάχιστον 20 χρόνια τώρα.
Αρχικά είχε σχεδιαστεί ως μια πυραυλική άμυνα αέρα
καταρρίψουν τα αεροπλάνα του εχθρού.
Στο πρώτο Πόλεμο του Κόλπου, όταν ο πόλεμος ήρθε μαζί, ο στρατός ήθελε να το χρησιμοποιήσετε
να καταρρίψουν Scuds όχι αεροπλάνα.
Η ιρακινή αεροπορία δεν ήταν τόσο μεγάλο πρόβλημα.
Αλλά ο στρατός ανησυχεί για Scuds.
Και έτσι προσπάθησαν να αναβαθμίσουν το Patriot.
>> ΟΜΙΛΗΤΗΣ 1: Παρακολουθούν ένα βλήμα του εχθρού ταξιδεύουν στο mach πέντε ήταν
πρόκειται να είναι αρκετά προκλητική.
Αλλά όταν το Patriot ήταν έσπευσε στο υπηρεσίας, ο στρατός δεν ήταν ενήμερη για ένα
Ιράκ τροποποίηση που έκανε τους Scuds σχεδόν αδύνατο να χτυπήσει.
>> ΘΕΟΔΩΡΟΣ Postol: Τι συνέβη είναι οι Scuds που ήταν
έρχονται ήταν ασταθής.
Είχαν ταλάντευση.
Ο λόγος για αυτό ήταν η Ιρακινούς, στην Για να πάρετε 600 χιλιόμετρα από την
300 χιλιομέτρων βεληνεκούς πυραύλων, πήρε βάρους έξω από την μπροστινή κεφαλή.
Έκαναν την κεφαλή αναπτήρα.
Έτσι τώρα το Patriot προσπαθεί για να έρθει στο Scud.
Και τις περισσότερες φορές, η συντριπτική το μεγαλύτερο χρονικό διάστημα, θα ήταν απλώς
πετάξει από το Scud.
>> ΟΜΙΛΗΤΗΣ 1: Μόλις το σύστημα Patriot φορείς συνειδητοποίησε το Patriot έχασε
στόχο της, που πυροδότησε την πατριώτες κεφαλή να αποφευχθούν πιθανές
απώλειες εάν αφέθηκε να πέσει στο έδαφος.
>> ΘΕΟΔΩΡΟΣ Postol: Αυτό ήταν ό, τι πιο άνθρωποι είδαν τόσο μεγάλη fireballs στον ουρανό
και να παρερμηνευθεί ως παρακολουθήσεις της Scud κεφαλές.
>> ΟΜΙΛΗΤΗΣ 1: Αν και στο νυχτερινό ουρανό Πατριώτες φάνηκε να είναι με επιτυχία
καταστρέφοντας Scuds, στο Νταχράν υπάρχει θα μπορούσε να μην το κρύβουμε της
απόδοση.
Εκεί, το σύστημα ραντάρ του Patriot έχασαν παρακολούθηση της εισερχόμενης Scud και ποτέ
ξεκίνησε οφείλεται σε ένα ελάττωμα του λογισμικού.
>> Ήταν οι Ισραηλινοί που ανακαλύφθηκε για πρώτη φορά ότι όσο περισσότερο το σύστημα
ήταν, τόσο μεγαλύτερη είναι η απόκλιση του χρόνου έγινε λόγω της ένα ρολόι
ενσωματωμένο στον υπολογιστή του συστήματος.
>> JACK GANSSLE: Περίπου δύο εβδομάδες πριν από την τραγωδία στο Νταχράν, οι Ισραηλινοί
αναφέρθηκαν στο Υπουργείο Άμυνας ότι το σύστημα ήταν χάσιμο χρόνου.
Μετά από οκτώ περίπου ώρες λειτουργίας, παρατήρησαν ότι το σύστημα είναι
γίνει αισθητά λιγότερο ακριβείς.
Το Υπουργείο Άμυνας ανταποκρίθηκε λέει όλες τις μπαταρίες Patriot
να μην αφήσει τα συστήματα για μεγάλο χρονικό διάστημα.
Ποτέ δεν είπε τι ένα μεγάλο χρονικό διάστημα ήταν.
Οκτώ ώρες;
10 ώρες;
1000 ώρες;
Κανείς δεν ήξερε.
>> ΟΜΙΛΗΤΗΣ 1: Η μπαταρία Patriot σταθμεύουν στο στρατώνα στο Νταχράν
και ατελή εσωτερικό ρολόι του είχε για πάνω από 100 ώρες το βράδυ της
25 Φεβρουαρίου.
>> JACK GANSSLE: Θα παρακολουθούνται χρόνο για μια ακρίβεια περίπου το ένα δέκατο του δευτερολέπτου.
Τώρα, ένα δέκατο του δευτερολέπτου αποτελεί ενδιαφέρουσα αριθμό, διότι δεν μπορεί να είναι
εκφραζόμενη σε δυαδική ακριβώς, πράγμα που σημαίνει δεν μπορεί να εκφράζεται ακριβώς
κάθε σύγχρονο ψηφιακό υπολογιστή.
Είναι δύσκολο να πιστέψει κανείς, αλλά χρησιμοποιήσουμε ως παράδειγμα.
Ας πάρουμε το νούμερο ένα τρίτο.
Το ένα τρίτο δεν μπορεί να εκφραστεί σε δεκαδική ακριβώς.
Το ένα τρίτο είναι 0.333 πρόκειται σχετικά για το άπειρο.
Δεν υπάρχει τρόπος να το κάνουμε αυτό με απόλυτη ακρίβεια σε δεκαδικά.
Αυτό είναι ακριβώς το ίδιο είδος του προβλήματος αυτό συνέβη στο Patriot.
Το πλέον το σύστημα έτρεξε, η χειρότερη το σφάλμα χρόνου έγινε.
>> ΟΜΙΛΗΤΗΣ 1: Μετά από 100 ώρες λειτουργίας, το σφάλμα στο χρόνο ήταν μόνο
περίπου το ένα τρίτο του δευτερολέπτου.
Αλλά από την άποψη της στόχευσης ενός πυραύλου ταξιδεύουν στο mach πέντε, είχε ως αποτέλεσμα
ένα σφάλμα παρακολούθησης πάνω από 600 μέτρα.
Θα ήταν μοιραίο λάθος για οι στρατιώτες στο Dhahran.
>> ΘΕΟΔΩΡΟΣ Postol: Αυτό που συνέβη είναι μια Scud εκτόξευσης εντοπίστηκε από τις αρχές
δορυφόροι προειδοποίησης.
Και ήξεραν ότι ο Scud ερχόταν στη γενική κατεύθυνσή τους.
Δεν ήξεραν πού ερχόταν.
>> ΟΜΙΛΗΤΗΣ 1: Ήταν τώρα στο ραντάρ συνιστώσα του συστήματος Patriot
υπεράσπιση Dhahran για να εντοπίσετε και να κρατήσει παρακολούθηση των εισερχόμενων πυραύλων του εχθρού.
>> JACK GANSSLE: Το ραντάρ ήταν πολύ έξυπνος.
Θα παρακολουθείτε πραγματικά τη θέση του ο Scud και στη συνέχεια να προβλέψει πού
κατά πάσα πιθανότητα θα είναι η επόμενη φορά το ραντάρ έστειλε έναν παλμό έξω.
Που ονομαζόταν η πύλη φάσμα.
>> ΘΕΟΔΩΡΟΣ Postol: Στη συνέχεια, αφού το Patriot αποφασίζει έχει περάσει αρκετός χρόνος για να πάει
πίσω και ελέγξτε την επόμενη θέση για Αυτό το αντικείμενο που ανιχνεύεται, πηγαίνει πίσω.
Έτσι, όταν πήγε πίσω στο λάθος θέση του, τότε βλέπει κανένα αντικείμενο.
Και αποφασίζει ότι δεν υπήρχε αντικείμενο, ήταν μια λανθασμένη ανίχνευση και
πέφτει το κομμάτι.
>> ΟΜΙΛΗΤΗΣ 1: Η εισερχόμενη Scud εξαφανίστηκε από την οθόνη του ραντάρ, και
δευτερόλεπτα αργότερα συγκρούστηκε στο στρατώνα.
Η Scud σκότωσε 28 και ήταν η τελευταία απολύθηκε κατά τη διάρκεια του πρώτου Πολέμου του Κόλπου.
Τραγικά, το ενημερωμένο λογισμικό έφτασε στο Νταχράν την επόμενη ημέρα.
Το ελάττωμα του λογισμικού είχε καθοριστεί, κλείνοντας ένα κεφάλαιο στην ταραγμένη
ιστορία των πυραύλων Patriot.
>> Patriot είναι στην πραγματικότητα ένα αρκτικόλεξο σταδιακής συστημάτων παρακολούθησης
Τομής της Target.
>> DAVID J MALAN: Εντάξει, έτσι, ένα απογοητευτικό παράδειγμα, να είστε σίγουροι.
Και ευτυχώς, αυτές χαμηλότερο επίπεδο σφάλματα δεν είναι κάτι που εμείς θα
συνήθως πρέπει να εκτιμήσουν, σίγουρα όχι με κάποια από μας
νωρίτερο των προγραμμάτων.
Αντίθετα, τα περισσότερα από τα σφάλματα που θα συνάντηση θα ήταν λογικό στη φύση,
συντακτική στη φύση με την οποία ο κωδικός ακριβώς δεν λειτουργεί σωστά.
Και ξέρετε ότι πολύ γρήγορα.
>> Όμως, ιδιαίτερα όταν φτάσουμε στην τέλος του εξαμήνου, πρόκειται να
γίνονται όλο και περισσότερο από μια δυνατότητα πραγματικά ότι σκληρά για το σχεδιασμό
των προγραμμάτων και του υποκείμενου αναπαράσταση
εκεί, επίσης, των στοιχείων.
Για παράδειγμα, θα εισαγάγει MySQL, η οποία είναι μια δημοφιλής μηχανή βάσης δεδομένων
που μπορείτε να χρησιμοποιήσετε με ιστοσελίδες για να αποθηκεύουν δεδομένα σχετικά με την πίσω άκρο.
Και θα πρέπει να αρχίσουν να αποφασίσει σε το τέλος του εξαμήνου, όχι μόνο ό, τι
τύπους δεδομένων κατά μήκος αυτών των γραμμών να χρησιμοποιούν αλλά ακριβώς πόσα bits να χρησιμοποιούν,
αν θέλετε ή όχι να αποθηκεύσετε ημερομηνίες οι ημερομηνίες και οι ώρες οι χρόνοι, καθώς επίσης και
πράγματα όπως το πόσο μεγάλο θέλετε το μοναδικά αναγνωριστικά για να είναι, ας πούμε, οι χρήστες
στη βάση δεδομένων σας.
>> Στην πραγματικότητα, εάν κάποιοι από εσάς είχατε Λογαριασμούς στο Facebook εδώ και αρκετό καιρό,
και ξέρετε πώς να αποκτήσετε πρόσβαση στο χρήστη με ID σας -
η οποία δείχνει μερικές φορές σε σας URL προφίλ του, εκτός εάν έχετε επιλέξει ένα
ψευδώνυμο για το URL, ή αν έχετε Γράφημα χρησιμοποιείται το Facebook API, η
διαθέσιμες στο κοινό API με το οποίο θα μπορεί να ζητήσει από το Facebook για τα ανεπεξέργαστα δεδομένα -
μπορείτε να δείτε τι αριθμητικό ID σας.
Και πριν από μερικά χρόνια, ουσιαστικά Facebook έπρεπε να αλλάξει από τη χρήση
το ισοδύναμο των ints τη χρήση μακράς καιρό γιατί την πάροδο του χρόνου, καθώς οι χρήστες έρχονται
και να πάει και να δημιουργήσει πολλούς λογαριασμούς και ψεύτικους λογαριασμούς, ακόμη και αυτοί πολύ εύκολα
ήταν σε θέση να εξαντλήσει κάτι σαν 4 δισ. δυνατή τιμή, όπως έναν int.
>> Έτσι, περισσότερο σε αυτά τα είδη των θεμάτων κάτω από το δρόμο, καθώς και.
Εντάξει, έτσι ώστε να ήταν χύτευσης.
Αυτό ήταν ανακρίβεια.
Ένα ζευγάρι των γρήγορων ανακοινώσεις.
Έτσι, τα τμήματα ξεκινήσει επίσημα την ερχόμενη Κυριακή, Δευτέρα, Τρίτη.
Θα ακούσετε μέσω e-mail αργότερα αυτή την εβδομάδα ως προς εκχώρηση τμήμα σας.
Και θα έχετε επίσης εδώ σε αυτό το σημείο πως για να αλλάξετε το τμήμα σας, εάν σας
το πρόγραμμα έχει πλέον αλλάξει ή να σας επίπεδο άνεσης έχει πλέον αλλάξει.
Εν τω μεταξύ P-set ενός χάκερ και ένα είναι οφείλεται αυτή την Πέμπτη με την επιλογή
παρατείνει την προθεσμία αυτή κατά τη προδιαγραφές έως την Παρασκευή
σε ένα τυπικό τρόπο.
>> Συνειδητοποιήστε ότι περιλαμβάνεται με το πρόβλημα προδιαγραφές που είναι οι οδηγίες για
Πώς να χρησιμοποιήσετε το CS50 συσκευή, κάνει, καθώς και ορισμένες CS50 ειδικά εργαλεία
όπως το στυλ 50, το οποίο μπορεί να σας προσφέρει με ανάδραση δυναμικά για την
ποιότητα του κώδικα στυλ σας, αλλά και ελέγχει το 50, το οποίο μπορεί να σας παρέχει με
Δυναμική ανάδραση ώστε να σας ορθότητα του κώδικα του.
Συγχωρήστε ότι είμαστε ακόμα σιδέρωμα έξω μερικές συστροφές με επιταγή 50.
Μερικοί από τους συμμαθητές σας που είχαν ξεκινήσει περίπου τέσσερις το βράδυ της Παρασκευής, όταν
το spec ανέβηκε έχετε παρατηρήσει από τότε μερικά bugs που εργαζόμαστε
μέσα, και συγνώμη για όποιον γνώρισε αδικαιολόγητη απογοητεύσεις.
Το λάθος είναι δικό μου.
Αλλά θα παρακολουθεί την CS50 συζητήσουν όταν αυτό έχει επιλυθεί.
>> Έτσι, μια λέξη για τα αποτελέσματα τους.
Γι 'αυτό θα είναι μια εβδομάδα ή δύο πριν αρχίζουν να πάρει πληροφορίες σχετικά με σύνολα πρόβλημα
γιατί δεν έχουν ακόμη υπότροφος διδασκαλίας.
Και ακόμα και τότε, θα αρχίσουμε να αξιολογήσει το πρόβλημα C σύνολα πριν
πάμε πίσω και να αξιολογήσει το μηδέν, έτσι ότι μπορείτε να πάρετε περισσότερες σχετικές
Η γνώμη πιο γρήγορα.
Αλλά σε γενικές γραμμές σύμφωνα με την εξεταστέα ύλη, CS50 Τα σύνολα πρόβλημα που αξιολογούνται κατά μήκος της
μετά από τέσσερις άξονες -
το πεδίο εφαρμογής, την ορθότητα, το σχεδιασμό και στυλ.
>> Πεδίο εφαρμογής πρόκειται να είναι ένας αριθμός τυπικά μεταξύ μηδέν και πέντε ότι
συλλαμβάνει πόσο η κομμάτι που δάγκωσε.
Συνήθως, θέλετε αυτό να είναι πέντε.
Μπορείτε τουλάχιστον δοκιμάσει τα πάντα.
Και παρατηρήσετε ότι είναι ένας πολλαπλασιαστικός παράγοντας έτσι ώστε να κάνει μόνο ένα μέρος του
set πρόβλημα δεν είναι η καλύτερη στρατηγική.
>> Εν τω μεταξύ, πιο προφανής είναι η σημασία της ορθότητας -
ακριβώς είναι το πρόγραμμά σας σωστά με σεβασμό των προδιαγραφών;
Αυτό είναι σταθμισμένος σκόπιμα περισσότερα σε μεγάλο βαθμό από τις άλλες δύο άξονες από ένα
τριπλάσιο διότι αναγνωρίζουμε που συνήθως θα πάμε να περάσετε μια
πολύ περισσότερο χρόνο κυνηγώντας κάποια σφάλματα, να πάρει τον κωδικό σας για να λειτουργήσει, τότε μπορείτε
είναι αυτό που εσοχή και επιλέγοντας κατάλληλα τα ονόματα των μεταβλητών και οι
παρόμοια, που είναι στο άλλο άκρο του φάσματος του στυλ.
>> Αυτό δεν πρόκειται να πει το στυλ δεν είναι σημαντικό, και εμείς θα το κηρύξουν πάνω
φορά τόσο στις διαλέξεις και στα τμήματα.
Style αναφέρεται στην αισθητική του κωδικού σας.
Έχετε επιλέξει καλά μεταβλητές με όνομα που είναι σύντομες, αλλά κάπως
περιγραφικό;
Είναι ο κωδικός σας εσοχή, όπως έχετε δει στην διάλεξη και κατά τρόπο συνεπή
με το ύφος 50;
>> Τέλος, είναι δικαίωμα σχεδίου εκεί στη μέση.
Το design είναι το δυσκολότερο να τεθεί ένα δάχτυλο στο γιατί είναι πολύ πιο
υποκειμενική.
Αλλά αυτό είναι ίσως το πιο σημαντικό από οι τρεις άξονες όσον αφορά στην παιδαγωγική
την πάροδο του χρόνου και ότι αυτό θα είναι ευκαιρία του υποτρόφου διδασκαλίας για
σας παρέχει ποιοτική ανατροφοδότηση.
Πράγματι, το CS50 ακόμα κι αν έχουμε αυτοί οι τύποι και τα σκορ, στο τέλος
της ημέρας αυτά είναι πολύ σκόπιμα πολύ μικρές κουβάδες - τιμές σημείου
μεταξύ μηδέν και τριών και μηδέν και πέντε.
Εμείς δεν θέλουμε να βγάλουμε πολύ χοντρό γραμμές μεταξύ των σετ πρόβλημα ή μεταξύ
φοιτητές, αλλά μάλλον να επικεντρωθεί όσο μπορούμε σε ποιοτικά, χειρόγραφος
ανατροφοδότηση, είτε δακτυλογραφημένα ή λεκτικά από ιδιαίτερα τους συναδέλφους σας διδασκαλίας,
θα πάρετε για να γνωρίζουμε αρκετά καλά.
>> Αλλά σε γενικές γραμμές, αυτά είναι τα βάρη ότι οι διάφορες άξονες θα έχουν.
Εν τω μεταξύ, επίσης, αξίζει να τη διατήρηση σε νου ότι δεν πρέπει να υποθέσουμε ότι ένα
τρία από τα πέντε είναι 60% και δηλαδή χονδρικά αποτυχία.
Τρεις είναι σκόπιμα προορίζεται να είναι είδος μέση του δρόμου καλό.
Εάν παίρνετε τριάρια σε η αρχή του εξαμήνου, που είναι
Πράγματι προορίζεται να είναι ένας καλός μέρος για να ξεκινήσετε.
Εάν παίρνετε δυάρια, εκθέσεις, υπάρχει σίγουρα κάποια δουλειά για να πληρώσει ένα μικρό
μεγαλύτερη προσοχή, για να επωφεληθούν των τμημάτων και των ωρών γραφείου.
>> Εάν παίρνετε τέσσερα και πεντάρια, μεγάλη.
Αλλά πραγματικά, ελπίζουμε να δούμε τροχιές μεταξύ των μαθητών - πολύ
εξατομικευμένη ανά φοιτητή, αλλά ξεκινώντας το εξάμηνο εδώ σε ένα είδος
οι δύο στη σειρά τρεις, αλλά τελειώνει εδώ στην περιοχή πέντε παρα τέσσερα.
Γι 'αυτό είμαστε πραγματικά ψάχνουν.
Και εμείς να έχετε κατά νου ότι το δέλτα που παρουσιάζουν μεταξύ μηδέν εβδομάδα και την εβδομάδα
12 όταν κάνω βαθμούς.
Δεν έχει σημασία για μας είναι απολύτως πώς Σας δίκαιη από την αρχή αν σας
τροχιά είναι πράγματι προς τα πάνω και ισχυρή.
>> Ακαδημαϊκή Δεοντολογία - οπότε επιτρέψτε μου να θέσει σε μου πιο σοβαρή φωνή μόνο για μια στιγμή.
Έτσι, αυτό το μάθημα έχει τη διάκριση της στέλνοντας περισσότερους φοιτητές από οποιοδήποτε άλλο
στην ιστορία του σκάφους διαφήμιση, πιστεύω.
Έχουμε είδος χάσει τον λογαριασμό σε αυτή σημείο από το πόσο συχνά συμβαίνει αυτό.
Και αυτό δεν είναι επειδή οι μαθητές σε 50 είναι πια ανέντιμο από τους
συμμαθητές αλλού.
Αλλά συνειδητοποιούν, επίσης, ότι είμαστε πολύ καλοί στην ανίχνευση αυτό το είδος του πράγματος.
>> Και αυτό είναι το πλεονέκτημα ότι υπολογιστής τάξη της επιστήμης έχει να μπορέσουμε
μπορεί και να μην συγκρίνετε όλους τους μαθητές πρόβλημα που θέτει ζεύγη έναντι κάθε
άλλα, όχι μόνο φέτος αλλά όλα τα προηγούμενα έτη.
Έχουμε τη δυνατότητα, όπως τους φοιτητές σε η τάξη, στο Google και να βρείτε τον κώδικα
σε ιστοσελίδες όπως το GitHub και φόρουμ συζητήσεων.
Δεν υπάρχει απολύτως λύσεις για το CS50 p-θέτει επιπλέουν γύρω από εκεί.
Αλλά αν μπορείτε να τους βρείτε, μπορούμε να τα βρούμε.
Και όλα αυτά είναι πολύ αυτοματοποιημένη και εύκολη και λυπηρό για μας να βρούμε.
>> Αλλά θέλω να τονίσω, επίσης, ότι η ακαδημαϊκή πολιτική ειλικρίνεια μαθήματος είναι
πολύ προορίζεται να είναι πολύ το αντίθετο από αυτό το πνεύμα.
Μάλιστα, φέτος έχουμε επαναδιατυπωθεί πράγματα στην εξεταστέα ύλη να είναι αυτό, τελεία
dot dot, με περισσότερες λεπτομέρειες στην εξεταστέα ύλη.
Αλλά το σημαντικό θέμα κατά τη διάρκεια είναι πραγματικά να είναι λογικό.
Αναγνωρίζουμε ότι υπάρχει μια σημαντική ποσό των παιδαγωγικών
αξία στη συνεργασία, σε κάποιο βαθμό, με τους συμμαθητές, σύμφωνα με την οποία θα
δύο ή τρία ή σας περισσότερο είναι στέκεται σε ένα λευκό του σκάφους
βαθύτερων εννοιών, έτσι ώστε να μιλούν, τις ιδέες σας -
εγγράφως από pseudocode σε εικόνες, διαγραμμάτων τι πρέπει Mario είναι, αν
θα ήταν να γράψει το πρώτο σε ψευδοκώδικα.
Τι θα πρέπει ο άπληστος αλγόριθμος -
πώς θα πρέπει να συμπεριφέρεται ανά θέτει ένα πρόβλημα;
>> Και να συνειδητοποιήσουν έτσι ώστε η συμπεριφορά να ενθαρρύνουμε είναι πολύ
πολλά προς αυτήν την κατεύθυνση.
Και στην εξεταστέα ύλη, θα δείτε ένα σωρό από σφαίρες κάτω από ένα
λογική κατηγορία και δεν είναι λογικό κατηγορία που μας βοηθά να βοηθήσουν
τυλίξτε το μυαλό σας γύρω από όπου εμείς αποσύρει την εν λόγω γραμμή.
Και σε γενικές γραμμές, ένα αξιοπρεπές κανόνας είναι ότι αν είστε αγωνίζονται να λύσει
κάποια bug και φίλο ή συμμαθητή σας κάθεται δίπλα σας, είναι
λογικό για σας να του δείξει ή της κωδικό σας και να πω, hey, μπορεί να σας βοηθήσει
Θέλω να καταλάβω τι συμβαίνει λάθος εδώ;
>> Εμείς συνήθως δεν αγκαλιάσει η αντίθετη πλευρά.
Δεν είναι μια σωστή απάντηση για σας φίλο ή συμμαθητή εδώ για να πω, OH,
απλά κοιτάξτε το δικό μου και το σχήμα έξω από αυτό.
Αυτό είναι το είδος των παράλογων.
Όμως, κάποιος άλλος, ένας άλλος εγκέφαλο, ένα άλλο ζευγάρι μάτια να δούμε
οθόνη ή το βλέμμα σας στο κωδικό σας και να πω, είσαι σίγουρος ότι θέλετε
να έχουν ένα βρόχο εδώ;
Ή είστε σίγουροι ότι θέλετε ότι η τελεία εδώ;
Ή ΟΗ, ότι το μήνυμα λάθους σημαίνει αυτό.
Αυτά είναι πολύ λογικές και ενθαρρύνονται συμπεριφορές.
>> Οι περιπτώσεις στις οποίες ήμουν υπαινίσσεται Νωρίτερα βράζει κάτω για να είναι όταν οι μαθητές
αργά το βράδυ κάνοντας κακή κρίση αποφάσεις και στέλνοντας τον κωδικό τους για να
κάποιον άλλο ή απλά λέγοντας, εδώ, είναι το Dropbox ή
Googling αργά το βράδυ.
Και γι 'αυτό θα ενθαρρύνει και ικετεύω, Αν έχετε αυτές τις αναπόφευκτες
στιγμές του άγχους, είστε πρόσκρουση μέχρι κατά τη λήξη της προθεσμίας, δεν έχετε καμία καθυστέρηση
ημέρα δεδομένου ότι είναι ήδη Παρασκευή στο ότι σημείο, email κεφάλι του μαθήματος ή
ο ίδιος άμεσα.
Ας πούμε, ακούστε, είμαι σε μου οριακό σημείο εδώ.
Ας ρίξουμε μια συνομιλία και να το καταλάβω.
Η προσφυγή στο διαδίκτυο ή κάποια άλλη δεν εύλογη συμπεριφορά δεν είναι η
λύση, και πάρα πολλοί από σας συμμαθητές δεν είναι πλέον εδώ
πανεπιστημιούπολη, λόγω της κακής κρίσης.
Αλλά είναι πολύ εύκολο να παρακάμψουν αυτή τη γραμμή.
>> Και εδώ είναι μια μικρή εικόνα για να φτιάξει το κέφι σας παραλάβει από το Reddit, έτσι ώστε τώρα
όλα θα είναι εντάξει.
>> Έτσι, μια γρήγορη ανακεφαλαίωση, στη συνέχεια, από όπου φύγαμε μακριά.
Έτσι, την περασμένη εβδομάδα, υπενθυμίζουν ότι εισάγουμε συνθήκες, όχι στο Scratch
αλλά σε C αυτή τη φορά.
Και υπήρξε κάποια νέα σύνταξη, αλλά Πραγματικά δεν υπάρχουν νέες ιδέες per se.
Είχαμε Boolean εκφράσεις που θα μπορούσαμε να ή μαζί με δύο κάθετες
ράβδων ή και μαζί με δύο συμπλεκτικά σύμβολα, λέγοντας ότι τόσο το αριστερό
και το δικαίωμα αυτό πρέπει να είναι αλήθεια γι 'αυτό να εκτελέσει.
Τότε είχαμε διακόπτες, τα οποία εξετάσαμε σε λίγο, αλλά προτείνω είναι πραγματικά
απλά διαφορετική σύνταξη για την επίτευξη των ίδιο είδος του στόχου, εφόσον γνωρίζετε
εκ των προτέρων ποιες περιπτώσεις σας πρόκειται να είναι.
>> Κοιτάξαμε βρόχους.
Ένας βρόχος for είναι ίσως η πιο κοινή, ή τουλάχιστον το ένα που οι άνθρωποι
συνήθως φθάνουν για ενστικτωδώς.
Ακόμα κι αν φαίνεται λίγο αινιγματικό, θα δείτε πολλά, πολλά τέτοια παραδείγματα
πριν από καιρό, όπως έχετε ήδη στα τέλη της περασμένης εβδομάδας.
Ενώ οι βρόχοι μπορούν ομοίως επιτευχθεί το ίδιο πράγμα.
Αλλά αν θέλετε να κάνετε οποιαδήποτε προσαύξηση ή την ενημέρωση των
τιμές μεταβλητών, θα πρέπει να κάνει περισσότερα από ό, τι το χέρι του
για το βρόχο επιτρέπει πριν.
Και έπειτα υπάρχει το do-while loop, η οποία μας επιτρέπει να κάνουμε κάτι
τουλάχιστον μία φορά, ενώ κάτι άλλο είναι αλήθεια.
Και αυτό είναι ιδιαίτερα καλό για προγράμματα ή για τα παιχνίδια που θέλετε
να ζητήσει από το χρήστη για κάτι τουλάχιστον μία φορά.
Και τότε, αν αυτός ή αυτή δεν συνεργάζεται, ίσως να θέλετε να το κάνετε
ξανά και ξανά.
>> Με μεταβλητές, εν τω μεταξύ, είχαμε γραμμές του κώδικα, όπως αυτό, που θα μπορούσε
είναι δύο γραμμές.
Θα μπορούσε να κηρύξει μια ονομάζεται int μετρητή, τελεία.
Ή μπορείτε απλά να δηλώσει και ορίσετε, να το πω έτσι.
Δώστε την τιμή την ίδια στιγμή.
>> Και στη συνέχεια, τέλος, μιλήσαμε σχετικά με τις λειτουργίες.
Και αυτό ήταν ένα ωραίο παράδειγμα με την έννοια ότι καταδεικνύει
τα δύο είδη λειτουργιών.
Το ένα είναι GetString (), η οποία, και πάλι, παίρνει μια συμβολοσειρά από το χρήστη.
Αλλά GetString () είναι είδος ενδιαφέρον, μέτρο που έχουμε χρησιμοποιήσει,
επειδή έχουμε χρησιμοποιήσει πάντα με κάτι στην αριστερή πλευρά της ένα
ίσον.
Δηλαδή ότι GetString () επιστρέφει μια τιμή.
Επιστρέφει, φυσικά, ένα string.
Και στη συνέχεια, στην αριστερή πλευρά, είμαστε απλά εξοικονόμηση αυτής της συμβολοσειράς μέσα σε μια
μεταβλητή που ονομάζεται όνομα.
>> Αυτό είναι διαφορετικό, κατά μία έννοια, από τις printf γιατί printf, τουλάχιστον σε μας
χρήση εδώ, δεν επιστρέφει τίποτα.
Ως μέρος, κάνει κάτι επιστροφής.
Εμείς απλά δεν με νοιάζει τι είναι.
Αλλά δεν έχει ό, τι είναι ονομάζεται παρενέργεια.
Και ποια είναι η παρενέργεια σε κάθε περίπτωση που έχουμε δει μέχρι τώρα;
Τι σημαίνει printf κάνει;
Τυπώνει κάτι στην οθόνη, Εμφανίζει κείμενο ή αριθμούς ή κάτι
στην οθόνη.
Και αυτό είναι μόνο θεωρείται μια παρενέργεια διότι δεν είναι πραγματικά παράδοση
είναι πίσω σε μένα.
Δεν είναι μια απάντηση στο εσωτερικό της ένα μαύρο κουτί που μπορεί στη συνέχεια
φθάνει και να αρπάξει.
Είναι κάνει μόνο για τη δική, πολύ της όπως Colton ήταν συνδεδεμένο σε αυτό
μαύρο κουτί περασμένη εβδομάδα, και με κάποιο τρόπο μαγικά ζωγράφιζε στον πίνακα
χωρίς εμένα πραγματικά εμπλέκονται.
Αυτό θα μπορούσε να είναι μια παρενέργεια.
Αλλά αν πραγματικά έπρεπε να φτάσει πίσω στο εδώ και να πω, OH, εδώ είναι το string
από τον χρήστη, που θα είναι μια τιμή επιστροφής.
>> Και μέχρι τώρα έχουμε χρησιμοποιήσει μόνο λειτουργίες ότι οι άλλοι άνθρωποι έχουν γράψει.
Αλλά μπορούμε να κάνουμε πραγματικότητα αυτά τα είδη των πραγμάτων τους εαυτούς μας.
Έτσι, Πάω να πάει στην CS50 συσκευή ξανά.
Επιτρέψτε μου να κλείσω την καρτέλα που είχε ανοίξει πριν από λίγο.
Και επιτρέψτε μου να πάω μπροστά και δημιουργήσετε ένα νέο αρχείο.
Και Πάω να προχωρήσει και καλέσετε αυτό το ένα positive.c.
Γι 'αυτό θέλω να κάνω κάτι με θετικούς αριθμούς εδώ.
Έτσι, Πάω να πάει μπροστά και να κάνουμε int -
sorry -
# Include.
Ας μην κάνουμε το ίδιο λάθος, όπως πριν.
Int main (void), σγουρή τιράντες, έκλεισε άγκιστρο.
>> Και τώρα θέλω να κάνω το εξής.
Θέλω να γράψω ένα πρόγραμμα που επιμένει ότι ο χρήστης δίνει
μένα ένας θετικός ακέραιος.
Έτσι, δεν υπάρχει GetPositiveInt λειτουργία στη βιβλιοθήκη CS50.
Υπάρχει μόνο GetInt ().
Αλλά αυτό είναι εντάξει, γιατί έχω την κατασκευές με τις οποίες μπορεί να επιβάλλει μια
λίγο περισσότερη πίεση στην τιμή αυτή.
Θα μπορούσα να κάνω κάτι τέτοιο.
>> Έτσι, int n -
και αν είστε πληκτρολογώντας μαζί, μόλις συνειδητοποιήσουν Πάω να πάει πίσω και να
αλλάξουν κάποια πράγματα σε μια στιγμή -
τόσο int n ισούται GetInt ().
Και αυτό πρόκειται να τεθεί ένας int εσωτερικό του n.
Και επιτρέψτε μου να είναι πιο περιγραφικό.
Επιτρέψτε μου να πω κάτι σαν απαιτώ μπορείτε να μου δώσετε ένα θετικό ακέραιο.
>> Εντάξει.
Έτσι, μόνο ένα μικρό κομμάτι των οδηγιών.
Και τώρα τι μπορώ να κάνω;
Λοιπόν, ξέρω ήδη από την απλή μου συνθήκες ή υποκαταστημάτων, όπως ακριβώς
είχε στο Scratch, θα μπορούσα να πω κάτι όπως και αν το n είναι μικρότερο από ή ίσο με
μηδέν, τότε θέλω να κάνω κάτι αρέσει, αυτό δεν είναι θετικό.
Και τότε θα μπορούσα να κάνω -
Εντάξει, αλλά θέλω πραγματικά να πάρει το int.
Γι 'αυτό και θα μπορούσε να φτάσει μέχρι εδώ και θα μπορούσα είδος του αντιγράφου αυτού και παύλα αυτό.
Και στη συνέχεια, στο OK.
Έτσι, αν η είναι μικρότερη ή ίσο με το μηδέν το κάνει αυτό.
>> Τώρα, τι θα γίνει αν ο χρήστης δεν συνεργάζονται;
Λοιπόν, τότε Πάω να δανειστώ αυτό εδώ.
Και στη συνέχεια να πάω εδώ και εδώ και εδώ.
Έτσι, αυτό είναι σαφές ότι δεν η λύση, έτσι δεν είναι;
Επειδή δεν υπάρχει κανένα τέλος στη θέα.
Αν θέλω να απαιτήσει ότι ο χρήστης δίνει μένα ένας θετικός ακέραιος, μπορώ
πραγματικά να πάρει το int.
Θα μπορείτε να ελέγξετε για το int.
Στη συνέχεια, όμως θέλω να το ελέγξουμε ξανά και ελέγξτε ξανά και ελέγξτε ξανά.
Έτσι, προφανώς, ποια είναι η καλύτερη κατασκευή να χρησιμοποιούν εδώ;
Εντάξει, έτσι κάποιο είδος βρόχου.
>> Έτσι, Πάω να ξεφορτωθεί σχεδόν όλα αυτά.
Και θέλω να πάρω αυτό int τουλάχιστον μία φορά.
Έτσι, Πάω να πω κάνουμε -
και εγώ θα επανέλθω στο ενώ σε μια στιγμή -
τώρα, να κάνει τι;
Πάω να κάνω int n παίρνει GetInt ().
OK.
Έτσι ώστε να είναι αρκετά καλό.
Και τώρα, πόσο συχνά κάνουν Θέλω να το κάνω αυτό;
>> Επιτρέψτε μου να θέσω την printf στο εσωτερικό του βρόχου ώστε να μπορώ να απαιτήσουμε ξανά και ξανά,
αν παραστεί ανάγκη.
Και τι θέλω αυτό ενώ η κατάσταση να κάνουμε;
Θέλω να συνεχίσω να το κάνω αυτό ενώ ό, τι συμβαίνει;
Ναι.
Ν είναι μικρότερη ή ίση με το μηδέν.
Έτσι, ήδη, έχουμε σημαντικά καθαρίζονται αυτόν τον κώδικα επάνω.
Έχουμε δανειστεί μια πολύ απλή κατασκευή - το do-while loop.
Έχω κλέψει μόνο τις σημαντικές γραμμές του κώδικα που άρχισα αντιγραφή και
επικόλληση, η οποία δεν ήταν σοφό.
Και έτσι τώρα είμαι πρόκειται πραγματικά να επικολλήσετε αυτό εδώ και μόλις το κάνει μία φορά.
>> Και τώρα τι θέλω να κάνω στο το τέλος αυτού του προγράμματος;
Θα πω μόνο κάτι απλό αρέσει, ευχαριστώ για την - και
Θα κάνω% i για int -
backslash n, κόμμα, και στη συνέχεια συνδέστε το n, το ερωτηματικό.
>> Εντάξει.
Ας δούμε λοιπόν τι συμβαίνει τώρα όταν τρέχω αυτό το πρόγραμμα.
Πάω να προχωρήσει και κάνουν θετικά.
Ανάθεμα.
Λίγα λάθη.
Έτσι, επιτρέψτε μου να μετακινηθείτε προς τα πίσω μέχρι το πρώτο.
Μην εργάζεστε μέσω αυτών προς τα πίσω.
Εργασία μέσα από τους από πάνω προς τα κάτω μήπως καταρράκτη και μόνο
ένα πράγμα είναι λάθος.
Σιωπηρή δήλωση GetInt λειτουργία ().
Ναι.
Γι 'αυτό δεν ήταν αρκετό.
Ι το είδος έκανε το ίδιο λάθος, αλλά λίγο διαφορετικά αυτή τη φορά.
Εγώ δεν χρειάζεται να περιλαμβάνει μόνο stdio.h, αλλά cs50.h επίσης, η οποία περιλαμβάνει το
λεγόμενα δηλώσεις πάρει int, η οποία διδάσκουν τη συσκευή, ή διδάσκει
C τι GetInt () είναι.
>> Έτσι, επιτρέψτε μου να αποθηκεύσετε ξανά.
Πάω να αγνοήσει τα άλλα λάθη επειδή είμαι πρόκειται να ελπίζω ότι είναι
κατά κάποιον τρόπο σχετίζονται με το σφάλμα Έχω ήδη καθοριστεί.
Έτσι, επιτρέψτε μου να πάει μπροστά και να μεταγλωττίσετε ξανά με κάνουν θετικές, Enter.
Ανάθεμα.
Τρία λάθη, ακόμα.
Επιτρέψτε μου να μετακινηθείτε προς τα επάνω με το πρώτο.
Αχρησιμοποίητα μεταβλητή n.
Δεν έχω ξαναδεί αυτό.
Και αυτό, επίσης, είναι λίγο αινιγματικό.
Αυτή είναι η έξοδος του compiler.
Και τι επισημασμένη γραμμή εκεί - positive.c :9:13 -
λέει, να λέει στη γραμμή εννέα από positive.c, κατά την 13η χαρακτήρα,
13η στήλη, θα κάνει αυτό το λάθος.
>> Και ειδικότερα, είναι λέει μου αχρησιμοποίητα μεταβλητή n.
Έτσι, ας δούμε -
line εννέα.
Είμαι χρησιμοποιώντας n υπό την έννοια ότι Είμαι δίνοντας μια τιμή.
Αλλά αυτό που ο compiler δεν αρέσει είναι ότι δεν είμαι το χρησιμοποιεί φαινομενικά.
Αλλά περιμένετε ένα λεπτό, είμαι το χρησιμοποιεί.
Στη γραμμή 11, είμαι το χρησιμοποιεί εδώ.
Αλλά αν μετακινηθείτε προς τα κάτω περαιτέρω στο positive.c :11 -
έτσι στη γραμμή 11, 12 χαρακτήρων, η compiler μου λέει, η χρήση των
αδήλωτης αναγνωριστικό n.
>> Έτσι αδήλωτης σημαίνει ότι έχω δεν προσδιορίζεται ως ένα
μεταβλητή με έναν τύπο δεδομένων.
Αλλά περιμένετε ένα λεπτό.
Έκανα ακριβώς ότι, σύμφωνα εννέα.
Έτσι κάποιος είναι πραγματικά σύγχυση εδώ.
Είναι είτε εγώ ή ο compiler, διότι σύμφωνα εννέα, και πάλι, είμαι κηρύσσει την
int n, και είμαι αναθέσουν την επιστρέψει την αξία της GetInt ().
Τότε είμαι χρησιμοποιώντας αυτή τη μεταβλητή n σύμφωνη 11 και να ελέγξετε αν η αξία του είναι μικρότερη
από ή ίση με το μηδέν.
Αλλά αυτό είναι προφανώς κακό και σπασμένα γιατί;
Πες το ξανά;
>> Αχ, έχω να δηλώσω n πριν την είσοδο του βρόχου.
Αλλά γιατί;
Θέλω να πω, απλά πρότεινε λίγο πριν, ότι Είναι ωραία να δηλώσει μεταβλητές
όλα σε μια γραμμή και στη συνέχεια τους εκχωρήσετε κάποια αξία.
Μια παγκόσμια μεταβλητή - ας επανέλθουμε σε αυτή την ιδέα σε μια στιγμή.
Γιατί θες να θέσει είναι έξω από το βρόχο;
Είναι.
Ακριβώς.
>> Έτσι, αν και, κάπως αντιφατικό, επιτρέψτε μου να συνοψίσω.
Όταν δηλώνετε n μέσα του do μπλοκ εκεί -
ειδικά μέσα τα άγκιστρα -
ότι η μεταβλητή n έχει ό, τι είναι ονομάζεται πεδίο εφαρμογής -
άσχετα με το σύστημα βαθμολόγησης μας στο Φυσικά - αλλά έχει ένα πεδίο που είναι
περιορίζεται στις αγκύλες.
Με άλλα λόγια, συνήθως αν δηλώνουν μια μεταβλητή μέσα σε ένα σύνολο
άγκιστρα, ότι η μεταβλητή υπάρχει μόνο μέσα από τις αγκύλες.
Έτσι, με αυτή τη λογική και μόνο, ακόμη και αν Έχω δηλώσει n στη γραμμή εννέα, το
ουσιαστικά εξαφανίζεται από το πεδίο εφαρμογής, εξαφανίζεται από τη μνήμη, να το πω έτσι,
από τη στιγμή που χτύπησα γραμμή 11.
Επειδή η γραμμή 11, δυστυχώς, είναι έξω από αυτές τις αγκύλες.
>> Έτσι, δυστυχώς δεν μπορώ να το διορθώσετε αυτό πηγαίνει πίσω σε ό, τι έκανα πριν.
Ίσως στην αρχή να το κάνετε αυτό.
Αλλά τι είσαι τώρα δεν κάνει κυκλικά;
Είσαι προφανώς δεν πάρει το int κυκλικά.
Έτσι, μπορούμε να αφήσουμε το GetInt (), και θα πρέπει να αφήσει το GetInt () στο εσωτερικό του
βρόχο, διότι αυτό είναι που θέλουμε να ταλαιπωρούν το χρήστη για ξανά και ξανά.
Αλλά αυτό δεν αρκεί για να πάει μέχρι γραμμή, ας πούμε, έξι.
Int n, τελεία.
Μην δώσετε την τιμή ακόμα γιατί δεν χρειάζεται να ακριβώς ακόμα.
>> Αλλά τώρα εδώ κάτω, σημειώστε - αυτό Θα είναι ένα πολύ εύκολο λάθος.
Δεν θέλω να σκιά προηγούμενο μου δήλωση του n.
Θέλω να χρησιμοποιήσω το n που υπάρχει στην πραγματικότητα.
Και έτσι τώρα στη γραμμή 10, Ορίζω n μια τιμή.
Αλλά στη γραμμή έξι, δηλώνω n.
Και έτσι μπορώ ή δεν μπορώ χρησιμοποιήσετε στη γραμμή 12 τώρα;
Δεν μπορώ, διότι, μεταξύ των οποίων σγουρά τιράντες είναι n δηλωθεί τώρα;
Το ένα εδώ πάνω στη γραμμή πέντε.
Σε ένα εδώ στη γραμμή 14.
Έτσι, αν τώρα σε σμίκρυνση, αποθηκεύστε το αρχείο, πηγαίνετε πίσω και να τρέξει σε κάνουν θετικές αυτό,
καταρτίζονται αυτή τη φορά.
Έτσι, αυτό είναι ήδη σημειώσει πρόοδο.
Slash. . / Θετική, Enter.
>> Απαιτώ να μου δώσεις ένας θετικός ακέραιος.
Αρνητικό 1.
Αρνητικό 2.
Αρνητική 3.
Μηδέν.
One.
Και ευχαριστώ για το ένα είναι τι τυπώνονται τώρα.
>> Επιτρέψτε μου να δοκιμάσουμε κάτι άλλο, από περιέργεια.
Μου λένε να εισάγετε έναν ακέραιο.
Αλλά τι εάν αντί να πληκτρολογήσετε το αρνί;
Έτσι μπορείτε τώρα να δείτε μια διαφορετική εντολών -
επανάληψης.
Αλλά πουθενά στον κώδικά μου έγραψα ξανά.
Έτσι, όταν, προφανώς, είναι αυτό ξανά εντολών που προέρχονται από, θα λέγατε;
Ναι, από GetInt () η ίδια.
Έτσι, ένα από τα πράγματα του προσωπικού CS50 της κάνει για σας, τουλάχιστον σε αυτές τις πρώτες
εβδομάδες, το έχουμε γράψει κάποιο ποσό σφάλματος ελέγχου για να εξασφαλιστεί ότι, αν
σας καλούν GetInt (), θα πρέπει τουλάχιστον να πάρει πίσω ένα int από το χρήστη.
Δεν θα πάρετε ένα string.
Δεν θα πάρετε μια χαρα.
Δεν θα πάρει κάτι εντελώς διαφορετικό.
Θα πάρετε μια int.
>> Τώρα, μπορεί να μην είναι θετική.
Δεν μπορεί να είναι αρνητική.
Δεν μπορούμε να εγγυηθούμε γύρω από αυτό.
Αλλά θα ταλαιπωρούν το χρήστη να ξαναδοκιμάσετε, ξανά, επαναλάβετε έως ότου αυτός ή αυτή πραγματικά
συνεργάζεται.
Ομοίως, αν το κάνω 1.23, αυτό δεν είναι ένα int.
Αλλά αν έχετε πληκτρολογήσει, ας πούμε, 50, ότι μου δίνει μια τιμή που ήθελα.
>> Εντάξει.
Έτσι, δεν είναι κακό.
Οποιεσδήποτε ερωτήσεις σχετικά με αυτό που μόλις κάνατε;
Το βασικό πακέτο είναι, να είναι σαφής, δεν τόσο ο βρόχος, που έχουμε δει
πριν ακόμα κι αν δεν έχουν πραγματικά χρησιμοποιείται, αλλά το ζήτημα του πεδίου εφαρμογής, όπου
μεταβλητών μπορεί μόνο να μπορεί να χρησιμοποιηθεί μόνο μέσα σε κάποιο συγκεκριμένο πεδίο.
>> Εντάξει, επιτρέψτε μου να αντιμετωπίσει την πρόταση κάνατε προηγουμένως, ότι από το
global μεταβλητή.
Ως μέρος, αποδεικνύεται ότι μια άλλη λύση σε αυτό το πρόβλημα, αλλά
συνήθως μια λανθασμένη λύση ή μια κακώς σχεδιασμένη λύση, είναι να
δηλώνετε μια μεταβλητή σας και τι είναι ονομάζεται μια καθολική μεταβλητή.
Τώρα είμαι το είδος της παραβίασης ορισμό μου του πεδίου εφαρμογής, επειδή υπάρχουν
δεν άγκιστρα στην κορυφή και το κάτω μέρος ενός αρχείου.
Όμως, η επίπτωση του ότι είναι ότι τώρα στη γραμμή τέσσερα,
η είναι μια παγκόσμια μεταβλητή.
Και όπως υποδηλώνει το όνομα, είναι μόνο πρόσβαση παντού.
>> Scratch έχει πραγματικά αυτές.
Εάν χρησιμοποιηθεί μια μεταβλητή, μπορείτε να ανακαλέσετε είχατε να επιλέξετε αν είναι για
αυτή sprite ή για όλα τα ξωτικά.
Λοιπόν, όλα τα ξωτικά είναι μόνο η σαφέστερη τρόπος για να πούμε παγκόσμια.
Ναι;
Αχ, πολύ καλή ερώτηση.
>> Έτσι υπενθυμίσουμε ότι στην πρώτη έκδοση του κωδικού μου, όταν εσφαλμένα
δηλώνεται και ορίζεται n στη γραμμή εννέα -
Μου δηλωθεί ως μια μεταβλητή και μου έδωσε μια τιμή με
ο φορέας ανάθεσης -
Αυτό μου έδωσε δύο λάθη.
Ένα, το γεγονός ότι το η δεν χρησιμοποιήθηκε, και δύο, ότι στην γραμμή 11
απλά δεν έχουν δηλωθεί.
Έτσι, το πρώτο δεν το έκανα διεύθυνση κατά τη χρονική στιγμή.
Δεν είναι απολύτως λάθος να δηλώσει μια μεταβλητή, αλλά δεν το χρησιμοποιούν.
Αλλά ένα από τα πράγματα που έχουμε κάνει η CS50 συσκευή, σκόπιμα,
παιδαγωγικά, είναι ότι έχουμε αύξησαν το προσδοκίες του compiler να κάνει
είστε σίγουροι ότι θα κάνουμε τα πράγματα όχι μόνο σωστά, αλλά πραγματικά σωστά.
>> Διότι, αν είστε με την οποία μια μεταβλητή όπως n και ποτέ δεν το χρησιμοποιούν, ή για τη χρήση
σωστά, τότε τι κάνει εκεί;
Δεν εξυπηρετεί πραγματικά κανένα σκοπό.
Και είναι πολύ εύκολο το πέρασμα του χρόνου, αν δεν ρυθμίσετε τον υπολογιστή σας στην
Με αυτό τον τρόπο, να έχει ακριβώς κώδικα που έχει λίγα απομεινάρια εδώ, απομεινάρια εκεί.
Και τότε μήνες αργότερα θα κοιτάξουμε πίσω και να είστε όπως, γιατί είναι αυτή η γραμμή της
κώδικα;
Και αν δεν υπάρχει σοβαρός λόγος, να δεν σας ωφελήσει ή τους συναδέλφους σας
κάτω από το δρόμο για να σκοντάψει τότε.
>> Παρεμπιπτόντως, όπου είναι που προέρχονται από;
Λοιπόν, θυμάστε ότι κάθε φορά που συγκεντρώνουν πρόγραμμα, όλα αυτά τα πράγματα είναι
που εκτυπώνεται.
Γι 'αυτό και θα επανέλθουμε σε αυτό.
Αλλά και πάλι, να είναι ένα βοηθητικό πρόγραμμα που αυτοματοποιεί τη διαδικασία της κατάρτισης από
τρέχει την πραγματική compiler ονομάζεται κλαγγή.
Αυτό το πράγμα, θα δουν τελικά, έχει να κάνει με τον εντοπισμό σφαλμάτων με ειδική
πρόγραμμα που ονομάζεται το πρόγραμμα εντοπισμού σφαλμάτων.
Αυτό έχει να κάνει με τη βελτιστοποίηση της κώδικα - περισσότερα για αυτό στο μέλλον.
Std = c99 -
Αυτό σημαίνει απλά χρησιμοποιήστε την έκδοση του 1999 του C. C είναι γύρω ακόμα περισσότερο από
αυτό, αλλά έκαναν κάποια ωραία αλλαγές 10 και πλέον χρόνια πριν.
>> Και εδώ είναι τα σημαντικά από αυτά.
Αυτό που λέμε είναι να κάνει κάτι που προηγουμένως θα ήταν μια προειδοποίηση
Παρουσιάστηκε σφάλμα κατά την πρόληψη του φοιτητή από την κατάρτιση.
Και τοίχο μέσα το κάνουμε αυτό για ένα σωρό πράγματα, δεν
σχετίζεται μόνο με τις μεταβλητές.
Και τότε επιτρέψτε μου να μετακινηθείτε στο το τέλος αυτής της γραμμής.
Και αυτό, επίσης, ότι θα τελικά επανέλθω.
Αυτό είναι προφανώς το όνομα το αρχείο είμαι κατάρτιση.
Αυτό υπενθυμίζει το όνομα του αρχείου Είμαι έξοδο, όπως το όνομα
του εκτελέσιμη μου πρόγραμμα.
Αυτό-lcs50 σημαίνει απλά χρησιμοποιήστε το CS50 βιβλιοθήκη, και οποιαδήποτε μηδενικά και αυτά που
το προσωπικό που έγραψε και καταρτίζονται νωρίτερα αυτό το έτος, την ενσωμάτωση
τους στο πρόγραμμα μου.
>> Και ο καθένας ξέρει τι-lm είναι;
Είναι η βιβλιοθήκη μαθηματικά, το οποίο είναι ακριβώς εκεί ακόμα κι αν είστε
δεν κάνει καμία μαθηματικά.
Είναι ακριβώς αυτομάτως για να μας κάνουν.
>> Λοιπόν, επιτρέψτε μου να κάνω ένα άλλο παράδειγμα εδώ με το άνοιγμα ενός νέου αρχείου.
Και επιτρέψτε μου να αποθηκεύσετε αυτό το ένα ως string.c.
Αποδεικνύεται ότι, όπως μιλάμε για τα δεδομένα τύποι και σήμερα, υπάρχει ακόμα πιο
συμβαίνει κάτω από την κουκούλα ό, τι έχουμε δει μέχρι στιγμής.
Έτσι, επιτρέψτε μου να κάνω γρήγορα ένα γρήγορο πρόγραμμα.
Συμπεριλάβετε stdio.h.
Και εγώ θα σώσει αυτό.
Και ξέρετε, επιτρέψτε μου να μην κάνει το ίδιο λάθος ξανά και ξανά.
Συμπεριλάβετε cs50.h.
Και επιτρέψτε μου να προχωρήσει τώρα και να κάνουμε int main (void).
>> Και τώρα θέλω απλώς να κάνω ένα πρόγραμμα που το κάνει αυτό - να αναγνωρίσει μια σειρά
ονομάζεται s και να πάρετε μια σειρά από το χρήστη.
Και επιτρέψτε μου να κάνω μια μικρή οδηγίες εδώ -
παρακαλώ να μου δώσει μια σειρά - έτσι ο χρήστης ξέρει τι να κάνει.
Και τότε εδώ κάτω κάτω από αυτό, Θέλω να κάνω το εξής -
για int i παίρνει μηδέν.
Και πάλι, επιστήμονες της πληροφορικής τυπικά αρχίζουν να μετρούν από το μηδέν, αλλά θα μπορούσαμε να
κάνει ότι ένα αν πραγματικά ήθελε.
Τώρα πάω να κάνω εγώ είναι λιγότερο από το μήκος της συμβολοσειράς s.
Έτσι strlen -
S-Τ-Κ-Ε-Ε-Ν -
πάλι, είναι συνοπτική, επειδή είναι ευκολότερο να πληκτρολογήσετε, ακόμα κι αν είναι ένα
λίγο αινιγματικό.
>> Αυτή είναι μια λειτουργία που δεν έχετε χρησιμοποιήσει πριν, αλλά κυριολεκτικά το κάνει αυτό -
επιστρέψει σε μένα έναν αριθμό που αντιπροσωπεύει το μήκος της χορδής
ότι ο χρήστης πληκτρολογήσει.
Αν πληκτρολογήσει στο γειά σου, θα επιστρέψει πέντε, διότι υπάρχει πέντε
γράμματα γεια.
Στη συνέχεια, σε κάθε επανάληψη του Αυτός ο βρόχος, i συν συν.
Έτσι και πάλι, ένα πρότυπο κατασκευή, ακόμη και αν δεν είστε αρκετά ή πάρα πολύ άνετα
εξοικειωμένοι με αυτό ακόμα.
>> Αλλά τώρα σε κάθε επανάληψη του βρόχου αυτού, παρατηρήσετε τι Πάω να κάνουμε.
Θέλω να πάω μπροστά και να εκτυπώσετε από ένα μεμονωμένο χαρακτήρα -
οπότε% γ backslash n σε μια νέα γραμμή.
Και τότε, ξέρετε τι θέλω να κάνω;
Όποια και αν είναι ο λόγος είναι ότι ο χρήστης πληκτρολογεί σε, όπως γειά σου, θέλω να εκτυπώσετε
H-E-L-L-O, έναν χαρακτήρα ανά γραμμή.
Με άλλα λόγια, θέλω να πάρω το μεμονωμένους χαρακτήρες ενός string,
σύμφωνα με την οποία μέχρι τώρα ένα string έχει μόνο υπήρξε μια ακολουθία χαρακτήρων.
>> Και αποδεικνύεται ότι μπορώ να κάνω s, βραχίονα, i, κλείσιμο παρένθεσης, κλείστε
παρένθεση, τελεία.
Και έχω να κάνω κάτι άλλο.
Είναι σε ένα αρχείο που ονομάζεται string.h strlen ότι έχει δηλωθεί.
Έτσι, εάν θέλετε να χρησιμοποιήσετε τη λειτουργία αυτή, Πρέπει να σου πω τον compiler,
περιμένουμε να το χρησιμοποιήσετε.
Τώρα, επιτρέψτε μου να προχωρήσει και να κάνει Το πρόγραμμα ονομάζεται string.
Dot, slash, string.
>> Παρακαλώ δώστε μου ένα string.
Θα προχωρήσει και το είδος αυτό.
Γεια σας, σε όλα τα καλύμματα, Enter.
Και τώρα παρατηρήσετε έχω τυπωμένο αυτό ένα χαρακτήρα μετά την άλλη.
Έτσι, η νέα λεπτομέρεια εδώ είναι ότι μια σειρά, στο τέλος της ημέρας, μπορεί να είναι
προσεγγιστεί από τον τρόπο των ατομικών του χαρακτήρες με την εισαγωγή της πλατείας
σημειογραφία βραχίονα.
Και αυτό γιατί μια σειρά από κάτω Η κουκούλα είναι πράγματι μια ακολουθία
χαρακτήρων.
Αλλά τι είναι τακτοποιημένο γι 'αυτούς είναι στη μνήμη RAM του υπολογιστή σας -
Mac, PC, όποια κι αν είναι - είναι κυριολεκτικά πίσω στην πλάτη με πλάτη -
H-E-L-L-O -
σε ατομικό, δίπλα bytes στη μνήμη.
>> Έτσι, εάν θέλετε να πάρετε κατά την όγδοη όπως byte, η οποία σε αυτό το loop θα είναι
βραχίονα μηδέν, ένα στήριγμα, βραχίονα δύο, βραχίονα τρεις, τέσσερις βραχίονα -
Αυτό είναι μηδενικό δείκτη μέχρι πέντε -
που θα εκτυπώσετε H-Ε-Ε-Ε-Ο στη δική της γραμμή.
>> Τώρα, ως teaser, επιτρέψτε μου να σας δείξω το τα είδη των πραγμάτων που θα είναι τελικά
σε θέση να κατανοήσουν, τουλάχιστον με κάποια στενή αναζητούν.
Για το ένα, αυτό που περιλαμβάνεται στη σημερινή παραδείγματα, αν θέλετε, είναι στην πραγματικότητα
ένα από τα πρώτα jailbreaks για το iPhone.
Jailbreaking σημαίνει ράγισμα το τηλέφωνο ώστε να μπορείτε να χρησιμοποιήσετε πραγματικά για ένα
διαφορετικό φορέα ή εγκατάσταση το δικό σας λογισμικό.
Και θα παρατηρήσετε αυτό φαίνεται εντελώς αινιγματικό, το πιο πιθανό.
Αλλά κοιτάξτε αυτό.
Το iPhone ήταν προφανώς ραγισμένα με ένα for loop, μια κατάσταση αν, ένα άλλο
κατάσταση, μια δέσμη των λειτουργιών δεν έχουμε δει.
>> Και πάλι, δεν θα σε Εκ πρώτης όψεως ίσως
κατανοήσουμε πώς αυτό λειτουργεί.
Αλλά όλα αυτά που το είδος των λάβει δεδομένο στη σύγχρονη ζωή μας
στην πραγματικότητα τείνει να μειώσει ακόμα και σε κάποια από αυτές τις βασικές αρχές που έχουμε πάει
κοιτάζοντας.
Επιτρέψτε μου να προχωρήσει και να ανοίξει ένα άλλο πρόγραμμα, holloway.c.
Έτσι αυτό, επίσης, είναι κάτι που δεν θα πρέπει να ξέρει πραγματικά.
Ακόμη και κανένας από το προσωπικό ή θα μπορούσα πιθανώς να καταλάβω αυτό έξω από την εξέταση
γιατί αυτό ήταν κώδικα κάποιου η οποία υποβλήθηκε σε ό, τι είναι
ιστορικά γνωστή ως ασαφή C διαγωνισμό, όπου μπορείτε να γράψετε ένα πρόγραμμα
που συγκεντρώνει και τρέχει, αλλά είναι τόσο βλασφημία αινιγματικά κανένας άνθρωπος δεν μπορεί να καταλάβει τι
πρόκειται να κάνει μέχρι τρέχουν πραγματικά.
>> Έτσι, πράγματι, αν δείτε αυτό κώδικα, βλέπω ένα διακόπτη.
Βλέπω κύριο.
Βλέπω αυτές τις αγκύλες που συνεπάγονται κάποιο είδος ενός πίνακα.
Μήπως θέλει κανείς να μαντέψει τι αυτό το πρόγραμμα πραγματικότητα
κάνει αν τρέχω Holloway;
Ναι.
OK.
Μπράβο.
Έτσι, μόνο το προσωπικό και δεν μπορώ να καταλάβω τι κάνουν αυτά τα πράγματα.
>> Και τώρα, τέλος, επιτρέψτε μου να πάμε μπροστά και να ανοίξει ένα άλλο πρόγραμμα.
Αυτό και μόνο -
και πάλι, θα κάνουμε τον πηγαίο κώδικα διαθέσιμες στο διαδίκτυο - αυτό είναι ακριβώς
είδος αρκετά για να εξετάσει.
Το μόνο που έκαναν είναι να πατήσετε το χώρο μπαρ αρκετά.
Αλλά αυτό είναι πραγματικό κώδικα.
Έτσι, αν νομίζετε ότι είναι αρκετά, αν τρέχουν στην πραγματικότητα αυτό στην προτροπή,
τελικά θα δούμε πώς μπορούμε μπορεί να κάνει τα πράγματα όπως αυτό.
>> Έτσι, θα σας αφήσει σε αυτό το σημείωμα και θα δείτε την Τετάρτη.
>> [Παίζει μουσική]
>> ΟΜΙΛΗΤΗΣ 2: Στην επόμενη CS50, το TFS στάδιο μια ανταρσία.
>> ΟΜΙΛΗΤΗΣ 3: Εκεί είναι.
Πιάστε τον!
>> [Παίζει μουσική]