David J. Malan: Αυτό είναι CS50 και αυτή είναι η αρχή της εβδομάδας τέσσερα. Και, αγόρι, είναι η Volkswagen σε κόπο όλα αυτά εξαιτίας του λογισμικού. Ας ρίξουμε μια ματιά. [ΑΝΑΠΑΡΑΓΩΓΗ] -Cars, Το πιο έξυπνο χαρακτήρες στους Γρήγορη και Furious ταινίες. Αυτή την εβδομάδα γερμανική αυτοκινητοβιομηχανία Η Volkswagen βρέθηκε στη μέση ενός σκανδάλου του ενδεχομένως ποινικές διαστάσεις. -Volkswagen Βρίσκεται προ των πυλών για δισεκατομμύρια σε πρόστιμα, ποινικές διώξεις δυνατό για τα στελέχη του, όπως η εταιρεία απολογείται για νοθεία 11 εκατομμύρια αυτοκίνητα σε τη βοηθήσει να νικήσει δοκιμές εκπομπών. -Ορισμένες Πετρελαιοκίνητα μοντέλα ήταν σχεδιαστεί με εξελιγμένο λογισμικό ότι τα μεταχειρισμένα πληροφορίες, συμπεριλαμβανομένης της θέση του συστήματος διεύθυνσης και του οχήματος SPEED για να καθορίσετε το αυτοκίνητο ήταν υποβάλλονται σε δοκιμές για τις εκπομπές. Κάτω από αυτές τις περιστάσεις, ο κινητήρας θα μειώσει τις εκπομπές τοξικών. Όμως, το αυτοκίνητο ήταν στημένα στην παράκαμψη ότι όταν ήταν να κινούνται. Οι εκπομπές αυξήθηκαν 10-40 φορές πάνω από τα αποδεκτά επίπεδα EPA. [Σταματήσετε την αναπαραγωγή] David J. Malan: Ας ρίξτε μια ματιά σε αυτό και να δούμε ακριβώς πώς αυτό θα μπορούσε να εφαρμοστεί και πώς αυτό θα μπορούσε να επηρεάσει τόσα πολλά αυτοκίνητα σαν αυτό. Έτσι, στο χέρι μου εδώ είναι ο τύπος απελευθέρωσης που εκδόθηκε από την EPA-- η Περιβαλλοντική Οργανισμός προστασίας που είναι ο ρυθμιστικός οργανισμός των ΗΠΑ που χειρίζεται τις περιβαλλοντικές ανησυχίες, και τότε το πραγματικό Ανακοίνωση νομικού περιεχομένου, που ήταν αποστέλλουν στην Volkswagen μόλις πριν από λίγες ημέρες. Έτσι, η EPA γράφει, και αποκαλύπτει τώρα δημοσίως, ένα εξελιγμένο λογισμικό αλγόριθμος για ορισμένα Οχήματα της Volkswagen ανιχνεύει όταν το αυτοκίνητο διέρχεται δοκιμή επίσημες εκπομπές και τελικά την πλήρη εκπομπές ελέγχει μόνο κατά τη διάρκεια της δοκιμής. Η αποτελεσματικότητα του Αυτά τα οχήματα της ρύπανσης συσκευές ελέγχου των εκπομπών είναι σημαντικά μειωμένη κατά τη διάρκεια όλων κανονικής οδήγησης καταστάσεις. Αυτό έχει ως αποτέλεσμα τα αυτοκίνητα που πληρούν τις πρότυπα στο εργαστήριο ή δοκιμή σταθμό, αλλά κατά τη διάρκεια της κανονικής λειτουργίας εκπέμπουν oxides-- αζώτου ή NOx-- σε ποσοστό μέχρι και 40 φορές το πρότυπο. Το λογισμικό που παράγεται από τη Volkswagen είναι μια συσκευή απόσπασμα εισαγωγικά, ήττα, όπως ορίζεται από την Clean Air Act στις ΗΠΑ. Πηγαίνουν για να πω ότι η EPA και ένα άλλο γραφείο Ανοιχτό το σύστημα αναστολής λογισμικού μετά ανεξάρτητη ανάλυση από τους ερευνητές στο West Virginia University. Ρύπανση NOx συμβάλλει στην το διοξείδιο του αζώτου, το όζον της τροπόσφαιρας, και τα λεπτά σωματίδια. Η έκθεση σε αυτά ρύπων έχει συνδεθεί με ένα ευρύ φάσμα από σοβαρές επιπτώσεις στην υγεία, συμπεριλαμβανομένης της αυξημένης άσθμα επιθέσεις και άλλες αναπνευστικές ασθένειες που μπορεί να είναι αρκετά σοβαρή να στείλει ανθρώπους στο νοσοκομείο. Η έκθεση σε όζον και σωματιδίων έχει επίσης έχουν συσχετιστεί με πρόωρο θάνατο λόγω αναπνευστικής σχετικές ή καρδιαγγειακές επιδράσεις που σχετίζονται. Τα παιδιά, οι ηλικιωμένοι, τα άτομα με προϋπάρχουσα ασθένεια του αναπνευστικού συστήματος είναι ιδιαίτερα σε κίνδυνο για επιπτώσεις στην υγεία των ρύπων αυτών. Συναφώς, πρέπει να πω, είναι αρκετά σοβαρή. Και ας πάμε για να διαβάσετε ένα ακόμα απόσπασμα και, στη συνέχεια, θα ρίξουμε μια ματιά οι υποκείμενες επιπτώσεις αυτού στο πλαίσιο ενός αυτοκινήτου. Συγκεκριμένα, η Volkswagen κατασκευαστεί και εγκατασταθεί λογισμικού στην λεγόμενη ηλεκτρονικού ελέγχου module-- ή ECM-- της τα οχήματα που αισθάνθηκε όταν το όχημα που δοκιμάζεται για συμμόρφωση με τα πρότυπα εκπομπών EPA. Με βάση τα διάφορα δεδομένα συμπεριλαμβανομένων της θέση του τιμονιού, όχημα ταχύτητα, η διάρκεια της μηχανής λειτουργία, και η βαρομετρική πίεση, Ακριβώς αυτές οι είσοδοι παρακολουθούνται οι παράμετροι του ομοσπονδιακού διαδικασία δοκιμής που χρησιμοποιούνται για δοκιμών εκπομπών για την πιστοποίηση EPA σκοπούς. Κατά τη διάρκεια της δοκιμής εκπομπών της EPA, το λογισμικό οχήματα ECM έτρεξαν το λογισμικό που παράγεται αποτελέσματα συμβατό εκπομπές. Σε όλες τις άλλες περιπτώσεις, η λογισμικό ECM όχημα έτρεξε ένα ξεχωριστό δρόμο βαθμονόμησης το οποίο μειώνεται η αποτελεσματικότητα του συνολικού συστήματος ελέγχου των εκπομπών, συγκεκριμένα η εκλεκτική καταλυτική μείωση του Lean NOx trap-- το οποίο θα δούμε περίπου σε μια στιγμή. Ως αποτέλεσμα, οι εκπομπές ΝΟχ αυξήθηκε κατά ένα συντελεστή 10 έως 40 φορές πάνω από τα επίπεδα συμβατά EPA ανάλογα με τον τύπο του κύκλου οδήγησης. Έτσι αυτό σημαίνει πραγματικά, και η πηγαίο κώδικα για τη λειτουργία του λογισμικού σχετικά με τις Volkswagen δεν έχει ακόμη δημοσιοποιηθεί, είναι ότι, αποτελεσματικά, αυτό ισοδύναμο είναι κάπου εκεί μέσα του κώδικα της Volkswagen. Εάν δοκιμάζονται, και αν το αυτοκίνητο ανιχνεύει ορισμένων περιβαλλοντικών παραγόντων όπως το τιμόνι θέση ή η κίνηση ή η έλλειψη αυτής του αυτοκινήτου ή οποιοσδήποτε αριθμός από άλλους παράγοντες που είναι σήμερα η υπόθεση να είναι μέρος αυτού του τύπου, απλά ενεργοποιήστε πλήρη έλεγχο των εκπομπών. Με άλλα λόγια, αρχίζουν εκπέμπουν λιγότερο από τους ρύπους. Αλλιώς, σε κάθε άλλη περίπτωση όταν δεν διαπιστώνεται ότι είναι στο εργαστήριο, το μόνο που δεν το κάνουν. Και έτσι μπορείτε να απλοποιήσετε αυτό σε πιο σκυρόδεμα ψευδοκώδικα με κάτι σαν αυτό. Αν οι τροχοί στρέφονται, αλλά το τιμόνι δεν είναι, ενδεικτικά ότι το αυτοκίνητο είναι σε μερικά είδος περιστρεφόμενου κυλίνδρου αλλά σε κάποιο είδος του αποθήκη που δοκιμάζεται, τότε συμπεριφέρονται όπως η EPA θα θέλαμε. Διαφορετικά, δεν το κάνουν. Έτσι, ας ρίξουμε μια ματιά σε ένα σύντομο βίντεο που ρίχνει μια ματιά σε αυτό που οι επιπτώσεις είναι αυτό πραγματικά μηχανικά. [ΑΝΑΠΑΡΑΓΩΓΗ] -Τελευταία Παρασκευή EPA ανακοίνωσε ότι ορισμένοι Αυτοκίνητα Volkswagen Audi πραγματοποιηθεί από το 2009 και φέτος χρησιμοποιούσαν το λεγόμενο σύστημα αναστολής για να πάρει γύρω από τους νόμους εκπομπών σχεδιασμένο για να κρατήσει τον αέρα καθαρό. Αλλά τι σημαίνει αυτό ακριβώς; Λοιπόν, τα σύγχρονα αυτοκίνητα έχουν δεκάδες των υπολογιστών στο εσωτερικό τους. Και μερικοί από αυτούς τους υπολογιστές συμβάλλει στο συντονισμό των λειτουργιών του κινητήρα για βέλτιστη απόδοση, ενώ φροντίζοντας ότι δεν υπάρχει πάρα πολύ τα σκουπίδια που βγαίνει από το σωλήνα της εξάτμισης. Έχουν πράγματι εργάζονται Με αυτό τον τρόπο για αρκετές δεκαετίες τώρα. Βασικά, κάθε μέρος του κινητήρα ενός σύγχρονου αυτοκινήτου διαθέτει έναν αισθητήρα ή τον ελεγκτή σε αυτό, και αυτούς τους υπολογιστές διαβάζετε δεδομένα σε χιλιάδες φορές ανά δευτερόλεπτο προσαρμογές αποφάσεων όπως η αναλογία καυσίμου προς αέρα ότι πρόκειται μέσα στους κυλίνδρους. Αυτά εξαπάτηση Volkswagen και τα μοντέλα της Audi είναι πετρελαιοκίνητα, και πετρελαιοκινητήρες έχουν ένα ακόμη πραγματικά σημαντικό υπολογιστή ελεγχόμενες παραμέτρους, η οποία είναι η ποσότητα άκαυστου καυσίμου θα στην εξάτμιση. Τώρα που ακούγεται άσχημα. Δεν ακούγεται σαν εσάς θα θέλατε άκαυτο καύσιμο να εισέλθει στην εξάτμιση. Αλλά στην περίπτωση ενός ντίζελ, έχετε κάτι ονομάζεται παγίδα NOx, το οποίο είναι μια συσκευή που απορροφά και παγίδες για τα οξείδια του αζώτου που είναι ρύπους που ενδέχεται να Αλλιώς πηγαίνετε στην ατμόσφαιρα. Και το αποτέλεσμα αυτής της παγίδας NOx ενισχύεται με άκαυτο καύσιμο. Έτσι μια συσκευή η ήττα είναι ένα ειδικό πρόγραμμα μέσα σε αυτούς τους υπολογιστές που μπορούν να το κάνουν μοιάζει με το αυτοκίνητο ανταποκρίνεται εκπομπών πρότυπα, ακόμη και όταν αυτό δεν συμβαίνει. Η Volkswagen είχε ένα πρόβλημα στα χέρια του. Πετρελαιοκινητήρες του ήταν γνωστά για να πάρει μεγάλη οικονομία καυσίμου, αλλά η παγίδα NOx λειτουργεί μόνο καλά όταν περισσότερο καύσιμο που χρησιμοποιείται. Έτσι, το αυτοκίνητο θα ανιχνεύσει, χρησιμοποιώντας αυτή τη συσκευή ήττα, όταν είχε πάρει μια εκπομπών δοκιμή, θα χρησιμοποιήσει περισσότερα καύσιμα, κάνουν τη δουλειά παγίδα NOx καλά, εκπομπές θα ήταν μια χαρά. Αλλά τότε μπορείτε να πάρετε στο δρόμο, τη συσκευή σβήνει, καίτε λιγότερα καύσιμα αλλά βάζετε όσο 40 φορές περισσότερους ρύπους στην ατμόσφαιρα. Αλλά πώς στο καλό το έκανε το αυτοκίνητο γνωρίζουν ότι ήταν δοκιμάζονται ως προς τις εκπομπές; Η EPA λέει ότι ήταν ένα εξελιγμένο σύστημα που ελέγχεται πράγματα όπως η θέση του τιμονιού, ταχύτητα, πόσο καιρό ο κινητήρας ήταν, και ακόμη και η ατμοσφαιρική πίεση. Με άλλα λόγια, υπήρχε κανένας τρόπος αυτό ήταν τυχαίο επειδή το λογισμικό ήταν σχεδιαστεί πολύ προσεκτικά για τον εντοπισμό δοκιμασία επίσημες εκπομπές. Αυτή είναι κάποια αρκετά σοβαρά εξαπάτηση και ότι είναι γιατί η Volkswagen είναι σε όπως σοβαρό πρόβλημα. Στην πραγματικότητα, CEO τους, Martin Winterkorn, μόλις παραιτήθηκε. Λοιπόν, τι θα συμβεί στη συνέχεια; Λοιπόν, εάν είστε ένας από τους μισό εκατομμύριο Jettas ντίζελ, Beatles, Μακρά κάλτσες, Passats, ή Audi A3s πραγματοποιηθεί, Τα καλά νέα είναι ότι ότι το αυτοκίνητό σας είναι ακόμα ασφαλές στην οδήγηση. Δεν χρειάζεται να το βάλετε στην άκρη έως ότου η Volkswagen εκδίδει ανάκληση. Αλλά σε κάποιο σημείο από όπου και αν κατά πάσα πιθανότητα θα έχουν να ενημερώσετε το λογισμικό στο εσωτερικό του αυτοκινήτου σας. Όταν συμβαίνει αυτό ίσως πάρετε λιγότερα μίλια ανά δεξαμενή. Οι δικηγόροι έχουν ήδη ετοιμάζονται για αγωγές ταξική δράση έτσι ώστε οι ιδιοκτήτες θα μπορούσε να πάρει αποζημίωση σε κάποιο σημείο στο μέλλον. Αλλά αυτό δεν πρόκειται να να συμβεί οποιαδήποτε στιγμή σύντομα. [Σταματήσετε την αναπαραγωγή] David J. Malan: Έτσι, αυτό αυξάνει πραγματικά μια ενδιαφέρουσα μεγαλύτερο ερώτημα εικόνα ώστε να εμπιστεύονται. Σωστά; Όλοι μας έχουμε iPhones ή ανδροειδή ή κάτι στις τσέπες μας πιο πιθανό Αυτές τις μέρες, ή φορητούς υπολογιστές στα πόδια μας, που είναι τρέχει το λογισμικό που είναι από Apple και η Microsoft και τσαμπιά από άλλες εταιρείες. Αλλά πώς ξέρουμε ότι αυτό που αυτά τα προϊόντα λογισμικού που κάνει είναι στην πραγματικότητα ό, τι αυτοί εταιρείες λένε ότι κάνουν; Για παράδειγμα, ποιος μπορεί να να πω ότι κάθε φορά που πραγματοποιήσετε μια κλήση στο iPhone σας ή Android τηλέφωνο ή τα παρόμοια, ότι ο αριθμός τηλεφώνου δεν είναι, επίσης, να ανεβάσει στο διακομιστή κάποιου εταιρείας λόγω κάποιου προγράμματος που έχετε γραπτή, είτε πρόκειται για το λειτουργικό το ίδιο σύστημα όπως το iOS ή Android, ή επειδή έχετε κατεβάσει μερικά τρίτο party εφαρμογή ότι κατά κάποιον τρόπο ακούει σε ό, τι πληκτρολογείτε ή ό, τι είστε πραγματικά λέγοντας. Πώς ξέρετε ότι, όταν Τα παιδιά τρέχουν να σας Clang ή κάνει για να συντάξει σας το δικό της λογισμικό σε CS50, πώς μπορείτε να κάνετε τη δική προσωπικό ότι CS50 είναι, μέσω της βιβλιοθήκης CS50, δεν έχει την καταγραφή κάθε χορδή που έχετε πάρει ποτέ ή κάθε ίντσα έχετε πάρει ποτέ; Λοιπόν, θα μπορούσε σίγουρα ματιά τον πηγαίο κώδικα για κάτι όπως η βιβλιοθήκη CS50, που θα μπορούσε να εξετάσει τον πηγαίο κώδικα για το λειτουργικό σύστημα Linux εκτελείται σε CS50 IDE. Αλλά μια καταπληκτική παρουσίαση δόθηκε το 1984 στην παραλαβή του βραβείου Turing με ένα πολύ διάσημος επιστήμονας υπολογιστών γνωστή as-- ονομάζεται Ken Thompson ο οποίος έλαβε το Βραβείο Turing η οποία Είναι το είδος της επιστήμης των υπολογιστών Βραβείο Νόμπελ, αν θέλετε, για το έργο του σχετικά με ένα λειτουργικό σύστημα που ονομάζεται Unix, η οποία είναι πολύ παρόμοια σε πνεύμα με αυτό που χρησιμοποιούν οι οποίες είναι το Linux. Και το ερώτημα που ζήτησε στο έργο του ομιλία αποδοχής, κατ 'ουσίαν, για τον καθορισμό του πλαισίου για την χρόνια και χρόνια συζητήσεων για την εμπιστοσύνη και την ασφάλεια, ήταν αυτό. Σε ποιο βαθμό πρέπει να έχουμε εμπιστοσύνη ένα δήλωση ότι program-- ένα κομμάτι της software-- είναι απαλλαγμένο από δούρειους ίππους; Ίσως είναι πιο σημαντικό να εμπιστεύονται οι άνθρωποι που έγραψε το λογισμικό. Και στην πραγματικότητα, έχουμε συνδεδεμένο στη συζήτηση που είχε έδωσε κατά την αποδοχή αυτού του βραβείου στη δεκαετία του '80 στην ιστοσελίδα του CS50 υπό την σελίδα Διαλέξεις για σήμερα. Διότι τι θα δείτε είναι ότι δίνει πραγματικά μια αρκετά απλό παράδειγμα για το πώς ακόμα ένας compiler όπως Clang ή οτιδήποτε άλλο compilers άλλοι έχουν χρησιμοποιηθεί στο παρελθόν, Τι κι αν είναι ενσωματωμένες στο πρόγραμμα μεταγλώττισης μας οι ίδιοι που χρησιμοποιείτε είναι λίγο, αν κατάσταση που ουσιαστικά λέει, εάν παρατηρήσετε ότι αυτός ο κώδικας χρησιμοποιεί η λειτουργία GetString ή η GetInt λειτουργία, προχωρήστε και τοποθετήστε πίσω πόρτα ή ένας Δούρειος ίππος έτσι ώστε το εν λόγω πρόγραμμα τώρα έχει κάποια μηδενικά και αυτοί που κάνουν κάτι κακόβουλο. Καταγραφή όλων των σας πληκτρολογήσεις, φορτώνοντας τα δεδομένα σε κάποιο server, ή τίποτα. Και τι Ken Thompson συνεχίζει να κάνει στην ομιλία του, είναι να αποδείξει ότι ακόμη και αν έχετε πρόσβαση στην πηγή κώδικα ενός μεταγλωττιστή που κακόβουλα θα μπορούσε να γίνει αυτό, δεν έχει σημασία, διότι υπάρχει αυτή η κότα και το αυγό πραγματικότητα του παρελθόντος πολλών χρόνια όπου compilers χρησιμοποιούνται για την κατάρτιση τους. Με άλλα λόγια, ο τρόπος πίσω όταν κάποιος είχε να γράψει το πρώτο μεταγλωττιστή. Και στη συνέχεια, κάθε φορά που έχουν ενημερωθεί ο μεταγλωττιστής αλλάζοντας τον πηγαίο κώδικά του, προσθέτοντας χαρακτηριστικά και το recompiling για ανθρώπους σαν εμάς να χρησιμοποιούν, επίσης, από όπου και αν χρησιμοποιείτε το παλιό έκδοση του compiler για την κατάρτιση του νέου έκδοση του compiler. Και αν ρίξετε μια ματιά στην ομιλία που έδωσε, θα δείτε ότι επειδή της κυκλικότητας, μπορείτε να έχετε πραγματικά σφάλματα ή Δούρειοι ίπποι ενσωματωμένα στο λογισμικό που χρησιμοποιούμε. Και ακόμα κι αν κοιτάξετε το πηγαίος κώδικας για αυτά τα προγράμματα, μπορεί να μην είναι καν εμφανής επειδή η πονηριά είναι στην πραγματικότητα σε κάποια παλαιότερη έκδοση ενός compiler που έχει ποτέ έκτοτε έγχυση την απειλή στο λογισμικό μας. Ποια είναι μόνο να πω, εμείς Πραγματικά, δεν μπορεί και δεν πρέπει εμπιστοσύνη στο λογισμικό που τρέχει σε φορητούς υπολογιστές μας ή τηλέφωνα ή οποιοδήποτε αριθμό των θέσεων. Και στην πραγματικότητα, αργότερα σε αυτό το εξάμηνο, όταν αρχίσουμε να μιλάμε για web προγραμματισμό και πραγματικά να αρχίσει την οικοδόμηση web εφαρμογές τους εαυτούς μας, θα μιλήσουμε για αυτά απειλές και τους άλλους. Τώρα, μπορεί να έχετε αναρωτηθεί και παρατήρησα ότι υπήρχε ένα μικροσκοπικό μικρό Darth Vader στα κλιπ που Το Verge έδειχνε εκεί για την Volkswagen. Αν δεν έχετε δει ποτέ, εγώ νομίζαμε ότι θα πρέπει να ελαφρύνει η διάθεση, επειδή όλα αυτά είναι πολύ καταθλιπτικό και τρομακτική. Πάω να κοιτάμε πίσω στο Super Bowl 2011 όταν μια εμπορική από Volkswagen-- και αυτό σχεδόν καθιστά αγαπητός again-- προβλήθηκε για πρώτη φορά στην τηλεόραση. Είναι η δεύτερη κλιπ 60 Νομίζω ότι θα απολαύσετε. [ΑΝΑΠΑΡΑΓΩΓΗ] [ΜΟΥΣΙΚΗ - ΘΕΜΑ ΤΗΣ «πολέμου των άστρων»] [DOG γαβγίζει] [CAR ΑΡΧΙΖΕΙ] [Σταματήσετε την αναπαραγωγή] David J. Malan: Ναι. Ήμουν μόλις έλεγχο. Αυτό το αυτοκίνητο είναι στον κατάλογο των παραβιάσεων. Εντάξει. Έτσι κοιτάξουμε μερικά pseudocode πριν από λίγο. Και εδώ είναι ένα μεγαλύτερο απόσπασμα του κώδικα ψευδοκώδικα ότι έχουμε δει αρκετές φορές μέχρι τώρα. Και ας χρησιμοποιήσουμε αυτή είναι μια ευκαιρία τώρα να εισαγάγει ένα νέο προγραμματισμό τεχνική που κάναμε δείτε αλγοριθμικά την περασμένη εβδομάδα, όταν κοιτάξαμε ταξινόμηση με συγχώνευση. Αλλά ας το επισημοποιήσει και να δούμε πώς θα μπορούσαμε να το χρησιμοποιήσετε σε πραγματικό κώδικα, και στη συνέχεια θα πάμε να χρησιμοποιήσετε αυτό την τεχνική κάτω από το δρόμο πιο ενδέχεται να επιλυθούν ορισμένα άλλα προβλήματα. Έτσι, αυτό ήταν ένα από τα πρώτα προγράμματα που έγραψε ποτέ, αν και σε κώδικα ψευδοκώδικα. Και τι είναι αυτό το πρόγραμμα μας επέτρεψε να κάνουμε μάθημα ήταν να βρεθεί ο Mike Smith σε ένα τηλεφωνικό κατάλογο. Και παρατηρήσετε ιδίως οκτώ γραμμές και 11 που είχε αυτή τη δήλωση Go To. Και στην πραγματικότητα, ορισμένες γλώσσες, μεταξύ των οποίων και C, στην πραγματικότητα έχουν ένα δήλωση η οποία είναι κυριολεκτικά πηγαίνετε στο ότι σας επιτρέπει να μεταβείτε σε μια συγκεκριμένη γραμμή. Είναι γενικά αποδοκιμαζόταν, διότι μπορεί πολύ εύκολα να γίνει κατάχρησή και μπορείτε να ξεκινήσετε το άλμα σας πρόγραμμα σε όλη τη χώρα, σε αντίθεση να χρησιμοποιούν το είδος του λογική και η ροή ελέγχου ότι έχουμε χρησιμοποιήσει μέχρι στιγμής με μόνο βρόχους και τις προϋποθέσεις και τα παρόμοια. Αλλά μπορούμε να απλοποιήσουμε αυτόν τον αλγόριθμο στον κώδικα ψευδοκώδικα ως εξής. Αντί αυτής της επαναληπτικής ή looping προσέγγιση όπου συνεχίζουμε πίσω και πίσω και πάλι προς τη γραμμή των τριών, γιατί δεν έχουμε ακριβώς το είδος του punt και περισσότερο γενικά λένε στην γραμμή επτά και 10, απλά αντικαθιστούν τα δύο ζεύγη γραμμών με, else if Smith είναι νωρίτερα στο βιβλίο θα αναζήτηση Mike στο αριστερό μισό του βιβλίου. Αλλιώς αν Smith είναι αργότερα στο βιβλίο, αναζητήστε Mike προς τη σωστή το μισό βιβλίο. Και παρατηρήσετε ήδη την κυκλικότητα. Σωστά; Ψάχνω για Mike στο Ο τηλεφωνικός κατάλογος και, στη συνέχεια, Εγώ τελικά χτύπησε ίσως γραμμή επτά ή ίσως γραμμή 10 και τη διδασκαλία μου για τον εαυτό μου είναι η αναζήτηση για Mike στο μισό του τηλεφωνικού καταλόγου. Λοιπόν, πώς μπορώ να ψάξω για τον Mike; Είμαι στη μέση της ψάχνουν για Mike, γιατί Σας το είδος της αποστολής μου σε έναν κύκλο; Αλλά αυτό είναι εντάξει, επειδή ό, τι είναι συμβαίνει με το μέγεθος του προβλήματος, όπως γράφεται στην γραμμή 7 και 10; Δεν είμαστε απλά λέγοντας αναζήτηση για Mike, αναζήτηση Mike. Είμαστε συγκεκριμένα λέει τι; Αναζήτηση γι 'αυτόν στο αριστερό μισό της το δεξί μισό οποία είναι αποτελεσματικά ένα δεύτερο το μέγεθος του προβλήματος. Έτσι είναι ΟΚ ότι είμαστε το είδος του συμμετέχουν σε αυτή την κυκλικότητα, Αυτό το κυκλικό επιχείρημα, επειδή τουλάχιστον είμαστε καθιστώντας το πρόβλημα και μικρότερα. Και τελικά θα πάμε για να φτάσει ότι η λεγόμενη βασική περίπτωση όπου έχουμε μόνο μία σελίδα left-- ως εθελοντής μας την περασμένη εβδομάδα did-- είχαμε μία σελίδα αριστερά και στη συνέχεια δεν το κάνουμε πρέπει να συνεχίσει να αναζητά τον Mike Smith γιατί είναι είτε σε αυτή τη σελίδα ή δεν είναι. Λοιπόν, πώς μπορούμε να υλοποιήσει αυτή την ιδέα, αυτή είδος της κυκλικότητας σε πραγματικό κώδικα; Λοιπόν, μπορούμε να αξιοποιήσουμε μία τεχνική ότι είναι γενικά γνωστό ως αναδρομή. Και έχουμε δει αυτό το ψευδοκώδικα για τη συγχώνευση του είδους την περασμένη εβδομάδα. Υπενθυμίζεται ότι αυτή ήταν η ψευδοκώδικα για ταξινόμηση με συγχώνευση. Είναι αναμφισβήτητα ακόμη πιο απλή από ό, τι φούσκα ή την επιλογή ή την εισαγωγή του είδους μόνο από την άποψη της απλότητας με το οποίο μπορείτε να το εκφράσει. Αλλά αυτό συμβαίνει γιατί είμαστε το είδος του κυκλικά λέγοντας, αναζήτηση για κάτι με την έρευνα για το πάλι. Αλλά είμαστε ψάχνουν είτε σε το αριστερό μισό ή το δεξιό μισό και στη συνέχεια, τελικά είμαστε συγχωνεύονται σε αυτή την περίπτωση. Αλλά εδώ, επίσης, με οι δύο αυτές γραμμές του είδους, δεν έχουμε και πάλι αυτό ιδέα της αναδρομής. Και συγκεκριμένα τι σημαίνει αυτό, στο πλαίσιο ενός αλγορίθμου, είναι ότι ένας αλγόριθμος είναι αναδρομικός εάν χρησιμοποιεί ή καλεί τον εαυτό της. Είτε με όρους C, μια λειτουργία είναι recursive-- μια λειτουργία που ονομάζεται foo είναι αναδρομική αν foo, κάπου στον πηγαίο κώδικα του, αυτοαποκαλείται το foo λειτουργία. Και αυτό είναι κακό, αν όλα foo κάνει ποτέ είναι αυτοαποκαλείται ξανά και ξανά. Είναι εντάξει εάν foo σταματά τελικά, όπως και η ταξινόμηση με συγχώνευση, λέγοντας, περιμένετε ένα λεπτό, εάν αυτό το πρόβλημα είναι εξαιρετικά μικρό, για παράδειγμα, ή τον βρήκα τον οποίο είμαι αναζητούν, μόλις επιστρέψει. Μην αναδρομικά, δεν κυκλικά καλέσετε και πάλι τον εαυτό μου. Και γι 'αυτό ας ρίξουμε μια ματιά πώς αυτό θα μπορούσε να λειτουργεί στην πράξη. Έτσι, Πάω να πάει μπροστά και ανοιχτό μέχρι δύο παραδείγματα κώδικα εδώ. Ένας εκ των οποίων ονομάζεται σίγμα 0. Και αυτό δεν είναι καθόλου αναδρομικό, αλλά ας ρίξουμε Δείτε τι κάνει αυτό το πρόγραμμα. Έχω αφαιρεθούν όλα σχόλια από αυτό, αλλά όλα του πηγαίου κώδικα για το CS50 δικτυακός τόπος έχει σχόλια αν θέλετε να διαβάσετε μέσα από αυτό και πάλι αργότερα. Και ας κάνουμε ένα ζευγάρι της λογικής ελέγχει εδώ. Έτσι, στην κορυφή του εν λόγω κώδικα, έχουμε συμπεριλάβει CS50.h. Τι κάνει αυτό το κάνει; Γιατί είναι εδώ; Σε ό, τι λογική απλή γλώσσα. Τι κάνει? Ναι. Κοινό: έτσι ώστε η λειτουργία GetInt λειτουργεί. David J. Malan: Ώστε η λειτουργία GetInt λειτουργεί. Επειδή στο εσωτερικό αυτού αρχείο, CS50.h, η οποία θα δούμε πριν από καιρό σε όροι του πηγαίου κώδικα του, έχει μια δέσμη των λειτουργιών declared-- GetInt, GetString, και ένα σωρό others-- και εκτός έχουμε στην πραγματικότητα που περιλαμβάνουν γραμμή, η Clang compiler δεν είναι πρόκειται να ξέρει ότι υπάρχει. Και ίδιο ισχύει για τη γραμμή όπου δύο int ορίζεται printf, η οποία είναι μια συνάρτηση κρατάμε χρησιμοποιώντας αρκετά. Τώρα, τέσσερα γραμμή φαίνεται λίγο funky επειδή είναι απλά ένα ένα σκάφος της γραμμής. Έχει ένα ερωτηματικό, δεν σγουρά τιράντες, δεν υπάρχει κωδικός στο εσωτερικό του. Αλλά τι έκανε λέμε αυτό το πράγμα σε εβδομάδες παρελθόν; Ναι. Έτσι, ένα πρωτότυπο. Και γιατί έχουμε ένα πρωτότυπο το οποίο φαίνεται να είναι λίγο περιττή συνήθως επειδή συνήθως ανατρέξτε στη λειτουργία ξανά αργότερα στο αρχείο, έτσι δεν είναι; Γιατί λοιπόν have-- είστε ακριβώς ξύσιμο το κεφάλι σας, αλλά θα το πάρω. Ναι. Κοινό: [δεν ακούγεται] λειτουργία μετά την κύρια. David J. Malan: Ακριβώς. Έτσι ώστε ο compiler θα ξέρει θα καθορίσουν ή να εφαρμόσουν τελικά ότι η λειτουργία μετά την κύρια, κατά πάσα πιθανότητα. Έτσι Clang και πιο compilers είναι είδος χαζός και θα ξέρουν μόνο ό, τι τους λέτε. Και αν θέλετε να χρησιμοποιήσετε μια λειτουργία που ονομάζεται σίγμα, σας διδάξει καλύτερα τον compiler ότι υπάρχει εκ των προτέρων. Τώρα, κύρια η ίδια, ακόμη και αν και είναι ένα μάτσο γραμμές, είναι αρκετά εξοικειωμένοι ελπίζω μέχρι τώρα. Είναι πήρε ένα do while loop σκοπός της οποίας στη ζωή εδώ είναι προφανώς να πάρει ένα θετικός ακέραιος από το χρήστη. Και να κρατήσει μόνο εχθρική συμπεριφορά του ή της μέχρι να συνεργαστούν. Στη συνέχεια, στη γραμμή 16 που έχω μια ενδιαφέρουσα κλήση. IntAnswer. Ποιο στο αριστερό χέρι πλευρά μου δίνει μια Int η οποία μπορεί να store-- ονομάζεται Answer-- η οποία πρόκειται να αποθηκεύει, προφανώς, η τιμή επιστροφής της σίγμα. Έτσι σίγμα είναι μόνο ένα αυθαίρετη, αλλά περιεκτικό όνομα ότι έχω δώσει σε λειτουργία σκοπός της οποίας στη ζωή είναι να πάρετε ένα argument-- Θα ονομάσουμε Ν σε αυτήν την case-- και μόνο για να πάρει το ποσό του εν λόγω αριθμού συν κάθε θετικός αριθμός που μικρότερα από ό, τι. Έτσι, αν έχω περάσει στον αριθμό 2 σίγμα, θέλω να προσθέσω 2 συν 1 συν 0-- δεν 0-- έτσι ώστε να μου δίνει 3. Αν έχω περάσει 3 έως σίγμα, θέλω να έχουν 3 συν 2 συν 1, η οποία μου δίνει 6. Και ούτω καθεξής. Έτσι απλά προσθέτει όλα τα αριθμών μικρότερη ή ίση με αυτή. Τώρα, εδώ κάτω είμαι απλώς πρόκειται για να εκτυπώσετε την απάντηση. Έτσι, ως ένα γρήγορο έλεγχο λογική, ας κάνει σίγμα 0-- dot κάθετος σ 0-- και επιτρέψτε μου να πληκτρολογήσετε 2. Και εγώ πράγματι να πάρει 3. Επιτρέψτε μου να πληκτρολογήσετε 3. Έχω πράγματι πάρει 6. Και αν κάποιος μπορεί να κάνει τα μαθηματικά γρήγορα, αν κάνω 50 τι θα πάω να πάρω; Κοινό: [δεν ακούγεται]. David J. Malan: Λοιπόν, όχι. Αλλά 1.275 η οποία είναι αρκετά κοντά. Έτσι, αυτό είναι το αποτέλεσμα του να κάνει 50 συν 49 συν 48 συν 47 συν 46 σε όλη τη διαδρομή προς 1. Έτσι, αυτό είναι όλο σίγμα κάνει. Αλλά ας δούμε πώς έχουμε εφαρμοστεί τώρα. Έτσι, εδώ κάτω είναι η ίδια η λειτουργία του. Και αυτό δεν φαίνεται να έχει τίποτα να κάνει με αναδρομή ακόμα. Στην πραγματικότητα, είμαστε χρησιμοποιώντας ένα παλιά τεχνική σχολή. Είμαι προετοιμασία μια μεταβλητή που ονομάζεται άθροισμα στο μηδέν, τότε έχω μια foreloop εδώ, και είμαι κηρύσσεται Int ονομάζεται Εγώ, ότι αυτό ισούται με 1-- αν και θα μπορούσα να το θέσει σε ίση το μηδέν, αλλά επειδή κάνω Επιπλέον, ποιος νοιάζεται αν είναι μηδέν ή ένα. Είναι πρόκειται να έχουν κανένα αποτέλεσμα. Έτσι είμαι επανάληψη εφ 'όσον έχω είναι μικρότερο από ή ίσο με m, η οποία είναι το επιχείρημα που ψηφίστηκε το. Και τότε θα κρατήσει μόνο προσαύξηση Ι και διορατικότητα του βρόχου όλα τα κάνω κάνει άθροισμα συν ισούται I. Και αυτό είναι σκόπιμη. Δεν θέλω να κάνω, σε αυτό το περίπτωση, όπως και ποσό συν συν. Θέλω πραγματικά να προσθέσετε η τρέχουσα αξία του Ι η οποία διατηρεί παίρνει όλο και μεγαλύτερες και μεγαλύτερο για την αντιστοιχία μεταξύ του λειτουργία. Και τότε θα επιστρέψει ποσό. Και έτσι απάντηση παίρνει το άθροισμα αξία. Και τότε να το τυπώσετε έξω. Έτσι, υπάρχει μια ευκαιρία εδώ, όμως, με το είδος των απλοποίηση αυτός ο κώδικας εννοιολογικά και το είδος του χτυπήματος είναι ένα νου από την άποψη της απλότητα μολονότι παίρνει λίγο χρόνο για να ταξινομήσετε της εκτιμούν γιατί αυτό είναι ισχυρό σε αυτά τα μικρά παραδείγματα. Εδώ είναι σίγμα ένα-- τόσο την δεύτερη έκδοση αυτού του κώδικα. Τα πάντα επάνω στην κορυφή είναι πανομοιότυπες το ίδιο ισχύει και ιστορία όπως και πριν. Αλλά τώρα ας δούμε το εφαρμογή του σίγμα οποία Έχω μειώνονται σε μόλις αυτά lines-- τέσσερις γραμμές κώδικα, πραγματικά, συν κάποια αγκύλες και λευκό χώρο. Αλλά τι κάνω; Αν το m είναι μικρότερο ή ίσο με μηδέν, θα πρέπει να χειριστεί το είδος του ότι εξαιρετικά απλή υπόθεση. Και αν το χέρι μου μηδέν ή τίποτα αρνητικό που είναι ακριβώς παράξενο, Είμαι ακριβώς πρόκειται να αυθαίρετα αλλά σταθερά να επιστρέψει το μηδέν. Δεν θέλω αυτό το πράγμα να μπει σε κάποια περίεργα άπειρο βρόχου εξαιτίας της αρνητικής αξίας. Έτσι Απλά λέω, αν μπορείτε να μου δώσετε μηδέν ή λιγότερο, είμαι επιστρέφοντας μηδέν. Αλλά αυτό είναι καλό, γιατί αυτό είναι ότι μία σελίδα του βιβλίου τηλεφώνου ότι έχει απομείνει. Είμαι δάγκωμα από ένα πολύ συγκεκριμένο πρόβλημα και δεν ζητούν κάτι αναδρομικά. Αλλά στην γραμμή 31, τι μπορώ να φαίνεται να κάνει; Οι παρενθέσεις είναι απλά κρατώντας τα πράγματα, ελπίζω, λίγο πιο σαφής. Αλλά όλα τα κάνω είναι ότι είμαι επιστροφή m-- ανεξαρτήτως Σας me-- συν το χέρι αξία των συγγνώμη m--, συν την τιμή του σίγμα m του μείον 1. Λοιπόν, τι σημαίνει αυτό; Αν μου δώσεις τον αριθμό 3 ως πρώτη ύλη, η απάντηση που θέλω να πάρει τελικά είναι 6 επειδή 3 συν 2 συν 1 με 6 δίνει. Αλλά πώς μπορώ να το σκέφτομαι πώς αυτός ο κώδικας είναι σε λειτουργία; Την πρώτη φορά που καλώ σίγμα και περνώ στην τιμή 3, αυτό είναι σαν να λέμε σε ένα κομμάτι χαρτιού, εδώ είναι η αξία 3 και έχω περάσει αυτό ως σίγμα. 3 προφανώς δεν είναι μικρότερη από 0 μέχρι η συνθήκη IF δεν ισχύει. Ο άλλος δεν το κάνει. Λοιπόν, τι μπορώ να κάνω; Θέλω να επιστρέψω m, η οποία είναι 3, συν σίγμα μείον 1 m. Επιτρέψτε μου λοιπόν να παρακολουθείτε αυτό. Πάω να θέσει αυτό κομμάτι χαρτί προς τα κάτω. Και τι αξία, να είναι σαφές, είμαι πρόκειται να περάσει σε σίγμα σε αυτό το σημείο στην ιστορία; Τι αριθμό; 2, έτσι δεν είναι; 3 μείον 1 είναι 2. Γι 'αυτό χρειάζονται λίγο απορρίμματα χαρτιού εδώ. Έτσι τώρα σίγμα παίρνει κάλεσε ξανά. Και έχω βάλει σκόπιμα αυτό κάτω επειδή είναι κάτι σαν παύση ότι η έκδοση της ιστορίας γιατί τώρα είμαι συγκεντρωμένος με το σήμα της μ μείον 1. Έτσι, ήταν 3 m, m μείον 1 είναι 2. Έτσι, εδώ είναι 2 που έχω περάσει. 2 προφανώς δεν είναι μικρότερη από 0 έτσι ώστε περίπτωση δεν ισχύει. Αλλιώς θα επιστρέψουν m, το οποίο είναι αυτό πράγμα που, συν σίγμα ποια τιμή; Έτσι, αν σίγμα της 1-- επειδή m είναι τώρα 2 SO 2 μείον 1 είναι 1. Έτσι, τώρα έχω μόνο την τιμή 1. Είμαι περνώντας απλώς τον αριθμό 1 στην sigma-- λειτουργία ή τον εαυτό μου έτσι here-- 1 δεν είναι προφανώς κάτω από το μηδέν, εξακολουθεί να μην εφαρμόζεται. Αλλιώς επιστροφή συν 1 σίγμα τι; 0. Έτσι, επιτρέψτε μου να το θυμόμαστε αυτό. Θα πάρω πίσω σε αυτό αργότερα. Τώρα είμαι πρόκειται να πάει μπροστά και να σημειώνω κάτω από τον αριθμό 0, διότι αυτό είναι επιχείρημα ή η παράμετρος μου. Είμαι πέρασε τον αριθμό 0 και, τέλος, η διαδικασία αυτή μόλις επαναλαμβάνομαι διαφημίσεων nauseum παύει γιατί αυτό μπορώ να κάνω αμέσως μια φορά βλέπω αυτό το 0; Επιστρέφω μηδέν. Έτσι τώρα θα πρέπει να επαναφέρετε την ιστορία. Αν τώρα πάμε πίσω στο χρόνο, ποια ήταν η πιο πρόσφατη πράγμα Το έκανα αν ήταν κυριολεκτικά κουρδίζεται ένα βίντεο; Πάω να πάρει την πιο πρόσφατη 1 και αυτό μου δίνει 1 συν 0 είναι 1. Αν έχω κρατήσει το κουρδίζεται ιστορία, ότι πρόκειται να μου δώσει 2 συν αυτό τρέχουσα τιμή, η οποία είναι 1. Έτσι ώστε να είναι 3. Και τότε εγώ θα συνεχίσω να κουρδίζεται. Όταν για πρώτη φορά κάτω από τον αριθμό 3-- έτσι 3 συν 3 μου δίνει 6. Και τώρα, αν έχετε επανέλιξη η δημιουργία βίντεο μέχρι αυτό το σημείο, Αυτό ήταν το πολύ το πρώτο ερώτημα που έθεσα. Όταν πέρασε 3, ό, τι είναι σίγμα του 3; Είναι πράγματι 6, το άθροισμα των όλα αυτά τα κομμάτια του χαρτιού. Έτσι, αν αυτό παίρνει λίγο χρόνο για να τυλίξτε το μυαλό σας γύρω, αυτό είναι εντάξει. Αλλά θεωρούν ότι ήταν μια little-- το ήταν πολύ σκόπιμη πως στοιβάζονται αυτοί οι αριθμοί πάνω από το άλλο. Είναι το είδος του σαν να έχεις ένα memory-- ρεκόρ στο χρόνο, σαν καθαριστής σε ένα βίντεο, ότι πράγματι μπορώ να rewind σε. Και θα πάμε να επανέλθω ότι η μεταφορά σε μόλις ένα μικρό κομμάτι. Αλλά πρώτα, αποδεικνύεται ότι υπάρχει πολλοί geeks και αστείοι άνθρωποι, Υποθέτω, στο Google. Θα μπορούσε κάποιος που είναι πολύ καλοί στο μυαλό Googling έρχονται για μια στιγμή και να με βοηθήσει να ψάξετε για κάτι; Πολύ, πολύ χαμηλών τόνων. Κάποιος που δεν είναι ποτέ έρχονται πριν, ίσως. ΕΝΤΆΞΕΙ. Ναι; Ελα. Ελάτε κάτω. Ποιο είναι το όνομά σου? SAM: Σαμ. David J. Malan: Σαμ, έλα κάτω. Αυτό είναι ίδιο. Χάρηκα για τη γνωριμία. Γεια σου. Έλα από εδώ. Έτσι, το μόνο που χρειάζεται να κάνετε, εάν θα μπορούσε, Σαμ, εδώ είναι το Google. Μπορείτε να ψάξετε τη διάρκεια της αναδρομής; Μην χαλάσουμε. Και τώρα let's-- ναι. Κάντε κλικ στο κουμπί ΟΚ αυτό. Καλύτερα κλικ αυτό. Ααα, να το πάρετε. Κανένα? ΕΝΤΆΞΕΙ. Ας κάνουμε ένα ζευγάρι άλλους. Όχι τόσο πολύ σχετικές ακαδημαϊκά εδώ, αλλά έχετε ποτέ έψαξε στο Google για αναγραμματισμό; SAM: Όχι. David J. Malan: OK. Αναζήτηση αναγραμματισμός αντί της αναδρομής. Πόσο περίπου στραβά. Έχετε ποτέ έψαξε για στραβό; Τώρα, αυτό είναι λίγο δύσκολο να δείτε αλλά ελπίζω everything's-- ΟΚ. Είναι ακριβώς εσείς και εγώ απολαμβάνω. ΕΝΤΆΞΕΙ. Έτσι, τελικά, αυτό one's-- είναι λίγο στραβό. Τώρα κάνουμε ένα ρολό βαρέλι. Υπέροχα. Εντάξει. Μεγάλο ευχαριστώ στον Σαμ. Ορίστε. Ευχαριστώ. Έτσι, αυτό που συμβαίνει σε όλες τις από αυτές τις ανόητες παραδείγματα; Έτσι, πραγματικά, κάτω από την κουκούλα του Εκατομμύρια της Google γραμμές κώδικα προφανώς είναι μερικά ανόητα IF συνθήκες που είναι ουσιαστικά ελέγχοντας εάν ο χρήστης έχει πληκτρολογήσει τη φράση αυτή, κάνει κάτι που μάλλον πήρε το μια μη τετριμμένη χρονικό διάστημα για την εφαρμογή μόνο για να να είναι διασκεδαστικό με αυτόν τον τρόπο. Αλλά αυτό είναι το μόνο που βράζει κάτω κάτω από το καπό. Αλλά, φυσικά, αναδρομή είναι περισσότερο από το geekier παράδειγμα ανάμεσα σε αυτές τις ειδικές κόλπα. Και σίγουρα υπάρχουν και άλλοι εκεί έξω καθώς και ότι ίσως δεν έχουν ακόμη ανακάλυψε λίγο ακόμα. Έτσι, ρίξτε μια ματιά, ή να εξετάσει τώρα το ακόλουθο πρόγραμμα, και σίγουρα να αρπάξει οποιαδήποτε από αυτά στο δρόμο σας έξω. Πάω να πάει μπροστά και να ανοίξει ένα πρόγραμμα που είναι θα προσπαθήσω να ανταλλάξουν δύο τιμές. Αλλά πριν πάμε εκεί, ας το κάνουμε αυτό. Θα μπορούσαμε να πάρετε μια πιο εθελοντής, νομίζω; Θα θέλατε να εργαστούν εθελοντικά; Κανένα? Έλα επάνω. Έλα επάνω. Εντάξει. Έτσι, το όνομά σας είναι αυτό; LAUREN: Lauren. David J. Malan: Lauren. Ελάτε επάνω, Lauren. Έτσι, Lauren είναι να είναι αμφισβητηθεί εδώ ως ακολούθως. Χάρηκα για τη γνωριμία. Έτσι Lauren εδώ έχει μπροστά των δύο κενών θέσεων της. Και έχουμε κάποια πορτοκαλί χυμό και λίγο γάλα και θα πάμε για να πάει μπροστά και να κάνουμε το εξής. Εμείς απλά θα να καλύψει αυτό. Λίγα ουγγιές του γάλακτος εδώ και ας γεμίσει λίγο χυμό πορτοκαλιού εδώ. Και μπροστά από το σύνολο των Αυτά τα μέλη του ακροατηρίου, ανταλλάξουν τις δύο τιμές αυτών των κυπέλλων. Βάλτε το χυμό πορτοκάλι στο ποτήρι γάλα και το γάλα στο φλιτζάνι χυμό πορτοκαλιού. Πώς θα το κάνετε αυτό, αν ήταν σε σπίτι και είχε πρόσβαση σε άλλες προμήθειες; LAUREN: Βάλτε σε ένα άλλο κύπελλο. David J. Malan: OK. Έτσι, ας ρίξουμε μια προσωρινή μεταβλητή, αν θα το κάνουμε. Και τώρα να προχωρήσει και να υλοποιήσει Αυτή η ίδια διαδικασία εναλλαγής. Πολύ καλό. Έχουμε βάλει ΕΕ στην προσωρινή μεταβλητή, το γάλα στη μεταβλητή ΕΕ, και τώρα η προσωρινή μεταβλητή στη μεταβλητή γάλα. ΕΝΤΆΞΕΙ. Έτσι, πολύ καλά κάνει μέχρι στιγμής. Έτσι, αποδεικνύεται ότι κατέχουν out-- σκέφτηκε για μια στιγμή. Εδώ, σε αυτό ακριβώς geek για λίγο, αυτό θα είναι ο αντίστοιχος κωδικός C ότι μόλις εφαρμοστεί. Είχαμε δύο εισόδους, α και β, και τα δύο η οποία θα πω μόνο για την απλότητα είναι int του. Και παρατηρήσετε εδώ, αν θέλω να ανταλλάξουν οι τιμές των δύο μεταβλητών, α και β, χρειαζόμαστε πράγματι ένα μεσάζοντα, ένα προσωρινή μεταβλητή, μια προσωρινή κύπελλο, μέσα στο οποίο το ρίχνουμε μια από τις τιμές έτσι ώστε να έχουμε ένα σύμβολο κράτησης θέσης για αυτό. Αλλά τότε ο κώδικας είναι ακριβώς όπως Lauren εδώ εφαρμογή. Τώρα, απλά για να πάρει ένα λίγο πιο τρελός, αποδεικνύεται ότι μπορείτε να το κάνετε αυτό χωρίς να μια προσωρινή μεταβλητή. Για να γίνει αυτό σωστά, όμως, θα πάμε να έχουν να εξαπατήσουν με κάποιο χημεία. Έχουμε κάποια επιπλέον φλιτζάνια εδώ. Έτσι, το πιο κοντινό πράγμα που φαίνεται όπως το γάλα και το νερό perhaps-- ή το γάλα και OJ-- είναι ότι έχουμε κάποια νερό, έτσι θα καλύψει αυτό το ένα επάνω με λίγες ουγκιές καθαρό νερό. Αυτό είναι πιθανώς πάρα πολύ. Ναι. Αυτό είναι σίγουρα πάρα πολύ. Κρατήστε για ένα δευτερόλεπτο. Και τώρα έχουμε πετρέλαιο, το οποίο, όπως θυμάμαι από μεσαία τάξη χημεία σχολείο, Ας ελπίσουμε ότι δεν αναμιγνύεται με νερό. Αλλά αυτό το είδος του είδους μοιάζει με το γάλα και ΕΕ. Έτσι τώρα, χωρίς τη χρήση μια προσωρινή μεταβλητή, μπορείτε να ανταλλάξετε αυτές τις δύο τιμές; Έτσι έλαια πηγαίνει στο κύπελλο νερό, νερό πηγαίνει στο φλιτζάνι λάδι. LAUREN: Δεν υπάρχουν άλλα κύπελλα; David J. Malan: Δεν υπάρχουν άλλα κύπελλα. Και δεν έχω πραγματικά δοκιμαστεί αυτό πριν από το τρέχον έτος οπότε δεν ξέρω αν αυτό θα λειτουργούν πραγματικά χημικά. Αυτό δεν έπρεπε να συμβεί. Είναι εργασίας; Εντάξει. Έτσι, το διαχωρισμό; Καλή. Τώρα πήραμε για να πάρει το νερό μέσα στο άλλο κύπελλο. Εξυπνότερα συγκεντρωτές χημεία θα μπορούσε ίσως κάνει αυτό καλύτερα από μένα. LAUREN: Το νερό είναι στο κάτω μέρος. David J. Malan: Το water-- που ήταν Αυτό που είναι βασικό η τελευταία φορά που το έκανε αυτό. Θα πρέπει να το κάνουμε με τη σωστή σειρά. Ναι. Δεν πειράζει. Έτσι τώρα έχουμε δύο φλιτζάνια λάδι. ΕΝΤΆΞΕΙ. Δεν πειράζει. Αλλά αν αυτή η χημική επεξεργασία από I-- LAUREN: Αυτό είναι το νερό. David J. Malan: Αυτό είναι κυρίως νερό. Εντάξει. Αλλά αυτό είναι ακόμα το ίδιο κύπελλο όπως και πριν. Έτσι, ρίξτε it-- το δοκιμάσω εκεί. ΕΝΤΆΞΕΙ. Αυτή είναι μια καλή χρήση του χρόνου τάξη σήμερα. ΕΝΤΆΞΕΙ. Έτσι we-- τώρα ωραίο. Είδος. Εντάξει. Έτσι, πολύ καλό. Σας ευχαριστούμε για την Lauren. Πολύ καλά κάνει. Έτσι απλά για να φυσήξει το μυαλό σας, και αυτό είναι ίσως κάτι για να παίξει με, αν σας αρέσει σε CS50 ID, μπορείτε, στην πραγματικότητα, να ανταλλάξουν δύο μεταβλητές χωρίς τη χρήση προσωρινών ακέραιος. Και αυτό είναι το αντίστοιχο κωδικό C. Και αν θυμάστε από την τελευταία Τετάρτη, εισαγάγαμε, αν εν συντομία, ορισμένοι νέοι φορείς εκμετάλλευσης σε C. Και το κάνει κανείς θυμηθούμε τι το μικρό καρότο σύμβολο είναι, ότι λίγη τριγωνική σύμβολο από το πληκτρολόγιο αντιπροσωπεύει; Τι δυαδικός τελεστής; Κοινό: EXOR. David J. Malan: EXOR. Αποκλειστική Or. Έτσι, εάν θέλετε, απλά για διασκέδαση σε στο σπίτι, για να δώσει ένα και b δυο αυθαίρετες αξίες όπως κάθε eight-- και εγώ Θα επιλέξει μια τιμή οκτώ bit. Εάν το κάνετε αυτό με 32 bits, θα έχετε πολύ γρήγορα βαριούνται. Αλλά μόλις δώσει οκτώ bit τιμή που είναι οτιδήποτε άλλο, ένα ή δύο, και β δώσει μια παρόμοια τιμή. Και στη συνέχεια, χρησιμοποιώντας τον ορισμό του XOR από την περασμένη Τετάρτη, εφαρμόσουν αυτό το λίγο-λίγο, κάθε ένα από Αυτοί οι οκτώ bits σε κάθε ένα από τα α και b, και στη συνέχεια να κάνει ακριβώς ανά κωδικό αυτό. Και δεν είναι εσφαλμένη τι που βλέπετε εδώ στην οθόνη. Βράζει πραγματικά κάτω σε τρεις πράξεις XOR και με κάποιο τρόπο μαγικά ένα και β θα ανταλλάξουν θέσεις δεν χάνει καμία πληροφορία. Έτσι, το λάδι και το νερό είναι το τέχνασμα πλησιέστερο πραγματικό κόσμο ενσάρκωση Θα μπορούσα να σκεφτώ να μιμούνται αυτό. Αλλά είναι σίγουρα πιο εύκολο να χρησιμοποιήσετε μια προσωρινή μεταβλητή, όπως στην προκειμένη περίπτωση εδώ. Και αυτό επίσης είναι μια ευκαιρία να πω, πάρα πολύ, αυτό το είδος της μικρο βελτιστοποίησης, ως επιστήμονας υπολογιστών Θα έλεγα, ενώ το είδος της διασκέδασης να καυχηθεί για το πώς θα το έκανε αυτό χωρίς να όπως την εναλλαγή με ένα επιπλέον μεταβλητή, δεν είναι όλα τόσο συναρπαστικό. Διότι για να σώσει 32 bits, όπως στην περίπτωση ενός πραγματικού int, Δεν είναι όλα αυτά συναρπαστικό σε ένα σύστημα όπου μπορεί να χρησιμοποιείτε δεκάδες megabytes ή ακόμα περισσότερα τέτοια μνήμη αυτές τις ημέρες. Και στην πραγματικότητα, όταν φτάσουμε σε μεταγενέστερο σετ πρόβλημα και θα εφαρμόσει ορθογραφικό πούλι και θα κληθούν να το πράξουν με αυτό το μικρό RAM και ως μικρή δυνατό χρόνο για την Σας computer-- ακόμα έχουν εβδομάδων για την υλοποίηση it-- θα have-- θα είστε αμφισβήτησε την ελαχιστοποίηση αυτών των πόρων. Και αυτό είναι πραγματικά το μόνο προκαλέσουν αυτό το εξάμηνο όπου θα πρέπει να ενθαρρύνονται να το ξύρισμα μακριά ακόμη και την καλύτερη επίδοση κοστίζει διαφορετικά. Έτσι what-- πώς μπορούμε να δείτε αυτό σε πραγματικό κώδικα; Επιτρέψτε μου να προχωρήσει τώρα και να ανοίξει ένα παράδειγμα ότι σκόπιμα ονομάζεται Δεν swap γιατί δεν το κάνει στην πραγματικότητα, να ανταλλάξουν τις μεταβλητές όσο θα περίμενε κανείς. Έτσι, ας ρίξουμε μια ματιά. Εδώ είναι ένα πρόγραμμα που δεν έχει CS50 βιβλιοθήκη σε εξέλιξη, μόλις Standard I / O. Τώρα έχουμε ένα πρωτότυπο για την ανταλλαγή επάνω στην κορυφή η οποία μόλις σημαίνει ότι έχεις να καθοριστούν αργότερα. Και εδώ είναι κύρια. I αυθαίρετα x και y, αντίστοιχα, οι τιμές ένα και δύο μόνο και μόνο επειδή είναι μικρό και εύκολο να το σκεφτώ. Και τότε έχω μόνο ένα μάτσο printfs όπου έχω μια επιταγή λογική. το χ είναι 1 και το γ είναι 2 είναι πιθανώς ποιοί είναι αυτοί οι printfs θα πει. Έτσι, δεν έχει μέχρι στιγμής μαγεία. Στη συνέχεια, Πάω να διεκδικήσει με εκτύπωση def, swapping dot dot dot. Πάω να καλέσω την ανταλλαγή λειτουργία, περνώντας x και y. Και ας υποθέσουμε ότι για τώρα ανταλλαγής υλοποιείται ακριβώς όπως ήταν πριν από ένα λεπτό με μια προσωρινή μεταβλητή. Και γι 'αυτό αξίωση τόλμη, αντάλλαξαν. X είναι τώρα αυτό και y είναι τώρα αυτό. Αλλά το αρχείο, φυσικά, καλείται Δεν Swap. Ας δούμε πραγματικά τι συμβαίνει. Αν έχω συγκεντρώσει καμία ανταλλαγή και, στη συνέχεια, κάνει ./noswap, χ είναι 1, το Υ είναι 2. Εναλλαγή αντάλλαξαν. το χ είναι 1, το γ είναι 2. Έτσι, φαίνεται πράγματι να αποτύχουν ακόμη αν swap-- ας μετακινηθείτε προς τα κάτω now-- εφαρμοστεί ακριβώς η ανά Κωδικός πρότεινα πριν από λίγο. Γι 'αυτό και δεν πρόκειται να πάρει φανταχτερά με το υλικό XOR για τώρα. Αυτό, επίσης, θα πρέπει να λειτουργεί μόνο όπως και με το γάλα και ΕΕ, αλλά αυτό δεν φαίνεται να λειτουργεί. Ας κάνουμε αυτό και πάλι. Ίσως απλά δεν ήταν αυτό τρέχει δεξιά. Ας τρέξει ξανά Δεν Swap. Ίσως I-- όχι. Γι 'αυτό ακριβώς δεν λειτουργεί. Ας κάνουμε ένα μικρό έλεγχο λογικότητας. Επιτρέψτε μου εδώ να προχωρήσει σε Swap και απλά να προσθέσω, περιμένετε ένα λεπτό, a είναι% i / n και ας plug-in της αξίας του ενός. Επειδή θέλω πραγματικά για να δούμε τι συμβαίνει. Και πράγματι, αυτή είναι η μια τεχνική εντοπισμού σφαλμάτων ότι μπορεί να χρησιμοποιείτε σε ώρες γραφείου ή στο σπίτι ήδη, παρόμοιο με το πρώτο εξάμηνο του Dan Βίντεο Armendariz στην PSET3 όπου εισαγάγαμε εκτύπωσης def ως μια συνιστώμενη τεχνική, τουλάχιστον για απλές περιπτώσεις. Επιτρέψτε μου να πάω μπροστά και να εκτελέσετε την εντολή make Δεν ανταλλαγής πάλι, ./noswap. Ενδιαφέρουσες. Έτσι παρατηρήσετε αυτό που φαίνεται να είναι αληθινό. x είναι 1, το γ είναι 2, αλλά μια είναι 2 όταν το b είναι 1. Έτσι, αυτά τα δύο με κάποιο τρόπο πήρε αντάλλαξαν αλλά τα Χ και Υ δεν παίρνουν ανταλλάσσονται. Έτσι για να είναι σαφές, τι συμβαίνει είναι, εδώ έχω x και y και αυτά είναι μεταβλητές στο τοπικό έκταση των κυρίων, περνώ στο x και y να ανταλλάξουν. Τώρα, swap, ως χωριστή λειτουργία, είναι ελεύθερη να καλέσει τα επιχειρήματά της ή τις παραμέτρους του οτιδήποτε θέλει. Foo ή μπαρ ή x ή y ή a ή b. Ακριβώς για να καταστεί σαφές ότι είναι δεν είναι ταυτόσημα με τα χ και γ per se, Έχω πει a και b. Αλλά θα μπορούσαμε να τους αποκαλούμε οτιδήποτε θέλουμε. Και έτσι μοιάζει το swap που πέρασε x-- AKA a-- και είναι που πέρασε y-- AKA β. Κάπως αυτές οι τρεις γραμμές είναι εναλλαγή ακριβώς αυτές τις αξίες όπως έκανε Lauren με το γάλα και ΕΕ. Αλλά όταν έχουμε να εκτυπώσετε η αξίες, a και b είναι πράγματι ανταλλάξουν αλλά και x y δεν έχουν καμία αλλαγή σε αυτά. Υπενθυμίζεται ότι τα Χ και Υ είναι εδώ. Έτσι μπορούμε να δούμε αυτό μέσω μια άλλη τεχνική, καθώς και. Και αυτό είναι πάρα πολύ μια τεχνική ενσωματωμένο στο πρόβλημα που τρεις. Ας πάμε μπροστά και να το κάνουμε αυτό σε CS50 ID αν δεν έχετε ήδη. Από την πλευρά μας δεξί χέρι έχουν αυτήν την καρτέλα εντοπισμού σφαλμάτων. Και αν ανοίξετε αυτό επάνω, υπάρχει κάποια απόκρυφες πληροφορίες αυτό είναι που ρίχνονται σε σας αρχικά. Αλλά ας δώσουμε έμφαση αυτό πέρα ​​πραγματικά γρήγορα. Έτσι, ένα, θα δείτε τις τοπικές μεταβλητές. Αποδεικνύεται ότι χτίσει σε CS50 IDE, και πολλά περιβάλλοντα προγραμματισμού περισσότερα γενικά, είναι ένα πρόγραμμα εντοπισμού σφαλμάτων. Ένα εργαλείο που σας επιτρέπει να δείτε οπτικά τι συμβαίνει στο εσωτερικό του προγράμματός σας χωρίς να χρειάζεται να καταφύγουν σε προσθήκη printfs και την κατάρτιση και την εκτέλεση και προσθέτοντας printf και την κατάρτιση και το τρέξιμο, η οποία ήδη, σε ώρες γραφείου ή το σπίτι, είναι πιθανόν να πάρει αρκετά κουραστική. Μέχρι εδώ, ακριβώς σε μια στιγμή, είμαστε πρόκειται να για να δείτε σε πραγματικό χρόνο οι τιμές των τοπικών μεταβλητών μας. Είμαστε, επίσης, πρόκειται να είναι σε θέση να καθορίσει τα λεγόμενα σημεία διακοπής οποία Υπάρχουν ευκαιρίες στο πρόγραμμα μου για να διακόψετε εκτέλεση σε μια συγκεκριμένη γραμμή κώδικα ότι είμαι περίεργος για. Σωστά; Αυτά τα προγράμματα τρέχουν σε ένα κλάσμα του δευτερολέπτου. Είναι το είδος της Νίκαιας για εμάς τους ανθρώπους πιο αργό να είναι σε θέση να διακόψετε, να λάβει μια στιγμή, βλέπε τι συμβαίνει γύρω μια συγκεκριμένη γραμμή κώδικα χωρίς το όργωμα πρόγραμμα μέσα από αυτό και το φινίρισμα εντελώς. Έτσι, ένα σημεία διακοπής θα μας επιτρέψει να διάλειμμα και σταματήστε σε ένα ορισμένο σημείο. Πρόσκληση στοίβα είναι ένα φανταχτερό τρόπο λέει ό, τι είναι σήμερα λειτουργίες που καλείται αυτή τη στιγμή. Κύρια πάντα πρώτο. Αλλά εάν Κύρια αποκαλεί συνάρτηση που ονομάζεται Swap, είμαστε πραγματικά πρόκειται να δούμε αυτό πύργος της λειτουργίες που έχουν κάλεσε σε αντίστροφη χρονολογική σειρά. Ας δούμε αυτό. Πάω για σμίκρυνση. Πάω να επιστρέψω στον κώδικά μου. Και ακριβώς επειδή θέλω να είναι σχολαστικός εδώ, Πάω να προχωρήσει και κάντε κλικ ακριβώς στα αριστερά της γραμμής πέντε. Και αυτό δημιουργεί μια κόκκινη κουκκίδα. Και παρατηρήσετε στη δεξιά πλευρά ότι το πρόγραμμα εντοπισμού σφαλμάτων ξέρει, hey, Μόλις είπα ένα σημείο διακοπής σε noswap.c γραμμή πέντε, ειδικά σε αυτή τη γραμμή κώδικα. Έτσι, το πρόγραμμα εντοπισμού σφαλμάτων ξέρει ότι εγώ ζήτησαν από την επόμενη φορά Τρέχω μου πρόγραμμα παύσης εκτέλεση εκεί και όχι μόνο τρέχει το όλο πράγμα εξαιρετικά γρήγορη. Έτσι τώρα θα πάω να κάνετε κλικ στο Debug κουμπί στην κορυφή του IDE και ότι πρόκειται να κάνετε τα εξής. Είναι πρόκειται να ανοίξει ένα αρχικά κάπως τρομακτικό δεύτερη ψάχνει τερματικό window-- απομακρυσμένο εντοπισμό σφαλμάτων από φιλοξενούν τέτοιες και such-- και θα επανέλθω σε αυτό όλα αυτό σημαίνει ότι πριν από καιρό. Αλλά αυτό που είναι σημαντικό για την επιχείρηση είναι ότι η κόκκινη τελεία χτυπήθηκε, το πρόγραμμα εντοπισμού σφαλμάτων έχει σκόπιμα παύση execution-- Δεν σε αυτή τη γραμμή αυτή καθαυτή αλλά την πρώτη γραμμή πραγματικό κώδικα σε αυτή τη λειτουργία. Και αυτός είναι ο λόγος γραμμή είναι επτά τώρα επισημαίνονται με κίτρινο χρώμα. Και τώρα ας ρίξουμε μια ματιά στη δεξιά πλευρά. Μοιάζει, από προεπιλογή, αρκετά καλά, έχει χ τι τιμή; 0. Και y έχει τι τιμή; Μηδέν. Και αυτό είναι που πρέπει να αναμένονται κατά την έννοια ότι το x και y-- ότι έχει κίτρινο line-- Δεν εκτελέστηκε ακόμη. Έτσι x δεν θα πρέπει να έχει την τιμή 1. Θα μπορούσε να έχει οποιαδήποτε άλλη τιμή, λεγόμενο αξία σκουπίδια. Και πήραμε τυχεροί στο ότι είναι μηδέν σε αυτό το σημείο, ουσιαστικά. Έτσι τώρα υπάρχει μόνο μερικά κουμπιά πρέπει να φροντίσουν περίπου, όταν τον εντοπισμό σφαλμάτων με αυτόν τον τρόπο. Παρατηρήστε εδώ, έχουμε ένα κουμπί Play. Και αν έχουμε παίξει ή να χτυπήσει επαναλάβει, αυτό είναι μόνο πρόκειται να τρέξει μέσα το υπόλοιπο του προγράμματος ή μέχρι να χτυπά ένα άλλο σημείο διακοπής. Αλλά δεν έχετε ορίσει οποιοδήποτε άλλο σημεία διακοπής έτσι είναι ακριβώς πρόκειται να τρέξει μέχρι το τέλος. Αυτό το είδος των ηττών τους Σκοπός της σπρώξει γύρω. Έτσι, αντί, νοιάζομαι Αυτά τα εικονίδια στα δεξιά. Και αν αιωρούνται πάνω τους, όπως θα έπρεπε πάρα πολύ, θα δείτε λίγο tips-- συμβουλές εργαλείων. Αυτό είναι ένα βήμα πάνω. Τώρα αυτό δεν σημαίνει ότι παράλειψης η ακόλουθη γραμμή κώδικα. Αυτό ακριβώς σημαίνει το εκτελέσει και να προχωρήσουμε στο επόμενο, να προχωρήσουμε στο επόμενο, να προχωρήσουμε στο επόμενο. Με άλλα λόγια, μέσω το κουμπί αυτό, μπορώ να περπατήσει μέσω κωδικός μου ένα βήμα τη φορά. Γραμμή προς γραμμή, κυριολεκτικά. Τώρα, στα δεξιά ότι, υπάρχει ένα άλλο ότι θα δούμε ακριβώς σε μια στιγμή. Αυτή είναι η λεγόμενη Βήμα σε εικονίδιο που είναι Θα μου επιτρέψετε κατάδυσης σε μια άλλη λειτουργία. Αλλά ας δούμε αυτό ακριβώς σε μια στιγμή. Έτσι, Πάω να κάνετε κλικ πάνω βήμα. Και σήμερα παρατηρούμε ότι, όπως κάνω κλικ αυτό το κουμπί στο πάνω δεξιά, Κράτα τα μάτια σου κάτω από περίπου Τοπικά Οι μεταβλητές και να δούμε τι θα συμβεί στο x. X είναι τώρα 1, διότι η κίτρινη γραμμή έχει πλέον εκτελεστεί και έχουμε προχωρήσει σε γραμμή 8. Και ακριβώς σε μια στιγμή y θα πρέπει να ελπίζουμε να γίνει 2. Τώρα, τίποτα που ενδιαφέρουσες συμβαίνει για λίγο. Όλα αυτά είναι είναι printf. Και παρατηρήσετε, στη δευτεροβάθμια τερματικό μου παράθυρο, βλέπω την έξοδο των def εκτύπωσης. Και τώρα έχω να κάνω μια απόφαση ως προγραμματιστής. Μπορώ να το βήμα πάνω από αυτή τη γραμμή του κώδικα, εκτέλεσης, αλλά δεν να πάρει περίεργοι για το τι είναι μέσα. Ή πραγματικά μπορώ να το βήμα σε αυτό και πηγαίνετε στο εσωτερικό της ίδιας της ανταλλαγής. Ας κάνουμε το τελευταίο. Επιτρέψτε μου να προχωρήσει και κάντε κλικ Δεν Βήμα Πάνω όμως στο. Ανακοίνωση, ξαφνικά οι αλλαγές παράθυρο να επισημάνετε την πρώτη γραμμή κώδικα σε Swap. Αυτό είναι γραμμή 21. Και τώρα, τι είδους είναι ότι funky, αν κοιτάξετε εδώ, όπως ήταν αναμενόμενο, ένα κόμμα b είναι 1 και 2, αντίστοιχα. Γιατί είναι temp 32.767; Υπενθυμίζοντας ότι η θερμοκρασία, μοιάζει πολύ το άδειο φλιτζάνι πριν από λίγο, δηλώνεται εδώ στη γραμμή 21. Γιατί 32,000- Θέλω να πω, γιατί είναι είναι μερικά μόνο παράξενο αξία; Ναι; Κοινό: Δεν είναι προετοιμασία. David J. Malan: Είναι δεν έχει προετοιμαστεί. Έτσι, ο υπολογιστής μας είναι πάντα έχει φυσική μνήμη. Έχει πάντα φυσική μνήμη RAM. Και υπάρχει πάντα το μηδέν και ένα είναι εκεί, σωστά; Επειδή είμαστε χρησιμοποιώντας μας υπολογιστή όλη την ημέρα, είστε με τη χρήση του CS50 IDE ή οι εξυπηρετητές όλη την ημέρα. Έτσι ώστε RAM είτε έχει κάποια μηδενικά ή κάποιος ή κάποιοι μηδενικά και μονάδες. Δεν έχει σημασία αν ή Δεν είστε με τη χρήση τους. Μπορείτε όχι μόνο να έχουν κενό χώρους όπου θέλετε bits. Είναι είτε μηδενικά και μονάδες. Έτσι αποδεικνύεται ότι η θερμοκρασία, επειδή Δεν έχω προετοιμαστεί ακόμα, έχουμε αυτά τα 32 κομμάτια, αλλά δεν έχω έχουν προετοιμαστεί για τυχόν γνωστές τιμές. Έτσι, όποια και αν ήταν πιο χρησιμοποιήθηκε πρόσφατα for-- τις 32 bits-- είμαστε ακριβώς βλέπουμε τα αντικείμενα μερικών προηγούμενη χρήση των συγκεκριμένων 32 bits. Μόλις κάνετε κλικ Βήμα Πάνω όμως, φτου, θερμοκρασία πρόκειται να πάρει την τιμή 1. Και αν το κάνω πάλι, είναι ένα πρόκειται να δοθεί η τιμή 2 και στη συνέχεια β πρόκειται να να δοθεί η τιμή 1. Και ναι, ποιο είναι ωραίο τώρα αυτό το σημείο στην ιστορία είναι ότι το πρόγραμμα εντοπισμού σφαλμάτων είναι δείχνοντάς μου, σούπερ αργά με το δικό μου ρυθμό, τι η κατάσταση των Swap είναι. Αλλά παρατηρήσετε στην κορυφή εδώ, προειδοποίηση ότι η στοίβα κλήσης πραγματικότητα έχει δύο στρώματα σε αυτό. Τώρα αυτός που έχει επισημανθεί ως Swap, αν κάνω κλικ στην Κύρια αντ 'αυτού, Παρατηρήστε πώς αλλάζουν οι τοπικές μεταβλητές επειδή ο κύριος του έργου μπορεί να hop μόνο περίπου και να πάει σε οποιαδήποτε διαφορετική εμβέλεια. Έτσι ακόμα κι αν κάνουμε όλα αυτά λειτουργούν σωστά και εναλλαγή Α και Β, αν πάω πέρα ​​δώθε μεταξύ Swap όπου το α είναι 2 και το b είναι 1 και Κύριο, Έχει Κύρια έχουν επηρεαστεί καθόλου; Κανένα. Ποιο είναι λοιπόν το όφελος εδώ; Λοιπόν, αποδεικνύεται ότι οποιαδήποτε στιγμή μπορείτε να καλέσετε μια συνάρτηση όπως Swap, και μπορείτε να το δώσετε επιχειρήματα, τι που περνάτε στη λειτουργία Swap σε αυτή την περίπτωση είναι ένα αντίγραφο από τα επιχειρήματα αυτά. Έτσι, αν x και y είναι το καθένα αντίστοιχα 32 bits, τι είναι να πάρει Swap είναι δύο νέων τοπικών μεταβλητές, ή επιχειρήματα, ονομάζεται και b-- αλλά αυτά είναι αυθαίρετα names-- αλλά το μοντέλο των μηδενικών και αυτοί μέσα α και b είναι παρατάσσονται να είναι ταυτόσημο με χ και y αλλά δεν είναι ο ίδιο πράγμα όπως x και y. Είναι σαν Main έχει το κομμάτι της χαρτί ο αριθμός 1 και 2 για τα χ και y, και στη συνέχεια, όταν τα χέρια που κομμάτι χαρτί για να Swap, Εναλλαγή παίρνει πολύ γρήγορα τη δική του πένα, γράφει κάτω 1 και 2 για το δικό του δελτίο του χαρτιού, τα χέρια πίσω το αρχικό xy στη βασική και στη συνέχεια να κάνει τις δικές του πράγμα με α και β. Και αυτό είναι τώρα εξαιρετικά σημαντικό, διότι Αυτό έχει επιπτώσεις τετριμμένη για γράφει πραγματικά σωστό κωδικό γιατί φαίνεται ότι δεν μπορούν να ανταλλάξουν δύο μεταβλητών. Έχω γράψει μια σωστή λειτουργία Swap. Έχουμε εφαρμόσει με Lauren ως η σωστή λειτουργία εναλλαγής στην πραγματικότητα, αλλά προφανώς όλα αυτά δεν θέματα, εάν δεν μπορείτε πραγματικά ανταλλάξουν δύο τιμές μόνιμα. Έτσι, χρειαζόμαστε έναν άλλο τρόπο για να πάρει πραγματικά σε αυτό, και πρέπει να είμαστε σε θέση να στην πραγματικότητα λύσει αυτό το πρόβλημα. Και αποδεικνύεται out-- και θα έρθει πίσω σε αυτό το συγκεκριμένο εικόνα πριν long-- αυτός είναι ένας τρόπος που μπορείτε να σχεδιάσετε τη μνήμη του υπολογιστή σας. Είναι απλά ένα ορθογώνιο. Θα μπορούσε να αντλήσει οποιοδήποτε διάφορους τρόπους, αλλά είναι βολικό για να αντλήσει ως ορθογώνιο για τον εξής λόγο. Εμείς πάμε για να ξεκινήσει σήμερα και πέρα μιλάμε για τη λεγόμενη στοίβα. Και η στοίβα είναι απλά ένα κομμάτι της RAM-- ένα μεγάλο κομμάτι του memory-- ότι οι λειτουργίες έχουν πρόσβαση όταν και αν ονομάζεται. Και έτσι αποδεικνύεται ότι στο το κάτω μέρος της στοίβας αυτής της είναι όπου το σύνολο των τοπικών μεταβλητών Κύριο του org και C και org V και όλα αυτά τα πράγματα πρόκειται να πάει από προεπιλογή. Και αν Main καλεί κάποια άλλη λειτουργία, όπως Swap, καλά, Εναλλαγή πρόκειται να πάρει ένα άλλο στρώμα της μνήμης έως και πάνω από αυτό. Και έτσι απλά για να σας δώσει μια γρήγορη βιαστική εικόνα σχετικά με αυτό, αν πάω πάνω here-- και επιτρέψτε μου να αντικατοπτρίζουν αυτό για το γενικά ως well-- αυτό που πραγματικά έχω, αν ενδιαφερόμαστε μόνο για το κάτω από αυτήν την εικόνα για τώρα, είναι ότι όταν τρέχω ένα πρόγραμμα Κύρια και φώναξαν, Κύρια δίνεται ένα μεγάλο κομμάτι της RAM στον υπολογιστή μου που είναι στο κάτω μέρος αυτής της λεγόμενης στοίβας. Και Πάω να το σύρει σκοπίμως ως ένα τετράγωνο. Έτσι είναι όπως 32 bit και τέσσερα byte. Και αν αυτή η κύρια λειτουργία έχει μεταβλητή που ονομάζεται x με τιμή 1 και έχει μια μεταβλητή που ονομάζεται y με την τιμή των 2, που είναι σαν να παίρνετε αυτό το αγκίδα της μνήμης που ΑΡΧΙΚΗ έχει δοθεί από το λειτουργικό σύστημα και διαιρώντας αυτό έτσι ώστε η πρώτη τοπική μεταβλητή πηγαίνει εδώ, η δεύτερη πηγαίνει εδώ, και αυτό είναι όλο. Όταν Κύρια καλεί Swap, Εναλλαγή αποκτά το δικό του κομμάτι της μνήμης ότι θα συντάξει, όπως αυτό από το λειτουργικό σύστημα, και πρόκειται να της δική τοπικές μεταβλητές με βάση σχετικά με την εφαρμογή μας νωρίτερα με τις τοπικές μεταβλητές και β ότι αρχικά να πάρει τις τιμές 1 και 2. Στη συνέχεια, όμως, το συντομότερο ο κώδικας Swap εκτελεί, και Lauren swaps στην πραγματικότητα η ΕΕ και το γάλα, τι συμβαίνει; Λοιπόν, αυτό το 2 γίνεται ένα 1, αυτό 1 γίνεται μια 2, και, από τον τρόπο, υπάρχει μια μεταβλητή temp που είναι να χρησιμοποίησε το σύνολο του χρόνου που τελικά φεύγει. Αλλά δεν έχει σημασία πόση δουλειά που κάνετε Σε αυτή τη γραμμή of-- σε αυτό το χώρο μνήμης, Χ και Υ είναι εντελώς ανέγγιχτη. Έτσι, χρειαζόμαστε κάποιο τρόπο να δώσει Εναλλαγή και λειτουργίες όπως το μυστικό πρόσβασης, αν θέλετε, να λειτουργίες like-- στη μνήμη σαν x και y. Έτσι, ας ρίξουμε μια ματιά ένα παράδειγμα που βοηθά δούμε ακριβώς τι έχει πρόκειται για ολόκληρο αυτό το διάστημα. Πάω να πάει μπροστά και να ανοίξει Σύγκριση Μηδέν. Και Πάω να κλείσει εντοπισμού σφαλμάτων μας, Πάω για να κλείσετε αυτό το τρομακτικό μήνυμα που αναζητούν το ακριβώς λέει, περιμένετε ένα λεπτό, είστε στη μέση debugging. Πάω να κρύψει αυτήν την καρτέλα εδώ μόνο για να πάει πίσω στην απλότητα. Γι 'αυτό μην ανησυχείτε αν το GDB σκοτώνεται. Αυτό σημαίνει απλά ότι το πρόγραμμα έχει έχουν εγκαταλείψει, σκόπιμα σε αυτήν την περίπτωση, από μένα. Και τώρα Συγκρίνετε Zero κάνει αυτό. Είμαι χρησιμοποιώντας το CS50 βιβλιοθήκη στο πρότυπο I / O. Έχω μια βασική λειτουργία που πρώτα λέει, να πω κάτι, και παίρνει ένα string. Στη συνέχεια λέει ξανά και παίρνει μια άλλη χορδή. Και παρατηρήσετε ότι αυτά τα δύο strings καλούνται s και t, αντίστοιχα. Και τώρα αυτό το πρόγραμμα, Σύγκριση Μηδέν, ο σκοπός του στη ζωή, που θα έπρεπε να μου πει, έκανα πληκτρολογήστε το ίδιο πράγμα; Και έτσι Πάω πίσω στην πρώτη εβδομάδα. Είμαι χρησιμοποιώντας ίσα ίσα χειριστή μου το οποίο είναι ο φορέας της ποιότητας. Δεν είναι ο φορέας ανάθεσης, ο φορέας ισότητας. Είμαι απλά συγκρίνοντας s και t. Ας πραγματικά να προχωρήσει και να το κάνουμε αυτό. Και Πάω να πάει μπροστά και να συγκρίνετε Zero. Πάω να κάνω ./comparezero. Και Πάω να πάει μπροστά και να πω κάτι όπως, ας κάνουμε τη μαμά σε πεζά και πώς για την μαμά με κεφαλαία γράμματα. Και φυσικά πληκτρολογήστε διαφορετικά πράγματα. Εντάξει. Αυτό είναι αναμενόμενο. Ας το εκτελέσετε ξανά. Και τις δύο φορές κάνουμε πεζά, πεζά. Αυτό φαίνεται εξαιρετικά όμοια με μένα. Enter. ΕΝΤΆΞΕΙ. Ίσως είναι απλά περίεργο γιατί δεν είναι γραμματική μου αρέσει. Ας κάνουμε μια μαμά κεφαλαίου, κεφάλαιο MOM, πανομοιότυπα. Διαφορετικά πράγματα. Τόσο γιατί είναι αυτό; Λοιπόν, τι πραγματικά συμβαίνει για κάτω από το καπό εδώ; Ας πάμε πίσω πάνω εδώ μόνο για μια στιγμή και να εξετάσει τι GetString Είναι πραγματικά να κάνει. Όταν καλείτε GetString, αυτό είναι μια λειτουργία που εαυτούς μας έγραψε και παίρνει κατά κάποιο τρόπο ένα ακολουθία των χαρακτήρων από το χρήστη. Και ας υποθέσουμε ότι το πρώτο φορά καλώ GetString, αυτό μου δίνει ένα κομμάτι της μνήμης που μοιάζει με αυτό. Και αν πληκτρολογήσει σε όλα τα πεζά m-o-m-- και τι συμβαίνει μετά; Απλά ένα γρήγορο έλεγχο λογικότητας. Ανάστροφη κάθετο μηδέν. Γνωρίζουμε ότι. Και υπενθυμίζουν ότι παίξαμε περίπου με το όνομα του Zamila και ένα σωρό άλλα ονόματα όταν ο Rob ήταν εδώ ψάχνουν σε ό, τι συμβαίνει στο εσωτερικό της μνήμης. Έτσι, αυτή η ιστορία είναι ακριβώς το ίδιο. Αυτό είναι ό, τι GetString επιστρέφει σε μένα. Τώρα, κωδικό μου πριν από λίγο αποθηκεύονται η τιμή επιστροφής της GetString σε μια μεταβλητή που ονομάζεται s. Και τότε η δεύτερη φορά που κάλεσα, αυτό το αποθηκεύεται σε μια μεταβλητή που ονομάζεται t. Έτσι, αν πάω εδώ, χρειάζομαι να συντάξει αυτό το τοπικό variable-- και είμαι γενικά πρόκειται να σχεδιάσετε μια σειρά όπως just-- θα αποκαλούν S-- σαν μια μικρή πλατεία εδώ. Και τώρα, somehow-- πώς μαμά πηγαίνετε στο εσωτερικό αυτής της μεταβλητής s; Λοιπόν, πρέπει να πάμε πίσω στις πρώτες αρχές εδώ. Τι είναι πραγματικά GetString επιστροφή; Έτσι αποδεικνύεται ότι το Μ-Ο-Μ ανάστροφη κάθετο μηδέν, και οποιοσδήποτε αριθμός από άλλες χορδές στη μνήμη, όπως Zamila και Rob ή Andy ή οποιαδήποτε άλλα, είναι φυσικά σε μας RAM ή μνήμη του υπολογιστή. Και μνήμη RAM σας έχει like-- έχετε μια συναυλία της μνήμης RAM, δύο συναυλίες της μνήμης RAM, ή ένα δισεκατομμύριο ή δύο δισεκατομμύριο bytes, ή ίσως ακόμη περισσότερο αυτές τις μέρες. Ας υποθέσουμε, για τους σκοπούς του σήμερα, ότι δεν έχει σημασία το πώς θα αριθμούν τους, αλλά μπορούμε να αριθμούν κάθε εκείνων δισεκατομμύρια ή δύο δισεκατομμύρια ή τέσσερα δισεκατομμύρια bytes. Και ας πούμε ότι αυθαίρετα Αυτή είναι η πρώτη μπουκιά, δεύτερο δάγκωμα, ΤΡΙΤΗ ΤΕΤΑΡΤΗ. Είμαι σκόπιμα δεν χρησιμοποίηση του μηδέν για σήμερα, αλλά θα επανέλθουμε σε αυτό. Έτσι, με άλλα λόγια, εάν αυτή είναι η πρώτη φορά είμαι με τη χρήση του προγράμματος, Είμαι απλά να πάρει τυχερός και η πρώτη δάγκωμα είναι σε ένα σημείο, στη συνέχεια, δύο στη συνέχεια, τρεις από τέσσερις. Και αν συνέχιζα την κατάρτιση, τον αριθμό πλαισίου δύο δισεκατομμύρια θα είναι πορεία μέχρι εδώ. Λοιπόν, τι νομίζεις, στη συνέχεια, GetString επιστρέφει στην πραγματικότητα; Δεν είναι επιστρέφουν Μ-Ο-Μ ανάποδη μηδέν per se, διότι σαφώς ότι δεν θα χωράει στο κουτί που έχω σχεδιάσει. Λοιπόν, τι άλλο θα μπορούσε να GetString πραγματικότητα πρέπει να επιστρέψει όλα αυτά εβδομάδες; Η απάντηση είναι σχετικά με την πλοίο εδώ κάπου. Μπορείτε δεν μπορεί να χωρέσει Μ-Ο-Μ ανάποδη μηδέν, ναι, τι θα μπορούσε να έχει νόημα αντ 'αυτού; Εάν έπρεπε να είναι εξαιρετικά έξυπνος, βάζοντας σχετικά με την λεγόμενη καπέλο μηχανικής, τι θα μπορούσατε να επιστρέψετε; Ποιο είναι το ελάχιστο ποσό των πληροφοριών θα μπορούσε να επιστρέψει ότι θα εξακολουθούσε σας επιτρέπουν να βρείτε Μ-Ο-Μ στη μνήμη; Ναι; Κοινό: Ένα. David J. Malan: Ένα. Και γιατί ένα; Κοινό: Επειδή θα πω πού να πάτε [δεν ακούγεται]. David J. Malan: Ακριβώς. Είμαι ακριβώς πρόκειται να επιστρέψει τη διεύθυνση της συμβολοσειράς που έχω πάρει. Η διεύθυνση αυτή περίπτωση είναι η θέση ένα. Έτσι, αυτό που πραγματικά που αποθηκεύονται σε S-- και κάθε μεταβλητή συμβολοσειράς έτσι εως τώρα έχει μόλις η διεύθυνση της εν λόγω σειράς. Εν τω μεταξύ, αν καλώ GetString για δεύτερη φορά και εγώ πληκτρολογήστε το κυριολεκτικά το ίδιο thing-- M-O-M με lowercase-- M-O-M και ένα άλλο backslash μηδέν, και τώρα ίσως το πρόγραμμα μου λειτουργεί για κάποιο χρονικό διάστημα, έτσι ίσως αυτό είναι 10, αυτό είναι η τοποθεσία 11, αυτό είναι 12, αυτό είναι 13. Οι υπολογιστές που χρησιμοποιούν κάποιο άλλο μνήμη για οποιονδήποτε λόγο. Τι κάνουμε τώρα πηγαίνει στη δεύτερη μου μεταβλητή στο πρόγραμμα μου δεν είναι; 10. Ακριβώς. Και έτσι όταν εξετάζουμε το πηγαίο κώδικα του προγράμματος αυτού όπου είμαι απλά προσπαθώ να συγκρίνουν τις δύο τιμές, s είναι ίση ίσο με Τ, τι είναι η προφανής απάντηση του ανθρώπου; Ακριβώς επειδή δεν 1 δεν είναι ίσο με 10. Και έτσι εδώ βρίσκεται ένα ευκαιρία για μας πραγματικά απλά να πάει πίσω στο, και πάλι, πρώτο αρχές και να σκεφτούμε, επίσης, τι συμβαίνει κάτω από την κουκούλα; Έχουμε μιλήσει για bits και bytes και τη μνήμη, αλλά στην πραγματικότητα είναι χρήσιμο να κατανοήσουμε γιατί όταν σας καλούν GetString, παρόλο που το σκέφτομαι αυτό είναι επιστροφή Μ-Ο-Μ ή σπάγκο μαμά ή Andy ή Zamila ή τα παρόμοια, τεχνικώς είναι ακριβώς επιστρέφει τη διεύθυνση του εν λόγω κομμάτι της μνήμης. Αλλά αυτό είναι εντάξει. Διότι πώς μπορώ να ξέρω όπου η σειρά τελειώνει; Αν είμαι δοθεί μόνο η αρχή; Λοιπόν, η ανάστροφη κάθετο μηδέν, έτσι δεν είναι; Ακριβώς σε γραμμικό χρόνο μπορώ εκτυπώσετε με τους Def εκτύπωσης Μ-Ο-Μ. Και το συντομότερο βλέπω ανάποδη μηδέν, δεν με νοιάζει όπου ξεκίνησα, Γνωρίζω ήδη σιωπηρά όπου πρέπει να τελειώσει. Και έτσι η σημερινή ημέρα σηματοδοτεί την beginning-- και επιτρέψτε μου να κάνω αυτό δραματικά, διότι πέρασε ένα μεγάλο κόπο για να πάρετε αυτά εδώ κατάρτιση wheels-- Έτσι, σήμερα οι τροχοί αρχίσουν εκπαίδευση να βγει και να μας αποκαλύψει σε least-- [Χειροκρότημα] Αυτή ήταν καλά αξίζει το ταξίδι με το σύστημα Target σήμερα το πρωί, ναι; Έτσι now-- υπάρχει, αποδεικνύεται έξω, δεν υπάρχει τέτοιο πράγμα όπως εγχόρδων. String δεν υπάρχει. Είναι ένα συνώνυμο που είχαμε στο εσωτερικό της βιβλιοθήκης CS50. Στο εξής, θα πάμε για να ξεκινήσετε την κλήση s και t δεν χορδές, αλλά char αστέρια. Και το αστέρι char θα πειράζω εκτός πριν από καιρό. Αλλά αυτό είναι να πούμε, ότι ακόμη και αν συνεχίσουμε χρησιμοποιώντας GetString για τώρα, τεχνικά θα ήθελα να λες αστέρι char και χαρα αστέρων. Και αποδεικνύεται ότι το αστέρι αυτό πρόκειται να υποδηλώσει είναι κάτι που ονομάζεται δείκτης ή μια διεύθυνση. Και στην πραγματικότητα, ένα τρέιλερ για ό, τι βρίσκεται μπροστά μας Είναι αυτό 20 δευτερόλεπτα κλιπ από μας φίλος Nick Parlante στο Πανεπιστήμιο του Στάνφορντ ο οποίος, πριν από αρκετό καιρό, μπορείτε να περάσετε ένα γελοίο ποσό του χρόνου, όσο καλύτερα μπορώ να πω του κουζίνα ή στο υπόγειο του, καθιστώντας πλαστελίνης εισαγωγή στον κόσμο ένας χαρακτήρας που ονομάζεται Binky με τους οποίους θα να εισαχθεί την επόμενη φορά να δείκτες. Έτσι, εδώ είναι μια προεπισκόπηση του τι είναι να έρθει. [ΑΝΑΠΑΡΑΓΩΓΗ] -Γεια Σου, Binky. Ξύπνα. Ήρθε η ώρα για το δείκτη διασκέδαση. -Τι είναι αυτό? Μάθετε για τους δείκτες; Ω, Goody. [Σταματήσετε την αναπαραγωγή] David J. Malan: Και σε αυτό το σημείωμα, θα σας δούμε την Τετάρτη. Εντάξει. Ποιος είναι ο χορός; Ελα. Ποιος είναι ο χορός; Θέλεις να πάρει άρχισε; Θα πάρει άρχισε. Woooo! LAUREN: Γλυκό φανταχτερό Μωυσή.