[MUSIQUE LECTURE] DAVID J. Malan: Très bien. C'est CS50, et ce est le début de la deuxième semaine. Commençons donc aujourd'hui avec un bug. Un bogue, bien sûr, est un erreur dans un programme, et vous aurez très familiariser avec ce concept si vous n'avez jamais programmé avant. pset0 et maintenant pset1. Mais nous allons examiner quelque chose un peu simple au premier abord. Ce programme ici que je jeté ensemble à l'avance, et je prétends que cela devrait imprimer 10 étoiles sur l'écran en utilisant printf, mais il est apparemment bogué en quelque sorte. Compte tenu de cette description que il doit imprimer 10 étoiles, mais ce n'est pas apparemment, ce vous demander est le bug? Ouais? C'est donc à la sortie d'un erreur, et qu'est-ce que vous entendez par là? Dáccord. Excellente. Donc, nous avons spécifié un valeur de départ de zéro pour i, et nous avons spécifié une valeur de n de 10, mais nous avons utilisé inférieure ou égale à. Et la raison pour laquelle ce n'est deux personnages et pas seulement un symbole, comme dans un livre de mathématiques, c'est que vous n'avez pas un moyen d'exprimer l' un équivalent de caractères. Cela signifie donc que moins de, mais si vous commencez à compter à zéro, mais vous comptez tout le chemin à travers et égal à 10, vous êtes sûr d'aller à compter 11 choses au total. Et si vous allez imprimer 11 étoiles. Alors, que peut-être une solution pour cela? Ouais? Il suffit donc de régler le moins de ou égale à un peu moins que, et il ya, je prétends, peut-être une autre solution, aussi. Que pourriez-vous faire d'autre? Ouais? Donc, commencer à l'égaler à 1, et laisser le moins de ou égale à. Et franchement, je voudrais demander que, pour un être humain typique, c'est probablement plus simple. Commencez à compter à 1 et compter jusqu'à à 10. Essentiellement faites ce que vous voulez dire. Mais la réalité est en programmation, comme nous l'avons vu, des informaticiens et des programmeurs n'ont généralement commencer à compter à zéro. Et c'est très bien une fois vous y habituer. Votre état de santé général quelque chose comme moins. Donc, tout simplement une logique erreur que nous pourrions maintenant fixer et, finalement, recompiler ce et obtenir seulement 10. Eh bien que diriez-vous ce bug ici? Ici, encore une fois, je prétendre que je n'ai un objectif d'imprimer 10 stars-- un par ligne cette fois, mais il ne le fait pas. Avant que nous vous proposons ce le correctif est, qu'est ce que cela imprimer visuellement si je devais compiler et exécutez ce programme pensez-vous? Ouais? Étoiles. Donc, toutes les étoiles sur le même ligne est ce que j'ai entendu, puis le caractère de nouvelle ligne. Essayons donc que. Donc, assurez-poussette-1, entrer, et je vois la commande clang dont nous avons parlé la dernière fois. ./buggy-1, et en effet, je vois tous les 10 étoiles sur la même ligne, même si je prétends dans mon cahier simplement un commentaire au sommet le code que j'ai l'intention de faire un par ligne. Mais cela ressemble à droite. Maintenant, ligne 15, il semble que je suis l'impression d'une étoile, puis la ligne 16 on dirait que je suis impression un caractère de nouvelle ligne, et ils sont tous deux en retrait de sorte Je suis à l'intérieur de la boucle clairement. Donc, je ne devrais pas être en train de faire étoiles, nouvelle ligne, en étoile, nouvelle ligne, étoile, nouvelle ligne? Oui? Oui, contrairement à un langage comme Python, si vous êtes familier, indentation n'est pas d'importance à l'ordinateur. Il importe seulement de l'humain. Alors lignes alors qu'ici j'ai inventées 15 et 16-- qui est beau, mais l'ordinateur ne se soucie pas. L'ordinateur se soucie ayant fait des accolades autour de ces lignes de code. Alors que c'est clear-- comme dans Scratch-- que ces deux lignes de code doit être exécuté. Comme l'un de ceux jaune Scratch casse-tête morceaux encore et encore et encore. Alors maintenant, si je re-exécuter cette program-- ./buggy-2-- Hm. J'ai une erreur maintenant. Qu'est-ce que j'ai oublié de faire? Ouais, donc je n'ai pas le compiler. Donc, assurez-buggy 2. Aucun fichier parce que je n'ai pas effectivement compiler la deuxième version. Alors maintenant intéressant non déclaré variable-- pas 2. Nous faisons 1. Assurez-buggy 1-- ./buggy-1-- et maintenant chacun d'eux est sur la même ligne. Maintenant, il ya une exception à cette demande supposée de la mine que vous avez besoin de ces accolades. Quand est-il réellement OK-- si vous avez remarqué dans la section ou textbooks-- d'omettre les accolades? Ouais? Exactement. Quand il ya un seul ligne de code que vous vouloir être associé à la boucle comme dans notre premier exemple. Il est parfaitement légitime d'omettre les accolades comme une sorte de confort par le compilateur pour vous. Ouais? Bonne question. Serait-il être considéré comme une erreur de style? Nous aimerions promote-- comme dans CS50 guide de style, l'URL pour laquelle est toujours en pset1-- que utiliser les accolades. Certes, si vous êtes nouveau à la programmation. La réalité est que nous ne sommes pas vais vous interdire de faire ces commodités. Mais si vous êtes juste dans le swing des choses, absolument juste toujours utiliser le bouclés accolades jusqu'à ce que vous obtenez le coup de lui. Bonne question. Bien. Alors que était alors un bug. Au moins dans quelque chose d'assez simple. Et pourtant, vous pourriez penser que ce est assez rudimentaire, non? C'est en quelque sorte de la première semaine de la recherche à la langue comme, voir vos bogues y. Mais en réalité, il s'agit de réellement représentatives de certains problèmes assez effrayants qui peut survenir dans le monde réel. Donc, certains d'entre vous se rappellent peut- si vous suivez nouvelles tech, ou peut-être même pris vent de cette en Février de cette dernière année que Apple avait fait une petite erreur dans les deux iOS, le système d'exploitation leurs téléphones, et aussi Mac OS, le système d'exploitation sur leurs ordinateurs de bureau et ordinateurs portables. Et vous avez vu ces gros titres de ce genre. Et par la suite, Apple promis de corriger ce bug, et très vite fait le fixer dans iOS, mais en fin de compte fixe dans Mac OS ainsi. Maintenant, aucun de ces titres seul vraiment révéler ce que le problème sous-jacent était, mais le bug a finalement été réduit à un bogue dans SSL, Secure Sockets Layer. Et longue histoire courte, c'est le logiciel que nos navigateurs et autres logiciel utilisé pour faire quoi? Si je disais que le protocole SSL est participer, chaque fois que vous visiter une URL qui commence par HTTPS, qu'est-ce donc SSL pourrait être liée à? Chiffrement. Donc, nous allons parler de ce dans les prochains jours. Le cryptage, l'art de brouiller l'information. Mais bref, Apple il ya quelque temps avait fait une erreur dans leur mise en œuvre de SSL, la un logiciel qui met en oeuvre en fin de compte URL comme HTTPS ou max connexions là-bas aussi. Le résultat est que votre connexions pourrait potentiellement être interceptées. Et vos connexions étaient pas nécessairement chiffré si vous aviez un peu méchant entre vous et le site de destination qui a su profiter de cette. Maintenant, Apple a finalement publié Un correctif enfin, et la description de leur solution était présent. Transport en toute sécurité n'a pas réussi à valider l'authenticité de la connexion. La question a été abordée par restaurer manquants étapes de validation. Donc, c'est une explication ondulée de main très pour tout simplement dire que nous foiré. Il est littéralement un ligne de code qui était bogué dans leur mise en œuvre de SSL, et si vous allez en ligne et de recherche pour cette vous pouvez effectivement trouver le code source original. Par exemple, il s'agit d'une capture d'écran de juste une partie d'un fichier volumineux, mais il s'agit d'une fonction appelée apparemment SSL vérifier échange de clés de serveur d'abonnement. Et il faut un tas de arguments et des intrants. Et nous n'allons pas à se concentrer trop sur la minutie là, mais si vous vous concentrez sur le code à l'intérieur de la plus haute que nous allons function-- zoomer sur cela. Vous pouvez déjà soupçonner quelle erreur pourrait être même si vous n'avez aucune idée en fin de compte ce que vous cherchez à. Il ya une sorte d'anomalie ici, qui, c'est quoi? Ouais, je n'aime pas vraiment le regard de deux goto échoue. Franchement, je ne sais pas vraiment ce que goto l'échec des moyens, mais deux d'entre eux ayant dos à dos. Cela me frotte tout type de intellectuellement dans le mauvais sens, et même si on fait un zoom sur juste ces lignes, c'est C. Il ya donc beaucoup de code d'Apple est lui-même écrit en C, et ce, apparemment est vraiment equivalent-- pas à cette belle indentation version, mais si vous reconnaissez le fait qu'il n'y a pas d'accolades, ce Apple a vraiment écrit est un code qui ressemble comme ça. Donc j'ai zoomé sur et je viens fixe l'indentation dans le sens que s'il n'y a pas d'accolades, que deuxième goto ne c'est en jaune va exécuter n'importe quoi. Ce n'est pas associée à si la condition ci-dessus il. Ainsi, même encore, si vous n'avez pas tout à fait comprendre ce que cela pourrait peut-être être faire, sachez que chacun de ces conditions-- chacune de ces lignes est une étape très importante dans le processus de vérification si vos données sont en effet chiffré. Ainsi sautant un de ces étapes, pas la meilleure idée. Mais parce que nous avons ce deuxième goto échec en jaune, et parce qu'une fois que nous sorte de vue esthétique déplacez-le vers la gauche où il est logiquement à l'heure actuelle, ce ce que cela signifie pour la ligne de code ci-dessous que le deuxième goto échouez penseriez-vous? Il va toujours être ignorés. Donc goto sont généralement désapprouvés pour des raisons que nous ne serons pas vraiment aller dans, et même dans CS50 nous avons tendance pour enseigner cette déclaration goto, mais vous pouvez penser goto l'échec en ce sens vont saut dans une certaine autre partie du code. En d'autres termes sauter par-dessus cette dernière ligne tout à fait, et donc le résultat de cette stupide simple erreur qui était juste un résultat de probablement quelqu'un copier et coller un trop à plusieurs reprises, c'est que l'ensemble du la sécurité d'iOS et Mac OS était vulnérable à l'interception par les méchants pour un certain temps. Jusqu'à Apple a enfin résolu ce. Maintenant, si certains d'entre vous sont en fait courir les anciennes versions d'iOS ou Mac OS, vous pouvez aller à gotofail.com qui est un site web que quelqu'un a mis en place à déterminer essentiellement programme si votre ordinateur est toujours vulnérable. Et franchement, si c'est le cas, c'est probablement une bonne idée de mettre à jour votre téléphone ou votre Mac à ce point. Mais là, témoigne juste à quel point une appréciation de ces niveau inférieur détails et assez idées simples peuvent vraiment traduire dans les décisions et les problèmes que affected-- en ce case-- des millions de personnes. Maintenant un mot sur l'administration. Section va commencer ce dimanche. Vous recevrez un e-mail par le week-end sur la section, à quel point le processus de résection va commencer si vous avez réalisé que vous avez maintenant de nouveaux conflits. Donc ce qui se passe chaque année, et nous va accueillir dans les jours à venir. Bureau heures-- faire garder un oeil sur ce programme ici. Change un peu cette semaine, en particulier le temps de démarrage et l'emplacement, il ne faut consulter que avant de partir pour les heures de bureau l'un des quatre prochaines nuits. Et maintenant, un mot sur l'évaluation, d'autant plus que vous plongez dans problème établit un et au-delà. Donc, par la spécification, ceux-ci sont généralement les axes le long desquels nous évaluons votre travail. Champ d'application se réfère à ce mesure de vos outils de code les caractéristiques nécessaires par notre cahier des charges. En d'autres termes, la quantité de un ensemble de pièce avez-vous mordre. Avez-vous fait un tiers de lui, une moitié de celui-ci, 100% de celui-ci. Même si ce n'est pas correct, Combien avez-vous tenter? Alors que capte le niveau de l'effort et le montant à laquelle vous peu à l'écart les problèmes de jeu de problème. Correctness-- celui-ci, pour Dans quelle mesure, est votre code conforme à notre spécifications et exempts de bogues. Donc ça marche correctement? Si nous lui donnons une certaine entrée, n'est-ce nous donner la sortie que nous attendons? Design-- maintenant c'est la première de en particulier ceux qualitatives, ou celles qui exigent le jugement humain. Et en effet, c'est pourquoi nous avons un personnel de tant de boursiers de l'enseignement et de cours assistants. Dans quelle mesure votre code bien écrit? Et là encore, c'est une très évaluation qualitative qui va travailler avec vous sur bi-directionnelle dans les semaines à venir. De sorte que lorsque vous obtenez pas seulement les scores numériques, mais aussi un partitions écrites, ou des commentaires tapé, ou commentaires écrits à des mots anglais. C'est ce que nous allons utiliser pour vous conduire vers en train d'écrire un meilleur code. Et en cours et de l'article, nous essaierons signaler out-- aussi souvent que nous can-- ce qui fait un programme non seulement correct et fonctionnel bon, mais aussi bien conçu. Le plus efficace, il pourrait être, ou même la plus belle possible. Ce qui nous amène à un style. Le style est en fin de compte un jugement esthétique. Avez-vous choisi la bonne noms de vos variables? Avez-vous en retrait votre code correctement? Est-il l'air bien, et donc, est-il facile pour un autre être humain de lire votre correspondant de son exactitude. Maintenant, généralement par le programme, nous marquons ces choses sur une échelle de cinq points. Et permettez-moi de marteler le point que trois est vraiment bon. Faire très rapidement des gens commencer à faire le calcul. Quand ils obtiennent un sur trois cinq sur la justesse de certaines pset et ils pensent que putain, je vais à 60% qui est essentiellement un D ou un E. Ce n'est pas la façon dont nous penser de ces chiffres. A trois, c'est vraiment bon, et ce que nous s'attendre généralement au début du terme, c'est que si vous obtenez un tas de three's-- peut-être quelques des foires, un couple de fours-- ou quelques groupes de deux, un couple de fours-- c'est un bon endroit pour commencer. Et tant que nous voyons une trajectoire ascendante au fil du temps, vous êtes dans un endroit particulièrement bon. La formule que nous utilisons pour les choses de poids est essentiellement ce par le programme, qui signifie simplement que nous donner plus de poids à la décision correcte. Parce que c'est très souvent exactitude qui prend le plus de temps. Croyez-moi maintenant. Vous find-- au moins dans une pset-- que vous passer 90% de votre temps travailler sur 10% du problème. Et tout fonctionne sorte de sauf pour une ou deux des insectes, et ce sont les insectes qui vous garder jusqu'à tard dans la nuit. Ce sont ceux qui sorte de vous échapper. Mais après avoir dormi sur elle, ou pour assister à des heures de bureau ou poser des questions en ligne, est quand vous arrivez à cet objectif de 100%, et c'est pourquoi nous le poids décision correcte le plus. Concevoir un peu moins, et le style un peu moins que cela. Mais garder dans le style mind-- est peut-être le plus facile de ces derniers à mordre selon le guide de style. Et maintenant, un plus grave noter sur l'honnêteté académique. CS50 a la fâcheuse distinction de étant le plus grand producteur du Conseil de l'annonce cas presque chaque année historiquement. Ce n'est pas parce que les étudiants trichent CS50 pas plus que n'importe quelle autre classe, mais à cause de la nature du travail, le fait que c'est électronique, le fait que nous recherchons, et le fait que nous sommes des informaticiens, Je peux dire que nous ne sommes malheureusement très bon à détecter. Alors qu'est-ce que cela signifie concrètement? Donc il, par le programme, La philosophie de cours vraiment ne se résument à être raisonnable. Il est de cette ligne entre faire son travail sur votre propre et d'obtenir un peu de aide raisonnable à un ami, et carrément faire ce travail pour votre ami ou lui envoyer votre code afin qu'il ou elle ne peut tout simplement prendre ou emprunter sur la droite. Et qui traverse la ligne que nous attirés dans la classe. Voir le programme en fin de compte des lignes que nous tirons comme raisonnables et le comportement déraisonnable, mais il fait vraiment bouillir vers le bas à l'essence de votre travail besoin d' être votre propre à la fin. Maintenant, avec cela dit, il existe une heuristique. Parce que, comme vous pourriez imagine-- des heures de bureau et les visuels et les vidéos que nous avons montré CS50 ainsi far-- est en effet destiné à être aussi de collaboration et comme coopérative et sociale comme que possible. En collaboration car il est rigoureux. Mais cela dit, l'heuristique, comme vous le verrez dans le programme, c'est que lorsque vous rencontrez un problème. Vous avez un bug dans votre code que vous ne peut pas résoudre, il est raisonnable pour vous pour montrer votre code à quelqu'un d'autre. Un ami, même dans la classe, un ami assis à côté de vous à des heures de bureau, ou un membre du personnel. Mais ils ne peuvent pas montrer leur code pour vous. En d'autres termes, un répondre à votre question-- J'ai besoin help-- n'est pas oh, voici mon code. Jetez un oeil à ceci et en déduire ce que vous voulez. Maintenant, bien sûr, il ya de façon clairement au jeu ce système dans lequel je vais vous montrer mon code avant d'avoir une question. Vous me montrer mon code avant d'avoir une question. Mais revoir le programme pour la détails les plus fins de l'endroit où cette ligne est. Juste pour peindre maintenant l'image et partager de manière aussi transparente que possible où nous en sommes dans les dernières années, c'est le nombre de cas de la Commission Ad que CS50 a eu plus de les sept dernières années. Avec 14 cas cet automne la plus récente. En ce qui concerne les élèves concernés, il était de 20 certains élèves impairs l'automne dernier. Il y avait un pic de 33 étudiants il ya quelques années. Beaucoup d'entre eux sont malheureusement plus ici sur le campus. Les élèves qui participent en tant que pourcentage de la classe a toujours varié entre 0% à 5,3%, qui est seulement à dire c'est chaque année un défi. Et à cette fin, ce qui nous voulons faire est de transmettre un que nous dd-- juste FYI-- comparer à une équité pour les étudiants qui sont en suivant la ligne en conséquence. Nous faisons comparer courant arguments à l'encontre de toutes les missions passées des dernières années. Nous savons trop comment Google autour et trouver des dépôts de code en ligne, forums de discussion en ligne, sites d'emploi en ligne. Si un étudiant peut trouver, nous pouvons sûrement trouver autant que nous le faisons à regret. Donc, ce que vous verrez dans le programme si cette clause de regret. Je peux certainement apprécier, et nous avons tous a personnel ayant fait le cours comme ce, ou celui-ci au fil du temps lui-même, savez certainement ce que c'est comme quand la vie est dans la manière quand vous avez un soir tard deadline-- non seulement dans cette classe, mais another-- lorsque vous êtes complètement épuisé, stressé, avoir un nombre excessif d'autres choses à faire. Vous allez faire à un moment donné vie certainement une mauvaise, peut-être en retard décision de nuit. Donc, par le programme, il ya cette clause, de sorte que si dans les 72 heures suivant une certaine mauvaise décision, vous possédez à la hauteur et tendre la main à moi et un des chefs du cours et nous allons avoir une conversation. Nous allons gérer les choses interne dans l'espoir de celui-ci de plus en plus d'un moment d'enseignement ou une leçon de vie, et pas quelque chose avec ramifications particulièrement drastiques comme vous pouvez le voir sur ces cartes ici. C'est donc un ton très grave. Arrêtons-nous quelques-uns secondes pour briser la tension. [MUSIQUE LECTURE] DAVID J. Malan: Très bien, Alors, comment était-ce pour un enchaînement? Pour les sujets primaires d'aujourd'hui. Le premier est l'abstraction. Un autre de laquelle va être le représentation des données, ce qui, franchement est un moyen très sec de dire comment pouvons-nous aller sur la résolution de problèmes et la pensée de résoudre des problèmes? Donc, vous l'avez vu dans Scratch, et vous avez peut-être déjà vu dans pset1 C avec que non seulement vous pouvez utiliser fonctions, comme printf, que d'autres personnes dans dernières années a écrit pour vous. Vous pouvez aussi écrire vos propres fonctions. Et même si vous ne pourriez pas avoir fait dans C, et franchement dans pset1 vous n'avez pas vraiment besoin d'écrire votre propre fonction parce que le problem-- alors que peut-être intimidant au première glance-- vous verrez peut finalement être résolu avec pas tous que de nombreuses lignes de code. Mais cela dit, en termes d'écrire votre propre fonction, se rendre compte que C ne donne vous cette capacité. Je vais aller dans le code source d'aujourd'hui, qui est déjà disponible en ligne, et je vais aller de l'avant et ouvert un programme appelé fonction 0.C, et en fonction zéro nous allons voir quelques choses. Dans les premières lignes 18 à 23 est ma fonction principale. Et maintenant que nous commençons à lire code que nous ne sommes pas écrire à la volée, mais je l'ai écrit à l'avance ou que vous en définissez un problème pourrait recevoir ayant été écrit à l'avance. Une bonne façon de commencer lire le code de quelqu'un d'autre est de chercher la fonction principale. Figure où cette entrée Il s'agit de l'exécution du programme, et puis suivre logiquement à partir de là. Donc, ce programme apparemment impressions votre nom suivi de deux points. Nous utilisons ensuite GetString de la bibliothèque CS50 pour obtenir une chaîne, ou un mot ou une phrase à partir de l'utilisateur au clavier. Et puis il ya ce chose printNom ici--. Maintenant printNom n'est pas un fonction qui est livré avec C. Ce n'est pas dans la norme io.h. Ce n'est pas dans CS50.h. C'est un peu dans le même fichier. Remarquez si je défiler vers le bas une des lignes bit-- 25 à 27-- c'est juste une jolie manière de commenter votre code en utilisant les étoiles et les barres obliques. Il s'agit d'un multi-ligne commenter, et ce n'est que ma description en bleu de ce que cette fonction fait. Parce que dans les lignes 28 à 31, J'ai écrit une fonction super simple dont le nom est printNom. Il faut combien arguments diriez-vous? Donc un argument-- parce qu'il ya un l'argument figurant à l'intérieur des parenthèses. Le type de ce qui est String. Qui consiste à dire printNom est comme cette boîte noire ou une fonction qui prend en entrée une chaîne. Et le nom de cette chaîne commodément sera Nom. Pas S, pas N, sauf le nom. Alors qu'est-ce printNom faire? C'est bien simple. Tout comme une ligne de code pour printf, mais apparemment, il imprime "Bonjour," ceci et cela. Lorsque la untel vient de l'argument. Maintenant, ce n'est pas une énorme innovation ici. Vraiment, j'ai pris un programme qui pourrait ont été écrit avec une ligne de code en mettant ce ici, et changé pour quelque chose qui implique six ou sept ou si lignes de code tout en bas ici. Mais c'est la pratique de la principe connu sous le nom abstraction. Type d'encapsulation à l'intérieur d'une nouvelle fonction qui a un nom, et une meilleure encore ce nom littéralement dit ce qu'il fait. Je veux dire que ce n'est pas printf-- particulièrement descriptive. Si je veux créer un pièce du puzzle, ou si je vouloir créer une fonction qui imprime le nom de quelqu'un, la beauté de faire ce est ce que je peux effectivement donner cette fonction un nom qui décrit ce qu'il fait. Maintenant, il faut que dans une entrée J'ai arbitrairement appelé nom, mais c'est trop merveilleusement descriptif au lieu d'être un peu plus générique comme S. Et vide, pour l'instant, signifie simplement que cette fonction n'est pas main-moi quelque chose. Ce n'est pas comme GetString que me tend retour une chaîne littéralement comme nous l'avons fait avec les morceaux de papier avec vos camarades de classe la semaine dernière, mais il a seulement un effet secondaire. Elle imprime quelque chose à l'écran. Ainsi, à la fin de la journée, si je ne faire fonctionner-0, ./function-0, nous verrons qu'il me demande mon nom. Je tape David, et il types mon nom. Si je le fais à nouveau avec Rob, il va dire "Bonjour, Rob." Alors une idée simple, mais peut-être extrapoler à partir de ce mentaux que vos programmes se un peu plus compliqué, et vous voulez écrire un morceau de code et appel code-- invoke code-- que par certains descriptif nommer comme printNom, C fait nous permettre cette fonctionnalité. Voici un autre exemple simple. Par exemple, si j'ouvre une déposer de appelé aujourd'hui return.c, remarque ce que j'ai fait ici. La plupart de cette fonction principale est printf. J'ai d'abord initialiser arbitrairement une variable appelée x pour le numéro 2. J'ai ensuite imprimer "x est maintenant % I "en passant la valeur de x. Donc, je dis juste ce que c'est. Maintenant, je suis juste hardiment revendiquant la fonction printf. Je cubage cette valeur x, et je suis faire en appelant une fonction appelé passage de cube en x comme argument, et puis en enregistrant la sortie dans la variable elle-même, x. Je suis donc démolir la valeur de x. Je suis remplaçant la valeur de x avec ce le résultat de l'appel cette fonction de cube est. Et puis je viens d'imprimer une certaine trucs moelleux ici dire ce que j'ai fait. Alors, quel est alors le cube? Remarquez ce qui est fondamentalement différent ici. J'ai donné la fonction un nom comme avant. J'ai spécifié un nom d'un argument. Cette fois, il est appelé n au lieu du nom, mais je ne pouvais l'appeler ce que je veux. Mais c'est différent. Cette chose sur la gauche. Auparavant, il était ce mot? Garçons. Maintenant, il est de toute évidence int. Alors, quel est peut-être l'emporter? Considérant que signifie vides sorte de néant, et que c'était le cas. PrintNom n'a rien retourné. Il a fait quelque chose, mais il ne me remettait pas quelque chose que je pourrais mettre sur le gauche d'un signe égal comme je l'ai fait ici sur la ligne 22. Donc, si je dis dans la ligne 30, qu'est ce que c'est probablement ce qui implique sur ce cube fait pour moi? Ouais? Elle renvoie un entier. Donc, il me tend le dos, pour par exemple, un morceau de papier sur lequel il a écrit la réponse. 2 cubes, ou 3 cubes, ou 4 cubed-- ce que je passai, et comment ai-je mettre en œuvre ce? Eh bien, n fois n fois n comment je pourrais cube une valeur. Encore une fois, super simple idée, mais démonstratif maintenant comment nous pouvons écrire des fonctions qui nous a fait revenir valeurs qui pourraient être d'intérêt. Regardons un dernier exemple ici appelée fonction d'un. Dans cet exemple, on commence pour obtenir plus convaincant. Ainsi, dans une fonction, cette avis program-- finalement appelle une fonction appelée GetPositiveInt. GetPositiveInt n'est pas un fonction dans la bibliothèque CS50, mais nous, nous avons décidé aimerait qu'elle existe. Donc, si nous faisons défiler vers le bas plus tard dans le fichier, remarque que je suis allé sur la mise en œuvre obtenir int positif, et je dire que c'est plus convaincant parce que c'est un décent nombre de lignes de code. Ce n'est pas seulement un idiot petit programme de jouet. Il s'agit en fait obtenu la vérification d'erreur et faire quelque chose de plus utile. Donc, si vous n'avez pas vu la procédure pas à pas vidéos que nous avons intégrées dans pset1, sachez que c'est un type de boucle en C, dans le même esprit les sortes de choses Scratch peut faire. Et faire dit le faire. Imprimer cela. Alors allez-y et obtenir n-- obtenir un int et le stocker dans n, et continuer à le faire encore et encore et à nouveau, tant que n est inférieur à un. Alors n va être inférieur à un que si l'être humain est de ne pas coopérer. Si il ou elle est de taper en 0 ou -1 ou -50, cette boucle va continuer exécuter encore et encore. Et, finalement, remarque, je il suffit de retourner la valeur. Alors maintenant, nous avons une fonction ça aurait été sympa si CS50 mettrait en œuvre dans CS50.h et CS50.c pour vous, mais ici nous pouvons maintenant mettre en œuvre nous-mêmes. Mais deux remarques sur certains détails importants. One-- pourquoi ai-je déclare int n, pensez-vous, à la ligne 29 au lieu de simplement faire ce ici, ce qui est plus compatible avec ce que nous avons fait la semaine dernière? Ouais? Une bonne pensée. Donc, si nous devions mettre ici, c'est comme si nous garder déclarant encore et encore. Cela en soi est pas problématique, en soi, parce que nous ne devons la valeur une fois, puis nous allons obtenir un nouveau de toute façon. Mais une bonne pensée. Ouais? Fermer. Ainsi, parce que j'ai déclaré sur n ligne 29 à l'extérieur de la boucle, il est accessible tout au long de cette fonction entière. Pas les autres fonctions parce n est toujours à l'intérieur de ceux-ci bouclés accolades ici. So-- sûr. Exactement. Donc, cela est encore plus au point. Si nous place déclaré n ici à la ligne 32, c'est problématique parce que conjecture où d'autre j'ai besoin d'y accéder? Sur la ligne 34, et la règle simple à suivre est que vous ne pouvez utiliser une variable l'intérieur des plus récents accolades dans lequel vous avez déclaré il. Malheureusement, la ligne 34 est une ligne trop tard, parce que je l'ai déjà fermé l'accolade sur la ligne 33 qui correspond à l' accolade à la ligne 30. Et donc c'est une façon de dire que cette variable int est scope, pour ainsi dire, à seulement à l'intérieur de ces accolades. Il n'existe tout simplement pas en dehors d'eux. Donc, en effet, si je fais ça mal, permettez-moi de sauver le code comme il is-- incorrectement écrit. Permettez-moi d'aller de l'avant et ne fais -une fonction, et notice-- erreur. L'utilisation de noir identifiant n sur la ligne 35, qui est ici. Et si nous faisons défiler jusqu'à en outre, une autre. L'utilisation de noir identifiant n sur la ligne 34. Ainsi, le compilateur, Clang, est à remarquer que c'est juste n'existe pas, même si clairement qu'il est là visuellement. Ainsi, une solution simple est de déclarer là. Maintenant, permettez-moi de faire défiler à le début du fichier. Qu'est-ce que vous saute au visage comme être un peu différent de la substance, nous avons examiné la semaine dernière? Non seulement je avoir le nom, non seulement faire J'ai un peu forte comprend là-haut, J'ai quelque chose je suis appeler un prototype. Maintenant que semble terriblement semblable à ce que nous venons de le voir, il ya un moment sur la ligne 27. Donc, nous allons déduire d'un autre message d'erreur pourquoi je l'ai fait. Permettez-moi d'aller de l'avant et supprimer ces lignes il. Et si nous ne savons rien de prototype. Refaire ce fichier. Faire fonctionner un. Et maintenant, putain, quatre erreurs. Disons défiler jusqu'à la première. Déclaration implicite de la fonction obtenir int positif est invalide en C99. C99 signifie simplement 1999 version du langage C, qui est ce que nous sommes en effet à l'aide. Alors qu'est-ce que cela signifie? Eh bien C-- et plus particulièrement C compilers-- sont des programmes assez stupides. Ils savent que ce que vous avez leur a dit, et c'est effectivement thématique de la semaine dernière. Le problème est que si je vais sur la mise en œuvre nom ici, et j'appelle une fonction appelée GetPositiveInt ici à la ligne 20, cette fonction n'est pas techniquement exister jusqu'à ce que le compilateur voit la ligne 27. Malheureusement, le compilateur est faire les choses haut, bas, gauche, droite, parce qu'il n'a pas vu le la mise en oeuvre de GetPositiveInt, mais il voit que vous essayez de l'utiliser ici, il va juste bail-- crier à vous avec une erreur Message-- peut-être cryptique, et pas vraiment compiler le fichier. Alors que l'on appelle un prototype jusqu'à ici est certes redondant. Littéralement, je suis ici et j'ai copié et collé, et je le mets ici. Void serait plus appropriée, nous allons donc littéralement copier et coller cette fois. J'ai littéralement copié et collé il. Vraiment juste que comme une miette de pain. Un peu d'indices sur le compilateur. Je ne sais pas ce que cela fait encore, mais je promet de vous qu'il existera un jour. Et c'est pourquoi ce line-- dans 16-- ligne se termine par un point-virgule. Il est redondant par conception. Oui? Si vous n'avez pas de lier votre bibliothèque à the-- oh, bonne question. Forte comprend des inclusions de fichiers d'en-tête. Besoin de être-- devrait presque toujours au sommet du fichier pour un similar-- pour exactement la même raison, oui. Parce que dans la norme io.h est littéralement une ligne comme ça, mais avec le mot printf, et avec ses arguments et son type de retour. Et en faisant forte comprennent jusqu'à ici, ce que vous faites littéralement est un copier-coller le contenu de quelqu'un d'autre a écrit là-haut. Cluing ainsi votre code dans l' fait que ces fonctions existent. Ouais? Absolument. Donc un très intelligent et correct solution serait, vous savez quoi? Je ne sais pas ce qu'est un prototype est, mais je sais si je comprends que C est juste muet et repense haut en bas. Eh bien nous allons lui donner ce qu'il veut. Coupons ce code, collez-le haut, et poussez maintenant principal en bas. Ce serait aussi régler le problème. Mais vous pouvez très facilement arriver à un scénario dans lequel un besoin d'appeler B, et peut-être B rappelle à A. Cette est quelque chose qui s'appelle la récursivité, et nous reviendrons à cela. Et il peut ou peut ne pas être un bon chose, mais vous pouvez certainement briser cette solution. Et d'ailleurs, je le ferais réclamer stylistique, surtout quand vos programmes devenir cette longue et ce depuis longtemps, c'est juste super pratique de mettre principal en haut parce que c'est la chose la plus programmeurs vont se soucier. Et donc c'est un peu plus propre, sans doute, à faire de la manière Je l'ai fait à l'origine avec un même prototype mais il semble un peu redondant à première vue. Ouais? Désolé, pouvez-vous dire plus fort? Si vous changez l'emplacement de la mise en œuvre et le prototype? Donc, c'est une bonne question. Si vous re-déclarer ce bas ici, nous allons voir ce qui se passe. Donc, si je mets cela sur le ici, vous dites. Oh, désolé. Plus fort? Encore plus fort. Oh, bonne question. Serait-il invalider la fonction? Vous savez, après toutes ces années, je n'ont jamais mis un prototype après. Alors, faisons faire fonctionner-1 après avoir fait cela. [Murmurant] DAVID J. Malan: Oh, attendez. Nous avons encore à mettre tout en haut. Donc, nous allons le faire ici, si je suis comprendre votre question. Je suis tout mettre, y compris le prototype principale au-dessus, mais je suis en train de le prototype la mise en oeuvre ci-dessous. Donc, si je fais un, je suis en train de retour un error-- utilisé variable n. Oh, là-bas. Merci. Voyons, nous nous débarrassons de cette. C'est un bug différente, nous allons donc l'ignorer. Disons très rapidement ce remake. OK, donc argument ne de données utilisée par String format n-- oh, c'est parce que J'ai changé à ces ici. Très bien, nous savons ce que la réponse va to-- bien, nous y voilà. Ah, merci pour le positif. Très bien, je vais fixer ce code after-- ignorer ce bug particulier depuis ce était-- cela fonctionne est la réponse. Donc, il ne remplace pas ce que vous venez de faire. Je soupçonne que le compilateur est écrite de manière à qu'il ne tient pas compte de votre prototype parce que le corps, pour ainsi dire, de la fonction a déjà été mis en place plus haut. Je dois consulter effectivement le manuel du compilateur de comprendre s'il ya un autre implication, mais à première vue juste en essayant et en expérimentant, il semble y avoir aucun impact. Bonne question. Donc, nous allons maintenant vont de l'avant, se déplaçant l'écart des effets secondaires qui sont des fonctions qui font quelque chose comme visuellement sur l'écran avec printf, mais ne pas retourner une valeur. Et les fonctions qui ont le retour des valeurs telles que nous venons de voir quelques-uns des. Nous avons déjà vu cette notion de champ, et nous verrons encore et encore. Mais pour l'instant, encore une fois, utiliser la règle de base une variable qui ne peut être utilisé l'intérieur de la plus récemment ouverte et accolades fermées que nous vu dans cet exemple particulier. Et comme vous l'avez souligné, il existe une ability-- vous pouvez résoudre certains de ces problèmes en mettant une variable globalement au sommet d'un fichier. Mais dans presque tous les cas nous désapprouvent que, et en effet même pas aller dans cette solution pour l'instant. Donc pour l'instant, les plats à emporter est que variables ont cette notion de portée. Mais maintenant, regardons un autre voie sèche de fait la recherche à un très intéressant détails de mise en œuvre. Comment nous pourrions représenter l'information. Et nous avons déjà examiné cette dans la première semaine de la classe. En regardant les binaires, et nous rappelant décimal. Mais rappeler la semaine dernière que C a différents types de données et des grappes plus, mais les plus utiles pour l'instant peut-être ceux-ci. Un char, ou un personnage, ce qui arrive être un octet, ou huit morceaux au total. Et c'est-à-dire que la taille d'un caractère est juste un octet. Un octet est huit bits, donc cela signifie que nous pouvons représenter le nombre de caractères. Combien de lettres ou symboles sur le clavier si nous avons un octet ou huit bits. Pensez à la semaine zéro. Si vous avez huit bits, le nombre de valeurs totales pouvez vous représenter avec modèles de zéros et de uns? One-- plus que cela. Donc, 256 au total si vous commencer à compter à partir de zéro. Donc si vous avez huit bits-- si nous eu nos ampoules binaires ici encore, nous pourrions transformer ces ampoules sur et dans n'importe quelle de 256 modèles uniques. Maintenant, c'est un peu problématique. Pas tellement pour l'anglais et langues romanes, mais certainement lorsque vous introduisez, par exemple, les langues asiatiques, qui ont beaucoup plus de symboles que comme 26 lettres de l'alphabet. Nous pourrions réellement besoin plus d'un octet. Et heureusement dans dernières années a la société adopté d'autres normes qui utilisent plus d'un octet par charge. Mais pour l'instant en C, la valeur par défaut est juste un octet ou huit bits. Un entier, quant à lui, est de quatre octets, autrement connu comme 32 bits. Ce qui veut dire que c'est le plus grand possible nombre que nous pouvons représenter avec un int apparemment? Avec un milliard. Donc, c'est quatre milliards donner ou prendre. 2 à la puissance 32 e, si l'on assumer aucun des nombres négatifs et il suffit d'utiliser tous positifs numéros, c'est quatre milliards donner ou prendre possibilités. Un flotteur, quant à lui, est un type différent de type de données en C. Il est encore un certain nombre, mais c'est un nombre réel. Quelque chose avec une virgule. Et il se trouve que C utilise également quatre octets pour représenter valeurs à virgule flottante. Malheureusement, le nombre variable valeurs de points sont là dans le monde? Combien de nombres réels sont là? Il ya une infinie nombre, et pour que la matière il ya un nombre infini de nombres entiers. Nous sommes donc déjà une sorte de nous creuser un trou ici. Lequel apparemment computers-- à moins des programmes écrits en C sur eux-- ne peut compter jusqu'à quatre milliards donner ou prendre, et valeurs à virgule flottante ne peut apparemment avoir une certaine quantité finie de précision. Seuls tant de chiffres après leur point décimal. Car, bien entendu, si il suffit de 32 bits, Je ne sais pas comment nous allons aller sur représentant réel numbers-- probablement avec différents types de motifs. Mais il ya sûrement un fini nombre de ces modèles, si, ici aussi, ce qui est problématique. Maintenant, nous pouvons éviter un peu le problème. Si vous n'utilisez pas un flotteur, vous pouvez utiliser une double en C, qui vous donne huit octets, ce qui est modes possibles de façon plus zéros et ceux. Mais c'est encore fini, qui va être problématique si vous écrivez un logiciel pour les graphiques ou de fantaisie formules mathématiques. Donc, vous pourriez effectivement vouloir de compter plus que cela. Un named-- longue long-- bêtement est également de huit octets, soit 64 bits, et c'est deux fois plus longtemps que un int, et c'est pour une valeur de type Entier long. Fact-- amusant si un int est de quatre octets, combien de temps est un long en C habituellement? Également quatre octets, mais un est longue longue de huit octets, et ce, pour des raisons historiques. Mais les plats à emporter maintenant est juste que les données a d'être représenté dans un computer-- c'est un dispositif physique de l'électricité, il est généralement conduite ces zéros et ones-- avec une quantité limitée de précision. Alors, quel est le problème alors? Eh bien il ya un problème de débordement entier. Pas seulement dans C, mais dans ordinateurs en général. Par exemple, si ce vaut un octet un bit-- donc si c'est huit bit-- tous qui sont le numéro un. Quel est ce numéro représentant si nous supposons c'est toutes les valeurs positives en binaire? 255, et ce n'est pas 256, car zéro est le nombre le plus faible. Donc, 255 est le plus élevé une, mais le problème est suppose que je voulais incrémenter cette variable que utilise huit bits au total si je veux l'incrémenter. Eh bien dès que j'ajoute un une pour l'ensemble de ceux-ci, vous pouvez peut-être imaginer visually-- juste comme porter une aide decimals-- quelque chose va s'écouler vers la gauche. Et en effet, si j'ajoute le nombre un de cela, ce qui se passe en binaire c'est qu'il déborde à zéro. Donc, si vous use-- non seulement un int, mais un seul octet de compter entiers dans un programme, par default-- dès vous arrivez à 250, 251, 252, 253, 254, 255-- 0 vient après 255, qui n'est probablement pas ce que un utilisateur va attendre. Maintenant, quant à lui en virgule flottante monde, vous avez aussi un problème similaire. Pas tellement avec le plus grand number-- bien que ce soit toujours un problème. Mais avec précision la quantité d' que vous pouvez représenter. Donc, nous allons jeter un oeil à cet exemple ici aussi de la source de code-- d'aujourd'hui float-0.c. Et remarquez que c'est une super- programme simple qui devrait apparemment imprimer ce que la valeur? Qu'est-ce que vous pariez que cela va imprimer même si il ya un peu de nouvelle syntaxe ici? Donc, j'espère que 0,1. Ainsi, l'équivalent d'un dixième parce que je fais 1 divisé par 10. Je suis le stockage, la réponse dans une variable appelée f. Cette variable est du type float, qui est un mot-clé que je viens de proposer existait. Nous n'avons pas vu cela avant, mais c'est une sorte de belle façon dans printf de préciser le nombre de chiffres que vous veulent voir après une virgule. Donc, cette notation signifie simplement que voici un espace réservé. C'est un point flottant valeur, et oh, au fait, montrez-la avec le point décimal un nombre après la virgule. Donc, c'est le nombre de chiffres significatifs, pour ainsi dire, que vous voudrez peut-être. Alors laissez-moi aller de l'avant et faire faire flotteur-0, ./float-0, et apparemment 1 divisé par 10 est de 0,0. Maintenant, pourquoi est-ce? Eh bien encore une fois, l'ordinateur prend m'a littéralement, et j'ai écrit une et je écrit 10, et de prendre une conjecture ce est le type de données pris pour les deux valeurs? Un int, c'est techniquement quelque chose d'un peu différent. C'est généralement une longue, mais c'est en fin de compte une valeur entière. Pas une valeur en virgule flottante. Qui consiste à dire que si ce est un int, ce qui est un int, le problème est que l'ordinateur ne pas avoir la capacité même pour stocker ce point décimal. Ainsi, lorsque vous faites 1 divisé par 10 à l'aide de nombres entiers à la fois le numérateur et le dénominateur, la réponse devrait être de 0,1. Mais parce que la computer-- ce sont integers-- ne sait pas quoi faire avec la 0.1. Alors que fait-il clairement? C'est juste le jeter, et ce que je vois en fin de compte est de 0,0 seulement parce que j'ai insisté pour que printf me montrer une décimale. Mais le problème est que si vous diviser un nombre entier par un nombre entier, vous get-- par définition de c-- un entier. Et ça ne va pas le faire quelque chose de gentil et pratique comme autour de lui jusqu'à la plus proche ou vers le bas. Il va tronquer tout après la virgule. Il suffit donc de manière intuitive, ce qui est probablement une solution? Quelle est la solution la plus simple ici? Ouais? Exactement. Pourquoi ne traitons pas ces derniers comme valeurs à virgule flottante efficace les transformant en des flotteurs ou des doubles. Et maintenant, si je fais fabriquer des flotteurs-0, ou si je compile flotteurs-1, qui est identique à ce qui a été tout simplement proposé. Et maintenant, je fais des flotteurs-0, maintenant je reçois ma 0,1. Maintenant, c'est incroyable. Mais maintenant, je vais faire quelque chose d'un peu différent. Je suis curieux de voir ce qui est vraiment passe sous le capot, et je vais imprimer cette à 28 décimales. Je veux vraiment voir 0.1000-- un infinite-- [Inaudible] 27 zéros après que 0,1. Eh bien, voyons si c'est ce que je reçois en effet. Fabriquer des flotteurs-0 même fichier. ./floats-0. Voyons un zoom avant sur la réponse dramatique. Pendant tout ce temps, vous avez été de penser 1 est divisé par 10 à 10%, ou 0,1. Ce n'est pas. Au moins pour autant que le ordinateur de cause. Maintenant pourquoi-- OK, c'est complet mensonge 1 divisé par 10 est de 0,1. Mais ce n'est pas pourquoi-- l'emporter aujourd'hui. Alors, pourquoi ne l'ordinateur pense, contrairement à nous tous dans la salle, 1 qui est divisé par 10 effectivement cette valeur fou? Quel est l'ordinateur faisant apparemment? Qu'est ce que c'est? Ce n'est pas déborder, en soi. Overflow est généralement lorsque vous enroulez autour d'une valeur. C'est cette question de l'imprécision en une valeur à virgule flottante où vous avez seulement 32 ou peut-être même 64 bits. Mais s'il ya un infini nombre de biens numbers-- nombres avec décimales et numéros thereafter-- sûrement vous ne pouvez pas représenter l'ensemble d'entre eux. Donc, l'ordinateur a donné nous le match le plus proche la valeur de ce que peut représenter à l'aide le nombre de bits à la valeur que je veux réellement, qui est de 0,1. Malheureusement, si vous commencer à faire des mathématiques, ou vous commencer impliquant ces types de variable des valeurs de point en programs-- importante logiciel de gestion financière, tout militaire software-- où la perception est probablement assez important. Et vous commencez à ajouter de tels chiffres, et début exécutant le logiciel avec de très grandes entrées ou pour beaucoup d'heures ou de lots de jours ou de nombreuses années, ces minuscules petites erreurs ne peut certainement ajouter au fil du temps. Maintenant, en passant, si vous avez jamais vu Superman 3 ou espace de bureau et vous pourriez rappeler comment ces gars ont volé beaucoup d'argent à partir de leur ordinateur en utilisant des valeurs flottantes et en additionnant le petit restes, je l'espère ce film fait maintenant plus de sens. C'est ce qu'ils étaient faisant allusion à ce film. Le fait que la plupart entreprises ne seraient pas regarder après un certain nombre de décimales, mais ce sont des fractions de cents. Alors que vous commencez à les additionner, vous commencez à faire beaucoup d'argent dans votre compte bancaire. Voilà Office Space expliqué. Maintenant, malheureusement, au-delà Office Space, il sont quelques-uns légitimement troublant et des impacts significatifs de ces types de les décisions de conception sous-jacents, et en effet l'une des raisons C on utilise dans le cadre est que vous avez vraiment ce motif jusqu'à la compréhension de la façon dont les ordinateurs fonctionnent, comment le logiciel fonctionne, et ne pas rien prendre pour acquis. Et en effet, malheureusement, même avec que la compréhension fondamentale, nous, les humains font des erreurs. Et ce que je pensais que je partage est ce huit minutes vidéo prise ici d'un épisode Modern Marvels, qui est un spectacle éducatif sur la façon dont les choses fonctionnent qui peint deux images quand une utilisation abusive et la compréhension de valeurs à virgule flottante conduit à une certaine significatif résultats malheureux. Jetons un coup d'oeil. [VIDEO LECTURE] -Nous Retournons maintenant à «Ingénierie Catastrophes "sur Modern Marvels. Ordinateurs. Nous avons tous appris à accepter la problèmes souvent frustrantes que obtenu avec eux-- bugs, virus, et glitches-- de logiciels pour les petits prix à payer pour la commodité. Mais dans la haute technologie et à haute vitesse applications programme spatial militaire et, le plus petit problème peut être agrandie en cas de catastrophe. Le 4 Juin 1996, les scientifiques préparés de lancer une fusée Ariane 5 sans pilote. Il transportait scientifique satellites conçu d'établir précisément comment l' Interagit de champ magnétique de la Terre avec des vents solaires. La fusée a été construit pour l'Agence spatiale européenne, et décollé de son installation sur la côte de la Guyane française. -Au Environ 37 secondes après le vol, ils ont d'abord quelque chose n'allait pas remarqué. Que les buses ont été pivotant d'une manière qu'ils ne devraient pas vraiment. Environ 40 secondes après le vol, clairement le véhicule était en difficulté, et c'est quand ils ont fait la décision de la détruire. L'agent de sécurité de gamme, avec énormes tripes, appuyé sur le bouton et fait exploser la fusée avant de pouvoir devenir un danger pour la sécurité publique. , Telle était la jeune fille voyage d'Ariane 5, et sa destruction a eu placer en raison de la faille intégré dans le logiciel de la fusée. -Le Problème sur le Ariane était qu'il n'y un nombre qui était nécessaire 64 bits pour exprimer, et qu'ils voulaient convertir pour un nombre de 16 bits. Ils ont supposé que le nombre n'a jamais été va être très grande. Que la plupart de ces chiffres dans le nombre 64 bits étaient zéros. Ils ont eu tort. -Le Une incapacité de logiciel pour accepter le genre de numéro généré par un autre était à l'origine de l'échec. Le développement de logiciels est devenu un partie très coûteux de la nouvelle technologie. La fusée Ariane 4 avait eu beaucoup de succès. Tant du logiciel créé pour il a également été utilisé dans le lanceur Ariane 5. -Le Problème fondamental était que le lanceur Ariane 5. A été faster-- accélérée plus rapidement, et le logiciel n'avait pas pris en compte pour cela. -Le Destruction de la fusée a été un énorme désastre financier. Tout en raison d'une erreur de logiciel minute. Mais ce n'était pas la première temps des problèmes de conversion de données avaient empoisonné la technologie moderne des fusées. -En 1991 avec le début de la première guerre du Golfe, le missile Patriot connu le même genre d'un problème de conversion de nombre. Et comme résultat 28 personnes-- 28 Soldiers-- américains ont été tués, et une centaine d'autres blessés. Lorsque le Patriot, qui devait pour se protéger contre les Scud entrants, pas tirer un missile. -Lorsque Irak a envahi le Koweït, et en Amérique lancé Tempête du désert au début de 1991, Batteries de missiles Patriot ont été déployés pour protéger l'Arabie Saoudite et Israël de irakiens attaques de missiles Scud. Le Patriot est un milieu de gamme des États-Unis sol-air système fabriqué par la société Raytheon. -La Taille du Patriot intercepteur elle s'est d' c'est sur environ 20 pieds de long, et il pèse environ 2000 livres. Et il porte une ogive d'environ, Je pense que c'est à peu près 150 livres. Et la tête elle-même est un explosif, qui a fragments autour de lui. Ainsi, l'enveloppe de la tête militaire est conçu pour agir comme une chevrotine. -Les Missiles sont effectuées quatre par conteneur, et sont transportés par un semi-remorque. -Le Système Patriot anti-missile remonte au moins 20 ans. Il a été conçu à l'origine comme un missile de défense aérienne d'abattre les avions ennemis. Dans la première guerre du Golfe quand cette guerre venue, l'armée voulait l'utiliser pour abattre des missiles Scud, pas des avions. L'armée de l'air irakienne était non pas tant d'un problème, mais l'armée était inquiet à propos de Scud. Et donc ils ont essayé de mettre à niveau le Patriot. -Intercepting Un ennemi missile se déplaçant à Mach 5 allait être assez difficile. Mais quand le Patriot a été transporté en service, l'armée n'était pas au courant de une modification irakien fait leurs missiles Scud près impossible à elle. -Quel Qui s'est passé est que les Scuds venaient en étaient instables. Ils étaient bancal. La raison en était les Iraqis-- afin d'obtenir 600 kilomètres sur d'une gamme missile-- 300 kilomètres a pris du poids de l'ogive avant, et le fait ogive briquet. Alors maintenant, le Patriot essaie de venir au Scud, et plus de moment-- l'écrasante majorité de la time-- il serait tout simplement voler par le Scud. -once Les opérateurs du système Patriot réalisé le Patriot a raté sa cible, ils ont fait exploser la tête de la Patriot pour éviter les pertes éventuelles de son a été autorisé à tomber sur le sol. -Que C'était ce que la plupart des gens ont vu que les grandes boules de feu dans le ciel, et mal compris, comme interceptions d'ogives Scud. -Bien Dans le ciel de nuit, Patriots paru à détruire avec succès Scuds, à Dhahran il pourrait y avoir Ne vous méprenez pas sur ses performances. Il le système radar du Patriot perdu la trace d'un Scud entrant et jamais lancé en raison à un défaut de logiciel. Ce sont les Israéliens qui découvrit le premier que plus le système était allumé, plus l'écart de temps est devenu. En raison d'une horloge incorporée dans l'ordinateur du système. -Environ Deux semaines avant la tragédie à Dhahran, les Israéliens ont déclaré à le ministère de la Défense que le système perdait du temps. Après environ huit heures de la course, ils ont remarqué que le système de devenir nettement moins précis. Le ministère de la Défense a répondu par dire toutes les batteries Patriot de ne pas laisser les systèmes pendant une longue période. Ils n'ont jamais dit ce qui était longtemps. 8 heures, 10 heures, un millier d'heures. Personne ne savait. -Le Batterie Patriot stationnée à la caserne à Dhahran et son imparfaite interne horloge avait été pendant plus de 100 heures dans la nuit du 25 Février. -Il Suivis temps avec une précision d'environ un dixième de seconde. Maintenant, un dixième de seconde est un nombre intéressant car il ne peut pas être exprimé exactement en binaire, qui signifie qu'il ne peut pas être exprimée exactement dans un ordinateur numérique moderne. C'est difficile à croire, mais l'utiliser comme un exemple. Prenons le nombre d'un tiers. Un tiers ne peut pas être exprimé en décimal exactement. Un tiers est de 0,333 passe pour l'infini. Il n'ya aucun moyen de le faire avec précision absolue d'un nombre décimal. C'est exactement le genre de problème ce qui s'est passé dans le Patriot. Plus le système a fonctionné, l' pire erreur de temps est devenue. -Après 100 heures de fonctionnement, la erreur dans le temps n'était que d'environ un tiers d'une seconde. Mais en termes de ciblage d'un missile se déplaçant à Mach 5, il a donné lieu à un suivi erreur de plus de 600 mètres. Ce serait une erreur fatale pour les soldats à Dhahran. -Quel Arrivé est un lancement Scud était détecté par les satellites d'alerte précoce, et ils savaient un Scud venait dans leur direction générale. Ils ne savaient pas d'où il venait. Il appartient maintenant au radar composant du système Patriot défendre Dhahran pour localiser et garder piste du missile ennemi entrant. -Le Radar était très intelligent. Il serait effectivement suivre la position de la Scud puis prédire où il serait sans doute la prochaine fois que l' radar envoyé une impulsion sur. Cela s'appelait la porte de gamme. -Ensuite Une fois que le Patriot décide de suffisamment de temps a passé à revenir en arrière et vérifier la prochaine emplacement pour cet objet détecté il remonte. Alors, quand il est retourné à la mauvaise place, il voit alors sans objet. Et il décide qu'il n'y a pas d'objet. Qu'il y avait une fausse détection et il laisse tomber la piste. -Le Entrant Scud disparu à partir de l'écran du radar, et quelques secondes plus tard, il claqué dans les casernes. Le Scud a tué 28. Il a été le dernier feu au cours de la première guerre du Golfe. Malheureusement, le logiciel mis à jour arrivé à l'aube du jour suivant. La faille du logiciel avait été fixée, la fermeture un chapitre dans la difficulté l'histoire du missile Patriot. [FIN LECTURE VIDÉO] DAVID J. Malan: C'est tout pour CS50. Nous nous reverrons mercredi. [MUSIQUE LECTURE]