1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [MUSIQUE LECTURE] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 DAVID J. Malan: Très bien. 5 00:00:12,660 --> 00:00:15,590 C'est CS50, et ce est le début de la deuxième semaine. 6 00:00:15,590 --> 00:00:19,120 Commençons donc aujourd'hui avec un bug. 7 00:00:19,120 --> 00:00:20,974 Un bogue, bien sûr, est un erreur dans un programme, 8 00:00:20,974 --> 00:00:22,890 et vous aurez très familiariser avec ce concept 9 00:00:22,890 --> 00:00:26,050 si vous n'avez jamais programmé avant. pset0 et maintenant pset1. 10 00:00:26,050 --> 00:00:29,280 Mais nous allons examiner quelque chose un peu simple au premier abord. 11 00:00:29,280 --> 00:00:32,189 Ce programme ici que je jeté ensemble à l'avance, 12 00:00:32,189 --> 00:00:37,280 et je prétends que cela devrait imprimer 10 étoiles sur l'écran en utilisant printf, 13 00:00:37,280 --> 00:00:41,020 mais il est apparemment bogué en quelque sorte. 14 00:00:41,020 --> 00:00:45,370 >> Compte tenu de cette description que il doit imprimer 10 étoiles, 15 00:00:45,370 --> 00:00:50,230 mais ce n'est pas apparemment, ce vous demander est le bug? 16 00:00:50,230 --> 00:00:52,004 Ouais? 17 00:00:52,004 --> 00:00:54,420 C'est donc à la sortie d'un erreur, et qu'est-ce que vous entendez par là? 18 00:00:54,420 --> 00:01:00,991 19 00:01:00,991 --> 00:01:01,490 Dáccord. 20 00:01:01,490 --> 00:01:09,820 21 00:01:09,820 --> 00:01:10,410 Excellente. 22 00:01:10,410 --> 00:01:13,930 Donc, nous avons spécifié un valeur de départ de zéro pour i, 23 00:01:13,930 --> 00:01:18,399 et nous avons spécifié une valeur de n de 10, mais nous avons utilisé inférieure ou égale à. 24 00:01:18,399 --> 00:01:21,190 Et la raison pour laquelle ce n'est deux personnages et pas seulement un symbole, 25 00:01:21,190 --> 00:01:22,630 comme dans un livre de mathématiques, c'est que vous n'avez pas 26 00:01:22,630 --> 00:01:24,880 un moyen d'exprimer l' un équivalent de caractères. 27 00:01:24,880 --> 00:01:28,450 >> Cela signifie donc que moins de, mais si vous commencez à compter à zéro, 28 00:01:28,450 --> 00:01:31,690 mais vous comptez tout le chemin à travers et égal à 10, 29 00:01:31,690 --> 00:01:34,170 vous êtes sûr d'aller à compter 11 choses au total. 30 00:01:34,170 --> 00:01:35,900 Et si vous allez imprimer 11 étoiles. 31 00:01:35,900 --> 00:01:37,990 Alors, que peut-être une solution pour cela? 32 00:01:37,990 --> 00:01:39,970 Ouais? 33 00:01:39,970 --> 00:01:43,980 >> Il suffit donc de régler le moins de ou égale à un peu moins que, 34 00:01:43,980 --> 00:01:46,250 et il ya, je prétends, peut-être une autre solution, aussi. 35 00:01:46,250 --> 00:01:47,210 Que pourriez-vous faire d'autre? 36 00:01:47,210 --> 00:01:48,590 Ouais? 37 00:01:48,590 --> 00:01:53,660 >> Donc, commencer à l'égaler à 1, et laisser le moins de ou égale à. 38 00:01:53,660 --> 00:01:56,187 Et franchement, je voudrais demander que, pour un être humain typique, 39 00:01:56,187 --> 00:01:57,770 c'est probablement plus simple. 40 00:01:57,770 --> 00:02:00,280 Commencez à compter à 1 et compter jusqu'à à 10. 41 00:02:00,280 --> 00:02:01,690 Essentiellement faites ce que vous voulez dire. 42 00:02:01,690 --> 00:02:04,010 >> Mais la réalité est en programmation, comme nous l'avons vu, 43 00:02:04,010 --> 00:02:07,598 des informaticiens et des programmeurs n'ont généralement commencer à compter à zéro. 44 00:02:07,598 --> 00:02:09,389 Et c'est très bien une fois vous y habituer. 45 00:02:09,389 --> 00:02:12,640 Votre état de santé général quelque chose comme moins. 46 00:02:12,640 --> 00:02:14,910 Donc, tout simplement une logique erreur que nous pourrions maintenant 47 00:02:14,910 --> 00:02:17,990 fixer et, finalement, recompiler ce et obtenir seulement 10. 48 00:02:17,990 --> 00:02:19,610 >> Eh bien que diriez-vous ce bug ici? 49 00:02:19,610 --> 00:02:24,200 Ici, encore une fois, je prétendre que je n'ai un objectif d'imprimer 10 stars-- 50 00:02:24,200 --> 00:02:28,140 un par ligne cette fois, mais il ne le fait pas. 51 00:02:28,140 --> 00:02:30,940 Avant que nous vous proposons ce le correctif est, qu'est ce que cela 52 00:02:30,940 --> 00:02:34,640 imprimer visuellement si je devais compiler et exécutez ce programme pensez-vous? 53 00:02:34,640 --> 00:02:35,140 Ouais? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Étoiles. 56 00:02:38,860 --> 00:02:41,690 Donc, toutes les étoiles sur le même ligne est ce que j'ai entendu, 57 00:02:41,690 --> 00:02:43,391 puis le caractère de nouvelle ligne. 58 00:02:43,391 --> 00:02:44,140 Essayons donc que. 59 00:02:44,140 --> 00:02:48,710 Donc, assurez-poussette-1, entrer, et je vois la commande clang 60 00:02:48,710 --> 00:02:50,090 dont nous avons parlé la dernière fois. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, et en effet, je vois tous les 10 étoiles sur la même ligne, même si je prétends 62 00:02:55,180 --> 00:02:58,690 dans mon cahier simplement un commentaire au sommet le code que j'ai l'intention de faire un par 63 00:02:58,690 --> 00:02:59,230 ligne. 64 00:02:59,230 --> 00:03:00,580 Mais cela ressemble à droite. 65 00:03:00,580 --> 00:03:04,620 >> Maintenant, ligne 15, il semble que je suis l'impression d'une étoile, puis la ligne 16 66 00:03:04,620 --> 00:03:06,620 on dirait que je suis impression un caractère de nouvelle ligne, 67 00:03:06,620 --> 00:03:09,560 et ils sont tous deux en retrait de sorte Je suis à l'intérieur de la boucle clairement. 68 00:03:09,560 --> 00:03:13,610 Donc, je ne devrais pas être en train de faire étoiles, nouvelle ligne, en étoile, nouvelle ligne, étoile, nouvelle ligne? 69 00:03:13,610 --> 00:03:14,110 Oui? 70 00:03:14,110 --> 00:03:18,430 71 00:03:18,430 --> 00:03:21,240 >> Oui, contrairement à un langage comme Python, si vous êtes familier, 72 00:03:21,240 --> 00:03:23,540 indentation n'est pas d'importance à l'ordinateur. 73 00:03:23,540 --> 00:03:25,280 Il importe seulement de l'humain. 74 00:03:25,280 --> 00:03:29,860 Alors lignes alors qu'ici j'ai inventées 15 et 16-- qui est beau, 75 00:03:29,860 --> 00:03:31,330 mais l'ordinateur ne se soucie pas. 76 00:03:31,330 --> 00:03:34,640 L'ordinateur se soucie ayant fait des accolades 77 00:03:34,640 --> 00:03:36,310 autour de ces lignes de code. 78 00:03:36,310 --> 00:03:39,520 >> Alors que c'est clear-- comme dans Scratch-- que ces deux lignes de code 79 00:03:39,520 --> 00:03:40,450 doit être exécuté. 80 00:03:40,450 --> 00:03:44,390 Comme l'un de ceux jaune Scratch casse-tête morceaux encore et encore et encore. 81 00:03:44,390 --> 00:03:50,920 >> Alors maintenant, si je re-exécuter cette program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 J'ai une erreur maintenant. 83 00:03:51,770 --> 00:03:54,212 Qu'est-ce que j'ai oublié de faire? 84 00:03:54,212 --> 00:03:55,420 Ouais, donc je n'ai pas le compiler. 85 00:03:55,420 --> 00:03:56,740 Donc, assurez-buggy 2. 86 00:03:56,740 --> 00:03:59,840 Aucun fichier parce que je n'ai pas effectivement compiler la deuxième version. 87 00:03:59,840 --> 00:04:04,860 Alors maintenant intéressant non déclaré variable-- pas 2. 88 00:04:04,860 --> 00:04:05,510 Nous faisons 1. 89 00:04:05,510 --> 00:04:11,050 Assurez-buggy 1-- ./buggy-1-- et maintenant chacun d'eux est sur la même ligne. 90 00:04:11,050 --> 00:04:13,880 >> Maintenant, il ya une exception à cette demande supposée de la mine 91 00:04:13,880 --> 00:04:15,520 que vous avez besoin de ces accolades. 92 00:04:15,520 --> 00:04:20,160 Quand est-il réellement OK-- si vous avez remarqué dans la section ou textbooks-- 93 00:04:20,160 --> 00:04:22,130 d'omettre les accolades? 94 00:04:22,130 --> 00:04:22,630 Ouais? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Exactement. 97 00:04:26,870 --> 00:04:28,940 Quand il ya un seul ligne de code que vous 98 00:04:28,940 --> 00:04:32,830 vouloir être associé à la boucle comme dans notre premier exemple. 99 00:04:32,830 --> 00:04:36,380 Il est parfaitement légitime d'omettre les accolades 100 00:04:36,380 --> 00:04:40,310 comme une sorte de confort par le compilateur pour vous. 101 00:04:40,310 --> 00:04:40,810 Ouais? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Bonne question. 104 00:04:43,930 --> 00:04:45,500 Serait-il être considéré comme une erreur de style? 105 00:04:45,500 --> 00:04:49,340 Nous aimerions promote-- comme dans CS50 guide de style, l'URL pour laquelle 106 00:04:49,340 --> 00:04:51,926 est toujours en pset1-- que utiliser les accolades. 107 00:04:51,926 --> 00:04:53,550 Certes, si vous êtes nouveau à la programmation. 108 00:04:53,550 --> 00:04:56,800 La réalité est que nous ne sommes pas vais vous interdire 109 00:04:56,800 --> 00:04:58,680 de faire ces commodités. 110 00:04:58,680 --> 00:05:00,846 Mais si vous êtes juste dans le swing des choses, 111 00:05:00,846 --> 00:05:04,020 absolument juste toujours utiliser le bouclés accolades jusqu'à ce que vous obtenez le coup de lui. 112 00:05:04,020 --> 00:05:04,640 Bonne question. 113 00:05:04,640 --> 00:05:05,320 >> Bien. 114 00:05:05,320 --> 00:05:07,660 Alors que était alors un bug. 115 00:05:07,660 --> 00:05:09,190 Au moins dans quelque chose d'assez simple. 116 00:05:09,190 --> 00:05:11,260 Et pourtant, vous pourriez penser que ce est assez rudimentaire, non? 117 00:05:11,260 --> 00:05:13,635 C'est en quelque sorte de la première semaine de la recherche à la langue 118 00:05:13,635 --> 00:05:14,890 comme, voir vos bogues y. 119 00:05:14,890 --> 00:05:17,250 Mais en réalité, il s'agit de réellement représentatives 120 00:05:17,250 --> 00:05:20,310 de certains problèmes assez effrayants qui peut survenir dans le monde réel. 121 00:05:20,310 --> 00:05:23,530 >> Donc, certains d'entre vous se rappellent peut- si vous suivez nouvelles tech, 122 00:05:23,530 --> 00:05:25,740 ou peut-être même pris vent de cette en Février 123 00:05:25,740 --> 00:05:29,434 de cette dernière année que Apple avait fait une petite erreur dans les deux iOS, 124 00:05:29,434 --> 00:05:31,350 le système d'exploitation leurs téléphones, et aussi 125 00:05:31,350 --> 00:05:34,220 Mac OS, le système d'exploitation sur leurs ordinateurs de bureau et ordinateurs portables. 126 00:05:34,220 --> 00:05:36,480 Et vous avez vu ces gros titres de ce genre. 127 00:05:36,480 --> 00:05:41,120 Et par la suite, Apple promis de corriger ce bug, 128 00:05:41,120 --> 00:05:45,950 et très vite fait le fixer dans iOS, mais en fin de compte fixe dans Mac OS 129 00:05:45,950 --> 00:05:46,810 ainsi. 130 00:05:46,810 --> 00:05:50,370 >> Maintenant, aucun de ces titres seul vraiment révéler ce que le problème sous-jacent était, 131 00:05:50,370 --> 00:05:55,640 mais le bug a finalement été réduit à un bogue dans SSL, Secure Sockets Layer. 132 00:05:55,640 --> 00:05:57,390 Et longue histoire courte, c'est le logiciel 133 00:05:57,390 --> 00:06:01,030 que nos navigateurs et autres logiciel utilisé pour faire quoi? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Si je disais que le protocole SSL est participer, chaque fois que vous 136 00:06:06,860 --> 00:06:13,920 visiter une URL qui commence par HTTPS, qu'est-ce donc SSL pourrait être liée à? 137 00:06:13,920 --> 00:06:14,580 Chiffrement. 138 00:06:14,580 --> 00:06:16,470 Donc, nous allons parler de ce dans les prochains jours. 139 00:06:16,470 --> 00:06:18,750 Le cryptage, l'art de brouiller l'information. 140 00:06:18,750 --> 00:06:22,200 >> Mais bref, Apple il ya quelque temps avait fait une erreur 141 00:06:22,200 --> 00:06:25,970 dans leur mise en œuvre de SSL, la un logiciel qui met en oeuvre en fin de compte 142 00:06:25,970 --> 00:06:30,120 URL comme HTTPS ou max connexions là-bas aussi. 143 00:06:30,120 --> 00:06:32,850 Le résultat est que votre connexions pourrait potentiellement 144 00:06:32,850 --> 00:06:33,920 être interceptées. 145 00:06:33,920 --> 00:06:37,130 Et vos connexions étaient pas nécessairement chiffré 146 00:06:37,130 --> 00:06:40,350 si vous aviez un peu méchant entre vous et le site de destination qui 147 00:06:40,350 --> 00:06:42,170 a su profiter de cette. 148 00:06:42,170 --> 00:06:45,090 >> Maintenant, Apple a finalement publié Un correctif enfin, 149 00:06:45,090 --> 00:06:46,920 et la description de leur solution était présent. 150 00:06:46,920 --> 00:06:49,878 Transport en toute sécurité n'a pas réussi à valider l'authenticité de la connexion. 151 00:06:49,878 --> 00:06:52,920 La question a été abordée par restaurer manquants étapes de validation. 152 00:06:52,920 --> 00:06:57,250 >> Donc, c'est une explication ondulée de main très pour tout simplement dire que nous foiré. 153 00:06:57,250 --> 00:07:00,920 Il est littéralement un ligne de code qui était bogué 154 00:07:00,920 --> 00:07:05,130 dans leur mise en œuvre de SSL, et si vous allez en ligne et de recherche pour cette 155 00:07:05,130 --> 00:07:07,210 vous pouvez effectivement trouver le code source original. 156 00:07:07,210 --> 00:07:11,960 Par exemple, il s'agit d'une capture d'écran de juste une partie d'un fichier volumineux, 157 00:07:11,960 --> 00:07:15,965 mais il s'agit d'une fonction appelée apparemment SSL vérifier échange de clés de serveur d'abonnement. 158 00:07:15,965 --> 00:07:17,840 Et il faut un tas de arguments et des intrants. 159 00:07:17,840 --> 00:07:20,298 Et nous n'allons pas à se concentrer trop sur la minutie là, 160 00:07:20,298 --> 00:07:24,390 mais si vous vous concentrez sur le code à l'intérieur de la plus haute que nous allons function-- 161 00:07:24,390 --> 00:07:25,590 zoomer sur cela. 162 00:07:25,590 --> 00:07:28,140 Vous pouvez déjà soupçonner quelle erreur pourrait 163 00:07:28,140 --> 00:07:31,230 être même si vous n'avez aucune idée en fin de compte ce que vous cherchez à. 164 00:07:31,230 --> 00:07:35,924 Il ya une sorte d'anomalie ici, qui, c'est quoi? 165 00:07:35,924 --> 00:07:38,940 >> Ouais, je n'aime pas vraiment le regard de deux goto échoue. 166 00:07:38,940 --> 00:07:42,060 Franchement, je ne sais pas vraiment ce que goto l'échec des moyens, mais deux d'entre eux ayant 167 00:07:42,060 --> 00:07:42,810 dos à dos. 168 00:07:42,810 --> 00:07:45,290 Cela me frotte tout type de intellectuellement dans le mauvais sens, 169 00:07:45,290 --> 00:07:48,910 et même si on fait un zoom sur juste ces lignes, c'est C. 170 00:07:48,910 --> 00:07:52,220 >> Il ya donc beaucoup de code d'Apple est lui-même écrit en C, 171 00:07:52,220 --> 00:07:55,780 et ce, apparemment est vraiment equivalent-- 172 00:07:55,780 --> 00:07:59,060 pas à cette belle indentation version, mais si vous reconnaissez le fait 173 00:07:59,060 --> 00:08:02,560 qu'il n'y a pas d'accolades, ce Apple a vraiment écrit est un code qui ressemble 174 00:08:02,560 --> 00:08:03,540 comme ça. 175 00:08:03,540 --> 00:08:07,080 Donc j'ai zoomé sur et je viens fixe l'indentation dans le sens 176 00:08:07,080 --> 00:08:10,690 que s'il n'y a pas d'accolades, que deuxième goto ne c'est en jaune 177 00:08:10,690 --> 00:08:12,500 va exécuter n'importe quoi. 178 00:08:12,500 --> 00:08:15,540 Ce n'est pas associée à si la condition ci-dessus il. 179 00:08:15,540 --> 00:08:19,590 >> Ainsi, même encore, si vous n'avez pas tout à fait comprendre ce que cela pourrait peut-être 180 00:08:19,590 --> 00:08:23,230 être faire, sachez que chacun de ces conditions-- chacune de ces lignes 181 00:08:23,230 --> 00:08:26,180 est une étape très importante dans le processus de vérification 182 00:08:26,180 --> 00:08:28,350 si vos données sont en effet chiffré. 183 00:08:28,350 --> 00:08:31,710 Ainsi sautant un de ces étapes, pas la meilleure idée. 184 00:08:31,710 --> 00:08:34,840 >> Mais parce que nous avons ce deuxième goto échec en jaune, 185 00:08:34,840 --> 00:08:36,840 et parce qu'une fois que nous sorte de vue esthétique 186 00:08:36,840 --> 00:08:40,480 déplacez-le vers la gauche où il est logiquement à l'heure actuelle, ce 187 00:08:40,480 --> 00:08:43,230 ce que cela signifie pour la ligne de code ci-dessous que le deuxième goto 188 00:08:43,230 --> 00:08:46,480 échouez penseriez-vous? 189 00:08:46,480 --> 00:08:48,860 Il va toujours être ignorés. 190 00:08:48,860 --> 00:08:52,100 Donc goto sont généralement désapprouvés pour des raisons que nous ne serons pas vraiment aller dans, 191 00:08:52,100 --> 00:08:54,940 et même dans CS50 nous avons tendance pour enseigner cette déclaration goto, 192 00:08:54,940 --> 00:08:58,130 mais vous pouvez penser goto l'échec en ce sens vont saut 193 00:08:58,130 --> 00:08:59,600 dans une certaine autre partie du code. 194 00:08:59,600 --> 00:09:03,120 >> En d'autres termes sauter par-dessus cette dernière ligne tout à fait, 195 00:09:03,120 --> 00:09:07,420 et donc le résultat de cette stupide simple erreur qui était juste 196 00:09:07,420 --> 00:09:10,330 un résultat de probablement quelqu'un copier et coller un trop 197 00:09:10,330 --> 00:09:14,150 à plusieurs reprises, c'est que l'ensemble du la sécurité d'iOS et Mac OS 198 00:09:14,150 --> 00:09:18,240 était vulnérable à l'interception par les méchants pour un certain temps. 199 00:09:18,240 --> 00:09:19,940 Jusqu'à Apple a enfin résolu ce. 200 00:09:19,940 --> 00:09:23,100 >> Maintenant, si certains d'entre vous sont en fait courir les anciennes versions d'iOS ou Mac OS, 201 00:09:23,100 --> 00:09:27,250 vous pouvez aller à gotofail.com qui est un site web que quelqu'un a mis en place 202 00:09:27,250 --> 00:09:29,190 à déterminer essentiellement programme 203 00:09:29,190 --> 00:09:30,980 si votre ordinateur est toujours vulnérable. 204 00:09:30,980 --> 00:09:33,600 Et franchement, si c'est le cas, c'est probablement une bonne idée 205 00:09:33,600 --> 00:09:36,870 de mettre à jour votre téléphone ou votre Mac à ce point. 206 00:09:36,870 --> 00:09:40,120 Mais là, témoigne juste à quel point une appréciation de ces niveau inférieur 207 00:09:40,120 --> 00:09:42,400 détails et assez idées simples peuvent vraiment 208 00:09:42,400 --> 00:09:44,590 traduire dans les décisions et les problèmes que 209 00:09:44,590 --> 00:09:47,320 affected-- en ce case-- des millions de personnes. 210 00:09:47,320 --> 00:09:49,107 >> Maintenant un mot sur l'administration. 211 00:09:49,107 --> 00:09:50,690 Section va commencer ce dimanche. 212 00:09:50,690 --> 00:09:53,360 Vous recevrez un e-mail par le week-end sur la section, à quel point 213 00:09:53,360 --> 00:09:55,290 le processus de résection va commencer si vous avez 214 00:09:55,290 --> 00:09:56,998 réalisé que vous avez maintenant de nouveaux conflits. 215 00:09:56,998 --> 00:10:00,180 Donc ce qui se passe chaque année, et nous va accueillir dans les jours à venir. 216 00:10:00,180 --> 00:10:02,430 >> Bureau heures-- faire garder un oeil sur ce programme ici. 217 00:10:02,430 --> 00:10:05,100 Change un peu cette semaine, en particulier le temps de démarrage 218 00:10:05,100 --> 00:10:08,180 et l'emplacement, il ne faut consulter que avant de partir pour les heures de bureau 219 00:10:08,180 --> 00:10:09,520 l'un des quatre prochaines nuits. 220 00:10:09,520 --> 00:10:12,680 Et maintenant, un mot sur l'évaluation, d'autant plus que vous plongez dans problème 221 00:10:12,680 --> 00:10:14,350 établit un et au-delà. 222 00:10:14,350 --> 00:10:17,070 >> Donc, par la spécification, ceux-ci sont généralement 223 00:10:17,070 --> 00:10:20,360 les axes le long desquels nous évaluons votre travail. 224 00:10:20,360 --> 00:10:23,170 Champ d'application se réfère à ce mesure de vos outils de code 225 00:10:23,170 --> 00:10:25,690 les caractéristiques nécessaires par notre cahier des charges. 226 00:10:25,690 --> 00:10:28,290 En d'autres termes, la quantité de un ensemble de pièce avez-vous mordre. 227 00:10:28,290 --> 00:10:30,440 Avez-vous fait un tiers de lui, une moitié de celui-ci, 100% de celui-ci. 228 00:10:30,440 --> 00:10:33,000 Même si ce n'est pas correct, Combien avez-vous tenter? 229 00:10:33,000 --> 00:10:35,290 Alors que capte le niveau de l'effort et le montant 230 00:10:35,290 --> 00:10:38,260 à laquelle vous peu à l'écart les problèmes de jeu de problème. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- celui-ci, pour Dans quelle mesure, est votre code 232 00:10:40,690 --> 00:10:43,150 conforme à notre spécifications et exempts de bogues. 233 00:10:43,150 --> 00:10:44,770 Donc ça marche correctement? 234 00:10:44,770 --> 00:10:48,700 Si nous lui donnons une certaine entrée, n'est-ce nous donner la sortie que nous attendons? 235 00:10:48,700 --> 00:10:52,570 Design-- maintenant c'est la première de en particulier ceux qualitatives, 236 00:10:52,570 --> 00:10:56,180 ou celles qui exigent le jugement humain. 237 00:10:56,180 --> 00:10:59,690 Et en effet, c'est pourquoi nous avons un personnel de tant de boursiers de l'enseignement et de cours 238 00:10:59,690 --> 00:11:00,350 assistants. 239 00:11:00,350 --> 00:11:03,480 Dans quelle mesure votre code bien écrit? 240 00:11:03,480 --> 00:11:05,810 >> Et là encore, c'est une très évaluation qualitative 241 00:11:05,810 --> 00:11:09,100 qui va travailler avec vous sur bi-directionnelle dans les semaines à venir. 242 00:11:09,100 --> 00:11:12,060 De sorte que lorsque vous obtenez pas seulement les scores numériques, mais aussi 243 00:11:12,060 --> 00:11:16,682 un partitions écrites, ou des commentaires tapé, ou commentaires écrits à des mots anglais. 244 00:11:16,682 --> 00:11:19,640 C'est ce que nous allons utiliser pour vous conduire vers en train d'écrire un meilleur code. 245 00:11:19,640 --> 00:11:23,320 Et en cours et de l'article, nous essaierons signaler out-- aussi souvent que nous can-- 246 00:11:23,320 --> 00:11:26,420 ce qui fait un programme non seulement correct et fonctionnel bon, 247 00:11:26,420 --> 00:11:28,200 mais aussi bien conçu. 248 00:11:28,200 --> 00:11:31,850 Le plus efficace, il pourrait être, ou même la plus belle possible. 249 00:11:31,850 --> 00:11:33,100 >> Ce qui nous amène à un style. 250 00:11:33,100 --> 00:11:36,876 Le style est en fin de compte un jugement esthétique. 251 00:11:36,876 --> 00:11:38,750 Avez-vous choisi la bonne noms de vos variables? 252 00:11:38,750 --> 00:11:40,330 Avez-vous en retrait votre code correctement? 253 00:11:40,330 --> 00:11:44,010 Est-il l'air bien, et donc, est-il facile pour un autre être humain 254 00:11:44,010 --> 00:11:46,550 de lire votre correspondant de son exactitude. 255 00:11:46,550 --> 00:11:50,300 >> Maintenant, généralement par le programme, nous marquons ces choses sur une échelle de cinq points. 256 00:11:50,300 --> 00:11:53,640 Et permettez-moi de marteler le point que trois est vraiment bon. 257 00:11:53,640 --> 00:11:55,550 Faire très rapidement des gens commencer à faire le calcul. 258 00:11:55,550 --> 00:11:58,133 Quand ils obtiennent un sur trois cinq sur la justesse de certaines pset 259 00:11:58,133 --> 00:12:02,040 et ils pensent que putain, je vais à 60% qui est essentiellement un D ou un E. 260 00:12:02,040 --> 00:12:03,980 >> Ce n'est pas la façon dont nous penser de ces chiffres. 261 00:12:03,980 --> 00:12:06,880 A trois, c'est vraiment bon, et ce que nous s'attendre généralement au début 262 00:12:06,880 --> 00:12:09,820 du terme, c'est que si vous obtenez un tas de three's-- peut-être quelques 263 00:12:09,820 --> 00:12:12,540 des foires, un couple de fours-- ou quelques groupes de deux, un couple de fours-- 264 00:12:12,540 --> 00:12:13,748 c'est un bon endroit pour commencer. 265 00:12:13,748 --> 00:12:16,320 Et tant que nous voyons une trajectoire ascendante au fil du temps, 266 00:12:16,320 --> 00:12:18,540 vous êtes dans un endroit particulièrement bon. 267 00:12:18,540 --> 00:12:20,752 >> La formule que nous utilisons pour les choses de poids est essentiellement 268 00:12:20,752 --> 00:12:22,710 ce par le programme, qui signifie simplement que nous 269 00:12:22,710 --> 00:12:24,750 donner plus de poids à la décision correcte. 270 00:12:24,750 --> 00:12:27,930 Parce que c'est très souvent exactitude qui prend le plus de temps. 271 00:12:27,930 --> 00:12:28,760 Croyez-moi maintenant. 272 00:12:28,760 --> 00:12:31,190 Vous find-- au moins dans une pset-- que vous 273 00:12:31,190 --> 00:12:36,790 passer 90% de votre temps travailler sur 10% du problème. 274 00:12:36,790 --> 00:12:39,320 >> Et tout fonctionne sorte de sauf pour une ou deux des insectes, 275 00:12:39,320 --> 00:12:41,570 et ce sont les insectes qui vous garder jusqu'à tard dans la nuit. 276 00:12:41,570 --> 00:12:43,380 Ce sont ceux qui sorte de vous échapper. 277 00:12:43,380 --> 00:12:45,560 Mais après avoir dormi sur elle, ou pour assister à des heures de bureau 278 00:12:45,560 --> 00:12:48,844 ou poser des questions en ligne, est quand vous arrivez à cet objectif de 100%, 279 00:12:48,844 --> 00:12:50,760 et c'est pourquoi nous le poids décision correcte le plus. 280 00:12:50,760 --> 00:12:54,102 Concevoir un peu moins, et le style un peu moins que cela. 281 00:12:54,102 --> 00:12:56,060 Mais garder dans le style mind-- est peut-être le plus facile 282 00:12:56,060 --> 00:12:58,890 de ces derniers à mordre selon le guide de style. 283 00:12:58,890 --> 00:13:01,580 >> Et maintenant, un plus grave noter sur l'honnêteté académique. 284 00:13:01,580 --> 00:13:05,000 CS50 a la fâcheuse distinction de étant le plus grand producteur du Conseil de l'annonce 285 00:13:05,000 --> 00:13:07,330 cas presque chaque année historiquement. 286 00:13:07,330 --> 00:13:11,012 Ce n'est pas parce que les étudiants trichent CS50 pas plus que n'importe quelle autre classe, 287 00:13:11,012 --> 00:13:13,720 mais à cause de la nature du travail, le fait que c'est électronique, 288 00:13:13,720 --> 00:13:16,636 le fait que nous recherchons, et le fait que nous sommes des informaticiens, 289 00:13:16,636 --> 00:13:20,570 Je peux dire que nous ne sommes malheureusement très bon à détecter. 290 00:13:20,570 --> 00:13:22,710 >> Alors qu'est-ce que cela signifie concrètement? 291 00:13:22,710 --> 00:13:24,820 Donc il, par le programme, La philosophie de cours 292 00:13:24,820 --> 00:13:28,090 vraiment ne se résument à être raisonnable. 293 00:13:28,090 --> 00:13:31,684 Il est de cette ligne entre faire son travail sur votre propre 294 00:13:31,684 --> 00:13:34,100 et d'obtenir un peu de aide raisonnable à un ami, 295 00:13:34,100 --> 00:13:38,020 et carrément faire ce travail pour votre ami ou lui envoyer votre code 296 00:13:38,020 --> 00:13:41,080 afin qu'il ou elle ne peut tout simplement prendre ou emprunter sur la droite. 297 00:13:41,080 --> 00:13:43,580 Et qui traverse la ligne que nous attirés dans la classe. 298 00:13:43,580 --> 00:13:45,410 >> Voir le programme en fin de compte des lignes 299 00:13:45,410 --> 00:13:48,209 que nous tirons comme raisonnables et le comportement déraisonnable, 300 00:13:48,209 --> 00:13:50,000 mais il fait vraiment bouillir vers le bas à l'essence 301 00:13:50,000 --> 00:13:53,980 de votre travail besoin d' être votre propre à la fin. 302 00:13:53,980 --> 00:13:56,230 Maintenant, avec cela dit, il existe une heuristique. 303 00:13:56,230 --> 00:13:58,980 Parce que, comme vous pourriez imagine-- des heures de bureau et les visuels 304 00:13:58,980 --> 00:14:01,060 et les vidéos que nous avons montré CS50 ainsi far-- 305 00:14:01,060 --> 00:14:04,530 est en effet destiné à être aussi de collaboration et comme coopérative et sociale comme 306 00:14:04,530 --> 00:14:06,450 que possible. 307 00:14:06,450 --> 00:14:08,570 En collaboration car il est rigoureux. 308 00:14:08,570 --> 00:14:11,314 >> Mais cela dit, l'heuristique, comme vous le verrez dans le programme, 309 00:14:11,314 --> 00:14:12,980 c'est que lorsque vous rencontrez un problème. 310 00:14:12,980 --> 00:14:16,470 Vous avez un bug dans votre code que vous ne peut pas résoudre, il est raisonnable pour vous 311 00:14:16,470 --> 00:14:18,039 pour montrer votre code à quelqu'un d'autre. 312 00:14:18,039 --> 00:14:21,080 Un ami, même dans la classe, un ami assis à côté de vous à des heures de bureau, 313 00:14:21,080 --> 00:14:22,680 ou un membre du personnel. 314 00:14:22,680 --> 00:14:25,810 Mais ils ne peuvent pas montrer leur code pour vous. 315 00:14:25,810 --> 00:14:27,710 >> En d'autres termes, un répondre à votre question-- 316 00:14:27,710 --> 00:14:29,940 J'ai besoin help-- n'est pas oh, voici mon code. 317 00:14:29,940 --> 00:14:32,440 Jetez un oeil à ceci et en déduire ce que vous voulez. 318 00:14:32,440 --> 00:14:34,580 Maintenant, bien sûr, il ya de façon clairement au jeu 319 00:14:34,580 --> 00:14:37,760 ce système dans lequel je vais vous montrer mon code avant d'avoir une question. 320 00:14:37,760 --> 00:14:40,150 Vous me montrer mon code avant d'avoir une question. 321 00:14:40,150 --> 00:14:45,870 Mais revoir le programme pour la détails les plus fins de l'endroit où cette ligne est. 322 00:14:45,870 --> 00:14:50,606 >> Juste pour peindre maintenant l'image et partager de manière aussi transparente que possible 323 00:14:50,606 --> 00:14:53,480 où nous en sommes dans les dernières années, c'est le nombre de cas de la Commission Ad 324 00:14:53,480 --> 00:14:56,260 que CS50 a eu plus de les sept dernières années. 325 00:14:56,260 --> 00:14:58,717 Avec 14 cas cet automne la plus récente. 326 00:14:58,717 --> 00:15:01,300 En ce qui concerne les élèves concernés, il était de 20 certains élèves impairs 327 00:15:01,300 --> 00:15:02,490 l'automne dernier. 328 00:15:02,490 --> 00:15:05,670 Il y avait un pic de 33 étudiants il ya quelques années. 329 00:15:05,670 --> 00:15:08,830 Beaucoup d'entre eux sont malheureusement plus ici sur le campus. 330 00:15:08,830 --> 00:15:13,100 >> Les élèves qui participent en tant que pourcentage de la classe a toujours varié entre 0% 331 00:15:13,100 --> 00:15:17,300 à 5,3%, qui est seulement à dire c'est chaque année un défi. 332 00:15:17,300 --> 00:15:20,390 Et à cette fin, ce qui nous voulons faire est de transmettre un 333 00:15:20,390 --> 00:15:24,310 que nous dd-- juste FYI-- comparer à une équité pour les étudiants qui 334 00:15:24,310 --> 00:15:26,520 sont en suivant la ligne en conséquence. 335 00:15:26,520 --> 00:15:29,620 Nous faisons comparer courant arguments à l'encontre de toutes les missions passées 336 00:15:29,620 --> 00:15:30,840 des dernières années. 337 00:15:30,840 --> 00:15:33,620 >> Nous savons trop comment Google autour et trouver des dépôts de code 338 00:15:33,620 --> 00:15:36,360 en ligne, forums de discussion en ligne, sites d'emploi en ligne. 339 00:15:36,360 --> 00:15:41,580 Si un étudiant peut trouver, nous pouvons sûrement trouver autant que nous le faisons à regret. 340 00:15:41,580 --> 00:15:45,330 Donc, ce que vous verrez dans le programme si cette clause de regret. 341 00:15:45,330 --> 00:15:47,500 Je peux certainement apprécier, et nous avons tous a 342 00:15:47,500 --> 00:15:50,870 personnel ayant fait le cours comme ce, ou celui-ci au fil du temps lui-même, 343 00:15:50,870 --> 00:15:53,997 savez certainement ce que c'est comme quand la vie est dans la manière quand vous avez 344 00:15:53,997 --> 00:15:56,080 un soir tard deadline-- non seulement dans cette classe, 345 00:15:56,080 --> 00:15:58,660 mais another-- lorsque vous êtes complètement épuisé, stressé, 346 00:15:58,660 --> 00:16:00,659 avoir un nombre excessif d'autres choses à faire. 347 00:16:00,659 --> 00:16:03,660 Vous allez faire à un moment donné vie certainement une mauvaise, peut-être en retard 348 00:16:03,660 --> 00:16:04,620 décision de nuit. 349 00:16:04,620 --> 00:16:06,520 >> Donc, par le programme, il ya cette clause, 350 00:16:06,520 --> 00:16:10,629 de sorte que si dans les 72 heures suivant une certaine mauvaise décision, vous possédez à la hauteur 351 00:16:10,629 --> 00:16:12,670 et tendre la main à moi et un des chefs du cours 352 00:16:12,670 --> 00:16:14,300 et nous allons avoir une conversation. 353 00:16:14,300 --> 00:16:16,220 Nous allons gérer les choses interne dans l'espoir 354 00:16:16,220 --> 00:16:18,770 de celui-ci de plus en plus d'un moment d'enseignement ou une leçon de vie, 355 00:16:18,770 --> 00:16:22,120 et pas quelque chose avec ramifications particulièrement drastiques 356 00:16:22,120 --> 00:16:24,570 comme vous pouvez le voir sur ces cartes ici. 357 00:16:24,570 --> 00:16:26,540 >> C'est donc un ton très grave. 358 00:16:26,540 --> 00:16:29,960 Arrêtons-nous quelques-uns secondes pour briser la tension. 359 00:16:29,960 --> 00:16:34,442 >> [MUSIQUE LECTURE] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> DAVID J. Malan: Très bien, Alors, comment était-ce pour un enchaînement? 362 00:17:20,250 --> 00:17:22,059 Pour les sujets primaires d'aujourd'hui. 363 00:17:22,059 --> 00:17:23,859 Le premier est l'abstraction. 364 00:17:23,859 --> 00:17:26,900 Un autre de laquelle va être le représentation des données, ce qui, franchement 365 00:17:26,900 --> 00:17:31,640 est un moyen très sec de dire comment pouvons-nous aller sur la résolution de problèmes et la pensée 366 00:17:31,640 --> 00:17:33,250 de résoudre des problèmes? 367 00:17:33,250 --> 00:17:37,285 Donc, vous l'avez vu dans Scratch, et vous avez peut-être déjà vu dans pset1 C avec 368 00:17:37,285 --> 00:17:39,930 que non seulement vous pouvez utiliser fonctions, comme printf, 369 00:17:39,930 --> 00:17:42,770 que d'autres personnes dans dernières années a écrit pour vous. 370 00:17:42,770 --> 00:17:45,340 Vous pouvez aussi écrire vos propres fonctions. 371 00:17:45,340 --> 00:17:48,440 >> Et même si vous ne pourriez pas avoir fait dans C, et franchement dans pset1 372 00:17:48,440 --> 00:17:51,866 vous n'avez pas vraiment besoin d'écrire votre propre fonction parce que le problem-- 373 00:17:51,866 --> 00:17:53,990 alors que peut-être intimidant au première glance-- vous verrez 374 00:17:53,990 --> 00:17:57,910 peut finalement être résolu avec pas tous que de nombreuses lignes de code. 375 00:17:57,910 --> 00:18:01,140 Mais cela dit, en termes d'écrire votre propre fonction, 376 00:18:01,140 --> 00:18:03,570 se rendre compte que C ne donne vous cette capacité. 377 00:18:03,570 --> 00:18:06,940 >> Je vais aller dans le code source d'aujourd'hui, qui est déjà disponible en ligne, 378 00:18:06,940 --> 00:18:10,900 et je vais aller de l'avant et ouvert un programme appelé fonction 0.C, 379 00:18:10,900 --> 00:18:14,620 et en fonction zéro nous allons voir quelques choses. 380 00:18:14,620 --> 00:18:19,160 Dans les premières lignes 18 à 23 est ma fonction principale. 381 00:18:19,160 --> 00:18:22,414 Et maintenant que nous commençons à lire code que nous ne sommes pas écrire à la volée, 382 00:18:22,414 --> 00:18:25,080 mais je l'ai écrit à l'avance ou que vous en définissez un problème 383 00:18:25,080 --> 00:18:27,910 pourrait recevoir ayant été écrit à l'avance. 384 00:18:27,910 --> 00:18:30,040 Une bonne façon de commencer lire le code de quelqu'un d'autre 385 00:18:30,040 --> 00:18:31,400 est de chercher la fonction principale. 386 00:18:31,400 --> 00:18:34,420 Figure où cette entrée Il s'agit de l'exécution du programme, 387 00:18:34,420 --> 00:18:36,580 et puis suivre logiquement à partir de là. 388 00:18:36,580 --> 00:18:40,190 >> Donc, ce programme apparemment impressions votre nom suivi de deux points. 389 00:18:40,190 --> 00:18:42,490 Nous utilisons ensuite GetString de la bibliothèque CS50 390 00:18:42,490 --> 00:18:46,050 pour obtenir une chaîne, ou un mot ou une phrase à partir de l'utilisateur au clavier. 391 00:18:46,050 --> 00:18:48,390 Et puis il ya ce chose printNom ici--. 392 00:18:48,390 --> 00:18:51,420 >> Maintenant printNom n'est pas un fonction qui est livré avec C. 393 00:18:51,420 --> 00:18:52,970 Ce n'est pas dans la norme io.h. 394 00:18:52,970 --> 00:18:55,570 Ce n'est pas dans CS50.h. 395 00:18:55,570 --> 00:18:57,880 C'est un peu dans le même fichier. 396 00:18:57,880 --> 00:19:01,000 Remarquez si je défiler vers le bas une des lignes bit-- 25 à 27-- 397 00:19:01,000 --> 00:19:05,330 c'est juste une jolie manière de commenter votre code en utilisant les étoiles et les barres obliques. 398 00:19:05,330 --> 00:19:07,320 Il s'agit d'un multi-ligne commenter, et ce n'est que 399 00:19:07,320 --> 00:19:10,570 ma description en bleu de ce que cette fonction fait. 400 00:19:10,570 --> 00:19:14,530 >> Parce que dans les lignes 28 à 31, J'ai écrit une fonction super simple 401 00:19:14,530 --> 00:19:16,280 dont le nom est printNom. 402 00:19:16,280 --> 00:19:19,560 Il faut combien arguments diriez-vous? 403 00:19:19,560 --> 00:19:25,120 Donc un argument-- parce qu'il ya un l'argument figurant à l'intérieur des parenthèses. 404 00:19:25,120 --> 00:19:27,000 Le type de ce qui est String. 405 00:19:27,000 --> 00:19:30,240 Qui consiste à dire printNom est comme cette boîte noire 406 00:19:30,240 --> 00:19:32,910 ou une fonction qui prend en entrée une chaîne. 407 00:19:32,910 --> 00:19:35,730 >> Et le nom de cette chaîne commodément sera Nom. 408 00:19:35,730 --> 00:19:37,840 Pas S, pas N, sauf le nom. 409 00:19:37,840 --> 00:19:41,090 Alors qu'est-ce printNom faire? 410 00:19:41,090 --> 00:19:42,210 C'est bien simple. 411 00:19:42,210 --> 00:19:45,390 Tout comme une ligne de code pour printf, mais apparemment, il 412 00:19:45,390 --> 00:19:47,950 imprime "Bonjour," ceci et cela. 413 00:19:47,950 --> 00:19:50,070 Lorsque la untel vient de l'argument. 414 00:19:50,070 --> 00:19:52,300 >> Maintenant, ce n'est pas une énorme innovation ici. 415 00:19:52,300 --> 00:19:56,710 Vraiment, j'ai pris un programme qui pourrait ont été écrit avec une ligne de code 416 00:19:56,710 --> 00:20:00,190 en mettant ce ici, et changé pour quelque chose 417 00:20:00,190 --> 00:20:04,920 qui implique six ou sept ou si lignes de code tout en bas ici. 418 00:20:04,920 --> 00:20:08,190 >> Mais c'est la pratique de la principe connu sous le nom abstraction. 419 00:20:08,190 --> 00:20:12,550 Type d'encapsulation à l'intérieur d'une nouvelle fonction qui a un nom, et une meilleure 420 00:20:12,550 --> 00:20:14,590 encore ce nom littéralement dit ce qu'il fait. 421 00:20:14,590 --> 00:20:16,880 Je veux dire que ce n'est pas printf-- particulièrement descriptive. 422 00:20:16,880 --> 00:20:18,932 Si je veux créer un pièce du puzzle, ou si je 423 00:20:18,932 --> 00:20:21,140 vouloir créer une fonction qui imprime le nom de quelqu'un, 424 00:20:21,140 --> 00:20:23,230 la beauté de faire ce est ce que je peux effectivement 425 00:20:23,230 --> 00:20:27,170 donner cette fonction un nom qui décrit ce qu'il fait. 426 00:20:27,170 --> 00:20:29,844 >> Maintenant, il faut que dans une entrée J'ai arbitrairement appelé nom, 427 00:20:29,844 --> 00:20:32,760 mais c'est trop merveilleusement descriptif au lieu d'être un peu plus 428 00:20:32,760 --> 00:20:36,140 générique comme S. Et vide, pour l'instant, signifie simplement 429 00:20:36,140 --> 00:20:38,330 que cette fonction n'est pas main-moi quelque chose. 430 00:20:38,330 --> 00:20:41,127 Ce n'est pas comme GetString que me tend retour une chaîne littéralement 431 00:20:41,127 --> 00:20:43,960 comme nous l'avons fait avec les morceaux de papier avec vos camarades de classe la semaine dernière, 432 00:20:43,960 --> 00:20:45,990 mais il a seulement un effet secondaire. 433 00:20:45,990 --> 00:20:48,080 Elle imprime quelque chose à l'écran. 434 00:20:48,080 --> 00:20:53,880 >> Ainsi, à la fin de la journée, si je ne faire fonctionner-0, ./function-0, 435 00:20:53,880 --> 00:20:55,450 nous verrons qu'il me demande mon nom. 436 00:20:55,450 --> 00:20:58,150 Je tape David, et il types mon nom. 437 00:20:58,150 --> 00:21:01,080 Si je le fais à nouveau avec Rob, il va dire "Bonjour, Rob." 438 00:21:01,080 --> 00:21:04,280 Alors une idée simple, mais peut-être extrapoler à partir de ce mentaux 439 00:21:04,280 --> 00:21:06,750 que vos programmes se un peu plus compliqué, 440 00:21:06,750 --> 00:21:10,290 et vous voulez écrire un morceau de code et appel code-- invoke 441 00:21:10,290 --> 00:21:13,270 code-- que par certains descriptif nommer comme printNom, 442 00:21:13,270 --> 00:21:15,600 C fait nous permettre cette fonctionnalité. 443 00:21:15,600 --> 00:21:17,660 >> Voici un autre exemple simple. 444 00:21:17,660 --> 00:21:22,940 Par exemple, si j'ouvre une déposer de appelé aujourd'hui return.c, 445 00:21:22,940 --> 00:21:24,270 remarque ce que j'ai fait ici. 446 00:21:24,270 --> 00:21:26,330 La plupart de cette fonction principale est printf. 447 00:21:26,330 --> 00:21:30,360 J'ai d'abord initialiser arbitrairement une variable appelée x pour le numéro 2. 448 00:21:30,360 --> 00:21:34,110 J'ai ensuite imprimer "x est maintenant % I "en passant la valeur de x. 449 00:21:34,110 --> 00:21:35,500 Donc, je dis juste ce que c'est. 450 00:21:35,500 --> 00:21:37,208 >> Maintenant, je suis juste hardiment revendiquant la fonction printf. 451 00:21:37,208 --> 00:21:42,050 Je cubage cette valeur x, et je suis faire en appelant une fonction 452 00:21:42,050 --> 00:21:45,590 appelé passage de cube en x comme argument, 453 00:21:45,590 --> 00:21:49,300 et puis en enregistrant la sortie dans la variable elle-même, x. 454 00:21:49,300 --> 00:21:51,340 Je suis donc démolir la valeur de x. 455 00:21:51,340 --> 00:21:53,380 Je suis remplaçant la valeur de x avec ce 456 00:21:53,380 --> 00:21:56,510 le résultat de l'appel cette fonction de cube est. 457 00:21:56,510 --> 00:21:59,530 Et puis je viens d'imprimer une certaine trucs moelleux ici dire ce que j'ai fait. 458 00:21:59,530 --> 00:22:01,600 >> Alors, quel est alors le cube? 459 00:22:01,600 --> 00:22:03,510 Remarquez ce qui est fondamentalement différent ici. 460 00:22:03,510 --> 00:22:05,540 J'ai donné la fonction un nom comme avant. 461 00:22:05,540 --> 00:22:08,270 J'ai spécifié un nom d'un argument. 462 00:22:08,270 --> 00:22:11,650 Cette fois, il est appelé n au lieu du nom, mais je ne pouvais l'appeler ce que je veux. 463 00:22:11,650 --> 00:22:12,650 Mais c'est différent. 464 00:22:12,650 --> 00:22:14,080 Cette chose sur la gauche. 465 00:22:14,080 --> 00:22:16,290 Auparavant, il était ce mot? 466 00:22:16,290 --> 00:22:16,870 Garçons. 467 00:22:16,870 --> 00:22:18,580 Maintenant, il est de toute évidence int. 468 00:22:18,580 --> 00:22:20,630 >> Alors, quel est peut-être l'emporter? 469 00:22:20,630 --> 00:22:24,090 Considérant que signifie vides sorte de néant, et que c'était le cas. 470 00:22:24,090 --> 00:22:25,970 PrintNom n'a rien retourné. 471 00:22:25,970 --> 00:22:27,942 Il a fait quelque chose, mais il ne me remettait pas 472 00:22:27,942 --> 00:22:30,650 quelque chose que je pourrais mettre sur le gauche d'un signe égal 473 00:22:30,650 --> 00:22:32,460 comme je l'ai fait ici sur la ligne 22. 474 00:22:32,460 --> 00:22:36,780 >> Donc, si je dis dans la ligne 30, qu'est ce que c'est probablement ce qui implique 475 00:22:36,780 --> 00:22:38,610 sur ce cube fait pour moi? 476 00:22:38,610 --> 00:22:41,110 Ouais? 477 00:22:41,110 --> 00:22:42,310 Elle renvoie un entier. 478 00:22:42,310 --> 00:22:44,590 Donc, il me tend le dos, pour par exemple, un morceau de papier 479 00:22:44,590 --> 00:22:46,580 sur lequel il a écrit la réponse. 480 00:22:46,580 --> 00:22:50,130 2 cubes, ou 3 cubes, ou 4 cubed-- ce que je passai, 481 00:22:50,130 --> 00:22:51,540 et comment ai-je mettre en œuvre ce? 482 00:22:51,540 --> 00:22:54,810 Eh bien, n fois n fois n comment je pourrais cube une valeur. 483 00:22:54,810 --> 00:22:57,110 Encore une fois, super simple idée, mais démonstratif 484 00:22:57,110 --> 00:23:00,100 maintenant comment nous pouvons écrire des fonctions qui nous a fait revenir 485 00:23:00,100 --> 00:23:02,380 valeurs qui pourraient être d'intérêt. 486 00:23:02,380 --> 00:23:05,740 >> Regardons un dernier exemple ici appelée fonction d'un. 487 00:23:05,740 --> 00:23:08,530 Dans cet exemple, on commence pour obtenir plus convaincant. 488 00:23:08,530 --> 00:23:12,400 Ainsi, dans une fonction, cette avis program-- finalement 489 00:23:12,400 --> 00:23:14,920 appelle une fonction appelée GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt n'est pas un fonction dans la bibliothèque CS50, 491 00:23:17,800 --> 00:23:20,400 mais nous, nous avons décidé aimerait qu'elle existe. 492 00:23:20,400 --> 00:23:24,550 >> Donc, si nous faisons défiler vers le bas plus tard dans le fichier, remarque que je suis allé sur la mise en œuvre 493 00:23:24,550 --> 00:23:26,560 obtenir int positif, et je dire que c'est plus convaincant 494 00:23:26,560 --> 00:23:28,992 parce que c'est un décent nombre de lignes de code. 495 00:23:28,992 --> 00:23:30,700 Ce n'est pas seulement un idiot petit programme de jouet. 496 00:23:30,700 --> 00:23:33,870 Il s'agit en fait obtenu la vérification d'erreur et faire quelque chose de plus utile. 497 00:23:33,870 --> 00:23:38,470 >> Donc, si vous n'avez pas vu la procédure pas à pas vidéos que nous avons intégrées dans pset1, 498 00:23:38,470 --> 00:23:42,350 sachez que c'est un type de boucle en C, dans le même esprit 499 00:23:42,350 --> 00:23:44,270 les sortes de choses Scratch peut faire. 500 00:23:44,270 --> 00:23:46,320 Et faire dit le faire. 501 00:23:46,320 --> 00:23:47,500 Imprimer cela. 502 00:23:47,500 --> 00:23:51,860 Alors allez-y et obtenir n-- obtenir un int et le stocker dans n, 503 00:23:51,860 --> 00:23:55,760 et continuer à le faire encore et encore et à nouveau, tant que n est inférieur à un. 504 00:23:55,760 --> 00:23:58,720 >> Alors n va être inférieur à un que si l'être humain est de ne pas coopérer. 505 00:23:58,720 --> 00:24:01,980 Si il ou elle est de taper en 0 ou -1 ou -50, 506 00:24:01,980 --> 00:24:04,790 cette boucle va continuer exécuter encore et encore. 507 00:24:04,790 --> 00:24:07,549 Et, finalement, remarque, je il suffit de retourner la valeur. 508 00:24:07,549 --> 00:24:09,590 Alors maintenant, nous avons une fonction ça aurait été sympa 509 00:24:09,590 --> 00:24:14,040 si CS50 mettrait en œuvre dans CS50.h et CS50.c pour vous, 510 00:24:14,040 --> 00:24:16,520 mais ici nous pouvons maintenant mettre en œuvre nous-mêmes. 511 00:24:16,520 --> 00:24:19,230 >> Mais deux remarques sur certains détails importants. 512 00:24:19,230 --> 00:24:24,390 One-- pourquoi ai-je déclare int n, pensez-vous, à la ligne 29 513 00:24:24,390 --> 00:24:27,139 au lieu de simplement faire ce ici, ce qui est 514 00:24:27,139 --> 00:24:28,930 plus compatible avec ce que nous avons fait la semaine dernière? 515 00:24:28,930 --> 00:24:29,430 Ouais? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 Une bonne pensée. 518 00:24:35,110 --> 00:24:37,080 Donc, si nous devions mettre ici, c'est comme si nous 519 00:24:37,080 --> 00:24:39,110 garder déclarant encore et encore. 520 00:24:39,110 --> 00:24:42,000 Cela en soi est pas problématique, en soi, 521 00:24:42,000 --> 00:24:43,940 parce que nous ne devons la valeur une fois, puis 522 00:24:43,940 --> 00:24:45,330 nous allons obtenir un nouveau de toute façon. 523 00:24:45,330 --> 00:24:45,940 Mais une bonne pensée. 524 00:24:45,940 --> 00:24:46,440 Ouais? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Fermer. 527 00:24:53,330 --> 00:24:59,030 Ainsi, parce que j'ai déclaré sur n ligne 29 à l'extérieur de la boucle, 528 00:24:59,030 --> 00:25:01,390 il est accessible tout au long de cette fonction entière. 529 00:25:01,390 --> 00:25:05,400 Pas les autres fonctions parce n est toujours à l'intérieur de ceux-ci bouclés 530 00:25:05,400 --> 00:25:06,470 accolades ici. 531 00:25:06,470 --> 00:25:07,940 So-- sûr. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Exactement. 534 00:25:12,940 --> 00:25:14,356 Donc, cela est encore plus au point. 535 00:25:14,356 --> 00:25:18,600 Si nous place déclaré n ici à la ligne 32, 536 00:25:18,600 --> 00:25:22,340 c'est problématique parce que conjecture où d'autre j'ai besoin d'y accéder? 537 00:25:22,340 --> 00:25:25,620 Sur la ligne 34, et la règle simple à suivre est 538 00:25:25,620 --> 00:25:30,060 que vous ne pouvez utiliser une variable l'intérieur des plus récents accolades 539 00:25:30,060 --> 00:25:31,420 dans lequel vous avez déclaré il. 540 00:25:31,420 --> 00:25:35,230 >> Malheureusement, la ligne 34 est une ligne trop tard, 541 00:25:35,230 --> 00:25:38,560 parce que je l'ai déjà fermé l'accolade sur la ligne 33 542 00:25:38,560 --> 00:25:41,220 qui correspond à l' accolade à la ligne 30. 543 00:25:41,220 --> 00:25:44,180 Et donc c'est une façon de dire que cette variable int est scope, 544 00:25:44,180 --> 00:25:46,970 pour ainsi dire, à seulement à l'intérieur de ces accolades. 545 00:25:46,970 --> 00:25:48,910 Il n'existe tout simplement pas en dehors d'eux. 546 00:25:48,910 --> 00:25:51,580 >> Donc, en effet, si je fais ça mal, permettez-moi de sauver le code 547 00:25:51,580 --> 00:25:53,530 comme il is-- incorrectement écrit. 548 00:25:53,530 --> 00:25:57,990 Permettez-moi d'aller de l'avant et ne fais -une fonction, et notice-- erreur. 549 00:25:57,990 --> 00:26:03,502 L'utilisation de noir identifiant n sur la ligne 35, qui est ici. 550 00:26:03,502 --> 00:26:05,210 Et si nous faisons défiler jusqu'à en outre, une autre. 551 00:26:05,210 --> 00:26:08,750 L'utilisation de noir identifiant n sur la ligne 34. 552 00:26:08,750 --> 00:26:11,200 >> Ainsi, le compilateur, Clang, est à remarquer que c'est juste 553 00:26:11,200 --> 00:26:13,720 n'existe pas, même si clairement qu'il est là visuellement. 554 00:26:13,720 --> 00:26:16,090 Ainsi, une solution simple est de déclarer là. 555 00:26:16,090 --> 00:26:18,790 >> Maintenant, permettez-moi de faire défiler à le début du fichier. 556 00:26:18,790 --> 00:26:21,080 Qu'est-ce que vous saute au visage comme être un peu différent 557 00:26:21,080 --> 00:26:23,070 de la substance, nous avons examiné la semaine dernière? 558 00:26:23,070 --> 00:26:26,990 Non seulement je avoir le nom, non seulement faire J'ai un peu forte comprend là-haut, 559 00:26:26,990 --> 00:26:29,340 J'ai quelque chose je suis appeler un prototype. 560 00:26:29,340 --> 00:26:36,100 Maintenant que semble terriblement semblable à ce que nous venons de le voir, il ya un moment sur la ligne 27. 561 00:26:36,100 --> 00:26:39,230 >> Donc, nous allons déduire d'un autre message d'erreur pourquoi je l'ai fait. 562 00:26:39,230 --> 00:26:42,050 Permettez-moi d'aller de l'avant et supprimer ces lignes il. 563 00:26:42,050 --> 00:26:44,240 Et si nous ne savons rien de prototype. 564 00:26:44,240 --> 00:26:45,430 Refaire ce fichier. 565 00:26:45,430 --> 00:26:46,890 Faire fonctionner un. 566 00:26:46,890 --> 00:26:48,090 Et maintenant, putain, quatre erreurs. 567 00:26:48,090 --> 00:26:50,220 Disons défiler jusqu'à la première. 568 00:26:50,220 --> 00:26:55,070 >> Déclaration implicite de la fonction obtenir int positif est invalide en C99. 569 00:26:55,070 --> 00:26:57,780 C99 signifie simplement 1999 version du langage 570 00:26:57,780 --> 00:26:59,710 C, qui est ce que nous sommes en effet à l'aide. 571 00:26:59,710 --> 00:27:01,050 Alors qu'est-ce que cela signifie? 572 00:27:01,050 --> 00:27:05,250 Eh bien C-- et plus particulièrement C compilers-- sont des programmes assez stupides. 573 00:27:05,250 --> 00:27:07,420 Ils savent que ce que vous avez leur a dit, et c'est 574 00:27:07,420 --> 00:27:08,960 effectivement thématique de la semaine dernière. 575 00:27:08,960 --> 00:27:12,910 >> Le problème est que si je vais sur la mise en œuvre nom ici, 576 00:27:12,910 --> 00:27:17,640 et j'appelle une fonction appelée GetPositiveInt ici à la ligne 20, 577 00:27:17,640 --> 00:27:22,520 cette fonction n'est pas techniquement exister jusqu'à ce que le compilateur voit la ligne 27. 578 00:27:22,520 --> 00:27:25,450 Malheureusement, le compilateur est faire les choses haut, bas, gauche, droite, 579 00:27:25,450 --> 00:27:29,580 parce qu'il n'a pas vu le la mise en oeuvre de GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 mais il voit que vous essayez de l'utiliser ici, 581 00:27:32,400 --> 00:27:35,810 il va juste bail-- crier à vous avec une erreur Message-- peut-être 582 00:27:35,810 --> 00:27:38,440 cryptique, et pas vraiment compiler le fichier. 583 00:27:38,440 --> 00:27:41,940 >> Alors que l'on appelle un prototype jusqu'à ici est certes redondant. 584 00:27:41,940 --> 00:27:47,870 Littéralement, je suis ici et j'ai copié et collé, et je le mets ici. 585 00:27:47,870 --> 00:27:51,020 Void serait plus appropriée, nous allons donc littéralement copier et coller cette fois. 586 00:27:51,020 --> 00:27:52,854 J'ai littéralement copié et collé il. 587 00:27:52,854 --> 00:27:54,270 Vraiment juste que comme une miette de pain. 588 00:27:54,270 --> 00:27:56,260 >> Un peu d'indices sur le compilateur. 589 00:27:56,260 --> 00:27:58,860 Je ne sais pas ce que cela fait encore, mais je promet de vous 590 00:27:58,860 --> 00:28:00,260 qu'il existera un jour. 591 00:28:00,260 --> 00:28:04,010 Et c'est pourquoi ce line-- dans 16-- ligne se termine par un point-virgule. 592 00:28:04,010 --> 00:28:05,486 Il est redondant par conception. 593 00:28:05,486 --> 00:28:05,986 Oui? 594 00:28:05,986 --> 00:28:11,340 595 00:28:11,340 --> 00:28:14,360 >> Si vous n'avez pas de lier votre bibliothèque à the-- oh, bonne question. 596 00:28:14,360 --> 00:28:17,350 Forte comprend des inclusions de fichiers d'en-tête. 597 00:28:17,350 --> 00:28:20,040 Besoin de être-- devrait presque toujours au sommet 598 00:28:20,040 --> 00:28:23,270 du fichier pour un similar-- pour exactement la même raison, oui. 599 00:28:23,270 --> 00:28:26,430 Parce que dans la norme io.h est littéralement une ligne 600 00:28:26,430 --> 00:28:30,560 comme ça, mais avec le mot printf, et avec ses arguments et son type de retour. 601 00:28:30,560 --> 00:28:33,310 Et en faisant forte comprennent jusqu'à ici, ce que vous faites littéralement 602 00:28:33,310 --> 00:28:36,380 est un copier-coller le contenu de quelqu'un d'autre a écrit là-haut. 603 00:28:36,380 --> 00:28:39,660 Cluing ainsi votre code dans l' fait que ces fonctions existent. 604 00:28:39,660 --> 00:28:40,160 Ouais? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Absolument. 607 00:28:48,260 --> 00:28:51,690 Donc un très intelligent et correct solution serait, vous savez quoi? 608 00:28:51,690 --> 00:28:53,760 Je ne sais pas ce qu'est un prototype est, mais je sais 609 00:28:53,760 --> 00:28:56,390 si je comprends que C est juste muet et repense haut en bas. 610 00:28:56,390 --> 00:28:57,820 Eh bien nous allons lui donner ce qu'il veut. 611 00:28:57,820 --> 00:29:01,650 Coupons ce code, collez-le haut, et poussez maintenant principal en bas. 612 00:29:01,650 --> 00:29:03,470 Ce serait aussi régler le problème. 613 00:29:03,470 --> 00:29:07,409 >> Mais vous pouvez très facilement arriver à un scénario dans lequel un besoin d'appeler B, 614 00:29:07,409 --> 00:29:10,075 et peut-être B rappelle à A. Cette est quelque chose qui s'appelle la récursivité, 615 00:29:10,075 --> 00:29:11,370 et nous reviendrons à cela. 616 00:29:11,370 --> 00:29:13,911 Et il peut ou peut ne pas être un bon chose, mais vous pouvez certainement 617 00:29:13,911 --> 00:29:15,110 briser cette solution. 618 00:29:15,110 --> 00:29:17,690 >> Et d'ailleurs, je le ferais réclamer stylistique, 619 00:29:17,690 --> 00:29:20,760 surtout quand vos programmes devenir cette longue et ce depuis longtemps, 620 00:29:20,760 --> 00:29:23,064 c'est juste super pratique de mettre principal en haut 621 00:29:23,064 --> 00:29:25,730 parce que c'est la chose la plus programmeurs vont se soucier. 622 00:29:25,730 --> 00:29:28,150 Et donc c'est un peu plus propre, sans doute, à faire de la manière 623 00:29:28,150 --> 00:29:30,380 Je l'ai fait à l'origine avec un même prototype 624 00:29:30,380 --> 00:29:33,396 mais il semble un peu redondant à première vue. 625 00:29:33,396 --> 00:29:33,895 Ouais? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Désolé, pouvez-vous dire plus fort? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Si vous changez l'emplacement de la mise en œuvre et le prototype? 630 00:29:49,580 --> 00:29:51,270 Donc, c'est une bonne question. 631 00:29:51,270 --> 00:29:53,780 Si vous re-déclarer ce bas ici, nous allons voir ce qui se passe. 632 00:29:53,780 --> 00:29:55,530 Donc, si je mets cela sur le ici, vous dites. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Oh, désolé. 635 00:29:58,360 --> 00:29:58,859 Plus fort? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Encore plus fort. 638 00:30:04,011 --> 00:30:04,760 Oh, bonne question. 639 00:30:04,760 --> 00:30:05,860 Serait-il invalider la fonction? 640 00:30:05,860 --> 00:30:08,901 Vous savez, après toutes ces années, je n'ont jamais mis un prototype après. 641 00:30:08,901 --> 00:30:13,810 Alors, faisons faire fonctionner-1 après avoir fait cela. 642 00:30:13,810 --> 00:30:15,279 >> [Murmurant] 643 00:30:15,279 --> 00:30:16,320 DAVID J. Malan: Oh, attendez. 644 00:30:16,320 --> 00:30:17,944 Nous avons encore à mettre tout en haut. 645 00:30:17,944 --> 00:30:21,400 Donc, nous allons le faire ici, si je suis comprendre votre question. 646 00:30:21,400 --> 00:30:24,700 Je suis tout mettre, y compris le prototype principale au-dessus, 647 00:30:24,700 --> 00:30:28,180 mais je suis en train de le prototype la mise en oeuvre ci-dessous. 648 00:30:28,180 --> 00:30:33,190 >> Donc, si je fais un, je suis en train de retour un error-- utilisé variable n. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Oh, là-bas. 651 00:30:37,860 --> 00:30:38,360 Merci. 652 00:30:38,360 --> 00:30:39,430 Voyons, nous nous débarrassons de cette. 653 00:30:39,430 --> 00:30:41,304 C'est un bug différente, nous allons donc l'ignorer. 654 00:30:41,304 --> 00:30:43,910 Disons très rapidement ce remake. 655 00:30:43,910 --> 00:30:48,100 >> OK, donc argument ne de données utilisée par String format 656 00:30:48,100 --> 00:30:52,310 n-- oh, c'est parce que J'ai changé à ces ici. 657 00:30:52,310 --> 00:30:55,885 Très bien, nous savons ce que la réponse va to-- bien, nous y voilà. 658 00:30:55,885 --> 00:31:00,560 Ah, merci pour le positif. 659 00:31:00,560 --> 00:31:03,430 Très bien, je vais fixer ce code after-- ignorer ce bug particulier 660 00:31:03,430 --> 00:31:08,300 depuis ce était-- cela fonctionne est la réponse. 661 00:31:08,300 --> 00:31:11,560 >> Donc, il ne remplace pas ce que vous venez de faire. 662 00:31:11,560 --> 00:31:14,800 Je soupçonne que le compilateur est écrite de manière à 663 00:31:14,800 --> 00:31:18,420 qu'il ne tient pas compte de votre prototype parce que le corps, pour ainsi dire, 664 00:31:18,420 --> 00:31:20,922 de la fonction a déjà été mis en place plus haut. 665 00:31:20,922 --> 00:31:23,380 Je dois consulter effectivement le manuel du compilateur 666 00:31:23,380 --> 00:31:26,171 de comprendre s'il ya un autre implication, mais à première vue 667 00:31:26,171 --> 00:31:29,290 juste en essayant et en expérimentant, il semble y avoir aucun impact. 668 00:31:29,290 --> 00:31:30,730 Bonne question. 669 00:31:30,730 --> 00:31:33,660 >> Donc, nous allons maintenant vont de l'avant, se déplaçant l'écart des effets secondaires qui 670 00:31:33,660 --> 00:31:36,660 sont des fonctions qui font quelque chose comme visuellement sur l'écran avec printf, 671 00:31:36,660 --> 00:31:38,090 mais ne pas retourner une valeur. 672 00:31:38,090 --> 00:31:41,550 Et les fonctions qui ont le retour des valeurs telles que nous venons de voir quelques-uns des. 673 00:31:41,550 --> 00:31:45,350 Nous avons déjà vu cette notion de champ, et nous verrons encore et encore. 674 00:31:45,350 --> 00:31:47,210 Mais pour l'instant, encore une fois, utiliser la règle de base 675 00:31:47,210 --> 00:31:51,410 une variable qui ne peut être utilisé l'intérieur de la plus récemment ouverte 676 00:31:51,410 --> 00:31:54,350 et accolades fermées que nous vu dans cet exemple particulier. 677 00:31:54,350 --> 00:31:56,910 >> Et comme vous l'avez souligné, il existe une ability-- 678 00:31:56,910 --> 00:32:00,040 vous pouvez résoudre certains de ces problèmes en mettant une variable globalement 679 00:32:00,040 --> 00:32:01,290 au sommet d'un fichier. 680 00:32:01,290 --> 00:32:03,630 Mais dans presque tous les cas nous désapprouvent que, 681 00:32:03,630 --> 00:32:06,170 et en effet même pas aller dans cette solution pour l'instant. 682 00:32:06,170 --> 00:32:09,890 Donc pour l'instant, les plats à emporter est que variables ont cette notion de portée. 683 00:32:09,890 --> 00:32:13,430 >> Mais maintenant, regardons un autre voie sèche de fait la recherche 684 00:32:13,430 --> 00:32:15,810 à un très intéressant détails de mise en œuvre. 685 00:32:15,810 --> 00:32:17,810 Comment nous pourrions représenter l'information. 686 00:32:17,810 --> 00:32:20,370 Et nous avons déjà examiné cette dans la première semaine de la classe. 687 00:32:20,370 --> 00:32:23,320 En regardant les binaires, et nous rappelant décimal. 688 00:32:23,320 --> 00:32:28,310 >> Mais rappeler la semaine dernière que C a différents types de données et des grappes plus, 689 00:32:28,310 --> 00:32:30,600 mais les plus utiles pour l'instant peut-être ceux-ci. 690 00:32:30,600 --> 00:32:36,030 Un char, ou un personnage, ce qui arrive être un octet, ou huit morceaux au total. 691 00:32:36,030 --> 00:32:40,060 Et c'est-à-dire que la taille d'un caractère est juste un octet. 692 00:32:40,060 --> 00:32:45,370 Un octet est huit bits, donc cela signifie que nous pouvons représenter le nombre de caractères. 693 00:32:45,370 --> 00:32:47,320 Combien de lettres ou symboles sur le clavier 694 00:32:47,320 --> 00:32:49,210 si nous avons un octet ou huit bits. 695 00:32:49,210 --> 00:32:51,546 Pensez à la semaine zéro. 696 00:32:51,546 --> 00:32:53,420 Si vous avez huit bits, le nombre de valeurs totales 697 00:32:53,420 --> 00:32:55,503 pouvez vous représenter avec modèles de zéros et de uns? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 One-- plus que cela. 700 00:33:00,260 --> 00:33:03,490 Donc, 256 au total si vous commencer à compter à partir de zéro. 701 00:33:03,490 --> 00:33:07,120 Donc si vous avez huit bits-- si nous eu nos ampoules binaires ici encore, 702 00:33:07,120 --> 00:33:12,180 nous pourrions transformer ces ampoules sur et dans n'importe quelle de 256 modèles uniques. 703 00:33:12,180 --> 00:33:13,640 >> Maintenant, c'est un peu problématique. 704 00:33:13,640 --> 00:33:16,857 Pas tellement pour l'anglais et langues romanes, mais certainement 705 00:33:16,857 --> 00:33:19,190 lorsque vous introduisez, par exemple, les langues asiatiques, qui 706 00:33:19,190 --> 00:33:22,580 ont beaucoup plus de symboles que comme 26 lettres de l'alphabet. 707 00:33:22,580 --> 00:33:24,390 Nous pourrions réellement besoin plus d'un octet. 708 00:33:24,390 --> 00:33:28,240 Et heureusement dans dernières années a la société 709 00:33:28,240 --> 00:33:31,040 adopté d'autres normes qui utilisent plus d'un octet par charge. 710 00:33:31,040 --> 00:33:34,210 >> Mais pour l'instant en C, la valeur par défaut est juste un octet ou huit bits. 711 00:33:34,210 --> 00:33:38,195 Un entier, quant à lui, est de quatre octets, autrement connu comme 32 bits. 712 00:33:38,195 --> 00:33:41,320 Ce qui veut dire que c'est le plus grand possible nombre que nous pouvons représenter avec un int 713 00:33:41,320 --> 00:33:41,820 apparemment? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Avec un milliard. 716 00:33:45,050 --> 00:33:46,760 Donc, c'est quatre milliards donner ou prendre. 717 00:33:46,760 --> 00:33:49,840 2 à la puissance 32 e, si l'on assumer aucun des nombres négatifs 718 00:33:49,840 --> 00:33:52,530 et il suffit d'utiliser tous positifs numéros, c'est quatre milliards 719 00:33:52,530 --> 00:33:53,730 donner ou prendre possibilités. 720 00:33:53,730 --> 00:33:57,890 Un flotteur, quant à lui, est un type différent de type de données en C. Il est encore un certain nombre, 721 00:33:57,890 --> 00:33:58,990 mais c'est un nombre réel. 722 00:33:58,990 --> 00:34:00,660 Quelque chose avec une virgule. 723 00:34:00,660 --> 00:34:03,000 Et il se trouve que C utilise également quatre octets 724 00:34:03,000 --> 00:34:05,340 pour représenter valeurs à virgule flottante. 725 00:34:05,340 --> 00:34:09,420 >> Malheureusement, le nombre variable valeurs de points sont là dans le monde? 726 00:34:09,420 --> 00:34:11,582 Combien de nombres réels sont là? 727 00:34:11,582 --> 00:34:13,540 Il ya une infinie nombre, et pour que la matière 728 00:34:13,540 --> 00:34:15,164 il ya un nombre infini de nombres entiers. 729 00:34:15,164 --> 00:34:18,070 Nous sommes donc déjà une sorte de nous creuser un trou ici. 730 00:34:18,070 --> 00:34:21,780 Lequel apparemment computers-- à moins des programmes écrits en C sur eux-- 731 00:34:21,780 --> 00:34:24,110 ne peut compter jusqu'à quatre milliards donner ou prendre, 732 00:34:24,110 --> 00:34:26,260 et valeurs à virgule flottante ne peut apparemment 733 00:34:26,260 --> 00:34:28,330 avoir une certaine quantité finie de précision. 734 00:34:28,330 --> 00:34:30,810 Seuls tant de chiffres après leur point décimal. 735 00:34:30,810 --> 00:34:32,822 >> Car, bien entendu, si il suffit de 32 bits, 736 00:34:32,822 --> 00:34:36,030 Je ne sais pas comment nous allons aller sur représentant réel numbers-- probablement 737 00:34:36,030 --> 00:34:37,409 avec différents types de motifs. 738 00:34:37,409 --> 00:34:40,030 Mais il ya sûrement un fini nombre de ces modèles, 739 00:34:40,030 --> 00:34:41,830 si, ici aussi, ce qui est problématique. 740 00:34:41,830 --> 00:34:43,710 >> Maintenant, nous pouvons éviter un peu le problème. 741 00:34:43,710 --> 00:34:45,710 Si vous n'utilisez pas un flotteur, vous pouvez utiliser une double 742 00:34:45,710 --> 00:34:50,230 en C, qui vous donne huit octets, ce qui est modes possibles de façon plus zéros 743 00:34:50,230 --> 00:34:50,730 et ceux. 744 00:34:50,730 --> 00:34:55,199 Mais c'est encore fini, qui va être problématique si vous écrivez un logiciel 745 00:34:55,199 --> 00:34:57,670 pour les graphiques ou de fantaisie formules mathématiques. 746 00:34:57,670 --> 00:35:00,410 Donc, vous pourriez effectivement vouloir de compter plus que cela. 747 00:35:00,410 --> 00:35:05,640 Un named-- longue long-- bêtement est également de huit octets, soit 64 bits, 748 00:35:05,640 --> 00:35:10,260 et c'est deux fois plus longtemps que un int, et c'est pour une valeur de type Entier long. 749 00:35:10,260 --> 00:35:15,655 >> Fact-- amusant si un int est de quatre octets, combien de temps est un long en C habituellement? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 Également quatre octets, mais un est longue longue de huit octets, 752 00:35:21,560 --> 00:35:23,050 et ce, pour des raisons historiques. 753 00:35:23,050 --> 00:35:26,450 >> Mais les plats à emporter maintenant est juste que les données a 754 00:35:26,450 --> 00:35:29,625 d'être représenté dans un computer-- c'est un dispositif physique de l'électricité, 755 00:35:29,625 --> 00:35:32,190 il est généralement conduite ces zéros et ones-- 756 00:35:32,190 --> 00:35:34,320 avec une quantité limitée de précision. 757 00:35:34,320 --> 00:35:35,620 Alors, quel est le problème alors? 758 00:35:35,620 --> 00:35:37,480 >> Eh bien il ya un problème de débordement entier. 759 00:35:37,480 --> 00:35:39,780 Pas seulement dans C, mais dans ordinateurs en général. 760 00:35:39,780 --> 00:35:42,590 Par exemple, si ce vaut un octet un bit-- 761 00:35:42,590 --> 00:35:45,120 donc si c'est huit bit-- tous qui sont le numéro un. 762 00:35:45,120 --> 00:35:47,300 Quel est ce numéro représentant si nous supposons 763 00:35:47,300 --> 00:35:50,730 c'est toutes les valeurs positives en binaire? 764 00:35:50,730 --> 00:35:54,410 >> 255, et ce n'est pas 256, car zéro est le nombre le plus faible. 765 00:35:54,410 --> 00:35:56,760 Donc, 255 est le plus élevé une, mais le problème 766 00:35:56,760 --> 00:36:00,330 est suppose que je voulais incrémenter cette variable que 767 00:36:00,330 --> 00:36:04,030 utilise huit bits au total si je veux l'incrémenter. 768 00:36:04,030 --> 00:36:07,160 >> Eh bien dès que j'ajoute un une pour l'ensemble de ceux-ci, 769 00:36:07,160 --> 00:36:10,500 vous pouvez peut-être imaginer visually-- juste comme porter une aide decimals-- 770 00:36:10,500 --> 00:36:12,300 quelque chose va s'écouler vers la gauche. 771 00:36:12,300 --> 00:36:15,590 Et en effet, si j'ajoute le nombre un de cela, ce qui se passe en binaire 772 00:36:15,590 --> 00:36:17,670 c'est qu'il déborde à zéro. 773 00:36:17,670 --> 00:36:21,730 >> Donc, si vous use-- non seulement un int, mais un seul octet de compter entiers 774 00:36:21,730 --> 00:36:27,170 dans un programme, par default-- dès vous arrivez à 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 vient après 255, qui n'est probablement pas ce que 776 00:36:32,710 --> 00:36:34,790 un utilisateur va attendre. 777 00:36:34,790 --> 00:36:39,620 >> Maintenant, quant à lui en virgule flottante monde, vous avez aussi un problème similaire. 778 00:36:39,620 --> 00:36:42,670 Pas tellement avec le plus grand number-- bien que ce soit toujours un problème. 779 00:36:42,670 --> 00:36:45,360 Mais avec précision la quantité d' que vous pouvez représenter. 780 00:36:45,360 --> 00:36:49,490 Donc, nous allons jeter un oeil à cet exemple ici aussi de la source de code-- d'aujourd'hui 781 00:36:49,490 --> 00:36:52,070 float-0.c. 782 00:36:52,070 --> 00:36:54,280 >> Et remarquez que c'est une super- programme simple qui 783 00:36:54,280 --> 00:36:56,580 devrait apparemment imprimer ce que la valeur? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 Qu'est-ce que vous pariez que cela va imprimer même si il ya un peu de nouvelle syntaxe 786 00:37:04,110 --> 00:37:05,540 ici? 787 00:37:05,540 --> 00:37:06,700 Donc, j'espère que 0,1. 788 00:37:06,700 --> 00:37:10,000 Ainsi, l'équivalent d'un dixième parce que je fais 1 divisé par 10. 789 00:37:10,000 --> 00:37:12,430 Je suis le stockage, la réponse dans une variable appelée f. 790 00:37:12,430 --> 00:37:15,850 Cette variable est du type float, qui est un mot-clé que je viens de proposer existait. 791 00:37:15,850 --> 00:37:18,910 >> Nous n'avons pas vu cela avant, mais c'est une sorte de belle façon dans printf 792 00:37:18,910 --> 00:37:22,110 de préciser le nombre de chiffres que vous veulent voir après une virgule. 793 00:37:22,110 --> 00:37:25,020 Donc, cette notation signifie simplement que voici un espace réservé. 794 00:37:25,020 --> 00:37:27,900 C'est un point flottant valeur, et oh, au fait, 795 00:37:27,900 --> 00:37:31,389 montrez-la avec le point décimal un nombre après la virgule. 796 00:37:31,389 --> 00:37:33,180 Donc, c'est le nombre de chiffres significatifs, 797 00:37:33,180 --> 00:37:34,650 pour ainsi dire, que vous voudrez peut-être. 798 00:37:34,650 --> 00:37:40,450 >> Alors laissez-moi aller de l'avant et faire faire flotteur-0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 et apparemment 1 divisé par 10 est de 0,0. 800 00:37:46,660 --> 00:37:47,760 Maintenant, pourquoi est-ce? 801 00:37:47,760 --> 00:37:51,380 >> Eh bien encore une fois, l'ordinateur prend m'a littéralement, et j'ai écrit une 802 00:37:51,380 --> 00:37:56,680 et je écrit 10, et de prendre une conjecture ce est le type de données pris pour les deux 803 00:37:56,680 --> 00:37:58,440 valeurs? 804 00:37:58,440 --> 00:38:00,970 Un int, c'est techniquement quelque chose d'un peu différent. 805 00:38:00,970 --> 00:38:04,150 C'est généralement une longue, mais c'est en fin de compte une valeur entière. 806 00:38:04,150 --> 00:38:06,030 Pas une valeur en virgule flottante. 807 00:38:06,030 --> 00:38:09,456 >> Qui consiste à dire que si ce est un int, ce qui est un int, 808 00:38:09,456 --> 00:38:11,830 le problème est que l'ordinateur ne pas avoir la capacité 809 00:38:11,830 --> 00:38:13,680 même pour stocker ce point décimal. 810 00:38:13,680 --> 00:38:16,430 Ainsi, lorsque vous faites 1 divisé par 10 à l'aide de nombres entiers 811 00:38:16,430 --> 00:38:20,950 à la fois le numérateur et le dénominateur, la réponse devrait être de 0,1. 812 00:38:20,950 --> 00:38:24,930 Mais parce que la computer-- ce sont integers-- 813 00:38:24,930 --> 00:38:27,430 ne sait pas quoi faire avec la 0.1. 814 00:38:27,430 --> 00:38:30,010 >> Alors que fait-il clairement? 815 00:38:30,010 --> 00:38:33,120 C'est juste le jeter, et ce que je vois en fin de compte 816 00:38:33,120 --> 00:38:38,830 est de 0,0 seulement parce que j'ai insisté pour que printf me montrer une décimale. 817 00:38:38,830 --> 00:38:41,740 Mais le problème est que si vous diviser un nombre entier par un nombre entier, 818 00:38:41,740 --> 00:38:44,347 vous get-- par définition de c-- un entier. 819 00:38:44,347 --> 00:38:46,680 Et ça ne va pas le faire quelque chose de gentil et pratique 820 00:38:46,680 --> 00:38:49,040 comme autour de lui jusqu'à la plus proche ou vers le bas. 821 00:38:49,040 --> 00:38:51,860 Il va tronquer tout après la virgule. 822 00:38:51,860 --> 00:38:54,030 >> Il suffit donc de manière intuitive, ce qui est probablement une solution? 823 00:38:54,030 --> 00:38:55,351 Quelle est la solution la plus simple ici? 824 00:38:55,351 --> 00:38:55,850 Ouais? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Exactement. 827 00:39:01,100 --> 00:39:04,200 Pourquoi ne traitons pas ces derniers comme valeurs à virgule flottante efficace 828 00:39:04,200 --> 00:39:05,860 les transformant en des flotteurs ou des doubles. 829 00:39:05,860 --> 00:39:10,500 Et maintenant, si je fais fabriquer des flotteurs-0, ou si je compile flotteurs-1, 830 00:39:10,500 --> 00:39:12,570 qui est identique à ce qui a été tout simplement proposé. 831 00:39:12,570 --> 00:39:16,400 Et maintenant, je fais des flotteurs-0, maintenant je reçois ma 0,1. 832 00:39:16,400 --> 00:39:17,234 >> Maintenant, c'est incroyable. 833 00:39:17,234 --> 00:39:19,441 Mais maintenant, je vais faire quelque chose d'un peu différent. 834 00:39:19,441 --> 00:39:22,280 Je suis curieux de voir ce qui est vraiment passe sous le capot, 835 00:39:22,280 --> 00:39:26,050 et je vais imprimer cette à 28 décimales. 836 00:39:26,050 --> 00:39:29,730 Je veux vraiment voir 0.1000-- un infinite-- 837 00:39:29,730 --> 00:39:32,710 [Inaudible] 27 zéros après que 0,1. 838 00:39:32,710 --> 00:39:34,740 >> Eh bien, voyons si c'est ce que je reçois en effet. 839 00:39:34,740 --> 00:39:39,430 Fabriquer des flotteurs-0 même fichier. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Voyons un zoom avant sur la réponse dramatique. 842 00:39:44,380 --> 00:39:49,980 Pendant tout ce temps, vous avez été de penser 1 est divisé par 10 à 10%, ou 0,1. 843 00:39:49,980 --> 00:39:50,810 Ce n'est pas. 844 00:39:50,810 --> 00:39:53,210 Au moins pour autant que le ordinateur de cause. 845 00:39:53,210 --> 00:39:57,060 >> Maintenant pourquoi-- OK, c'est complet mensonge 1 divisé par 10 est de 0,1. 846 00:39:57,060 --> 00:39:59,710 Mais ce n'est pas pourquoi-- l'emporter aujourd'hui. 847 00:39:59,710 --> 00:40:04,010 Alors, pourquoi ne l'ordinateur pense, contrairement à nous tous dans la salle, 848 00:40:04,010 --> 00:40:06,870 1 qui est divisé par 10 effectivement cette valeur fou? 849 00:40:06,870 --> 00:40:10,620 Quel est l'ordinateur faisant apparemment? 850 00:40:10,620 --> 00:40:12,490 Qu'est ce que c'est? 851 00:40:12,490 --> 00:40:13,785 >> Ce n'est pas déborder, en soi. 852 00:40:13,785 --> 00:40:15,910 Overflow est généralement lorsque vous enroulez autour d'une valeur. 853 00:40:15,910 --> 00:40:18,970 C'est cette question de l'imprécision en une valeur à virgule flottante 854 00:40:18,970 --> 00:40:22,220 où vous avez seulement 32 ou peut-être même 64 bits. 855 00:40:22,220 --> 00:40:25,230 Mais s'il ya un infini nombre de biens numbers-- 856 00:40:25,230 --> 00:40:27,940 nombres avec décimales et numéros thereafter-- sûrement 857 00:40:27,940 --> 00:40:29,380 vous ne pouvez pas représenter l'ensemble d'entre eux. 858 00:40:29,380 --> 00:40:32,870 Donc, l'ordinateur a donné nous le match le plus proche 859 00:40:32,870 --> 00:40:37,090 la valeur de ce que peut représenter à l'aide le nombre de bits à la valeur que je veux réellement, 860 00:40:37,090 --> 00:40:38,690 qui est de 0,1. 861 00:40:38,690 --> 00:40:40,685 >> Malheureusement, si vous commencer à faire des mathématiques, ou vous 862 00:40:40,685 --> 00:40:44,360 commencer impliquant ces types de variable des valeurs de point en programs-- importante 863 00:40:44,360 --> 00:40:46,770 logiciel de gestion financière, tout militaire software-- 864 00:40:46,770 --> 00:40:49,090 où la perception est probablement assez important. 865 00:40:49,090 --> 00:40:51,520 Et vous commencez à ajouter de tels chiffres, et début 866 00:40:51,520 --> 00:40:54,050 exécutant le logiciel avec de très grandes entrées 867 00:40:54,050 --> 00:40:56,890 ou pour beaucoup d'heures ou de lots de jours ou de nombreuses années, 868 00:40:56,890 --> 00:41:01,060 ces minuscules petites erreurs ne peut certainement ajouter au fil du temps. 869 00:41:01,060 --> 00:41:04,252 >> Maintenant, en passant, si vous avez jamais vu Superman 3 ou espace de bureau 870 00:41:04,252 --> 00:41:05,960 et vous pourriez rappeler comment ces gars ont volé 871 00:41:05,960 --> 00:41:08,668 beaucoup d'argent à partir de leur ordinateur en utilisant des valeurs flottantes 872 00:41:08,668 --> 00:41:11,290 et en additionnant le petit restes, je l'espère ce film 873 00:41:11,290 --> 00:41:12,390 fait maintenant plus de sens. 874 00:41:12,390 --> 00:41:14,930 C'est ce qu'ils étaient faisant allusion à ce film. 875 00:41:14,930 --> 00:41:16,710 Le fait que la plupart entreprises ne seraient pas regarder 876 00:41:16,710 --> 00:41:18,600 après un certain nombre de décimales, 877 00:41:18,600 --> 00:41:20,009 mais ce sont des fractions de cents. 878 00:41:20,009 --> 00:41:22,550 Alors que vous commencez à les additionner, vous commencez à faire beaucoup d'argent 879 00:41:22,550 --> 00:41:23,424 dans votre compte bancaire. 880 00:41:23,424 --> 00:41:25,160 Voilà Office Space expliqué. 881 00:41:25,160 --> 00:41:28,220 >> Maintenant, malheureusement, au-delà Office Space, il 882 00:41:28,220 --> 00:41:31,794 sont quelques-uns légitimement troublant et des impacts significatifs 883 00:41:31,794 --> 00:41:33,710 de ces types de les décisions de conception sous-jacents, 884 00:41:33,710 --> 00:41:35,990 et en effet l'une des raisons C on utilise dans le cadre 885 00:41:35,990 --> 00:41:39,640 est que vous avez vraiment ce motif jusqu'à la compréhension de la façon dont les ordinateurs fonctionnent, 886 00:41:39,640 --> 00:41:42,440 comment le logiciel fonctionne, et ne pas rien prendre pour acquis. 887 00:41:42,440 --> 00:41:45,820 >> Et en effet, malheureusement, même avec que la compréhension fondamentale, 888 00:41:45,820 --> 00:41:47,370 nous, les humains font des erreurs. 889 00:41:47,370 --> 00:41:51,310 Et ce que je pensais que je partage est ce huit minutes vidéo prise ici 890 00:41:51,310 --> 00:41:56,980 d'un épisode Modern Marvels, qui est un spectacle éducatif sur la façon dont les choses fonctionnent 891 00:41:56,980 --> 00:42:00,370 qui peint deux images quand une utilisation abusive 892 00:42:00,370 --> 00:42:02,540 et la compréhension de valeurs à virgule flottante 893 00:42:02,540 --> 00:42:05,610 conduit à une certaine significatif résultats malheureux. 894 00:42:05,610 --> 00:42:06,363 Jetons un coup d'oeil. 895 00:42:06,363 --> 00:42:07,029 [VIDEO LECTURE] 896 00:42:07,029 --> 00:42:11,290 -Nous Retournons maintenant à «Ingénierie Catastrophes "sur Modern Marvels. 897 00:42:11,290 --> 00:42:12,940 Ordinateurs. 898 00:42:12,940 --> 00:42:15,580 Nous avons tous appris à accepter la problèmes souvent frustrantes que 899 00:42:15,580 --> 00:42:20,960 obtenu avec eux-- bugs, virus, et glitches-- de logiciels pour les petits prix 900 00:42:20,960 --> 00:42:23,100 à payer pour la commodité. 901 00:42:23,100 --> 00:42:27,770 Mais dans la haute technologie et à haute vitesse applications programme spatial militaire et, 902 00:42:27,770 --> 00:42:32,780 le plus petit problème peut être agrandie en cas de catastrophe. 903 00:42:32,780 --> 00:42:38,880 >> Le 4 Juin 1996, les scientifiques préparés de lancer une fusée Ariane 5 sans pilote. 904 00:42:38,880 --> 00:42:41,190 Il transportait scientifique satellites conçu 905 00:42:41,190 --> 00:42:44,570 d'établir précisément comment l' Interagit de champ magnétique de la Terre 906 00:42:44,570 --> 00:42:47,380 avec des vents solaires. 907 00:42:47,380 --> 00:42:50,580 La fusée a été construit pour l'Agence spatiale européenne, 908 00:42:50,580 --> 00:42:54,400 et décollé de son installation sur la côte de la Guyane française. 909 00:42:54,400 --> 00:42:57,520 >> -Au Environ 37 secondes après le vol, ils ont d'abord 910 00:42:57,520 --> 00:42:59,070 quelque chose n'allait pas remarqué. 911 00:42:59,070 --> 00:43:02,240 Que les buses ont été pivotant d'une manière qu'ils ne devraient pas vraiment. 912 00:43:02,240 --> 00:43:06,550 Environ 40 secondes après le vol, clairement le véhicule était en difficulté, 913 00:43:06,550 --> 00:43:08,820 et c'est quand ils ont fait la décision de la détruire. 914 00:43:08,820 --> 00:43:12,370 L'agent de sécurité de gamme, avec énormes tripes, appuyé sur le bouton 915 00:43:12,370 --> 00:43:18,030 et fait exploser la fusée avant de pouvoir devenir un danger pour la sécurité publique. 916 00:43:18,030 --> 00:43:21,010 >> , Telle était la jeune fille voyage d'Ariane 5, 917 00:43:21,010 --> 00:43:23,920 et sa destruction a eu placer en raison de la faille 918 00:43:23,920 --> 00:43:25,932 intégré dans le logiciel de la fusée. 919 00:43:25,932 --> 00:43:27,640 -Le Problème sur le Ariane était qu'il n'y 920 00:43:27,640 --> 00:43:30,500 un nombre qui était nécessaire 64 bits pour exprimer, 921 00:43:30,500 --> 00:43:33,560 et qu'ils voulaient convertir pour un nombre de 16 bits. 922 00:43:33,560 --> 00:43:36,820 Ils ont supposé que le nombre n'a jamais été va être très grande. 923 00:43:36,820 --> 00:43:40,940 Que la plupart de ces chiffres dans le nombre 64 bits étaient zéros. 924 00:43:40,940 --> 00:43:42,450 Ils ont eu tort. 925 00:43:42,450 --> 00:43:45,000 >> -Le Une incapacité de logiciel pour accepter 926 00:43:45,000 --> 00:43:49,460 le genre de numéro généré par un autre était à l'origine de l'échec. 927 00:43:49,460 --> 00:43:54,260 Le développement de logiciels est devenu un partie très coûteux de la nouvelle technologie. 928 00:43:54,260 --> 00:43:57,060 La fusée Ariane 4 avait eu beaucoup de succès. 929 00:43:57,060 --> 00:44:01,600 Tant du logiciel créé pour il a également été utilisé dans le lanceur Ariane 5. 930 00:44:01,600 --> 00:44:04,790 >> -Le Problème fondamental était que le lanceur Ariane 5. 931 00:44:04,790 --> 00:44:11,200 A été faster-- accélérée plus rapidement, et le logiciel n'avait pas pris en compte pour cela. 932 00:44:11,200 --> 00:44:14,910 >> -Le Destruction de la fusée a été un énorme désastre financier. 933 00:44:14,910 --> 00:44:18,630 Tout en raison d'une erreur de logiciel minute. 934 00:44:18,630 --> 00:44:21,160 Mais ce n'était pas la première temps des problèmes de conversion de données 935 00:44:21,160 --> 00:44:24,770 avaient empoisonné la technologie moderne des fusées. 936 00:44:24,770 --> 00:44:28,020 >> -En 1991 avec le début de la première guerre du Golfe, 937 00:44:28,020 --> 00:44:30,540 le missile Patriot connu le même genre 938 00:44:30,540 --> 00:44:32,465 d'un problème de conversion de nombre. 939 00:44:32,465 --> 00:44:36,760 Et comme résultat 28 personnes-- 28 Soldiers-- américains ont été tués, 940 00:44:36,760 --> 00:44:39,010 et une centaine d'autres blessés. 941 00:44:39,010 --> 00:44:42,830 Lorsque le Patriot, qui devait pour se protéger contre les Scud entrants, 942 00:44:42,830 --> 00:44:45,780 pas tirer un missile. 943 00:44:45,780 --> 00:44:51,610 >> -Lorsque Irak a envahi le Koweït, et en Amérique lancé Tempête du désert au début de 1991, 944 00:44:51,610 --> 00:44:55,720 Batteries de missiles Patriot ont été déployés pour protéger l'Arabie Saoudite et Israël 945 00:44:55,720 --> 00:44:59,180 de irakiens attaques de missiles Scud. 946 00:44:59,180 --> 00:45:03,080 Le Patriot est un milieu de gamme des États-Unis sol-air système 947 00:45:03,080 --> 00:45:06,530 fabriqué par la société Raytheon. 948 00:45:06,530 --> 00:45:09,500 >> -La Taille du Patriot intercepteur elle s'est d' 949 00:45:09,500 --> 00:45:14,705 c'est sur environ 20 pieds de long, et il pèse environ 2000 livres. 950 00:45:14,705 --> 00:45:19,090 Et il porte une ogive d'environ, Je pense que c'est à peu près 150 livres. 951 00:45:19,090 --> 00:45:23,880 Et la tête elle-même est un explosif, qui 952 00:45:23,880 --> 00:45:26,700 a fragments autour de lui. 953 00:45:26,700 --> 00:45:31,630 Ainsi, l'enveloppe de la tête militaire est conçu pour agir comme une chevrotine. 954 00:45:31,630 --> 00:45:34,040 >> -Les Missiles sont effectuées quatre par conteneur, 955 00:45:34,040 --> 00:45:37,170 et sont transportés par un semi-remorque. 956 00:45:37,170 --> 00:45:44,880 >> -Le Système Patriot anti-missile remonte au moins 20 ans. 957 00:45:44,880 --> 00:45:48,380 Il a été conçu à l'origine comme un missile de défense aérienne 958 00:45:48,380 --> 00:45:50,810 d'abattre les avions ennemis. 959 00:45:50,810 --> 00:45:54,410 Dans la première guerre du Golfe quand cette guerre venue, 960 00:45:54,410 --> 00:45:59,650 l'armée voulait l'utiliser pour abattre des missiles Scud, pas des avions. 961 00:45:59,650 --> 00:46:03,580 L'armée de l'air irakienne était non pas tant d'un problème, 962 00:46:03,580 --> 00:46:06,590 mais l'armée était inquiet à propos de Scud. 963 00:46:06,590 --> 00:46:10,120 Et donc ils ont essayé de mettre à niveau le Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting Un ennemi missile se déplaçant à Mach 5 965 00:46:12,740 --> 00:46:15,670 allait être assez difficile. 966 00:46:15,670 --> 00:46:18,440 Mais quand le Patriot a été transporté en service, 967 00:46:18,440 --> 00:46:22,580 l'armée n'était pas au courant de une modification irakien 968 00:46:22,580 --> 00:46:25,880 fait leurs missiles Scud près impossible à elle. 969 00:46:25,880 --> 00:46:30,690 >> -Quel Qui s'est passé est que les Scuds venaient en étaient instables. 970 00:46:30,690 --> 00:46:32,000 Ils étaient bancal. 971 00:46:32,000 --> 00:46:37,210 La raison en était les Iraqis-- afin d'obtenir 600 kilomètres sur 972 00:46:37,210 --> 00:46:41,680 d'une gamme missile-- 300 kilomètres a pris du poids de l'ogive avant, 973 00:46:41,680 --> 00:46:43,340 et le fait ogive briquet. 974 00:46:43,340 --> 00:46:48,490 Alors maintenant, le Patriot essaie de venir au Scud, et plus de moment-- 975 00:46:48,490 --> 00:46:52,880 l'écrasante majorité de la time-- il serait tout simplement voler par le Scud. 976 00:46:52,880 --> 00:46:57,120 >> -once Les opérateurs du système Patriot réalisé le Patriot a raté sa cible, 977 00:46:57,120 --> 00:47:01,630 ils ont fait exploser la tête de la Patriot pour éviter les pertes éventuelles de son 978 00:47:01,630 --> 00:47:04,440 a été autorisé à tomber sur le sol. 979 00:47:04,440 --> 00:47:08,700 >> -Que C'était ce que la plupart des gens ont vu que les grandes boules de feu dans le ciel, 980 00:47:08,700 --> 00:47:14,180 et mal compris, comme interceptions d'ogives Scud. 981 00:47:14,180 --> 00:47:18,020 >> -Bien Dans le ciel de nuit, Patriots paru à détruire avec succès 982 00:47:18,020 --> 00:47:23,280 Scuds, à Dhahran il pourrait y avoir Ne vous méprenez pas sur ses performances. 983 00:47:23,280 --> 00:47:27,930 Il le système radar du Patriot perdu la trace d'un Scud entrant 984 00:47:27,930 --> 00:47:30,260 et jamais lancé en raison à un défaut de logiciel. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Ce sont les Israéliens qui découvrit le premier que plus le système était allumé, 987 00:47:38,880 --> 00:47:41,130 plus l'écart de temps est devenu. 988 00:47:41,130 --> 00:47:44,770 En raison d'une horloge incorporée dans l'ordinateur du système. 989 00:47:44,770 --> 00:47:48,190 >> -Environ Deux semaines avant la tragédie à Dhahran, 990 00:47:48,190 --> 00:47:50,720 les Israéliens ont déclaré à le ministère de la Défense 991 00:47:50,720 --> 00:47:52,410 que le système perdait du temps. 992 00:47:52,410 --> 00:47:54,410 Après environ huit heures de la course, ils ont remarqué 993 00:47:54,410 --> 00:47:57,690 que le système de devenir nettement moins précis. 994 00:47:57,690 --> 00:48:01,850 Le ministère de la Défense a répondu par dire toutes les batteries Patriot 995 00:48:01,850 --> 00:48:04,800 de ne pas laisser les systèmes pendant une longue période. 996 00:48:04,800 --> 00:48:06,980 Ils n'ont jamais dit ce qui était longtemps. 997 00:48:06,980 --> 00:48:09,140 8 heures, 10 heures, un millier d'heures. 998 00:48:09,140 --> 00:48:11,300 Personne ne savait. 999 00:48:11,300 --> 00:48:13,320 >> -Le Batterie Patriot stationnée à la caserne 1000 00:48:13,320 --> 00:48:18,310 à Dhahran et son imparfaite interne horloge avait été pendant plus de 100 heures 1001 00:48:18,310 --> 00:48:21,520 dans la nuit du 25 Février. 1002 00:48:21,520 --> 00:48:25,792 >> -Il Suivis temps avec une précision d'environ un dixième de seconde. 1003 00:48:25,792 --> 00:48:27,950 Maintenant, un dixième de seconde est un nombre intéressant 1004 00:48:27,950 --> 00:48:31,850 car il ne peut pas être exprimé exactement en binaire, qui 1005 00:48:31,850 --> 00:48:36,500 signifie qu'il ne peut pas être exprimée exactement dans un ordinateur numérique moderne. 1006 00:48:36,500 --> 00:48:41,070 C'est difficile à croire, mais l'utiliser comme un exemple. 1007 00:48:41,070 --> 00:48:43,420 >> Prenons le nombre d'un tiers. 1008 00:48:43,420 --> 00:48:47,330 Un tiers ne peut pas être exprimé en décimal exactement. 1009 00:48:47,330 --> 00:48:52,060 Un tiers est de 0,333 passe pour l'infini. 1010 00:48:52,060 --> 00:48:56,420 Il n'ya aucun moyen de le faire avec précision absolue d'un nombre décimal. 1011 00:48:56,420 --> 00:48:59,530 C'est exactement le genre de problème ce qui s'est passé dans le Patriot. 1012 00:48:59,530 --> 00:49:04,040 Plus le système a fonctionné, l' pire erreur de temps est devenue. 1013 00:49:04,040 --> 00:49:08,840 >> -Après 100 heures de fonctionnement, la erreur dans le temps n'était que d'environ un tiers 1014 00:49:08,840 --> 00:49:10,440 d'une seconde. 1015 00:49:10,440 --> 00:49:14,150 Mais en termes de ciblage d'un missile se déplaçant à Mach 5, 1016 00:49:14,150 --> 00:49:18,560 il a donné lieu à un suivi erreur de plus de 600 mètres. 1017 00:49:18,560 --> 00:49:21,870 Ce serait une erreur fatale pour les soldats à Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> -Quel Arrivé est un lancement Scud était détecté par les satellites d'alerte précoce, 1019 00:49:28,455 --> 00:49:32,710 et ils savaient un Scud venait dans leur direction générale. 1020 00:49:32,710 --> 00:49:35,150 Ils ne savaient pas d'où il venait. 1021 00:49:35,150 --> 00:49:38,210 Il appartient maintenant au radar composant du système Patriot 1022 00:49:38,210 --> 00:49:43,150 défendre Dhahran pour localiser et garder piste du missile ennemi entrant. 1023 00:49:43,150 --> 00:49:44,561 >> -Le Radar était très intelligent. 1024 00:49:44,561 --> 00:49:46,560 Il serait effectivement suivre la position de la Scud 1025 00:49:46,560 --> 00:49:48,930 puis prédire où il serait sans doute 1026 00:49:48,930 --> 00:49:51,380 la prochaine fois que l' radar envoyé une impulsion sur. 1027 00:49:51,380 --> 00:49:53,040 Cela s'appelait la porte de gamme. 1028 00:49:53,040 --> 00:49:57,620 >> -Ensuite Une fois que le Patriot décide de suffisamment de temps a 1029 00:49:57,620 --> 00:50:02,400 passé à revenir en arrière et vérifier la prochaine emplacement pour cet objet détecté 1030 00:50:02,400 --> 00:50:03,550 il remonte. 1031 00:50:03,550 --> 00:50:07,820 Alors, quand il est retourné à la mauvaise place, il voit alors sans objet. 1032 00:50:07,820 --> 00:50:10,360 Et il décide qu'il n'y a pas d'objet. 1033 00:50:10,360 --> 00:50:13,630 Qu'il y avait une fausse détection et il laisse tomber la piste. 1034 00:50:13,630 --> 00:50:16,970 >> -Le Entrant Scud disparu à partir de l'écran du radar, 1035 00:50:16,970 --> 00:50:20,200 et quelques secondes plus tard, il claqué dans les casernes. 1036 00:50:20,200 --> 00:50:22,570 Le Scud a tué 28. 1037 00:50:22,570 --> 00:50:26,110 Il a été le dernier feu au cours de la première guerre du Golfe. 1038 00:50:26,110 --> 00:50:31,920 Malheureusement, le logiciel mis à jour arrivé à l'aube du jour suivant. 1039 00:50:31,920 --> 00:50:34,870 La faille du logiciel avait été fixée, la fermeture 1040 00:50:34,870 --> 00:50:39,150 un chapitre dans la difficulté l'histoire du missile Patriot. 1041 00:50:39,150 --> 00:50:40,030 >> [FIN LECTURE VIDÉO] 1042 00:50:40,030 --> 00:50:41,488 >> DAVID J. Malan: C'est tout pour CS50. 1043 00:50:41,488 --> 00:50:42,820 Nous nous reverrons mercredi. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [MUSIQUE LECTURE] 1046 00:50:50,370 --> 00:54:23,446