DAVID MALAN J: Tout droite, donc ce est CS50. Et ceci est clairement un vendredi. Et ceci est la fin de la première semaine. Vous pouvez donc rappeler que nous nous sommes quittés, la dernière fois, avec un cliffhanger de toutes sortes. Lequel nous exposons ce mensonge, qu'aucun question de plus en plus ce que vous avez appris up, 1 divisé par 10 l'est pas, en fait, ou 0,1 ou 0,100 0,10000. En fait, si nous compilons ce programme, comme nous l'avons fait hier, avec, faire imprécision, puis faire point, barre oblique, imprécision, nous avons appris que cette est ce qui est 1 divisé par 10 est en réalité. Voilà donc pas vraiment le cas. Mais cela ne touche à un certain limitation fondamentale des ordinateurs. Et en effet, parmi les choses que nous allons faire est aujourd'hui jeter un oeil à pourquoi cette a événements, quelles conséquences cela a, comment l'humanité a échoué à saisir cela dans quelques très situations-- grave le résultat de la laquelle a été tout à fait tragique et expensive-- et aussi jetez un oeil à la façon dont nous peut réellement défendre contre ces types de limitations. Donc, intuitivement, peut-être, pourquoi est-1 divisé par 10, selon mon ordinateur ici, pas seulement 1/10, 0,10? Ouais. Que pensez-vous? Un membre du public: La base est différent? DAVID MALAN J: La ce qui est? Oh, la base est différent? Donc, pas tout à fait. Il est en fait plus fondamentale pour le matériel. D'autres pensées? Ouais. Un membre du public: Ils représenter les nombres différemment? DAVID MALAN J: Donc they-- droit. Ils représentent des nombres différemment. Inexacte, apparemment. Alors que est-- Eh bien, différemment de ce que? Ou de qui? De nous? Un membre du public: Ouais. Ils ne utilisent pas la virgule système [inaudible]. DAVID MALAN J: OK. Donc dans un sens, ils ne le font pas utiliser le système décimal. Sous le capot, tout est, en effet, binaire, et qui est lié, en fait. Mais il est encore plus simple explication que cela. Ouais. Un membre du public: Ils seulement avoir autant de bits. Ils ne peuvent stocker jusqu'à un certain mesure, comme avec les décimales. DAVID MALAN J: Ouais. Ceci est ce qui est vraiment obtenir à elle. Il se trouve que les ordinateurs généralement, sera toujours seulement utiliser une quantité limitée d'informations de représenter quelque chose. Droit? Après tout, nous avons seulement un fixe quantité d'espace disque. Nous avons seulement un montant fixe de RAM, ou mémoire d'ordinateur. Et si vous avez seulement un montant fixe de quelque chose, sûrement vous ne pouvez pas réellement compter jusqu'à à l'infini ou tout numéro que vous voulez. Vous, en quelque sorte, devez choisir quelle gamme des valeurs que vous allez soutenir. Et ainsi, par exemple, une semaine ou deux Il ya, quand nous avons parlé ASCII, et nous avons parlé de 8 bits ou un octet, pour ainsi dire, plus grand nombre que nous pouvions représenter avec 8 bits était quoi? 255. Et nous pouvons représenter 256 valeurs totales mais pas si nous passons un d'entre eux sur 0-- Eh bien, mais si nous passer l'un d'eux sur 0, puis plus grand nombre est, bien sûr, 255. Donc, il se trouve, que ce soit le cas aussi, dans ce contexte. Nous avons commencé à parler, la dernière fois, à propos de nombres à virgule flottante, qui sont différents des nombres entiers, dans qu'ils ont un point décimal et, espérons-le, quelques chiffres après cela, mais ils sont aussi. Un ordinateur ne va généralement à utiliser 32 bits, peut-être 64 bits pour représenter une valeur en virgule flottante. Donc, même si nous avons grandi l'apprentissage des mathématiques et de savoir que vous pouvez absolument avoir un nombre infini de nombres après la virgule, pas si vous avez la mémoire finie. Vous, en quelque sorte, devez compléter, ou choisir les numéros vous allez représenter. Et si vous pouvez penser, dans un sens, ce qui est le plus proche de l'ordinateur approximation de la valeur que 1/10 il peut obtenir, avec seulement 32 ou plus bits. Et il est non seulement 1/10. Par exemple, si je change cela 1/3, qui nous pensons est encore plus simple. Donc 1 divisé par 3. Permettez-moi de sauvegarder le fichier. Permettez-moi aller de l'avant et de le recompiler. Et permettez-moi de re-exécuter. Ici aussi, apparemment, 1/3 est pas 0,3 puis un nombre infini de 3 de par la suite. Vous avez cette imprécision à la fin. Donc, nous, les humains sont corrects, et ce vous avez appris est, en fait, correcte, mais nous cogner contre certaines limitations. Et ce que je pensais nous ferions aujourd'hui, est de commencer en regardant, franchement, le conséquences tragiques de cette parfois, quand l'humanité ne pas mettre en œuvre tout à fait pour cette réalité et ces limitations. Et nous verrons une série de vignettes de la chaîne History Channel qui prend un regard sur comment les choses ont mal tourné. Il est environ 8 minutes, et nous reviendrons après cette et jeter un oeil à exactement quoi d'autre peut aller mal. Si nous pouvions baisser la lights-- [LECTURE VIDÉO] -Ordinateurs, Nous avons tous appris à accepter les problèmes souvent frustrant que aller avec eux. Bugs, les virus et les logiciels pépins sont de 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 téléguidé. Il transportait scientifique satellites conçu d'établir précisément comment le Interagit champ magnétique terrestre avec des vents solaires. La fusée a été construit pour l'Agence spatiale européenne et enlevé de son installation sur la côte de la Guyane française. -Et Environ 30 secondes dans le vol, ils ont d'abord quelque chose remarqué allait mal. Que les buses ont été pivotant d'une manière qu'ils ne devraient pas vraiment. Environ 40 secondes après le décollage, clairement le véhicule était en difficulté, et voilà quand ils ont fait la décision de la détruire. Un officier de sécurité du tir avec énormes tripes appuyé sur le bouton, 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 pris placer à cause d'une faille intégré dans le logiciel de la fusée. -Le Problème sur le Ariane était qu'il y était un certain nombre qui exigeait 64 bits pour exprimer, et il voulait convertir à 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 en le nombre de 64 bits était de 0. Ils avaient tort. -La 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 devenue un partie très coûteuse de la nouvelle technologie. La fusée Ariane 4 avait été très succès, tant du logiciel créé pour lui était aussi utilisé sur le lanceur Ariane 5. -Le Problème de base est que la fusée Ariane 5 était plus rapide, la plus forte accélération. Et le logiciel avait pas comptabilisées pour cela. -La Destruction de la fusée a été un énorme désastre financier, tout en raison d'une erreur de logiciel minute. Mais ce ne fut pas le premier temps des problèmes de conversion de données sévissait 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 de problème de conversion de numéro. En conséquence, 28 personnes, 28 soldats américains ont été tués et environ 100 autres blessés, lorsque le Patriot, qui devait pour se protéger contre les Scud entrants, pas réussi à tirer un missile. -Lorsque L'Irak a envahi le Koweït et l'Amérique Desert Storm lancé au début de 1991, Batteries de missiles Patriot ont été déployés pour protéger l'Arabie Saoudite et Israël à partir irakiennes des attaques de missiles Scud. Le Patriot est un des États-Unis, à moyenne portée surface-air système fabriqué par la société Raytheon. -La Taille de l'intercepteur Patriot, lui-même, est à peu près, à environ 20 pieds de long. Et il pèse environ 2000 livres. Et il porte une ogive de about-- Je pense qu'il est à peu près 150 livres. Et la charge militaire, lui-même, est un explosif, qui présente des fragments autour de lui. L'enveloppe de la tête militaire est conçu pour agir comme des chevrotines. -Les Missiles sont porté, 4 par conteneur, et sont transportés par un semi-remorque. -Le Système de missile anti Patriot remonte au moins 20 ans. Il a été conçu à l'origine comme un missile de défense aérienne pour abattre des avions ennemis. Dans la première guerre du Golfe, lorsque que la guerre est arrivée, l'armée voulait l'utiliser pour abattre Scud, pas des avions. La Force irakienne était pas tant d'un problème, mais l'armée était inquiet à propos de Scud. Et donc ils ont essayé de améliorer le Patriot. -Intercepting Un ennemi missiles voyager à mach de cinq allait être assez difficile. Mais quand le Patriot a été transporté en service, l'armée ne savait pas d'un Modification irakienne qui a fait leurs missiles Scud presque impossible à atteindre. -Qu'est-Ce arrivé, est-ce que les Scuds arrivaient, étaient instables, ils ont été vacillant. La raison de ceci, était les Irakiens, afin pour obtenir 600 kilomètres sur un missile de 300 kilomètres, a pris du poids sur l'avant de l'ogive et le fait ogive briquet. Alors maintenant, le Patriot essaie de venir au scud, et la plupart du temps, l'écrasante majorité de la temps, il serait juste voler par le Scud. -Une Fois que les opérateurs du système Patriot réalisé le Patriot a raté sa cible, ils ont fait exploser l'ogive du Patriot, pour éviter les victimes possible que si elle a été autorisé à tomber sur le sol. -Que Est ce que la plupart des gens ont vu, ces grosses boules de feu dans le ciel, et incompris que interceptions d'ogives Scud. Bien que dans la nuit ciel, Patriots est apparu être avec succès détruire missiles Scud, à Dhahran, il pourrait y avoir aucune erreur à propos de sa performance. Là, système radar de la Patriot perdu la trace d'un Scud entrant, et de ne jamais lancé, dû à 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 devenue, grâce à une horloge incorporée dans l'ordinateur de système. -A Propos 2 semaines avant la tragédie à Dhahran, les Israéliens ont déclaré à le Département de la Défense, que le système est en train de perdre du temps, que, après environ 8 heures de fonctionnement, ils ont remarqué que le système était devenir nettement moins précise. Le Département 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 ne disaient jamais ce que fut un temps long. 8 heures? 10 heures? 1000 heures? Personne ne savait. -La Batterie Patriot stationnée à la caserne à Dhahran, et son imparfaite interne horloge, avait été sur plus de 100 heures dans la nuit du 25 Février. -Il Suivis temps avec une précision de l'ordre de 1/10 de seconde. Maintenant 1/10 de seconde est un nombre intéressant car il ne peut pas être exprimé en binaire, exactement. Ce qui signifie, il ne peut pas être exprimé, exactement, dans un ordinateur numérique moderne. Il est difficile à croire, mais l'utiliser comme un exemple. Prenons le nombre, 1/3. 1/3 ne peut être exprimée en décimal, exactement. 1/3 est 0,333 passe pour l'infini. Il n'y a pas moyen de le faire, avec précision absolue, en décimal. Voilà exactement le même genre de problème qui est arrivé dans le Patriot. Le plus couru du système, la pire erreur de temps est devenu. -Après 100 heures de fonctionnement, l'erreur dans le temps était seulement environ 1/3 de seconde. Mais en termes de ciblage d'un missiles à Mach 5, elle a entraîné un suivi erreur de plus de 600 mètres. Ce serait une erreur fatale pour les soldats à Dhahran. -Qu'est-Ce qui est arrivé, est un lancement Scud était détectée par les satellites d'alerte précoce, et ils de nouveau que le Scud était venant dans leur direction générale. Ils ne savaient pas d'où il venait. -C'était Maintenant au radar composant du système Patriot, défendre Dhahran, à 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 fois suivante, le radar envoie une impulsion sur. Qui a été appelé la porte de gamme. -Ensuite, Une fois que le Patriot décide assez de temps a passé à revenir en arrière et de vérifier la prochaine emplacement pour cet objet détecté, il remonte. Alors, quand il est retourné à la mauvaise place, il voit alors pas d'objet et il décide qu'il n'y a pas objet, il était une fausse détection, et des gouttes de la piste. Le Scud entrant disparu à partir de l'écran radar, et quelques secondes plus tard, il claqué dans les casernes. Le Scud a tué 28 et était le dernier l'un tiré au cours de la première guerre du Golfe. Tragiquement, le logiciel mis à jour arrivé à Dhahran le lendemain. La faille du logiciel avait été fixé, la fermeture un chapitre dans le trouble l'histoire du missile Patriot. [FIN LECTURE] DAVID MALAN J: Donc, nous allons jeter un oeil à certaines limitations similaires à juste un peu. Mais d'abord, nous allons transition vers quelques-uns est FYI. Donc One-- ce week-end, il y sera sections de super, qui sont destinés à supplanter sections régulières, qui démarrera dans une semaine. Jetez un oeil sur le site de la CS50 Pour plus d'informations sur les personnes. Ils seront également filmés et diffusés vivre pour ceux qui ne peuvent y assister. Problème réglé 1 est sur le le site Web de cours déjà, et nous allons jeter un oeil à que, dans un tout petit peu. Et les heures de bureau aussi, auront placer ce lundi au jeudi. Donc, ce fut le plus canonique programme, nous avons examiné la dernière fois. Il est comme le plus simple programme que vous pouvez écrire en C, et même que ya un peu d'une affirmation audacieuse. Droit? Parce qu'il ya beaucoup de paraissant à cette complexité. Donc, nous allons jeter un coup d'oeil sur ce que certains de ces éléments étaient et puis essayer de fournir un modèle mental pour savoir comment ceux-ci la plus simple de programmes travaillons, et nous allons commencer regarder les choses de plus en plus complexe. Donc, cette ligne ici, a souligné aujourd'hui, en jaune, ce qui ne nous disons, la dernière fois, que ce fait pour nous? Quel est le but qu'elle sert? Toute personne de plus loin? Ouais. Un membre du public: [inaudible] DAVID MALAN J: Bon. Donc, il vous donne un accès aux commandes, ou de laisser appeler les fonctions, que quelqu'un d'autre a écrit, qui sont déclarés, pour ainsi dire, dans un autre fichier. Nous allons donc voir exactement ce qu'est un fichier .h est par rapport à un fichier .c, finalement. Mais pour l'instant, il suffit de savoir printf que, par exemple, est parmi les fonctions qui ont été déclaré dans un autre fichier, quelque part d'autre sur le disque dur du nuage nous permet d'accéder et l'utiliser printf sans avoir à réinventer que nous roue. Pendant ce temps, principal. Quelle était la principale analogique, la semaine dernière? Ouais. Un membre du public: Drapeau vert est cliqué. DAVID MALAN J: Ouais. Scratch de, lorsque le drapeau vert a cliqué. Il est comme le morceau de puzzle qui débute off choses. Et de même, a fait le monde décidé il ya quelques années que, dans C, et un tas d'autres langues, si vous voulez écrire un programme, votre première fonction doit être appelé, principale. Et il doit ressembler à ceci. Mais nous reviendrons, une autre fois, à ce que, int, et, vide, signifie dans ce contexte. Pour l'instant, les accolades sont gentils comme de la forme de pièce de puzzle de Scratch qui encapsule un certain nombre de lignes. Et parmi sur les lignes ici, est celui-là. printf est une fonction dont le but dans la vie est d'imprimer une chaîne formatée. Et par formaté, je vous veux dire peut brancher valeurs d'espace réservé, et vous pouvez spécifier le nombre de décimales des points, le nombre de numéros à imprimer après un point décimal et similaires. Et printf, bien sûr, prend une ou plusieurs arguments ou paramètres, autrement dit, plus simplement, en tant qu'entrées. Donc printf, comme beaucoup de fonctions, prend entrées. Et ces entrées sont embrassés par les deux parenthèses ici. Et à l'intérieur de celles-ci est une entrée. Il est une chaîne, comme nous l'avons appelé, qui est seulement une séquence de caractères, comme un mot ou une phrase, ou un ensemble essai même, entre guillemets. Et voilà ce qui va influencer le comportement de printf parce que, bien sûr, il est juste une fonction d'impression générique. Il ne va pas de savoir ce que d'imprimer, à moins que vous lui dites. Et puis, certains minuties. Qu'avons-nous dit ce bizarre séquence de symboles est? Ouais. Un membre du public: Nouvelle ligne. DAVID MALAN J: Nouvelle ligne. Donc, il se trouve, vous ne pouvez pas frapper, entrer, quand vous écrivez le programme. Généralement, le compilateur va obtenir un peu confus quant à ce que vous entendez. Au contraire, vous avez littéralement dire, me donner une nouvelle ligne ici. Et si / n est généralement ce que nous appeler un caractère d'échappement. Alors n, pour la nouvelle ligne. Et le compilateur sait que quand il voit / n, il devrait effectivement induire l'ordinateur, en fin de compte, ou printf, dans ce cas, Pour imprimer un nouvel réelle ligne, comme frapper le, entrez, sur votre clavier. Et enfin, qu'est-ce que nous disons ce morceau de syntaxe est pour? Qu'est-ce que cela représente? Ouais. Un membre du public: [inaudible] DAVID MALAN J: Il est juste la fin de la ligne. Il est la fin de l'instruction. Et rendons compte que nous ne le faisons pas mettre partout. Nous ne les mettons certainement pas aux extrémités de chaque ligne. Par exemple, il n'y a aucun sur la première ligne, il n'y a aucun sur la ligne avec, principale, il ya aucune après les accolades, mais vous allez commencer à voir et obtenir familier avec où il est appelé à. Et il est presque toujours après une fonction appeler ou une déclaration, une action que vous êtes en train de prendre. Et savoir maintenant, surtout si parmi ceux moins à l'aise, ce sont les sortes de choses stupides que vous finirez frapper accidentellement la tête contre le mur au-dessus. Parce que vous serez logiquement confiant dans un problème vous avez résolu pour un problème ensemble, et la fichue chose juste ne compilera pas ou même de fonctionner. Et si souvent, dès le début, ça va être parce que vous avez manqué une parenthèse, ou vous avez raté un point-virgule. Et si juste être conscient de ces sortes de choses, et essayer de ne pas être frustré par eux parce que ce fait très rapidement devenu vieux chapeau. Mais il est très facile d'obtenir frustré dès le début, comme un résultat. Alors maintenant, nous allons jeter un oeil à la façon cette ligne fonctionne vraiment puis regarder un peu une plus compliquée. Donc, nous avons ici, la capacité à tirer parti de cet écran. Et supposons que ceci est mon écran d'ordinateur, mais je l'écris, programme bonjour, et je ne l'ai pas mis en œuvre, printf. Quelqu'un d'autre a mis en place, printf. Qui voudrait prétendre ont mis en œuvre, printf? Si nous pouvons? Tout droit, quel est votre nom? ÉTUDIANT 1: [? Copal. ?] DAVID MALAN J: Copal, venu sur place. Allez vers le haut. Bien. Donc, nous avons, ici, certains tags de nom, puisque nous allons faire un petit jeu de cette. Et nous allons vous appeler, printf. Et si vous voulez venir ici, ce que je viens dessiné sur l'écran, il est tout simplement, il ya moi, cela. Très bien, alors, bonjour mon nom est, printf, si vous souhaitez mettre ça sur. Bien. Et si vous pouvez aller support par l'écran d'ordinateur comme si vous êtes la fonction est venu avec ce système informatique. Et votre but dans la vie est à réellement imprimer quelque chose. Mais tout comme le programme que nous juste eu sur l'écran, ici, nous allons avoir à vous donnera effectivement une certaine entrée. Et donc, si mon entrée, ici, est apparemment, ce qui est passé à printf, nous allons genre de fantaisie il comme ça. Je vais écrire littéralement sur un morceau de papier, "Bonjour, monde," barre oblique inverse N. Et pour être clair, ce qui Je viens attirée sur ce morceau de papier, ressemble à ceci. Donc, quand je lance ce programme, et ce ligne jaune du code est exécuté, il est comme si je, le programme de bonjour, remets une certaine entrée à une fonction hors que quelqu'un d'autre a écrit. Et si vous, avec votre doigt, pourrait en fait, avec le doigt, dessiner sur l'écran quelle que soit il est vous ont été remis, l'effet, en définitive, est de voir exactement ce que, sur l'écran. Et un peu de cas de coin ici. Et bien, nous ne devrions pas voir la, nouvelle ligne, à ce stade. Il serait incorrect pour vous d'attirer explicitement le saut de ligne. Mais si nous avons gardé écrire des mots sur le écran, ils finiraient dessous. Donc, je vous remercie beaucoup, mais le bâton ici pour un instant. Nous avons maintenant besoin d'une autre bénévole, si nous le pouvions, qui va avoir besoin de jouer le rôle de-- Il n'y a que les gens de l'orchestre en ce moment. Comment about-- OK. Ici. Allez vers le haut. Comment t'appelles tu? ÉTUDIANT 2: [? Ivay. ?] DAVID MALAN J: Désolé? ÉTUDIANT 2: [? Ivay. ?] DAVID MALAN J: Ethan, venu sur place. Non? Ai-je mal compris, même après vous avez dit deux fois? Allez vers le haut. Il est difficile d'entendre ici. D'ACCORD. Et je suis désolé, quel est votre nom? ÉTUDIANT 2: [? Ivay. ?] [? DAVID MALAN J: Ivay. ?] D'ACCORD. Pour l'instant, si vous ne faites pas l'esprit, vous êtes GetString. ÉTUDIANT 2: OK. Cool. DAVID MALAN J: Donc, si vous souhaitez rester ici pendant un moment, nous allons jeter un oeil à un peu plus programme complexe, qui a maintenant trois lignes de code. Nous avons donc, l'un, l'état de votre nom à l'aide printf; deux, un appel à GetString, suivie d'une assignation à une variable appelée, chaîne s, ou appelé s; puis un autre appel à printf, mais cette fois-ci à deux entrées. Etat Donc, nous avons déjà fait votre nom, ou plutôt, nous avons déjà fait un appel de printf. Donc, je vais écrire, dire votre nom. Et donc, ce que je vais passer, printf, dans un instant, est tout simplement cela. Donc, si vous voulez aller de l'avant et tirer cette sur l'écran, qui est votre entrée maintenant. Bien. Et oublier chaîne, nous avons maintenant notre propre ligne de code ici. Donc, dans, GetString, nous avons besoin d'appeler effectivement, GetString. Donc, votre but dans la vie est de simplement marcher out dans l'orchestre, si vous le pouviez, et obtenir le nom de quelqu'un. Mais nous allons vous donner quelque chose à mettre sur. Si vous voulez, allez de l'avant et obtenir une chaîne, obtenir le nom de quelqu'un sur qui morceau de papier, si vous le pouviez. Bien. Et nous verrons, dans un instant, dont le nom nous obtenons. Pendant ce temps, ce que je vais Ayez prêt, est un morceau vierge de papier, dans lequel, je vais pour stocker ce quelle que soit la valeur est que GetString est de retour pour moi, I, étant une variable de chaîne appelée, s. Bien. Alors qu'est-ce que vous avez ici? Nik. Bien. Nous avons donc le nom de Nik ici. Voilà donc ce que littéralement a été renvoyé pour moi, pour ainsi dire, par GetString. I, maintenant, je vais exécuter le côté gauche de cette expression, où je tout simplement copier vers le bas, pour les besoins d'aujourd'hui, Nik. Alors maintenant, je dois une variable appelé, s, stocker le nom de Nik. Je vous ai déjà remis à printf, un argument précédent. Mais dans notre troisième et dernière ligne de code, je dois effectivement à printf main quelque chose d'un peu different-- "bonjour,% s," barre oblique inverse n. Et donc la dernière ligne, je vais à send-- la dernière chose que je suis aller à écrire maintenant, est-ce. Ainsi, les deux lignes de code, ou plutôt la dernière ligne de code, appels pour deux inputs-- l'un, cela, et deux, ce. Donc, si notre fonction printf peut maintenant prendre ces comme entrée, laissez-moi éclaircir l'écran pour vous. En fait non, vous pouvez aller de l'avant. Nous vous laissons le soin, depuis il est sur le même programme. Nous devrions voir, bonjour, Nik. Bien. Donc, ce fut un assez grand nombre cerceaux pour sauter à travers, juste à écrire, indiquer votre nommer et, bonjour, Nik. Mais cette simple idée de passage de message, du passage d'entrée et de sortie de réception, est exactement le modèle que nous allons avoir même pour les fonctions les plus complexes. Donc, merci beaucoup à vous deux. Nous avons une belle contrainte balle là pour vous. Et merci à notre GetString et les bénévoles printf semblables. Merci. Bien. Merci à vous deux. Donc, nous avons parlé jusqu'à présent, la plupart du temps sur les chaînes. Et il se trouve que C peut effectivement comprendre quelques types de données différents. En fait, nous allons jeter un oeil à ces ici. Donc, C, et un grand nombre de langues, comprendre les choses appelées caractères. Un caractère est généralement une seul octet, ou huit bits. Et il représente un caractère unique, comme la lettre A, ou la capitale lettre A, ou la lettre minuscule Une ou un point d'exclamation, ou tout personnage que vous pouvez taper sur votre clavier, et parfois même plus. Il nous arrive aussi de voir les flotteurs. Un flotteur est, en général, un 32 bits valeur, ou quatre octets car encore une fois, un octet est de huit bits. Donc, un flotteur est une valeur en virgule flottante, quelque chose avec un point décimal. Et en effet, voilà ce que le film parlait quand ils ont parlé flottante valeurs de points, un certain nombre fixe de bits étant utilisé pour représenter un nombre réel. Mais il ya aussi des choses appelées doubles. Ceux-ci existent en Java, si vous avez pris APCS, et un double, comme le nom, heureusement, suggère, est deux fois plus grand que un flotteur. Il est encore un nombre réel, il a juste plus de bits avec qui, pour être de plus en plus précise, ou même de stocker un plus grand nombre. int est facile. Nous en avons parlé la dernière fois. Il est juste un nombre entier. Et il est généralement 32 les bits ou octets. quatre Et donc, si vous avez, nous allons voir maintenant, 32 bits-- et nous l'avons fait la semaine 0, jamais si briefly-- si vous avez 32 bits, ce qui est le plus grand Nombre vous pouvez représenter comme un entier? Donner ou prendre? Il est comme 4 milliards, et voilà que si nous sommes représentant seulement des nombres positifs. Si vous avez 32 bits, et que vous voulez représenter les nombres négatifs ainsi, votre gamme est essentiellement négative 2 milliards à 2 milliards de positif. Mais en général, nous allons commencer à 0 aller jusqu'à 4 milliards de dollars. Vous ne disposez pas de savoir précisément, mais Nous pouvons voir cela, en fait, si je viens ouvrir un peu calculateur, ici. Je peux faire 2 le 32, et qui est exactement la taille, combien de valeurs que vous pouvez représentent, avec 32 bits. Et il est à peu près 4 milliards. Donc, nous allons continuons à voir ce nombre dans quelques endroits différents. Mais si vous avez besoin plus numéros que cela, il se trouve qu'il ya ce qu'on appelle un long long. Et un long long est généralement 64 bits, ce qui signifie qu'il est un ordre de grandeur encore plus grand que un int. Donc, je ne peux même pas prononcer le plus grand numéro que vous pouvez représenter, mais il est nettement plus grand. Maintenant, en aparté, historiquement, si un int est de 32 bits, et un long long est de 64 bits, comment Big est une longue, pas un long long? Vous pensez qu'il est plus qu'un int mais peut-être moins long qu'un long long, mais il dépend en fait. Et il se révèle un des frustrations aussi, avec l'écriture de code sur certains systèmes, est que pas tous ces types de données ont des valeurs prédéterminées. Parfois, il ya ce nombre de bits. Parfois, il est autant de bits. Donc, vous avez fait savoir, parfois, ce matériel vous utilisez votre logiciel sur. Heureusement, d'autres langues et d'autres types de données qui existent actuellement, vous permettre d'être plus précis. Eh bien, nous l'avons vu chaîne, et nous avons vu bool, aussi, mais il se trouve celles qui viennent seulement avec la bibliothèque de CS50. Donc, ceux qui ne sont pas construits en C. Ceux place, venir dans ce fichier appelé CS50.h, que nous finirons peler les couches de. Mais pour l'instant, ils sont juste les types de données supplémentaires. Un booléen est un vrai ou faux, et un chaîne est une séquence de caractères, comme un mot. Maintenant printf, nous l'avons vu, a des espaces réservés,% s est un. Et vous pourriez être en mesure, à ce jour, déduire de ces autres exemples, comment vous pourriez avoir un espace réservé pour différents types de données. Par exemple, prendre une proposition, si vous voulu imprimer un seul omble aide printf, l'espace réservé est probablement% c. Et si vous voulez imprimer une entier avec l'espace réservé,% i. % LLD est un long valeur décimale, mais long long, de sorte que des cartes pour cela. Et puis% f pour flotter valeur du point ou pour une chambre double, si parfois ils sont réutilisés dans des contextes différents. Donc, nous allons voir et utiliser certains de ceux qui au fil du temps. Et printf et d'autres fonctions aussi Les séquences d'échappement aider les autres, de et parfois, elles sont nécessaires. Donc barre oblique inverse n est une nouvelle ligne. Backslash t, personne ne vouloir prendre un coup de couteau? Un membre du public: Tab. DAVID MALAN J: Tab. Donc, si vous voulez réellement d'imprimer un onglet, pas un nombre fixe d'emplacements, mais une réelle caractère de tabulation, vous ne touchez pas votre, onglet, sur le clavier, en général, vous faites réellement barre oblique inverse t. Guillemet double barre oblique inverse, Pourquoi voudrais-je cela? Droit? Pourquoi je ne peux tout simplement taper un guillemet sur mon clavier? Un membre du public: Parce que, sinon, il est aller à penser qu'il est la fin comme votre impression [? texte. ?] DAVID MALAN J: Exactement. Rappelez-vous, avec notre printf exemples, lorsque nous passaient à printf en entrée, sur la gauche de cette chaîne d'entrée et sur la droite de cette entrée printemps, bien sûr, était un guillemet. Si votre propre entrée a un double citation au milieu de cela, L'ordinateur peut potentiellement se confondre, à, ce que cela guillemet appartenir au milieu? Appartient-elle à la gauche? Appartient-elle avec la bonne? Et donc, si vous voulez le rendre super- clair, vous faites backslasher guillemet, de sorte qu'il est échappé, pour ainsi dire, et il est pas confondu pour autre chose. Et il ya quelques autres ici, r barre oblique inverse, les apostrophes, 0, que nous puissions voir au fil du temps, aussi bien. Et maintenant, que sur les fonctions? Donc, les actions que nous pouvons prendre à ce jour dans cette langue, C, eh bien, nous l'avons vu, printf, bien entendu, et toutes des autres sur l'écran, ici, que nous allons utiliser pour la les premières semaines de cours seulement, viendra où la bibliothèque CS50. Et ils font beaucoup plus facile, en C, pour obtenir réellement entrée de l'utilisateur. Il se trouve que dans C, et franchement dans quelques langues, il est une vraie douleur dans le cou à faire quelque chose de simple, comme invite l'utilisateur pour le clavier, pour son entrée. Et si ces fonctions facilitent. Et il a aussi l'erreur vérifier tout au long, de sorte que, lors de rappeler le mercredi, nous vu la, réessayer, avertissement, quand je ne coopéraient pas, et je tapé un mot, à la place d'un numéro? Nous avons fait le gros du début pour être sûr que l'utilisateur coopère. Mais ce ne sont que la formation roues que nous finirons, et rapidement, décoller. Donc, pour résumer, puis, nous allons jeter un coup d'œil rapide, un peu comme nous l'avons fait avec Scratch, au certaines constructions canoniques en C. Ceci est destiné à, en quelque sorte de, une visite éclair, juste pour que vous avez une référence et que vous avez vu des choses au premier abord. Mais ensuite, nous verrons codage réel utiliser certains de ces blocs de construction. Donc, un peu comme dans Scratch, quand nous avions des déclarations comme: dire ou, attendez, en C, nous ne devons fonctions aussi bien, comme printf. Si nous voulons exprimer une condition en C, elle est semblable, dans l'esprit, à cette pièce de puzzle qui ressemblé à ça dans Scratch. Mais à la place, nous littéralement juste écrire, si. Et puis, entre parenthèses, nous avons mis une condition, Lorsque cette condition est ce que nous allons appeler, encore une fois, une expression booléenne. Et encore une fois, ce genre de pseudo-code est. Et, en fait, la // est un commentaire. Il est juste des mots anglais pour moi. Mais cela est le grand structure d'un, si, condition. Mais nous verrons en béton exemples dans un instant. Si vous voulez avoir un fourche à deux voies de la route, un peu comme nous l'avons fait avec notre bénévole Mercredi, vous pouvez avoir un, d'autre si. Et si vous voulez avoir un troisième et dernière condition, ou d'une situation de défaut, vous pouvez avoir juste un autre bloc, là. Et de même, avec des expressions booléennes, vous pouvez, et, ensemble. Et nous avons vu mercredi, que il est pas un seul esperluette, il est deux, pour des raisons de niveau inférieur que nous finirons par voir et jouer avec. Ou-ing choses ensemble est 2 barres verticales. Sur un clavier américain, ce est généralement une touche avec la touche Shift-dessus Entrez votre clé ou Retour. Puis, il ya ces choses qui nous utiliserons peut-être une ou deux fois. Ils sont fonctionnellement équivalents à ce que vous pouvez faire avec un, si, d'autre si, d'autre si d'autre, construire, mais ils sont appelés un interrupteur. Ils ont l'air très différent, mais nous allons voir dans une partie de notre code de distribution, pour un futur jeu de problème, le plus probable, qu'il est parfois juste un joli un moyen d'exprimer toute tas de conditions, sans avoir beaucoup d'accolades et beaucoup d'entre parenthèses et l'indentation. Mais ils nous donnent pas plus de pouvoir que nous avons déjà. Et maintenant boucles. Et celui-ci, nous allons voir à un peu plus lentement. Mais alors, nous allons commencer à les utiliser, surtout pour ceux qui connaissent déjà. Ceci est la manière canonique, si incroyablement façon arcanes, d'écrire une boucle dans C. Maintenant, une boucle dans Scratch était assez simple. Vous avez un, pour toujours, bloc. Vous avez une, répétition, bloc avec juste un numéro que vous avez à taper. Et avec la boucle, vous pouvez mettre en œuvre ces deux idées, mais il est un peu plus technique. Mais franchement, il est aussi relativement simple. Une fois que vous savez de l'ordre de opérations, vous littéralement allez juste à brancher valeurs et dire à l'ordinateur ce qu'il doit faire. Alors, voici un exemple. Ceci est une boucle qui, bien tout simplement, des chiffres d'un nombre jusqu'à par un autre. Et juste en regardant à elle, même si vous avez aucune expérience préalable avec cette langue, ce nombre ça commence probablement à compter? OK, 0. Et je suppose que ce parce que vous voir qu'il ya un int et un i, qui est une variable. Il est initialisée à 0. Et puis, plus tard, il semble que nous passons printf, une valeur. Et, en fait, je fait une petite faute de frappe ici. Mais on peut facilement arranger. Permettez-moi d'ajouter dans, i ici. Nous avons maintenant être printf passé que la valeur de l'espace réservé. Et ce qui va compter à travers? AUDIENCE: 50. 50. 49. DAVID MALAN J: 49. Donc 50, à première vue, semble droit. Mais cela, il se trouve, va être notre condition que nous gardions le contrôle. Et nous allons arrêter une fois i est plus moins de 50. Donc, cette boucle, à l'inverse, si exécuter, tant que i est inférieur à 50. Mais dès qu'il devient 50, ou 51, ou pire, il devrait arrêter automatiquement. Bien. Alors qu'est-ce qui se passe réellement ici? Donc, cela est de l'ordre de opérations pour une boucle. Un, vous avez la dite initialisation. Ce morceau en jaune de code est exécuté en premier, et il a pour effet que, par Mercredi, vous imaginez sans doute. Il crée une variable appelée i et il magasins à cette variable la valeur 0. Donc i est 0 à ce moment de l'histoire. La prochaine chose que qui se produit dans cette construction, est que la condition est vérifié. Donc, je vérifie immédiatement, i est inférieure à 50? Et bien sûr, la réponse pour l'instant est, sûrement, oui. Oui, parce que i est 0, et qui est sûrement moins de 50. Alors ce qui se passe, est que cette ligne de code est exécuté. Et en fait, si il ya plusieurs lignes de code dans ces accolades, Ils reçoivent tous exécutés l'un après l'autre. Et en effet ici, est apparemment, pour imprimer le nombre i, qui va 0, puis 1, puis 2. Mais pourquoi? Pourquoi faut-il incrémentée? Eh bien, la quatrième chose qui qui se passe est que cette syntaxe est exécuté, après le point-virgule. i ++ est un raccourci de dire; prendre la valeur de i, et ajouter 1 à elle; puis la prochaine fois, ajouter Une qui lui; et la prochaine fois, ajouter 1 à elle. Donc, si nous continuons, ce qu'il va se passer NEXT est que je ne vais pas initialiser i jamais. Si je continuais initialisation i à 0, cet exemple finirait jamais parce je serais coincé à 0. Mais qu'est-ce qui va se passer est que la condition sera vérifiée, la ligne de code va se exécuté, i sera incrémenté, condition sera vérifiée, code sera exécutée. Et il a gardé le vélo à nouveau, et de nouveau, et de nouveau, jusqu'à ce que je ++ induit une valeur de 50. La condition dit alors, 50 est inférieure à 50? La réponse, bien sûr, est non, et donc tout le code arrête l'exécution. Et si vous avez plus de code sur l'écran en bas, voilà ce qui arrive ensuite. Il ressorte de ces accolades et continue d'imprimer plus après cela. Donc une blague maintenant, à partir de FoxTrot, que vous aurez peut-être maintenant à comprendre. Il est toujours drôle. Il est comme les gloussements sorte de percolation, puis vous réalisez que vous ne devriez pas rire de l'humour comme ça. Mais il ya une certaine livraison ici, sur le plan pédagogique, aussi. Donc, il se trouve que je suis manque un morceau de la syntaxe, FoxTrot ou de manquer un morceau de syntaxe ici. Ce qui manque, que nous avons eu dans tous les autres par exemple, à ce jour? Retour, est là, donc qui est quelque chose d'autre, que nous allons revenir à avant longtemps. Ce qui manque, si? Ouais. Un membre du public: Le initialisation de [inaudible]. DAVID MALAN J: OK. Donc voilà. Donc en fait, ce est-- Eh bien, et comptage est initialisé au-dessus de, ou plutôt, déclaré en haut. Donc, ceci est une autre façon de le faire. Mais pas dans une ligne il est valide si. Que diriez-vous ici? Un membre du public: Est-ce les accolades? DAVID MALAN J: Ouais. Ainsi, les accolades sont manquantes. Mais ce code, je veux dire, à leur crédit, est en fait, syntaxiquement valide. Il se trouve, vous ne faites pas besoin des accolades si vous avez une seule ligne de code qui vous voulez exécuter à l'intérieur de la boucle. Maintenant, nous avons toujours, en classe et dans l'ensemble de notre code de distribution, inclure les accolades de toute façon, juste pour des raisons de clarté. Mais se rendre compte que dans les manuels scolaires et des exemples en ligne, vous pouvez très bien voir bouclés accolades manque parfois. Et cela est OK, si ce que vous ont indenté et destiné est juste une seule ligne de code, et non plusieurs lignes de code, potentiellement. Bien. Donc, lié à la question de la imprécision, est une question de trop-plein, en ce sens que, de même, ne entiers ont des limites à eux tout comme valeurs à virgule flottante? Dans le monde en virgule flottante valeurs, nous ne pouvons être si précis, après quoi, parfois mauvaises choses peuvent arriver, et nos programmes peuvent être buggy et erreur. Maintenant, même avec des nombres entiers, vous pouvez rencontrer des problèmes. Maintenant, un nombre entier n'a pas de point ou un nombre décimal après elle. Il est juste un nombre naturel, généralement. Alors qu'est-ce qui pourrait aller mal avec un int? Si je suis en utilisant un int à compter, ce qui pourrait aller mal? Semble beaucoup plus simple. Ouais. Un membre du public: Si le Numéro obtient [inaudible] DAVID MALAN J: Ouais. Qu'est-ce que si vous comptez tellement élevé, que vous ne peut pas exprimer ce que vraiment grand nombre. Droit? À un certain point, vous allez à dépasser les limites d'une valeur de 32 bits ou une valeur 64 bits. Maintenant, encore une fois, je ne suis pas sûr de savoir comment prononcer une valeur 64 bits, mais je sais avec un entier de 32 bits, la plus grande valeur qu'il peut être, si elle est seulement positif les valeurs, est à peu près 4 milliards. Donc, si je tente de compter jusqu'à 5 milliards, quelque chose va se passer. Mais voyons ce qui, en fait, peut se produire. Dans le monde entier des débordement, où vous, en un sens, déborder la capacité d'un entier, ce qui pourrait arriver? Alors, voici un nombre binaire, il est un retour à 0. Il est tous des 1, et les espaces réservés là, sont des puissances de 2, si cela est binaire. Donc, ce sont 8, 1 bits sur l'écran. Et si vous vous souvenez, ou vous faites rapidement le calcul, quelle valeur est représentée ici avec ces huit bits de 1? 255. Et même si vous étiez pas sûr du calcul, vous pourriez le faire sortir. Ou vous pouvez simplement genre de la raison à travers elle, attendez une minute, si je suis représentant une valeur de 8 bits, et je dois 256 valeurs possibles, mais le premier est 0, Je sais juste que le plus grand va être 255, et que est ce que celui-ci pourrait être. Donc je suppose essaie d'ajouter 1 à cette valeur. Que feriez-vous en grade l'école lors de l'ajout d'un 1, et il ne cadre pas vraiment parce vous avez à transporter le 1? Qu'est-ce que ce nombre passe devenir quand vous ajoutez 1? Il va devenir 0. Droit? Parce que si vous aviez plus bits-- et je vais essayer de, en quelque sorte, taper sur ici-- si nous avions plus de bits, ce que nous pourrait faire ici est d'ajouter le 1, puis nous obtiendrions cette. Oups. Nous aurions un bit 1 tout le chemin ici. Mais si cela est un ensemble fini valeur, il est seulement 8 bits, et que ce pré-déterminée par l'ordinateur, qui est une manière efficace pas là. Il vient de sorte de tombe d'une falaise. Et si vous ajoutez 1 à 255, ce qui la valeur que vous obtenez en apparence? 0. Et ainsi numéros accidentellement, et peut-être, sans le vouloir, finir par enroulant autour de ce genre. Alors, que peut-être l'implication de cette? Eh bien, il ya quelques choses différentes. Donc un, il ne finissent à la recherche comme 0, sans le vouloir, mais vous pouvez sorte de le voir, même dans le monde réel, pour le meilleur ou pour le pire, manifestations de cette idée d'une limite. Par exemple, l'un de vous qui ont jamais joué Lego Star Wars, quiconque ne se fait connaître le nombre maximum de pièces vous pouvez gagner dans Lego Star Wars? Prenez une supposition basée sur questions suggestives d'aujourd'hui. Il est plus grand que 256 ou 255. Il est de 4 milliards. Donc, il se trouve, et il ya quelques personnes-- certains googler confirmé dernière night-- ont obtenu 4 milliards de pièces d'or, ou quoi, dans Lego Star Wars. Bien qu'apparemment, il ya un moyen de tromper le jeu, il ya un bug ou une fonction, qui vous permet de juste courir beaucoup, beaucoup de points. Mais la plus grande possible valeur, selon à cette capture d'écran de quelqu'un que je trouvé en ligne, est en effet, 4 milliards. Maintenant, pourquoi est-ce? Il est précisément de 4 milliards, probablement parce que quelqu'un a décidé, qui a été écrit à ce jeu, qu'ils pouvaient faire 4 milliards, quelque chose, quelque chose, quelque chose, comme la valeur que je mets en place avec la calculatrice plus tôt, mais il est juste un peu plus propre pour les humains à-dire le nombre maximum de coins-- ou goujons, comme ils l'appellent eux-- que vous peut recueillir est de 4 milliards. Et donc, pourquoi est-ce? Comment est le jeu de LEGO mise en oeuvre du compteur que cela garder la trace de la nombre de pièces que vous avez? Ils utilisent ce? Un membre du public: Il arrête de compter après 4 milliards. DAVID MALAN J: Il arrête de compter après 4 milliards, qui signifie que vous pouvez inférer, comme un programmeur, qu'ils sont probablement en utilisant un nombre entier de 32 bits. Comme le programmeur littéralement juste dactylographiée, int, dans son code, et voilà le type de variable qu'ils utilisent pour stocker le code de quelqu'un. Donc, il ya d'autres manifestations de ces types de limites. Donc, je ne l'ai pas joué ce game-- et je lisais sur l'histoire pour confirmer que much-- mais dans le version originale des civilisations, où vous interagissez apparemment avec chaque autre et peut faire la guerre ou la paix, Gandhi était censé être l'un des les personnages les plus pacifiques, comme je l'ai comprendre, dans la première version de Civilization. Et de fait, sur une échelle de 1 à 10, son agressivité était juste un 1. Donc jamais si légèrement agressif, apparemment. Mais à un certain point, vous pouvez apparemment installer la démocratie dans votre géographie. Et si vous installez la démocratie dans votre version du jeu, alors votre niveau d'agressivité descend. C'est une bonne chose. Les gens sont plus tranquille apparemment, dans cette situation. Mais apparemment, quelqu'un a fait ne pas avoir un, si, de l'état dans la version originale du code. Donc le niveau d'agression de Gandhi est passé de positif de 1, moins 2, à 1 négative, mais le jeu ne fait pas comprendre les nombres négatifs. Donc ce qui est arrivé était l'agression de Gandhi niveau est passé de 1, à 0, 1 à négative, qui a eu pour effet de enroulant autour d'être le caractère le plus agressif dans le jeu, à une valeur de 255, sur une échelle de 1 à 10. Et depuis lors, il ya eu plusieurs incarnations de ce jeu, et ils ont gardé comme une sorte d'oeuf de Pâques, que Gandhi est apparemment si terriblement agressif. Mais il était le résultat d'une erreur de programmation très simple dans cette version très tôt du jeu. Maintenant, plus inquiétant, plus récemment, le Boeing 787 a été documenté comme ayant une bug, pas le genre de dispositif vous voulez en particulier d'avoir un bug. Et les symptômes, que je vais vous lire ici, d'un article en ligne, était présent, un modèle 787 avion qui a été alimenté en permanence pour les 248 jours peut perdre tout courant alternatif, AC, puissance électrique, en raison de les unités de commande de générateur, CGU, simultanément passer en mode sans échec. Donc, ce fut un avertissement émis lorsque ce problème a été découvert. Cette condition est causée par un compteur de logiciel, interne à la CGU, donc un nombre entier ou une variable, que la volonté de débordement après 248 jours de puissance continue. Boeing est en train de le développement d'une mise à niveau logicielle de GCU que permettra de remédier à la situation dangereuse. Donc, un peu comme le missile scénario, dans lequel ils avaient une sorte de variable qui comptait, et à compter, et compter, mais déborde progressivement les limites de sa capacité, de même fait ce foutu avion une variable de débordement après avoir assez de temps de la course. Et donc la façon la langue dans la joue de travailler autour de cette question est de vraiment, redémarrage, votre avion tous les 247 jours, afin que la mémoire est effacé et la variable remonte à 0. Mais se rendre compte, ceci est une très grande incarnation de logiciels, mais surtout que nous entendons parler d'Apple les systèmes d'exploitation d'entrer dans les voitures, et les voitures auto-conduite à partir de Google, et un certain nombre d'incarnations de logiciels Dans notre vie quotidienne, les téléviseurs et les montres, et plus, réaliser étaient entourés par un logiciel, tout ce qui est écrit par nous, les humains. Et comme nous allons tous bientôt découvrir, il est très facile et très typique de faire des erreurs lors de l'écriture de logiciels. Et si vous ne les attrapez pas, quelques mauvaises choses peuvent arriver. Or parfois, certaines drôles de choses peuvent se produire, ou du moins parfois nous savoir pour attendre à une certaine méchanceté. Alors 0 divisé par 0, à partir du grade l'école, est généralement une mauvaise chose. Il est indéfini. Et il se out-- et voyons si mon micro peut capter cette up-- que Apple eu du plaisir avec cette récemment. Je dois donc un iPhone ici. Je vais parler à Siri et lui demander de me donner la réponse à 0 divisé par 0. Quel est 0 divisé par 0? SIRI: Imaginez que vous avez 0 les cookies, et vous leur répartis également entre 0 amis. Combien de biscuits ne chaque personne obtenir? Voir? Il n'a pas de sens. Et Cookie Monster est triste qu'il n'y a pas les cookies. Et vous êtes triste que tu n'as pas d'amis. DAVID MALAN J: Il est un peu désagréable. Voilà donc ce que vient il dit. Il est indéterminée, il est pas défini, Et en effet, de nombreux langages de programmation ou, vraiment, compilateurs détecter lorsque vous, dans un programme, essayez de diviser par 0 0. Plus amusant que ce bien, est qui, apparemment, Cookie Monster est sur Twitter ces jours. Et il a répondu à cela, avec cela, qui est absolument adorable. Mais nous allons jeter un coup d'oeil sur un couple d'autres constructions, puis mettre un peu de cette code pour utiliser, dans de bonnes manières. Donc, il se trouve, outre pour les boucles, il ya ce qu'on appelle une boucle while, qui semble différent et est mis en œuvre un peu differently-- et nous finirons par voir exemples-- mais dans un certain sens, il est plus simple, car il ne vous permet pas d'initialiser et mettre à jour dans les limites de la boucle. Vous pouvez toujours mettre en œuvre. Donc vous pouvez faire exactement les mêmes choses avec une boucle while, comme avec une boucle, mais votre syntaxe, ultimately-- Comme nous le verrons par la suite see-- va être différent. Il ya même une boucle Do While, qui est en réalité un peu différente, en ce qu 'une boucle alors que pour et une boucle while toujours vérifier leur état premier, si vous avez lu cette chose de haut en bas, il ressemble un peu à ça va vérifier sa condition dernière parce qu'il est vraiment la dernière ligne de code. Et en effet, que ça va être utile dans certains programmes que nous écrivons, si vous voulez faire quelque chose aveuglément et, finalement, de vérifier l'état. Cela ne veut pas nécessairement une mauvaise chose. Si nous voulons des variables, nous pouvons faire dans un couple de différentes manières. Et nous avons vu dans le fox-trot bande dessinée, une façon de le faire, où vous déclarez votre variable, comme int counter-virgule, et peut-être la prochaine later-- ligne, peut-être 10 lignes later-- initialiser réellement. Ainsi, ces 2 lignes de code déclarer une variable de type int et l'appeler compteur, de sorte qu'il donne moi assez de bits pour tenir un int. Et puis finalement, il met la valeur 0 dans cette variable. Il organise les de 0 et de 1 dans un motif, ce que nous savons de la semaine dernière, représente le nombre que nous connaissons comme 0. Ou franchement, vous pouvez faire autant plus succinctement, juste comme ça. Maintenant, nous avons également la capacité à appeler des fonctions. Et en fait, voici une ligne 2 programme, ou d'un extrait de celui-ci, qui nous permet de réellement écrire du code qui Obtient une chaîne de la user-- bien comme notre bénévole un moment ago-- stocker le résultat dans une variable appelée nom, et alors-- peu comme avec notre bénévole avec des impressions printf-- sur ces valeurs en passant à deux arguments, le chaîne, suivie de la variable appelé, le nom, lui-même. Donc, nous allons jeter un coup d'œil, avant nous revenons à Mario il, à un couple de l'entreprise, des exemples. Je vais aller de l'avant et ouvert jusqu'à, disons, la fonction-0.c. Et comme toujours, ce code est disponible sur le site du cours, de sorte que vous pouvez jouer à la maison et le regarder plus tard. Mais voici le programme dans son essence, de la ligne 17 à 22. Le programme principal est où le programme va toujours commencer. Ce programme, apparemment, va d'imprimer votre nom, votre côlon. Il est ensuite vais appeler GetString, tout comme nous l'avons fait avec nos bénévoles. Et puis, ce qui est intéressant, il va appeler printName. Il se trouve, tout ce temps, il semble être une fonction appelée printName. Qui imprime le nom de quelqu'un. Nous ne devons utiliser printf antan, il ya printName. Mais cela est trompeur parce printName ne venir avec C. gens ne inventer il ya 40 ou 50 ans, Je l'ai fait, à la place. Et en fait, si je fais défiler plus bas, avis comment je peux écrire mon propre fonctions en C. Nous finirons expliquons pourquoi nous continuons à dire, vide, dans quelques endroits, mais pour aujourd'hui, nous allons il suffit de regarder le nom. Sur la ligne 24, si vous voulez créer votre propre fonction, vous écrivez littéralement le nom de la fonction. Je choisis printName. Entre parenthèses, vous puis spécifiez quels types des entrées, et combien vous veulent cette fonction à prendre. Dans ce cas, je veux prendre 1 variable appelée, nom, et il va y avoir des Type, string, donc ça va y avoir une certaine séquence de caractères. Et puis, ce program-- un peu comme dans Scratch, vous pouvez avoir personnalisé puzzle de pieces-- va avoir ce comportement personnalisé. Il va appeler printf en passant, bonjour, espace réservé, puis il va à brancher quel que soit l'utilisateur appelé. Donc, ceci est un exemple de ce que un informaticien serait abstraction appel ou fonctionnelle décomposition, qui sont tout simplement façons de fantaisie de saying-- est de savoir si vous aimez cette idée de haut niveau, comme je veux fonctionnalités programme affiche le nom de quelqu'un, absolument vous peut littéralement écrire printf puis passer dans les arguments que vous voulez, et le programme va travailler, comme il l'a depuis mercredi. Mais vous pouvez commencer à abstraire la notion de l'impression d'un nom. Vous pouvez lui donner un nom, comme printName, et cela est cette idée de superposition de la semaine 0. Désormais, je et tu ne dois savoir ou de soin comment printName est mis en œuvre. Oui, il utilise printf, peut-être ne fait pas, qui sait ce qui utilise? On s'en fiche? Maintenant, je veux parler ici, au lieu de descendre ici. Et en effet, que nos programmes obtiennent plus avancé et sophistiqué, nous allons continuer à prendre pour acquis que la baisse des morceaux de puzzle niveau existent. Parce que nous les écrivions ou quelqu'un d'autre a fait, de manière que nous puissions construire au-dessus d'eux. Jetons un oeil à ce variante, fonctionner un. Alors celui-ci est un peu plus avancée, mais il se trouve que, dans la bibliothèque de CS50, il ya seulement une fonction de getint. Nous ne pensons pas, il ya des années, à mettre en œuvre une fonction GetPositiveInt. Et cela est un peu ennuyeux car si vous les gars écrivez un programme dans lequel vous voulez obtenir un résultat positif nombre entier de l'utilisateur, vous ne pouvez absolument utiliser getint. Et vous ne pouvez absolument vérifier avec la condition et peut-être une boucle si cela est plus grand int à 0 et crier à l'utilisateur si il ou elle ne donne pas vous un nombre positif. Mais nous allons construire cette bâtiment nous bloquer, un, pièce de Scratch personnalisé, si vous voulez. Je vais avoir un programme ici que, finalement, je veulent être en mesure d'appeler GetPositiveInt, et je veux être en mesure d'imprimer quoi que int est. Mais cela est abstrait loin maintenant. Il vient d'être donné un niveau élevé nom qui dit ce qu'il fait, ce qui est merveilleux, car il est très intuitive maintenant à lire. Et si je fais attention à ce qu'il ya dessous le capot, permettez-moi de faire défiler vers le bas. Et il est un peu intimidant au début, surtout si cela est votre premier programme, mais nous allons jeter un coup d'oeil. Je ne suis plus dire, nulle car il se trouve fonctions, un peu comme GetString, peut retourner une valeur pour moi. Ils ne sont pas tout simplement avoir d'imprimer à l'écran, ils peuvent effectivement main moi quelque chose en retour. Et alors qu'avant printName, Je ne dois rien en retour. Je devais l'effet secondaire de quelque chose à apparaître sur l'écran, mais je ne l'ai pas besoin d'un homme pour me remettre quelque chose en retour. Ici, avec GetPositiveInt, comme avec getint, Je veux être remis quelque chose en retour. Donc, je dis pas, nulle sur la ligne 23, mais int, qui dit, cette fonction que je vous écris, appelé GetPositiveInt va donnez-moi revenir un entier, non rien, pas nulle. En attendant, il va prendre pas entrées, je me suis, en quelque sorte, il inversés. Je ne donne pas toute GetPositiveInt entrée, je veux qu'il me donne sa sortie. Et puis ce qui se passe maintenant? Alors, voici comment je peux déclarer une variable. Je l'ai fait en dehors de la boucle, pour des raisons que nous finirons par voyons, mais cela donne juste m'a appelé 32 bits, n, et je l'ai pré-détermination les pour stocker entier. Et voici que, tout faire construction, et cela est pourquoi il est utile. Littéralement ce faire, tandis que n est inférieur à 1. Voyons donc ce qui se passe. Je imprimer, s'il vous plaît me donner un int positif. Je reçois alors un int, en utilisant de CS50 fonctionner et stockée dans n. Et puis, ce que la ligne de code probablement est exécuté suivante, logiquement? Quel numéro de ligne? Ouais, donc 31. Vous ne voudriez pas savoir jusqu'à ce que vous avez été dit ou sorte de le déduire, mais cela est vrai. Il va de haut en bas et maintient ensuite répéter. Donc, si je l'ai tapé par exemple, le nombre 1 négative, est n inférieur à 1 négative? Ouais. Parce que 1 négatif est inférieur à 1. Donc, ce qui devrait arriver? Je vais le faire tandis que n est inférieur à 1, donc je vais revenir à la ligne 28. Et chaque time-- et exécutons this-- faire fonction 1 à compiler, et parsemer désormais fonction 1 slash. Si je tape négative 1, il est va continuer à me crier dessus jusqu'à ce que je coopère parce que chaque de mes entrées est inférieur à 1 et tandis que si elle est inférieure à 1, Je vais continuer à faire ça. Si je lui donne enfin un certain nombre comme 50, Heureusement, il est dit, merci pour le 50. Pourquoi? Parce que dès que n est égal à au moins 1, je arrêter rester coincé dans cette boucle, et ce nouveau mot-clé aujourd'hui, retour, fait littéralement que. Donc, je viens de mise en œuvre, dans un sens, l'équivalent de GetString, où je remets Retour à celui qui me utilise, une certaine valeur. Il ne doit pas être une chaîne, il est un int. Ainsi, un simple, rapide par exemple, mais nous allons bientôt voir plus sophistiqué versions fixes. En fait, nous allons jeter un oeil à un une numérique, qui est appelé return.c. Et celui-ci est en fait un peu plus simple. Donc, le but de ce programme en life-- nous allons compiler et exécuter elle, alors assurez-retour, dot slash, préavis return-- le programme cubes simplement la valeur 2. Il est assez stupide, il est difficile code, il ne prend pas toutes les entrées, mais cela démontre une autre fonction que je me ai écrit. Donc ici, je l'ai déclaré un variable appelée x, de type int, égal au nombre 2, complètement arbitraire. Ceci est juste un peu l'impression moelleux. Il dit x est maintenant, et comme tels, cubage Dot Dot Dot. Et la magie est apparemment à la ligne 21. Je vais appeler une fonction appelée, cube, Je remettre une feuille de papier avec le numéro 2 écrit sur elle, et quelle valeur, mathématiquement, que je veux sortir de là? Tout comme un test de cohérence? 8. Droit? Je veux 2 Cubed arrière, 2 à la puissance de 3, donc 8 dos. Alors, où est mis en œuvre cube? Eh bien, remarquez qu'il est implémenté ici. Et comme avant, logiquement, même si la syntaxe est probablement très nouveau pour beaucoup d'entre vous, Je veux cette fonction pour me remettre une feuille de retour papier avec un int sur elle. Donc je dois un int, le nom est arbitraire, mais commodément appelée cube. L'entrée à elle, est n type entier, de sorte que ce comment je peux passer le nombre 2 sur une feuille de papier. Et puis il se trouve C supports mathématiques, donc vous ne disposez pas de x pour les temps, il suffit d'utiliser l'astérisque pour la multiplication. Et cela renvoie n fois n fois n, qui est simplement une valeur au cube. Alors, où allons-nous avec tout cela? Ceci est certainement un visite éclair, rassurez-vous, que les sections de super à et problème posé 1, vous serez Traversé tout cela d'autant plus. Et dans le problème réglé 1, nous allons la transition du monde graphique de Scratch à quelque chose de plus la ligne de commande en C. Mais nous inspirons à partir de ce jeu ici d'antan, dans laquelle utilisant C et l'édition standard de la p jeu vous allez mettre en œuvre la pyramide de Mario. Et dans l'édition pirate de la p ensemble, si vous choisissez d'élire, vous allez mettre en œuvre un peu plus contestant pyramide avec deux pics. Vous aurez également mettre en œuvre une algorithme, un algorithme glouton. Il se trouve qu'il ya une logique intéressante derrière le processus de courir la station de caissière et effectivement remise quelqu'un de la monnaie. Il est un algorithme qui est assez simple, que vous pourriez même saisir intuitivement quand vous lisez d'abord it-- se rendre compte que ce que je ai toujours fait chaque fois que je l'ai donné à quelqu'un une certaine back-- argent qui vous permet de toujours minimiser le nombre de notes de papier ou de pièces métalliques que vous remettre à l'utilisateur. Et cela, bien sûr, est convaincante parce que si vous allez à CVS ou autres joyeusetés, vous ne voulez pas être remis tout un tas de ceux ou tout un tas de pièces de monnaie. Vous voulez le moins pièces de monnaie, sans doute, possible. Enfin, vous aurez également être contestée à tremper dans le monde de l'eau et réellement obtenir une appréciation pour un mappage entre les taux de flux, d'aimer, de l'eau dans une douche, combien l'eau est utilisée. Et l'allusion qui y sont, sera ce clip ici, que nous finirons sur pour seulement 60 secondes, que brosse un tableau de faible débit des pommes de douche. [LECTURE VIDÉO] -Bien. Je me suis tout ici. Je suis la Série F Cyclone, Hydra, Jetflow, Stockholm Supersteam, you name it. -Et Qu'est-ce que vous recommandez? -Que cherchez-vous? -Homme de pouvoir. Power. -Comme Silkwood. -C'est Pour le rayonnement. -C'est vrai. -Maintenant Qu'est-ce? -C'est Le Commando 450. Je ne vends pas celui-là. -Mais Voilà ce que nous voulons. Il est un commando 450. -Pas De me croire. Il est utilisé dans le cirque. Il est pour les éléphants. -Je Vais rien payer. -Qu'est-Ce à propos de Jerry? -Il Ne pouvait pas gérer cela. Il est délicat. Oh oui. [FIN LECTURE] DAVID MALAN J: Très bien. Voilà si pour CS50. Nous vous verrons la semaine prochaine. ENCEINTE 1: [? Scully?], [? Ian,?] dans la mesure où ce projet de outro, qu'est-ce que vous les gars venir avec? SPEAKER 2: Eh bien, nous avons donné une variété de la pensée, et nous pensons que la meilleure façon to-- Intervenant 3: Puis-je? SPEAKER 2: Ouais. Par tous les moyens, en fait. Intervenant 3: Donc, je pense nous pouvons résumer notre idée pour les outros avec un rien word--. DAVID MALAN J: Rien? Intervenant 3: Rien. DAVID MALAN J: Qu'est-ce que cela signifie? Intervenant 3: Les outros sont pour rien. SPEAKER 2: Eh bien, je veux dire, dans la philosophie, Je veux dire, rien est toujours quelque chose. ENCEINTE 1: Alors what's-- ce qui est le principe? Intervenant 3: Donc, il est comme la vie. D'ACCORD. Qu'avez-vous fait aujourd'hui? DAVID MALAN J: je me suis levé, avait le petit déjeuner, et sont venus travailler. Intervenant 3: Voilà une outro. SPEAKER 2: Mais, je veux dire, ne devrait pas quelque chose lui arrive sur the-- Intervenant 3: Non, non, non, non. Rien ne se passe. ENCEINTE 1: Alors, pourquoi sommes-nous regarde? Intervenant 3: Parce que il est une outro pour CS50. DAVID MALAN J: Pas encore.