1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J. Malan: Ceci est CS50 et ceci est le début de la quatrième semaine. 3 00:00:14,050 --> 00:00:18,630 Et, garçon, est dans Volkswagen difficulté à cause de logiciels. 4 00:00:18,630 --> 00:00:20,264 Prenons un coup d'oeil. 5 00:00:20,264 --> 00:00:20,930 [LECTURE VIDÉO] 6 00:00:20,930 --> 00:00:25,560 -Cars, Les personnages les plus intelligents dans les films Fast and Furious. 7 00:00:25,560 --> 00:00:29,100 Cette semaine constructeur automobile allemand Volkswagen se trouvait 8 00:00:29,100 --> 00:00:32,490 au milieu d'un scandale de proportions potentiellement criminelles. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Se prépare à des milliards des amendes, des possibles accusations criminelles 10 00:00:36,060 --> 00:00:38,560 pour ses cadres, comme la société présente ses excuses 11 00:00:38,560 --> 00:00:41,840 pour truquer 11 millions de voitures à l'aider à battre les essais d'émissions. 12 00:00:41,840 --> 00:00:44,950 >> Modèles diesel sont -Certains conçu avec des logiciels sophistiqués 13 00:00:44,950 --> 00:00:48,440 que l'information utilisée y compris le position de la direction et véhicule 14 00:00:48,440 --> 00:00:51,870 accélérer pour déterminer la voiture était subir des tests d'émissions. 15 00:00:51,870 --> 00:00:55,650 En vertu de cette circonstance, le moteur permettrait de réduire les émissions toxiques. 16 00:00:55,650 --> 00:00:59,070 Mais la voiture a été truqué à la dérivation que quand il a été entraînée. 17 00:00:59,070 --> 00:01:03,320 Les émissions ont augmenté de 10 à 40 fois au-dessus des niveaux APE acceptables. 18 00:01:03,320 --> 00:01:04,280 >> [FIN LECTURE] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J. Malan: Alors disons regarde ça 20 00:01:05,220 --> 00:01:07,250 et de voir exactement comment cette pourraient être mis en oeuvre 21 00:01:07,250 --> 00:01:09,680 et comment cela pourrait affecter autant de voitures de ce genre. 22 00:01:09,680 --> 00:01:12,840 Donc, dans ma main voici la presse presse qui a été publié par le EPA-- 23 00:01:12,840 --> 00:01:14,620 l'environnement Agence de protection qui 24 00:01:14,620 --> 00:01:18,032 est l'organisme de réglementation des États-Unis que gère les préoccupations environnementales, 25 00:01:18,032 --> 00:01:19,740 puis le réel Avis juridique qui était 26 00:01:19,740 --> 00:01:22,420 envoyer à Volkswagen il ya quelques jours. 27 00:01:22,420 --> 00:01:26,530 >> Donc, l'EPA écrit, et divulgue maintenant publiquement, un logiciel sophistiqué 28 00:01:26,530 --> 00:01:29,390 sur certain algorithme Véhicules Volkswagen détecte 29 00:01:29,390 --> 00:01:32,630 lorsque la voiture est en cours tests sur les émissions officielles 30 00:01:32,630 --> 00:01:36,505 et tourne émissions complètes contrôle sur seulement pendant l'essai. 31 00:01:36,505 --> 00:01:38,380 L'efficacité de Ces véhicules pollution 32 00:01:38,380 --> 00:01:43,260 dispositifs de contrôle des émissions est grandement réduit au cours de la conduite normale tout 33 00:01:43,260 --> 00:01:44,320 situations. 34 00:01:44,320 --> 00:01:48,190 Il en résulte des voitures qui répondent à la normes dans le laboratoire ou des tests 35 00:01:48,190 --> 00:01:52,790 la station, mais, en fonctionnement normal émettre oxides-- d'azote ou NOx-- 36 00:01:52,790 --> 00:01:54,950 à jusqu'à 40 fois la norme. 37 00:01:54,950 --> 00:01:58,220 Le logiciel produit par Volkswagen est un dispositif entre guillemets, la défaite, 38 00:01:58,220 --> 00:02:00,650 tel que défini par la Clean Air Act aux États-Unis. 39 00:02:00,650 --> 00:02:03,410 >> Ils poursuivent en disant que l'EPA et un autre organisme 40 00:02:03,410 --> 00:02:07,020 découvert le dispositif de la défaite logiciel après analyse indépendante 41 00:02:07,020 --> 00:02:09,660 par des chercheurs de l'Ouest Université de Virginie. 42 00:02:09,660 --> 00:02:14,160 NOx contribue à la pollution le dioxyde d'azote, l'ozone au niveau du sol, 43 00:02:14,160 --> 00:02:15,700 et les particules fines. 44 00:02:15,700 --> 00:02:18,090 L'exposition à ces a été liée polluants 45 00:02:18,090 --> 00:02:20,870 avec une large gamme de effets graves pour la santé, 46 00:02:20,870 --> 00:02:23,637 y compris l'asthme accru attaques et autres respiratoires 47 00:02:23,637 --> 00:02:26,470 maladies qui peuvent être assez graves d'envoyer des gens à l'hôpital. 48 00:02:26,470 --> 00:02:28,660 L'exposition à l'ozone et la matière particulaire a également 49 00:02:28,660 --> 00:02:31,960 été associée à prématuré les décès dus aux respiratoires 50 00:02:31,960 --> 00:02:35,690 ou des effets cardiovasculaires liées. 51 00:02:35,690 --> 00:02:38,940 Les enfants, les personnes âgées, les personnes maladie respiratoire préexistante 52 00:02:38,940 --> 00:02:42,840 sont particulièrement à risque de effets sur la santé de ces polluants. 53 00:02:42,840 --> 00:02:45,056 >> Qu'il suffise de dire est, il est tout à fait sérieux. 54 00:02:45,056 --> 00:02:46,930 Et Passons à lire juste un de plus extrait 55 00:02:46,930 --> 00:02:49,370 et ensuite, nous allons jeter un oeil à les implications sous-jacentes 56 00:02:49,370 --> 00:02:50,920 de ce dans le cadre d'une voiture. 57 00:02:50,920 --> 00:02:53,730 Plus précisément, Volkswagen fabriqué et installé 58 00:02:53,730 --> 00:02:56,210 logiciel dans le soi-disant commande électronique 59 00:02:56,210 --> 00:02:59,320 module-- ou de ECM-- que ces véhicules détectés 60 00:02:59,320 --> 00:03:03,580 lorsque le véhicule a été mis à l'essai pour conformité avec les normes d'émissions EPA. 61 00:03:03,580 --> 00:03:07,510 Basé sur divers intrants, y compris la position du volant, véhicule 62 00:03:07,510 --> 00:03:11,280 la vitesse, la durée du moteur de fonctionnement, et la pression barométrique, 63 00:03:11,280 --> 00:03:13,720 ces entrées précisément suivi des paramètres 64 00:03:13,720 --> 00:03:17,600 de la procédure d'essai fédéral utilisé pour tests d'émission selon la certification EPA 65 00:03:17,600 --> 00:03:18,400 fins. 66 00:03:18,400 --> 00:03:21,850 >> Lors de tests d'émissions de l'EPA, le logiciel de véhicules ECM 67 00:03:21,850 --> 00:03:25,060 le logiciel qui a produit couru les résultats des émissions conformes. 68 00:03:25,060 --> 00:03:28,340 En tout autre temps, la logiciel ECM du véhicule 69 00:03:28,340 --> 00:03:31,090 a couru une route séparée étalonnage qui réduit 70 00:03:31,090 --> 00:03:34,360 l'efficacité de la système global de contrôle des émissions, 71 00:03:34,360 --> 00:03:37,864 spécifiquement la catalytique sélective réduction du Lean NOx trap-- 72 00:03:37,864 --> 00:03:39,280 que nous verrons dans un instant. 73 00:03:39,280 --> 00:03:43,040 En conséquence, les émissions de NOx augmenté d'un facteur de 10 à 40 fois 74 00:03:43,040 --> 00:03:47,450 au-dessus des niveaux conformes EPA en fonction du type de cycle de conduite. 75 00:03:47,450 --> 00:03:50,800 >> Donc, ce que cela signifie vraiment, et la code source pour le logiciel en cours d'exécution 76 00:03:50,800 --> 00:03:53,190 sur les Volkswagen n'a pas encore été divulguée publiquement, 77 00:03:53,190 --> 00:03:56,460 est que, effectivement, ce équivalent il ya quelque part à l'intérieur 78 00:03:56,460 --> 00:03:57,830 du code de Volkswagen. 79 00:03:57,830 --> 00:04:02,200 Si vous êtes en cours de test, et si la voiture détecte certains facteurs environnementaux 80 00:04:02,200 --> 00:04:04,330 comme le volant la position ou le mouvement 81 00:04:04,330 --> 00:04:06,710 de celui-ci ou de la voiture ou manquer un certain nombre d'autres facteurs 82 00:04:06,710 --> 00:04:09,940 qui sont actuellement émis l'hypothèse de faire partie de cette formule, 83 00:04:09,940 --> 00:04:12,370 ils se tournent tout simplement sur émissions plein contrôle. 84 00:04:12,370 --> 00:04:15,670 En d'autres termes, ils commencent émettant moins de polluants. 85 00:04:15,670 --> 00:04:18,769 >> Sinon, dans toutes les autres situations quand il est pas détecté comme étant 86 00:04:18,769 --> 00:04:20,790 dans le laboratoire, ils le font tout simplement pas. 87 00:04:20,790 --> 00:04:24,320 Et si vous pouvez simplifier cela en plus pseudo béton avec quelque chose 88 00:04:24,320 --> 00:04:24,820 comme ça. 89 00:04:24,820 --> 00:04:27,810 Si les roues tournent, mais le volant est pas, suggestive 90 00:04:27,810 --> 00:04:30,060 que la voiture est sur certains sorte de cylindre rotatif 91 00:04:30,060 --> 00:04:32,550 mais dans une sorte de entrepôt testé, 92 00:04:32,550 --> 00:04:36,070 alors se comporter comme le APE vous aimer. 93 00:04:36,070 --> 00:04:37,960 Ne pas autrement. 94 00:04:37,960 --> 00:04:40,420 Donc, nous allons jeter un coup d'oeil à une courte vidéo qui 95 00:04:40,420 --> 00:04:45,391 jette un regard sur ce que les implications sont de ce fait mécaniquement. 96 00:04:45,391 --> 00:04:48,620 >> [LECTURE VIDÉO] 97 00:04:48,620 --> 00:04:52,800 >> -Last Vendredi EPA a annoncé que certains Voitures Volkswagen Audi faites entre 2009 98 00:04:52,800 --> 00:04:55,840 et cette année ont été en utilisant un dispositif que l'on appelle la défaite 99 00:04:55,840 --> 00:04:59,060 à contourner les lois sur les émissions conçu pour garder l'air pur. 100 00:04:59,060 --> 00:05:01,700 Mais qu'est-ce que cela signifie exactement? 101 00:05:01,700 --> 00:05:04,666 >> Eh bien, les voitures modernes ont des dizaines des ordinateurs à l'intérieur. 102 00:05:04,666 --> 00:05:07,040 Et certains de ces ordinateurs aider à coordonner les fonctions 103 00:05:07,040 --> 00:05:09,590 du moteur pour optimale performances tout en veillant 104 00:05:09,590 --> 00:05:12,340 qu'il n'y a pas trop d'ordures sortant du tuyau d'échappement. 105 00:05:12,340 --> 00:05:15,170 Ils ont effectivement travaillé de cette façon depuis plusieurs décennies. 106 00:05:15,170 --> 00:05:17,380 Fondamentalement, chaque partie du moteur d'une voiture moderne 107 00:05:17,380 --> 00:05:20,080 présente un capteur ou dispositif de commande sur elle, et ces ordinateurs 108 00:05:20,080 --> 00:05:23,460 en train de lire dans les données des milliers de fois par seconde ajustements de courtoisie 109 00:05:23,460 --> 00:05:26,220 comme le rapport du combustible à l'air cela va dans les cylindres. 110 00:05:26,220 --> 00:05:28,730 >> Ces Volkswagen tricherie et les modèles Audi sont des diesels, 111 00:05:28,730 --> 00:05:30,890 et diesels ont un plus ordinateur vraiment important 112 00:05:30,890 --> 00:05:34,030 paramètres contrôlés, ce qui est la quantité de carburant non brûlé passe 113 00:05:34,030 --> 00:05:35,200 dans l'échappement. 114 00:05:35,200 --> 00:05:36,310 Maintenant que sonne mal. 115 00:05:36,310 --> 00:05:39,642 Ne sonne pas comme vous voudriez carburant imbrûlé entrer dans l'échappement. 116 00:05:39,642 --> 00:05:41,600 Mais dans le cas d'un diesel, vous avez quelque chose 117 00:05:41,600 --> 00:05:46,110 appelé un piège à NOx qui est un dispositif qui absorbe et pièges pour les oxydes d'azote 118 00:05:46,110 --> 00:05:48,880 qui sont des polluants qui serait sinon, passez dans l'atmosphère. 119 00:05:48,880 --> 00:05:53,040 Et l'effet de ce piège à NOx est renforcée avec du carburant non brûlé. 120 00:05:53,040 --> 00:05:56,650 Ainsi, un dispositif d'invalidation est un programme spécial l'intérieur de ces ordinateurs qui peuvent rendre 121 00:05:56,650 --> 00:05:59,527 ressembler à la voiture répond émission normes, même quand il ne le fait pas. 122 00:05:59,527 --> 00:06:01,110 Volkswagen avait un problème sur ses mains. 123 00:06:01,110 --> 00:06:04,050 Ses moteurs diesel ont été connus pour obtenir une grande économie de carburant, 124 00:06:04,050 --> 00:06:07,510 mais le piège à NOx ne fonctionne bien lorsque plus de carburant est utilisé. 125 00:06:07,510 --> 00:06:10,460 Donc, la voiture serait de détecter, en utilisant ce dispositif de défaite, 126 00:06:10,460 --> 00:06:13,870 quand il se faisait un émissions test, ce serait utiliser plus de carburant, 127 00:06:13,870 --> 00:06:16,830 bien faire le travail de piège à NOx, émissions serait bien. 128 00:06:16,830 --> 00:06:21,130 Mais alors que vous obtenez sur la route, le dispositif éteint, vous brûlez moins de carburant 129 00:06:21,130 --> 00:06:24,256 mais vous mettez autant que 40 fois plus de polluants dans l'atmosphère. 130 00:06:24,256 --> 00:06:26,130 Mais comment diable fait la voiture sait qu'il était 131 00:06:26,130 --> 00:06:27,720 pour vérifier la conformité des émissions? 132 00:06:27,720 --> 00:06:30,590 L'EPA dit qu'il était un système sophistiqué système qui vérifie les choses 133 00:06:30,590 --> 00:06:34,090 comme la position du volant, vitesse, combien de temps le moteur était allumé, 134 00:06:34,090 --> 00:06:35,507 et la même pression atmosphérique. 135 00:06:35,507 --> 00:06:37,673 En d'autres termes, il y avait aucune façon cela était accidentelle 136 00:06:37,673 --> 00:06:40,260 parce que le logiciel était conçu très soigneusement pour détecter 137 00:06:40,260 --> 00:06:41,630 un test d'émissions officielle. 138 00:06:41,630 --> 00:06:43,588 Voilà quelques-unes assez grave la tromperie et qui est 139 00:06:43,588 --> 00:06:45,420 pourquoi Volkswagen est en tels ennuis sérieux. 140 00:06:45,420 --> 00:06:48,600 En fait, leur PDG, Martin Winterkorn, juste démissionné. 141 00:06:48,600 --> 00:06:49,820 >> Alors qu'est-ce qui se passe ensuite? 142 00:06:49,820 --> 00:06:53,900 Eh bien, si vous êtes l'un des demi-million Jetta diesel, Beatles, Golfs, Passat, 143 00:06:53,900 --> 00:06:56,220 ou Audi A3s effectuée, les bonnes nouvelles est est 144 00:06:56,220 --> 00:06:57,886 que votre voiture est toujours sûr de conduire. 145 00:06:57,886 --> 00:07:00,510 Vous n'êtes pas obligé de le ranger jusqu'à ce que Volkswagen émet un rappel. 146 00:07:00,510 --> 00:07:02,509 Mais à un certain point ils sont probablement devoir 147 00:07:02,509 --> 00:07:04,230 de mettre à jour le logiciel à l'intérieur de votre voiture. 148 00:07:04,230 --> 00:07:06,927 Lorsque cela arrive, vous pourriez obtenir moins de miles par réservoir. 149 00:07:06,927 --> 00:07:09,260 Avocats se préparent déjà pour les procès d'action de classe 150 00:07:09,260 --> 00:07:12,500 afin que les propriétaires pourraient obtenir une indemnisation à un certain moment dans l'avenir. 151 00:07:12,500 --> 00:07:15,832 Mais cela ne va pas à arriver de si tôt. 152 00:07:15,832 --> 00:07:16,711 >> [FIN LECTURE] 153 00:07:16,711 --> 00:07:19,960 DAVID J. Malan: Donc, cela soulève effectivement une grande question d'image intéressante 154 00:07:19,960 --> 00:07:20,660 à la confiance. 155 00:07:20,660 --> 00:07:21,160 Droit? 156 00:07:21,160 --> 00:07:24,300 Nous avons tous des iPhones ou androïdes ou quelque chose dans nos poches plus probable 157 00:07:24,300 --> 00:07:26,500 ces jours-ci, ou des ordinateurs portables sur les tours qui sont 158 00:07:26,500 --> 00:07:28,510 logiciel fonctionnant fait par Apple et Microsoft 159 00:07:28,510 --> 00:07:30,710 et de grappes d'autres sociétés. 160 00:07:30,710 --> 00:07:34,240 Mais comment savons-nous que ce que ces produits logiciels font 161 00:07:34,240 --> 00:07:37,680 est en fait ce que ceux-ci entreprises disent qu'ils font? 162 00:07:37,680 --> 00:07:39,610 >> Par exemple, qui est à dire que chaque fois que vous 163 00:07:39,610 --> 00:07:42,200 faire un appel téléphonique sur votre iPhone ou téléphone Android ou analogue, 164 00:07:42,200 --> 00:07:45,650 que le numéro de téléphone qui est également non étant téléchargé vers le serveur un peu de compagnie 165 00:07:45,650 --> 00:07:48,399 à cause de quelque programme que vous avez écrit, que ce soit l'exploitation 166 00:07:48,399 --> 00:07:51,070 système lui-même comme iOS ou Android, ou parce que vous avez téléchargé 167 00:07:51,070 --> 00:07:53,880 certains app tiers qui en quelque sorte est à l'écoute 168 00:07:53,880 --> 00:07:57,120 à tout ce que vous tapez ou tout ce que vous êtes en train de dire. 169 00:07:57,120 --> 00:07:59,500 Comment savez-vous que, lorsque vous les gars exécutent Clang 170 00:07:59,500 --> 00:08:02,590 Ou Faire de compiler votre propre logiciel dans CS50, comment 171 00:08:02,590 --> 00:08:06,080 vous ne possédez que le personnel du CS50, par l'intermédiaire de la bibliothèque CS50, 172 00:08:06,080 --> 00:08:08,690 n'a pas été connectant tous les chaîne que vous avez jamais obtenu 173 00:08:08,690 --> 00:08:10,276 ou chaque pouce que vous avez jamais eu? 174 00:08:10,276 --> 00:08:12,900 Eh bien, vous pourriez certainement chercher au code source pour quelque chose 175 00:08:12,900 --> 00:08:15,233 comme la bibliothèque CS50, vous pourrait regarder le code source 176 00:08:15,233 --> 00:08:18,170 pour système d'exploitation Linux courir sur CS50 IDE. 177 00:08:18,170 --> 00:08:23,090 Mais une présentation étonnante a été donné en 1984 178 00:08:23,090 --> 00:08:26,730 à la réception du prix Turing par un très célèbre informaticien connu 179 00:08:26,730 --> 00:08:29,750 as-- nommé Ken Thompson, qui a reçu le prix Turing qui 180 00:08:29,750 --> 00:08:33,500 est en quelque sorte de la science informatique de Prix ​​Nobel, si vous voulez, 181 00:08:33,500 --> 00:08:35,309 pour son travail sur une système d'exploitation appelé 182 00:08:35,309 --> 00:08:39,039 Unix, ce qui est très similaire à l'esprit de ce que nous utilisons qui est Linux. 183 00:08:39,039 --> 00:08:41,960 Et la question qu'il a posée dans son discours d'acceptation, essentiellement 184 00:08:41,960 --> 00:08:44,910 fixant le cadre pour la années et des années de discussion 185 00:08:44,910 --> 00:08:46,970 à propos de la confiance et de la sécurité, était présent. 186 00:08:46,970 --> 00:08:50,410 Dans quelle mesure doit-on la confiance d'un déclaration selon laquelle un program-- un morceau 187 00:08:50,410 --> 00:08:53,010 est de software-- libre de chevaux de Troie? 188 00:08:53,010 --> 00:08:56,500 Peut-être qu'il est plus important de faire confiance les gens qui ont écrit le logiciel. 189 00:08:56,500 --> 00:08:58,650 >> Et en fait, nous avons relié à l'entretien qu'il 190 00:08:58,650 --> 00:09:02,400 a donné en acceptant ce prix dans les années 80 sur le site de CS50 191 00:09:02,400 --> 00:09:04,030 en vertu de la page Conférences pour aujourd'hui. 192 00:09:04,030 --> 00:09:06,071 Parce que ce que vous verrez est qu'il donne effectivement 193 00:09:06,071 --> 00:09:09,430 assez simple exemple de la façon même un compilateur comme Clang ou quoi 194 00:09:09,430 --> 00:09:13,950 compilateurs d'autres ont utilisé dans le passé, si intégré dans le compilateur nous 195 00:09:13,950 --> 00:09:18,190 nous utilisent est un peu si condition que dit essentiellement, 196 00:09:18,190 --> 00:09:22,360 si vous remarquez que ce code utilise la fonction de GetString ou getint 197 00:09:22,360 --> 00:09:26,600 fonction, aller de l'avant et insérez une porte arrière ou un cheval de Troie 198 00:09:26,600 --> 00:09:29,340 de telle sorte que ce programme a maintenant quelques zéros 199 00:09:29,340 --> 00:09:30,930 et ceux qui font quelque chose malveillants. 200 00:09:30,930 --> 00:09:33,080 Logging tout votre frappes, le téléchargement de ces données 201 00:09:33,080 --> 00:09:35,100 à un serveur, ou vraiment rien. 202 00:09:35,100 --> 00:09:37,290 >> Et ce que Ken Thompson passe à faire dans son discours 203 00:09:37,290 --> 00:09:40,580 est de démontrer que même si vous avez accès à la source 204 00:09:40,580 --> 00:09:43,794 code d'un compilateur qui malveillance pourrait faire cela, 205 00:09:43,794 --> 00:09:46,210 il n'a pas d'importance parce que il ya cette poule et l'oeuf 206 00:09:46,210 --> 00:09:49,500 la réalité des nombreux passé ans moyennant quoi compilateurs 207 00:09:49,500 --> 00:09:51,960 sont utilisés pour compiler eux-mêmes. 208 00:09:51,960 --> 00:09:55,440 En d'autres termes, le chemin du retour quand quelqu'un avait pour avoir écrit le premier compilateur. 209 00:09:55,440 --> 00:09:59,060 Et par la suite, en tout temps ils ont mis à jour un compilateur en modifiant son code source, 210 00:09:59,060 --> 00:10:02,020 l'ajout de fonctionnalités et recompilée pour des gens comme nous à utiliser, ainsi, 211 00:10:02,020 --> 00:10:04,270 ils utilisent l'ancienne version du compilateur 212 00:10:04,270 --> 00:10:06,370 de compiler la nouvelle version du compilateur. 213 00:10:06,370 --> 00:10:08,370 Et si vous jetez un oeil à la conférence qu'il a donné, 214 00:10:08,370 --> 00:10:10,970 vous verrez que parce que de circularité, 215 00:10:10,970 --> 00:10:14,330 vous pouvez effectivement avoir des bugs ou Les chevaux de Troie intégrés dans les logiciels 216 00:10:14,330 --> 00:10:14,990 nous utilisons. 217 00:10:14,990 --> 00:10:18,010 Et même si vous regardez le code source de ces programmes, 218 00:10:18,010 --> 00:10:21,550 il pourrait même ne pas être évidente parce que la supercherie est en fait 219 00:10:21,550 --> 00:10:24,710 dans une version plus ancienne d'un compilateur qui a depuis été 220 00:10:24,710 --> 00:10:27,340 injecter la menace dans notre logiciel. 221 00:10:27,340 --> 00:10:29,740 >> Qui est seulement de dire, nous vraiment ne peut pas et ne devrait pas 222 00:10:29,740 --> 00:10:32,939 faire confiance aux logiciels fonctionnant sur nos ordinateurs portables ou les téléphones ou tout nombre de places. 223 00:10:32,939 --> 00:10:36,230 Et en fait, plus tard dans ce semestre lorsque nous commençons à parler de la programmation web 224 00:10:36,230 --> 00:10:38,521 et effectivement commencer à construire applications Web nous-mêmes, 225 00:10:38,521 --> 00:10:40,285 nous allons parler de ces menaces et autres. 226 00:10:40,285 --> 00:10:43,410 Maintenant, vous pourriez avoir demandé et a remarqué qu'il y avait un tout petit Darth 227 00:10:43,410 --> 00:10:45,842 Vader dans les clips The Verge il montrait 228 00:10:45,842 --> 00:10:47,550 à propos de Volkswagen. Si vous ne l'avez jamais vu, je 229 00:10:47,550 --> 00:10:49,190 pensé que nous devrions alléger l'humeur, car tout cela est 230 00:10:49,190 --> 00:10:50,780 très déprimant et effrayant. 231 00:10:50,780 --> 00:10:52,910 Je vais regarder en arrière au Super Bowl 2,011 232 00:10:52,910 --> 00:10:55,300 quand un commerce Et ce Volkswagen-- 233 00:10:55,300 --> 00:10:59,620 rend presque les sympathiques again-- diffusé pour la première fois à la télévision. 234 00:10:59,620 --> 00:11:04,039 Il est le deuxième clip 60 que je pense que vous apprécierez. 235 00:11:04,039 --> 00:11:04,705 [LECTURE VIDÉO] 236 00:11:04,705 --> 00:11:08,198 [MUSIQUE - Theme from "STAR WARS"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [Chien aboie] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [Voiture commence] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [FIN LECTURE] 243 00:12:05,955 --> 00:12:06,830 DAVID J. Malan: Ouais. 244 00:12:06,830 --> 00:12:07,663 Je vérifiais juste. 245 00:12:07,663 --> 00:12:11,360 Cette voiture est sur la liste des violations. 246 00:12:11,360 --> 00:12:12,000 Bien. 247 00:12:12,000 --> 00:12:14,040 Donc, nous examinons certains Pseudocode il ya un instant. 248 00:12:14,040 --> 00:12:15,380 Et voici une plus grande extrait de code de pseudo- 249 00:12:15,380 --> 00:12:16,921 que nous avons vu à quelques reprises jusqu'ici. 250 00:12:16,921 --> 00:12:19,970 Et nous allons utiliser ce est une occasion maintenant d'introduire une nouvelle programmation 251 00:12:19,970 --> 00:12:23,776 technique que nous avons fait voir algorithmique 252 00:12:23,776 --> 00:12:25,400 la semaine dernière, lorsque nous avons examiné le tri par fusion. 253 00:12:25,400 --> 00:12:28,270 Mais nous allons formaliser et de voir comment nous pourrions utiliser dans le code actuel, 254 00:12:28,270 --> 00:12:30,350 et ensuite, nous allons utiliser cette technique sur la route plus 255 00:12:30,350 --> 00:12:32,000 susceptibles de résoudre certains autres problèmes. 256 00:12:32,000 --> 00:12:35,790 >> Donc, ce fut l'un des premiers programmes que nous jamais écrit, mais dans le code de pseudo-code. 257 00:12:35,790 --> 00:12:37,790 Et ce que ce programme permis de faire cours 258 00:12:37,790 --> 00:12:41,510 était de trouver Mike Smith dans un livre de téléphone. 259 00:12:41,510 --> 00:12:46,216 Et remarquez en particulier les huit lignes et 11 qui avait cette déclaration Atteindre. 260 00:12:46,216 --> 00:12:48,090 Et en fait, certains langues, C parmi eux, 261 00:12:48,090 --> 00:12:50,006 faire réellement avoir un déclaration qui est littéralement 262 00:12:50,006 --> 00:12:52,710 aller à qui vous permet de sauter à une ligne spécifique. 263 00:12:52,710 --> 00:12:55,470 Il est généralement mal vu parce il peut être très facilement abusé 264 00:12:55,470 --> 00:12:58,490 et vous pouvez commencer à sauter votre programme partout par opposition 265 00:12:58,490 --> 00:13:00,690 à l'aide du genre de logique et le flux de contrôle 266 00:13:00,690 --> 00:13:04,000 que nous avons utilisé jusqu'à présent avec juste boucles et conditions et analogues. 267 00:13:04,000 --> 00:13:08,660 >> Mais nous pouvons simplifier cet algorithme dans le code de pseudo comme suit. 268 00:13:08,660 --> 00:13:11,250 Au lieu de cela itératif ou l'approche en boucle 269 00:13:11,250 --> 00:13:14,160 où nous continuons à revenir en arrière et en arrière et retour à la ligne de trois, 270 00:13:14,160 --> 00:13:18,300 pourquoi ne pas juste genre de Pount et plus disent globalement en ligne sept et 10, 271 00:13:18,300 --> 00:13:20,570 il suffit de remplacer ces deux avec des paires de lignes, 272 00:13:20,570 --> 00:13:22,810 d'autre si Smith est antérieure dans le livre nous allons 273 00:13:22,810 --> 00:13:25,110 rechercher Mike dans le la moitié gauche de l'ouvrage. 274 00:13:25,110 --> 00:13:28,560 Sinon, si Smith est plus tard dans la livre, chercher Mike dans la bonne 275 00:13:28,560 --> 00:13:29,540 la moitié du livre. 276 00:13:29,540 --> 00:13:31,180 Et remarquez déjà la circularité. 277 00:13:31,180 --> 00:13:31,680 Droit? 278 00:13:31,680 --> 00:13:34,250 Je cherche à Mike le livre de téléphone, puis 279 00:13:34,250 --> 00:13:37,090 Je finalement atteint peut-être la ligne de sept ou peut-être la ligne 10 280 00:13:37,090 --> 00:13:41,089 et mon instruction pour moi est la recherche pour Mike dans la moitié de l'annuaire téléphonique. 281 00:13:41,089 --> 00:13:42,380 Eh bien, comment puis-je rechercher pour Mike? 282 00:13:42,380 --> 00:13:44,213 Je suis dans le milieu de chercher Mike, pourquoi 283 00:13:44,213 --> 00:13:45,860 vous me sorte de l'envoi d'un cercle? 284 00:13:45,860 --> 00:13:49,590 Mais cela est OK parce que ce qui est en passant à la taille du problème, 285 00:13:49,590 --> 00:13:52,630 comme écrit dans la ligne 7 et 10? 286 00:13:52,630 --> 00:13:54,989 Nous ne sommes pas simplement en disant recherche pour Mike, recherche pour Mike. 287 00:13:54,989 --> 00:13:56,280 Nous spécifiquement dire quoi? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Rechercher pour lui dans la moitié gauche de la moitié droite qui est effectivement 290 00:14:01,610 --> 00:14:03,440 moitié de la taille du problème. 291 00:14:03,440 --> 00:14:07,170 Donc, il est OK que nous sommes en quelque sorte engager dans cette circularité, 292 00:14:07,170 --> 00:14:09,180 cet argument circulaire, car au moins nous sommes 293 00:14:09,180 --> 00:14:11,090 qui rend le problème plus en plus petits. 294 00:14:11,090 --> 00:14:14,220 Et finalement, nous allons atteindre que l'affaire dite de base où 295 00:14:14,220 --> 00:14:16,780 nous avons juste une page gauche- que notre volontaire de la semaine dernière 296 00:14:16,780 --> 00:14:18,684 did-- nous avions une page à gauche et puis nous ne faisons pas 297 00:14:18,684 --> 00:14:21,600 continuer à chercher pour Mike Smith parce qu'il est soit sur cette page 298 00:14:21,600 --> 00:14:23,080 ou il est pas. 299 00:14:23,080 --> 00:14:27,480 >> Alors, comment pouvons-nous mettre en œuvre cette idée, cette sorte de circularité dans le code réel? 300 00:14:27,480 --> 00:14:31,030 Eh bien, nous pouvons tirer parti d'une technique qui est généralement connu comme la récursivité. 301 00:14:31,030 --> 00:14:33,960 Et nous avons vu cela dans le pseudo pour le tri par fusion de la semaine dernière. 302 00:14:33,960 --> 00:14:37,190 Rappelons que ce fut le pseudo pour le tri par fusion. 303 00:14:37,190 --> 00:14:40,560 Il est sans doute encore plus simple que bulle de sélection, ou le tri par insertion 304 00:14:40,560 --> 00:14:43,310 seulement en termes de la simplicité avec lequel vous pouvez exprimer. 305 00:14:43,310 --> 00:14:46,750 >> Mais cela est parce que nous sommes en quelque sorte de révolution 306 00:14:46,750 --> 00:14:51,350 disant, chercher quelque chose par la recherche de nouveau. 307 00:14:51,350 --> 00:14:53,960 Mais nous sommes à la recherche, soit sur la moitié gauche ou la partie droite 308 00:14:53,960 --> 00:14:56,070 et puis finalement nous sommes la fusion dans ce cas. 309 00:14:56,070 --> 00:14:58,520 Mais ici aussi, avec ces deux lignes de tri, 310 00:14:58,520 --> 00:15:01,320 avons-nous eu à nouveau cette idée de la récursivité. 311 00:15:01,320 --> 00:15:05,350 Et concrètement ce que cela signifie, dans le contexte d'un algorithme, 312 00:15:05,350 --> 00:15:10,880 qui est un algorithme récursif est si elle utilise ou appelle lui-même. 313 00:15:10,880 --> 00:15:14,330 >> Ou en termes de C, une fonction est recursive-- une fonction appelée 314 00:15:14,330 --> 00:15:18,510 foo est récursive si foo, quelque part dans son code source, 315 00:15:18,510 --> 00:15:21,250 appelle la fonction foo lui-même. 316 00:15:21,250 --> 00:15:25,790 Et cela est mauvais si tout foo ne fait jamais est lui-même appeler encore et encore. 317 00:15:25,790 --> 00:15:30,600 Il est OK si foo cesse finalement, comme le fait tri par fusion, en disant, attendez une minute, 318 00:15:30,600 --> 00:15:32,980 si ce problème est super faible, par exemple, 319 00:15:32,980 --> 00:15:35,840 ou je l'ai trouvé que je suis cherchez, il suffit de retourner. 320 00:15:35,840 --> 00:15:41,000 Ne pas récursive, ne pas cycliquement appeler moi-même à nouveau. 321 00:15:41,000 --> 00:15:44,200 >> Et nous allons donc jeter un oeil à comment cela pourrait effectivement travailler. 322 00:15:44,200 --> 00:15:48,430 Donc, je vais aller de l'avant et ouvert jusqu'à deux exemples de code source ici. 323 00:15:48,430 --> 00:15:50,321 Dont l'un est appelé sigma 0. 324 00:15:50,321 --> 00:15:52,320 Et ce ne sont pas du tout récursif, mais prenons 325 00:15:52,320 --> 00:15:53,694 un oeil à ce que ce programme fait. 326 00:15:53,694 --> 00:15:55,737 Je l'ai dépouillé toutes commentaires, mais tout 327 00:15:55,737 --> 00:15:58,070 du code source sur CS50 de site des commentaires si vous 328 00:15:58,070 --> 00:15:59,570 envie de lire à travers elle à nouveau plus tard. 329 00:15:59,570 --> 00:16:02,010 Et nous allons faire un couple de la santé mentale vérifie ici. 330 00:16:02,010 --> 00:16:06,640 >> Alors au sommet de ce code, nous avons inclure CS50.h. 331 00:16:06,640 --> 00:16:07,650 Qu'est-ce que cela fait? 332 00:16:07,650 --> 00:16:08,990 Pourquoi est-il ici? 333 00:16:08,990 --> 00:16:11,740 En termes simples raisonnable. 334 00:16:11,740 --> 00:16:12,424 Qu'est ce que ça fait? 335 00:16:12,424 --> 00:16:12,858 Ouais. 336 00:16:12,858 --> 00:16:14,160 >> Auditoire: Alors que la fonction getint fonctionne. 337 00:16:14,160 --> 00:16:16,243 >> DAVID J. Malan: Alors que la fonction getint fonctionne. 338 00:16:16,243 --> 00:16:18,115 En raison de cet intérieur fichier, CS50.h, qui 339 00:16:18,115 --> 00:16:20,950 nous verrons avant longtemps dans termes de son code source, 340 00:16:20,950 --> 00:16:23,270 a un tas de fonctions declared-- getint, GetString, 341 00:16:23,270 --> 00:16:26,950 et un tas de others-- et sauf nous avons en fait que Inclure ligne, 342 00:16:26,950 --> 00:16:29,320 le compilateur Clang est pas va savoir qu'il existe. 343 00:16:29,320 --> 00:16:32,400 Et va de même pour la ligne où deux int est définie 344 00:16:32,400 --> 00:16:35,101 printf, qui est une fonction nous gardons à l'aide un peu. 345 00:16:35,101 --> 00:16:37,850 Maintenant, la quatrième ligne semble un peu excentrique parce qu'elle est juste une seule ligne. 346 00:16:37,850 --> 00:16:41,570 Il a un point-virgule, pas bouclés accolades, pas de code à l'intérieur de celui-ci. 347 00:16:41,570 --> 00:16:44,640 Mais qu'est-ce que nous appelons cette chose dans les dernières semaines? 348 00:16:44,640 --> 00:16:45,140 Ouais. 349 00:16:45,140 --> 00:16:46,060 Ainsi, un prototype. 350 00:16:46,060 --> 00:16:48,390 Et pourquoi avons-nous un prototype qui semble 351 00:16:48,390 --> 00:16:51,050 être un peu redondant généralement parce que nous avons l'habitude 352 00:16:51,050 --> 00:16:53,474 voir la fonction nouveau plus tard dans le fichier, à droite? 353 00:16:53,474 --> 00:16:56,390 Alors pourquoi ne vous êtes juste have-- gratter la tête, mais je vais le prendre. 354 00:16:56,390 --> 00:16:57,302 Ouais. 355 00:16:57,302 --> 00:17:00,000 >> AUDIENCE: [inaudible] fonction après la principale. 356 00:17:00,000 --> 00:17:01,000 DAVID J. Malan: Exactement. 357 00:17:01,000 --> 00:17:04,089 Alors que le compilateur vous connaît définir à terme ou mettre en œuvre 358 00:17:04,089 --> 00:17:06,579 après que la fonction principale, sans doute. 359 00:17:06,579 --> 00:17:08,462 Ainsi, et plus Clang compilateurs sont un peu idiot 360 00:17:08,462 --> 00:17:10,510 et ils ne sauront ce que vous leur dites. 361 00:17:10,510 --> 00:17:12,569 Et si vous souhaitez utiliser une fonction appelée sigma, 362 00:17:12,569 --> 00:17:15,710 mieux vous enseignez le compilateur qu'elle existe à l'avance. 363 00:17:15,710 --> 00:17:17,970 >> Maintenant, elle-même principale, même mais il ya un tas de lignes, 364 00:17:17,970 --> 00:17:19,839 est assez familier espérons maintenant. 365 00:17:19,839 --> 00:17:21,942 Il a une boucle Do While dont le but dans la vie 366 00:17:21,942 --> 00:17:24,400 ici est apparemment d'obtenir un nombre entier positif de l'utilisateur. 367 00:17:24,400 --> 00:17:27,349 Et juste garder le harceler ou elle jusqu'à ce qu'ils coopèrent. 368 00:17:27,349 --> 00:17:30,670 Puis, en ligne 16, je dois un appel intéressant. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Qui, sur la main gauche côté me donne un Int 371 00:17:33,710 --> 00:17:36,650 qui peut store-- appelé réponse-- qui va stocker, apparemment, 372 00:17:36,650 --> 00:17:39,090 la valeur de retour de sigma. 373 00:17:39,090 --> 00:17:41,840 Donc sigma est juste une nom arbitraire mais significative 374 00:17:41,840 --> 00:17:44,500 que je vous ai donné à une fonction dont le but dans la vie 375 00:17:44,500 --> 00:17:47,680 est de prendre un argument-- nous l'appellerons N dans ce case-- 376 00:17:47,680 --> 00:17:52,280 et juste de prendre la somme de ce nombre En outre, chaque nombre positif qui est 377 00:17:52,280 --> 00:17:53,200 plus petit que lui. 378 00:17:53,200 --> 00:17:58,140 >> Donc, si je passe dans le numéro 2 de sigma, je tiens à ajouter 2 plus 1 379 00:17:58,140 --> 00:18:00,240 ainsi 0-- pas 0-- sorte que me donne 3. 380 00:18:00,240 --> 00:18:05,320 Si je passe à 3 sigma, je veux avoir 3 + 2 + 1, ce qui me donne 6. 381 00:18:05,320 --> 00:18:05,900 Et ainsi de suite. 382 00:18:05,900 --> 00:18:09,750 Donc, il ajoute juste tout le nombres inférieurs ou égaux à elle. 383 00:18:09,750 --> 00:18:12,040 >> Maintenant, ici-bas, je vais juste d'imprimer la réponse. 384 00:18:12,040 --> 00:18:17,330 Donc, comme un test de cohérence rapide, nous allons faire sigma 0-- dot slash sigma 0-- 385 00:18:17,330 --> 00:18:18,690 et laissez-moi tape 2. 386 00:18:18,690 --> 00:18:19,960 Et je reçois en effet 3. 387 00:18:19,960 --> 00:18:21,240 Permettez-moi de tape 3. 388 00:18:21,240 --> 00:18:22,860 Je reçois en effet 6. 389 00:18:22,860 --> 00:18:27,636 Et si quelqu'un peut faire le calcul rapidement, si je fais 50 que vais-je obtenir? 390 00:18:27,636 --> 00:18:29,839 >> AUDIENCE: [inaudible]. 391 00:18:29,839 --> 00:18:30,880 DAVID J. Malan: Eh bien, non. 392 00:18:30,880 --> 00:18:33,340 Mais 1275 qui est assez proche. 393 00:18:33,340 --> 00:18:38,850 Donc, cela est le résultat de faire 50 plus de 49 plus 48 plus 47, plus 46 394 00:18:38,850 --> 00:18:40,349 tout le chemin vers le bas à 1. 395 00:18:40,349 --> 00:18:41,390 Donc, voilà tout sigma fait. 396 00:18:41,390 --> 00:18:43,350 Mais nous allons voir comment nous avons mis en œuvre maintenant. 397 00:18:43,350 --> 00:18:45,790 Donc ici est la fonction elle-même. 398 00:18:45,790 --> 00:18:49,000 Et cela ne semble pas avoir rien à voir avec la récursivité encore. 399 00:18:49,000 --> 00:18:51,070 En fait, nous utilisons un vieille technique de l'école. 400 00:18:51,070 --> 00:18:56,680 Je l'initialisation d'une somme variable appelée à zéro, alors je dois un foreloop ici, 401 00:18:56,680 --> 00:19:00,790 et je déclarer un Int appelé I, qui définit elle égale à 1-- 402 00:19:00,790 --> 00:19:04,080 si je pouvais le mettre égal à zéro, mais depuis que je fais plus, 403 00:19:04,080 --> 00:19:05,340 qui se soucie si elle est zéro ou un. 404 00:19:05,340 --> 00:19:06,660 Il va avoir aucun effet. 405 00:19:06,660 --> 00:19:10,110 >> Donc, je suis itération tant que I est inférieur ou égal à m, ce qui 406 00:19:10,110 --> 00:19:11,671 est l'argument qui a été adoptée en. 407 00:19:11,671 --> 00:19:13,670 Et puis je continue incrémentation I. Et aperçu 408 00:19:13,670 --> 00:19:20,010 de la boucle tout ce que je fais est de faire la somme en plus égaux I. Et voilà délibérée. 409 00:19:20,010 --> 00:19:22,326 Je ne veux pas faire, dans ce cas, comme somme plus plus. 410 00:19:22,326 --> 00:19:24,790 Je veux effectivement ajouter la valeur de courant de I 411 00:19:24,790 --> 00:19:28,190 qui maintient grossit et plus grand pour le décompte en cours d'exécution. 412 00:19:28,190 --> 00:19:30,210 >> Et puis je reviens somme. 413 00:19:30,210 --> 00:19:33,850 Et si la réponse obtient la somme de la valeur. 414 00:19:33,850 --> 00:19:35,282 Et puis je l'imprimer. 415 00:19:35,282 --> 00:19:37,740 Donc, il ya une opportunité ici, cependant, de sorte de simplifier 416 00:19:37,740 --> 00:19:41,260 ce code conceptuellement et le genre de coup-ci est 417 00:19:41,260 --> 00:19:43,250 l'esprit en termes de simplicité, même si elle 418 00:19:43,250 --> 00:19:45,700 prend un certain temps pour trier de comprendre pourquoi cette 419 00:19:45,700 --> 00:19:47,330 est puissant dans ces petits exemples. 420 00:19:47,330 --> 00:19:50,380 Voici donc le sigma One-- deuxième version de ce code. 421 00:19:50,380 --> 00:19:55,290 Tout là-haut est identique si que même histoire applique comme avant. 422 00:19:55,290 --> 00:19:59,220 Mais maintenant, regardons à la mise en oeuvre de sigma qui 423 00:19:59,220 --> 00:20:05,040 Je l'ai réduit à juste ces lines-- quatre lignes de code, vraiment, 424 00:20:05,040 --> 00:20:06,980 plus quelques accolades et espace blanc. 425 00:20:06,980 --> 00:20:07,930 >> Mais qu'est-ce que je fais? 426 00:20:07,930 --> 00:20:11,050 Si m est inférieur ou égal à zéro, je dois sorte de gérer 427 00:20:11,050 --> 00:20:12,490 ce cas super simple. 428 00:20:12,490 --> 00:20:15,450 Et si vous me remettez zéro ou rien négatif qui est juste bizarre, 429 00:20:15,450 --> 00:20:17,909 Je vais juste arbitrairement mais toujours revenir à zéro. 430 00:20:17,909 --> 00:20:20,200 Je ne veux pas que cette chose entrer dans certains infinie bizarre 431 00:20:20,200 --> 00:20:21,810 boucle en raison d'une valeur négative. 432 00:20:21,810 --> 00:20:25,070 Donc, je dis juste que si vous me donnez zéro ou moins, je suis de retour à zéro. 433 00:20:25,070 --> 00:20:28,220 >> Mais ce qui est bon parce que ce cette page unique de l'annuaire téléphonique 434 00:20:28,220 --> 00:20:28,790 ce qui reste. 435 00:20:28,790 --> 00:20:32,660 Je mordre un problème très spécifique et de ne pas appeler quelque chose de manière récursive. 436 00:20:32,660 --> 00:20:36,580 Mais dans la ligne 31, ce qui Je ne semblent faire? 437 00:20:36,580 --> 00:20:39,780 Les parenthèses sont juste garder les choses, je l'espère, un peu plus clair. 438 00:20:39,780 --> 00:20:42,110 Mais tout ce que je fais est que je suis M-- retour quel que soit 439 00:20:42,110 --> 00:20:45,790 vous remettez moi-- plus le valeur de M-- désolé, 440 00:20:45,790 --> 00:20:49,052 plus la valeur de sigma de M moins 1. 441 00:20:49,052 --> 00:20:50,010 Qu'est-ce que cela signifie? 442 00:20:50,010 --> 00:20:53,965 Si vous me donnez le numéro 3 comme entrée, la réponse que je veux obtenir en fin de compte 443 00:20:53,965 --> 00:20:57,307 est 6 parce 3 + 2 + 1 me donne 6. 444 00:20:57,307 --> 00:20:59,390 Mais comment puis-je pense comment ce code est exécuté? 445 00:20:59,390 --> 00:21:03,070 La première fois que je l'appelle sigma et je passe à la valeur 3, 446 00:21:03,070 --> 00:21:07,960 Cela revient à dire sur un morceau de papier, voici la valeur 3 447 00:21:07,960 --> 00:21:09,920 et je l'ai été adoptée ce que sigma. 448 00:21:09,920 --> 00:21:13,090 3 est évidemment pas moins de 0 pour SI la condition ne concerne pas. 449 00:21:13,090 --> 00:21:14,020 L'autre ne le fait. 450 00:21:14,020 --> 00:21:14,990 Alors, que dois-je faire? 451 00:21:14,990 --> 00:21:19,902 Je veux retourner m, qui est 3, plus sigma de M moins 1. 452 00:21:19,902 --> 00:21:21,110 Alors permettez-moi de garder trace de cela. 453 00:21:21,110 --> 00:21:22,710 Je vais mettre ce morceau de papier vers le bas. 454 00:21:22,710 --> 00:21:24,668 Et quelle valeur, pour être clair, vais-je passer 455 00:21:24,668 --> 00:21:26,540 en sigma à ce point dans l'histoire? 456 00:21:26,540 --> 00:21:28,080 Quel numéro? 457 00:21:28,080 --> 00:21:28,610 2, non? 458 00:21:28,610 --> 00:21:29,670 3 moins 1 est 2. 459 00:21:29,670 --> 00:21:32,000 Je viens donc besoin d'un peu bout de papier ici. 460 00:21:32,000 --> 00:21:33,931 Alors maintenant, est de se sigma de nouveau appelé. 461 00:21:33,931 --> 00:21:35,930 Et je l'ai délibérément mis cette baisse parce qu'il est 462 00:21:35,930 --> 00:21:38,070 un peu comme une pause cette version de l'histoire 463 00:21:38,070 --> 00:21:40,720 parce que maintenant je suis concentré sur le signal de M moins 1. 464 00:21:40,720 --> 00:21:42,660 Alors m était de 3, m moins 1 est 2. 465 00:21:42,660 --> 00:21:45,110 Voici donc 2 que je l'ai été adoptée. 466 00:21:45,110 --> 00:21:48,510 La figure 2 est évidemment égale ou supérieure à 0 pour ce cas ne se applique pas. 467 00:21:48,510 --> 00:21:53,445 Sinon je reviens m, ce qui est chose, plus sigma de quelle valeur? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Donc, si sigma de 1-- parce m est en ce moment 2 SO 2 moins 1 est 1. 470 00:21:59,650 --> 00:22:01,950 Alors maintenant, je viens de la valeur 1. 471 00:22:01,950 --> 00:22:04,810 Je passe tout simplement le nombre Une fonction de la sigma-- 472 00:22:04,810 --> 00:22:09,120 ou moi-même afin ici-- 1 est évidemment pas inférieur à zéro, ne se applique toujours pas. 473 00:22:09,120 --> 00:22:12,970 >> Sinon retourner 1 plus sigma de quoi? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Alors permettez-moi de me souviens que. 476 00:22:14,678 --> 00:22:15,920 Je vais revenir plus tard. 477 00:22:15,920 --> 00:22:18,060 Maintenant, je vais aller de l'avant et jot le numéro 0 parce que ce 478 00:22:18,060 --> 00:22:19,470 mon argument ou paramètre. 479 00:22:19,470 --> 00:22:22,400 Je passai le nombre 0 et enfin ce processus 480 00:22:22,400 --> 00:22:25,760 de simplement me répéter ad nauseam ne cesse parce que ce 481 00:22:25,760 --> 00:22:28,820 Je ne fais immédiatement une fois que je vois cela 0? 482 00:22:28,820 --> 00:22:29,790 Je reviens à zéro. 483 00:22:29,790 --> 00:22:31,790 Alors maintenant, vous avez pour rembobiner l'histoire. 484 00:22:31,790 --> 00:22:34,430 >> Si je vais maintenant en arrière dans le temps, ce qui était la chose la plus récente 485 00:22:34,430 --> 00:22:36,670 Je l'ai fait si vous étiez littéralement rembobiner une vidéo? 486 00:22:36,670 --> 00:22:41,630 Je vais prendre le plus récent 1 et qui me donne plus de 1 0 est 1. 487 00:22:41,630 --> 00:22:44,100 Si je continue à le rembobinage de la histoire, cela va me donner 488 00:22:44,100 --> 00:22:46,880 2 plus cette valeur en cours d'exécution, ce qui est 1. 489 00:22:46,880 --> 00:22:47,789 Voilà donc 3. 490 00:22:47,789 --> 00:22:49,330 Et puis je vais continuer à le rembobinage. 491 00:22:49,330 --> 00:22:54,220 Quand je mets le numéro 3-- donc 3 + 3 me donne 6. 492 00:22:54,220 --> 00:22:57,272 >> Et maintenant, si vous avez rembobiné la vidéo jusqu'à ce point, 493 00:22:57,272 --> 00:22:58,980 ce fut le très la première question que je posais. 494 00:22:58,980 --> 00:23:01,450 Lorsqu'il est passé de 3, ce qui est de 3 sigma? 495 00:23:01,450 --> 00:23:04,204 Il est en effet 6, la somme de tous ces morceaux de papier. 496 00:23:04,204 --> 00:23:07,120 Donc, si cela prend un peu de temps pour envelopper votre esprit autour, ça va. 497 00:23:07,120 --> 00:23:10,700 Mais considérez qu'il était un little-- il était très délibérée que je empilés 498 00:23:10,700 --> 00:23:12,990 ces nombres les uns sur les autres. 499 00:23:12,990 --> 00:23:17,440 Il est un peu comme avoir un memory-- un record dans le temps, 500 00:23:17,440 --> 00:23:19,940 comme un laveur dans une vidéo, que je peux bien rembobiner. 501 00:23:19,940 --> 00:23:24,350 Et nous allons revenir à cette métaphore dans un tout petit peu. 502 00:23:24,350 --> 00:23:28,240 >> Mais d'abord, il se trouve qu'il ya beaucoup des geeks et des drôles de gens, 503 00:23:28,240 --> 00:23:29,614 Je suppose que, chez Google. 504 00:23:29,614 --> 00:23:31,530 Serait quelqu'un qui est très bon à l'esprit googler 505 00:23:31,530 --> 00:23:34,270 à venir pour un instant et aidez-moi à chercher quelque chose? 506 00:23:34,270 --> 00:23:35,650 Très très discret,. 507 00:23:35,650 --> 00:23:37,870 Quelqu'un qui n'a jamais venir avant, peut-être. 508 00:23:37,870 --> 00:23:38,370 D'ACCORD. 509 00:23:38,370 --> 00:23:39,030 Ouais? 510 00:23:39,030 --> 00:23:39,530 Allons. 511 00:23:39,530 --> 00:23:41,410 Venez faire un tour. 512 00:23:41,410 --> 00:23:42,183 Comment t'appelles tu? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Sam. 514 00:23:42,870 --> 00:23:44,290 >> DAVID J. Malan: Sam, allez vers le bas. 515 00:23:44,290 --> 00:23:45,320 Ceci est la même. 516 00:23:45,320 --> 00:23:46,280 Enchanté de faire votre connaissance. 517 00:23:46,280 --> 00:23:46,780 Hey. 518 00:23:46,780 --> 00:23:47,580 Venez ici. 519 00:23:47,580 --> 00:23:51,290 Donc, tout ce que je veux que vous fassiez, si vous pourriez, Sam, voici Google. 520 00:23:51,290 --> 00:23:53,240 Pouvez-vous chercher pour la récursivité terme? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Ne gâchez pas. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> Et let's-- maintenant oui. 525 00:24:00,970 --> 00:24:03,380 OK Cliquez sur ce. 526 00:24:03,380 --> 00:24:04,315 Mieux cliquez sur cela. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ahh, l'obtenir. 529 00:24:08,020 --> 00:24:08,520 Non? 530 00:24:08,520 --> 00:24:09,050 D'ACCORD. 531 00:24:09,050 --> 00:24:10,430 Donc, nous allons faire une ou deux autres. 532 00:24:10,430 --> 00:24:12,830 Pas tellement connexes académiquement ici, mais avez-vous 533 00:24:12,830 --> 00:24:14,520 déjà cherché Google pour anagramme? 534 00:24:14,520 --> 00:24:15,280 >> SAM: Non 535 00:24:15,280 --> 00:24:15,520 >> DAVID J. Malan: OK. 536 00:24:15,520 --> 00:24:17,186 Rechercher anagramme la place de la récursion. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Que diriez-vous de travers. 539 00:24:23,790 --> 00:24:25,515 Vous avez déjà effectué une recherche pour guingois? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Maintenant, celui-ci est un peu difficile à voir, mais je l'espère everything's-- OK. 542 00:24:32,692 --> 00:24:34,150 Il est juste vous et moi profiter de cette. 543 00:24:34,150 --> 00:24:34,690 D'ACCORD. 544 00:24:34,690 --> 00:24:38,950 >> Donc finalement, ce one's-- il est un peu de travers. 545 00:24:38,950 --> 00:24:40,810 Maintenant, faire un tonneau. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Formidable. 548 00:24:45,310 --> 00:24:45,910 Bien. 549 00:24:45,910 --> 00:24:47,110 Grand merci à Sam. 550 00:24:47,110 --> 00:24:49,416 Et voilà. 551 00:24:49,416 --> 00:24:50,400 Merci. 552 00:24:50,400 --> 00:24:52,807 >> Alors qu'est-ce qui se passe dans tous les de ces exemples stupides? 553 00:24:52,807 --> 00:24:55,640 Alors, vraiment, sous le capot de Les millions de Google de lignes de code 554 00:24:55,640 --> 00:24:58,860 est apparemment un peu idiot SI des conditions qui sont essentiellement 555 00:24:58,860 --> 00:25:01,160 vérifier si l'utilisateur a tapé dans cette phrase, 556 00:25:01,160 --> 00:25:03,760 faire quelque chose qui a probablement pris une quantité non négligeable de temps 557 00:25:03,760 --> 00:25:06,080 à mettre en oeuvre simplement être amusant de cette façon. 558 00:25:06,080 --> 00:25:08,430 Mais tout cela est qu'il revient jusqu'à sous le capot. 559 00:25:08,430 --> 00:25:11,570 Mais, bien sûr, la récursivité est plus du geekier 560 00:25:11,570 --> 00:25:13,880 exemple parmi ces trucs spéciaux. 561 00:25:13,880 --> 00:25:16,880 Et il ya sûrement d'autres là-bas ainsi que nous avons peut-être même pas 562 00:25:16,880 --> 00:25:18,230 juste encore découvert. 563 00:25:18,230 --> 00:25:22,830 >> Alors jetez un oeil, ou envisager maintenant le programme suivant, 564 00:25:22,830 --> 00:25:24,830 et certainement saisir toute de ces derniers sur votre chemin. 565 00:25:24,830 --> 00:25:28,820 Je vais aller de l'avant et ouvrir un programme qui est 566 00:25:28,820 --> 00:25:30,920 va essayer de permuter deux valeurs. 567 00:25:30,920 --> 00:25:33,210 Mais avant que nous y allons, nous allons le faire. 568 00:25:33,210 --> 00:25:38,500 Pourrions-nous en obtenir un plus bénévole, je pense? 569 00:25:38,500 --> 00:25:40,480 Aimeriez-vous faire du bénévolat? 570 00:25:40,480 --> 00:25:40,980 Non? 571 00:25:40,980 --> 00:25:41,890 Allez vers le haut. 572 00:25:41,890 --> 00:25:42,390 Allez vers le haut. 573 00:25:42,390 --> 00:25:42,890 Bien. 574 00:25:42,890 --> 00:25:44,136 Donc, votre nom est quoi? 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 Allez jusqu'à, Lauren. 578 00:25:46,890 --> 00:25:50,140 Alors Lauren est en cours contesté ici comme suit. 579 00:25:50,140 --> 00:25:52,310 Enchanté de faire votre connaissance. 580 00:25:52,310 --> 00:25:55,730 Donc, Lauren a ici devant de ses deux tasses vides. 581 00:25:55,730 --> 00:25:57,570 Et nous avons un peu d'orange jus de fruits et du lait 582 00:25:57,570 --> 00:26:00,301 et nous allons aller de l'avant et faire ce qui suit. 583 00:26:00,301 --> 00:26:01,550 Nous allons juste pour remplir cette. 584 00:26:01,550 --> 00:26:07,840 A quelques onces de lait ici et nous allons remplir un peu de jus d'orange ici. 585 00:26:07,840 --> 00:26:11,475 >> Et en face de tous ces membres de l'auditoire, 586 00:26:11,475 --> 00:26:13,550 permuter les deux valeurs de ces tasses. 587 00:26:13,550 --> 00:26:16,970 Mettez le jus d'orange dans la tasse de lait et du lait dans la tasse de jus d'orange. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Comment feriez-vous si vous étiez à la maison et a eu accès à d'autres fournitures? 590 00:26:26,150 --> 00:26:27,400 LAUREN: mettre dans une autre tasse. 591 00:26:27,400 --> 00:26:28,191 DAVID J. Malan: OK. 592 00:26:28,191 --> 00:26:31,940 Donc, nous allons jeter un temporaire variables, si l'on veut. 593 00:26:31,940 --> 00:26:35,871 Et aller de l'avant maintenant et mettre en œuvre cette même procédure de permutation. 594 00:26:35,871 --> 00:26:36,370 Si bon. 595 00:26:36,370 --> 00:26:41,490 Nous avons mis dans le JO temporaire variable lait dans la variable JO, 596 00:26:41,490 --> 00:26:44,481 et maintenant la variable temporaire dans la variable de lait. 597 00:26:44,481 --> 00:26:44,980 D'ACCORD. 598 00:26:44,980 --> 00:26:48,740 Donc, très bien fait jusqu'ici. 599 00:26:48,740 --> 00:26:50,990 Ainsi, il se maintenir que out-- pensé pour un instant. 600 00:26:50,990 --> 00:26:54,479 Ici, juste connaisseur jusqu'à un peu, ce serait le code C correspondant 601 00:26:54,479 --> 00:26:55,520 que nous venons de mise en œuvre. 602 00:26:55,520 --> 00:26:58,650 Nous avions deux entrées, a et b, deux que nous dirons juste pour la simplicité sont 603 00:26:58,650 --> 00:26:59,260 INT. 604 00:26:59,260 --> 00:27:02,780 Et remarquez ici, si je veux échanger les valeurs de deux variables a et b, 605 00:27:02,780 --> 00:27:06,890 nous avons en effet besoin d'un intermédiaire, un variable temporaire, une tasse temporaire, 606 00:27:06,890 --> 00:27:10,830 dans lequel l'écoulement l'une des valeurs de sorte que nous avons un espace réservé pour elle. 607 00:27:10,830 --> 00:27:13,480 Mais alors le code est exactement comme Lauren ici mis en œuvre. 608 00:27:13,480 --> 00:27:15,500 >> Maintenant, juste pour obtenir un peu fou, se révèle 609 00:27:15,500 --> 00:27:20,930 que vous pouvez le faire sans une variable temporaire. 610 00:27:20,930 --> 00:27:24,870 Pour ce faire correctement, cependant, nous allons d'avoir à tricher avec une certaine chimie. 611 00:27:24,870 --> 00:27:26,380 Nous avons des tasses supplémentaires ici. 612 00:27:26,380 --> 00:27:29,600 Donc, la chose la plus proche qui ressemble comme le lait et l'eau perhaps-- 613 00:27:29,600 --> 00:27:34,090 ou de lait et OJ-- est que nous avons une certaine l'eau, donc nous allons remplir celui-ci jusqu'à 614 00:27:34,090 --> 00:27:36,486 avec quelques onces d'eau claire. 615 00:27:36,486 --> 00:27:38,332 Voilà sans doute trop. 616 00:27:38,332 --> 00:27:38,832 Ouais. 617 00:27:38,832 --> 00:27:39,934 Voilà certainement trop. 618 00:27:39,934 --> 00:27:40,600 Attendez une seconde. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> Et maintenant, nous avons du pétrole, qui, si je me souviens à partir du milieu classe de chimie de l'école, 621 00:27:48,420 --> 00:27:49,990 il faut espérer qu'il ne se mélange pas à l'eau. 622 00:27:49,990 --> 00:27:53,650 Mais ce genre de genre de ressemble à du lait et JO. 623 00:27:53,650 --> 00:27:55,760 Alors maintenant, sans utiliser une variable temporaire, 624 00:27:55,760 --> 00:27:59,260 vous pouvez échanger ces deux valeurs? 625 00:27:59,260 --> 00:28:03,884 Donc, les huiles qui se passe dans la tasse d'eau, l'eau passe dans la tasse d'huile. 626 00:28:03,884 --> 00:28:04,800 LAUREN: Pas d'autres tasses? 627 00:28:04,800 --> 00:28:05,940 DAVID J. Malan: Pas d'autres tasses. 628 00:28:05,940 --> 00:28:07,860 Et je ne l'ai pas fait testé ce avant cette année 629 00:28:07,860 --> 00:28:10,110 donc je ne sais pas si cela va effectivement travailler chimiquement. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 Cela n'a pas été censé se produire. 632 00:28:18,650 --> 00:28:19,761 Est-ce que ça marche? 633 00:28:19,761 --> 00:28:20,260 Bien. 634 00:28:20,260 --> 00:28:20,990 Donc, la séparation? 635 00:28:20,990 --> 00:28:21,490 Bien. 636 00:28:21,490 --> 00:28:24,714 Maintenant, nous sommes arrivés à obtenir le l'eau dans l'autre tasse. 637 00:28:24,714 --> 00:28:27,630 Smarter concentrateurs de chimie pourrait probablement le faire mieux que moi. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: L'eau est sur le fond. 639 00:28:28,510 --> 00:28:31,910 >> J. DAVID MALAN: Le water-- qui était ce qui est la clé de la dernière fois que nous avons fait cela. 640 00:28:31,910 --> 00:28:33,950 Vous devez le faire dans le bon ordre. 641 00:28:33,950 --> 00:28:34,450 Ouais. 642 00:28:34,450 --> 00:28:35,270 C'est bon. 643 00:28:35,270 --> 00:28:37,290 Alors maintenant, nous avons deux tasses d'huile. 644 00:28:37,290 --> 00:28:37,790 D'ACCORD. 645 00:28:37,790 --> 00:28:38,510 C'est bon. 646 00:28:38,510 --> 00:28:40,110 Mais si cela a fonctionné chimiquement que I-- 647 00:28:40,110 --> 00:28:41,200 >> LAUREN: Ceci est l'eau. 648 00:28:41,200 --> 00:28:41,930 >> DAVID J. Malan: Voilà surtout de l'eau. 649 00:28:41,930 --> 00:28:42,430 Bien. 650 00:28:42,430 --> 00:28:44,210 Mais cela reste la même tasse comme avant. 651 00:28:44,210 --> 00:28:47,570 Alors versez it-- l'essayer là-bas. 652 00:28:47,570 --> 00:28:49,300 D'ACCORD. 653 00:28:49,300 --> 00:28:51,010 Ceci est une bonne utilisation du temps de classe aujourd'hui. 654 00:28:51,010 --> 00:28:51,510 D'ACCORD. 655 00:28:51,510 --> 00:28:53,890 Donc maintenant nous-- agréable. 656 00:28:53,890 --> 00:28:55,460 Sorte de. 657 00:28:55,460 --> 00:28:55,960 Bien. 658 00:28:55,960 --> 00:28:56,690 Donc très bon. 659 00:28:56,690 --> 00:29:00,006 Merci à Lauren. 660 00:29:00,006 --> 00:29:01,950 Très bien fait. 661 00:29:01,950 --> 00:29:04,570 >> Il suffit donc de faire sauter votre esprit, et cela est peut-être quelque chose 662 00:29:04,570 --> 00:29:08,660 de jouer avec si vous le souhaitez dans CS50 ID, vous pouvez, en fait, permuter deux variables 663 00:29:08,660 --> 00:29:11,470 sans l'aide d'un nombre entier temporaire. 664 00:29:11,470 --> 00:29:13,060 Et cela est le code C correspondant. 665 00:29:13,060 --> 00:29:16,110 Et si vous vous souvenez de la dernière Mercredi, nous avons introduit, bien que brièvement, 666 00:29:16,110 --> 00:29:19,720 certains nouveaux opérateurs en C et ne quiconque rappeler ce que le petit peu de carotte 667 00:29:19,720 --> 00:29:23,660 symbole est, ce petit triangulaire le symbole de flèche représente? 668 00:29:23,660 --> 00:29:26,003 Qu'est-ce que l'opérateur bit à bit? 669 00:29:26,003 --> 00:29:26,770 >> AUDIENCE: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> DAVID J. Malan: EXOR. 671 00:29:27,645 --> 00:29:28,560 Ou exclusif. 672 00:29:28,560 --> 00:29:32,920 Donc, si vous voulez, juste pour le plaisir au la maison, pour donner a et b deux arbitraire 673 00:29:32,920 --> 00:29:36,072 des valeurs comme tout eight-- et je choisiraient une valeur de huit bits. 674 00:29:36,072 --> 00:29:38,530 Si vous faites cela avec 32 bits, vous aurez très rapidement vous ennuyer. 675 00:29:38,530 --> 00:29:42,150 Mais juste donner un huit bits valeur qui est quelconque, un ou deux, 676 00:29:42,150 --> 00:29:43,790 et de donner b une valeur similaire. 677 00:29:43,790 --> 00:29:46,810 Ensuite, en utilisant la définition du XOR de mercredi dernier, 678 00:29:46,810 --> 00:29:52,560 appliquer ce bit par bit, chacun des ces huit bits dans chacun de a et b, 679 00:29:52,560 --> 00:29:54,980 et ensuite faire exactement par ce code. 680 00:29:54,980 --> 00:29:58,170 Et il est pas faux ce que vous voyez ici à l'écran. 681 00:29:58,170 --> 00:30:02,100 Il revient en effet vers le bas à trois opérations XOR 682 00:30:02,100 --> 00:30:05,910 et comme par magie, et un b échangeront positions 683 00:30:05,910 --> 00:30:08,010 sans perte d'information. 684 00:30:08,010 --> 00:30:11,580 >> Donc, l'huile et de l'eau est l'affaire plus proche incarnation réelle du monde 685 00:30:11,580 --> 00:30:12,980 Je pouvais penser à imiter cela. 686 00:30:12,980 --> 00:30:15,950 Mais il est certainement plus facile de utiliser une variable temporaire, 687 00:30:15,950 --> 00:30:16,920 comme dans ce cas ici. 688 00:30:16,920 --> 00:30:21,190 Et cela aussi est une opportunité dire, aussi, ce genre de micro optimisation, 689 00:30:21,190 --> 00:30:23,590 comme un chercheur en informatique dirait, tout genre de plaisir 690 00:30:23,590 --> 00:30:27,060 pour se vanter de la façon dont vous l'avez fait sans comme par exemple changer avec une variable supplémentaire, 691 00:30:27,060 --> 00:30:28,640 il est pas tout à fait convaincante. 692 00:30:28,640 --> 00:30:31,619 Parce que pour sauver 32 bits, que dans le cas d'un int réelle, 693 00:30:31,619 --> 00:30:33,410 est pas tout à fait convaincante sur un système dans lequel 694 00:30:33,410 --> 00:30:36,722 vous utilisez peut-être des dizaines de mégaoctets ou encore plus cette mémoire ces jours. 695 00:30:36,722 --> 00:30:38,680 Et en fait, quand nous obtenons à un ensemble de problèmes plus tard 696 00:30:38,680 --> 00:30:41,010 et vous implémentez sort checker et vous 697 00:30:41,010 --> 00:30:43,550 être mis au défi de le faire avec ce que peu de RAM et aussi peu 698 00:30:43,550 --> 00:30:46,820 temps que possible sur la vous computer-- encore 699 00:30:46,820 --> 00:30:50,160 avoir une semaine pour mettre en œuvre it-- vous have-- vous serez 700 00:30:50,160 --> 00:30:51,799 contesté pour minimiser ces ressources. 701 00:30:51,799 --> 00:30:53,840 Et cela est vraiment la seule occasionner ce semestre 702 00:30:53,840 --> 00:30:57,940 où vous serez encouragé à se raser éteint même le meilleur rendement 703 00:30:57,940 --> 00:30:59,340 coûte autrement. 704 00:30:59,340 --> 00:31:02,200 >> Alors comment pouvons-nous what-- Voyons cela en code réel? 705 00:31:02,200 --> 00:31:04,530 Permettez-moi maintenant aller de l'avant et d'ouvrir un exemple 706 00:31:04,530 --> 00:31:07,700 que l'on appelle délibérément Pas de Swap, car il ne le fait pas 707 00:31:07,700 --> 00:31:10,670 en fait permuter les variables que vous pourriez réellement attendre. 708 00:31:10,670 --> 00:31:12,260 Donc, nous allons jeter un coup d'oeil. 709 00:31:12,260 --> 00:31:17,050 Voici un programme qui n'a pas de CS50 bibliothèque en cours, I / O juste standard. 710 00:31:17,050 --> 00:31:19,560 Maintenant, nous avons un prototype pour le swap en haut sommet qui vient 711 00:31:19,560 --> 00:31:21,540 signifie qu'il est arrivé à définir ultérieurement. 712 00:31:21,540 --> 00:31:22,550 Et voici principale. 713 00:31:22,550 --> 00:31:26,000 >> Je affecté arbitrairement x et y, respectivement, l'une et deux valeurs 714 00:31:26,000 --> 00:31:28,590 simplement parce qu'ils sont petits et facile à penser. 715 00:31:28,590 --> 00:31:32,280 Et puis je dois juste un tas de printfs où je dois un chèque de santé mentale. x est égal à 1 716 00:31:32,280 --> 00:31:35,110 et y est égal à 2 est probablement ce que ces printfs diront. 717 00:31:35,110 --> 00:31:36,530 Donc, pas de magie à ce jour. 718 00:31:36,530 --> 00:31:40,100 >> Ensuite, je vais prétendre à imprimer def, échangeant Dot Dot Dot. 719 00:31:40,100 --> 00:31:43,730 Je vais appeler le swap fonction, en passant en x et y. 720 00:31:43,730 --> 00:31:47,350 Et supposons pour l'instant que swap est mis en œuvre exactement 721 00:31:47,350 --> 00:31:49,930 comme il ya un moment avec une variable temporaire. 722 00:31:49,930 --> 00:31:52,670 Et donc je prétends hardiment, échangé. 723 00:31:52,670 --> 00:31:55,429 x est maintenant présent et y est maintenant. 724 00:31:55,429 --> 00:31:57,220 Mais le dossier, bien sûr, est appelé Non Swap. 725 00:31:57,220 --> 00:31:58,678 Donc, nous allons réellement voir ce qui se passe. 726 00:31:58,678 --> 00:32:04,450 Si je compile pas de swap puis faire ./noswap, x vaut 1, y vaut 2. 727 00:32:04,450 --> 00:32:05,770 Échangeant échangé. 728 00:32:05,770 --> 00:32:07,200 x vaut 1, y vaut 2. 729 00:32:07,200 --> 00:32:11,980 Donc, il semble effectivement être viciée même si swap-- nous allons défiler maintenant-- 730 00:32:11,980 --> 00:32:16,542 est mis en œuvre par l'exactement Je Code proposé il ya un moment. 731 00:32:16,542 --> 00:32:19,000 Donc, on ne va pas à obtenir la fantaisie avec les trucs de XOR pour le moment. 732 00:32:19,000 --> 00:32:21,890 Cela, aussi, devrait fonctionner comme avec le lait et JO, 733 00:32:21,890 --> 00:32:25,820 mais il ne semble pas fonctionner. 734 00:32:25,820 --> 00:32:27,180 >> Donc, nous allons le faire à nouveau. 735 00:32:27,180 --> 00:32:29,310 Peut-être que je viens de ne fonctionnait pas comme il faut. 736 00:32:29,310 --> 00:32:32,010 Donc, nous allons courir à nouveau pas de swap. 737 00:32:32,010 --> 00:32:32,900 Peut-être I-- pas. 738 00:32:32,900 --> 00:32:34,400 Donc, il est tout simplement pas de travail. 739 00:32:34,400 --> 00:32:36,060 Alors, faisons un petit test de cohérence. 740 00:32:36,060 --> 00:32:39,690 Permettez-moi aller de l'avant ici au Swap et il suffit d'ajouter, attendez une minute, 741 00:32:39,690 --> 00:32:43,856 un est% i / n et nous allons plug-in de la valeur de a. 742 00:32:43,856 --> 00:32:45,730 Parce que je veux vraiment pour voir ce qui se passe. 743 00:32:45,730 --> 00:32:47,570 Et en effet, cela est une technique de débogage 744 00:32:47,570 --> 00:32:50,028 que vous utilisez peut-être en les heures de bureau ou à la maison, déjà 745 00:32:50,028 --> 00:32:53,560 semblable à la première moitié de Dan La vidéo de Armendariz dans PSET3 746 00:32:53,560 --> 00:32:56,870 dans laquelle nous avons introduit l'impression que def une technique recommandée, au moins 747 00:32:56,870 --> 00:32:58,080 pour les cas simples. 748 00:32:58,080 --> 00:33:01,720 Laissez-moi aller de l'avant et lance make pas de swap nouveau, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Intéressant. 751 00:33:05,840 --> 00:33:11,670 Donc remarquer ce qui semble être vrai. X est 1, y est égal à 2, mais a vaut 2 lorsque b est égal à 1. 752 00:33:11,670 --> 00:33:16,790 Donc, ces deux parvint à se échangé mais x et y ne se font pas échangés. 753 00:33:16,790 --> 00:33:21,090 Donc, pour être clair, ce qui se passe est, ici je dois x et y 754 00:33:21,090 --> 00:33:25,380 et ceux qui sont des variables locales dans le portée du principal, je suis de passage en x et y 755 00:33:25,380 --> 00:33:26,170 échanger. 756 00:33:26,170 --> 00:33:29,080 Maintenant, swap, comme une fonction distincte, est libre d'appeler ses arguments 757 00:33:29,080 --> 00:33:30,590 ou ses paramètres tout ce qu'il veut. 758 00:33:30,590 --> 00:33:33,280 Foo ou bar ou X ou Y ou a ou b. 759 00:33:33,280 --> 00:33:36,870 Juste pour faire comprendre qu'ils sont pas identique à x et y en soi, 760 00:33:36,870 --> 00:33:38,020 Je l'ai dit a et b. 761 00:33:38,020 --> 00:33:40,040 Mais nous pourrions les appeler comme on veut. 762 00:33:40,040 --> 00:33:43,960 >> Et il ressemble swap est passé 763 00:33:43,960 --> 00:33:48,980 x-- Alias ​​a-- et il est étant passé y-- Alias ​​b. 764 00:33:48,980 --> 00:33:51,900 D'une certaine manière ces trois lignes sont échangeant ces valeurs exactement 765 00:33:51,900 --> 00:33:53,510 comme Lauren a fait avec le lait et JO. 766 00:33:53,510 --> 00:33:56,010 Mais quand nous imprimons sur les valeurs, a et b 767 00:33:56,010 --> 00:34:01,340 sont en effet échanger mais x et y avoir aucun changement pour eux. 768 00:34:01,340 --> 00:34:03,150 Rappelons que x et y sont ici. 769 00:34:03,150 --> 00:34:05,320 >> Donc, nous pouvons voir ce via une autre technique ainsi. 770 00:34:05,320 --> 00:34:08,110 Et cela aussi est une technique intégré dans le problème ensemble de trois. 771 00:34:08,110 --> 00:34:10,780 Allons de l'avant et de le faire dans CS50 ID si vous avez pas déjà. 772 00:34:10,780 --> 00:34:13,730 Sur le nous de droite avoir cette onglet débogueur. 773 00:34:13,730 --> 00:34:16,159 Et si vous ouvrez cette place, il ya quelques informations arcanes 774 00:34:16,159 --> 00:34:17,530 qui est jeté à vous d'abord. 775 00:34:17,530 --> 00:34:19,310 Mais nous allons taquiner cette part très vite. 776 00:34:19,310 --> 00:34:21,620 >> Donc un, vous voyez les variables locales. 777 00:34:21,620 --> 00:34:26,230 Avère que construire en CS50 IDE, et beaucoup d'environnements de programmation plus 778 00:34:26,230 --> 00:34:28,060 généralement, est un débogueur. 779 00:34:28,060 --> 00:34:31,340 Un outil qui vous permet de voir visuellement ce qui se passe à l'intérieur de votre programme 780 00:34:31,340 --> 00:34:34,380 sans avoir à recourir à l'ajout printfs et compilation et l'exécution 781 00:34:34,380 --> 00:34:37,588 et en ajoutant de printf et la compilation et la course, qui a déjà, dans les heures de bureau 782 00:34:37,588 --> 00:34:40,070 ou à la maison, est probablement obtenir assez fastidieux. 783 00:34:40,070 --> 00:34:43,090 >> Donc, ici, dans un instant, nous sommes va voir en temps réel 784 00:34:43,090 --> 00:34:44,760 les valeurs de nos variables locales. 785 00:34:44,760 --> 00:34:47,880 Nous allons aussi être en mesure de mettre en ce qu'on appelle des points d'arrêt qui 786 00:34:47,880 --> 00:34:52,570 existe des possibilités dans mon programme pour mettre en pause exécution à une ligne de code spécifique 787 00:34:52,570 --> 00:34:53,710 que je suis curieux de savoir. 788 00:34:53,710 --> 00:34:54,210 Droit? 789 00:34:54,210 --> 00:34:55,969 Ces programmes sont exécutés en une fraction de seconde. 790 00:34:55,969 --> 00:35:00,450 Il est plutôt agréable pour nous les humains plus lents pour être en mesure de faire une pause, prendre un moment, voir 791 00:35:00,450 --> 00:35:02,380 ce qui se passe autour de une certaine ligne de code 792 00:35:02,380 --> 00:35:05,050 sans labour du programme à travers elle et de finition entièrement. 793 00:35:05,050 --> 00:35:08,510 Ainsi, un des points d'arrêt va nous permettre de casser et arrêter à un certain point. 794 00:35:08,510 --> 00:35:12,990 >> Pile d'appel est une façon élégante de disent quelles sont les fonctions actuellement 795 00:35:12,990 --> 00:35:14,140 être appelé pour le moment. 796 00:35:14,140 --> 00:35:15,370 Principal est toujours appelé en premier. 797 00:35:15,370 --> 00:35:17,230 Mais si principal appelle un fonction appelée Swap, 798 00:35:17,230 --> 00:35:20,470 nous allons en fait de voir ce tour de fonctions qui ont été 799 00:35:20,470 --> 00:35:22,400 appelé dans l'ordre chronologique inverse. 800 00:35:22,400 --> 00:35:23,310 Voyons cela. 801 00:35:23,310 --> 00:35:24,327 >> Je vais effectuer un zoom arrière. 802 00:35:24,327 --> 00:35:25,660 Je vais revenir à mon code. 803 00:35:25,660 --> 00:35:27,540 Et juste parce que je veux à être pédant ici, 804 00:35:27,540 --> 00:35:31,100 Je vais aller de l'avant et cliquez sur juste à gauche de la ligne de cinq. 805 00:35:31,100 --> 00:35:32,830 Et cela crée un point rouge. 806 00:35:32,830 --> 00:35:36,200 Et remarquez sur le côté droit que le débogueur sait, hey, 807 00:35:36,200 --> 00:35:41,020 Je viens de dire à un point d'arrêt noswap.c ligne de cinq, spécifiquement 808 00:35:41,020 --> 00:35:42,480 à cette ligne de code. 809 00:35:42,480 --> 00:35:45,090 Ainsi, le débogueur sait que je ont demandé que la prochaine fois 810 00:35:45,090 --> 00:35:48,530 Je lance mon programme, il pause il exécution plutôt que de simplement 811 00:35:48,530 --> 00:35:50,390 courir le tout super rapide. 812 00:35:50,390 --> 00:35:53,889 >> Alors maintenant, je vais cliquez sur le débogage bouton en haut de l'IDE 813 00:35:53,889 --> 00:35:55,430 et que va faire ce qui suit. 814 00:35:55,430 --> 00:36:00,680 Il va d'abord ouvrir un peu second terminal regardant effrayant window-- 815 00:36:00,680 --> 00:36:02,679 débogage à distance à partir de accueillir tel ou such-- 816 00:36:02,679 --> 00:36:04,970 et nous allons revenir à ce que tout ce qui signifie avant longtemps. 817 00:36:04,970 --> 00:36:09,020 Mais ce qui est important pour l'instant est que ce point rouge a été frappé, 818 00:36:09,020 --> 00:36:11,735 le débogueur a délibérément pause execution-- 819 00:36:11,735 --> 00:36:15,560 pas sur cette ligne en soi, mais sur la première ligne de code réelle dans cette fonction. 820 00:36:15,560 --> 00:36:18,040 Et voilà pourquoi la ligne est de sept maintenant surlignés en jaune. 821 00:36:18,040 --> 00:36:20,550 >> Et maintenant, nous allons jeter un coup d'oeil du côté de la main droite. 822 00:36:20,550 --> 00:36:27,300 Il ressemble, par défaut, bien assez, x a quelle valeur? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 Et Y a quelle valeur? 825 00:36:29,750 --> 00:36:30,410 Zero. 826 00:36:30,410 --> 00:36:35,540 Et cela est à prévoir dans le sens que x et Y- que line-- jaune a 827 00:36:35,540 --> 00:36:36,770 pas encore exécuté. 828 00:36:36,770 --> 00:36:38,510 Donc x ne devraient pas avoir la valeur 1. 829 00:36:38,510 --> 00:36:41,470 Il pourrait avoir une autre valeur, une valeur dite ordures. 830 00:36:41,470 --> 00:36:44,320 Et nous avons eu de la chance en ce qu'il est zéro à ce stade, essentiellement. 831 00:36:44,320 --> 00:36:46,400 >> Alors maintenant, il n'y a que quelques-uns boutons que nous avons besoin de prendre soin 832 00:36:46,400 --> 00:36:48,100 quand le débogage de cette façon. 833 00:36:48,100 --> 00:36:49,970 Remarquez ici, nous avons un bouton Lecture. 834 00:36:49,970 --> 00:36:51,877 Et si nous jouons ou frapper curriculum vitae, qui est juste 835 00:36:51,877 --> 00:36:53,710 aller à courir à travers le reste du programme 836 00:36:53,710 --> 00:36:55,300 ou jusqu'à ce qu'il frappe un autre point d'arrêt. 837 00:36:55,300 --> 00:36:56,910 Mais je ne l'ai pas mis tout autre les points d'arrêt, il est donc juste 838 00:36:56,910 --> 00:36:58,118 va courir jusqu'à la fin. 839 00:36:58,118 --> 00:37:00,280 Ce genre de défaites les but de fouiner. 840 00:37:00,280 --> 00:37:03,290 >> Ainsi, au lieu, je me soucie ces icônes à droite. 841 00:37:03,290 --> 00:37:05,360 Et si je survole eux, comme vous devriez le faire aussi, 842 00:37:05,360 --> 00:37:07,450 vous verrez petites infobulles tips--. 843 00:37:07,450 --> 00:37:09,020 Celui-ci est enjamber. 844 00:37:09,020 --> 00:37:11,290 Maintenant, cela ne signifie pas sauter la ligne de code suivante. 845 00:37:11,290 --> 00:37:14,840 Cela signifie tout simplement l'exécuter et passer à la suivante, passer à la suivante, 846 00:37:14,840 --> 00:37:15,580 passer à la suivante. 847 00:37:15,580 --> 00:37:17,610 En d'autres termes, par l'intermédiaire ce bouton, puis-je marcher 848 00:37:17,610 --> 00:37:20,390 grâce à mon code d'une étape à la fois. 849 00:37:20,390 --> 00:37:21,914 Ligne par ligne, littéralement. 850 00:37:21,914 --> 00:37:23,830 Or, à la droite de qui, il ya une autre 851 00:37:23,830 --> 00:37:25,163 que nous verrons dans un instant. 852 00:37:25,163 --> 00:37:27,820 Ceci est la soi-disant Step Into icône qui est 853 00:37:27,820 --> 00:37:30,300 va me permettre plongée dans une autre fonction. 854 00:37:30,300 --> 00:37:31,800 Mais voyons cela dans un instant. 855 00:37:31,800 --> 00:37:33,280 Donc, je vais cliquez enjamber. 856 00:37:33,280 --> 00:37:35,820 Et maintenant remarquer, comme je clique ce bouton en haut à droite, 857 00:37:35,820 --> 00:37:41,260 garder vos yeux à peu près sous Local Variables et voir ce qui se passe à x. 858 00:37:41,260 --> 00:37:44,115 x 1 est maintenant parce que le ligne jaune a maintenant exécuté 859 00:37:44,115 --> 00:37:45,840 et nous sommes passés à la ligne 8. 860 00:37:45,840 --> 00:37:49,840 Et dans un moment y devrait, espérons devenir 2. 861 00:37:49,840 --> 00:37:52,330 >> Maintenant, rien de ce qui intéressant qui se passe pour un peu. 862 00:37:52,330 --> 00:37:53,390 Tout cela est est printf. 863 00:37:53,390 --> 00:37:58,010 Et remarquez, dans mon terminal secondaire fenêtre, je vois la sortie de l'impression def. 864 00:37:58,010 --> 00:38:01,080 Et maintenant, je dois faire un décision que le programmeur. 865 00:38:01,080 --> 00:38:04,360 Je peux franchir cette ligne de code, mais pas l'exécuter 866 00:38:04,360 --> 00:38:06,220 obtenir curieux de savoir ce qu'il ya dedans. 867 00:38:06,220 --> 00:38:11,130 Ou je peux réellement entrer dedans et aller à l'intérieur de lui-même Swap. 868 00:38:11,130 --> 00:38:12,340 Alors, faisons ce dernier. 869 00:38:12,340 --> 00:38:15,550 >> Permettez-moi aller de l'avant et cliquez sur Au cours mais pas l'étape Step Into. 870 00:38:15,550 --> 00:38:17,300 Remarquez, tout d'un coup la fenêtre change 871 00:38:17,300 --> 00:38:19,330 pour mettre en évidence le premier ligne de code dans Swap. 872 00:38:19,330 --> 00:38:20,710 Voilà la ligne 21. 873 00:38:20,710 --> 00:38:25,220 Et maintenant, ce qui est une sorte de génial est que, si vous regardez par ici, comme prévu, 874 00:38:25,220 --> 00:38:29,720 une virgule b vaut 1 et 2, respectivement. 875 00:38:29,720 --> 00:38:33,840 Pourquoi est-Temp 32767? 876 00:38:33,840 --> 00:38:36,560 Rappelant que temporaire, tout comme la tasse vide il ya un instant, 877 00:38:36,560 --> 00:38:38,980 est déclarée ici sur la ligne 21. 878 00:38:38,980 --> 00:38:43,390 Pourquoi 32,000- Je veux dire, pourquoi est- juste une valeur bizarre? 879 00:38:43,390 --> 00:38:43,890 Ouais? 880 00:38:43,890 --> 00:38:45,190 >> PUBLIC: Il est pas initialisé. 881 00:38:45,190 --> 00:38:46,940 >> DAVID J. Malan: Il est pas été initialisé. 882 00:38:46,940 --> 00:38:49,370 Donc, notre ordinateur toujours dispose d'une mémoire physique. 883 00:38:49,370 --> 00:38:50,544 Il a toujours RAM physique. 884 00:38:50,544 --> 00:38:52,710 Et il ya toujours de zéro et l'autre est là, non? 885 00:38:52,710 --> 00:38:54,626 Parce que nous sommes en utilisant notre ordinateur toute la journée, 886 00:38:54,626 --> 00:38:57,210 vous utilisez le CS50 IDE ou les serveurs toute la journée. 887 00:38:57,210 --> 00:39:01,159 Alors que la RAM soit a des zéros ou quelqu'un de certains ou de zéros et de uns. 888 00:39:01,159 --> 00:39:02,950 Peu importe si oui ou pas vous les utilisez. 889 00:39:02,950 --> 00:39:05,270 Vous ne pouvez pas tout simplement avoir vierge espaces où vous veulent bits. 890 00:39:05,270 --> 00:39:06,850 Ils sont soit des zéros et des uns. 891 00:39:06,850 --> 00:39:09,610 >> Donc, il se trouve que temporaire, car nous avons pas encore initialisé il, 892 00:39:09,610 --> 00:39:14,580 nous avons ces 32 bits mais ils ont pas initialisée à des valeurs connues. 893 00:39:14,580 --> 00:39:18,110 Donc, ce qu'ils étaient les plus récemment utilisé pour-- ces 32 bits-- 894 00:39:18,110 --> 00:39:23,000 nous sommes juste de voir les artefacts de certains l'utilisation antérieure de ceux notamment 32 895 00:39:23,000 --> 00:39:23,500 morceaux. 896 00:39:23,500 --> 00:39:27,780 Dès que je clique Step Over si, ouf, la température va obtenir la valeur 1. 897 00:39:27,780 --> 00:39:31,600 Et si je le fais encore, un est va être donnée la valeur 2 898 00:39:31,600 --> 00:39:33,830 puis b va être étant donné la valeur 1. 899 00:39:33,830 --> 00:39:36,390 >> Et donc ce qui est agréable maintenant à ce point dans l'histoire 900 00:39:36,390 --> 00:39:39,750 est que le débogueur est me montrant, super lentement 901 00:39:39,750 --> 00:39:42,640 à mon propre rythme, ce qui l'état de Swap est. 902 00:39:42,640 --> 00:39:47,490 Mais notez en haut ici, un avis que la pile d'appel effectivement 903 00:39:47,490 --> 00:39:49,180 comporte deux couches à elle. 904 00:39:49,180 --> 00:39:53,240 Maintenant, celui qui est mis en évidence comme Swap, si je clique sur la place principale, 905 00:39:53,240 --> 00:39:57,100 remarquez comment les variables locales changent parce que le développeur peut juste sauter 906 00:39:57,100 --> 00:39:59,740 autour et aller dans une portée différente. 907 00:39:59,740 --> 00:40:04,070 Ainsi, même si nous faisons tout cela travailler et échanger correctement a et b, 908 00:40:04,070 --> 00:40:09,080 si je reviens et-vient entre Swap où a est 2 et b est 1 et Main, 909 00:40:09,080 --> 00:40:11,851 a été affectée principal du tout? 910 00:40:11,851 --> 00:40:12,350 Non. 911 00:40:12,350 --> 00:40:13,930 Alors, quel est l'emporter ici? 912 00:40:13,930 --> 00:40:18,200 Eh bien, il se trouve que tout moment vous appelez une fonction comme Swap, 913 00:40:18,200 --> 00:40:21,600 et vous le transmettre arguments, ce qui vous êtes de passage à la fonction de swap 914 00:40:21,600 --> 00:40:24,730 dans ce cas est une copie de ces arguments. 915 00:40:24,730 --> 00:40:28,620 Donc, si x et y sont chacun respectivement 32 bits, ce qui est d'obtenir Swap 916 00:40:28,620 --> 00:40:30,760 est deux nouveaux locale variables, ou des arguments, 917 00:40:30,760 --> 00:40:34,380 appelé et b-- mais ceux qui sont arbitraires names-- mais le modèle de zéros 918 00:40:34,380 --> 00:40:39,520 et ceux à l'intérieur de a et b sont la queue pour être identique à X et Y, 919 00:40:39,520 --> 00:40:42,610 mais ils ne sont pas la même chose que x et y. 920 00:40:42,610 --> 00:40:46,880 >> Il est comme si principale a sur son morceau de papier le numéro 1 et 2 pour x et y, 921 00:40:46,880 --> 00:40:49,260 et puis quand il tend que morceau de papier pour swap, 922 00:40:49,260 --> 00:40:51,970 Swap obtient très rapidement sa propre plume, écrit vers le bas 923 00:40:51,970 --> 00:40:56,240 1 et 2 sur sa propre feuille de papier, mains en arrière xy original principal 924 00:40:56,240 --> 00:40:58,790 et fait ensuite son propre chose avec a et b. 925 00:40:58,790 --> 00:41:01,940 Et cela est maintenant super important parce cela a des implications non triviaux 926 00:41:01,940 --> 00:41:06,260 pour réellement écrire du code correcte car il semble que nous ne pouvons pas échanger 927 00:41:06,260 --> 00:41:07,500 deux variables. 928 00:41:07,500 --> 00:41:09,150 >> Je l'ai écrit une fonction de swap correcte. 929 00:41:09,150 --> 00:41:12,770 Nous avons mis en place avec comme Lauren une fonction de permutation correcte dans la réalité, 930 00:41:12,770 --> 00:41:16,700 mais apparemment rien de cela questions si vous ne pouvez pas réellement 931 00:41:16,700 --> 00:41:19,530 échanger de façon permanente deux valeurs. 932 00:41:19,530 --> 00:41:21,970 Donc, nous avons besoin d'une autre manière pour obtenir réellement à ce, 933 00:41:21,970 --> 00:41:24,472 et nous devons être en mesure de effectivement résoudre ce problème. 934 00:41:24,472 --> 00:41:27,180 Et il se out-- et nous viendrons Retour à cette image particulière 935 00:41:27,180 --> 00:41:30,500 avant long-- ce qui est une façon vous pourriez en tirer la mémoire de votre ordinateur. 936 00:41:30,500 --> 00:41:31,460 Il est juste un rectangle. 937 00:41:31,460 --> 00:41:32,960 Vous pouvez dessiner tout certain nombre de façons, mais il est 938 00:41:32,960 --> 00:41:35,740 pratique pour dessiner comme un rectangle pour la raison suivante. 939 00:41:35,740 --> 00:41:40,040 >> Nous allons commencer aujourd'hui et au-delà parler de la pile dite. 940 00:41:40,040 --> 00:41:43,870 Et la pile est juste un morceau de RAM-- un morceau de memory-- 941 00:41:43,870 --> 00:41:47,100 que les fonctions ont accès quand ils sont appelés. 942 00:41:47,100 --> 00:41:49,800 Et il se trouve que à le fond de cette pile 943 00:41:49,800 --> 00:41:53,590 est où toutes les variables locales de principales org et C et V org et tout ça 944 00:41:53,590 --> 00:41:56,950 vont aller par défaut. Et si principal appelle une autre fonction comme Swap, 945 00:41:56,950 --> 00:42:00,330 ainsi, Swap va obtenir un autre couche de mémoire jusqu'à dessus. 946 00:42:00,330 --> 00:42:04,490 >> Et juste pour vous donner un sommaire rapide image de cela, si je dépasse ici-- 947 00:42:04,490 --> 00:42:09,450 et permettez-moi de miroir Cette sur le frais généraux comme well-- ce que je dois vraiment, 948 00:42:09,450 --> 00:42:12,100 si nous nous soucions seulement de la bas de cette image pour le moment, 949 00:42:12,100 --> 00:42:15,070 est que quand je lance un programme et Main est appelée, 950 00:42:15,070 --> 00:42:18,330 Main est donnée à un morceau de RAM dans mon ordinateur qui est 951 00:42:18,330 --> 00:42:20,060 au bas de cette soi-disant pile. 952 00:42:20,060 --> 00:42:22,143 Et je vais dessiner délibérément comme un carré. 953 00:42:22,143 --> 00:42:24,540 Donc, il est comme 32 bits ou quatre octets. 954 00:42:24,540 --> 00:42:28,790 Et si cette fonction principale a une variable appelée x avec une valeur de 1 955 00:42:28,790 --> 00:42:32,626 et il a une variable appelée y à la valeur de 2, qui est 956 00:42:32,626 --> 00:42:35,750 comme la prise de ce ruban de mémoire Main a été donnée par l'exploitation 957 00:42:35,750 --> 00:42:38,850 système et en le divisant de façon à ce que la première variable locale va ici, 958 00:42:38,850 --> 00:42:40,930 le second va ici, et voilà. 959 00:42:40,930 --> 00:42:45,590 >> Lorsque principal appelle, permutez obtient sa propre tranche de mémoire 960 00:42:45,590 --> 00:42:48,280 que nous allons dessiner comme ça du système d'exploitation, 961 00:42:48,280 --> 00:42:50,820 et il va avoir son variables locales propres en fonction 962 00:42:50,820 --> 00:42:53,825 sur notre mise en œuvre plus tôt avec des variables locales d'un 963 00:42:53,825 --> 00:42:58,010 et b qu'initialement obtenir les valeurs 1 et 2. 964 00:42:58,010 --> 00:43:00,450 Mais alors, dès que le code de swap exécute, 965 00:43:00,450 --> 00:43:03,760 et Lauren swaps en fait le JO et le lait, ce qui se passe? 966 00:43:03,760 --> 00:43:09,030 Eh bien, ce 2 devient un 1, ce 1 devient un 2, et, en passant, 967 00:43:09,030 --> 00:43:13,360 il est une variable temporaire qui est en cours utilisé tout ce temps que finalement 968 00:43:13,360 --> 00:43:14,470 s'en va. 969 00:43:14,470 --> 00:43:16,720 Mais il n'a pas d'importance combien de travail que vous faites 970 00:43:16,720 --> 00:43:22,160 dans cette ligne de-- dans cet espace mémoire, x et y sont complètement intacte. 971 00:43:22,160 --> 00:43:26,320 >> Donc, nous avons besoin d'une certaine façon de donner Swap et fonctionne comme il 972 00:43:26,320 --> 00:43:32,640 accès secrète, si vous voulez, à like-- fonctions à la mémoire comme x et y. 973 00:43:32,640 --> 00:43:35,110 Donc, nous allons jeter un oeil à un exemple qui permet 974 00:43:35,110 --> 00:43:38,220 nous voyons exactement ce qui a été passe tout ce temps. 975 00:43:38,220 --> 00:43:40,284 Je vais aller de l'avant et d'ouvrir Comparer Zero. 976 00:43:40,284 --> 00:43:42,200 Et je vais fermer notre débogueur, je vais 977 00:43:42,200 --> 00:43:44,360 de fermer ce message effrayant à la recherche juste dit, attendez une minute, 978 00:43:44,360 --> 00:43:45,800 vous êtes dans le milieu de débogage. 979 00:43:45,800 --> 00:43:48,383 Je vais cacher cet onglet ici juste pour revenir à la simplicité. 980 00:43:48,383 --> 00:43:50,160 Donc, ne vous inquiétez pas si GDB est tué. 981 00:43:50,160 --> 00:43:53,910 Cela signifie simplement que le programme a été cesser de fumer, délibérément, dans ce cas, 982 00:43:53,910 --> 00:43:54,820 par moi. 983 00:43:54,820 --> 00:43:57,700 >> Et maintenant Comparer Zéro fait cela. 984 00:43:57,700 --> 00:44:00,110 Je suis en utilisant le CS50 bibliothèque E / S standard. 985 00:44:00,110 --> 00:44:04,319 Je dois une fonction principale de cette première dit, dire quelque chose, et obtient une chaîne. 986 00:44:04,319 --> 00:44:06,110 Ensuite, dit encore et obtient une autre chaîne. 987 00:44:06,110 --> 00:44:09,910 Et remarquez que ces deux chaînes sont appelés s et t, respectivement. 988 00:44:09,910 --> 00:44:12,910 Et maintenant ce programme, Comparer Zéro, son but dans la vie, 989 00:44:12,910 --> 00:44:15,470 il est censé me dire, ai-je tape la même chose? 990 00:44:15,470 --> 00:44:16,910 Et donc je vais revenir à la première semaine. 991 00:44:16,910 --> 00:44:19,950 Je suis en utilisant mon opérateur égal égalité qui est l'opérateur de la qualité. 992 00:44:19,950 --> 00:44:22,220 Non l'opérateur d'affectation, l'opérateur d'égalité. 993 00:44:22,220 --> 00:44:23,890 Je suis juste comparant s et t. 994 00:44:23,890 --> 00:44:27,470 >> Donc, nous allons effectivement aller de l'avant et de le faire. 995 00:44:27,470 --> 00:44:32,680 Et je vais aller de l'avant et de faire Comparer Zero. 996 00:44:32,680 --> 00:44:35,110 Je vais faire ./comparezero. 997 00:44:35,110 --> 00:44:37,150 Et je vais aller de l'avant et dire quelque chose 998 00:44:37,150 --> 00:44:43,450 comme, faisons maman en minuscules Et que diriez-maman en majuscules. 999 00:44:43,450 --> 00:44:45,034 Et bien sûr, je tape des choses différentes. 1000 00:44:45,034 --> 00:44:45,533 Bien. 1001 00:44:45,533 --> 00:44:46,570 Cela est à prévoir. 1002 00:44:46,570 --> 00:44:47,640 >> Lançons nouveau. 1003 00:44:47,640 --> 00:44:49,740 Les deux fois, font minuscules, minuscules. 1004 00:44:49,740 --> 00:44:51,490 Cela semble super identique à moi. 1005 00:44:51,490 --> 00:44:52,930 Entrez. 1006 00:44:52,930 --> 00:44:53,430 D'ACCORD. 1007 00:44:53,430 --> 00:44:55,804 Peut-être qu'il est juste bizarre parce que il est ne pas aimer ma grammaire. 1008 00:44:55,804 --> 00:44:59,930 Alors, faisons un MOM de capital, capitale MOM, identiques. 1009 00:44:59,930 --> 00:45:01,490 Choses différentes. 1010 00:45:01,490 --> 00:45:03,907 >> Alors, pourquoi est-ce? 1011 00:45:03,907 --> 00:45:06,240 Eh bien, qu'est-ce qui se passe réellement sur sous le capot ici? 1012 00:45:06,240 --> 00:45:08,180 Donc, nous allons revenir sur ici pour un moment 1013 00:45:08,180 --> 00:45:10,910 et de considérer ce GetString est en train de faire. 1014 00:45:10,910 --> 00:45:13,385 Lorsque vous appelez GetString, qui est une fonction que nous 1015 00:45:13,385 --> 00:45:16,510 nous a écrit et il devient en quelque sorte un séquence de caractères provenant de l'utilisateur. 1016 00:45:16,510 --> 00:45:20,280 Et supposons que le premier fois que je appelle GetString, qui me donne 1017 00:45:20,280 --> 00:45:21,930 un morceau de la mémoire qui ressemble à ceci. 1018 00:45:21,930 --> 00:45:26,990 Et si je tapé en minuscules m-o-M-- et ce qui se passe après? 1019 00:45:26,990 --> 00:45:28,840 Juste un test de cohérence rapide. 1020 00:45:28,840 --> 00:45:29,780 >> Backslash zéro. 1021 00:45:29,780 --> 00:45:30,510 Nous savons que. 1022 00:45:30,510 --> 00:45:32,784 Et rappelons que nous avons joué autour avec le nom de Zamila 1023 00:45:32,784 --> 00:45:34,950 et un tas d'autres noms quand Rob a été ici à la recherche 1024 00:45:34,950 --> 00:45:36,280 ce qui se passe à l'intérieur de la mémoire. 1025 00:45:36,280 --> 00:45:37,780 Donc cette histoire est exactement la même. 1026 00:45:37,780 --> 00:45:40,160 Ceci est ce que GetString est de retour pour moi. 1027 00:45:40,160 --> 00:45:44,780 Maintenant, mon code il ya un instant stockée la valeur de retour de GetString 1028 00:45:44,780 --> 00:45:47,510 dans une variable appelée s. 1029 00:45:47,510 --> 00:45:51,390 Et puis la deuxième fois je l'ai appelé, il stocké dans une variable appelée t. 1030 00:45:51,390 --> 00:45:55,070 >> Donc, si je vais ici, je dois de tirer cette variable-- locale 1031 00:45:55,070 --> 00:45:59,610 et je vais généralement dessiner une chaîne comme just-- nous allons 1032 00:45:59,610 --> 00:46:02,360 appeler s-- comme une petite place ici. 1033 00:46:02,360 --> 00:46:09,760 Et maintenant, comment fonctionne somehow-- maman aller à l'intérieur de cette variable s? 1034 00:46:09,760 --> 00:46:12,010 Eh bien, nous devons revenir aux premiers principes ici. 1035 00:46:12,010 --> 00:46:15,660 Quel est GetString effectivement de retour? 1036 00:46:15,660 --> 00:46:19,030 >> Donc, il se trouve que M-O-M barre oblique inverse zéro, et un certain nombre 1037 00:46:19,030 --> 00:46:22,364 d'autres chaînes dans la mémoire comme Zamila et Rob ou Andy ou d'autres, 1038 00:46:22,364 --> 00:46:24,280 sont bien sûr dans notre la RAM ou mémoire de l'ordinateur. 1039 00:46:24,280 --> 00:46:27,760 Et votre RAM a like-- vous avez un concert de RAM, deux concerts de RAM, 1040 00:46:27,760 --> 00:46:30,860 ou un milliard ou deux milliards d'octets, ou peut-être encore plus ces jours-ci. 1041 00:46:30,860 --> 00:46:34,070 Supposons donc, pour les besoins d'aujourd'hui, qu'il n'a pas d'importance comment on numérote 1042 00:46:34,070 --> 00:46:36,640 eux, mais on peut numéroter chaque de ceux milliards ou deux milliards 1043 00:46:36,640 --> 00:46:37,880 ou quatre milliards d'octets. 1044 00:46:37,880 --> 00:46:42,240 >> Et disons simplement arbitrairement que ceci est la première piqûre, deuxième morsure, 1045 00:46:42,240 --> 00:46:43,380 troisième, quatrième. 1046 00:46:43,380 --> 00:46:46,570 Je délibérément de ne pas égale à zéro aujourd'hui, mais nous allons revenir à cela. 1047 00:46:46,570 --> 00:46:49,570 En d'autres termes, si tel est le première fois que je suis en utilisant le programme, 1048 00:46:49,570 --> 00:46:52,715 Je suis juste avoir de la chance et de la première morsure est à l'emplacement d'un puis deux 1049 00:46:52,715 --> 00:46:53,590 puis trois à quatre. 1050 00:46:53,590 --> 00:46:57,430 Et si je continuais à dessiner, numéro de boîte deux milliards serait en venant ici. 1051 00:46:57,430 --> 00:47:02,200 >> Alors, que pensez-vous, alors, GetString retourne en fait? 1052 00:47:02,200 --> 00:47:06,010 Il ne revient pas M-O-M barre oblique inverse zéro en soi parce que clairement 1053 00:47:06,010 --> 00:47:08,180 ne tient pas dans la boîte que je l'ai dessiné. 1054 00:47:08,180 --> 00:47:11,210 Alors quoi d'autre pourrait effectivement GetString être de retour toutes ces semaines? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 La réponse est sur le conseil ici, quelque part. 1057 00:47:16,820 --> 00:47:20,390 Vous ne pouvez pas ajuster M-O-M barre oblique inverse zéro, donc ce qui pourrait donner un sens à la place? 1058 00:47:20,390 --> 00:47:23,424 Si vous deviez être super intelligent, mettant sur la dite chapeau d'ingénierie, 1059 00:47:23,424 --> 00:47:24,340 que pourriez-vous revenir? 1060 00:47:24,340 --> 00:47:27,340 Quelle est la moins quantité d'informations vous pourriez rendement qui aurait encore 1061 00:47:27,340 --> 00:47:30,610 vous permettent de trouver M-O-M dans la mémoire? 1062 00:47:30,610 --> 00:47:31,270 Ouais? 1063 00:47:31,270 --> 00:47:31,950 >> AUDIENCE: One. 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J. Malan: One. 1065 00:47:32,200 --> 00:47:33,021 Et pourquoi on? 1066 00:47:33,021 --> 00:47:35,520 AUDIENCE: Parce que ce serait dire vous où aller [inaudible]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J. Malan: Exactement. 1069 00:47:39,390 --> 00:47:44,300 Je vais me contenter de renvoyer l'adresse de la chaîne que je l'ai obtenu. 1070 00:47:44,300 --> 00:47:46,570 L'adresse de cette cas est un emplacement. 1071 00:47:46,570 --> 00:47:51,280 Donc ce qui est vraiment est d'être stockées dans s-- et chaque variable de chaîne ainsi far-- 1072 00:47:51,280 --> 00:47:53,430 vient de faire l' Adresse de cette chaîne. 1073 00:47:53,430 --> 00:47:57,840 >> Pendant ce temps, si je l'appelle GetString une deuxième fois et je 1074 00:47:57,840 --> 00:48:03,300 taper littéralement le même chose-- M-O-M avec M lowercase---O-M 1075 00:48:03,300 --> 00:48:06,200 et une autre barre oblique inverse zéro, et maintenant peut-être mon programme de 1076 00:48:06,200 --> 00:48:09,820 en cours depuis un certain temps alors peut-être cette est 10, cela est l'emplacement 11, cela est 12, 1077 00:48:09,820 --> 00:48:10,700 cela est 13. 1078 00:48:10,700 --> 00:48:13,590 Les ordinateurs utilisant un autre mémoire pour une raison quelconque. 1079 00:48:13,590 --> 00:48:18,172 Ce qui se passe maintenant dans ma deuxième variable dans mon programme t? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Exactement. 1082 00:48:20,050 --> 00:48:23,910 >> Et donc quand nous regardons le le code source du programme 1083 00:48:23,910 --> 00:48:26,550 où je vais simplement essayer de comparer les deux valeurs, 1084 00:48:26,550 --> 00:48:32,180 s est égal égal à t, ce qui est la réponse humaine évidente? 1085 00:48:32,180 --> 00:48:34,890 Juste parce que pas une ne correspond pas à 10. 1086 00:48:34,890 --> 00:48:36,861 Et ainsi se trouve ici une occasion pour nous vraiment 1087 00:48:36,861 --> 00:48:39,610 juste revenir, encore une fois, d'abord principes et penser, ainsi, 1088 00:48:39,610 --> 00:48:41,110 ce qui se passe sous le capot? 1089 00:48:41,110 --> 00:48:43,240 Nous avons parlé bits et d'octets et de la mémoire, 1090 00:48:43,240 --> 00:48:46,820 mais il est réellement utile pour comprendre parce que quand vous appelez GetString, 1091 00:48:46,820 --> 00:48:50,280 même si nous pensons qu'il est retour M-O-M ou une chaîne maman 1092 00:48:50,280 --> 00:48:53,120 ou Andy ou Zamila ou etc., techniquement 1093 00:48:53,120 --> 00:48:55,510 il est juste de retourner l'adresse de ce morceau de mémoire. 1094 00:48:55,510 --> 00:48:56,910 >> Mais cela est OK. 1095 00:48:56,910 --> 00:49:00,570 Parce que sais-je où la chaîne se termine? 1096 00:49:00,570 --> 00:49:03,840 Si je suis seulement donné le début? 1097 00:49:03,840 --> 00:49:05,380 Eh bien, la barre oblique inverse de zéro, non? 1098 00:49:05,380 --> 00:49:08,800 Juste à temps linéaire que je peux imprimer avec impression def M-O-M. 1099 00:49:08,800 --> 00:49:11,820 Et dès que je vois barre oblique inverse zéro, je ne me soucie pas où je commencé, 1100 00:49:11,820 --> 00:49:14,950 Je sais déjà implicitement où je dois mettre fin. 1101 00:49:14,950 --> 00:49:18,700 >> Ainsi, aujourd'hui marque le beginning-- et laissez-moi faire ce spectaculaire parce que nous 1102 00:49:18,700 --> 00:49:21,800 a traversé beaucoup de mal à obtenir ces ici formation wheels-- 1103 00:49:21,800 --> 00:49:29,840 Donc, aujourd'hui, les roues de formation commencent à se détacher et nous révéler au moins: 1104 00:49:29,840 --> 00:49:31,373 >> [Applaudissements] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> Cela valait bien le voyage pour cibler ce matin, oui? 1107 00:49:36,160 --> 00:49:39,600 Donc maintenant-- il ya, elle se tourne dehors, rien de tel que chaîne. 1108 00:49:39,600 --> 00:49:41,140 Chaîne ne existe pas. 1109 00:49:41,140 --> 00:49:43,760 Il est synonyme que nous avons eu l'intérieur de la bibliothèque CS50. 1110 00:49:43,760 --> 00:49:48,660 Désormais, nous allons commencer à appeler s et t pas les chaînes, mais étoiles char. 1111 00:49:48,660 --> 00:49:51,180 Et la star char nous allons démêler avant longtemps. 1112 00:49:51,180 --> 00:49:53,510 Mais cela est-à-dire, que, même si nous continuons 1113 00:49:53,510 --> 00:49:56,180 utilisant GetString pour l'instant, techniquement je devrais 1114 00:49:56,180 --> 00:49:59,010 dire étoiles char et l'omble étoiles. 1115 00:49:59,010 --> 00:50:01,720 >> Et il se trouve que cette étoile va désigner quelque chose 1116 00:50:01,720 --> 00:50:04,340 appelé un pointeur ou une adresse. 1117 00:50:04,340 --> 00:50:06,110 Et en fait, un teaser pour ce qui nous attend 1118 00:50:06,110 --> 00:50:09,760 est-ce 20 secondes clip de notre ami Nick Parlante à Stanford 1119 00:50:09,760 --> 00:50:12,927 qui, il ya un certain temps, dépenser un montant ridicule de temps, 1120 00:50:12,927 --> 00:50:15,010 du mieux que je peux dire, dans son cuisine ou son sous-sol, 1121 00:50:15,010 --> 00:50:17,140 faisant claymation introduire dans le monde 1122 00:50:17,140 --> 00:50:20,010 un personnage nommé Binky avec qui nous allons 1123 00:50:20,010 --> 00:50:22,010 introduire la prochaine fois pour les pointeurs. 1124 00:50:22,010 --> 00:50:24,588 Voici donc un aperçu de ce qui est à venir. 1125 00:50:24,588 --> 00:50:26,370 >> [LECTURE VIDÉO] 1126 00:50:26,370 --> 00:50:27,510 >> -Hé, Binky. 1127 00:50:27,510 --> 00:50:28,260 Debout. 1128 00:50:28,260 --> 00:50:30,672 Il est temps pour le plaisir pointeur. 1129 00:50:30,672 --> 00:50:31,616 >> -Qu'est ce que c'est? 1130 00:50:31,616 --> 00:50:33,032 En savoir plus sur les pointeurs? 1131 00:50:33,032 --> 00:50:34,450 Oh, Goody. 1132 00:50:34,450 --> 00:50:35,431 >> [FIN LECTURE] 1133 00:50:35,431 --> 00:50:38,055 DAVID J. Malan: Et sur cette note, nous vous verrons mercredi. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 Bien. 1136 00:50:48,090 --> 00:50:48,740 Qui est la danse? 1137 00:50:48,740 --> 00:50:49,240 Allons. 1138 00:50:49,240 --> 00:50:50,330 Qui est la danse? 1139 00:50:50,330 --> 00:50:51,820 Vous voulez que je le lancer? 1140 00:50:51,820 --> 00:50:53,770 Je vais le faire démarrer. 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: doux fantaisie Moïse.