1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> David J. Malan: Αυτό είναι CS50 και αυτή είναι η αρχή της εβδομάδας τέσσερα. 3 00:00:14,050 --> 00:00:18,630 Και, αγόρι, είναι η Volkswagen σε κόπο όλα αυτά εξαιτίας του λογισμικού. 4 00:00:18,630 --> 00:00:20,264 Ας ρίξουμε μια ματιά. 5 00:00:20,264 --> 00:00:20,930 [ΑΝΑΠΑΡΑΓΩΓΗ] 6 00:00:20,930 --> 00:00:25,560 -Cars, Το πιο έξυπνο χαρακτήρες στους Γρήγορη και Furious ταινίες. 7 00:00:25,560 --> 00:00:29,100 Αυτή την εβδομάδα γερμανική αυτοκινητοβιομηχανία Η Volkswagen βρέθηκε 8 00:00:29,100 --> 00:00:32,490 στη μέση ενός σκανδάλου του ενδεχομένως ποινικές διαστάσεις. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Βρίσκεται προ των πυλών για δισεκατομμύρια σε πρόστιμα, ποινικές διώξεις δυνατό 10 00:00:36,060 --> 00:00:38,560 για τα στελέχη του, όπως η εταιρεία απολογείται 11 00:00:38,560 --> 00:00:41,840 για νοθεία 11 εκατομμύρια αυτοκίνητα σε τη βοηθήσει να νικήσει δοκιμές εκπομπών. 12 00:00:41,840 --> 00:00:44,950 >> -Ορισμένες Πετρελαιοκίνητα μοντέλα ήταν σχεδιαστεί με εξελιγμένο λογισμικό 13 00:00:44,950 --> 00:00:48,440 ότι τα μεταχειρισμένα πληροφορίες, συμπεριλαμβανομένης της θέση του συστήματος διεύθυνσης και του οχήματος 14 00:00:48,440 --> 00:00:51,870 SPEED για να καθορίσετε το αυτοκίνητο ήταν υποβάλλονται σε δοκιμές για τις εκπομπές. 15 00:00:51,870 --> 00:00:55,650 Κάτω από αυτές τις περιστάσεις, ο κινητήρας θα μειώσει τις εκπομπές τοξικών. 16 00:00:55,650 --> 00:00:59,070 Όμως, το αυτοκίνητο ήταν στημένα στην παράκαμψη ότι όταν ήταν να κινούνται. 17 00:00:59,070 --> 00:01:03,320 Οι εκπομπές αυξήθηκαν 10-40 φορές πάνω από τα αποδεκτά επίπεδα EPA. 18 00:01:03,320 --> 00:01:04,280 >> [Σταματήσετε την αναπαραγωγή] 19 00:01:04,280 --> 00:01:05,220 >> David J. Malan: Ας ρίξτε μια ματιά σε αυτό 20 00:01:05,220 --> 00:01:07,250 και να δούμε ακριβώς πώς αυτό θα μπορούσε να εφαρμοστεί 21 00:01:07,250 --> 00:01:09,680 και πώς αυτό θα μπορούσε να επηρεάσει τόσα πολλά αυτοκίνητα σαν αυτό. 22 00:01:09,680 --> 00:01:12,840 Έτσι, στο χέρι μου εδώ είναι ο τύπος απελευθέρωσης που εκδόθηκε από την EPA-- 23 00:01:12,840 --> 00:01:14,620 η Περιβαλλοντική Οργανισμός προστασίας που 24 00:01:14,620 --> 00:01:18,032 είναι ο ρυθμιστικός οργανισμός των ΗΠΑ που χειρίζεται τις περιβαλλοντικές ανησυχίες, 25 00:01:18,032 --> 00:01:19,740 και τότε το πραγματικό Ανακοίνωση νομικού περιεχομένου, που ήταν 26 00:01:19,740 --> 00:01:22,420 αποστέλλουν στην Volkswagen μόλις πριν από λίγες ημέρες. 27 00:01:22,420 --> 00:01:26,530 >> Έτσι, η EPA γράφει, και αποκαλύπτει τώρα δημοσίως, ένα εξελιγμένο λογισμικό 28 00:01:26,530 --> 00:01:29,390 αλγόριθμος για ορισμένα Οχήματα της Volkswagen ανιχνεύει 29 00:01:29,390 --> 00:01:32,630 όταν το αυτοκίνητο διέρχεται δοκιμή επίσημες εκπομπές 30 00:01:32,630 --> 00:01:36,505 και τελικά την πλήρη εκπομπές ελέγχει μόνο κατά τη διάρκεια της δοκιμής. 31 00:01:36,505 --> 00:01:38,380 Η αποτελεσματικότητα του Αυτά τα οχήματα της ρύπανσης 32 00:01:38,380 --> 00:01:43,260 συσκευές ελέγχου των εκπομπών είναι σημαντικά μειωμένη κατά τη διάρκεια όλων κανονικής οδήγησης 33 00:01:43,260 --> 00:01:44,320 καταστάσεις. 34 00:01:44,320 --> 00:01:48,190 Αυτό έχει ως αποτέλεσμα τα αυτοκίνητα που πληρούν τις πρότυπα στο εργαστήριο ή δοκιμή 35 00:01:48,190 --> 00:01:52,790 σταθμό, αλλά κατά τη διάρκεια της κανονικής λειτουργίας εκπέμπουν oxides-- αζώτου ή NOx-- 36 00:01:52,790 --> 00:01:54,950 σε ποσοστό μέχρι και 40 φορές το πρότυπο. 37 00:01:54,950 --> 00:01:58,220 Το λογισμικό που παράγεται από τη Volkswagen είναι μια συσκευή απόσπασμα εισαγωγικά, ήττα, 38 00:01:58,220 --> 00:02:00,650 όπως ορίζεται από την Clean Air Act στις ΗΠΑ. 39 00:02:00,650 --> 00:02:03,410 >> Πηγαίνουν για να πω ότι η EPA και ένα άλλο γραφείο 40 00:02:03,410 --> 00:02:07,020 Ανοιχτό το σύστημα αναστολής λογισμικού μετά ανεξάρτητη ανάλυση 41 00:02:07,020 --> 00:02:09,660 από τους ερευνητές στο West Virginia University. 42 00:02:09,660 --> 00:02:14,160 Ρύπανση NOx συμβάλλει στην το διοξείδιο του αζώτου, το όζον της τροπόσφαιρας, 43 00:02:14,160 --> 00:02:15,700 και τα λεπτά σωματίδια. 44 00:02:15,700 --> 00:02:18,090 Η έκθεση σε αυτά ρύπων έχει συνδεθεί 45 00:02:18,090 --> 00:02:20,870 με ένα ευρύ φάσμα από σοβαρές επιπτώσεις στην υγεία, 46 00:02:20,870 --> 00:02:23,637 συμπεριλαμβανομένης της αυξημένης άσθμα επιθέσεις και άλλες αναπνευστικές 47 00:02:23,637 --> 00:02:26,470 ασθένειες που μπορεί να είναι αρκετά σοβαρή να στείλει ανθρώπους στο νοσοκομείο. 48 00:02:26,470 --> 00:02:28,660 Η έκθεση σε όζον και σωματιδίων έχει επίσης 49 00:02:28,660 --> 00:02:31,960 έχουν συσχετιστεί με πρόωρο θάνατο λόγω αναπνευστικής σχετικές 50 00:02:31,960 --> 00:02:35,690 ή καρδιαγγειακές επιδράσεις που σχετίζονται. 51 00:02:35,690 --> 00:02:38,940 Τα παιδιά, οι ηλικιωμένοι, τα άτομα με προϋπάρχουσα ασθένεια του αναπνευστικού συστήματος 52 00:02:38,940 --> 00:02:42,840 είναι ιδιαίτερα σε κίνδυνο για επιπτώσεις στην υγεία των ρύπων αυτών. 53 00:02:42,840 --> 00:02:45,056 >> Συναφώς, πρέπει να πω, είναι αρκετά σοβαρή. 54 00:02:45,056 --> 00:02:46,930 Και ας πάμε για να διαβάσετε ένα ακόμα απόσπασμα 55 00:02:46,930 --> 00:02:49,370 και, στη συνέχεια, θα ρίξουμε μια ματιά οι υποκείμενες επιπτώσεις 56 00:02:49,370 --> 00:02:50,920 αυτού στο πλαίσιο ενός αυτοκινήτου. 57 00:02:50,920 --> 00:02:53,730 Συγκεκριμένα, η Volkswagen κατασκευαστεί και εγκατασταθεί 58 00:02:53,730 --> 00:02:56,210 λογισμικού στην λεγόμενη ηλεκτρονικού ελέγχου 59 00:02:56,210 --> 00:02:59,320 module-- ή ECM-- της τα οχήματα που αισθάνθηκε 60 00:02:59,320 --> 00:03:03,580 όταν το όχημα που δοκιμάζεται για συμμόρφωση με τα πρότυπα εκπομπών EPA. 61 00:03:03,580 --> 00:03:07,510 Με βάση τα διάφορα δεδομένα συμπεριλαμβανομένων της θέση του τιμονιού, όχημα 62 00:03:07,510 --> 00:03:11,280 ταχύτητα, η διάρκεια της μηχανής λειτουργία, και η βαρομετρική πίεση, 63 00:03:11,280 --> 00:03:13,720 Ακριβώς αυτές οι είσοδοι παρακολουθούνται οι παράμετροι 64 00:03:13,720 --> 00:03:17,600 του ομοσπονδιακού διαδικασία δοκιμής που χρησιμοποιούνται για δοκιμών εκπομπών για την πιστοποίηση EPA 65 00:03:17,600 --> 00:03:18,400 σκοπούς. 66 00:03:18,400 --> 00:03:21,850 >> Κατά τη διάρκεια της δοκιμής εκπομπών της EPA, το λογισμικό οχήματα ECM 67 00:03:21,850 --> 00:03:25,060 έτρεξαν το λογισμικό που παράγεται αποτελέσματα συμβατό εκπομπές. 68 00:03:25,060 --> 00:03:28,340 Σε όλες τις άλλες περιπτώσεις, η λογισμικό ECM όχημα 69 00:03:28,340 --> 00:03:31,090 έτρεξε ένα ξεχωριστό δρόμο βαθμονόμησης το οποίο μειώνεται 70 00:03:31,090 --> 00:03:34,360 η αποτελεσματικότητα του συνολικού συστήματος ελέγχου των εκπομπών, 71 00:03:34,360 --> 00:03:37,864 συγκεκριμένα η εκλεκτική καταλυτική μείωση του Lean NOx trap-- 72 00:03:37,864 --> 00:03:39,280 το οποίο θα δούμε περίπου σε μια στιγμή. 73 00:03:39,280 --> 00:03:43,040 Ως αποτέλεσμα, οι εκπομπές ΝΟχ αυξήθηκε κατά ένα συντελεστή 10 έως 40 φορές 74 00:03:43,040 --> 00:03:47,450 πάνω από τα επίπεδα συμβατά EPA ανάλογα με τον τύπο του κύκλου οδήγησης. 75 00:03:47,450 --> 00:03:50,800 >> Έτσι αυτό σημαίνει πραγματικά, και η πηγαίο κώδικα για τη λειτουργία του λογισμικού 76 00:03:50,800 --> 00:03:53,190 σχετικά με τις Volkswagen δεν έχει ακόμη δημοσιοποιηθεί, 77 00:03:53,190 --> 00:03:56,460 είναι ότι, αποτελεσματικά, αυτό ισοδύναμο είναι κάπου εκεί μέσα 78 00:03:56,460 --> 00:03:57,830 του κώδικα της Volkswagen. 79 00:03:57,830 --> 00:04:02,200 Εάν δοκιμάζονται, και αν το αυτοκίνητο ανιχνεύει ορισμένων περιβαλλοντικών παραγόντων 80 00:04:02,200 --> 00:04:04,330 όπως το τιμόνι θέση ή η κίνηση 81 00:04:04,330 --> 00:04:06,710 ή η έλλειψη αυτής του αυτοκινήτου ή οποιοσδήποτε αριθμός από άλλους παράγοντες 82 00:04:06,710 --> 00:04:09,940 που είναι σήμερα η υπόθεση να είναι μέρος αυτού του τύπου, 83 00:04:09,940 --> 00:04:12,370 απλά ενεργοποιήστε πλήρη έλεγχο των εκπομπών. 84 00:04:12,370 --> 00:04:15,670 Με άλλα λόγια, αρχίζουν εκπέμπουν λιγότερο από τους ρύπους. 85 00:04:15,670 --> 00:04:18,769 >> Αλλιώς, σε κάθε άλλη περίπτωση όταν δεν διαπιστώνεται ότι είναι 86 00:04:18,769 --> 00:04:20,790 στο εργαστήριο, το μόνο που δεν το κάνουν. 87 00:04:20,790 --> 00:04:24,320 Και έτσι μπορείτε να απλοποιήσετε αυτό σε πιο σκυρόδεμα ψευδοκώδικα με κάτι 88 00:04:24,320 --> 00:04:24,820 σαν αυτό. 89 00:04:24,820 --> 00:04:27,810 Αν οι τροχοί στρέφονται, αλλά το τιμόνι δεν είναι, ενδεικτικά 90 00:04:27,810 --> 00:04:30,060 ότι το αυτοκίνητο είναι σε μερικά είδος περιστρεφόμενου κυλίνδρου 91 00:04:30,060 --> 00:04:32,550 αλλά σε κάποιο είδος του αποθήκη που δοκιμάζεται, 92 00:04:32,550 --> 00:04:36,070 τότε συμπεριφέρονται όπως η EPA θα θέλαμε. 93 00:04:36,070 --> 00:04:37,960 Διαφορετικά, δεν το κάνουν. 94 00:04:37,960 --> 00:04:40,420 Έτσι, ας ρίξουμε μια ματιά σε ένα σύντομο βίντεο που 95 00:04:40,420 --> 00:04:45,391 ρίχνει μια ματιά σε αυτό που οι επιπτώσεις είναι αυτό πραγματικά μηχανικά. 96 00:04:45,391 --> 00:04:48,620 >> [ΑΝΑΠΑΡΑΓΩΓΗ] 97 00:04:48,620 --> 00:04:52,800 >> -Τελευταία Παρασκευή EPA ανακοίνωσε ότι ορισμένοι Αυτοκίνητα Volkswagen Audi πραγματοποιηθεί από το 2009 98 00:04:52,800 --> 00:04:55,840 και φέτος χρησιμοποιούσαν το λεγόμενο σύστημα αναστολής 99 00:04:55,840 --> 00:04:59,060 για να πάρει γύρω από τους νόμους εκπομπών σχεδιασμένο για να κρατήσει τον αέρα καθαρό. 100 00:04:59,060 --> 00:05:01,700 Αλλά τι σημαίνει αυτό ακριβώς; 101 00:05:01,700 --> 00:05:04,666 >> Λοιπόν, τα σύγχρονα αυτοκίνητα έχουν δεκάδες των υπολογιστών στο εσωτερικό τους. 102 00:05:04,666 --> 00:05:07,040 Και μερικοί από αυτούς τους υπολογιστές συμβάλλει στο συντονισμό των λειτουργιών 103 00:05:07,040 --> 00:05:09,590 του κινητήρα για βέλτιστη απόδοση, ενώ φροντίζοντας 104 00:05:09,590 --> 00:05:12,340 ότι δεν υπάρχει πάρα πολύ τα σκουπίδια που βγαίνει από το σωλήνα της εξάτμισης. 105 00:05:12,340 --> 00:05:15,170 Έχουν πράγματι εργάζονται Με αυτό τον τρόπο για αρκετές δεκαετίες τώρα. 106 00:05:15,170 --> 00:05:17,380 Βασικά, κάθε μέρος του κινητήρα ενός σύγχρονου αυτοκινήτου 107 00:05:17,380 --> 00:05:20,080 διαθέτει έναν αισθητήρα ή τον ελεγκτή σε αυτό, και αυτούς τους υπολογιστές 108 00:05:20,080 --> 00:05:23,460 διαβάζετε δεδομένα σε χιλιάδες φορές ανά δευτερόλεπτο προσαρμογές αποφάσεων 109 00:05:23,460 --> 00:05:26,220 όπως η αναλογία καυσίμου προς αέρα ότι πρόκειται μέσα στους κυλίνδρους. 110 00:05:26,220 --> 00:05:28,730 >> Αυτά εξαπάτηση Volkswagen και τα μοντέλα της Audi είναι πετρελαιοκίνητα, 111 00:05:28,730 --> 00:05:30,890 και πετρελαιοκινητήρες έχουν ένα ακόμη πραγματικά σημαντικό υπολογιστή 112 00:05:30,890 --> 00:05:34,030 ελεγχόμενες παραμέτρους, η οποία είναι η ποσότητα άκαυστου καυσίμου θα 113 00:05:34,030 --> 00:05:35,200 στην εξάτμιση. 114 00:05:35,200 --> 00:05:36,310 Τώρα που ακούγεται άσχημα. 115 00:05:36,310 --> 00:05:39,642 Δεν ακούγεται σαν εσάς θα θέλατε άκαυτο καύσιμο να εισέλθει στην εξάτμιση. 116 00:05:39,642 --> 00:05:41,600 Αλλά στην περίπτωση ενός ντίζελ, έχετε κάτι 117 00:05:41,600 --> 00:05:46,110 ονομάζεται παγίδα NOx, το οποίο είναι μια συσκευή που απορροφά και παγίδες για τα οξείδια του αζώτου 118 00:05:46,110 --> 00:05:48,880 που είναι ρύπους που ενδέχεται να Αλλιώς πηγαίνετε στην ατμόσφαιρα. 119 00:05:48,880 --> 00:05:53,040 Και το αποτέλεσμα αυτής της παγίδας NOx ενισχύεται με άκαυτο καύσιμο. 120 00:05:53,040 --> 00:05:56,650 Έτσι μια συσκευή η ήττα είναι ένα ειδικό πρόγραμμα μέσα σε αυτούς τους υπολογιστές που μπορούν να το κάνουν 121 00:05:56,650 --> 00:05:59,527 μοιάζει με το αυτοκίνητο ανταποκρίνεται εκπομπών πρότυπα, ακόμη και όταν αυτό δεν συμβαίνει. 122 00:05:59,527 --> 00:06:01,110 Η Volkswagen είχε ένα πρόβλημα στα χέρια του. 123 00:06:01,110 --> 00:06:04,050 Πετρελαιοκινητήρες του ήταν γνωστά για να πάρει μεγάλη οικονομία καυσίμου, 124 00:06:04,050 --> 00:06:07,510 αλλά η παγίδα NOx λειτουργεί μόνο καλά όταν περισσότερο καύσιμο που χρησιμοποιείται. 125 00:06:07,510 --> 00:06:10,460 Έτσι, το αυτοκίνητο θα ανιχνεύσει, χρησιμοποιώντας αυτή τη συσκευή ήττα, 126 00:06:10,460 --> 00:06:13,870 όταν είχε πάρει μια εκπομπών δοκιμή, θα χρησιμοποιήσει περισσότερα καύσιμα, 127 00:06:13,870 --> 00:06:16,830 κάνουν τη δουλειά παγίδα NOx καλά, εκπομπές θα ήταν μια χαρά. 128 00:06:16,830 --> 00:06:21,130 Αλλά τότε μπορείτε να πάρετε στο δρόμο, τη συσκευή σβήνει, καίτε λιγότερα καύσιμα 129 00:06:21,130 --> 00:06:24,256 αλλά βάζετε όσο 40 φορές περισσότερους ρύπους στην ατμόσφαιρα. 130 00:06:24,256 --> 00:06:26,130 Αλλά πώς στο καλό το έκανε το αυτοκίνητο γνωρίζουν ότι ήταν 131 00:06:26,130 --> 00:06:27,720 δοκιμάζονται ως προς τις εκπομπές; 132 00:06:27,720 --> 00:06:30,590 Η EPA λέει ότι ήταν ένα εξελιγμένο σύστημα που ελέγχεται πράγματα 133 00:06:30,590 --> 00:06:34,090 όπως η θέση του τιμονιού, ταχύτητα, πόσο καιρό ο κινητήρας ήταν, 134 00:06:34,090 --> 00:06:35,507 και ακόμη και η ατμοσφαιρική πίεση. 135 00:06:35,507 --> 00:06:37,673 Με άλλα λόγια, υπήρχε κανένας τρόπος αυτό ήταν τυχαίο 136 00:06:37,673 --> 00:06:40,260 επειδή το λογισμικό ήταν σχεδιαστεί πολύ προσεκτικά για τον εντοπισμό 137 00:06:40,260 --> 00:06:41,630 δοκιμασία επίσημες εκπομπές. 138 00:06:41,630 --> 00:06:43,588 Αυτή είναι κάποια αρκετά σοβαρά εξαπάτηση και ότι είναι 139 00:06:43,588 --> 00:06:45,420 γιατί η Volkswagen είναι σε όπως σοβαρό πρόβλημα. 140 00:06:45,420 --> 00:06:48,600 Στην πραγματικότητα, CEO τους, Martin Winterkorn, μόλις παραιτήθηκε. 141 00:06:48,600 --> 00:06:49,820 >> Λοιπόν, τι θα συμβεί στη συνέχεια; 142 00:06:49,820 --> 00:06:53,900 Λοιπόν, εάν είστε ένας από τους μισό εκατομμύριο Jettas ντίζελ, Beatles, Μακρά κάλτσες, Passats, 143 00:06:53,900 --> 00:06:56,220 ή Audi A3s πραγματοποιηθεί, Τα καλά νέα είναι ότι 144 00:06:56,220 --> 00:06:57,886 ότι το αυτοκίνητό σας είναι ακόμα ασφαλές στην οδήγηση. 145 00:06:57,886 --> 00:07:00,510 Δεν χρειάζεται να το βάλετε στην άκρη έως ότου η Volkswagen εκδίδει ανάκληση. 146 00:07:00,510 --> 00:07:02,509 Αλλά σε κάποιο σημείο από όπου και αν κατά πάσα πιθανότητα θα έχουν 147 00:07:02,509 --> 00:07:04,230 να ενημερώσετε το λογισμικό στο εσωτερικό του αυτοκινήτου σας. 148 00:07:04,230 --> 00:07:06,927 Όταν συμβαίνει αυτό ίσως πάρετε λιγότερα μίλια ανά δεξαμενή. 149 00:07:06,927 --> 00:07:09,260 Οι δικηγόροι έχουν ήδη ετοιμάζονται για αγωγές ταξική δράση 150 00:07:09,260 --> 00:07:12,500 έτσι ώστε οι ιδιοκτήτες θα μπορούσε να πάρει αποζημίωση σε κάποιο σημείο στο μέλλον. 151 00:07:12,500 --> 00:07:15,832 Αλλά αυτό δεν πρόκειται να να συμβεί οποιαδήποτε στιγμή σύντομα. 152 00:07:15,832 --> 00:07:16,711 >> [Σταματήσετε την αναπαραγωγή] 153 00:07:16,711 --> 00:07:19,960 David J. Malan: Έτσι, αυτό αυξάνει πραγματικά μια ενδιαφέρουσα μεγαλύτερο ερώτημα εικόνα 154 00:07:19,960 --> 00:07:20,660 ώστε να εμπιστεύονται. 155 00:07:20,660 --> 00:07:21,160 Σωστά; 156 00:07:21,160 --> 00:07:24,300 Όλοι μας έχουμε iPhones ή ανδροειδή ή κάτι στις τσέπες μας πιο πιθανό 157 00:07:24,300 --> 00:07:26,500 Αυτές τις μέρες, ή φορητούς υπολογιστές στα πόδια μας, που είναι 158 00:07:26,500 --> 00:07:28,510 τρέχει το λογισμικό που είναι από Apple και η Microsoft 159 00:07:28,510 --> 00:07:30,710 και τσαμπιά από άλλες εταιρείες. 160 00:07:30,710 --> 00:07:34,240 Αλλά πώς ξέρουμε ότι αυτό που αυτά τα προϊόντα λογισμικού που κάνει 161 00:07:34,240 --> 00:07:37,680 είναι στην πραγματικότητα ό, τι αυτοί εταιρείες λένε ότι κάνουν; 162 00:07:37,680 --> 00:07:39,610 >> Για παράδειγμα, ποιος μπορεί να να πω ότι κάθε φορά που 163 00:07:39,610 --> 00:07:42,200 πραγματοποιήσετε μια κλήση στο iPhone σας ή Android τηλέφωνο ή τα παρόμοια, 164 00:07:42,200 --> 00:07:45,650 ότι ο αριθμός τηλεφώνου δεν είναι, επίσης, να ανεβάσει στο διακομιστή κάποιου εταιρείας 165 00:07:45,650 --> 00:07:48,399 λόγω κάποιου προγράμματος που έχετε γραπτή, είτε πρόκειται για το λειτουργικό 166 00:07:48,399 --> 00:07:51,070 το ίδιο σύστημα όπως το iOS ή Android, ή επειδή έχετε κατεβάσει 167 00:07:51,070 --> 00:07:53,880 μερικά τρίτο party εφαρμογή ότι κατά κάποιον τρόπο ακούει 168 00:07:53,880 --> 00:07:57,120 σε ό, τι πληκτρολογείτε ή ό, τι είστε πραγματικά λέγοντας. 169 00:07:57,120 --> 00:07:59,500 Πώς ξέρετε ότι, όταν Τα παιδιά τρέχουν να σας Clang 170 00:07:59,500 --> 00:08:02,590 ή κάνει για να συντάξει σας το δικό της λογισμικό σε CS50, πώς 171 00:08:02,590 --> 00:08:06,080 μπορείτε να κάνετε τη δική προσωπικό ότι CS50 είναι, μέσω της βιβλιοθήκης CS50, 172 00:08:06,080 --> 00:08:08,690 δεν έχει την καταγραφή κάθε χορδή που έχετε πάρει ποτέ 173 00:08:08,690 --> 00:08:10,276 ή κάθε ίντσα έχετε πάρει ποτέ; 174 00:08:10,276 --> 00:08:12,900 Λοιπόν, θα μπορούσε σίγουρα ματιά τον πηγαίο κώδικα για κάτι 175 00:08:12,900 --> 00:08:15,233 όπως η βιβλιοθήκη CS50, που θα μπορούσε να εξετάσει τον πηγαίο κώδικα 176 00:08:15,233 --> 00:08:18,170 για το λειτουργικό σύστημα Linux εκτελείται σε CS50 IDE. 177 00:08:18,170 --> 00:08:23,090 Αλλά μια καταπληκτική παρουσίαση δόθηκε το 1984 178 00:08:23,090 --> 00:08:26,730 στην παραλαβή του βραβείου Turing με ένα πολύ διάσημος επιστήμονας υπολογιστών γνωστή 179 00:08:26,730 --> 00:08:29,750 as-- ονομάζεται Ken Thompson ο οποίος έλαβε το Βραβείο Turing η οποία 180 00:08:29,750 --> 00:08:33,500 Είναι το είδος της επιστήμης των υπολογιστών Βραβείο Νόμπελ, αν θέλετε, 181 00:08:33,500 --> 00:08:35,309 για το έργο του σχετικά με ένα λειτουργικό σύστημα που ονομάζεται 182 00:08:35,309 --> 00:08:39,039 Unix, η οποία είναι πολύ παρόμοια σε πνεύμα με αυτό που χρησιμοποιούν οι οποίες είναι το Linux. 183 00:08:39,039 --> 00:08:41,960 Και το ερώτημα που ζήτησε στο έργο του ομιλία αποδοχής, κατ 'ουσίαν, 184 00:08:41,960 --> 00:08:44,910 για τον καθορισμό του πλαισίου για την χρόνια και χρόνια συζητήσεων 185 00:08:44,910 --> 00:08:46,970 για την εμπιστοσύνη και την ασφάλεια, ήταν αυτό. 186 00:08:46,970 --> 00:08:50,410 Σε ποιο βαθμό πρέπει να έχουμε εμπιστοσύνη ένα δήλωση ότι program-- ένα κομμάτι 187 00:08:50,410 --> 00:08:53,010 της software-- είναι απαλλαγμένο από δούρειους ίππους; 188 00:08:53,010 --> 00:08:56,500 Ίσως είναι πιο σημαντικό να εμπιστεύονται οι άνθρωποι που έγραψε το λογισμικό. 189 00:08:56,500 --> 00:08:58,650 >> Και στην πραγματικότητα, έχουμε συνδεδεμένο στη συζήτηση που είχε 190 00:08:58,650 --> 00:09:02,400 έδωσε κατά την αποδοχή αυτού του βραβείου στη δεκαετία του '80 στην ιστοσελίδα του CS50 191 00:09:02,400 --> 00:09:04,030 υπό την σελίδα Διαλέξεις για σήμερα. 192 00:09:04,030 --> 00:09:06,071 Διότι τι θα δείτε είναι ότι δίνει πραγματικά 193 00:09:06,071 --> 00:09:09,430 μια αρκετά απλό παράδειγμα για το πώς ακόμα ένας compiler όπως Clang ή οτιδήποτε άλλο 194 00:09:09,430 --> 00:09:13,950 compilers άλλοι έχουν χρησιμοποιηθεί στο παρελθόν, Τι κι αν είναι ενσωματωμένες στο πρόγραμμα μεταγλώττισης μας 195 00:09:13,950 --> 00:09:18,190 οι ίδιοι που χρησιμοποιείτε είναι λίγο, αν κατάσταση που ουσιαστικά λέει, 196 00:09:18,190 --> 00:09:22,360 εάν παρατηρήσετε ότι αυτός ο κώδικας χρησιμοποιεί η λειτουργία GetString ή η GetInt 197 00:09:22,360 --> 00:09:26,600 λειτουργία, προχωρήστε και τοποθετήστε πίσω πόρτα ή ένας Δούρειος ίππος 198 00:09:26,600 --> 00:09:29,340 έτσι ώστε το εν λόγω πρόγραμμα τώρα έχει κάποια μηδενικά 199 00:09:29,340 --> 00:09:30,930 και αυτοί που κάνουν κάτι κακόβουλο. 200 00:09:30,930 --> 00:09:33,080 Καταγραφή όλων των σας πληκτρολογήσεις, φορτώνοντας τα δεδομένα 201 00:09:33,080 --> 00:09:35,100 σε κάποιο server, ή τίποτα. 202 00:09:35,100 --> 00:09:37,290 >> Και τι Ken Thompson συνεχίζει να κάνει στην ομιλία του, 203 00:09:37,290 --> 00:09:40,580 είναι να αποδείξει ότι ακόμη και αν έχετε πρόσβαση στην πηγή 204 00:09:40,580 --> 00:09:43,794 κώδικα ενός μεταγλωττιστή που κακόβουλα θα μπορούσε να γίνει αυτό, 205 00:09:43,794 --> 00:09:46,210 δεν έχει σημασία, διότι υπάρχει αυτή η κότα και το αυγό 206 00:09:46,210 --> 00:09:49,500 πραγματικότητα του παρελθόντος πολλών χρόνια όπου compilers 207 00:09:49,500 --> 00:09:51,960 χρησιμοποιούνται για την κατάρτιση τους. 208 00:09:51,960 --> 00:09:55,440 Με άλλα λόγια, ο τρόπος πίσω όταν κάποιος είχε να γράψει το πρώτο μεταγλωττιστή. 209 00:09:55,440 --> 00:09:59,060 Και στη συνέχεια, κάθε φορά που έχουν ενημερωθεί ο μεταγλωττιστής αλλάζοντας τον πηγαίο κώδικά του, 210 00:09:59,060 --> 00:10:02,020 προσθέτοντας χαρακτηριστικά και το recompiling για ανθρώπους σαν εμάς να χρησιμοποιούν, επίσης, 211 00:10:02,020 --> 00:10:04,270 από όπου και αν χρησιμοποιείτε το παλιό έκδοση του compiler 212 00:10:04,270 --> 00:10:06,370 για την κατάρτιση του νέου έκδοση του compiler. 213 00:10:06,370 --> 00:10:08,370 Και αν ρίξετε μια ματιά στην ομιλία που έδωσε, 214 00:10:08,370 --> 00:10:10,970 θα δείτε ότι επειδή της κυκλικότητας, 215 00:10:10,970 --> 00:10:14,330 μπορείτε να έχετε πραγματικά σφάλματα ή Δούρειοι ίπποι ενσωματωμένα στο λογισμικό 216 00:10:14,330 --> 00:10:14,990 που χρησιμοποιούμε. 217 00:10:14,990 --> 00:10:18,010 Και ακόμα κι αν κοιτάξετε το πηγαίος κώδικας για αυτά τα προγράμματα, 218 00:10:18,010 --> 00:10:21,550 μπορεί να μην είναι καν εμφανής επειδή η πονηριά είναι στην πραγματικότητα 219 00:10:21,550 --> 00:10:24,710 σε κάποια παλαιότερη έκδοση ενός compiler που έχει ποτέ έκτοτε 220 00:10:24,710 --> 00:10:27,340 έγχυση την απειλή στο λογισμικό μας. 221 00:10:27,340 --> 00:10:29,740 >> Ποια είναι μόνο να πω, εμείς Πραγματικά, δεν μπορεί και δεν πρέπει 222 00:10:29,740 --> 00:10:32,939 εμπιστοσύνη στο λογισμικό που τρέχει σε φορητούς υπολογιστές μας ή τηλέφωνα ή οποιοδήποτε αριθμό των θέσεων. 223 00:10:32,939 --> 00:10:36,230 Και στην πραγματικότητα, αργότερα σε αυτό το εξάμηνο, όταν αρχίσουμε να μιλάμε για web προγραμματισμό 224 00:10:36,230 --> 00:10:38,521 και πραγματικά να αρχίσει την οικοδόμηση web εφαρμογές τους εαυτούς μας, 225 00:10:38,521 --> 00:10:40,285 θα μιλήσουμε για αυτά απειλές και τους άλλους. 226 00:10:40,285 --> 00:10:43,410 Τώρα, μπορεί να έχετε αναρωτηθεί και παρατήρησα ότι υπήρχε ένα μικροσκοπικό μικρό Darth 227 00:10:43,410 --> 00:10:45,842 Vader στα κλιπ που Το Verge έδειχνε εκεί 228 00:10:45,842 --> 00:10:47,550 για την Volkswagen. Αν δεν έχετε δει ποτέ, εγώ 229 00:10:47,550 --> 00:10:49,190 νομίζαμε ότι θα πρέπει να ελαφρύνει η διάθεση, επειδή όλα αυτά είναι 230 00:10:49,190 --> 00:10:50,780 πολύ καταθλιπτικό και τρομακτική. 231 00:10:50,780 --> 00:10:52,910 Πάω να κοιτάμε πίσω στο Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 όταν μια εμπορική από Volkswagen-- και αυτό 233 00:10:55,300 --> 00:10:59,620 σχεδόν καθιστά αγαπητός again-- προβλήθηκε για πρώτη φορά στην τηλεόραση. 234 00:10:59,620 --> 00:11:04,039 Είναι η δεύτερη κλιπ 60 Νομίζω ότι θα απολαύσετε. 235 00:11:04,039 --> 00:11:04,705 [ΑΝΑΠΑΡΑΓΩΓΗ] 236 00:11:04,705 --> 00:11:08,198 [ΜΟΥΣΙΚΗ - ΘΕΜΑ ΤΗΣ «πολέμου των άστρων»] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [DOG γαβγίζει] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [CAR ΑΡΧΙΖΕΙ] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [Σταματήσετε την αναπαραγωγή] 243 00:12:05,955 --> 00:12:06,830 David J. Malan: Ναι. 244 00:12:06,830 --> 00:12:07,663 Ήμουν μόλις έλεγχο. 245 00:12:07,663 --> 00:12:11,360 Αυτό το αυτοκίνητο είναι στον κατάλογο των παραβιάσεων. 246 00:12:11,360 --> 00:12:12,000 Εντάξει. 247 00:12:12,000 --> 00:12:14,040 Έτσι κοιτάξουμε μερικά pseudocode πριν από λίγο. 248 00:12:14,040 --> 00:12:15,380 Και εδώ είναι ένα μεγαλύτερο απόσπασμα του κώδικα ψευδοκώδικα 249 00:12:15,380 --> 00:12:16,921 ότι έχουμε δει αρκετές φορές μέχρι τώρα. 250 00:12:16,921 --> 00:12:19,970 Και ας χρησιμοποιήσουμε αυτή είναι μια ευκαιρία τώρα να εισαγάγει ένα νέο προγραμματισμό 251 00:12:19,970 --> 00:12:23,776 τεχνική που κάναμε δείτε αλγοριθμικά 252 00:12:23,776 --> 00:12:25,400 την περασμένη εβδομάδα, όταν κοιτάξαμε ταξινόμηση με συγχώνευση. 253 00:12:25,400 --> 00:12:28,270 Αλλά ας το επισημοποιήσει και να δούμε πώς θα μπορούσαμε να το χρησιμοποιήσετε σε πραγματικό κώδικα, 254 00:12:28,270 --> 00:12:30,350 και στη συνέχεια θα πάμε να χρησιμοποιήσετε αυτό την τεχνική κάτω από το δρόμο πιο 255 00:12:30,350 --> 00:12:32,000 ενδέχεται να επιλυθούν ορισμένα άλλα προβλήματα. 256 00:12:32,000 --> 00:12:35,790 >> Έτσι, αυτό ήταν ένα από τα πρώτα προγράμματα που έγραψε ποτέ, αν και σε κώδικα ψευδοκώδικα. 257 00:12:35,790 --> 00:12:37,790 Και τι είναι αυτό το πρόγραμμα μας επέτρεψε να κάνουμε μάθημα 258 00:12:37,790 --> 00:12:41,510 ήταν να βρεθεί ο Mike Smith σε ένα τηλεφωνικό κατάλογο. 259 00:12:41,510 --> 00:12:46,216 Και παρατηρήσετε ιδίως οκτώ γραμμές και 11 που είχε αυτή τη δήλωση Go To. 260 00:12:46,216 --> 00:12:48,090 Και στην πραγματικότητα, ορισμένες γλώσσες, μεταξύ των οποίων και C, 261 00:12:48,090 --> 00:12:50,006 στην πραγματικότητα έχουν ένα δήλωση η οποία είναι κυριολεκτικά 262 00:12:50,006 --> 00:12:52,710 πηγαίνετε στο ότι σας επιτρέπει να μεταβείτε σε μια συγκεκριμένη γραμμή. 263 00:12:52,710 --> 00:12:55,470 Είναι γενικά αποδοκιμαζόταν, διότι μπορεί πολύ εύκολα να γίνει κατάχρησή 264 00:12:55,470 --> 00:12:58,490 και μπορείτε να ξεκινήσετε το άλμα σας πρόγραμμα σε όλη τη χώρα, σε αντίθεση 265 00:12:58,490 --> 00:13:00,690 να χρησιμοποιούν το είδος του λογική και η ροή ελέγχου 266 00:13:00,690 --> 00:13:04,000 ότι έχουμε χρησιμοποιήσει μέχρι στιγμής με μόνο βρόχους και τις προϋποθέσεις και τα παρόμοια. 267 00:13:04,000 --> 00:13:08,660 >> Αλλά μπορούμε να απλοποιήσουμε αυτόν τον αλγόριθμο στον κώδικα ψευδοκώδικα ως εξής. 268 00:13:08,660 --> 00:13:11,250 Αντί αυτής της επαναληπτικής ή looping προσέγγιση 269 00:13:11,250 --> 00:13:14,160 όπου συνεχίζουμε πίσω και πίσω και πάλι προς τη γραμμή των τριών, 270 00:13:14,160 --> 00:13:18,300 γιατί δεν έχουμε ακριβώς το είδος του punt και περισσότερο γενικά λένε στην γραμμή επτά και 10, 271 00:13:18,300 --> 00:13:20,570 απλά αντικαθιστούν τα δύο ζεύγη γραμμών με, 272 00:13:20,570 --> 00:13:22,810 else if Smith είναι νωρίτερα στο βιβλίο θα 273 00:13:22,810 --> 00:13:25,110 αναζήτηση Mike στο αριστερό μισό του βιβλίου. 274 00:13:25,110 --> 00:13:28,560 Αλλιώς αν Smith είναι αργότερα στο βιβλίο, αναζητήστε Mike προς τη σωστή 275 00:13:28,560 --> 00:13:29,540 το μισό βιβλίο. 276 00:13:29,540 --> 00:13:31,180 Και παρατηρήσετε ήδη την κυκλικότητα. 277 00:13:31,180 --> 00:13:31,680 Σωστά; 278 00:13:31,680 --> 00:13:34,250 Ψάχνω για Mike στο Ο τηλεφωνικός κατάλογος και, στη συνέχεια, 279 00:13:34,250 --> 00:13:37,090 Εγώ τελικά χτύπησε ίσως γραμμή επτά ή ίσως γραμμή 10 280 00:13:37,090 --> 00:13:41,089 και τη διδασκαλία μου για τον εαυτό μου είναι η αναζήτηση για Mike στο μισό του τηλεφωνικού καταλόγου. 281 00:13:41,089 --> 00:13:42,380 Λοιπόν, πώς μπορώ να ψάξω για τον Mike; 282 00:13:42,380 --> 00:13:44,213 Είμαι στη μέση της ψάχνουν για Mike, γιατί 283 00:13:44,213 --> 00:13:45,860 Σας το είδος της αποστολής μου σε έναν κύκλο; 284 00:13:45,860 --> 00:13:49,590 Αλλά αυτό είναι εντάξει, επειδή ό, τι είναι συμβαίνει με το μέγεθος του προβλήματος, 285 00:13:49,590 --> 00:13:52,630 όπως γράφεται στην γραμμή 7 και 10; 286 00:13:52,630 --> 00:13:54,989 Δεν είμαστε απλά λέγοντας αναζήτηση για Mike, αναζήτηση Mike. 287 00:13:54,989 --> 00:13:56,280 Είμαστε συγκεκριμένα λέει τι; 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Αναζήτηση γι 'αυτόν στο αριστερό μισό της το δεξί μισό οποία είναι αποτελεσματικά 290 00:14:01,610 --> 00:14:03,440 ένα δεύτερο το μέγεθος του προβλήματος. 291 00:14:03,440 --> 00:14:07,170 Έτσι είναι ΟΚ ότι είμαστε το είδος του συμμετέχουν σε αυτή την κυκλικότητα, 292 00:14:07,170 --> 00:14:09,180 Αυτό το κυκλικό επιχείρημα, επειδή τουλάχιστον είμαστε 293 00:14:09,180 --> 00:14:11,090 καθιστώντας το πρόβλημα και μικρότερα. 294 00:14:11,090 --> 00:14:14,220 Και τελικά θα πάμε για να φτάσει ότι η λεγόμενη βασική περίπτωση όπου 295 00:14:14,220 --> 00:14:16,780 έχουμε μόνο μία σελίδα left-- ως εθελοντής μας την περασμένη εβδομάδα 296 00:14:16,780 --> 00:14:18,684 did-- είχαμε μία σελίδα αριστερά και στη συνέχεια δεν το κάνουμε 297 00:14:18,684 --> 00:14:21,600 πρέπει να συνεχίσει να αναζητά τον Mike Smith γιατί είναι είτε σε αυτή τη σελίδα 298 00:14:21,600 --> 00:14:23,080 ή δεν είναι. 299 00:14:23,080 --> 00:14:27,480 >> Λοιπόν, πώς μπορούμε να υλοποιήσει αυτή την ιδέα, αυτή είδος της κυκλικότητας σε πραγματικό κώδικα; 300 00:14:27,480 --> 00:14:31,030 Λοιπόν, μπορούμε να αξιοποιήσουμε μία τεχνική ότι είναι γενικά γνωστό ως αναδρομή. 301 00:14:31,030 --> 00:14:33,960 Και έχουμε δει αυτό το ψευδοκώδικα για τη συγχώνευση του είδους την περασμένη εβδομάδα. 302 00:14:33,960 --> 00:14:37,190 Υπενθυμίζεται ότι αυτή ήταν η ψευδοκώδικα για ταξινόμηση με συγχώνευση. 303 00:14:37,190 --> 00:14:40,560 Είναι αναμφισβήτητα ακόμη πιο απλή από ό, τι φούσκα ή την επιλογή ή την εισαγωγή του είδους 304 00:14:40,560 --> 00:14:43,310 μόνο από την άποψη της απλότητας με το οποίο μπορείτε να το εκφράσει. 305 00:14:43,310 --> 00:14:46,750 >> Αλλά αυτό συμβαίνει γιατί είμαστε το είδος του κυκλικά 306 00:14:46,750 --> 00:14:51,350 λέγοντας, αναζήτηση για κάτι με την έρευνα για το πάλι. 307 00:14:51,350 --> 00:14:53,960 Αλλά είμαστε ψάχνουν είτε σε το αριστερό μισό ή το δεξιό μισό 308 00:14:53,960 --> 00:14:56,070 και στη συνέχεια, τελικά είμαστε συγχωνεύονται σε αυτή την περίπτωση. 309 00:14:56,070 --> 00:14:58,520 Αλλά εδώ, επίσης, με οι δύο αυτές γραμμές του είδους, 310 00:14:58,520 --> 00:15:01,320 δεν έχουμε και πάλι αυτό ιδέα της αναδρομής. 311 00:15:01,320 --> 00:15:05,350 Και συγκεκριμένα τι σημαίνει αυτό, στο πλαίσιο ενός αλγορίθμου, 312 00:15:05,350 --> 00:15:10,880 είναι ότι ένας αλγόριθμος είναι αναδρομικός εάν χρησιμοποιεί ή καλεί τον εαυτό της. 313 00:15:10,880 --> 00:15:14,330 >> Είτε με όρους C, μια λειτουργία είναι recursive-- μια λειτουργία που ονομάζεται 314 00:15:14,330 --> 00:15:18,510 foo είναι αναδρομική αν foo, κάπου στον πηγαίο κώδικα του, 315 00:15:18,510 --> 00:15:21,250 αυτοαποκαλείται το foo λειτουργία. 316 00:15:21,250 --> 00:15:25,790 Και αυτό είναι κακό, αν όλα foo κάνει ποτέ είναι αυτοαποκαλείται ξανά και ξανά. 317 00:15:25,790 --> 00:15:30,600 Είναι εντάξει εάν foo σταματά τελικά, όπως και η ταξινόμηση με συγχώνευση, λέγοντας, περιμένετε ένα λεπτό, 318 00:15:30,600 --> 00:15:32,980 εάν αυτό το πρόβλημα είναι εξαιρετικά μικρό, για παράδειγμα, 319 00:15:32,980 --> 00:15:35,840 ή τον βρήκα τον οποίο είμαι αναζητούν, μόλις επιστρέψει. 320 00:15:35,840 --> 00:15:41,000 Μην αναδρομικά, δεν κυκλικά καλέσετε και πάλι τον εαυτό μου. 321 00:15:41,000 --> 00:15:44,200 >> Και γι 'αυτό ας ρίξουμε μια ματιά πώς αυτό θα μπορούσε να λειτουργεί στην πράξη. 322 00:15:44,200 --> 00:15:48,430 Έτσι, Πάω να πάει μπροστά και ανοιχτό μέχρι δύο παραδείγματα κώδικα εδώ. 323 00:15:48,430 --> 00:15:50,321 Ένας εκ των οποίων ονομάζεται σίγμα 0. 324 00:15:50,321 --> 00:15:52,320 Και αυτό δεν είναι καθόλου αναδρομικό, αλλά ας ρίξουμε 325 00:15:52,320 --> 00:15:53,694 Δείτε τι κάνει αυτό το πρόγραμμα. 326 00:15:53,694 --> 00:15:55,737 Έχω αφαιρεθούν όλα σχόλια από αυτό, αλλά όλα 327 00:15:55,737 --> 00:15:58,070 του πηγαίου κώδικα για το CS50 δικτυακός τόπος έχει σχόλια αν 328 00:15:58,070 --> 00:15:59,570 θέλετε να διαβάσετε μέσα από αυτό και πάλι αργότερα. 329 00:15:59,570 --> 00:16:02,010 Και ας κάνουμε ένα ζευγάρι της λογικής ελέγχει εδώ. 330 00:16:02,010 --> 00:16:06,640 >> Έτσι, στην κορυφή του εν λόγω κώδικα, έχουμε συμπεριλάβει CS50.h. 331 00:16:06,640 --> 00:16:07,650 Τι κάνει αυτό το κάνει; 332 00:16:07,650 --> 00:16:08,990 Γιατί είναι εδώ; 333 00:16:08,990 --> 00:16:11,740 Σε ό, τι λογική απλή γλώσσα. 334 00:16:11,740 --> 00:16:12,424 Τι κάνει? 335 00:16:12,424 --> 00:16:12,858 Ναι. 336 00:16:12,858 --> 00:16:14,160 >> Κοινό: έτσι ώστε η λειτουργία GetInt λειτουργεί. 337 00:16:14,160 --> 00:16:16,243 >> David J. Malan: Ώστε η λειτουργία GetInt λειτουργεί. 338 00:16:16,243 --> 00:16:18,115 Επειδή στο εσωτερικό αυτού αρχείο, CS50.h, η οποία 339 00:16:18,115 --> 00:16:20,950 θα δούμε πριν από καιρό σε όροι του πηγαίου κώδικα του, 340 00:16:20,950 --> 00:16:23,270 έχει μια δέσμη των λειτουργιών declared-- GetInt, GetString, 341 00:16:23,270 --> 00:16:26,950 και ένα σωρό others-- και εκτός έχουμε στην πραγματικότητα που περιλαμβάνουν γραμμή, 342 00:16:26,950 --> 00:16:29,320 η Clang compiler δεν είναι πρόκειται να ξέρει ότι υπάρχει. 343 00:16:29,320 --> 00:16:32,400 Και ίδιο ισχύει για τη γραμμή όπου δύο int ορίζεται 344 00:16:32,400 --> 00:16:35,101 printf, η οποία είναι μια συνάρτηση κρατάμε χρησιμοποιώντας αρκετά. 345 00:16:35,101 --> 00:16:37,850 Τώρα, τέσσερα γραμμή φαίνεται λίγο funky επειδή είναι απλά ένα ένα σκάφος της γραμμής. 346 00:16:37,850 --> 00:16:41,570 Έχει ένα ερωτηματικό, δεν σγουρά τιράντες, δεν υπάρχει κωδικός στο εσωτερικό του. 347 00:16:41,570 --> 00:16:44,640 Αλλά τι έκανε λέμε αυτό το πράγμα σε εβδομάδες παρελθόν; 348 00:16:44,640 --> 00:16:45,140 Ναι. 349 00:16:45,140 --> 00:16:46,060 Έτσι, ένα πρωτότυπο. 350 00:16:46,060 --> 00:16:48,390 Και γιατί έχουμε ένα πρωτότυπο το οποίο φαίνεται 351 00:16:48,390 --> 00:16:51,050 να είναι λίγο περιττή συνήθως επειδή συνήθως 352 00:16:51,050 --> 00:16:53,474 ανατρέξτε στη λειτουργία ξανά αργότερα στο αρχείο, έτσι δεν είναι; 353 00:16:53,474 --> 00:16:56,390 Γιατί λοιπόν have-- είστε ακριβώς ξύσιμο το κεφάλι σας, αλλά θα το πάρω. 354 00:16:56,390 --> 00:16:57,302 Ναι. 355 00:16:57,302 --> 00:17:00,000 >> Κοινό: [δεν ακούγεται] λειτουργία μετά την κύρια. 356 00:17:00,000 --> 00:17:01,000 David J. Malan: Ακριβώς. 357 00:17:01,000 --> 00:17:04,089 Έτσι ώστε ο compiler θα ξέρει θα καθορίσουν ή να εφαρμόσουν τελικά 358 00:17:04,089 --> 00:17:06,579 ότι η λειτουργία μετά την κύρια, κατά πάσα πιθανότητα. 359 00:17:06,579 --> 00:17:08,462 Έτσι Clang και πιο compilers είναι είδος χαζός 360 00:17:08,462 --> 00:17:10,510 και θα ξέρουν μόνο ό, τι τους λέτε. 361 00:17:10,510 --> 00:17:12,569 Και αν θέλετε να χρησιμοποιήσετε μια λειτουργία που ονομάζεται σίγμα, 362 00:17:12,569 --> 00:17:15,710 σας διδάξει καλύτερα τον compiler ότι υπάρχει εκ των προτέρων. 363 00:17:15,710 --> 00:17:17,970 >> Τώρα, κύρια η ίδια, ακόμη και αν και είναι ένα μάτσο γραμμές, 364 00:17:17,970 --> 00:17:19,839 είναι αρκετά εξοικειωμένοι ελπίζω μέχρι τώρα. 365 00:17:19,839 --> 00:17:21,942 Είναι πήρε ένα do while loop σκοπός της οποίας στη ζωή 366 00:17:21,942 --> 00:17:24,400 εδώ είναι προφανώς να πάρει ένα θετικός ακέραιος από το χρήστη. 367 00:17:24,400 --> 00:17:27,349 Και να κρατήσει μόνο εχθρική συμπεριφορά του ή της μέχρι να συνεργαστούν. 368 00:17:27,349 --> 00:17:30,670 Στη συνέχεια, στη γραμμή 16 που έχω μια ενδιαφέρουσα κλήση. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Ποιο στο αριστερό χέρι πλευρά μου δίνει μια Int 371 00:17:33,710 --> 00:17:36,650 η οποία μπορεί να store-- ονομάζεται Answer-- η οποία πρόκειται να αποθηκεύει, προφανώς, 372 00:17:36,650 --> 00:17:39,090 η τιμή επιστροφής της σίγμα. 373 00:17:39,090 --> 00:17:41,840 Έτσι σίγμα είναι μόνο ένα αυθαίρετη, αλλά περιεκτικό όνομα 374 00:17:41,840 --> 00:17:44,500 ότι έχω δώσει σε λειτουργία σκοπός της οποίας στη ζωή 375 00:17:44,500 --> 00:17:47,680 είναι να πάρετε ένα argument-- Θα ονομάσουμε Ν σε αυτήν την case-- 376 00:17:47,680 --> 00:17:52,280 και μόνο για να πάρει το ποσό του εν λόγω αριθμού συν κάθε θετικός αριθμός που 377 00:17:52,280 --> 00:17:53,200 μικρότερα από ό, τι. 378 00:17:53,200 --> 00:17:58,140 >> Έτσι, αν έχω περάσει στον αριθμό 2 σίγμα, θέλω να προσθέσω 2 συν 1 379 00:17:58,140 --> 00:18:00,240 συν 0-- δεν 0-- έτσι ώστε να μου δίνει 3. 380 00:18:00,240 --> 00:18:05,320 Αν έχω περάσει 3 έως σίγμα, θέλω να έχουν 3 συν 2 συν 1, η οποία μου δίνει 6. 381 00:18:05,320 --> 00:18:05,900 Και ούτω καθεξής. 382 00:18:05,900 --> 00:18:09,750 Έτσι απλά προσθέτει όλα τα αριθμών μικρότερη ή ίση με αυτή. 383 00:18:09,750 --> 00:18:12,040 >> Τώρα, εδώ κάτω είμαι απλώς πρόκειται για να εκτυπώσετε την απάντηση. 384 00:18:12,040 --> 00:18:17,330 Έτσι, ως ένα γρήγορο έλεγχο λογική, ας κάνει σίγμα 0-- dot κάθετος σ 0-- 385 00:18:17,330 --> 00:18:18,690 και επιτρέψτε μου να πληκτρολογήσετε 2. 386 00:18:18,690 --> 00:18:19,960 Και εγώ πράγματι να πάρει 3. 387 00:18:19,960 --> 00:18:21,240 Επιτρέψτε μου να πληκτρολογήσετε 3. 388 00:18:21,240 --> 00:18:22,860 Έχω πράγματι πάρει 6. 389 00:18:22,860 --> 00:18:27,636 Και αν κάποιος μπορεί να κάνει τα μαθηματικά γρήγορα, αν κάνω 50 τι θα πάω να πάρω; 390 00:18:27,636 --> 00:18:29,839 >> Κοινό: [δεν ακούγεται]. 391 00:18:29,839 --> 00:18:30,880 David J. Malan: Λοιπόν, όχι. 392 00:18:30,880 --> 00:18:33,340 Αλλά 1.275 η οποία είναι αρκετά κοντά. 393 00:18:33,340 --> 00:18:38,850 Έτσι, αυτό είναι το αποτέλεσμα του να κάνει 50 συν 49 συν 48 συν 47 συν 46 394 00:18:38,850 --> 00:18:40,349 σε όλη τη διαδρομή προς 1. 395 00:18:40,349 --> 00:18:41,390 Έτσι, αυτό είναι όλο σίγμα κάνει. 396 00:18:41,390 --> 00:18:43,350 Αλλά ας δούμε πώς έχουμε εφαρμοστεί τώρα. 397 00:18:43,350 --> 00:18:45,790 Έτσι, εδώ κάτω είναι η ίδια η λειτουργία του. 398 00:18:45,790 --> 00:18:49,000 Και αυτό δεν φαίνεται να έχει τίποτα να κάνει με αναδρομή ακόμα. 399 00:18:49,000 --> 00:18:51,070 Στην πραγματικότητα, είμαστε χρησιμοποιώντας ένα παλιά τεχνική σχολή. 400 00:18:51,070 --> 00:18:56,680 Είμαι προετοιμασία μια μεταβλητή που ονομάζεται άθροισμα στο μηδέν, τότε έχω μια foreloop εδώ, 401 00:18:56,680 --> 00:19:00,790 και είμαι κηρύσσεται Int ονομάζεται Εγώ, ότι αυτό ισούται με 1-- 402 00:19:00,790 --> 00:19:04,080 αν και θα μπορούσα να το θέσει σε ίση το μηδέν, αλλά επειδή κάνω Επιπλέον, 403 00:19:04,080 --> 00:19:05,340 ποιος νοιάζεται αν είναι μηδέν ή ένα. 404 00:19:05,340 --> 00:19:06,660 Είναι πρόκειται να έχουν κανένα αποτέλεσμα. 405 00:19:06,660 --> 00:19:10,110 >> Έτσι είμαι επανάληψη εφ 'όσον έχω είναι μικρότερο από ή ίσο με m, η οποία 406 00:19:10,110 --> 00:19:11,671 είναι το επιχείρημα που ψηφίστηκε το. 407 00:19:11,671 --> 00:19:13,670 Και τότε θα κρατήσει μόνο προσαύξηση Ι και διορατικότητα 408 00:19:13,670 --> 00:19:20,010 του βρόχου όλα τα κάνω κάνει άθροισμα συν ισούται I. Και αυτό είναι σκόπιμη. 409 00:19:20,010 --> 00:19:22,326 Δεν θέλω να κάνω, σε αυτό το περίπτωση, όπως και ποσό συν συν. 410 00:19:22,326 --> 00:19:24,790 Θέλω πραγματικά να προσθέσετε η τρέχουσα αξία του Ι 411 00:19:24,790 --> 00:19:28,190 η οποία διατηρεί παίρνει όλο και μεγαλύτερες και μεγαλύτερο για την αντιστοιχία μεταξύ του λειτουργία. 412 00:19:28,190 --> 00:19:30,210 >> Και τότε θα επιστρέψει ποσό. 413 00:19:30,210 --> 00:19:33,850 Και έτσι απάντηση παίρνει το άθροισμα αξία. 414 00:19:33,850 --> 00:19:35,282 Και τότε να το τυπώσετε έξω. 415 00:19:35,282 --> 00:19:37,740 Έτσι, υπάρχει μια ευκαιρία εδώ, όμως, με το είδος των απλοποίηση 416 00:19:37,740 --> 00:19:41,260 αυτός ο κώδικας εννοιολογικά και το είδος του χτυπήματος είναι ένα 417 00:19:41,260 --> 00:19:43,250 νου από την άποψη της απλότητα μολονότι 418 00:19:43,250 --> 00:19:45,700 παίρνει λίγο χρόνο για να ταξινομήσετε της εκτιμούν γιατί αυτό 419 00:19:45,700 --> 00:19:47,330 είναι ισχυρό σε αυτά τα μικρά παραδείγματα. 420 00:19:47,330 --> 00:19:50,380 Εδώ είναι σίγμα ένα-- τόσο την δεύτερη έκδοση αυτού του κώδικα. 421 00:19:50,380 --> 00:19:55,290 Τα πάντα επάνω στην κορυφή είναι πανομοιότυπες το ίδιο ισχύει και ιστορία όπως και πριν. 422 00:19:55,290 --> 00:19:59,220 Αλλά τώρα ας δούμε το εφαρμογή του σίγμα οποία 423 00:19:59,220 --> 00:20:05,040 Έχω μειώνονται σε μόλις αυτά lines-- τέσσερις γραμμές κώδικα, πραγματικά, 424 00:20:05,040 --> 00:20:06,980 συν κάποια αγκύλες και λευκό χώρο. 425 00:20:06,980 --> 00:20:07,930 >> Αλλά τι κάνω; 426 00:20:07,930 --> 00:20:11,050 Αν το m είναι μικρότερο ή ίσο με μηδέν, θα πρέπει να χειριστεί το είδος του 427 00:20:11,050 --> 00:20:12,490 ότι εξαιρετικά απλή υπόθεση. 428 00:20:12,490 --> 00:20:15,450 Και αν το χέρι μου μηδέν ή τίποτα αρνητικό που είναι ακριβώς παράξενο, 429 00:20:15,450 --> 00:20:17,909 Είμαι ακριβώς πρόκειται να αυθαίρετα αλλά σταθερά να επιστρέψει το μηδέν. 430 00:20:17,909 --> 00:20:20,200 Δεν θέλω αυτό το πράγμα να μπει σε κάποια περίεργα άπειρο 431 00:20:20,200 --> 00:20:21,810 βρόχου εξαιτίας της αρνητικής αξίας. 432 00:20:21,810 --> 00:20:25,070 Έτσι Απλά λέω, αν μπορείτε να μου δώσετε μηδέν ή λιγότερο, είμαι επιστρέφοντας μηδέν. 433 00:20:25,070 --> 00:20:28,220 >> Αλλά αυτό είναι καλό, γιατί αυτό είναι ότι μία σελίδα του βιβλίου τηλεφώνου 434 00:20:28,220 --> 00:20:28,790 ότι έχει απομείνει. 435 00:20:28,790 --> 00:20:32,660 Είμαι δάγκωμα από ένα πολύ συγκεκριμένο πρόβλημα και δεν ζητούν κάτι αναδρομικά. 436 00:20:32,660 --> 00:20:36,580 Αλλά στην γραμμή 31, τι μπορώ να φαίνεται να κάνει; 437 00:20:36,580 --> 00:20:39,780 Οι παρενθέσεις είναι απλά κρατώντας τα πράγματα, ελπίζω, λίγο πιο σαφής. 438 00:20:39,780 --> 00:20:42,110 Αλλά όλα τα κάνω είναι ότι είμαι επιστροφή m-- ανεξαρτήτως 439 00:20:42,110 --> 00:20:45,790 Σας me-- συν το χέρι αξία των συγγνώμη m--, 440 00:20:45,790 --> 00:20:49,052 συν την τιμή του σίγμα m του μείον 1. 441 00:20:49,052 --> 00:20:50,010 Λοιπόν, τι σημαίνει αυτό; 442 00:20:50,010 --> 00:20:53,965 Αν μου δώσεις τον αριθμό 3 ως πρώτη ύλη, η απάντηση που θέλω να πάρει τελικά 443 00:20:53,965 --> 00:20:57,307 είναι 6 επειδή 3 συν 2 συν 1 με 6 δίνει. 444 00:20:57,307 --> 00:20:59,390 Αλλά πώς μπορώ να το σκέφτομαι πώς αυτός ο κώδικας είναι σε λειτουργία; 445 00:20:59,390 --> 00:21:03,070 Την πρώτη φορά που καλώ σίγμα και περνώ στην τιμή 3, 446 00:21:03,070 --> 00:21:07,960 αυτό είναι σαν να λέμε σε ένα κομμάτι χαρτιού, εδώ είναι η αξία 3 447 00:21:07,960 --> 00:21:09,920 και έχω περάσει αυτό ως σίγμα. 448 00:21:09,920 --> 00:21:13,090 3 προφανώς δεν είναι μικρότερη από 0 μέχρι η συνθήκη IF δεν ισχύει. 449 00:21:13,090 --> 00:21:14,020 Ο άλλος δεν το κάνει. 450 00:21:14,020 --> 00:21:14,990 Λοιπόν, τι μπορώ να κάνω; 451 00:21:14,990 --> 00:21:19,902 Θέλω να επιστρέψω m, η οποία είναι 3, συν σίγμα μείον 1 m. 452 00:21:19,902 --> 00:21:21,110 Επιτρέψτε μου λοιπόν να παρακολουθείτε αυτό. 453 00:21:21,110 --> 00:21:22,710 Πάω να θέσει αυτό κομμάτι χαρτί προς τα κάτω. 454 00:21:22,710 --> 00:21:24,668 Και τι αξία, να είναι σαφές, είμαι πρόκειται να περάσει 455 00:21:24,668 --> 00:21:26,540 σε σίγμα σε αυτό το σημείο στην ιστορία; 456 00:21:26,540 --> 00:21:28,080 Τι αριθμό; 457 00:21:28,080 --> 00:21:28,610 2, έτσι δεν είναι; 458 00:21:28,610 --> 00:21:29,670 3 μείον 1 είναι 2. 459 00:21:29,670 --> 00:21:32,000 Γι 'αυτό χρειάζονται λίγο απορρίμματα χαρτιού εδώ. 460 00:21:32,000 --> 00:21:33,931 Έτσι τώρα σίγμα παίρνει κάλεσε ξανά. 461 00:21:33,931 --> 00:21:35,930 Και έχω βάλει σκόπιμα αυτό κάτω επειδή είναι 462 00:21:35,930 --> 00:21:38,070 κάτι σαν παύση ότι η έκδοση της ιστορίας 463 00:21:38,070 --> 00:21:40,720 γιατί τώρα είμαι συγκεντρωμένος με το σήμα της μ μείον 1. 464 00:21:40,720 --> 00:21:42,660 Έτσι, ήταν 3 m, m μείον 1 είναι 2. 465 00:21:42,660 --> 00:21:45,110 Έτσι, εδώ είναι 2 που έχω περάσει. 466 00:21:45,110 --> 00:21:48,510 2 προφανώς δεν είναι μικρότερη από 0 έτσι ώστε περίπτωση δεν ισχύει. 467 00:21:48,510 --> 00:21:53,445 Αλλιώς θα επιστρέψουν m, το οποίο είναι αυτό πράγμα που, συν σίγμα ποια τιμή; 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Έτσι, αν σίγμα της 1-- επειδή m είναι τώρα 2 SO 2 μείον 1 είναι 1. 470 00:21:59,650 --> 00:22:01,950 Έτσι, τώρα έχω μόνο την τιμή 1. 471 00:22:01,950 --> 00:22:04,810 Είμαι περνώντας απλώς τον αριθμό 1 στην sigma-- λειτουργία 472 00:22:04,810 --> 00:22:09,120 ή τον εαυτό μου έτσι here-- 1 δεν είναι προφανώς κάτω από το μηδέν, εξακολουθεί να μην εφαρμόζεται. 473 00:22:09,120 --> 00:22:12,970 >> Αλλιώς επιστροφή συν 1 σίγμα τι; 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Έτσι, επιτρέψτε μου να το θυμόμαστε αυτό. 476 00:22:14,678 --> 00:22:15,920 Θα πάρω πίσω σε αυτό αργότερα. 477 00:22:15,920 --> 00:22:18,060 Τώρα είμαι πρόκειται να πάει μπροστά και να σημειώνω κάτω από τον αριθμό 0, διότι αυτό είναι 478 00:22:18,060 --> 00:22:19,470 επιχείρημα ή η παράμετρος μου. 479 00:22:19,470 --> 00:22:22,400 Είμαι πέρασε τον αριθμό 0 και, τέλος, η διαδικασία αυτή 480 00:22:22,400 --> 00:22:25,760 μόλις επαναλαμβάνομαι διαφημίσεων nauseum παύει γιατί αυτό 481 00:22:25,760 --> 00:22:28,820 μπορώ να κάνω αμέσως μια φορά βλέπω αυτό το 0; 482 00:22:28,820 --> 00:22:29,790 Επιστρέφω μηδέν. 483 00:22:29,790 --> 00:22:31,790 Έτσι τώρα θα πρέπει να επαναφέρετε την ιστορία. 484 00:22:31,790 --> 00:22:34,430 >> Αν τώρα πάμε πίσω στο χρόνο, ποια ήταν η πιο πρόσφατη πράγμα 485 00:22:34,430 --> 00:22:36,670 Το έκανα αν ήταν κυριολεκτικά κουρδίζεται ένα βίντεο; 486 00:22:36,670 --> 00:22:41,630 Πάω να πάρει την πιο πρόσφατη 1 και αυτό μου δίνει 1 συν 0 είναι 1. 487 00:22:41,630 --> 00:22:44,100 Αν έχω κρατήσει το κουρδίζεται ιστορία, ότι πρόκειται να μου δώσει 488 00:22:44,100 --> 00:22:46,880 2 συν αυτό τρέχουσα τιμή, η οποία είναι 1. 489 00:22:46,880 --> 00:22:47,789 Έτσι ώστε να είναι 3. 490 00:22:47,789 --> 00:22:49,330 Και τότε εγώ θα συνεχίσω να κουρδίζεται. 491 00:22:49,330 --> 00:22:54,220 Όταν για πρώτη φορά κάτω από τον αριθμό 3-- έτσι 3 συν 3 μου δίνει 6. 492 00:22:54,220 --> 00:22:57,272 >> Και τώρα, αν έχετε επανέλιξη η δημιουργία βίντεο μέχρι αυτό το σημείο, 493 00:22:57,272 --> 00:22:58,980 Αυτό ήταν το πολύ το πρώτο ερώτημα που έθεσα. 494 00:22:58,980 --> 00:23:01,450 Όταν πέρασε 3, ό, τι είναι σίγμα του 3; 495 00:23:01,450 --> 00:23:04,204 Είναι πράγματι 6, το άθροισμα των όλα αυτά τα κομμάτια του χαρτιού. 496 00:23:04,204 --> 00:23:07,120 Έτσι, αν αυτό παίρνει λίγο χρόνο για να τυλίξτε το μυαλό σας γύρω, αυτό είναι εντάξει. 497 00:23:07,120 --> 00:23:10,700 Αλλά θεωρούν ότι ήταν μια little-- το ήταν πολύ σκόπιμη πως στοιβάζονται 498 00:23:10,700 --> 00:23:12,990 αυτοί οι αριθμοί πάνω από το άλλο. 499 00:23:12,990 --> 00:23:17,440 Είναι το είδος του σαν να έχεις ένα memory-- ρεκόρ στο χρόνο, 500 00:23:17,440 --> 00:23:19,940 σαν καθαριστής σε ένα βίντεο, ότι πράγματι μπορώ να rewind σε. 501 00:23:19,940 --> 00:23:24,350 Και θα πάμε να επανέλθω ότι η μεταφορά σε μόλις ένα μικρό κομμάτι. 502 00:23:24,350 --> 00:23:28,240 >> Αλλά πρώτα, αποδεικνύεται ότι υπάρχει πολλοί geeks και αστείοι άνθρωποι, 503 00:23:28,240 --> 00:23:29,614 Υποθέτω, στο Google. 504 00:23:29,614 --> 00:23:31,530 Θα μπορούσε κάποιος που είναι πολύ καλοί στο μυαλό Googling 505 00:23:31,530 --> 00:23:34,270 έρχονται για μια στιγμή και να με βοηθήσει να ψάξετε για κάτι; 506 00:23:34,270 --> 00:23:35,650 Πολύ, πολύ χαμηλών τόνων. 507 00:23:35,650 --> 00:23:37,870 Κάποιος που δεν είναι ποτέ έρχονται πριν, ίσως. 508 00:23:37,870 --> 00:23:38,370 ΕΝΤΆΞΕΙ. 509 00:23:38,370 --> 00:23:39,030 Ναι; 510 00:23:39,030 --> 00:23:39,530 Ελα. 511 00:23:39,530 --> 00:23:41,410 Ελάτε κάτω. 512 00:23:41,410 --> 00:23:42,183 Ποιο είναι το όνομά σου? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Σαμ. 514 00:23:42,870 --> 00:23:44,290 >> David J. Malan: Σαμ, έλα κάτω. 515 00:23:44,290 --> 00:23:45,320 Αυτό είναι ίδιο. 516 00:23:45,320 --> 00:23:46,280 Χάρηκα για τη γνωριμία. 517 00:23:46,280 --> 00:23:46,780 Γεια σου. 518 00:23:46,780 --> 00:23:47,580 Έλα από εδώ. 519 00:23:47,580 --> 00:23:51,290 Έτσι, το μόνο που χρειάζεται να κάνετε, εάν θα μπορούσε, Σαμ, εδώ είναι το Google. 520 00:23:51,290 --> 00:23:53,240 Μπορείτε να ψάξετε τη διάρκεια της αναδρομής; 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Μην χαλάσουμε. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> Και τώρα let's-- ναι. 525 00:24:00,970 --> 00:24:03,380 Κάντε κλικ στο κουμπί ΟΚ αυτό. 526 00:24:03,380 --> 00:24:04,315 Καλύτερα κλικ αυτό. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ααα, να το πάρετε. 529 00:24:08,020 --> 00:24:08,520 Κανένα? 530 00:24:08,520 --> 00:24:09,050 ΕΝΤΆΞΕΙ. 531 00:24:09,050 --> 00:24:10,430 Ας κάνουμε ένα ζευγάρι άλλους. 532 00:24:10,430 --> 00:24:12,830 Όχι τόσο πολύ σχετικές ακαδημαϊκά εδώ, αλλά έχετε 533 00:24:12,830 --> 00:24:14,520 ποτέ έψαξε στο Google για αναγραμματισμό; 534 00:24:14,520 --> 00:24:15,280 >> SAM: Όχι. 535 00:24:15,280 --> 00:24:15,520 >> David J. Malan: OK. 536 00:24:15,520 --> 00:24:17,186 Αναζήτηση αναγραμματισμός αντί της αναδρομής. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Πόσο περίπου στραβά. 539 00:24:23,790 --> 00:24:25,515 Έχετε ποτέ έψαξε για στραβό; 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Τώρα, αυτό είναι λίγο δύσκολο να δείτε αλλά ελπίζω everything's-- ΟΚ. 542 00:24:32,692 --> 00:24:34,150 Είναι ακριβώς εσείς και εγώ απολαμβάνω. 543 00:24:34,150 --> 00:24:34,690 ΕΝΤΆΞΕΙ. 544 00:24:34,690 --> 00:24:38,950 >> Έτσι, τελικά, αυτό one's-- είναι λίγο στραβό. 545 00:24:38,950 --> 00:24:40,810 Τώρα κάνουμε ένα ρολό βαρέλι. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Υπέροχα. 548 00:24:45,310 --> 00:24:45,910 Εντάξει. 549 00:24:45,910 --> 00:24:47,110 Μεγάλο ευχαριστώ στον Σαμ. 550 00:24:47,110 --> 00:24:49,416 Ορίστε. 551 00:24:49,416 --> 00:24:50,400 Ευχαριστώ. 552 00:24:50,400 --> 00:24:52,807 >> Έτσι, αυτό που συμβαίνει σε όλες τις από αυτές τις ανόητες παραδείγματα; 553 00:24:52,807 --> 00:24:55,640 Έτσι, πραγματικά, κάτω από την κουκούλα του Εκατομμύρια της Google γραμμές κώδικα 554 00:24:55,640 --> 00:24:58,860 προφανώς είναι μερικά ανόητα IF συνθήκες που είναι ουσιαστικά 555 00:24:58,860 --> 00:25:01,160 ελέγχοντας εάν ο χρήστης έχει πληκτρολογήσει τη φράση αυτή, 556 00:25:01,160 --> 00:25:03,760 κάνει κάτι που μάλλον πήρε το μια μη τετριμμένη χρονικό διάστημα 557 00:25:03,760 --> 00:25:06,080 για την εφαρμογή μόνο για να να είναι διασκεδαστικό με αυτόν τον τρόπο. 558 00:25:06,080 --> 00:25:08,430 Αλλά αυτό είναι το μόνο που βράζει κάτω κάτω από το καπό. 559 00:25:08,430 --> 00:25:11,570 Αλλά, φυσικά, αναδρομή είναι περισσότερο από το geekier 560 00:25:11,570 --> 00:25:13,880 παράδειγμα ανάμεσα σε αυτές τις ειδικές κόλπα. 561 00:25:13,880 --> 00:25:16,880 Και σίγουρα υπάρχουν και άλλοι εκεί έξω καθώς και ότι ίσως δεν έχουν ακόμη 562 00:25:16,880 --> 00:25:18,230 ανακάλυψε λίγο ακόμα. 563 00:25:18,230 --> 00:25:22,830 >> Έτσι, ρίξτε μια ματιά, ή να εξετάσει τώρα το ακόλουθο πρόγραμμα, 564 00:25:22,830 --> 00:25:24,830 και σίγουρα να αρπάξει οποιαδήποτε από αυτά στο δρόμο σας έξω. 565 00:25:24,830 --> 00:25:28,820 Πάω να πάει μπροστά και να ανοίξει ένα πρόγραμμα που είναι 566 00:25:28,820 --> 00:25:30,920 θα προσπαθήσω να ανταλλάξουν δύο τιμές. 567 00:25:30,920 --> 00:25:33,210 Αλλά πριν πάμε εκεί, ας το κάνουμε αυτό. 568 00:25:33,210 --> 00:25:38,500 Θα μπορούσαμε να πάρετε μια πιο εθελοντής, νομίζω; 569 00:25:38,500 --> 00:25:40,480 Θα θέλατε να εργαστούν εθελοντικά; 570 00:25:40,480 --> 00:25:40,980 Κανένα? 571 00:25:40,980 --> 00:25:41,890 Έλα επάνω. 572 00:25:41,890 --> 00:25:42,390 Έλα επάνω. 573 00:25:42,390 --> 00:25:42,890 Εντάξει. 574 00:25:42,890 --> 00:25:44,136 Έτσι, το όνομά σας είναι αυτό; 575 00:25:44,136 --> 00:25:44,810 >> LAUREN: Lauren. 576 00:25:44,810 --> 00:25:45,768 >> David J. Malan: Lauren. 577 00:25:45,768 --> 00:25:46,890 Ελάτε επάνω, Lauren. 578 00:25:46,890 --> 00:25:50,140 Έτσι, Lauren είναι να είναι αμφισβητηθεί εδώ ως ακολούθως. 579 00:25:50,140 --> 00:25:52,310 Χάρηκα για τη γνωριμία. 580 00:25:52,310 --> 00:25:55,730 Έτσι Lauren εδώ έχει μπροστά των δύο κενών θέσεων της. 581 00:25:55,730 --> 00:25:57,570 Και έχουμε κάποια πορτοκαλί χυμό και λίγο γάλα 582 00:25:57,570 --> 00:26:00,301 και θα πάμε για να πάει μπροστά και να κάνουμε το εξής. 583 00:26:00,301 --> 00:26:01,550 Εμείς απλά θα να καλύψει αυτό. 584 00:26:01,550 --> 00:26:07,840 Λίγα ουγγιές του γάλακτος εδώ και ας γεμίσει λίγο χυμό πορτοκαλιού εδώ. 585 00:26:07,840 --> 00:26:11,475 >> Και μπροστά από το σύνολο των Αυτά τα μέλη του ακροατηρίου, 586 00:26:11,475 --> 00:26:13,550 ανταλλάξουν τις δύο τιμές αυτών των κυπέλλων. 587 00:26:13,550 --> 00:26:16,970 Βάλτε το χυμό πορτοκάλι στο ποτήρι γάλα και το γάλα στο φλιτζάνι χυμό πορτοκαλιού. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Πώς θα το κάνετε αυτό, αν ήταν σε σπίτι και είχε πρόσβαση σε άλλες προμήθειες; 590 00:26:26,150 --> 00:26:27,400 LAUREN: Βάλτε σε ένα άλλο κύπελλο. 591 00:26:27,400 --> 00:26:28,191 David J. Malan: OK. 592 00:26:28,191 --> 00:26:31,940 Έτσι, ας ρίξουμε μια προσωρινή μεταβλητή, αν θα το κάνουμε. 593 00:26:31,940 --> 00:26:35,871 Και τώρα να προχωρήσει και να υλοποιήσει Αυτή η ίδια διαδικασία εναλλαγής. 594 00:26:35,871 --> 00:26:36,370 Πολύ καλό. 595 00:26:36,370 --> 00:26:41,490 Έχουμε βάλει ΕΕ στην προσωρινή μεταβλητή, το γάλα στη μεταβλητή ΕΕ, 596 00:26:41,490 --> 00:26:44,481 και τώρα η προσωρινή μεταβλητή στη μεταβλητή γάλα. 597 00:26:44,481 --> 00:26:44,980 ΕΝΤΆΞΕΙ. 598 00:26:44,980 --> 00:26:48,740 Έτσι, πολύ καλά κάνει μέχρι στιγμής. 599 00:26:48,740 --> 00:26:50,990 Έτσι, αποδεικνύεται ότι κατέχουν out-- σκέφτηκε για μια στιγμή. 600 00:26:50,990 --> 00:26:54,479 Εδώ, σε αυτό ακριβώς geek για λίγο, αυτό θα είναι ο αντίστοιχος κωδικός C 601 00:26:54,479 --> 00:26:55,520 ότι μόλις εφαρμοστεί. 602 00:26:55,520 --> 00:26:58,650 Είχαμε δύο εισόδους, α και β, και τα δύο η οποία θα πω μόνο για την απλότητα είναι 603 00:26:58,650 --> 00:26:59,260 int του. 604 00:26:59,260 --> 00:27:02,780 Και παρατηρήσετε εδώ, αν θέλω να ανταλλάξουν οι τιμές των δύο μεταβλητών, α και β, 605 00:27:02,780 --> 00:27:06,890 χρειαζόμαστε πράγματι ένα μεσάζοντα, ένα προσωρινή μεταβλητή, μια προσωρινή κύπελλο, 606 00:27:06,890 --> 00:27:10,830 μέσα στο οποίο το ρίχνουμε μια από τις τιμές έτσι ώστε να έχουμε ένα σύμβολο κράτησης θέσης για αυτό. 607 00:27:10,830 --> 00:27:13,480 Αλλά τότε ο κώδικας είναι ακριβώς όπως Lauren εδώ εφαρμογή. 608 00:27:13,480 --> 00:27:15,500 >> Τώρα, απλά για να πάρει ένα λίγο πιο τρελός, αποδεικνύεται 609 00:27:15,500 --> 00:27:20,930 ότι μπορείτε να το κάνετε αυτό χωρίς να μια προσωρινή μεταβλητή. 610 00:27:20,930 --> 00:27:24,870 Για να γίνει αυτό σωστά, όμως, θα πάμε να έχουν να εξαπατήσουν με κάποιο χημεία. 611 00:27:24,870 --> 00:27:26,380 Έχουμε κάποια επιπλέον φλιτζάνια εδώ. 612 00:27:26,380 --> 00:27:29,600 Έτσι, το πιο κοντινό πράγμα που φαίνεται όπως το γάλα και το νερό perhaps-- 613 00:27:29,600 --> 00:27:34,090 ή το γάλα και OJ-- είναι ότι έχουμε κάποια νερό, έτσι θα καλύψει αυτό το ένα επάνω 614 00:27:34,090 --> 00:27:36,486 με λίγες ουγκιές καθαρό νερό. 615 00:27:36,486 --> 00:27:38,332 Αυτό είναι πιθανώς πάρα πολύ. 616 00:27:38,332 --> 00:27:38,832 Ναι. 617 00:27:38,832 --> 00:27:39,934 Αυτό είναι σίγουρα πάρα πολύ. 618 00:27:39,934 --> 00:27:40,600 Κρατήστε για ένα δευτερόλεπτο. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> Και τώρα έχουμε πετρέλαιο, το οποίο, όπως θυμάμαι από μεσαία τάξη χημεία σχολείο, 621 00:27:48,420 --> 00:27:49,990 Ας ελπίσουμε ότι δεν αναμιγνύεται με νερό. 622 00:27:49,990 --> 00:27:53,650 Αλλά αυτό το είδος του είδους μοιάζει με το γάλα και ΕΕ. 623 00:27:53,650 --> 00:27:55,760 Έτσι τώρα, χωρίς τη χρήση μια προσωρινή μεταβλητή, 624 00:27:55,760 --> 00:27:59,260 μπορείτε να ανταλλάξετε αυτές τις δύο τιμές; 625 00:27:59,260 --> 00:28:03,884 Έτσι έλαια πηγαίνει στο κύπελλο νερό, νερό πηγαίνει στο φλιτζάνι λάδι. 626 00:28:03,884 --> 00:28:04,800 LAUREN: Δεν υπάρχουν άλλα κύπελλα; 627 00:28:04,800 --> 00:28:05,940 David J. Malan: Δεν υπάρχουν άλλα κύπελλα. 628 00:28:05,940 --> 00:28:07,860 Και δεν έχω πραγματικά δοκιμαστεί αυτό πριν από το τρέχον έτος 629 00:28:07,860 --> 00:28:10,110 οπότε δεν ξέρω αν αυτό θα λειτουργούν πραγματικά χημικά. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 Αυτό δεν έπρεπε να συμβεί. 632 00:28:18,650 --> 00:28:19,761 Είναι εργασίας; 633 00:28:19,761 --> 00:28:20,260 Εντάξει. 634 00:28:20,260 --> 00:28:20,990 Έτσι, το διαχωρισμό; 635 00:28:20,990 --> 00:28:21,490 Καλή. 636 00:28:21,490 --> 00:28:24,714 Τώρα πήραμε για να πάρει το νερό μέσα στο άλλο κύπελλο. 637 00:28:24,714 --> 00:28:27,630 Εξυπνότερα συγκεντρωτές χημεία θα μπορούσε ίσως κάνει αυτό καλύτερα από μένα. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: Το νερό είναι στο κάτω μέρος. 639 00:28:28,510 --> 00:28:31,910 >> David J. Malan: Το water-- που ήταν Αυτό που είναι βασικό η τελευταία φορά που το έκανε αυτό. 640 00:28:31,910 --> 00:28:33,950 Θα πρέπει να το κάνουμε με τη σωστή σειρά. 641 00:28:33,950 --> 00:28:34,450 Ναι. 642 00:28:34,450 --> 00:28:35,270 Δεν πειράζει. 643 00:28:35,270 --> 00:28:37,290 Έτσι τώρα έχουμε δύο φλιτζάνια λάδι. 644 00:28:37,290 --> 00:28:37,790 ΕΝΤΆΞΕΙ. 645 00:28:37,790 --> 00:28:38,510 Δεν πειράζει. 646 00:28:38,510 --> 00:28:40,110 Αλλά αν αυτή η χημική επεξεργασία από I-- 647 00:28:40,110 --> 00:28:41,200 >> LAUREN: Αυτό είναι το νερό. 648 00:28:41,200 --> 00:28:41,930 >> David J. Malan: Αυτό είναι κυρίως νερό. 649 00:28:41,930 --> 00:28:42,430 Εντάξει. 650 00:28:42,430 --> 00:28:44,210 Αλλά αυτό είναι ακόμα το ίδιο κύπελλο όπως και πριν. 651 00:28:44,210 --> 00:28:47,570 Έτσι, ρίξτε it-- το δοκιμάσω εκεί. 652 00:28:47,570 --> 00:28:49,300 ΕΝΤΆΞΕΙ. 653 00:28:49,300 --> 00:28:51,010 Αυτή είναι μια καλή χρήση του χρόνου τάξη σήμερα. 654 00:28:51,010 --> 00:28:51,510 ΕΝΤΆΞΕΙ. 655 00:28:51,510 --> 00:28:53,890 Έτσι we-- τώρα ωραίο. 656 00:28:53,890 --> 00:28:55,460 Είδος. 657 00:28:55,460 --> 00:28:55,960 Εντάξει. 658 00:28:55,960 --> 00:28:56,690 Έτσι, πολύ καλό. 659 00:28:56,690 --> 00:29:00,006 Σας ευχαριστούμε για την Lauren. 660 00:29:00,006 --> 00:29:01,950 Πολύ καλά κάνει. 661 00:29:01,950 --> 00:29:04,570 >> Έτσι απλά για να φυσήξει το μυαλό σας, και αυτό είναι ίσως κάτι 662 00:29:04,570 --> 00:29:08,660 για να παίξει με, αν σας αρέσει σε CS50 ID, μπορείτε, στην πραγματικότητα, να ανταλλάξουν δύο μεταβλητές 663 00:29:08,660 --> 00:29:11,470 χωρίς τη χρήση προσωρινών ακέραιος. 664 00:29:11,470 --> 00:29:13,060 Και αυτό είναι το αντίστοιχο κωδικό C. 665 00:29:13,060 --> 00:29:16,110 Και αν θυμάστε από την τελευταία Τετάρτη, εισαγάγαμε, αν εν συντομία, 666 00:29:16,110 --> 00:29:19,720 ορισμένοι νέοι φορείς εκμετάλλευσης σε C. Και το κάνει κανείς θυμηθούμε τι το μικρό καρότο 667 00:29:19,720 --> 00:29:23,660 σύμβολο είναι, ότι λίγη τριγωνική σύμβολο από το πληκτρολόγιο αντιπροσωπεύει; 668 00:29:23,660 --> 00:29:26,003 Τι δυαδικός τελεστής; 669 00:29:26,003 --> 00:29:26,770 >> Κοινό: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> David J. Malan: EXOR. 671 00:29:27,645 --> 00:29:28,560 Αποκλειστική Or. 672 00:29:28,560 --> 00:29:32,920 Έτσι, εάν θέλετε, απλά για διασκέδαση σε στο σπίτι, για να δώσει ένα και b δυο αυθαίρετες 673 00:29:32,920 --> 00:29:36,072 αξίες όπως κάθε eight-- και εγώ Θα επιλέξει μια τιμή οκτώ bit. 674 00:29:36,072 --> 00:29:38,530 Εάν το κάνετε αυτό με 32 bits, θα έχετε πολύ γρήγορα βαριούνται. 675 00:29:38,530 --> 00:29:42,150 Αλλά μόλις δώσει οκτώ bit τιμή που είναι οτιδήποτε άλλο, ένα ή δύο, 676 00:29:42,150 --> 00:29:43,790 και β δώσει μια παρόμοια τιμή. 677 00:29:43,790 --> 00:29:46,810 Και στη συνέχεια, χρησιμοποιώντας τον ορισμό του XOR από την περασμένη Τετάρτη, 678 00:29:46,810 --> 00:29:52,560 εφαρμόσουν αυτό το λίγο-λίγο, κάθε ένα από Αυτοί οι οκτώ bits σε κάθε ένα από τα α και b, 679 00:29:52,560 --> 00:29:54,980 και στη συνέχεια να κάνει ακριβώς ανά κωδικό αυτό. 680 00:29:54,980 --> 00:29:58,170 Και δεν είναι εσφαλμένη τι που βλέπετε εδώ στην οθόνη. 681 00:29:58,170 --> 00:30:02,100 Βράζει πραγματικά κάτω σε τρεις πράξεις XOR 682 00:30:02,100 --> 00:30:05,910 και με κάποιο τρόπο μαγικά ένα και β θα ανταλλάξουν θέσεις 683 00:30:05,910 --> 00:30:08,010 δεν χάνει καμία πληροφορία. 684 00:30:08,010 --> 00:30:11,580 >> Έτσι, το λάδι και το νερό είναι το τέχνασμα πλησιέστερο πραγματικό κόσμο ενσάρκωση 685 00:30:11,580 --> 00:30:12,980 Θα μπορούσα να σκεφτώ να μιμούνται αυτό. 686 00:30:12,980 --> 00:30:15,950 Αλλά είναι σίγουρα πιο εύκολο να χρησιμοποιήσετε μια προσωρινή μεταβλητή, 687 00:30:15,950 --> 00:30:16,920 όπως στην προκειμένη περίπτωση εδώ. 688 00:30:16,920 --> 00:30:21,190 Και αυτό επίσης είναι μια ευκαιρία να πω, πάρα πολύ, αυτό το είδος της μικρο βελτιστοποίησης, 689 00:30:21,190 --> 00:30:23,590 ως επιστήμονας υπολογιστών Θα έλεγα, ενώ το είδος της διασκέδασης 690 00:30:23,590 --> 00:30:27,060 να καυχηθεί για το πώς θα το έκανε αυτό χωρίς να όπως την εναλλαγή με ένα επιπλέον μεταβλητή, 691 00:30:27,060 --> 00:30:28,640 δεν είναι όλα τόσο συναρπαστικό. 692 00:30:28,640 --> 00:30:31,619 Διότι για να σώσει 32 bits, όπως στην περίπτωση ενός πραγματικού int, 693 00:30:31,619 --> 00:30:33,410 Δεν είναι όλα αυτά συναρπαστικό σε ένα σύστημα όπου 694 00:30:33,410 --> 00:30:36,722 μπορεί να χρησιμοποιείτε δεκάδες megabytes ή ακόμα περισσότερα τέτοια μνήμη αυτές τις ημέρες. 695 00:30:36,722 --> 00:30:38,680 Και στην πραγματικότητα, όταν φτάσουμε σε μεταγενέστερο σετ πρόβλημα 696 00:30:38,680 --> 00:30:41,010 και θα εφαρμόσει ορθογραφικό πούλι και θα 697 00:30:41,010 --> 00:30:43,550 κληθούν να το πράξουν με αυτό το μικρό RAM και ως μικρή 698 00:30:43,550 --> 00:30:46,820 δυνατό χρόνο για την Σας computer-- ακόμα 699 00:30:46,820 --> 00:30:50,160 έχουν εβδομάδων για την υλοποίηση it-- θα have-- θα είστε 700 00:30:50,160 --> 00:30:51,799 αμφισβήτησε την ελαχιστοποίηση αυτών των πόρων. 701 00:30:51,799 --> 00:30:53,840 Και αυτό είναι πραγματικά το μόνο προκαλέσουν αυτό το εξάμηνο 702 00:30:53,840 --> 00:30:57,940 όπου θα πρέπει να ενθαρρύνονται να το ξύρισμα μακριά ακόμη και την καλύτερη επίδοση 703 00:30:57,940 --> 00:30:59,340 κοστίζει διαφορετικά. 704 00:30:59,340 --> 00:31:02,200 >> Έτσι what-- πώς μπορούμε να δείτε αυτό σε πραγματικό κώδικα; 705 00:31:02,200 --> 00:31:04,530 Επιτρέψτε μου να προχωρήσει τώρα και να ανοίξει ένα παράδειγμα 706 00:31:04,530 --> 00:31:07,700 ότι σκόπιμα ονομάζεται Δεν swap γιατί δεν το κάνει 707 00:31:07,700 --> 00:31:10,670 στην πραγματικότητα, να ανταλλάξουν τις μεταβλητές όσο θα περίμενε κανείς. 708 00:31:10,670 --> 00:31:12,260 Έτσι, ας ρίξουμε μια ματιά. 709 00:31:12,260 --> 00:31:17,050 Εδώ είναι ένα πρόγραμμα που δεν έχει CS50 βιβλιοθήκη σε εξέλιξη, μόλις Standard I / O. 710 00:31:17,050 --> 00:31:19,560 Τώρα έχουμε ένα πρωτότυπο για την ανταλλαγή επάνω στην κορυφή η οποία μόλις 711 00:31:19,560 --> 00:31:21,540 σημαίνει ότι έχεις να καθοριστούν αργότερα. 712 00:31:21,540 --> 00:31:22,550 Και εδώ είναι κύρια. 713 00:31:22,550 --> 00:31:26,000 >> I αυθαίρετα x και y, αντίστοιχα, οι τιμές ένα και δύο 714 00:31:26,000 --> 00:31:28,590 μόνο και μόνο επειδή είναι μικρό και εύκολο να το σκεφτώ. 715 00:31:28,590 --> 00:31:32,280 Και τότε έχω μόνο ένα μάτσο printfs όπου έχω μια επιταγή λογική. το χ είναι 1 716 00:31:32,280 --> 00:31:35,110 και το γ είναι 2 είναι πιθανώς ποιοί είναι αυτοί οι printfs θα πει. 717 00:31:35,110 --> 00:31:36,530 Έτσι, δεν έχει μέχρι στιγμής μαγεία. 718 00:31:36,530 --> 00:31:40,100 >> Στη συνέχεια, Πάω να διεκδικήσει με εκτύπωση def, swapping dot dot dot. 719 00:31:40,100 --> 00:31:43,730 Πάω να καλέσω την ανταλλαγή λειτουργία, περνώντας x και y. 720 00:31:43,730 --> 00:31:47,350 Και ας υποθέσουμε ότι για τώρα ανταλλαγής υλοποιείται ακριβώς 721 00:31:47,350 --> 00:31:49,930 όπως ήταν πριν από ένα λεπτό με μια προσωρινή μεταβλητή. 722 00:31:49,930 --> 00:31:52,670 Και γι 'αυτό αξίωση τόλμη, αντάλλαξαν. 723 00:31:52,670 --> 00:31:55,429 X είναι τώρα αυτό και y είναι τώρα αυτό. 724 00:31:55,429 --> 00:31:57,220 Αλλά το αρχείο, φυσικά, καλείται Δεν Swap. 725 00:31:57,220 --> 00:31:58,678 Ας δούμε πραγματικά τι συμβαίνει. 726 00:31:58,678 --> 00:32:04,450 Αν έχω συγκεντρώσει καμία ανταλλαγή και, στη συνέχεια, κάνει ./noswap, χ είναι 1, το Υ είναι 2. 727 00:32:04,450 --> 00:32:05,770 Εναλλαγή αντάλλαξαν. 728 00:32:05,770 --> 00:32:07,200 το χ είναι 1, το γ είναι 2. 729 00:32:07,200 --> 00:32:11,980 Έτσι, φαίνεται πράγματι να αποτύχουν ακόμη αν swap-- ας μετακινηθείτε προς τα κάτω now-- 730 00:32:11,980 --> 00:32:16,542 εφαρμοστεί ακριβώς η ανά Κωδικός πρότεινα πριν από λίγο. 731 00:32:16,542 --> 00:32:19,000 Γι 'αυτό και δεν πρόκειται να πάρει φανταχτερά με το υλικό XOR για τώρα. 732 00:32:19,000 --> 00:32:21,890 Αυτό, επίσης, θα πρέπει να λειτουργεί μόνο όπως και με το γάλα και ΕΕ, 733 00:32:21,890 --> 00:32:25,820 αλλά αυτό δεν φαίνεται να λειτουργεί. 734 00:32:25,820 --> 00:32:27,180 >> Ας κάνουμε αυτό και πάλι. 735 00:32:27,180 --> 00:32:29,310 Ίσως απλά δεν ήταν αυτό τρέχει δεξιά. 736 00:32:29,310 --> 00:32:32,010 Ας τρέξει ξανά Δεν Swap. 737 00:32:32,010 --> 00:32:32,900 Ίσως I-- όχι. 738 00:32:32,900 --> 00:32:34,400 Γι 'αυτό ακριβώς δεν λειτουργεί. 739 00:32:34,400 --> 00:32:36,060 Ας κάνουμε ένα μικρό έλεγχο λογικότητας. 740 00:32:36,060 --> 00:32:39,690 Επιτρέψτε μου εδώ να προχωρήσει σε Swap και απλά να προσθέσω, περιμένετε ένα λεπτό, 741 00:32:39,690 --> 00:32:43,856 a είναι% i / n και ας plug-in της αξίας του ενός. 742 00:32:43,856 --> 00:32:45,730 Επειδή θέλω πραγματικά για να δούμε τι συμβαίνει. 743 00:32:45,730 --> 00:32:47,570 Και πράγματι, αυτή είναι η μια τεχνική εντοπισμού σφαλμάτων 744 00:32:47,570 --> 00:32:50,028 ότι μπορεί να χρησιμοποιείτε σε ώρες γραφείου ή στο σπίτι ήδη, 745 00:32:50,028 --> 00:32:53,560 παρόμοιο με το πρώτο εξάμηνο του Dan Βίντεο Armendariz στην PSET3 746 00:32:53,560 --> 00:32:56,870 όπου εισαγάγαμε εκτύπωσης def ως μια συνιστώμενη τεχνική, τουλάχιστον 747 00:32:56,870 --> 00:32:58,080 για απλές περιπτώσεις. 748 00:32:58,080 --> 00:33:01,720 Επιτρέψτε μου να πάω μπροστά και να εκτελέσετε την εντολή make Δεν ανταλλαγής πάλι, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Ενδιαφέρουσες. 751 00:33:05,840 --> 00:33:11,670 Έτσι παρατηρήσετε αυτό που φαίνεται να είναι αληθινό. x είναι 1, το γ είναι 2, αλλά μια είναι 2 όταν το b είναι 1. 752 00:33:11,670 --> 00:33:16,790 Έτσι, αυτά τα δύο με κάποιο τρόπο πήρε αντάλλαξαν αλλά τα Χ και Υ δεν παίρνουν ανταλλάσσονται. 753 00:33:16,790 --> 00:33:21,090 Έτσι για να είναι σαφές, τι συμβαίνει είναι, εδώ έχω x και y 754 00:33:21,090 --> 00:33:25,380 και αυτά είναι μεταβλητές στο τοπικό έκταση των κυρίων, περνώ στο x και y 755 00:33:25,380 --> 00:33:26,170 να ανταλλάξουν. 756 00:33:26,170 --> 00:33:29,080 Τώρα, swap, ως χωριστή λειτουργία, είναι ελεύθερη να καλέσει τα επιχειρήματά της 757 00:33:29,080 --> 00:33:30,590 ή τις παραμέτρους του οτιδήποτε θέλει. 758 00:33:30,590 --> 00:33:33,280 Foo ή μπαρ ή x ή y ή a ή b. 759 00:33:33,280 --> 00:33:36,870 Ακριβώς για να καταστεί σαφές ότι είναι δεν είναι ταυτόσημα με τα χ και γ per se, 760 00:33:36,870 --> 00:33:38,020 Έχω πει a και b. 761 00:33:38,020 --> 00:33:40,040 Αλλά θα μπορούσαμε να τους αποκαλούμε οτιδήποτε θέλουμε. 762 00:33:40,040 --> 00:33:43,960 >> Και έτσι μοιάζει το swap που πέρασε 763 00:33:43,960 --> 00:33:48,980 x-- AKA a-- και είναι που πέρασε y-- AKA β. 764 00:33:48,980 --> 00:33:51,900 Κάπως αυτές οι τρεις γραμμές είναι εναλλαγή ακριβώς αυτές τις αξίες 765 00:33:51,900 --> 00:33:53,510 όπως έκανε Lauren με το γάλα και ΕΕ. 766 00:33:53,510 --> 00:33:56,010 Αλλά όταν έχουμε να εκτυπώσετε η αξίες, a και b 767 00:33:56,010 --> 00:34:01,340 είναι πράγματι ανταλλάξουν αλλά και x y δεν έχουν καμία αλλαγή σε αυτά. 768 00:34:01,340 --> 00:34:03,150 Υπενθυμίζεται ότι τα Χ και Υ είναι εδώ. 769 00:34:03,150 --> 00:34:05,320 >> Έτσι μπορούμε να δούμε αυτό μέσω μια άλλη τεχνική, καθώς και. 770 00:34:05,320 --> 00:34:08,110 Και αυτό είναι πάρα πολύ μια τεχνική ενσωματωμένο στο πρόβλημα που τρεις. 771 00:34:08,110 --> 00:34:10,780 Ας πάμε μπροστά και να το κάνουμε αυτό σε CS50 ID αν δεν έχετε ήδη. 772 00:34:10,780 --> 00:34:13,730 Από την πλευρά μας δεξί χέρι έχουν αυτήν την καρτέλα εντοπισμού σφαλμάτων. 773 00:34:13,730 --> 00:34:16,159 Και αν ανοίξετε αυτό επάνω, υπάρχει κάποια απόκρυφες πληροφορίες 774 00:34:16,159 --> 00:34:17,530 αυτό είναι που ρίχνονται σε σας αρχικά. 775 00:34:17,530 --> 00:34:19,310 Αλλά ας δώσουμε έμφαση αυτό πέρα ​​πραγματικά γρήγορα. 776 00:34:19,310 --> 00:34:21,620 >> Έτσι, ένα, θα δείτε τις τοπικές μεταβλητές. 777 00:34:21,620 --> 00:34:26,230 Αποδεικνύεται ότι χτίσει σε CS50 IDE, και πολλά περιβάλλοντα προγραμματισμού περισσότερα 778 00:34:26,230 --> 00:34:28,060 γενικά, είναι ένα πρόγραμμα εντοπισμού σφαλμάτων. 779 00:34:28,060 --> 00:34:31,340 Ένα εργαλείο που σας επιτρέπει να δείτε οπτικά τι συμβαίνει στο εσωτερικό του προγράμματός σας 780 00:34:31,340 --> 00:34:34,380 χωρίς να χρειάζεται να καταφύγουν σε προσθήκη printfs και την κατάρτιση και την εκτέλεση 781 00:34:34,380 --> 00:34:37,588 και προσθέτοντας printf και την κατάρτιση και το τρέξιμο, η οποία ήδη, σε ώρες γραφείου 782 00:34:37,588 --> 00:34:40,070 ή το σπίτι, είναι πιθανόν να πάρει αρκετά κουραστική. 783 00:34:40,070 --> 00:34:43,090 >> Μέχρι εδώ, ακριβώς σε μια στιγμή, είμαστε πρόκειται να για να δείτε σε πραγματικό χρόνο 784 00:34:43,090 --> 00:34:44,760 οι τιμές των τοπικών μεταβλητών μας. 785 00:34:44,760 --> 00:34:47,880 Είμαστε, επίσης, πρόκειται να είναι σε θέση να καθορίσει τα λεγόμενα σημεία διακοπής οποία 786 00:34:47,880 --> 00:34:52,570 Υπάρχουν ευκαιρίες στο πρόγραμμα μου για να διακόψετε εκτέλεση σε μια συγκεκριμένη γραμμή κώδικα 787 00:34:52,570 --> 00:34:53,710 ότι είμαι περίεργος για. 788 00:34:53,710 --> 00:34:54,210 Σωστά; 789 00:34:54,210 --> 00:34:55,969 Αυτά τα προγράμματα τρέχουν σε ένα κλάσμα του δευτερολέπτου. 790 00:34:55,969 --> 00:35:00,450 Είναι το είδος της Νίκαιας για εμάς τους ανθρώπους πιο αργό να είναι σε θέση να διακόψετε, να λάβει μια στιγμή, βλέπε 791 00:35:00,450 --> 00:35:02,380 τι συμβαίνει γύρω μια συγκεκριμένη γραμμή κώδικα 792 00:35:02,380 --> 00:35:05,050 χωρίς το όργωμα πρόγραμμα μέσα από αυτό και το φινίρισμα εντελώς. 793 00:35:05,050 --> 00:35:08,510 Έτσι, ένα σημεία διακοπής θα μας επιτρέψει να διάλειμμα και σταματήστε σε ένα ορισμένο σημείο. 794 00:35:08,510 --> 00:35:12,990 >> Πρόσκληση στοίβα είναι ένα φανταχτερό τρόπο λέει ό, τι είναι σήμερα λειτουργίες 795 00:35:12,990 --> 00:35:14,140 που καλείται αυτή τη στιγμή. 796 00:35:14,140 --> 00:35:15,370 Κύρια πάντα πρώτο. 797 00:35:15,370 --> 00:35:17,230 Αλλά εάν Κύρια αποκαλεί συνάρτηση που ονομάζεται Swap, 798 00:35:17,230 --> 00:35:20,470 είμαστε πραγματικά πρόκειται να δούμε αυτό πύργος της λειτουργίες που έχουν 799 00:35:20,470 --> 00:35:22,400 κάλεσε σε αντίστροφη χρονολογική σειρά. 800 00:35:22,400 --> 00:35:23,310 Ας δούμε αυτό. 801 00:35:23,310 --> 00:35:24,327 >> Πάω για σμίκρυνση. 802 00:35:24,327 --> 00:35:25,660 Πάω να επιστρέψω στον κώδικά μου. 803 00:35:25,660 --> 00:35:27,540 Και ακριβώς επειδή θέλω να είναι σχολαστικός εδώ, 804 00:35:27,540 --> 00:35:31,100 Πάω να προχωρήσει και κάντε κλικ ακριβώς στα αριστερά της γραμμής πέντε. 805 00:35:31,100 --> 00:35:32,830 Και αυτό δημιουργεί μια κόκκινη κουκκίδα. 806 00:35:32,830 --> 00:35:36,200 Και παρατηρήσετε στη δεξιά πλευρά ότι το πρόγραμμα εντοπισμού σφαλμάτων ξέρει, hey, 807 00:35:36,200 --> 00:35:41,020 Μόλις είπα ένα σημείο διακοπής σε noswap.c γραμμή πέντε, ειδικά 808 00:35:41,020 --> 00:35:42,480 σε αυτή τη γραμμή κώδικα. 809 00:35:42,480 --> 00:35:45,090 Έτσι, το πρόγραμμα εντοπισμού σφαλμάτων ξέρει ότι εγώ ζήτησαν από την επόμενη φορά 810 00:35:45,090 --> 00:35:48,530 Τρέχω μου πρόγραμμα παύσης εκτέλεση εκεί και όχι μόνο 811 00:35:48,530 --> 00:35:50,390 τρέχει το όλο πράγμα εξαιρετικά γρήγορη. 812 00:35:50,390 --> 00:35:53,889 >> Έτσι τώρα θα πάω να κάνετε κλικ στο Debug κουμπί στην κορυφή του IDE 813 00:35:53,889 --> 00:35:55,430 και ότι πρόκειται να κάνετε τα εξής. 814 00:35:55,430 --> 00:36:00,680 Είναι πρόκειται να ανοίξει ένα αρχικά κάπως τρομακτικό δεύτερη ψάχνει τερματικό window-- 815 00:36:00,680 --> 00:36:02,679 απομακρυσμένο εντοπισμό σφαλμάτων από φιλοξενούν τέτοιες και such-- 816 00:36:02,679 --> 00:36:04,970 και θα επανέλθω σε αυτό όλα αυτό σημαίνει ότι πριν από καιρό. 817 00:36:04,970 --> 00:36:09,020 Αλλά αυτό που είναι σημαντικό για την επιχείρηση είναι ότι η κόκκινη τελεία χτυπήθηκε, 818 00:36:09,020 --> 00:36:11,735 το πρόγραμμα εντοπισμού σφαλμάτων έχει σκόπιμα παύση execution-- 819 00:36:11,735 --> 00:36:15,560 Δεν σε αυτή τη γραμμή αυτή καθαυτή αλλά την πρώτη γραμμή πραγματικό κώδικα σε αυτή τη λειτουργία. 820 00:36:15,560 --> 00:36:18,040 Και αυτός είναι ο λόγος γραμμή είναι επτά τώρα επισημαίνονται με κίτρινο χρώμα. 821 00:36:18,040 --> 00:36:20,550 >> Και τώρα ας ρίξουμε μια ματιά στη δεξιά πλευρά. 822 00:36:20,550 --> 00:36:27,300 Μοιάζει, από προεπιλογή, αρκετά καλά, έχει χ τι τιμή; 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 Και y έχει τι τιμή; 825 00:36:29,750 --> 00:36:30,410 Μηδέν. 826 00:36:30,410 --> 00:36:35,540 Και αυτό είναι που πρέπει να αναμένονται κατά την έννοια ότι το x και y-- ότι έχει κίτρινο line-- 827 00:36:35,540 --> 00:36:36,770 Δεν εκτελέστηκε ακόμη. 828 00:36:36,770 --> 00:36:38,510 Έτσι x δεν θα πρέπει να έχει την τιμή 1. 829 00:36:38,510 --> 00:36:41,470 Θα μπορούσε να έχει οποιαδήποτε άλλη τιμή, λεγόμενο αξία σκουπίδια. 830 00:36:41,470 --> 00:36:44,320 Και πήραμε τυχεροί στο ότι είναι μηδέν σε αυτό το σημείο, ουσιαστικά. 831 00:36:44,320 --> 00:36:46,400 >> Έτσι τώρα υπάρχει μόνο μερικά κουμπιά πρέπει να φροντίσουν 832 00:36:46,400 --> 00:36:48,100 περίπου, όταν τον εντοπισμό σφαλμάτων με αυτόν τον τρόπο. 833 00:36:48,100 --> 00:36:49,970 Παρατηρήστε εδώ, έχουμε ένα κουμπί Play. 834 00:36:49,970 --> 00:36:51,877 Και αν έχουμε παίξει ή να χτυπήσει επαναλάβει, αυτό είναι μόνο 835 00:36:51,877 --> 00:36:53,710 πρόκειται να τρέξει μέσα το υπόλοιπο του προγράμματος 836 00:36:53,710 --> 00:36:55,300 ή μέχρι να χτυπά ένα άλλο σημείο διακοπής. 837 00:36:55,300 --> 00:36:56,910 Αλλά δεν έχετε ορίσει οποιοδήποτε άλλο σημεία διακοπής έτσι είναι ακριβώς 838 00:36:56,910 --> 00:36:58,118 πρόκειται να τρέξει μέχρι το τέλος. 839 00:36:58,118 --> 00:37:00,280 Αυτό το είδος των ηττών τους Σκοπός της σπρώξει γύρω. 840 00:37:00,280 --> 00:37:03,290 >> Έτσι, αντί, νοιάζομαι Αυτά τα εικονίδια στα δεξιά. 841 00:37:03,290 --> 00:37:05,360 Και αν αιωρούνται πάνω τους, όπως θα έπρεπε πάρα πολύ, 842 00:37:05,360 --> 00:37:07,450 θα δείτε λίγο tips-- συμβουλές εργαλείων. 843 00:37:07,450 --> 00:37:09,020 Αυτό είναι ένα βήμα πάνω. 844 00:37:09,020 --> 00:37:11,290 Τώρα αυτό δεν σημαίνει ότι παράλειψης η ακόλουθη γραμμή κώδικα. 845 00:37:11,290 --> 00:37:14,840 Αυτό ακριβώς σημαίνει το εκτελέσει και να προχωρήσουμε στο επόμενο, να προχωρήσουμε στο επόμενο, 846 00:37:14,840 --> 00:37:15,580 να προχωρήσουμε στο επόμενο. 847 00:37:15,580 --> 00:37:17,610 Με άλλα λόγια, μέσω το κουμπί αυτό, μπορώ να περπατήσει 848 00:37:17,610 --> 00:37:20,390 μέσω κωδικός μου ένα βήμα τη φορά. 849 00:37:20,390 --> 00:37:21,914 Γραμμή προς γραμμή, κυριολεκτικά. 850 00:37:21,914 --> 00:37:23,830 Τώρα, στα δεξιά ότι, υπάρχει ένα άλλο 851 00:37:23,830 --> 00:37:25,163 ότι θα δούμε ακριβώς σε μια στιγμή. 852 00:37:25,163 --> 00:37:27,820 Αυτή είναι η λεγόμενη Βήμα σε εικονίδιο που είναι 853 00:37:27,820 --> 00:37:30,300 Θα μου επιτρέψετε κατάδυσης σε μια άλλη λειτουργία. 854 00:37:30,300 --> 00:37:31,800 Αλλά ας δούμε αυτό ακριβώς σε μια στιγμή. 855 00:37:31,800 --> 00:37:33,280 Έτσι, Πάω να κάνετε κλικ πάνω βήμα. 856 00:37:33,280 --> 00:37:35,820 Και σήμερα παρατηρούμε ότι, όπως κάνω κλικ αυτό το κουμπί στο πάνω δεξιά, 857 00:37:35,820 --> 00:37:41,260 Κράτα τα μάτια σου κάτω από περίπου Τοπικά Οι μεταβλητές και να δούμε τι θα συμβεί στο x. 858 00:37:41,260 --> 00:37:44,115 X είναι τώρα 1, διότι η κίτρινη γραμμή έχει πλέον εκτελεστεί 859 00:37:44,115 --> 00:37:45,840 και έχουμε προχωρήσει σε γραμμή 8. 860 00:37:45,840 --> 00:37:49,840 Και ακριβώς σε μια στιγμή y θα πρέπει να ελπίζουμε να γίνει 2. 861 00:37:49,840 --> 00:37:52,330 >> Τώρα, τίποτα που ενδιαφέρουσες συμβαίνει για λίγο. 862 00:37:52,330 --> 00:37:53,390 Όλα αυτά είναι είναι printf. 863 00:37:53,390 --> 00:37:58,010 Και παρατηρήσετε, στη δευτεροβάθμια τερματικό μου παράθυρο, βλέπω την έξοδο των def εκτύπωσης. 864 00:37:58,010 --> 00:38:01,080 Και τώρα έχω να κάνω μια απόφαση ως προγραμματιστής. 865 00:38:01,080 --> 00:38:04,360 Μπορώ να το βήμα πάνω από αυτή τη γραμμή του κώδικα, εκτέλεσης, αλλά δεν 866 00:38:04,360 --> 00:38:06,220 να πάρει περίεργοι για το τι είναι μέσα. 867 00:38:06,220 --> 00:38:11,130 Ή πραγματικά μπορώ να το βήμα σε αυτό και πηγαίνετε στο εσωτερικό της ίδιας της ανταλλαγής. 868 00:38:11,130 --> 00:38:12,340 Ας κάνουμε το τελευταίο. 869 00:38:12,340 --> 00:38:15,550 >> Επιτρέψτε μου να προχωρήσει και κάντε κλικ Δεν Βήμα Πάνω όμως στο. 870 00:38:15,550 --> 00:38:17,300 Ανακοίνωση, ξαφνικά οι αλλαγές παράθυρο 871 00:38:17,300 --> 00:38:19,330 να επισημάνετε την πρώτη γραμμή κώδικα σε Swap. 872 00:38:19,330 --> 00:38:20,710 Αυτό είναι γραμμή 21. 873 00:38:20,710 --> 00:38:25,220 Και τώρα, τι είδους είναι ότι funky, αν κοιτάξετε εδώ, όπως ήταν αναμενόμενο, 874 00:38:25,220 --> 00:38:29,720 ένα κόμμα b είναι 1 και 2, αντίστοιχα. 875 00:38:29,720 --> 00:38:33,840 Γιατί είναι temp 32.767; 876 00:38:33,840 --> 00:38:36,560 Υπενθυμίζοντας ότι η θερμοκρασία, μοιάζει πολύ το άδειο φλιτζάνι πριν από λίγο, 877 00:38:36,560 --> 00:38:38,980 δηλώνεται εδώ στη γραμμή 21. 878 00:38:38,980 --> 00:38:43,390 Γιατί 32,000- Θέλω να πω, γιατί είναι είναι μερικά μόνο παράξενο αξία; 879 00:38:43,390 --> 00:38:43,890 Ναι; 880 00:38:43,890 --> 00:38:45,190 >> Κοινό: Δεν είναι προετοιμασία. 881 00:38:45,190 --> 00:38:46,940 >> David J. Malan: Είναι δεν έχει προετοιμαστεί. 882 00:38:46,940 --> 00:38:49,370 Έτσι, ο υπολογιστής μας είναι πάντα έχει φυσική μνήμη. 883 00:38:49,370 --> 00:38:50,544 Έχει πάντα φυσική μνήμη RAM. 884 00:38:50,544 --> 00:38:52,710 Και υπάρχει πάντα το μηδέν και ένα είναι εκεί, σωστά; 885 00:38:52,710 --> 00:38:54,626 Επειδή είμαστε χρησιμοποιώντας μας υπολογιστή όλη την ημέρα, 886 00:38:54,626 --> 00:38:57,210 είστε με τη χρήση του CS50 IDE ή οι εξυπηρετητές όλη την ημέρα. 887 00:38:57,210 --> 00:39:01,159 Έτσι ώστε RAM είτε έχει κάποια μηδενικά ή κάποιος ή κάποιοι μηδενικά και μονάδες. 888 00:39:01,159 --> 00:39:02,950 Δεν έχει σημασία αν ή Δεν είστε με τη χρήση τους. 889 00:39:02,950 --> 00:39:05,270 Μπορείτε όχι μόνο να έχουν κενό χώρους όπου θέλετε bits. 890 00:39:05,270 --> 00:39:06,850 Είναι είτε μηδενικά και μονάδες. 891 00:39:06,850 --> 00:39:09,610 >> Έτσι αποδεικνύεται ότι η θερμοκρασία, επειδή Δεν έχω προετοιμαστεί ακόμα, 892 00:39:09,610 --> 00:39:14,580 έχουμε αυτά τα 32 κομμάτια, αλλά δεν έχω έχουν προετοιμαστεί για τυχόν γνωστές τιμές. 893 00:39:14,580 --> 00:39:18,110 Έτσι, όποια και αν ήταν πιο χρησιμοποιήθηκε πρόσφατα for-- τις 32 bits-- 894 00:39:18,110 --> 00:39:23,000 είμαστε ακριβώς βλέπουμε τα αντικείμενα μερικών προηγούμενη χρήση των συγκεκριμένων 32 895 00:39:23,000 --> 00:39:23,500 bits. 896 00:39:23,500 --> 00:39:27,780 Μόλις κάνετε κλικ Βήμα Πάνω όμως, φτου, θερμοκρασία πρόκειται να πάρει την τιμή 1. 897 00:39:27,780 --> 00:39:31,600 Και αν το κάνω πάλι, είναι ένα πρόκειται να δοθεί η τιμή 2 898 00:39:31,600 --> 00:39:33,830 και στη συνέχεια β πρόκειται να να δοθεί η τιμή 1. 899 00:39:33,830 --> 00:39:36,390 >> Και ναι, ποιο είναι ωραίο τώρα αυτό το σημείο στην ιστορία 900 00:39:36,390 --> 00:39:39,750 είναι ότι το πρόγραμμα εντοπισμού σφαλμάτων είναι δείχνοντάς μου, σούπερ αργά 901 00:39:39,750 --> 00:39:42,640 με το δικό μου ρυθμό, τι η κατάσταση των Swap είναι. 902 00:39:42,640 --> 00:39:47,490 Αλλά παρατηρήσετε στην κορυφή εδώ, προειδοποίηση ότι η στοίβα κλήσης πραγματικότητα 903 00:39:47,490 --> 00:39:49,180 έχει δύο στρώματα σε αυτό. 904 00:39:49,180 --> 00:39:53,240 Τώρα αυτός που έχει επισημανθεί ως Swap, αν κάνω κλικ στην Κύρια αντ 'αυτού, 905 00:39:53,240 --> 00:39:57,100 Παρατηρήστε πώς αλλάζουν οι τοπικές μεταβλητές επειδή ο κύριος του έργου μπορεί να hop μόνο 906 00:39:57,100 --> 00:39:59,740 περίπου και να πάει σε οποιαδήποτε διαφορετική εμβέλεια. 907 00:39:59,740 --> 00:40:04,070 Έτσι ακόμα κι αν κάνουμε όλα αυτά λειτουργούν σωστά και εναλλαγή Α και Β, 908 00:40:04,070 --> 00:40:09,080 αν πάω πέρα ​​δώθε μεταξύ Swap όπου το α είναι 2 και το b είναι 1 και Κύριο, 909 00:40:09,080 --> 00:40:11,851 Έχει Κύρια έχουν επηρεαστεί καθόλου; 910 00:40:11,851 --> 00:40:12,350 Κανένα. 911 00:40:12,350 --> 00:40:13,930 Ποιο είναι λοιπόν το όφελος εδώ; 912 00:40:13,930 --> 00:40:18,200 Λοιπόν, αποδεικνύεται ότι οποιαδήποτε στιγμή μπορείτε να καλέσετε μια συνάρτηση όπως Swap, 913 00:40:18,200 --> 00:40:21,600 και μπορείτε να το δώσετε επιχειρήματα, τι που περνάτε στη λειτουργία Swap 914 00:40:21,600 --> 00:40:24,730 σε αυτή την περίπτωση είναι ένα αντίγραφο από τα επιχειρήματα αυτά. 915 00:40:24,730 --> 00:40:28,620 Έτσι, αν x και y είναι το καθένα αντίστοιχα 32 bits, τι είναι να πάρει Swap 916 00:40:28,620 --> 00:40:30,760 είναι δύο νέων τοπικών μεταβλητές, ή επιχειρήματα, 917 00:40:30,760 --> 00:40:34,380 ονομάζεται και b-- αλλά αυτά είναι αυθαίρετα names-- αλλά το μοντέλο των μηδενικών 918 00:40:34,380 --> 00:40:39,520 και αυτοί μέσα α και b είναι παρατάσσονται να είναι ταυτόσημο με χ και y 919 00:40:39,520 --> 00:40:42,610 αλλά δεν είναι ο ίδιο πράγμα όπως x και y. 920 00:40:42,610 --> 00:40:46,880 >> Είναι σαν Main έχει το κομμάτι της χαρτί ο αριθμός 1 και 2 για τα χ και y, 921 00:40:46,880 --> 00:40:49,260 και στη συνέχεια, όταν τα χέρια που κομμάτι χαρτί για να Swap, 922 00:40:49,260 --> 00:40:51,970 Εναλλαγή παίρνει πολύ γρήγορα τη δική του πένα, γράφει κάτω 923 00:40:51,970 --> 00:40:56,240 1 και 2 για το δικό του δελτίο του χαρτιού, τα χέρια πίσω το αρχικό xy στη βασική 924 00:40:56,240 --> 00:40:58,790 και στη συνέχεια να κάνει τις δικές του πράγμα με α και β. 925 00:40:58,790 --> 00:41:01,940 Και αυτό είναι τώρα εξαιρετικά σημαντικό, διότι Αυτό έχει επιπτώσεις τετριμμένη 926 00:41:01,940 --> 00:41:06,260 για γράφει πραγματικά σωστό κωδικό γιατί φαίνεται ότι δεν μπορούν να ανταλλάξουν 927 00:41:06,260 --> 00:41:07,500 δύο μεταβλητών. 928 00:41:07,500 --> 00:41:09,150 >> Έχω γράψει μια σωστή λειτουργία Swap. 929 00:41:09,150 --> 00:41:12,770 Έχουμε εφαρμόσει με Lauren ως η σωστή λειτουργία εναλλαγής στην πραγματικότητα, 930 00:41:12,770 --> 00:41:16,700 αλλά προφανώς όλα αυτά δεν θέματα, εάν δεν μπορείτε πραγματικά 931 00:41:16,700 --> 00:41:19,530 ανταλλάξουν δύο τιμές μόνιμα. 932 00:41:19,530 --> 00:41:21,970 Έτσι, χρειαζόμαστε έναν άλλο τρόπο για να πάρει πραγματικά σε αυτό, 933 00:41:21,970 --> 00:41:24,472 και πρέπει να είμαστε σε θέση να στην πραγματικότητα λύσει αυτό το πρόβλημα. 934 00:41:24,472 --> 00:41:27,180 Και αποδεικνύεται out-- και θα έρθει πίσω σε αυτό το συγκεκριμένο εικόνα 935 00:41:27,180 --> 00:41:30,500 πριν long-- αυτός είναι ένας τρόπος που μπορείτε να σχεδιάσετε τη μνήμη του υπολογιστή σας. 936 00:41:30,500 --> 00:41:31,460 Είναι απλά ένα ορθογώνιο. 937 00:41:31,460 --> 00:41:32,960 Θα μπορούσε να αντλήσει οποιοδήποτε διάφορους τρόπους, αλλά είναι 938 00:41:32,960 --> 00:41:35,740 βολικό για να αντλήσει ως ορθογώνιο για τον εξής λόγο. 939 00:41:35,740 --> 00:41:40,040 >> Εμείς πάμε για να ξεκινήσει σήμερα και πέρα μιλάμε για τη λεγόμενη στοίβα. 940 00:41:40,040 --> 00:41:43,870 Και η στοίβα είναι απλά ένα κομμάτι της RAM-- ένα μεγάλο κομμάτι του memory-- 941 00:41:43,870 --> 00:41:47,100 ότι οι λειτουργίες έχουν πρόσβαση όταν και αν ονομάζεται. 942 00:41:47,100 --> 00:41:49,800 Και έτσι αποδεικνύεται ότι στο το κάτω μέρος της στοίβας αυτής της 943 00:41:49,800 --> 00:41:53,590 είναι όπου το σύνολο των τοπικών μεταβλητών Κύριο του org και C και org V και όλα αυτά τα πράγματα 944 00:41:53,590 --> 00:41:56,950 πρόκειται να πάει από προεπιλογή. Και αν Main καλεί κάποια άλλη λειτουργία, όπως Swap, 945 00:41:56,950 --> 00:42:00,330 καλά, Εναλλαγή πρόκειται να πάρει ένα άλλο στρώμα της μνήμης έως και πάνω από αυτό. 946 00:42:00,330 --> 00:42:04,490 >> Και έτσι απλά για να σας δώσει μια γρήγορη βιαστική εικόνα σχετικά με αυτό, αν πάω πάνω here-- 947 00:42:04,490 --> 00:42:09,450 και επιτρέψτε μου να αντικατοπτρίζουν αυτό για το γενικά ως well-- αυτό που πραγματικά έχω, 948 00:42:09,450 --> 00:42:12,100 αν ενδιαφερόμαστε μόνο για το κάτω από αυτήν την εικόνα για τώρα, 949 00:42:12,100 --> 00:42:15,070 είναι ότι όταν τρέχω ένα πρόγραμμα Κύρια και φώναξαν, 950 00:42:15,070 --> 00:42:18,330 Κύρια δίνεται ένα μεγάλο κομμάτι της RAM στον υπολογιστή μου που είναι 951 00:42:18,330 --> 00:42:20,060 στο κάτω μέρος αυτής της λεγόμενης στοίβας. 952 00:42:20,060 --> 00:42:22,143 Και Πάω να το σύρει σκοπίμως ως ένα τετράγωνο. 953 00:42:22,143 --> 00:42:24,540 Έτσι είναι όπως 32 bit και τέσσερα byte. 954 00:42:24,540 --> 00:42:28,790 Και αν αυτή η κύρια λειτουργία έχει μεταβλητή που ονομάζεται x με τιμή 1 955 00:42:28,790 --> 00:42:32,626 και έχει μια μεταβλητή που ονομάζεται y με την τιμή των 2, που είναι 956 00:42:32,626 --> 00:42:35,750 σαν να παίρνετε αυτό το αγκίδα της μνήμης που ΑΡΧΙΚΗ έχει δοθεί από το λειτουργικό 957 00:42:35,750 --> 00:42:38,850 σύστημα και διαιρώντας αυτό έτσι ώστε η πρώτη τοπική μεταβλητή πηγαίνει εδώ, 958 00:42:38,850 --> 00:42:40,930 η δεύτερη πηγαίνει εδώ, και αυτό είναι όλο. 959 00:42:40,930 --> 00:42:45,590 >> Όταν Κύρια καλεί Swap, Εναλλαγή αποκτά το δικό του κομμάτι της μνήμης 960 00:42:45,590 --> 00:42:48,280 ότι θα συντάξει, όπως αυτό από το λειτουργικό σύστημα, 961 00:42:48,280 --> 00:42:50,820 και πρόκειται να της δική τοπικές μεταβλητές με βάση 962 00:42:50,820 --> 00:42:53,825 σχετικά με την εφαρμογή μας νωρίτερα με τις τοπικές μεταβλητές 963 00:42:53,825 --> 00:42:58,010 και β ότι αρχικά να πάρει τις τιμές 1 και 2. 964 00:42:58,010 --> 00:43:00,450 Στη συνέχεια, όμως, το συντομότερο ο κώδικας Swap εκτελεί, 965 00:43:00,450 --> 00:43:03,760 και Lauren swaps στην πραγματικότητα η ΕΕ και το γάλα, τι συμβαίνει; 966 00:43:03,760 --> 00:43:09,030 Λοιπόν, αυτό το 2 γίνεται ένα 1, αυτό 1 γίνεται μια 2, και, από τον τρόπο, 967 00:43:09,030 --> 00:43:13,360 υπάρχει μια μεταβλητή temp που είναι να χρησιμοποίησε το σύνολο του χρόνου που τελικά 968 00:43:13,360 --> 00:43:14,470 φεύγει. 969 00:43:14,470 --> 00:43:16,720 Αλλά δεν έχει σημασία πόση δουλειά που κάνετε 970 00:43:16,720 --> 00:43:22,160 Σε αυτή τη γραμμή of-- σε αυτό το χώρο μνήμης, Χ και Υ είναι εντελώς ανέγγιχτη. 971 00:43:22,160 --> 00:43:26,320 >> Έτσι, χρειαζόμαστε κάποιο τρόπο να δώσει Εναλλαγή και λειτουργίες όπως το 972 00:43:26,320 --> 00:43:32,640 μυστικό πρόσβασης, αν θέλετε, να λειτουργίες like-- στη μνήμη σαν x και y. 973 00:43:32,640 --> 00:43:35,110 Έτσι, ας ρίξουμε μια ματιά ένα παράδειγμα που βοηθά 974 00:43:35,110 --> 00:43:38,220 δούμε ακριβώς τι έχει πρόκειται για ολόκληρο αυτό το διάστημα. 975 00:43:38,220 --> 00:43:40,284 Πάω να πάει μπροστά και να ανοίξει Σύγκριση Μηδέν. 976 00:43:40,284 --> 00:43:42,200 Και Πάω να κλείσει εντοπισμού σφαλμάτων μας, Πάω 977 00:43:42,200 --> 00:43:44,360 για να κλείσετε αυτό το τρομακτικό μήνυμα που αναζητούν το ακριβώς λέει, περιμένετε ένα λεπτό, 978 00:43:44,360 --> 00:43:45,800 είστε στη μέση debugging. 979 00:43:45,800 --> 00:43:48,383 Πάω να κρύψει αυτήν την καρτέλα εδώ μόνο για να πάει πίσω στην απλότητα. 980 00:43:48,383 --> 00:43:50,160 Γι 'αυτό μην ανησυχείτε αν το GDB σκοτώνεται. 981 00:43:50,160 --> 00:43:53,910 Αυτό σημαίνει απλά ότι το πρόγραμμα έχει έχουν εγκαταλείψει, σκόπιμα σε αυτήν την περίπτωση, 982 00:43:53,910 --> 00:43:54,820 από μένα. 983 00:43:54,820 --> 00:43:57,700 >> Και τώρα Συγκρίνετε Zero κάνει αυτό. 984 00:43:57,700 --> 00:44:00,110 Είμαι χρησιμοποιώντας το CS50 βιβλιοθήκη στο πρότυπο I / O. 985 00:44:00,110 --> 00:44:04,319 Έχω μια βασική λειτουργία που πρώτα λέει, να πω κάτι, και παίρνει ένα string. 986 00:44:04,319 --> 00:44:06,110 Στη συνέχεια λέει ξανά και παίρνει μια άλλη χορδή. 987 00:44:06,110 --> 00:44:09,910 Και παρατηρήσετε ότι αυτά τα δύο strings καλούνται s και t, αντίστοιχα. 988 00:44:09,910 --> 00:44:12,910 Και τώρα αυτό το πρόγραμμα, Σύγκριση Μηδέν, ο σκοπός του στη ζωή, 989 00:44:12,910 --> 00:44:15,470 που θα έπρεπε να μου πει, έκανα πληκτρολογήστε το ίδιο πράγμα; 990 00:44:15,470 --> 00:44:16,910 Και έτσι Πάω πίσω στην πρώτη εβδομάδα. 991 00:44:16,910 --> 00:44:19,950 Είμαι χρησιμοποιώντας ίσα ίσα χειριστή μου το οποίο είναι ο φορέας της ποιότητας. 992 00:44:19,950 --> 00:44:22,220 Δεν είναι ο φορέας ανάθεσης, ο φορέας ισότητας. 993 00:44:22,220 --> 00:44:23,890 Είμαι απλά συγκρίνοντας s και t. 994 00:44:23,890 --> 00:44:27,470 >> Ας πραγματικά να προχωρήσει και να το κάνουμε αυτό. 995 00:44:27,470 --> 00:44:32,680 Και Πάω να πάει μπροστά και να συγκρίνετε Zero. 996 00:44:32,680 --> 00:44:35,110 Πάω να κάνω ./comparezero. 997 00:44:35,110 --> 00:44:37,150 Και Πάω να πάει μπροστά και να πω κάτι 998 00:44:37,150 --> 00:44:43,450 όπως, ας κάνουμε τη μαμά σε πεζά και πώς για την μαμά με κεφαλαία γράμματα. 999 00:44:43,450 --> 00:44:45,034 Και φυσικά πληκτρολογήστε διαφορετικά πράγματα. 1000 00:44:45,034 --> 00:44:45,533 Εντάξει. 1001 00:44:45,533 --> 00:44:46,570 Αυτό είναι αναμενόμενο. 1002 00:44:46,570 --> 00:44:47,640 >> Ας το εκτελέσετε ξανά. 1003 00:44:47,640 --> 00:44:49,740 Και τις δύο φορές κάνουμε πεζά, πεζά. 1004 00:44:49,740 --> 00:44:51,490 Αυτό φαίνεται εξαιρετικά όμοια με μένα. 1005 00:44:51,490 --> 00:44:52,930 Enter. 1006 00:44:52,930 --> 00:44:53,430 ΕΝΤΆΞΕΙ. 1007 00:44:53,430 --> 00:44:55,804 Ίσως είναι απλά περίεργο γιατί δεν είναι γραμματική μου αρέσει. 1008 00:44:55,804 --> 00:44:59,930 Ας κάνουμε μια μαμά κεφαλαίου, κεφάλαιο MOM, πανομοιότυπα. 1009 00:44:59,930 --> 00:45:01,490 Διαφορετικά πράγματα. 1010 00:45:01,490 --> 00:45:03,907 >> Τόσο γιατί είναι αυτό; 1011 00:45:03,907 --> 00:45:06,240 Λοιπόν, τι πραγματικά συμβαίνει για κάτω από το καπό εδώ; 1012 00:45:06,240 --> 00:45:08,180 Ας πάμε πίσω πάνω εδώ μόνο για μια στιγμή 1013 00:45:08,180 --> 00:45:10,910 και να εξετάσει τι GetString Είναι πραγματικά να κάνει. 1014 00:45:10,910 --> 00:45:13,385 Όταν καλείτε GetString, αυτό είναι μια λειτουργία που 1015 00:45:13,385 --> 00:45:16,510 εαυτούς μας έγραψε και παίρνει κατά κάποιο τρόπο ένα ακολουθία των χαρακτήρων από το χρήστη. 1016 00:45:16,510 --> 00:45:20,280 Και ας υποθέσουμε ότι το πρώτο φορά καλώ GetString, αυτό μου δίνει 1017 00:45:20,280 --> 00:45:21,930 ένα κομμάτι της μνήμης που μοιάζει με αυτό. 1018 00:45:21,930 --> 00:45:26,990 Και αν πληκτρολογήσει σε όλα τα πεζά m-o-m-- και τι συμβαίνει μετά; 1019 00:45:26,990 --> 00:45:28,840 Απλά ένα γρήγορο έλεγχο λογικότητας. 1020 00:45:28,840 --> 00:45:29,780 >> Ανάστροφη κάθετο μηδέν. 1021 00:45:29,780 --> 00:45:30,510 Γνωρίζουμε ότι. 1022 00:45:30,510 --> 00:45:32,784 Και υπενθυμίζουν ότι παίξαμε περίπου με το όνομα του Zamila 1023 00:45:32,784 --> 00:45:34,950 και ένα σωρό άλλα ονόματα όταν ο Rob ήταν εδώ ψάχνουν 1024 00:45:34,950 --> 00:45:36,280 σε ό, τι συμβαίνει στο εσωτερικό της μνήμης. 1025 00:45:36,280 --> 00:45:37,780 Έτσι, αυτή η ιστορία είναι ακριβώς το ίδιο. 1026 00:45:37,780 --> 00:45:40,160 Αυτό είναι ό, τι GetString επιστρέφει σε μένα. 1027 00:45:40,160 --> 00:45:44,780 Τώρα, κωδικό μου πριν από λίγο αποθηκεύονται η τιμή επιστροφής της GetString 1028 00:45:44,780 --> 00:45:47,510 σε μια μεταβλητή που ονομάζεται s. 1029 00:45:47,510 --> 00:45:51,390 Και τότε η δεύτερη φορά που κάλεσα, αυτό το αποθηκεύεται σε μια μεταβλητή που ονομάζεται t. 1030 00:45:51,390 --> 00:45:55,070 >> Έτσι, αν πάω εδώ, χρειάζομαι να συντάξει αυτό το τοπικό variable-- 1031 00:45:55,070 --> 00:45:59,610 και είμαι γενικά πρόκειται να σχεδιάσετε μια σειρά όπως just-- θα 1032 00:45:59,610 --> 00:46:02,360 αποκαλούν S-- σαν μια μικρή πλατεία εδώ. 1033 00:46:02,360 --> 00:46:09,760 Και τώρα, somehow-- πώς μαμά πηγαίνετε στο εσωτερικό αυτής της μεταβλητής s; 1034 00:46:09,760 --> 00:46:12,010 Λοιπόν, πρέπει να πάμε πίσω στις πρώτες αρχές εδώ. 1035 00:46:12,010 --> 00:46:15,660 Τι είναι πραγματικά GetString επιστροφή; 1036 00:46:15,660 --> 00:46:19,030 >> Έτσι αποδεικνύεται ότι το Μ-Ο-Μ ανάστροφη κάθετο μηδέν, και οποιοσδήποτε αριθμός 1037 00:46:19,030 --> 00:46:22,364 από άλλες χορδές στη μνήμη, όπως Zamila και Rob ή Andy ή οποιαδήποτε άλλα, 1038 00:46:22,364 --> 00:46:24,280 είναι φυσικά σε μας RAM ή μνήμη του υπολογιστή. 1039 00:46:24,280 --> 00:46:27,760 Και μνήμη RAM σας έχει like-- έχετε μια συναυλία της μνήμης RAM, δύο συναυλίες της μνήμης RAM, 1040 00:46:27,760 --> 00:46:30,860 ή ένα δισεκατομμύριο ή δύο δισεκατομμύριο bytes, ή ίσως ακόμη περισσότερο αυτές τις μέρες. 1041 00:46:30,860 --> 00:46:34,070 Ας υποθέσουμε, για τους σκοπούς του σήμερα, ότι δεν έχει σημασία το πώς θα αριθμούν 1042 00:46:34,070 --> 00:46:36,640 τους, αλλά μπορούμε να αριθμούν κάθε εκείνων δισεκατομμύρια ή δύο δισεκατομμύρια 1043 00:46:36,640 --> 00:46:37,880 ή τέσσερα δισεκατομμύρια bytes. 1044 00:46:37,880 --> 00:46:42,240 >> Και ας πούμε ότι αυθαίρετα Αυτή είναι η πρώτη μπουκιά, δεύτερο δάγκωμα, 1045 00:46:42,240 --> 00:46:43,380 ΤΡΙΤΗ ΤΕΤΑΡΤΗ. 1046 00:46:43,380 --> 00:46:46,570 Είμαι σκόπιμα δεν χρησιμοποίηση του μηδέν για σήμερα, αλλά θα επανέλθουμε σε αυτό. 1047 00:46:46,570 --> 00:46:49,570 Έτσι, με άλλα λόγια, εάν αυτή είναι η πρώτη φορά είμαι με τη χρήση του προγράμματος, 1048 00:46:49,570 --> 00:46:52,715 Είμαι απλά να πάρει τυχερός και η πρώτη δάγκωμα είναι σε ένα σημείο, στη συνέχεια, δύο 1049 00:46:52,715 --> 00:46:53,590 στη συνέχεια, τρεις από τέσσερις. 1050 00:46:53,590 --> 00:46:57,430 Και αν συνέχιζα την κατάρτιση, τον αριθμό πλαισίου δύο δισεκατομμύρια θα είναι πορεία μέχρι εδώ. 1051 00:46:57,430 --> 00:47:02,200 >> Λοιπόν, τι νομίζεις, στη συνέχεια, GetString επιστρέφει στην πραγματικότητα; 1052 00:47:02,200 --> 00:47:06,010 Δεν είναι επιστρέφουν Μ-Ο-Μ ανάποδη μηδέν per se, διότι σαφώς ότι 1053 00:47:06,010 --> 00:47:08,180 δεν θα χωράει στο κουτί που έχω σχεδιάσει. 1054 00:47:08,180 --> 00:47:11,210 Λοιπόν, τι άλλο θα μπορούσε να GetString πραγματικότητα πρέπει να επιστρέψει όλα αυτά εβδομάδες; 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 Η απάντηση είναι σχετικά με την πλοίο εδώ κάπου. 1057 00:47:16,820 --> 00:47:20,390 Μπορείτε δεν μπορεί να χωρέσει Μ-Ο-Μ ανάποδη μηδέν, ναι, τι θα μπορούσε να έχει νόημα αντ 'αυτού; 1058 00:47:20,390 --> 00:47:23,424 Εάν έπρεπε να είναι εξαιρετικά έξυπνος, βάζοντας σχετικά με την λεγόμενη καπέλο μηχανικής, 1059 00:47:23,424 --> 00:47:24,340 τι θα μπορούσατε να επιστρέψετε; 1060 00:47:24,340 --> 00:47:27,340 Ποιο είναι το ελάχιστο ποσό των πληροφοριών θα μπορούσε να επιστρέψει ότι θα εξακολουθούσε 1061 00:47:27,340 --> 00:47:30,610 σας επιτρέπουν να βρείτε Μ-Ο-Μ στη μνήμη; 1062 00:47:30,610 --> 00:47:31,270 Ναι; 1063 00:47:31,270 --> 00:47:31,950 >> Κοινό: Ένα. 1064 00:47:31,950 --> 00:47:32,200 >> David J. Malan: Ένα. 1065 00:47:32,200 --> 00:47:33,021 Και γιατί ένα; 1066 00:47:33,021 --> 00:47:35,520 Κοινό: Επειδή θα πω πού να πάτε [δεν ακούγεται]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 David J. Malan: Ακριβώς. 1069 00:47:39,390 --> 00:47:44,300 Είμαι ακριβώς πρόκειται να επιστρέψει τη διεύθυνση της συμβολοσειράς που έχω πάρει. 1070 00:47:44,300 --> 00:47:46,570 Η διεύθυνση αυτή περίπτωση είναι η θέση ένα. 1071 00:47:46,570 --> 00:47:51,280 Έτσι, αυτό που πραγματικά που αποθηκεύονται σε S-- και κάθε μεταβλητή συμβολοσειράς έτσι εως τώρα 1072 00:47:51,280 --> 00:47:53,430 έχει μόλις η διεύθυνση της εν λόγω σειράς. 1073 00:47:53,430 --> 00:47:57,840 >> Εν τω μεταξύ, αν καλώ GetString για δεύτερη φορά και εγώ 1074 00:47:57,840 --> 00:48:03,300 πληκτρολογήστε το κυριολεκτικά το ίδιο thing-- M-O-M με lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 και ένα άλλο backslash μηδέν, και τώρα ίσως το πρόγραμμα μου 1076 00:48:06,200 --> 00:48:09,820 λειτουργεί για κάποιο χρονικό διάστημα, έτσι ίσως αυτό είναι 10, αυτό είναι η τοποθεσία 11, αυτό είναι 12, 1077 00:48:09,820 --> 00:48:10,700 αυτό είναι 13. 1078 00:48:10,700 --> 00:48:13,590 Οι υπολογιστές που χρησιμοποιούν κάποιο άλλο μνήμη για οποιονδήποτε λόγο. 1079 00:48:13,590 --> 00:48:18,172 Τι κάνουμε τώρα πηγαίνει στη δεύτερη μου μεταβλητή στο πρόγραμμα μου δεν είναι; 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Ακριβώς. 1082 00:48:20,050 --> 00:48:23,910 >> Και έτσι όταν εξετάζουμε το πηγαίο κώδικα του προγράμματος αυτού 1083 00:48:23,910 --> 00:48:26,550 όπου είμαι απλά προσπαθώ να συγκρίνουν τις δύο τιμές, 1084 00:48:26,550 --> 00:48:32,180 s είναι ίση ίσο με Τ, τι είναι η προφανής απάντηση του ανθρώπου; 1085 00:48:32,180 --> 00:48:34,890 Ακριβώς επειδή δεν 1 δεν είναι ίσο με 10. 1086 00:48:34,890 --> 00:48:36,861 Και έτσι εδώ βρίσκεται ένα ευκαιρία για μας πραγματικά 1087 00:48:36,861 --> 00:48:39,610 απλά να πάει πίσω στο, και πάλι, πρώτο αρχές και να σκεφτούμε, επίσης, 1088 00:48:39,610 --> 00:48:41,110 τι συμβαίνει κάτω από την κουκούλα; 1089 00:48:41,110 --> 00:48:43,240 Έχουμε μιλήσει για bits και bytes και τη μνήμη, 1090 00:48:43,240 --> 00:48:46,820 αλλά στην πραγματικότητα είναι χρήσιμο να κατανοήσουμε γιατί όταν σας καλούν GetString, 1091 00:48:46,820 --> 00:48:50,280 παρόλο που το σκέφτομαι αυτό είναι επιστροφή Μ-Ο-Μ ή σπάγκο μαμά 1092 00:48:50,280 --> 00:48:53,120 ή Andy ή Zamila ή τα παρόμοια, τεχνικώς 1093 00:48:53,120 --> 00:48:55,510 είναι ακριβώς επιστρέφει τη διεύθυνση του εν λόγω κομμάτι της μνήμης. 1094 00:48:55,510 --> 00:48:56,910 >> Αλλά αυτό είναι εντάξει. 1095 00:48:56,910 --> 00:49:00,570 Διότι πώς μπορώ να ξέρω όπου η σειρά τελειώνει; 1096 00:49:00,570 --> 00:49:03,840 Αν είμαι δοθεί μόνο η αρχή; 1097 00:49:03,840 --> 00:49:05,380 Λοιπόν, η ανάστροφη κάθετο μηδέν, έτσι δεν είναι; 1098 00:49:05,380 --> 00:49:08,800 Ακριβώς σε γραμμικό χρόνο μπορώ εκτυπώσετε με τους Def εκτύπωσης Μ-Ο-Μ. 1099 00:49:08,800 --> 00:49:11,820 Και το συντομότερο βλέπω ανάποδη μηδέν, δεν με νοιάζει όπου ξεκίνησα, 1100 00:49:11,820 --> 00:49:14,950 Γνωρίζω ήδη σιωπηρά όπου πρέπει να τελειώσει. 1101 00:49:14,950 --> 00:49:18,700 >> Και έτσι η σημερινή ημέρα σηματοδοτεί την beginning-- και επιτρέψτε μου να κάνω αυτό δραματικά, διότι 1102 00:49:18,700 --> 00:49:21,800 πέρασε ένα μεγάλο κόπο για να πάρετε αυτά εδώ κατάρτιση wheels-- 1103 00:49:21,800 --> 00:49:29,840 Έτσι, σήμερα οι τροχοί αρχίσουν εκπαίδευση να βγει και να μας αποκαλύψει σε least-- 1104 00:49:29,840 --> 00:49:31,373 >> [Χειροκρότημα] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> Αυτή ήταν καλά αξίζει το ταξίδι με το σύστημα Target σήμερα το πρωί, ναι; 1107 00:49:36,160 --> 00:49:39,600 Έτσι now-- υπάρχει, αποδεικνύεται έξω, δεν υπάρχει τέτοιο πράγμα όπως εγχόρδων. 1108 00:49:39,600 --> 00:49:41,140 String δεν υπάρχει. 1109 00:49:41,140 --> 00:49:43,760 Είναι ένα συνώνυμο που είχαμε στο εσωτερικό της βιβλιοθήκης CS50. 1110 00:49:43,760 --> 00:49:48,660 Στο εξής, θα πάμε για να ξεκινήσετε την κλήση s και t δεν χορδές, αλλά char αστέρια. 1111 00:49:48,660 --> 00:49:51,180 Και το αστέρι char θα πειράζω εκτός πριν από καιρό. 1112 00:49:51,180 --> 00:49:53,510 Αλλά αυτό είναι να πούμε, ότι ακόμη και αν συνεχίσουμε 1113 00:49:53,510 --> 00:49:56,180 χρησιμοποιώντας GetString για τώρα, τεχνικά θα ήθελα 1114 00:49:56,180 --> 00:49:59,010 να λες αστέρι char και χαρα αστέρων. 1115 00:49:59,010 --> 00:50:01,720 >> Και αποδεικνύεται ότι το αστέρι αυτό πρόκειται να υποδηλώσει είναι κάτι 1116 00:50:01,720 --> 00:50:04,340 που ονομάζεται δείκτης ή μια διεύθυνση. 1117 00:50:04,340 --> 00:50:06,110 Και στην πραγματικότητα, ένα τρέιλερ για ό, τι βρίσκεται μπροστά μας 1118 00:50:06,110 --> 00:50:09,760 Είναι αυτό 20 δευτερόλεπτα κλιπ από μας φίλος Nick Parlante στο Πανεπιστήμιο του Στάνφορντ 1119 00:50:09,760 --> 00:50:12,927 ο οποίος, πριν από αρκετό καιρό, μπορείτε να περάσετε ένα γελοίο ποσό του χρόνου, 1120 00:50:12,927 --> 00:50:15,010 όσο καλύτερα μπορώ να πω του κουζίνα ή στο υπόγειο του, 1121 00:50:15,010 --> 00:50:17,140 καθιστώντας πλαστελίνης εισαγωγή στον κόσμο 1122 00:50:17,140 --> 00:50:20,010 ένας χαρακτήρας που ονομάζεται Binky με τους οποίους θα 1123 00:50:20,010 --> 00:50:22,010 να εισαχθεί την επόμενη φορά να δείκτες. 1124 00:50:22,010 --> 00:50:24,588 Έτσι, εδώ είναι μια προεπισκόπηση του τι είναι να έρθει. 1125 00:50:24,588 --> 00:50:26,370 >> [ΑΝΑΠΑΡΑΓΩΓΗ] 1126 00:50:26,370 --> 00:50:27,510 >> -Γεια Σου, Binky. 1127 00:50:27,510 --> 00:50:28,260 Ξύπνα. 1128 00:50:28,260 --> 00:50:30,672 Ήρθε η ώρα για το δείκτη διασκέδαση. 1129 00:50:30,672 --> 00:50:31,616 >> -Τι είναι αυτό? 1130 00:50:31,616 --> 00:50:33,032 Μάθετε για τους δείκτες; 1131 00:50:33,032 --> 00:50:34,450 Ω, Goody. 1132 00:50:34,450 --> 00:50:35,431 >> [Σταματήσετε την αναπαραγωγή] 1133 00:50:35,431 --> 00:50:38,055 David J. Malan: Και σε αυτό το σημείωμα, θα σας δούμε την Τετάρτη. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 Εντάξει. 1136 00:50:48,090 --> 00:50:48,740 Ποιος είναι ο χορός; 1137 00:50:48,740 --> 00:50:49,240 Ελα. 1138 00:50:49,240 --> 00:50:50,330 Ποιος είναι ο χορός; 1139 00:50:50,330 --> 00:50:51,820 Θέλεις να πάρει άρχισε; 1140 00:50:51,820 --> 00:50:53,770 Θα πάρει άρχισε. 1141 00:50:53,770 --> 00:50:54,270 Woooo! 1142 00:50:54,270 --> 00:51:04,070 1143 00:51:04,070 --> 00:51:07,580 >> LAUREN: Γλυκό φανταχτερό Μωυσή.