>> [ΜΟΥΣΙΚΗ ΠΑΙΖΟΝΤΑΣ]
DAVID J. MALAN: Εντάξει.
Αυτό είναι CS50, και αυτό είναι η αρχή των δύο εβδομάδων.
Ας ξεκινήσουμε λοιπόν σήμερα με ένα bug.
Ένα έντομο, φυσικά, είναι ένα λάθος σε ένα πρόγραμμα,
και θα πάρετε πολύ εξοικειωμένοι με την έννοια
αν δεν έχετε προγραμματίσει πριν. pset0 και τώρα pset1.
Αλλά ας αναλογιστούμε κάτι λίγο απλό στην αρχή.
Αυτό το πρόγραμμα εδώ ότι εγώ έριξε μαζί εκ των προτέρων,
και ισχυρίζονται ότι αυτό θα πρέπει να εκτυπώσετε 10 αστέρια στην οθόνη χρησιμοποιώντας printf,
αλλά αυτό είναι προφανώς προβληματικός κατά κάποιο τρόπο.
>> Δεδομένου ότι η προδιαγραφή ότι θα πρέπει να εκτυπώσετε 10 αστέρων,
αλλά αυτό δεν συμβαίνει προφανώς, τι θα ισχυρίζονται είναι το σφάλμα;
Ναι;
Έτσι είναι μια off από ένα λάθος, και τι εννοείτε με αυτό;
OK.
Εξαιρετική.
Έτσι έχουμε καθοριστεί μια ξεκινούν την τιμή μηδέν για i,
και έχουμε ορίσει ένα n αξία των 10, αλλά έχουμε χρησιμοποιήσει λιγότερο από ή ίσο με.
Και ο λόγος ότι αυτό είναι δύο χαρακτήρες και όχι μόνο ένα σύμβολο,
όπως σε ένα βιβλίο μαθηματικών, είναι ότι δεν έχετε
ένας τρόπος έκφρασης της ένα ισοδύναμο χαρακτήρα.
>> Έτσι, αυτό σημαίνει ότι λιγότερο από ό, τι, αλλά αν αρχίζουν να μετρούν από το μηδέν,
αλλά θα μετρήσει σε όλη τη διαδρομή up μέσα και ίσο με 10,
είστε φυσικά πρόκειται να μετράνε 11 πράγματα συνολικά.
Και έτσι θα πάμε για να εκτυπώσετε 11 αστέρων.
Λοιπόν, τι θα μπορούσε να είναι μια λύση για αυτό;
Ναι;
>> Έτσι, απλά ρυθμίστε το λιγότερο από ό, τι ή ίση με απλώς να είναι μικρότερο από,
και υπάρχει, αξιώνω, ίσως μια άλλη λύση, πάρα πολύ.
Τι θα μπορούσε άλλο να κάνεις;
Ναι;
>> Έτσι ξεκινούν ισούται με την τιμή σε 1, και εγκαταλείψουν το λιγότερο από ή ίσο με.
Και ειλικρινά θα μπορούσε να ισχυριστεί ότι, για ένα τυπικό άνθρωπο,
Αυτό είναι ίσως πιο απλή.
Ξεκινήστε μετρώντας 1 και μετρήσει μέχρι έως 10.
Ουσιαστικά κάνουμε ό, τι εννοείτε.
>> Αλλά η πραγματικότητα είναι σε προγραμματισμού, όπως έχουμε δει,
επιστήμονες και προγραμματιστές υπολογιστών γενικά αρχίζουν να μετρούν από το μηδέν.
Και αυτό είναι εντάξει μόλις μπορείτε να το συνηθίσεις.
Η κατάστασή σας θα είναι γενικά είναι κάτι σαν λιγότερο από ό, τι.
Έτσι απλά μια λογική λάθος που θα μπορούσαμε τώρα
καθορίσει και τελικά να μεταγλωττίσετε ξανά αυτό και να πάρει μόλις 10.
>> Λοιπόν τι θα λέγατε για αυτό το bug εδώ;
Εδώ, πάλι, εγώ ισχυρίζομαι ότι έχω ένας στόχος της εκτύπωσης 10 stars--
μία ανά γραμμή αυτή τη φορά, αλλά αυτό δεν γίνεται.
Πριν σας προτείνουμε ό, τι η λύση είναι, τι κάνει αυτή η
εκτύπωση οπτικά αν ήταν να συντάξει και να τρέξει αυτό το πρόγραμμα νομίζετε;
Ναι;
>> Star.
Έτσι, όλα τα αστέρια για το ίδια γραμμή είναι ό, τι άκουσα,
και στη συνέχεια το νέο χαρακτήρα γραμμής.
Οπότε ας προσπαθήσουμε αυτό.
Έτσι κάνουν λάθη-1, εισαγάγετε, και βλέπω την εντολή κλαγγή
ότι μιλήσαμε για τελευταία φορά.
./buggy-1, και μάλιστα βλέπω όλα τα 10 αστέρια στην ίδια γραμμή, ακόμη κι αν ισχυρίζονται
στις προδιαγραφές μου μόνο ένα σχόλιο κορυφή ο κώδικας που είχα την πρόθεση να κάνω μία ανά
γραμμή.
Αλλά αυτό φαίνεται σωστό.
>> Τώρα γραμμή 15 φαίνεται σαν να είμαι εκτύπωση ένα αστέρι, και στη συνέχεια της γραμμής 16
μοιάζει είμαι εκτύπωση ένας χαρακτήρας νέας γραμμής,
και είναι και οι δύο εσοχή έτσι Είμαι εσωτερικό του βρόχου με σαφήνεια.
Έτσι, δεν θα έπρεπε να κάνω αστέρι, νέα γραμμή, αστέρι, νέα γραμμή, αστέρι, νέα γραμμή;
Ναι;
>> Ναι, σε αντίθεση με μια γλώσσα, όπως Python, αν είστε εξοικειωμένοι,
οδόντωση δεν σημασία για τον υπολογιστή.
Έχει σημασία μόνο με την ανθρώπινη.
Έτσι, ενώ εδώ έχω εφεύρει γραμμές 15 και 16-- που είναι πανέμορφο,
αλλά ο υπολογιστής δεν με νοιάζει.
Ο υπολογιστής νοιάζεται για στην πραγματικότητα έχουν άγκιστρα
γύρω από αυτές τις γραμμές κώδικα.
>> Έτσι ώστε να είναι clear-- ακριβώς όπως στο Scratch-- ότι αυτές τις δύο γραμμές κώδικα
θα πρέπει να εκτελεστεί.
Όπως και ένα από αυτά τα κίτρινα Scratch παζλ κομμάτια ξανά και ξανά και ξανά.
>> Έτσι τώρα, αν μου εκτελέστε ξανά αυτό program-- ./buggy-2-- Χμ.
Έχω ένα λάθος τώρα.
Τι έκανε ξεχάσω να κάνω;
Ναι, γι 'αυτό δεν το υπολογίσουν.
Έτσι κάνουν λάθη-2.
Δεν υπάρχει τέτοιο αρχείο, επειδή δεν είχα στην πραγματικότητα συγκεντρώνουν τη δεύτερη εκδοχή.
Μέχρι τώρα ενδιαφέρον αδήλωτης δεν variable-- 2.
Κάνουμε 1.
Κάνετε λάθη-1-- ./buggy-1-- και τώρα το καθένα από αυτά είναι στην ίδια γραμμή.
>> Τώρα υπάρχει μια εξαίρεση για αυτή η υποτιθέμενη αξίωση μου
ότι θα πρέπει να έχετε αυτά τα άγκιστρα.
Όταν είναι στην πραγματικότητα OK-- αν έχετε παρατηρείται στο τμήμα ή textbooks--
για να παραλείψετε τα άγκιστρα;
Ναι;
>> Ακριβώς.
Όταν υπάρχει μόνο μία γραμμή κώδικα που εσείς
θέλει να συνδέεται με το βρόχο όπως και στο πρώτο μας παράδειγμα.
Είναι απολύτως θεμιτό για να παραλείψετε τα άγκιστρα
όπως ακριβώς το είδος της ευκολίας από τον compiler σας.
Ναι;
Καλή ερώτηση.
Θα ήταν να θεωρηθεί ως σφάλμα στυλ;
Θα promote-- όπως στο CS50 Οδηγός στυλ, το URL για το οποίο
είναι σε pset1-- ότι πάντα χρησιμοποιήστε τα άγκιστρα.
Βέβαια, αν είστε νέοι στον προγραμματισμό.
Η πραγματικότητα είναι ότι δεν είμαστε πρόκειται να σας απαγορεύσει
από το να κάνει αυτές τις ανέσεις.
Αλλά αν είστε απλά να πάρει στην ταλάντευση των πραγμάτων,
απολύτως απλά να χρησιμοποιείτε πάντα την σγουρά τιράντες μέχρι να το συνηθίσετε αυτό.
Καλή ερώτηση.
>> Εντάξει.
Έτσι ώστε, στη συνέχεια, ήταν ένα bug.
Τουλάχιστον σε κάτι αρκετά απλό.
Και όμως μπορείτε να σκεφτείτε αυτό είναι αρκετά υποτυπώδης, σωστά;
Αυτό είναι το είδος της πρώτης εβδομάδας της κοιτάζοντας τη γλώσσα
όπως, δείτε τα σφάλματα σας εκεί.
Αλλά η πραγματικότητα αυτά είναι πραγματικά αντιπροσωπευτικό
από μερικές αρκετά τρομακτικό προβλήματα ότι μπορούν να προκύψουν στον πραγματικό κόσμο.
>> Έτσι, κάποιοι από εσάς μπορεί να ανακαλέσετε αν ακολουθήσετε ειδήσεις τεχνολογίας,
ή ίσως ακόμη και αλιεύονται άνεμος από αυτό τον Φεβρουάριο
του περασμένου έτους ότι η Apple είχε έκανε ένα κομμάτι από ένα λάθος σε δύο iOS,
το λειτουργικό σύστημα για τα τηλέφωνά τους, καθώς επίσης και
Mac OS, το λειτουργικό σύστημα για επιτραπέζιους και φορητούς υπολογιστές τους.
Και είδατε τέτοια πρωτοσέλιδα όπως αυτό.
Και εν συνεχεία, η Apple υποσχέθηκε να διορθώσετε αυτό το σφάλμα,
και πολύ γρήγορα έκανε το διορθώσουμε στο iOS, αλλά στη συνέχεια, τελικά, αυτό που καθορίζεται στο Mac OS
καθώς και.
>> Τώρα κανένα από αυτά τα πρωτοσέλιδα και μόνο πραγματικά αποκαλύψει ποιο είναι το βασικό πρόβλημα ήταν,
αλλά το σφάλμα μειώθηκε εν τέλει σε ένα bug στο SSL, Secure Sockets Layer.
Και τα πολυλογώ, Αυτό είναι το λογισμικό
ότι τα προγράμματα περιήγησης μας και άλλα λογισμικό που χρησιμοποιείται για να κάνει τι;
>> Αν είπα ότι το SSL είναι συμμετέχουν, όποτε
επισκεφτείτε μια διεύθυνση URL που ξεκινά με HTTPS, τότε τι θα μπορούσε SSL να σχετίζεται με?
Κρυπτογράφηση.
Έτσι, θα μιλήσουμε για αυτό τις επόμενες ημέρες.
Κρυπτογράφηση, η τέχνη της κρυπτογράφησης πληροφοριών.
>> Αλλά τα πολυλογώ, η Apple κάποτε είχε κάνει ένα λάθος
στην εφαρμογή της SSL, το λογισμικού που υλοποιεί τελικά
URLs όπως το HTTPS ή max συνδέσεις εκεί.
Το αποτέλεσμα των οποίων είναι ότι σας συνδέσεις θα μπορούσαν δυνητικά
να υποκλαπούν.
Και ήταν οι διασυνδέσεις σου όχι απαραίτητα κρυπτογραφημένο
αν είχατε κάποια κακός στο μεταξύ εσείς και ο δικτυακός τόπος προορισμού που
ήξερε πώς να επωφεληθούν από αυτό.
>> Τώρα, η Apple τελικά δημοσιεύτηκε ένα διορθώσετε για αυτό το τέλος,
και η περιγραφή της fix τους ήταν αυτό.
Ασφαλής μεταφορά απέτυχε να επικυρώσει η αυθεντικότητα της σύνδεσης.
Το θέμα εξετάστηκε από αποκατάσταση της λείπει βήματα επικύρωσης.
>> Έτσι, αυτό είναι μια πολύ χέρι κυματιστό εξήγηση για να πούμε απλώς ότι έχουμε σκάτωσε.
Υπάρχει κυριολεκτικά ένα γραμμή κώδικα που ήταν buggy
στην εφαρμογή τους από SSL, και αν πάτε σε απευθείας σύνδεση και την αναζήτηση για αυτό
μπορείτε πραγματικά να βρείτε το αρχικό πηγαίο κώδικα.
Για παράδειγμα, αυτό είναι ένα στιγμιότυπο οθόνης του μόνο ένα τμήμα του ένα αρκετά μεγάλο αρχείο,
αλλά αυτό είναι μια συνάρτηση προφανώς ονομάζεται SSL επαληθεύσετε βασικό διακομιστή ανταλλαγής.
Και παίρνει ένα σωρό τα επιχειρήματα και τις εισροές.
Και εμείς δεν πρόκειται να επικεντρωθεί πάρα πολύ για λεπτομέρειας εκεί,
αλλά αν επικεντρωθεί σχετικά με τον κώδικα μέσα του εν λόγω ανώτατου function-- ας
ζουμ σε αυτό.
Μπορεί να υποπτεύεται ήδη αυτό το σφάλμα θα μπορούσε
είναι, ακόμη και αν δεν έχετε ιδέα τελικά αυτό που ψάχνετε σε.
Υπάρχει το είδος της ανωμαλίας εδώ, το οποίο είναι ό, τι;
>> Ναι, δεν μου αρέσει πραγματικά η εμφάνιση των δύο goto αποτύχει.
Ειλικρινά, δεν ξέρω πραγματικά τι goto αποτυγχάνουν μέσα, αλλά που έχει δύο από αυτούς
πλάτη με πλάτη.
Αυτό ακριβώς το είδος μου τρίβει πνευματικά με λάθος τρόπο,
και μάλιστα αν εστιάσουμε σε ακριβώς αυτές τις γραμμές, αυτή είναι η C.
>> Έτσι, πολλά από κώδικα της Apple είναι το ίδιο γραμμένο σε C,
και αυτό προφανώς Είναι πραγματικά equivalent--
Δεν με αυτή την όμορφη εσοχή έκδοση, αλλά αν έχετε αναγνωρίσει το γεγονός
ότι δεν υπάρχει καμία άγκιστρα, τι Η Apple έγραψε πραγματικά ήταν κώδικα που μοιάζει
σαν αυτό.
Έτσι έχω σμίκρυνση και απλά καθόρισε την εσοχή, υπό την έννοια
ότι αν δεν υπάρχουν άγκιστρα, ότι δεύτερη goto αποτυγχάνουν ότι είναι σε κίτρινο
πρόκειται να εκτελέσει δεν έχει σημασία τι.
Δεν είναι συνδεδεμένες με την το αν η κατάσταση πάνω από αυτό.
>> Έτσι, ακόμα και πάλι, αν δεν κάνετε αρκετά καταλάβουμε τι θα μπορούσε αυτό ενδεχομένως να
να κάνουμε, γνωρίζουμε ότι κάθε ένα από αυτά conditions-- κάθε μία από αυτές τις γραμμές
είναι ένα πολύ σημαντικό βήμα στη διαδικασία ελέγχου
αν τα δεδομένα σας είναι στην πραγματικότητα κρυπτογραφημένα.
Έτσι παρακάμπτοντας ένα από αυτά βήματα, δεν είναι η καλύτερη ιδέα.
>> Αλλά γιατί έχουμε αυτή δεύτερη goto αποτύχει σε κίτρινο,
και επειδή από τη στιγμή που το είδος της αισθητικής
μετακινήστε το προς τα αριστερά, όπου λογικά είναι αυτή τη στιγμή, τι
σημαίνει αυτό για την γραμμή του κώδικα κάτω από αυτό το δεύτερο goto
δεν θα νομίζετε;
Είναι πάντα θα πρέπει να παραλείπεται.
Έτσι gotos γενικά αποδοκιμαζόταν για λόγους που δεν θα πραγματικά να πάει στο,
και μάλιστα σε CS50 δεν τείνουν για να διδάξει αυτή τη δήλωση goto,
αλλά μπορείτε να σκεφτείτε goto αποτυγχάνουν ως έννοια go άλμα
σε κάποιο άλλο μέρος του κώδικα.
>> Με άλλα λόγια πηδούν πάνω αυτή η τελευταία γραμμή συνολικά,
και έτσι το αποτέλεσμα αυτής της ανόητο απλό λάθος που ήταν μόλις
ένα αποτέλεσμα πιθανώς κάποιος αντιγραφή και επικόλληση ενός πολύ
πολλές φορές ήταν ότι ολόκληρο ασφάλεια του iOS και Mac OS
ήταν ευάλωτοι σε υποκλοπή από κακούς για αρκετό καιρό.
Μέχρι την Apple σταθερό τέλος αυτό.
>> Τώρα αν κάποιοι από εσάς είναι πραγματικά τρέχουν παλιές εκδόσεις του iOS ή Mac OS,
μπορείτε να πάτε στο gotofail.com που είναι μια ιστοσελίδα ότι κάποιος που έχει συσταθεί
για τον προσδιορισμό, κατ 'ουσίαν προγραμματισμού
αν ο υπολογιστής σας εξακολουθεί να είναι ευάλωτη.
Και ειλικρινά, αν είναι, είναι πιθανώς μια καλή ιδέα
για να ενημερώσετε το τηλέφωνό σας ή Mac σας σε αυτό το σημείο.
Αλλά εκεί, μόνο απόδειξη για το πόσο την εκτίμηση αυτών χαμηλότερο επίπεδο
λεπτομέρειες και δίκαια απλές ιδέες μπορεί πραγματικά
μεταφράζονται σε αποφάσεις και τα προβλήματα που
affected-- σε αυτό case-- εκατομμύρια ανθρώπους.
>> Τώρα, μια λέξη για τη διοίκηση.
Τμήμα θα ξεκινήσει την ερχόμενη Κυριακή.
Θα λάβετε ένα μήνυμα ηλεκτρονικού ταχυδρομείου από το Σαββατοκύριακο για το τμήμα, στο οποίο σημείο
η διαδικασία resectioning θα ξεκινήσει, αν έχετε
συνειδητοποίησε έχετε τώρα κάποιες νέες συγκρούσεις.
Έτσι, αυτό συμβαίνει κάθε χρόνο, και εμείς θα φιλοξενήσει στις μέρες που έρχονται.
>> Office hours-- κάνει να κρατήσει ένα μάτι σε αυτό το πρόγραμμα εδώ.
Αλλάζει λίγο αυτή την εβδομάδα, ιδιαίτερα η ώρα έναρξης
και η θέση, έτσι ώστε να συμβουλευτείτε ότι πριν από τον τίτλο για ώρες γραφείου
οποιαδήποτε από τις επόμενες τέσσερις νύχτες.
Και τώρα μια λέξη σχετικά με την αξιολόγηση, ιδιαίτερα καθώς βουτήξει πρόβλημα
ορίζει μία και πέρα.
>> Έτσι ανά την προδιαγραφή, αυτά είναι γενικά
οι άξονες κατά μήκος των οποίων αξιολογούμε την εργασία σας.
Πεδίο εφαρμογής αναφέρεται σε ό, τι βαθμό υλοποιεί τον κωδικό σας
τα χαρακτηριστικά που απαιτούνται με τις προδιαγραφές μας.
Με άλλα λόγια, πόση ένα κομμάτι που είχε δαγκώσει μακριά.
Κάνατε ένα τρίτο από αυτό, ένα μισό από αυτό, 100% αυτής.
Ακόμα κι αν αυτό δεν είναι σωστό, πόσα θα επιχειρήσει;
Έτσι ώστε να συλλαμβάνει το επίπεδο της προσπάθειας και του ποσού
στην οποία δάγκωσε το προβλήματα πρόβλημα σύνολο του.
>> Correctness-- αυτό, να ποιο βαθμό, είναι ο κωδικός σας
συνάδει με μας προδιαγραφές και χωρίς σφάλματα.
Έτσι δουλεύει σωστά;
Αν έχουμε δώσει κάποια στοιχεία, που κάνει να μας δώσει το αποτέλεσμα που περιμένουμε;
Σχέδιο-- τώρα αυτή είναι η πρώτη από τα ιδιαίτερα ποιοτικά αυτά,
ή αυτοί που απαιτούν ανθρώπινη κρίση.
Και πράγματι, αυτός είναι ο λόγος που έχουμε ένα προσωπικό τόσων διδασκαλίας υποτρόφων και φυσικά
βοηθούς.
Σε ποιο βαθμό σας κώδικα γραμμένο καλά;
>> Και πάλι αυτό είναι ένα πολύ ποιοτική αξιολόγηση
ότι θα συνεργαστεί μαζί σας για αμφίδρομα στις εβδομάδες που έρχονται.
Έτσι ώστε, όταν δεν πάρει μόνο αριθμητικά αποτελέσματα, αλλά επίσης
μια γραπτή σκορ, ή δακτυλογραφημένα γνώμη, ή γραπτή ενημέρωση σε αγγλικές λέξεις.
Αυτό είναι αυτό που θα χρησιμοποιήσετε για να οδηγείτε προς την πραγματικότητα γράφοντας καλύτερη κώδικα.
Και στη διάλεξη και ενότητα, θα προσπαθήσουμε να επισημάνω out-- τόσο συχνά όσο εμείς μπορώ--
τι κάνει ένα πρόγραμμα όχι μόνο σωστή και λειτουργικά καλή,
αλλά και καλά σχεδιασμένη.
Η πιο αποτελεσματική θα μπορούσε να είναι, ή ακόμα και το πιο όμορφο μπορεί να είναι.
>> Πράγμα που μας οδηγεί στο στυλ.
Στυλ είναι τελικά μια αισθητική κρίση.
Μήπως μπορείτε να επιλέξετε καλό ονόματα για τις μεταβλητές σας;
Έχετε εσοχή κωδικό σας σωστά;
Δεν είναι καλή, και, ως εκ τούτου, Είναι εύκολο για ένα άλλο ανθρώπινο ον
να διαβάσετε τις αντίστοιχες σας της ορθότητας της.
>> Τώρα γενικά ανά την εξεταστέα ύλη, που σκοράρει αυτά τα πράγματα σε μια κλίμακα πέντε σημείων.
Και επιτρέψτε μου να καταστήσουμε σαφές το σημείο ότι τρία είναι πράγματι καλή.
Πολύ γρήγορα κάνουν οι λαοί αρχίσει να κάνει αριθμητικές πράξεις.
Όταν πάρετε μια τρεις από πέντε για την ορθότητα για κάποιο το chipset
και σκέφτονται δεκάρα, θα πάω στο 60% το οποίο είναι ουσιαστικά ένα ϋ ή ένα Ε
>> Αυτός δεν είναι ο τρόπος που σκεφτείτε αυτούς τους αριθμούς.
Ένα τριών είναι πράγματι καλό, και τι μπορούμε γενικά αναμένουν στην αρχή
του όρου είναι ότι εάν παίρνετε ένα μάτσο three's-- ίσως ένα ζευγάρι
των εκθέσεων, ένα ζευγάρι από fours-- ή ένα ζευγάρι δυάρια, ένα ζευγάρι των fours--
αυτό είναι ένα καλό μέρος για να ξεκινήσετε.
Και εφ 'όσον βλέπουμε μια ανοδική τροχιά την πάροδο του χρόνου,
είστε σε ιδιαίτερα καλή θέση.
>> Ο τύπος που χρησιμοποιούμε για να βάρος πράγματα είναι ουσιαστικά
αυτό ανά την εξεταστέα ύλη, που απλά σημαίνει ότι εμείς
δίνουν περισσότερο βάρος στην ορθότητα.
Επειδή είναι πολύ συχνά ορθότητα που παίρνει τον περισσότερο χρόνο.
Πίστεψέ με τώρα.
Θα find-- τουλάχιστον σε ένα pset-- ότι θα
δαπανούν το 90% του χρόνου σας εργάζονται σε 10% του προβλήματος.
>> Και πάντα το είδος των έργων εκτός από μία ή δύο σφάλματα,
και αυτά είναι τα σφάλματα που να σας κρατήσει μέχρι αργά το βράδυ.
Αυτοί είναι εκείνοι που είδος να ξεφύγουν.
Αλλά μετά από τον ύπνο σε αυτό, ή φοιτούν ώρες γραφείου
ή ερωτήσεις σε απευθείας σύνδεση, είναι όταν φτάσουμε σε αυτό το στόχο κατά 100%,
και γι 'αυτό το βάρος ορθότητα της πιο.
Σχεδιάστε ένα λίγο μικρότερο, και το στυλ είναι λίγο μικρότερη από εκείνη.
Αλλά να έχετε κατά mind-- στυλ είναι ίσως το πιο εύκολο
από αυτά να δαγκώσει σύμφωνα με τον οδηγό στυλ.
>> Και τώρα, το πιο σοβαρό σημειώστε την ακαδημαϊκή δεοντολογία.
CS50 έχει το θλιβερό προνόμιο της είναι ο μεγαλύτερος παραγωγός της Ad Board
περιπτώσεις σχεδόν κάθε χρόνο ιστορικά.
Αυτό δεν είναι επειδή οι μαθητές εξαπατήσει σε CS50 πια από ό, τι οποιαδήποτε άλλη κατηγορία,
αλλά επειδή από τη φύση της εργασίας, το γεγονός ότι η ηλεκτρονική,
το γεγονός ότι ψάχνουμε για αυτό, και το γεγονός είμαστε επιστήμονες ηλεκτρονικών υπολογιστών,
Μπορώ να πω ότι, δυστυχώς, πολύ καλοί στο να εντοπίζουν αυτό.
>> Λοιπόν, τι σημαίνει αυτό σε πραγματικούς όρους;
Γι 'αυτό, κατά τη διδακτέα ύλη, Η φιλοσοφία του μαθήματος
πραγματικά βράζει κάτω για να είναι λογικό.
Υπάρχει αυτή η γραμμή μεταξύ να κάνει την εργασία ενός ατόμου για τη δική σας
και να πάρει ένα μικρό κομμάτι της εύλογη βοήθεια από έναν φίλο,
και οριστικές κάνει αυτή τη δουλειά για σας φίλος, ή στέλνοντας το άτομό κωδικό σας
έτσι ώστε αυτός ή αυτή μπορεί απλά να λαμβάνουν ή να το δανειστείτε από δεξιά.
Και που διασχίζει τη γραμμή ότι εμείς που στην τάξη.
>> Δείτε, το αναλυτικό πρόγραμμα τελικά, για τις γραμμές
ότι εφιστούμε όπως είναι λογικό και παράλογη συμπεριφορά,
αλλά το κάνει πραγματικά να βράσει κάτω προς την ουσία
της εργασίας σας χρειάζεται να είναι δική σας στο τέλος.
Τώρα με ότι είπε, υπάρχει μια ευρετική.
Επειδή όπως μπορείτε να imagine-- από τις ώρες γραφείου και τα visuals
και τα βίντεο που έχουμε φαίνεται έτσι far-- CS50
είναι πράγματι γραφτό να γίνει η συνεργατική και ως συνεταιρισμός και η κοινωνική
όσο το δυνατόν.
Όπως συνεργασίας, όπως είναι αυστηρή.
>> Αλλά με αυτό το είπε, η ευρετική, όπως θα δούμε στη διδακτέα ύλη,
είναι ότι όταν έχεις κάποιο πρόβλημα.
Έχετε κάποιο bug στον κώδικα σας ότι έχετε δεν μπορεί να λύσει, είναι λογικό για σας
για να δείξει τον κωδικό σας σε κάποιον άλλο.
Ένας φίλος, ακόμη και στην τάξη, ένας φίλος κάθεται δίπλα σας σε ώρες γραφείου,
ή ένα μέλος του προσωπικού.
Αλλά δεν μπορούν να δείξουν τον κωδικό τους για να σας.
>> Με άλλα λόγια, ένας απαντήσει σε question-- σας
Χρειάζομαι help-- δεν είναι OH, εδώ τον κωδικό μου.
Ρίξτε μια ματιά σε αυτό και συμπεράνουμε από ό, τι θέλετε.
Τώρα, βέβαια, υπάρχει ένας τρόπος με σαφήνεια στο παιχνίδι
αυτό το σύστημα με το οποίο θα σας δείξω κωδικό μου πριν με μια ερώτηση.
Μπορείτε να μου δείξετε τον κωδικό σας μου πριν από έχοντας μια ερώτηση.
Αλλά δείτε το αναλυτικό πρόγραμμα και πάλι για το λεπτότερες λεπτομέρειες για το πού αυτή η γραμμή είναι.
>> Ακριβώς για να ζωγραφίσει τώρα την εικόνα και μοιραστούν όσο το δυνατό διαφανέστερο
όπου βρισκόμαστε τα τελευταία χρόνια, αυτός είναι ο αριθμός των περιπτώσεων Ad Board
ότι CS50 έχει πάνω τα τελευταία επτά χρόνια.
Με 14 περιπτώσεις αυτή η πιο πρόσφατη πτώση.
Όσον αφορά τους μαθητές που συμμετέχουν, ήταν 20 κάποιο περίεργο φοιτητές
αυτή η τελευταία πτώση.
Υπήρξε μια αιχμή του 33 οι μαθητές πριν από μερικά χρόνια.
Πολλοί από τους οποίους είναι, δυστυχώς, δεν είναι πια εδώ στην πανεπιστημιούπολη.
>> Οι μαθητές που συμμετέχουν ως ποσοστό του τάξη έχει ιστορικά κυμαίνονταν από 0%
στο 5,3%, το οποίο είναι μόνο για να πω αυτό είναι κάθε χρόνο μια πρόκληση.
Και προς το σκοπό αυτό, τι θέλουμε να κάνουμε είναι να μεταφέρει ένα
ότι dd-- μόνο FYI-- σύγκριση με η δικαιοσύνη για τους φοιτητές που
είναι μετά από τη γραμμή αναλόγως.
Κάνουμε συγκρίνετε όλες τις τρέχουσες ισχυρισμοί εναντίον όλων των προηγούμενων αποστολών
από τα τελευταία πολλά χρόνια.
>> Γνωρίζουμε πάρα πολύ πώς να το Google γύρω από και βρείτε αποθετήρια κώδικα
σε απευθείας σύνδεση, φόρουμ συζητήσεων σε απευθείας σύνδεση, χώρους εργασίας σε απευθείας σύνδεση.
Εάν ένας φοιτητής μπορεί να βρει, μπορούμε σίγουρα βρείτε όσο εμείς δυστυχώς κάνουμε.
Έτσι, αυτό που θα δείτε στο αναλυτικό πρόγραμμα αν είναι αυτή η ρήτρα λύπη.
Μπορώ σίγουρα εκτιμώ, και όλοι έχει
προσωπικού που έχει κάνει την πορεία, όπως αυτό, ή αυτό το ίδιο ένα πάροδο του χρόνου,
σίγουρα γνωρίζουν τι είναι όπως όταν η ζωή παίρνει με τον τρόπο, όταν έχετε
κάποια αργά τη νύχτα deadline-- όχι μόνο σε αυτή την κατηγορία,
αλλά another-- όταν είστε εντελώς εξαντληθεί, τόνισε,
έχουν υπέρμετρο αριθμό από άλλες δραστηριότητες.
Θα κάνετε κάποια στιγμή στο ζωή σίγουρα μια κακή, ίσως αργά
νύχτα απόφαση.
>> Έτσι, κατά τη διδακτέα ύλη, υπάρχει αυτή η ρήτρα,
όπως ότι αν εντός 72 ωρών από την κάποια κακή απόφαση, έχετε στην κατοχή σας μέχρι να
και να φτάσει σε μένα και ένα από τα κεφάλια του μαθήματος
και θα έχουμε μια συνομιλία.
Θα χειριστούμε τα πράγματα στο εσωτερικό ελπίδες
από αυτό όλο και περισσότερο από ένα διδασκαλίας στιγμή ή μάθημα ζωής,
και όχι κάτι με ιδιαίτερα δραστικές επιπτώσεις
όπως μπορείτε να δείτε σε αυτά τα διαγράμματα εδώ.
>> Έτσι, αυτό είναι ένα πολύ σοβαρό ύφος.
Ας σταματήσουμε για λίγες μόνο δευτερόλεπτα για να σπάσει την ένταση.
>> [ΜΟΥΣΙΚΗ ΠΑΙΖΟΝΤΑΣ]
>> DAVID J. MALAN: Εντάξει, έτσι πώς ήταν ότι για ένα segue;
Για την σημερινή πρωτοβάθμια θέματα.
Η πρώτη από τις οποίες είναι η αφαίρεση.
Ένα άλλο από τα οποία πρόκειται να είναι ο αναπαράσταση των δεδομένων, τα οποία ειλικρινά
Είναι ένα πραγματικά στεγνό τρόπος για να πούμε πώς μπορούμε να πάμε για την επίλυση των προβλημάτων και σκέψης
για την επίλυση των προβλημάτων;
Έτσι, έχετε δει στο Scratch, και έχετε δει ίσως ήδη pset1 με C
ότι μπορείτε όχι μόνο να χρησιμοποιούν λειτουργίες, όπως η printf,
ότι οι άλλοι άνθρωποι σε Τα προηγούμενα χρόνια έγραψε για σας.
Μπορείτε επίσης να γράψετε τις δικές σας συναρτήσεις.
>> Και παρόλο που μπορεί να μην έχουν κάνει αυτό σε C, και ειλικρινά σε pset1
δεν χρειάζεται πραγματικά να γράψω σας δική του λειτουργία, διότι το problem--
ενώ ίσως τρομακτικό σε πρώτη glance-- θα δείτε
μπορεί τελικά να λυθεί με δεν είναι όλοι ότι πολλές γραμμές κώδικα.
Αλλά με ότι είπε, σε όρους του γράφοντας τη δική σας λειτουργία,
συνειδητοποιούν ότι η C δίνει σας αυτή η δυνατότητα.
>> Πάω να πάει στον πηγαίο κώδικα του σήμερα, η οποία είναι ήδη διαθέσιμα σε απευθείας σύνδεση,
και Πάω να πάει μπροστά και ανοιχτό μέχρι ένα πρόγραμμα που ονομάζεται 0.C λειτουργία,
και σε λειτουργία μηδέν θα δούμε μερικά πράγματα.
Στην πρώτη γραμμές 18 και 23 είναι η κύρια λειτουργία μου.
Και τώρα που αρχίζουμε να διαβάσετε κώδικα που δεν είμαστε εγγράφως σχετικά με την πετάξει,
αλλά αντ 'αυτού έχω γράψει εκ των προτέρων ή ότι σας σε ένα πρόβλημα που
μπορεί να λάβει με έχουν γραφτεί εκ των προτέρων.
Ένας καλός τρόπος για να ξεκινήσετε διάβαζα τον κώδικα κάποιου άλλου
είναι να κοιτάξουμε για την κύρια λειτουργία.
Υπολογίστε όπου αυτήν την καταχώρηση σημείο είναι να τρέχει το πρόγραμμα,
και στη συνέχεια να ακολουθήσει λογικά από εκεί.
>> Έτσι, το πρόγραμμα αυτό προφανώς εκτυπώσεις Το όνομά σας ακολουθούμενο από άνω και κάτω τελεία.
Στη συνέχεια, χρησιμοποιήστε GetString από τη βιβλιοθήκη CS50
για να πάρετε μια σειρά, ή μια λέξη ή φράση από τον χρήστη στο πληκτρολόγιο.
Και έπειτα υπάρχει αυτό πράγμα here-- PrintName.
>> Τώρα PrintName δεν είναι λειτουργία που έρχεται με C.
Δεν είναι στο πρότυπο io.h.
Δεν είναι σε CS50.h.
Είναι μάλλον στο ίδιο αρχείο.
Παρατηρήστε αν μετακινηθείτε προς τα κάτω ένα bit-- γραμμές 25 έως 27--
Είναι απλά ένα όμορφο τρόπο σχολιασμού κωδικό σας χρησιμοποιώντας τα αστέρια και καθέτους.
Αυτό είναι ένα πολυ-line Σχολιάστε, και αυτό είναι ακριβώς
περιγραφή μου στο γαλάζιο τι κάνει αυτή η λειτουργία.
>> Επειδή στις γραμμές 28 έως 31, Έχω γράψει μια εξαιρετικά απλή λειτουργία
του οποίου το όνομα είναι PrintName.
Παίρνει πόσες επιχειρήματα θα λέγατε;
Έτσι, ένα argument-- επειδή υπάρχει ένα επιχείρημα που αναφέρονται μέσα στις παρενθέσεις.
Ο τύπος του οποίου είναι String.
Ποια είναι να πούμε PrintName Είναι σαν αυτό το μαύρο κουτί
ή λειτουργία που λαμβάνει ως είσοδο ένα string.
>> Και το όνομα αυτού του String βολικά θα Name.
Δεν S, δεν Ν, αλλά Name.
Έτσι τι PrintName κάνει;
Είναι ωραίο απλό.
Ακριβώς όπως μια γραμμή κώδικα για η printf, αλλά προφανώς
εκτυπώνει "Γεια σας," έτσι και έτσι.
Όταν το έτσι και έτσι προέρχεται από το επιχείρημα.
>> Τώρα αυτό δεν είναι μια τεράστια καινοτομία εδώ.
Πραγματικά, έχω πάρει ένα πρόγραμμα που θα μπορούσε έχουν γραφτεί με μία γραμμή κώδικα
από τη θέση αυτή εδώ, και το άλλαξε σε κάτι
που περιλαμβάνει περίπου έξι ή επτά ή έτσι γραμμές κώδικα σε όλη τη διαδρομή προς τα κάτω εδώ.
>> Αλλά είναι η εξάσκηση ενός αρχή που είναι γνωστή ως αφαίρεση.
Το είδος της ενθυλάκωσης εντός ενός νέου λειτουργία που έχει ένα όνομα, και καλύτερα
ακόμη ότι η ονομασία κυριολεκτικά λέει τι κάνει.
Εννοώ printf-- ότι δεν είναι ιδιαίτερα περιγραφικό.
Αν θέλετε να δημιουργήσετε ένα κομμάτι του παζλ, ή αν
θέλετε να δημιουργήσετε μια συνάρτηση που εκτυπώνει το όνομα κάποιου,
η ομορφιά του να κάνει αυτό είναι ότι μπορώ πραγματικά
δοθούν σε αυτή την λειτουργία ένα όνομα που περιγράφει αυτό που κάνει.
>> Τώρα παίρνει στην είσοδο ότι Έχω αυθαίρετα ονομάζεται όνομα,
αλλά ότι επίσης είναι υπέροχα περιγραφικό αντί να είναι λίγο πιο
γενόσημων όπως S. Και άκυρη, για τώρα, απλά σημαίνει
ότι αυτή η λειτουργία δεν Δώσε μου πίσω τίποτα.
Δεν είναι όπως GetString ότι κυριολεκτικά με τα χέρια πίσω ένα string
όπως κάναμε με τα κομμάτια χαρτιού με τους συμμαθητές σας την περασμένη εβδομάδα,
αλλά μάλλον έχει μόνο μια παρενέργεια.
Εκτυπώνει κάτι στην οθόνη.
>> Έτσι, στο τέλος της ημέρας, αν κάνουν τη λειτουργία-0, ./function-0,
θα δούμε ότι ζητά για το όνομά μου.
Τύπου Ι David, και οι τύποι από το όνομά μου.
Αν μπορώ να το κάνω και πάλι με τον Rob, πρόκειται να πω "Γεια σας, Rob."
Έτσι, μια απλή ιδέα, αλλά ίσως προεκτείνουν από αυτό διανοητικά
ότι τα προγράμματα σας να πάρετε λίγο πιο περίπλοκη,
και θέλετε να γράψετε ένα κομμάτι της κώδικα και κλήση που code-- επικαλούνται
ότι code-- από κάποιο περιγραφικό ονομάσετε όπως PrintName,
C δεν μας δίνουν αυτή τη δυνατότητα.
>> Εδώ είναι ένα άλλο απλό παράδειγμα.
Για παράδειγμα, αν ανοίξει ένα αρχείο από σήμερα ονομάζεται return.c,
παρατηρήσετε τι έχω κάνει εδώ.
Το μεγαλύτερο μέρος αυτής κύρια λειτουργία είναι printf.
Θέλω πρώτα αυθαίρετα προετοιμάσει ένα μεταβλητή που ονομάζεται x με τον αριθμό 2.
Στη συνέχεια εκτυπώστε "x είναι τώρα % I "περνώντας την τιμή του x.
Έτσι Απλά λέω ό, τι είναι.
>> Τώρα είμαι μόνο με τόλμη υποστηρίζοντας με printf.
Είμαι cubing ότι η τιμή x, και είμαι αυτόν τον τρόπο καλώντας μια συνάρτηση
που ονομάζεται πέρασμα κύβος στο x ως επιχείρημα,
και στη συνέχεια να αποθηκευτεί το αποτέλεσμα στην ίδια την μεταβλητή, x.
Έτσι είμαι clobbering την τιμή του x.
Είμαι επιτακτικό το τιμή του x με ανεξάρτητα
το αποτέλεσμα της κλήσης Αυτή η λειτουργία είναι κύβος.
Και τότε ακριβώς να εκτυπώσετε ορισμένα αφράτα πράγματα εδώ λέει ό, τι έκανα.
>> Έτσι, αυτό που τότε είναι κύβος;
Παρατηρήστε τι είναι θεμελιωδώς διαφορετικά εδώ.
Έχω δώσει την λειτουργία ένα όνομα όπως πριν.
Έχω καθορίσει ένα όνομα για ένα επιχείρημα.
Αυτή τη φορά λέγεται n αντί του ονόματος, αλλά θα μπορούσα να το ονομάσουμε ό, τι θέλω.
Αλλά αυτό είναι διαφορετικό.
Αυτό το πράγμα στην αριστερά.
Προηγουμένως ήταν ποια λέξη-κλειδί;
Αγόρια.
Τώρα είναι προφανώς int.
>> Λοιπόν, τι είναι ίσως το πάρει;
Εκτιμώντας κενό υποδηλώνει το είδος της ανυπαρξία, και αυτή ήταν η περίπτωση.
PrintName επέστρεψε τίποτα.
Θα έκανε κάτι, αλλά δεν μου δώσεις πίσω
κάτι που θα μπορούσε να θέσει σχετικά με την αριστερή πλευρά του το σύμβολο ισότητας
όπως έχω κάνει εδώ στη γραμμή 22.
>> Έτσι, αν πω σε on line 30, Τι είναι αυτό ίσως υπονοεί
για ποιο κύβος κάνει για μένα;
Ναι;
Επιστρέφει έναν ακέραιο.
Γι 'αυτό μου δίνει πίσω, για παράδειγμα, ένα κομμάτι από χαρτί
για την οποία έχει γράψει την απάντηση.
2 κύβους, κύβους ή 3, ή 4 cubed-- ό, τι πέρασα,
και πώς θα γίνει αυτό;
Λοιπόν, ακριβώς n φορές n n φορές είναι το πώς μπορώ να σε κύβους μια αξία.
Έτσι, και πάλι, εξαιρετικά απλή ιδέα, αλλά εκδηλωτικός
τώρα πώς μπορούμε να γράψουμε λειτουργίες ότι στην πραγματικότητα μας είχε πίσω
οι τιμές που μπορεί να έχουν ενδιαφέρον.
>> Ας δούμε ένα τελευταίο παράδειγμα εδώ που ονομάζεται λειτουργία ένα.
Σε αυτό το παράδειγμα, ξεκινά να πάρει πιο συναρπαστικό.
Έτσι, σε μία λειτουργία, αυτό program-- ειδοποίηση τελικά
καλεί μια συνάρτηση που ονομάζεται GetPositiveInt.
GetPositiveInt δεν είναι ένα λειτουργία στη βιβλιοθήκη CS50,
αλλά εμείς αποφασίσαμε Θα ήθελα να υπάρχει.
>> Έτσι, αν μετακινηθείτε προς τα κάτω αργότερα στο αρχείο, παρατηρήσετε πώς πήγα για την εφαρμογή
να πάρει θετικό int, και εγώ λένε ότι είναι πιο συναρπαστικό
γιατί αυτό είναι ένα αξιοπρεπές αριθμός των γραμμών του κώδικα.
Δεν είναι απλά ένα ανόητο μικρό πρόγραμμα παιχνιδιών.
Είναι πραγματικά έχεις κάποιο έλεγχο σφαλμάτων και να κάνουμε κάτι πιο χρήσιμο.
>> Έτσι, αν δεν έχετε δει το πέρασμα βίντεο που έχουμε ενσωματωμένα σε pset1,
ξέρετε ότι αυτό είναι ένα είδος βρόχο C, παρόμοια με το πνεύμα
για τα είδη των πραγμάτων Scratch μπορεί να κάνει.
Και θα το κάνει λέει να το κάνετε αυτό.
Εκτυπώστε αυτό.
Στη συνέχεια, να προχωρήσει και να πάρει n-- πάρετε μια int και να το αποθηκεύσετε στο n,
και συνεχίστε να κάνετε αυτό ξανά και ξανά και πάλι εφ 'όσον η είναι μικρότερη από ένα.
>> Έτσι, n πρόκειται να είναι μικρότερη από ένα μόνο αν ο άνθρωπος δεν είναι συνεργαζόμενοι.
Αν αυτός ή αυτή έχει την πληκτρολόγηση σε 0 ή -1 ή -50,
Αυτή η βρόχος πρόκειται να κρατήσει εκτελεί ξανά και ξανά.
Και τελικά παρατηρήσετε, I απλά επιστρέφει την τιμή.
Έτσι τώρα έχουμε μια συνάρτηση ότι θα πάει ωραίο
αν CS50 θα εφαρμόσει σε CS50.h και CS50.c για σας,
αλλά εδώ μπορούμε τώρα εφαρμόσουν αυτό τον εαυτό μας.
>> Αλλά δύο σχόλια σχετικά με ορισμένα βασικά στοιχεία.
Ένα-- γιατί δηλώνω int n, νομίζετε, στη γραμμή 29
αντί απλά να κάνει Αυτό εδώ, το οποίο είναι
πιο συνεπής με αυτό που κάναμε την περασμένη εβδομάδα;
Ναι;
Μια καλή σκέψη.
Έτσι, αν ήταν να το βάλει εδώ, είναι σαν να έχουμε
κρατήσει δηλώνοντας ξανά και ξανά.
Αυτό από μόνο του είναι δεν είναι προβληματική, per se,
γιατί χρειαζόμαστε μόνο η αξία άπαξ και έπειτα
θα πάμε να πάρετε ένα νέο ούτως ή άλλως.
Αλλά μια καλή σκέψη.
Ναι;
>> Κλείσιμο.
Έτσι, επειδή έχω δηλώσει n για γραμμή 29 έξω από το βρόχο,
είναι προσβάσιμο σε όλη όλη αυτή η λειτουργία.
Δεν είναι οι άλλες λειτουργίες, επειδή η είναι ακόμα μέσα από αυτά τα σγουρά
τιράντες εδώ.
So-- σίγουρος.
>> Ακριβώς.
Έτσι, αυτό είναι ακόμη περισσότερο στο σημείο.
Αν αντί δηλωθεί n εδώ στη γραμμή 32,
είναι προβληματική, διότι η εικασία πού αλλού θα πρέπει να έχει πρόσβαση;
Στη γραμμή 34, και η απλός κανόνας είναι
ότι μπορείτε να χρησιμοποιήσετε μόνο μια μεταβλητή μέσα από τις πιο πρόσφατες άγκιστρα
στην οποία δήλωσε.
>> Δυστυχώς, γραμμή 34 είναι μια γραμμή πολύ αργά,
γιατί έχω ήδη κλείσει η σγουρά στήριγμα στη γραμμή 33
που αντιστοιχεί στο σγουρά στήριγμα στη γραμμή 30.
Και έτσι αυτό είναι ένας τρόπος για να πούμε ότι αυτή η μεταβλητή int έχει ως πεδίο,
να το πω έτσι, μόνο μέσα από αυτές τις αγκύλες.
Απλά δεν υπάρχει έξω από αυτούς.
>> Έτσι, πράγματι, αν το κάνω αυτό λάθος, επιτρέψτε μου να αποθηκεύσετε τον κωδικό
όπως is-- γραμμένο λάθος.
Επιτρέψτε μου να πάει μπροστά και να κάνουν λειτουργία-1, και notice-- σφάλμα.
Χρήση της αδήλωτης αναγνωριστικό n στη γραμμή 35, η οποία είναι ακριβώς εδώ.
Και αν μετακινηθείτε προς τα επάνω περαιτέρω, ένα άλλο.
Χρήση της αδήλωτης αναγνωριστικό n στη γραμμή 34.
>> Έτσι ο compiler, Clang, έχει παρατηρήσει ότι μόλις
δεν υφίσταται ακόμη και αν σαφώς ότι υπάρχει οπτικά.
Έτσι, μια απλή λύση είναι να δηλώνοντας εκεί.
>> Τώρα, επιτρέψτε μου να μεταβείτε στο η κορυφή του αρχείου.
Αυτό που πηδά έξω σε σας ως είναι λίγο διαφορετικό
από τα πράγματα που κοίταξε την περασμένη εβδομάδα;
Όχι μόνο δεν έχω όνομα, όχι μόνο δεν Έχω κάποια απότομη περιλαμβάνει επάνω στην κορυφή,
Έχω κάτι που είμαι καλώντας ένα πρωτότυπο.
Τώρα που φαίνεται απαίσια παρόμοιο με αυτό που μόλις είδαμε πριν από λίγο στη γραμμή 27.
>> Οπότε ας συμπεράνουμε από μια διαφορετική μήνυμα λάθους γιατί έχω κάνει αυτό.
Επιτρέψτε μου να προχωρήσει και διαγράψετε αυτές τις γραμμές υπάρχει.
Και έτσι δεν ξέρουμε τίποτα για το πρωτότυπο.
Ξανακάνω αυτό το αρχείο.
Κάντε μία λειτουργία.
Και τώρα, γαμώτο, τέσσερα λάθη.
Ας μετακινηθείτε προς τα επάνω με το πρώτο.
>> Σιωπηρή δήλωση της λειτουργίας να πάρει θετικό int είναι άκυρο C99.
C99 σημαίνει μόνο το 1999 εκδοχή της γλώσσας
C, η οποία είναι αυτό που είμαστε πραγματικά χρήση.
Λοιπόν, τι σημαίνει αυτό;
Καλά C-- και πιο συγκεκριμένα C compilers-- είναι αρκετά χαζός προγράμματα.
Το μόνο που ξέρουν τι έχετε Τους είπα, και αυτό είναι
πραγματικά θεματικές από την περασμένη εβδομάδα.
>> Το πρόβλημα είναι ότι αν πάω σχετικά με την εφαρμογή της όνομα μέχρι εδώ,
και καλώ μια λειτουργία που ονομάζεται GetPositiveInt εδώ στη γραμμή 20,
ότι η λειτουργία δεν είναι τεχνικά υπάρχουν μέχρι το compiler βλέπει γραμμή 27.
Δυστυχώς, ο compiler είναι κάνει τα πράγματα επάνω, κάτω, αριστερά, δεξιά,
έτσι γιατί δεν έχει δει το εφαρμογή του GetPositiveInt,
αλλά βλέπει προσπαθείς να το χρησιμοποιήσετε μέχρι εδώ,
είναι ακριβώς πρόκειται να bail-- φωνάζεις σας με ένα σφάλμα message-- ίσως
αινιγματικός, και στην πραγματικότητα δεν μεταγλώττιση του αρχείου.
>> Έτσι το λεγόμενο πρωτότυπο επάνω εδώ είναι ομολογουμένως περιττή.
Κυριολεκτικά, πήγα κάτω εδώ και Αντέγραψα και επικολληθεί από αυτό, και το έβαλα εδώ.
Void θα ήταν πιο σωστό, οπότε θα κυριολεκτικά να αντιγράψετε και να επικολλήσετε αυτή τη φορά.
I κυριολεκτικά αντιγραφεί και επικολληθεί αυτό.
Πραγματικά ακριβώς όπως σαν ένα ψίχουλο ψωμιού.
>> Μια μικρή ιδέα για τον compiler.
Δεν ξέρω τι κάνει αυτό ακόμα, αλλά είμαι υπόσχεται να σας
ότι θα υπάρξει τελικά.
Και γι 'αυτό line-- σε γραμμή 16-- τελειώνει με ένα ερωτηματικό.
Είναι περιττό από το σχεδιασμό.
Ναι;
>> Εάν δεν έχετε συνδέσει τη βιβλιοθήκη σας να στο-- oh, καλή ερώτηση.
Sharp περιλαμβάνει έγκλειστα αρχείο κεφαλίδας.
Ανάγκη να είναι-- πρέπει σχεδόν πάντα να είναι στην κορυφή
του αρχείου για ένα similar-- για ακριβώς τον ίδιο λόγο, ναι.
Επειδή το πρότυπο io.h είναι κυριολεκτικά μια γραμμή
όπως αυτό, αλλά με τη λέξη printf, και με επιχειρήματα του τύπου και την επιστροφή του.
Και έτσι κάνοντας απότομη περιλαμβάνουν μέχρι Εδώ, αυτό που είστε κυριολεκτικά κάνει
είναι αντιγραφή και επικόλληση τα περιεχόμενα κάποιος άλλος έγραψε επάνω στην κορυφή.
Με αυτόν τον τρόπο cluing τον κωδικό σας, για να το το γεγονός ότι δεν υπάρχουν αυτές οι λειτουργίες.
Ναι;
>> Απολύτως.
Έτσι, μια πολύ έξυπνη και σωστή λύση θα ήταν, ξέρετε τι;
Δεν ξέρω τι ένα πρωτότυπο είναι, αλλά ξέρω
αν καταλαβαίνω ότι ο C είναι απλά άλαλος και rethinks πάνω προς τα κάτω.
Λοιπόν ας το δώσουν ό, τι θέλει.
Ας κοπεί εν λόγω κώδικα, επικόλληση επάνω κορυφή, και τώρα ωθήσει κύρια κάτω.
Και αυτό θα λύσει το πρόβλημα.
>> Αλλά θα μπορούσε πολύ εύκολα να καταλήξει σε ένα σενάριο στο οποίο το Α πρέπει να καλέσετε B,
και ίσως Β καλεί πίσω στο A. Αυτό Είναι κάτι που ονομάζεται αναδρομή,
και θα επανέλθω σε αυτό.
Και αυτό μπορεί να είναι ή να μην είναι μια καλή πράγμα, αλλά μπορείτε σίγουρα
να σπάσει αυτή τη λύση.
>> Και επιπλέον, θα ήθελα ισχυρίζονται στυλιστικά,
ειδικά όταν τα προγράμματά σας γίνει αυτή η μεγάλη και αυτό το διάστημα,
είναι απλά σούπερ βολικό να θέσει κύρια στην κορυφή
γιατί αυτό είναι το πράγμα που οι περισσότεροι Οι προγραμματιστές πρόκειται να νοιάζονται για.
Και γι 'αυτό είναι λίγο καθαρότερα, αναμφισβήτητα, να το κάνει με τον τρόπο
Εγώ αρχικά το έκανε με ένα πρωτότυπο ακόμη
αν και φαίνεται λίγο περιττή την πρώτη ματιά.
Ναι;
Δυστυχώς, μπορεί να σας το πω πιο δυνατά;
>> Εάν αλλάξετε τις θέσεις του εφαρμογή και το πρωτότυπο;
Έτσι, αυτό είναι μια καλή ερώτηση.
Αν εκ νέου το δηλώσει τα κάτω Εδώ, ας δούμε τι θα συμβεί.
Έτσι, αν έβαλα αυτό κάτω Εδώ, λες.
Ω, συγγνώμη.
Πιο δυνατά;
Ακόμα πιο δυνατά.
Αχ, καλή ερώτηση.
Θα το ακυρώσει τη λειτουργία;
Ξέρετε, μετά από όλα αυτά τα χρόνια, έχω έχουν ποτέ τεθεί ένα πρωτότυπο στη συνέχεια.
Ας κάνουν τη λειτουργία-1 μετά από αυτό.
>> [Μουρμουρίζει]
DAVID J. MALAN: Αχ, περιμένετε.
Έχουμε ακόμη να θέσει τα πάντα επάνω στην κορυφή.
Ας κάνουμε αυτό εδώ, αν είμαι κατανόηση ερώτησή σας σωστά.
Βάζω τα πάντα, συμπεριλαμβανομένων των το πρωτότυπο πάνω από την κύρια,
αλλά βάζω το πρωτότυπο κάτω από την εφαρμογή.
>> Έτσι, αν κάνω ένα, παίρνω πίσω ένα error-- αχρησιμοποίητο μεταβλητή n.
Ναι, υπάρχει.
Σας ευχαριστώ.
Ας δούμε, μπορούμε να απαλλαγούμε από αυτό.
Αυτό είναι ένα διαφορετικό bug, οπότε ας αγνοήσουμε αυτό.
Ας πραγματικά ξανακάνω γρήγορα αυτό.
>> Εντάξει, έτσι δεν είναι επιχείρημα δεδομένα χρησιμοποιείται από τη μορφή String
n-- Ω, αυτό είναι επειδή Άλλαξα σε αυτά εδώ.
Εντάξει, ξέρουμε ποια είναι η απάντηση πρόκειται να-- εντάξει, πάμε.
Ah, ευχαριστώ για το θετικό.
Εντάξει, εγώ θα διορθώσετε αυτό το κώδικα after-- αγνοήσει αυτό το συγκεκριμένο bug
δεδομένου ότι αυτό was-- που λειτουργεί είναι η απάντηση.
>> Γι 'αυτό δεν θα αντικαταστήσει αυτό που μόλις κάνατε.
Υποψιάζομαι τον compiler είναι γραμμένο με τέτοιο τρόπο
ότι αγνοεί το πρωτότυπο σας επειδή το σώμα, να το πω έτσι,
της η λειτουργία έχει ήδη έχουν εφαρμοστεί πιο ψηλά.
Θα πρέπει να συμβουλευτείτε πραγματικότητα το εγχειρίδιο του compiler
για να καταλάβουμε αν υπάρχει οποιαδήποτε άλλη εμμέσως, αλλά με την πρώτη ματιά
ακριβώς με την προσπάθεια και να πειραματίζεται, Δεν φαίνεται να υπάρχει επίδραση εκεί.
Καλή ερώτηση.
>> Ας προχωρήσουμε τώρα, κινείται μακριά από τις παρενέργειες που
είναι λειτουργίες που κάνουν κάτι σαν οπτικά στην οθόνη με printf,
αλλά δεν επιστρέφει μια τιμή.
Και τις λειτουργίες που έχουν επιστροφή αξίες, όπως μόλις είδαμε μερικά από.
Ήδη είδαμε αυτή την αντίληψη του πεδίου εφαρμογής, και θα δούμε αυτό ξανά και ξανά.
Αλλά για τώρα, και πάλι, χρησιμοποιούν τον κανόνα του αντίχειρα
ότι μια μεταβλητή μπορεί να χρησιμοποιηθεί μόνο μέσα από την πιο πρόσφατα άνοιξε
και κλειστά άγκιστρα, όπως εμείς είδε στο συγκεκριμένο παράδειγμα.
>> Και όπως επισημάνατε, υπάρχει μια ability--
θα μπορούσε να λύσει μερικά από αυτά τα προβλήματα βάζοντας μια μεταβλητή σε παγκόσμιο επίπεδο
στην κορυφή ενός αρχείου.
Αλλά σε όλες σχεδόν τις περιπτώσεις θα συνοφρύωμα επάνω σε αυτό,
και μάλιστα δεν είναι καν πάει σε αυτή τη λύση για τώρα.
Έτσι, για τώρα, το πακέτο είναι ότι μεταβλητές έχουν αυτή την αντίληψη του πεδίου εφαρμογής.
>> Αλλά τώρα ας ρίξουμε μια ματιά σε ένα άλλο ξηρό τρόπο πραγματικά ψάχνει
σε κάποια αρκετά ενδιαφέροντα λεπτομέρειες εφαρμογής.
Πώς θα μπορούσαν να αντιπροσωπεύουν τις πληροφορίες.
Και έχουμε ήδη εξετάσει αυτό κατά την πρώτη εβδομάδα της τάξης.
Κοιτάζοντας εκτελέσιμα, και θυμηθούμε δεκαδικό.
>> Αλλά ανάκληση από την περασμένη εβδομάδα ότι η C έχει διαφορετικούς τύπους δεδομένων και τσαμπιά περισσότερο,
αλλά οι πιο χρήσιμες αυτές για τώρα μπορεί να είναι αυτά.
Μια χαρα, ή χαρακτήρα, που συμβαίνει να είναι ένα byte, ή οκτώ bits συνολικά.
Και ότι είναι να πούμε ότι το μέγεθος ενός χαρακτήρα είναι μόνο ένα byte.
Ένα byte είναι οκτώ bits, έτσι αυτό σημαίνει ότι μπορούμε να αντιπροσωπεύει τον αριθμό των χαρακτήρων.
Πόσα γράμματα ή σύμβολα στο πληκτρολόγιο
αν έχουμε ένα byte ή οκτώ bits.
Σκεφτείτε πίσω στην εβδομάδα μηδέν.
Αν έχετε οκτώ bits, πόσα τιμές
μπορεί να σας εκπροσωπεί με πρότυπα μηδενικά και μονάδες;
Ένα-- περισσότερο από αυτό.
Έτσι, 256 συνολικά, αν αρχίζουν να μετρούν από το μηδέν.
Έτσι, αν έχετε οκτώ bits-- οπότε αν εμείς είχε δυαδικό λαμπτήρες μας εδώ και πάλι,
θα μπορούσαμε να μετατρέψουμε αυτές τις λάμπες φωτός για και ανοικτά σε οποιαδήποτε από τις 256 μοναδικά μοτίβα.
>> Τώρα αυτό είναι λίγο προβληματικό.
Όχι τόσο για τα αγγλικά και λατινογενείς γλώσσες, αλλά σίγουρα
όταν σας παρουσιάσουμε, για παράδειγμα, ασιατικές γλώσσες, η οποία
έχουν πολύ περισσότερα σύμβολα παρά σαν 26 γράμματα της αλφαβήτου.
Είμαστε πραγματικά μπορεί να χρειαστεί περισσότερα από ένα byte.
Και ευτυχώς στην Τα τελευταία χρόνια έχει κοινωνίας
υιοθέτησε άλλα πρότυπα που χρησιμοποιούν περισσότερα από ένα byte ανά φόρτιση.
>> Αλλά για τώρα στη C, η προεπιλογή είναι μόνο ένα byte ή οκτώ bits.
Ένας ακέραιος, εν τω μεταξύ, είναι τέσσερις bytes, αλλιώς γνωστή ως 32 bits.
Πράγμα που σημαίνει ό, τι είναι η μεγαλύτερη δυνατή αριθμός που μπορούμε να εκπροσωπεί με έναν int
προφανώς;
Με ένα δισεκατομμύριο.
Έτσι είναι τέσσερα δισεκατομμύρια δώσει ή να πάρει.
2 στην 32η δύναμη, αν αναλάβει καμία αρνητική αριθμούς
και να χρησιμοποιήσουν όλα τα θετικά αριθμοί, είναι τέσσερα δισεκατομμύρια
ή να δώσει δυνατότητες.
Ο πλωτήρας, εν τω μεταξύ, είναι ένα διαφορετικό είδος του τύπου δεδομένων σε C. Είναι ακόμα ένας αριθμός,
αλλά είναι ένας πραγματικός αριθμός.
Κάτι με ένα δεκαδικό σημείο.
Και αποδεικνύεται ότι C χρησιμοποιεί τέσσερα bytes
να αντιπροσωπεύουν τιμές κινητής υποδιαστολής.
>> Δυστυχώς, πόσα πλωτά Σημείο τιμές είναι στον κόσμο εκεί;
Πόσοι πραγματικοί αριθμοί υπάρχουν;
Υπάρχει μια άπειρη τον αριθμό, και γι 'αυτό το θέμα
υπάρχει ένας άπειρος αριθμός των ακεραίων.
Έτσι, είμαστε ήδη το είδος των σκάψιμο εαυτούς μας μια τρύπα εδώ.
Όπου προφανώς computers-- σε Τουλάχιστον προγράμματα γραμμένα σε C για them--
μπορεί μόνο να μετράει ως το τέσσερα δισεκατομμύρια δώσει ή να λάβει,
και τιμές κινητής υποδιαστολής μπορεί μόνο φαινομενικά
έχουν κάποια πεπερασμένη ποσότητα της ακρίβειας.
Μόνο τόσα πολλά ψηφία μετά την υποδιαστολής τους.
>> Επειδή, φυσικά, εάν έχετε μόνο 32 bits,
Δεν ξέρω πώς θα πάμε για να πάει για αντιπροσωπεύουν πραγματικές numbers-- πιθανώς
με διαφορετικούς τύπους μοντέλων.
Αλλά υπάρχει σίγουρα ένα πεπερασμένο αριθμός αυτών των προτύπων,
έτσι και εδώ, αυτό είναι προβληματικό.
>> Τώρα μπορούμε να αποφύγουμε το πρόβλημα ελαφρώς.
Εάν δεν θέλετε να χρησιμοποιήσετε ένα πλωτήρα, μπορείτε να χρησιμοποιήσετε ένα διπλό
σε C, το οποίο σας δίνει οκτώ bytes, το οποίο είναι πολύ πιο πιθανά πρότυπα μηδενικά
και αυτά.
Αλλά είναι ακόμα περιορισμένη, η οποία θα να είναι προβληματική αν γράφετε λογισμικό
για γραφικά ή για φανταχτερά μαθηματικούς τύπους.
Έτσι, ίσως να θέλουν πραγματικά να μετρήσει μέχρι και μεγαλύτερο από αυτό.
Μια μεγάλη long-- βλακωδώς named-- Είναι, επίσης, οκτώ bytes, ή 64 bits,
και αυτό είναι δύο φορές όσο ένα int, και είναι για μεγάλο χρονικό ακέραια τιμή.
>> Fun fact-- αν ένας int είναι τέσσερα bytes, πόσο καιρό είναι μια μεγάλη σε C συνήθως;
Επίσης, τέσσερα bytes, αλλά ένα πολύ καιρό είναι οκτώ bytes,
και αυτό είναι για ιστορικούς λόγους.
>> Αλλά το πακέτο τώρα Είναι απλά ότι τα δεδομένα έχει
να εκπροσωπούνται σε ένα computer-- που είναι μια φυσική συσκευή με το ηλεκτρικό ρεύμα,
αυτό είναι γενικά οδήγηση αυτά τα μηδενικά και ones--
με πεπερασμένες ποσότητες της ακρίβειας.
Έτσι, ποιο είναι το πρόβλημα τότε;
>> Λοιπόν υπάρχει ένα πρόβλημα από υπερχείλιση ακεραίου.
Όχι μόνο σε C, αλλά και σε υπολογιστές γενικότερα.
Για παράδειγμα, εάν αυτό είναι ένα byte αξίζει μια bit--
οπότε αν αυτό είναι οκτώ bit-- όλα εκ των οποίων είναι το νούμερο ένα.
Τι αριθμός είναι αυτή εκπροσωπούν, αν υποθέσουμε
Είναι όλες θετικές τιμές σε δυαδικό;
>> 255, και δεν είναι 256, διότι μηδέν είναι το χαμηλότερο αριθμό.
Έτσι 255 είναι η υψηλότερη ένα, αλλά το πρόβλημα
είναι ας υποθέσουμε ότι ήθελα να προσαύξηση αυτή μεταβλητή που
χρησιμοποιεί οκτώ bits συνολικά αν θέλω να την αυξήσετε.
>> Λοιπόν, το συντομότερο μπορώ να προσθέσω ένα ένα έως όλα από αυτά τα αυτά,
ίσως μπορείτε να φανταστείτε visually-- μόνο σαν να κουβαλά το ένα χρησιμοποιώντας decimals--
κάτι που πρόκειται να ρέει προς τα αριστερά.
Και πράγματι, αν μπορώ να προσθέσω τον αριθμό ένας προς αυτό, τι συμβαίνει σε δυαδική
είναι ότι ξεχειλίζει πίσω στο μηδέν.
>> Έτσι, αν δεν use-- μόνο ένα int, αλλά ένα byte για να μετρήσει ακέραιοι
σε ένα πρόγραμμα, με default-- συντομότερο μπορείτε να πάρετε 250, 251, 252, 253, 254,
255-- 0 έρχεται μετά από 255, η οποία δεν είναι αυτό που είναι πιθανόν να
ένας χρήστης πρόκειται να περιμένουμε.
>> Τώρα, εν τω μεταξύ σε κινητής υποδιαστολής κόσμο, έχετε επίσης ένα παρόμοιο πρόβλημα.
Όχι τόσο με την μεγαλύτερη number-- αν και αυτό είναι ακόμα ένα ζήτημα.
Αλλά με το ποσό της ακρίβειας ότι μπορείτε να εκπροσωπεί.
Έτσι, ας ρίξουμε μια ματιά σε αυτό το παράδειγμα εδώ και από code-- πηγή σημερινή
float-0.c.
>> Και παρατηρήσετε ότι είναι ένα σούπερ απλό πρόγραμμα το οποίο
πρέπει προφανώς να εκτυπώσετε ό, τι τιμή;
Τι μπορείτε να στοιχηματίσετε ότι αυτό πρόκειται να εκτυπώσετε παρόλο που υπάρχει ένα κομμάτι της νέας σύνταξης
εδώ;
Έτσι, ελπίζουμε 0.1.
Έτσι, το ισοδύναμο του ενός δεκάτου γιατί κάνω 1 διαιρείται με 10.
Είμαι αποθήκευση την απάντηση σε μια μεταβλητή που ονομάζεται F.
Αυτή η μεταβλητή είναι τύπου float, η οποία είναι μια λέξη-κλειδί που μόλις πρότεινε υπήρχε.
>> Δεν έχω ξαναδεί κάτι τέτοιο, αλλά Αυτό είναι το είδος της ένα τακτοποιημένο τρόπο στην printf
για να καθορίσετε πόσα ψηφία θέλετε να δείτε μετά την υποδιαστολή.
Έτσι, αυτό το συμβολισμό σημαίνει μόνο ότι εδώ είναι ένα σύμβολο κράτησης θέσης.
Είναι ένα πλωτό σημείο αξίας, και OH, από τον τρόπο,
δείχνουν ότι με το δεκαδικό σημείο με ένας αριθμός μετά το δεκαδικό σημείο.
Έτσι, αυτό είναι ο αριθμός σημαντικών ψηφίων,
να το πω έτσι, ότι μπορεί να θέλετε.
>> Έτσι, επιτρέψτε μου να πάει μπροστά και να κάνουμε κάνει float-0, ./float-0,
και προφανώς 1 διαιρείται με 10 είναι 0,0.
Τώρα γιατί συμβαίνει αυτό;
>> Πάλι καλά, ο υπολογιστής λαμβάνει μου κυριολεκτικά, και έχω γράψει 1
και έχω γράψει 10, και να μαντέψω τι είναι η υποτιθέμενη τύπο δεδομένων για αυτά τα δύο
τιμές;
Μια int, είναι τεχνικά κάτι λίγο διαφορετικό.
Είναι συνήθως μια μακρά, αλλά είναι τελικά αναπόσπαστο αξία.
Δεν είναι μια Μιατιμήκινητήςυποδιαστολής.
>> Ποια είναι να πούμε ότι, αν αυτό είναι μια int και αυτό είναι ένα int,
το πρόβλημα είναι ότι στον υπολογιστή δεν έχει την ικανότητα
για να αποθηκεύσετε ακόμα και σε αυτό το σημείο δεκαδικό.
Έτσι, όταν κάνετε 1 χωρίζεται 10 από τη χρήση ακεραίων
τόσο για τον αριθμητή και το παρονομαστή, η απάντηση πρέπει να είναι 0,1.
Αλλά η computer-- επειδή αυτά είναι integers--
δεν ξέρει τι να κάνει με το 0.1.
>> Έτσι τι είναι αυτό που κάνει καθαρά;
Είναι ακριβώς πετάμε, και ό, τι βλέπω, τελικά,
είναι 0,0 μόνο επειδή επέμενα ότι printf δείξε μου ένα δεκαδικό ψηφίο.
Αλλά το πρόβλημα είναι ότι αν διαιρούν έναν ακέραιο από έναν ακέραιο αριθμό,
θα get-- εξ ορισμού από C-- έναν ακέραιο.
Και δεν πρόκειται να κάνουμε κάτι ωραίο και βολική
όπως και γύρω από αυτό μέχρι το πλησιέστερο προς τα πάνω ή προς τα κάτω.
Είναι πρόκειται να περικόψει πάντα μετά την υποδιαστολή.
>> Έτσι απλά διαισθητικά, αυτό είναι πιθανώς μια λύση;
Ποια είναι η πιο απλή λύση εδώ;
Ναι;
Ακριβώς.
Γιατί δεν μπορούμε απλά τα αντιμετωπίσουμε ως αποτελεσματικά τιμές κινητής υποδιαστολής
μετατρέποντάς τες σε πλωτήρες ή διπλασιάζεται.
Και τώρα αν το κάνω να επιπλέει-0, ή αν συγκεντρώνει άρματα-1,
η οποία είναι πανομοιότυπη με τι ακριβώς προτείνεται.
Και τώρα κάνω άρματα-0, τώρα παίρνω μου 0.1.
>> Τώρα αυτό είναι καταπληκτικό.
Αλλά τώρα θα πάω να κάνω κάτι λίγο διαφορετικό.
Είμαι περίεργος να δω τι είναι πραγματικά συμβαίνει κάτω από το καπό,
και Πάω να εκτυπώσετε αυτό από έως 28 δεκαδικά ψηφία.
Θέλω να δω πραγματικά 0.1000-- ένα infinite--
[Δεν ακούγεται] 27 μηδενικά μετά από αυτό το 0,1.
>> Λοιπόν ας δούμε αν αυτό είναι τι πραγματικά πάρετε.
Κάντε άρματα-0 ίδιο αρχείο.
./floats-0.
Ας μεγεθύνετε την δραματική απάντηση.
Όλο αυτό το διάστημα, θα πάει σκέψης 1 διαιρούμενο με 10 είναι 10%, ή 0,1.
Δεν είναι.
Τουλάχιστον καθόσον η ενδιαφερόμενο υπολογιστή.
>> Τώρα why-- OK, αυτό είναι πλήρης ψέμα 1 διαιρείται με 10 είναι 0,1.
Αλλά why-- ότι δεν είναι σήμερα το πακέτο.
Γιατί λοιπόν ο υπολογιστής νομίζω, σε αντίθεση με όλους εμάς στο δωμάτιο,
ότι 1 διαιρείται με 10 είναι στην πραγματικότητα αυτή η τρελή τιμή;
Τι είναι ο υπολογιστής κάνει τα φαινόμενα;
Τι είναι αυτό;
>> Δεν είναι υπερχείλιση, per se.
Υπερχείλιση είναι συνήθως όταν τυλίξτε γύρω από μια αξία.
Είναι το θέμα της ασάφειας σε ένα Μιατιμήκινητήςυποδιαστολής
όπου έχετε μόνο 32 ή ίσως ακόμη και 64 bit.
Αλλά αν υπάρχει μια άπειρη τον αριθμό των πραγματικών numbers--
αριθμούς με δεκαδικά σημεία και οι αριθμοί thereafter-- σίγουρα
δεν μπορεί να αντιπροσωπεύει όλα αυτά.
Έτσι, ο υπολογιστής έχει δοθεί μας το πιο κοντινό αγώνα
με την αξία που μπορεί να αντιπροσωπεύουν τη χρήση που πολλά κομμάτια για την τιμή που πραγματικά θέλετε,
η οποία είναι 0,1.
>> Δυστυχώς, αν να αρχίσει να κάνει τα μαθηματικά, ή θα
αρχίσετε τη συμμετοχή αυτού του είδους των πλωτών τιμές σημείο σε σημαντικό programs--
οικονομικού λογισμικού, στρατιωτική software-- τίποτα
όπου η αντίληψη είναι πιθανώς αρκετά σημαντικό.
Και θα αρχίσετε να προσθέτετε αριθμοί, όπως αυτή, και την έναρξη
που τρέχει το λογισμικό με πολύ μεγάλες εισροές
ή για πολλές ώρες ή παρτίδων ημερών ή πολλά χρόνια,
αυτά τα μικροσκοπικά μικρά λάθη σίγουρα μπορεί να προσθέσει μέχρι την πάροδο του χρόνου.
>> Τώρα, ως ένα μέρος, αν έχετε ποτέ δει Superman 3 ή Office Space
και μπορείτε να ανακαλέσετε πώς αυτοί οι τύποι έκλεψε
πολλά χρήματα από τον υπολογιστή τους χρησιμοποιώντας τιμές κινητής υποδιαστολής
και προσθέτοντας την μικρή κατάλοιπα, ελπίζουμε ότι η ταινία
τώρα περισσότερο νόημα.
Αυτό είναι ό, τι ήταν αναφερόμενος στην εν λόγω ταινία.
Το γεγονός ότι οι περισσότεροι εταιρείες δεν θα δούμε
μετά από ένα ορισμένο αριθμό δεκαδικών ψηφίων,
αλλά αυτά είναι κλάσματα λεπτών.
Έτσι θα αρχίσετε να πρόσθεση, θα αρχίσετε να κάνετε πολλά χρήματα
στον τραπεζικό λογαριασμό σας.
Έτσι, αυτό είναι το Office Space εξήγησε.
>> Τώρα, δυστυχώς, πέρα ​​από Office Space, υπάρχει
είναι μερικά νόμιμα ανησυχητικά και σημαντικές επιπτώσεις
από αυτά τα είδη υποκείμενη αποφάσεις σχεδιασμού,
και μάλιστα ένας από τους λόγους χρησιμοποιούμε C κατά τη διάρκεια
είναι έτσι ώστε να έχετε πραγματικά αυτό το έδαφος μέχρι την κατανόηση του πώς λειτουργούν οι υπολογιστές,
πώς το λογισμικό λειτουργεί, και δεν θεωρούμε τίποτε δεδομένο.
>> Και πράγματι, δυστυχώς, ακόμη και με ότι τα θεμελιώδη κατανόηση,
εμείς οι άνθρωποι κάνουν λάθη.
Και τι σκέφτηκα να μοιραστώ είναι Αυτό οκτώ λεπτών βίντεο που υιοθετείται εδώ
από ένα επεισόδιο σύγχρονα θαύματα, τα οποία είναι μια εκπαιδευτική παράσταση για το πώς λειτουργούν τα πράγματα
ότι ζωγραφίζει δύο εικόνες της, όταν μια ακατάλληλη χρήση
και την κατανόηση των τιμές κινητής υποδιαστολής
οδήγησε σε κάποια σημαντική ατυχή αποτελέσματα.
Ας ρίξουμε μια ματιά.
[VIDEO PLAYBACK]
-Εμείς Τώρα να επιστρέψει στο "Μηχανική Καταστροφές "για σύγχρονα θαύματα.
Υπολογιστές.
Έχουμε όλοι έρχονται να αποδεχθούν το Συχνά τα προβλήματα απογοητευτικό ότι
πήρε με them-- σφάλματα, ιούς, και glitches-- λογισμικού για μικρές τιμές
να πληρώσουν για την ευκολία.
Αλλά σε υψηλής τεχνολογίας και υψηλής ταχύτητας στρατιωτικές και διαστημικές εφαρμογές του προγράμματος,
το μικρότερο πρόβλημα που μπορεί να να μεγεθυνθεί σε καταστροφή.
>> Στις 4 Ιουνίου του 1996, οι επιστήμονες που παρασκευάζονται να ξεκινήσει ένα μη επανδρωμένο πύραυλο Ariane 5.
Μετέφερε την επιστημονική δορυφόροι έχουν σχεδιαστεί
να προσδιοριστεί με ακρίβεια το πώς η Μαγνητικό αλληλεπιδρά πεδίο της Γης
με τους ηλιακούς ανέμους.
Ο πύραυλος χτίστηκε για η Ευρωπαϊκή Υπηρεσία Διαστήματος,
και ανασηκώνεται από την εγκατάσταση του στην ακτή της Γαλλικής Γουιάνας.
>> -Κατά Περίπου 37 δευτερόλεπτα σε η πτήση, που πρώτη
παρατηρήσει κάτι δεν πήγαινε καλά.
Ότι τα ακροφύσια ήταν περιστρεφόμενο με έναν τρόπο που πραγματικά δεν θα έπρεπε.
Περίπου 40 δευτερόλεπτα σε πτήση, σαφώς το όχημα ήταν σε μπελάδες,
και ότι όταν έκαναν η απόφαση να το καταστρέψουν.
Ο ανώτερος υπάλληλος ασφάλειας, με τεράστια κότσια, πατηθεί το κουμπί
και ανατίναξαν τον πύραυλο πριν θα μπορούσε να γίνει ένας κίνδυνος για τη δημόσια ασφάλεια.
>> -Αυτό Ήταν η παρθενική ταξίδι του Ariane 5,
και την καταστροφή του πήρε τοποθετήστε λόγω του ελαττώματος
ενσωματωμένο στο λογισμικό του πυραύλου.
-Το Πρόβλημα για το Ariane ήταν ότι υπάρχει
ήταν ένας αριθμός που απαιτείται 64 bits για να εκφράσουν,
και ήθελαν να μετατρέψουν σε έναν αριθμό 16-bit.
Υπέθεσαν ότι ο αριθμός Ποτέ δεν επρόκειτο να είναι πολύ μεγάλο.
Ότι τα περισσότερα από αυτά τα ψηφία σε ο αριθμός 64-bit ήταν μηδενικά.
Θα ήταν λάθος.
>> -Το Ανικανότητα ενός πρόγραμμα λογισμικού για να δεχθεί
το είδος του αριθμού που παράγεται από άλλος ήταν στη ρίζα της αποτυχίας.
Ανάπτυξη λογισμικού είχε γίνει πολύ δαπανηρό μέρος της νέας τεχνολογίας.
Η Ariane 4 πύραυλος είχε ήταν πολύ επιτυχημένη.
Τόσο μεγάλο μέρος του λογισμικού που δημιουργήθηκε για χρησιμοποιήθηκε επίσης στον Ariane 5.
>> -Το Βασικό πρόβλημα ήταν ότι η Ariane 5.
Ήταν faster-- επιταχύνεται γρηγορότερα, και το λογισμικό δεν είχαν λάβει υπόψη αυτό.
>> -Το Καταστροφή του πυραύλου ήταν μια τεράστια οικονομική καταστροφή.
Όλα οφείλονται σε ένα λάθος λεπτό λογισμικού.
Αλλά αυτό δεν ήταν το πρώτο χρόνο τα προβλήματα μετατροπής δεδομένων
είχε ταλαιπωρήσει τη σύγχρονη τεχνολογία πυραύλων.
>> -Σε 1991, με την έναρξη του πρώτου Πολέμου του Κόλπου,
η πυραύλων Patriot βιώσει μια παρόμοια είδη
ενός προβλήματος μετατροπής αριθμού.
Και ως αποτέλεσμα 28 people-- 28 American soldiers-- σκοτώθηκαν,
και περίπου εκατό τραυματίες.
Όταν το Patriot, που υποτίθεται για την προστασία από τις εισερχόμενες Σκαντ,
απέτυχε να βάλει φωτιά σε ένα βλήμα.
>> -Όταν Ιράκ εισέβαλε στο Κουβέιτ, και την Αμερική ξεκίνησε Desert Storm στις αρχές του 1991,
Patriot συστοιχίες πυραύλων αναπτύχθηκαν να προστατεύσει τη Σαουδική Αραβία και το Ισραήλ
από το ιρακινό πυραυλικές επιθέσεις Scud.
Το Patriot είναι ένα μεσαίου βεληνεκούς ΗΠΑ επιφάνεια-αέρος σύστημα
κατασκευάζονται από την εταιρεία Raytheon.
>> -Το Μέγεθος του Patriot αναχαίτισης itself--
Είναι μεγάλη για περίπου 20 πόδια, και ζυγίζει περίπου 2.000 κιλά.
Και αυτό φέρνει μια κεφαλή πυραύλου περίπου, Νομίζω ότι είναι περίπου 150 κιλά.
Και η ίδια η κεφαλή είναι ένα υψηλό εκρηκτικό, που
έχει θραύσματα γύρω του.
Έτσι ώστε το περίβλημα του είναι κεφαλή σχεδιασμένο να λειτουργεί σαν ένα σκάγι.
>> -Οι Πύραυλοι μεταφέρονται τέσσερις ανά εμπορευματοκιβώτιο,
και μεταφέρονται από ένα ημι ρυμουλκούμενο.
>> -Το Σύστημα Patriot αντιπυραυλικού πηγαίνει πίσω τουλάχιστον 20 χρόνια τώρα.
Αρχικά είχε σχεδιαστεί ως αντιπυραυλικής άμυνας αέρα
να καταρρίψουν αεροπλάνα του εχθρού.
Στο πρώτο Πόλεμο του Κόλπου όταν ο πόλεμος ήρθε,
ο στρατός ήθελε να το χρησιμοποιήσετε για να καταρρίψουν Σκαντ, όχι αεροπλάνα.
Η Ιρακινή Πολεμική Αεροπορία ήταν δεν είναι τόσο μεγάλο πρόβλημα,
αλλά ο στρατός ήταν ανησυχούν για Σκαντ.
Και έτσι προσπάθησαν να αναβάθμιση του Patriot.
>> -Intercepting Έναν εχθρό πύραυλος ταξιδεύει σε Mach 5
επρόκειτο να είναι αρκετά δύσκολο.
Αλλά όταν το Patriot έσπευσε σε λειτουργία,
ο στρατός δεν γνώριζε Ιρακινός τροποποίηση ότι
έκανε scuds τους σχεδόν αδύνατο σε αυτό.
>> Τι συνέβη είναι ότι τα Σκαντ έρχονταν ήταν ασταθής.
Θα ήταν ταλαντευόμενος.
Ο λόγος για αυτό ήταν οι Iraqis-- προκειμένου να πάρει 600 χιλιόμετρα έξω
από μια σειρά missile-- 300 χιλιομέτρων πήρε το βάρος από την μπροστινή κεφαλή,
και γίνεται η κεφαλή αναπτήρα.
Μέχρι τώρα το Patriot προσπαθεί να έρθει στο Scud, και το μεγαλύτερο μέρος της time--
η συντριπτική πλειοψηφία των time-- θα πετάξει ακριβώς από το Scud.
>> -Μόλις Τους διαχειριστές συστημάτων Patriot συνειδητοποίησε το Patriot έχασε το στόχο της,
που πυροδότησε κεφαλή του Patriot του να αποφευχθούν πιθανές απώλειες εάν
αφέθηκε να πέσει στο έδαφος.
>> -Αυτό Ήταν αυτό που οι περισσότεροι άνθρωποι έβλεπαν όπως μεγάλες πύρινες σφαίρες στον ουρανό,
και παρερμηνευθεί ως παρακολουθήσεις των Scud κεφαλές.
>> Αν και με τις νυχτερινό ουρανό, πατριώτες φάνηκε να καταστρέφει επιτυχώς
Scuds, στο Νταχράν θα μπορούσε να υπάρξει κανένα λάθος σχετικά με τις επιδόσεις του.
Υπάρχει σύστημα ραντάρ του Patriot του χάσει τα ίχνη της εισερχόμενης Scud
και ποτέ δεν ξεκίνησε λόγω σε ένα ελάττωμα του λογισμικού.
>> Ήταν οι Ισραηλινοί που ανακαλύφθηκε για πρώτη φορά ότι το πλέον το σύστημα ήταν σχετικά,
μεγαλύτερη είναι η χρονική διαφορά έγινε.
Οφείλεται σε ένα ρολόι ενσωματωμένο στον υπολογιστή του συστήματος.
>> -Περίπου Δύο εβδομάδες πριν η τραγωδία στο Νταχράν,
οι Ισραηλινοί αναφερθεί το Υπουργείο Άμυνας
ότι το σύστημα είχε χάσει χρόνο.
Μετά από περίπου οκτώ ώρες τρέξιμο, παρατήρησαν
ότι το σύστημα είναι όλο και αισθητά λιγότερο ακριβείς.
Το Υπουργείο Άμυνας ανταποκρίθηκε λέει όλες τις μπαταρίες Patriot
να μην αφήσει τα συστήματα για μεγάλο χρονικό διάστημα.
Ποτέ δεν είπε τι ένα μεγάλο χρονικό διάστημα ήταν.
8 ώρες, 10 ώρες, χιλιάδες ώρες.
Κανείς δεν ήξερε.
>> -Το Μπαταρία Patriot σταθμεύουν στους στρατώνες
σε Dhahran και λανθασμένη εσωτερική της ρολόι ήταν σε πάνω από 100 ώρες
το βράδυ της 25ης Φεβρουαρίου.
>> -Είναι Παρακολουθούνται χρόνο με ακρίβεια από περίπου ένα δέκατο του δευτερολέπτου.
Τώρα ένα δέκατο του δευτερολέπτου είναι μια ενδιαφέρουσα αριθμός
επειδή δεν μπορεί να εκφραστεί σε δυαδική ακριβώς, η οποία
σημαίνει ότι δεν μπορεί να εκφραστεί ακριβώς σε κάθε σύγχρονο ψηφιακό υπολογιστή.
Είναι δύσκολο να πιστέψει κανείς, αλλά χρησιμοποιήσετε αυτό ως ένα παράδειγμα.
>> Ας πάρουμε τον αριθμό του ενός τρίτου.
Ένα τρίτο δεν μπορεί να είναι Εκφράζεται σε δεκαδική ακριβώς.
Ένα τρίτο είναι 0.333 συνεχίζεται για το άπειρο.
Δεν υπάρχει τρόπος να το κάνουμε αυτό με απόλυτη ακρίβεια σε ένα δεκαδικό.
Αυτό είναι ακριβώς το είδος του προβλήματος που συνέβη στο Patriot.
Το πλέον το σύστημα έτρεξε, η χειρότερα το σφάλμα χρόνου έγινε.
>> -Μετά 100 ώρες λειτουργίας, η σφάλμα στο χρόνο ήταν μόνο περίπου το ένα τρίτο
του δευτερολέπτου.
Αλλά από την άποψη του στόχου για ένα πύραυλος ταξιδεύει σε Mach 5,
οδήγησε σε ένα εντοπισμού σφάλμα του πάνω από 600 μέτρα.
Θα ήταν μοιραίο λάθος για τους στρατιώτες στο Νταχράν.
>> Τι συνέβη είναι μια εκτόξευση Scud ήταν ανιχνεύονται από την έγκαιρη προειδοποίηση των δορυφόρων,
και ήξεραν ένα Scud ερχόταν στη γενική κατεύθυνσή τους.
Δεν ξέρω από πού ερχόταν.
Ήταν τώρα μέχρι το ραντάρ συνιστώσα του συστήματος Patriot
υπεράσπιση Dhahran για να εντοπίσετε και να κρατήσει κομμάτι της εισερχόμενης εχθρός πυραύλων.
>> -Το Ραντάρ ήταν πολύ έξυπνος.
Θα ήταν πραγματικά παρακολουθείτε η θέση του Scud
και στη συνέχεια να προβλέψουμε, όπου κατά πάσα πιθανότητα θα είναι
Την επόμενη φορά που ο ραντάρ, έστειλε έναν παλμό έξω.
Αυτό ονομαζόταν η πύλη φάσμα.
>> -Τότε Μία φορά την Patriot αποφασίζει αρκετό χρόνο έχει
περάσει για να πάει πίσω και να ελέγξετε το επόμενο θέση για αυτό το αντικείμενο που εντοπίστηκε
πηγαίνει πίσω.
Έτσι, όταν πήγε πίσω στο λάθος θέση, τότε δεν βλέπει κανένα αντικείμενο.
Και αποφασίζει ότι δεν υπήρχε κανένα αντικείμενο.
Ότι υπήρχε μια ψευδή ανίχνευση και πέφτει το κομμάτι.
>> -Το Εισερχόμενη Scud εξαφανίστηκε από την οθόνη του ραντάρ,
και δευτερόλεπτα αργότερα, συγκρούστηκε με τους στρατώνες.
Η Scud σκότωσε 28.
Ήταν η τελευταία καύση κατά τη διάρκεια του πρώτου Πολέμου του Κόλπου.
Τραγικά, το ενημερωμένο λογισμικό έφτασε τα ξημερώματα της επόμενης ημέρας.
Το ελάττωμα του λογισμικού είχε ήταν σταθερή, το κλείσιμο
ένα κεφάλαιο στην ταραγμένη ιστορία των πυραύλων Patriot.
>> [ΤΕΛΟΣ VIDEO PLAYBACK]
>> DAVID J. MALAN: Αυτό είναι για το CS50.
Θα σας δούμε την Τετάρτη.
>> [ΜΟΥΣΙΚΗ ΠΑΙΖΟΝΤΑΣ]