DAVID J MALAN: Alle Recht, das ist so CS50. Und dies ist eindeutig ein Freitag. Und das ist das Ende der Woche ein. So können Sie sich erinnern, dass wir aufgehört haben, letzten Mal, mit einem Cliffhanger der Arten. Wobei wir diese Lüge entlarven, dass kein Egal, was Sie gelehrt wurde wachsenden up, 1 geteilt durch 10 ist, in Tatsächlich 0,1 oder 0,100 oder 0,10000. In der Tat, wenn wir diese zu kompilieren Programm, wie wir gestern getan hat, mit, machen Ungenauigkeit, und dann tun dot, Schrägstrich, Ungenauigkeit, erfuhren wir, dass das ist, was ist 1 geteilt durch 10 tatsächlich ist. Also das ist wirklich nicht ganz der Fall. Aber das tut Hinweis auf einige grundlegende Einschränkung von Computern. Und in der Tat, unter den Dinge, die wir tun werden heute einen Blick auf, warum diese hat passiert, welche Auswirkungen dies hat, wie die Menschheit ist fehlgeschlagen , dies in einigen sehr erfassen ernste situations-- das Ergebnis der dem hat ziemlich tragisch gewesen und expensive-- auch werfen Sie einen Blick an, wie wir kann tatsächlich zu verteidigen gegen diese Art von Einschränkungen. So intuitiv vielleicht, Deshalb wird 1 geteilt durch 10, nach meinem Computer hier, nicht nur 1/10, 0.10? Ja. Was denken Sie? Zuschauer: Die Wurzel ist anders? DAVID J MALAN: Das ist was? Oh, ist das radix anders? Also nicht ganz. Es ist eigentlich mehr wesentlich für die Hardware. Andere Gedanken? Ja. Zuschauer: Sie Zahlen dar, anders? DAVID J MALAN: So they-- Rechts. Sie repräsentieren Zahlen unterschiedlich. Ungenau, anscheinend. So dass ist-- Nun, anders als das, was? Oder von wem? Von uns? Zuschauer: Ja. Sie verwenden nicht das Dezimalsystem System [unverständlich]. DAVID J MALAN: OK. In einem gewissen Sinn, sie nicht verwenden Sie das Dezimalsystem. Unter der Haube, alles ist in der Tat, binär, und das ist, damit verbundene, in der Tat. Aber es ist auch eine einfachere Erklärung als das. Ja. Zuschauer: Sie nur so viele Bits. Sie können nur bis zu einem gewissen Maße, wie bei den Dezimalstellen. DAVID J MALAN: Ja. Dies ist, was wirklich immer auf sie. Es stellt sich heraus, dass die Computer Typischerweise wird immer nur verwenden eine begrenzte Menge von Informationen um etwas darzustellen. Recht? Schließlich haben wir nur eine feste Menge an Festplattenspeicher. Wir haben nur einen festen Betrag RAM, oder Computer-Speicher. Und wenn Sie nur einen Anzahlung in Höhe von etwas, sicher können Sie nicht wirklich zählen bis bis unendlich oder eine beliebige Anzahl Sie wollen. Sie, Art, müssen wählen, was Bereich Werte Sie gehen zu unterstützen. Und so zum Beispiel eine Woche oder zwei vor, wenn wir über ASCII sprach, und wir sprachen über 8 Bit, oder ein Byte, sozusagen die größte Zahl konnten wir stellen mit 8 Bit war, was? 255. Und wir können 256 Gesamtwerte stellen aber nicht, wenn wir verbringen eine von ihnen auf 0-- Naja, aber wenn wir verbringen, einer von ihnen auf 0, dann ist die größte Zahl Selbstverständlich ist, 255. So stellt sich heraus, dass es sich um Auch der Fall, in diesem Kontext. Wir kamen ins Gespräch, das letzte Mal, über Gleitkommazahlen, die verschieden sind aus ganzen Zahlen, in dass sie eine Dezimalstelle haben und hoffentlich auch ein paar Zahlen Danach, aber sie sind auch. Ein Computer ist nur in der Regel gehen auf 32 Bit, vielleicht 64 Bits zu verwenden einen Floating-Point-Wert darzustellen. Also auch wenn wir erwachsen geworden Lernen von Mathematik und zu wissen, dass Sie unbedingt können eine unendliche Anzahl von Nummern nach dem Komma, nicht wenn Sie endlichen Speicher. Sie, Art, haben zu runden, oder auswählen, welche Zahlen Sie gehen zu repräsentieren. Und so können Sie denken, in gewissem Sinne, dies ist der Computer am nächsten Annäherung an den Wert 1/10 es bekommen kann, mit nur 32 oder so-Bits. Und es ist nicht nur ein Zehntel. Zum Beispiel, wenn ich dies ändern 1/3, was wir denken, ist noch einfacher. Also 1 geteilt durch 3. Lassen Sie mich die Datei zu speichern. Lassen Sie mich gehen Sie vor und neu kompilieren. Und lassen Sie mich wieder ausführen. Auch hier offenbar, 1/3 ist nicht 0,3 und eine unendliche Zahl von 3'S danach. Sie haben diese Ungenauigkeit am Ende. So sind wir Menschen sind richtig, und was Sie gelernt haben, ist in der Tat richtig, aber wir stoßen up gegen einige Einschränkungen. Und was ich dachte, wir heute tun möchten, ist zu beginnen Dazu suchen Sie in, ehrlich gesagt, die tragischen Folgen dieser manchmal, wenn die Menschheit nicht ganz umzusetzen für diese Realität und dieser Einschränkungen. Und wir werden eine Reihe von Vignetten sehen aus dem History Channel, die statt ein Blick auf, wie die Dinge schief gelaufen ist. Es ist ca. 8 Minuten lang, und wir werden danach zurückkommen und werfen Sie einen Blick auf genau was kann schief gehen. Wenn wir die lights-- dimmen konnte [VIDEO PLAYBACK] -Computer, Wir alle kommen, um zu akzeptieren die oft frustrierenden Probleme, gehen mit ihnen. Bugs, Viren und Software Pannen sind kleine Preise um für die Bequemlichkeit zu zahlen. Aber in der High-Tech-und High-Speed- Militär und Raumfahrt-Anwendungen, das kleinste Problem kann in die Katastrophe vergrößert werden. Am 4. Juni 1996 vorbereitet Wissenschaftler um eine unbemannte Rakete Ariane 5 zu starten. Es wurde die Durchführung wissenschaftlicher Satelliten ausgelegt genau, wie das zu schaffen Magnetfeld wechselwirkt Erde mit Sonnenwinde. Die Rakete wurde gebaut der Europäischen Weltraumorganisation und Ausschalten von seiner Anlage gehoben an der Küste von Französisch-Guayana. -und Etwa 30 Sekunden in die Flucht, sie zum ersten Mal bemerkte etwas falsch lief. Daß die Düsen schwenkbar in einer Art, wie sie sollten wirklich nicht. Rund 40 Sekunden in die Flucht, klar das Fahrzeug war in Schwierigkeiten, und das ist, wenn sie gemacht die Entscheidung, es zu zerstören. Ein Range Safety Officer mit enormen Mut drückte auf den Knopf, explodierte die Rakete, bevor es sich zu einer Gefahr für die öffentliche Sicherheit. Dies war das Mädchen Fahrt der Ariane 5, und seine Zerstörung nahm Stellen aufgrund eines Fehlers in der Software der Rakete eingebettet. -die Problem auf dem Ariane war, dass es war eine Zahl, die erforderlich ist 64 Bit, um auszudrücken, und er wollte zu konvertieren Einem 16-Bit-Zahl. Sie gingen davon aus, dass die Anzahl war nie sehr groß sein, dass die meisten dieser Stellen in die 64-Bit-Zahl waren 0s. Sie waren falsch. -Die Unfähigkeit eines Softwareprogramm zu akzeptieren, die Art der Zahl, erzeugt durch ein anderer war die Ursache für den Ausfall. Software-Entwicklung hatte sich zu einem sehr kostspielig Teil der neuen Technologie. Die Ariane-4-Rakete war sehr gewesen erfolgreich, so viel von der Software geschaffen, denn es war auch auf der Ariane-5 verwendet. -Das Grundproblem war, dass die Ariane 5 war schneller, beschleunigt schneller. Und die Software musste nicht dafür bilanziert. -Die Zerstörung der Rakete war eine riesige finanzielle Katastrophe, alles wegen einer Minute Softwarefehler. Aber dies war nicht der erste Zeitdatenkonvertierungsprobleme hatte modernen Raketentechnik geplagt. -Im Jahr 1991 mit dem Start des ersten Golfkrieg, der Patriot Raketen erlebt eine ähnliche Art der Anzahl Umwandlung Problem. Als Folge 28 Personen, 28 amerikanische Soldaten wurden getötet und über 100 weitere verletzt, wenn der Patriot, die angeblich gegen eingehende scuds zu schützen, versagt, eine Rakete abzufeuern. -Wenn Der Irak in Kuwait einmarschierte und Amerika ins Leben gerufen Desert Storm Anfang 1991, Patriot Raketen-Batterien eingesetzt wurden zum Schutz Saudi-Arabien und Israel von irakischen Scud-Raketenangriffe. Der Patriot ist ein US, Mittelstrecken- Boden-Luft-System von der Raytheon Company. -Die Größe des Patriot Abfangjäger, selbst, ist zu rund 20 Meter lang. Und wiegt etwa 2000 Pfund. Und es hat einen Sprengkopf von about-- trägt Ich denke, es ist rund 150 Pfund. Und der Gefechtskopf, selbst, ist eine hochexplosive, was sich Fragmente um ihn herum. Die Hülle des Gefechtskopfes ist entworfen, um wie Schrot zu handeln. -Die Raketen sind durchgeführt, 4 pro Container, und werden durch einen Sattelanhänger transportiert. -Die Patriot Anti-Raketen-System geht mindestens 20 Jahren. Es wurde ursprünglich entwickelt, als Luftabwehrrakete abzuschießen feindliche Flugzeuge. In dem ersten Golfkrieg, wenn, dass der Krieg kam, die Armee wollte es zu benutzen abzuschießen scuds, keine Flugzeuge. Die irakische Waffen nicht so sehr ein Problem, aber die Armee zu scuds besorgt. Und so versuchten sie, Upgrade der Patriot. -Intercepting Einen Feind Rakete reist am mach fünf sein würde genug Herausforderung. Aber als der Patriot in Dienst stürzte, die Armee war nicht bekannt, ein Irakische Änderung, die vorgenommen ihre scuds fast unmöglich zu schlagen. -Was Passiert, ist, dass die scuds kamen in, waren instabil, sie wackeln. Der Grund dafür, war die Iraker, um zu 600 Kilometer raus eine 300 Kilometer lange Streckenrakete, nahm Gewicht aus dem vorderen Gefechtskopf und aus der Gefechtskopf leichter. So, jetzt, das Patriot versuchen zu kommen am scud und die meiste Zeit, die überwiegende Mehrheit der Zeit, wäre es einfach zu fliegen durch die Scud. -Wenn Die Patriot Netzbetreiber realisiert der Patriot sein Ziel verfehlt, sie detonierte der Patriot Gefechtskopf, um mögliche Verluste zu vermeiden, wenn es wurde auf den Boden fallen. -Das War das, was die meisten Menschen sah, diese großen Feuerbälle in den Himmel, und so missverstanden Abschnitte mit Scud Sprengköpfe. Obwohl in der Nacht Himmel erschien Patriots erfolgreich zu sein, Zerstörung scuds, bei Dhahran, es könne keine Fehler über seine Leistung. Dort wird der Patriot-Radarsystem verlor eines eingehenden Scud, und nie ins Leben gerufen, aufgrund eines Software-Fehler. Es waren die Israelis, die zum ersten Mal entdeckt dass je länger das System eingeschaltet war, je größer die Zeitabweichung geworden ist, aufgrund eines Takt eingebettet in dem Computer des Systems. -Über 2 Wochen vor die Tragödie in Dhahran, die Israelis berichtet, das Verteidigungsministerium, dass das System Zeit zu verlieren, dass nach etwa 8 Stunden des Laufens, sie bemerkten, dass das System zusehends weniger genau. Das Verteidigungsministerium reagierte mit sagen alle der Patriot-Batterien um die Systeme nicht verlassen, für eine lange Zeit. Sie sagten nie, was eine lange Zeit war. 8 Stunden? 10 Stunden? 1000 Stunden? Niemand wusste. -Die Patriot-Batterie in der Kaserne stationiert bei Dhahran, und seine fehlerhaften internen Uhr, war auf über 100 Stunden gewesen in der Nacht des 25. Februar. -it Raupenzeit mit einer Genauigkeit von etwa 1/10 Sekunde. Jetzt 1/10 Sekunde ist eine interessante Zahl weil es nicht sein kann in binärer Ausdruck gebracht, genau. Das bedeutet, es kann nicht ausgedrückt werden kann, exakt, in jedem modernen digitalen Computers. Es ist schwer zu glauben, aber dies als ein Beispiel. Lassen Sie uns die Zahl, 1/3. 1/3 kann nicht ausgedrückt werden in Dezimal genau. 1/3 ist 0.333 geht für Unendlichkeit. Es gibt keine Möglichkeit, das zu tun, mit absolute Genauigkeit, in Dezimal. Das ist genau die gleiche Art von Problem, das in der Patriot passiert. Je länger das System lief, die schlechter die Zeitfehler wurde. -nach 100 Betriebsstunden, die Fehler in der Zeit war nur ungefähr 1/3 Sekunde. Aber in Bezug auf ein Ziel Raketen Reisen bei Mach 5, es ergab sich ein Verfolgungs Fehler von über 600 Metern. Es wäre ein fataler Fehler sein für die Soldaten in Dhahran. -Was Passiert, ist eine Scud Start war von Frühwarnsatelliten erkannt, und sie neu, dass die Scud war kommen in ihrer allgemeinen Richtung. Sie wussten nicht, wo sie kommen würde. -Es War nun an der Radar Bestandteil des Patriot-System, verteidigen Dhahran, zu finden und zu halten, Spur des ankommenden feindlichen Rakete. -Die Radar war sehr smart. Es wäre tatsächlich verfolgen die Position der Scud und dann vorhersagen, wo es wohl sein würde, das nächste Mal, das Radar schickte einen Impuls aus. Das war der Range-Gate bezeichnet. -Dann, Einst der Patriot entscheidet genug Zeit hat übergeben, zurück und überprüfen Sie die nächsten Standort für diese erkannte Objekt, es geht zurück. Also, wenn es ging zurück in die falsche Ort, dann sieht keinen Objekt und es entscheidet, dass es keinen Aufgabe war es eine falsche Erfassung, und lässt den Track. Der eingehende Scud verschwunden von dem Radarschirm, und Sekunden später ist es schlug in der Kaserne. Die Scud getötet 28 und war der letzte eine während des ersten Golfkrieges gebrannt. Tragischerweise die aktualisierte Software kamen in Dhahran am folgenden Tag. Das Software-Fehler hatte behoben, Schließ ein Kapitel in der unruhigen Geschichte des Patriot-Rakete. [END PLAYBACK] DAVID J MALAN: Also werden wir ein Blick in einige ähnliche Beschränkungen in der nur ein bisschen. Aber zuerst, lassen Sie uns Übergang zu einer weniger FYI ist. So one-- diesem Wochenende gibt wird Superschnitte sein, die dazu bestimmt sind, zu ersetzen regelmäßige Abschnitte, die wird somit starten pro Woche. Werfen Sie einen Blick auf die CS50-Website für weitere Informationen über diese. Sie werden auch gefilmt und gestreamt werden Leben für die, nicht teilnehmen. Problem Set 1 ist auf der Natürlich Webseite bereits, und wir werden ein Blick in dass in nur ein wenig. Und Sprechzeiten auch dauern wird Stellen Sie das von Montag bis Donnerstag. Das war also die meisten kanonischen Programm haben wir uns beim letzten Mal. Es ist wie der einfachste Programm können Sie in C schreiben, und auch das ist ein bisschen wie eine kühne Behauptung. Recht? Da gibt es eine Menge von scheinbaren Komplexität zu diesem. Werfen wir also einen Blick auf was einige dieser Elemente waren und versuchen Sie es dann zur Verfügung zu stellen eine mentale Modell dafür, wie diese einfachsten Programmen arbeiten, und dann werden wir beginnen die Dinge zu betrachten immer komplexer. Also diese Linie hier, markiert nun, in gelb, was haben wir gesagt, das letzte Mal, dass dies für uns tut? Was ist der Zweck dient? Alle Bewerber aus weiter zurück? Ja. Zuschauer: [unverständlich] DAVID J MALAN: Good. Also es gibt Ihnen Zugriff Befehle, oder lassen Sie uns nennen sie Funktionen, dass jemand sonst schrieb, dass deklariert sind, sozusagen in einer anderen Datei. Also werden wir genau das, was eine h-Datei zu sehen ist im Vergleich zu einer C-Datei, eventuell. Aber jetzt weiß nur, printf dass, zum Beispiel, ist eine der Funktionen, die gewesen sein erklärte in einer anderen Datei, irgendwo sonst auf der Festplatte des Cloud ist das ermöglicht es uns printf den Zugriff auf und verwenden Sie es ohne neu zu erfinden , die uns Rades. Inzwischen Haupt. Was war der analoge Haupt, letzte Woche? Ja. Zuschauer: Grüne Flagge geklickt wird. DAVID J MALAN: Ja. Scratch ist, wenn grüne Flagge geklickt. Es ist wie das Puzzlestück dass Kicks off Dinge. Und so ähnlich, hat die Welt vor einigen Jahren, dass beschlossen, in C, und eine Reihe von anderen Sprachen, Wenn Sie ein Programm schreiben wollen, Ihre erste Funktion hat zu nennen, Haupt. Und es muss so aussehen. Aber wir werden wieder kommen, Ein anderes Mal, was, int, und, nichtig bedeutet in diesem Zusammenhang. Denn jetzt sind die geschweiften Klammern Art der wie Puzzleteil Form Scratch daß kapselt einer Anzahl Zeilen. Und zwischen den Linien Hier, das ist hier. printf ist eine Funktion, deren Zweck in Leben ist, um eine formatierte Zeichenfolge zu drucken. Und formatiert, ich meine, Sie kann in Platzhalterwerte stecken, und Sie können, wie viele Nachkommastellen angeben Punkte, wie viele Zahlen zu drucken nach einer Dezimalstelle und dergleichen. Und printf, natürlich, nimmt ein oder mehrere Argumente oder Parameter, ansonsten bekannter, einfacher, als Eingänge. So printf, wie eine Menge von Funktionen, nimmt Eingänge. Und diese Eingänge umarmt werden von den beiden Klammern hier. Und innerhalb von denen ist ein Eingang. Es ist eine Schnur, wie wir es nannten habe, Das ist nur eine Folge von Zeichen, wie ein Wort oder eine Phrase oder eine ganze Essay selbst, zwischen Anführungszeichen. Und das ist, was los ist, um den Einfluss Verhalten printf weil natürlich es ist nur eine generische Druckfunktion. Es wird nicht zu wissen, was zu drucken, sofern Sie es nicht zu erzählen. Und dann, einige Kleinigkeiten. Was haben wir sagen, diese seltsame Folge von Symbolen ist? Ja. Zuschauer: New Line. DAVID J MALAN: New Line. So stellt sich heraus, die Sie nicht nur schlagen können, Geben Sie, wenn Sie das Schreiben des Programms sind. Im allgemeinen wird der Compiler sein wollen ein wenig verwirrt, was du meinst. Vielmehr muss man buchstäblich sagen, gib mir eine neue Linie hier. Und so / n ist, was wir in der Regel rufen Sie ein Escape-Zeichen. So n, für die neue Linie. Und der Compiler weiß, dass, wenn es sieht / n, sollte es eigentlich zu induzieren den Computer, Letztlich oder printf, in diesem Fall, zum Ausdrucken eine tatsächliche neue Linie, wie das Schlagen der, geben, Taste auf Ihrer Tastatur. Und schließlich, was haben wir sagen, dieses Stück Syntax ist für? Was stellt es dar? Ja. Zuschauer: [unverständlich] DAVID J MALAN: Es ist nur, das Ende der Leitung. Es ist das Ende der Anweisung. Und erkennen, dass wir es nicht tun legte sie überall. Wir sicherlich legen Sie sie nicht an den Enden jeder Zeile. Zum Beispiel gibt es keine auf dem erste Zeile, gibt es keine auf der Linie mit, Haupt, gibt es keine nach den geschweiften Klammern, aber Sie werden beginnen, um zu sehen und zu erhalten vertraut mit, wo es gefragt. Und es ist fast immer nach einer Funktion anrufen oder eine Aussage, eine Aktion dass Sie tatsächlich nehmen. Und jetzt weiß, vor allem, wenn unter denen, weniger komfortabel, Dies sind die Arten von Dummheiten dass Sie am Ende versehentlich hämmern Ihren Kopf gegen die Wand über. Weil Sie logisch zuversichtlich, in einigen Problem Sie für ein Problem gelöst haben Set, und das verdammte Ding einfach wird nicht kompiliert oder sogar laufen. Und so oft, schon früh, es ist zu gehen sein, weil Sie eine Klammer verpasst, oder Sie ein Semikolon verpasst. Und so einfach bewusst sein, Diese Arten von Dingen, und versuchen, nicht durch frustriert sie, weil sehr schnell funktioniert das werden ein alter Hut. Aber es ist sehr leicht zu bekommen frustriert frühzeitig, als Ergebnis. So, jetzt lassen Sie uns einen Blick darauf, wie diese Linie ist tatsächlich arbeiten und anschließend bei einer etwas aussehen mehr kompliziert. Also haben wir hier, die haben über Fähigkeit, auf diesem Bildschirm zu zeichnen. Und lassen Sie uns annehmen, dass dies ist mein Computer-Bildschirm, aber ich schreibe das, hallo-Programm, und ich habe nicht realisiert, printf. Jemand anders hat umgesetzt, printf. Wer möchte Anspruch umgesetzt haben, printf? Wenn wir? Also gut, was ist Ihr Name? STUDENT 1: [? Copal. ?] DAVID J MALAN: Copal, komm herauf. Komm auf. Gut. So haben wir hier einige Namensschilder, Da wir ein kleines Spiel daraus machen. Und wir werden Sie anrufen, printf. Und wenn Sie hierher kommen wollen, was ich gerade auf dem Bildschirm gezeichnet, es ist ganz einfach, es gibt mir diese. Also gut, ja, hallo mein name ist, printf, wenn Sie möchten, dass anziehen. Gut. Und wenn Sie Stand gehen von dem Computer-Bildschirm als ob Sie die Funktion ist, dass kam mit diesem Computersystem. Und Ihr Ziel im Leben ist um tatsächlich etwas zu drucken. Aber ähnlich wie das Programm, das wir hatte gerade auf dem Bildschirm, hier, wir werden zu müssen tatsächlich geben Ihnen eine Eingabe. Und so, wenn meine Eingang, hier ist offenbar, was vergangen printf, lassen Sie uns Art verspotten es so. Ich werde buchstäblich auf zu schreiben ein Stück Papier: "Hallo, Welt" Backslash N. Und klar zu sein, was Ich habe gerade auf diesem Stück Papier gezeichnet, sieht wie folgt aus. Also, wenn ich dieses Programm, und dieses gelbe Zeile Code wird ausgeführt, es ist, als ob ich, der hallo-Programm, ich reichte eine Eingabe aus, um eine Funktion dass jemand anderes geschrieben hat. Und wenn Sie, mit Ihrem Finger, könnte tatsächlich, mit dem Finger, Zeichnen auf dem Bildschirm unabhängig es Sie überliefert wurden, der Effekt ist letztlich auf genau sehen, dass auf dem Bildschirm. Und eine kleine Ecke Fall. Und gut, die wir nicht sehen sollte die, neue Linie, an dieser Stelle. Es wäre falsch für Sie explizit ziehen den Zeilenumbruch. Aber wenn wir gehalten Schreiben von Wörtern auf der Bildschirm, würde sie am Ende darunter. Also vielen Dank, aber Stick hier in der Gegend für nur einen Moment. Wir brauchen jetzt eine weitere Ehrenamtliche Arbeit, wenn wir könnten, das geht zu müssen, um die Rolle zu spielen von-- Es ist nur die Menschen im Orchester jetzt. Wie about-- OK. Genau hier. Komm auf. Wie heißen Sie? STUDENT 2: [? Ivay. ?] DAVID J MALAN: Es tut uns leid? STUDENT 2: [? Ivay. ?] DAVID J MALAN: Ethan, komm herauf. Nein? Habe ich das falsch, auch nachdem Sie es zweimal gesagt? Komm auf. Es ist schwer, hier zu hören auf. OK. Und es tut mir leid, was ist Ihr Name? STUDENT 2: [? Ivay. ?] [? DAVID J MALAN: Ivay. ?] OK. Denn jetzt, wenn Sie nicht Geist, Sie sind GetString. STUDENT 2: OK. Cool. DAVID J MALAN: Also, wenn würden Sie gerne hier stehen nur für einen Augenblick, Werfen wir einen Blick auf eine etwas komplexeres Programm, daß hat jetzt drei Zeilen Code. So haben wir, ein, geben Sie Ihren Namen mit printf; zwei, ein Aufruf an GetString, gefolgt von einer Zuordnung zu einer Variable, String s oder s genannt; und dann ein weiterer Anruf an, printf, diesmal jedoch mit zwei Eingängen. So haben wir bereits getan Zustand Ihren Namen, oder besser gesagt, wir haben bereits eine printf getan. Also werde ich zu schreiben, geben Sie Ihren Namen. Und so, was ich zu gehen übergeben, printf, in nur einem Augenblick, ist schlicht und einfach, dies. Also, wenn Sie voran gehen und ziehen diese wollen auf dem Bildschirm, das ist jetzt Ihre Eingabe. Gut. Und vergessen Zeichenfolge, die wir jetzt haben unsere eigene Codezeile hier. Also, GetString, müssen wir tatsächlich zu nennen, GetString. Also Ihr Ziel im Leben ist es, nur zu Fuß in die Orchester, wenn du könntest, und erhalten Sie jemandes Namen. Aber lassen Sie uns Ihnen etwas, es anzuziehen. Wenn Sie möchten, gehen Sie voran und erhalten Sie eine Zeichenfolge, jemanden Namen auf, dass Stück Papier, wenn du könntest. Gut. Und wir werden sehen, in nur einem Augenblick, dessen Namen wir bekommen. In der Zwischenzeit, was ich zu gehen müssen bereit sein, ein leeres Blatt Papier, bei dem werde ich zu speichern, was es Wert ist, dass GetString ist zu mir zurückkehrt, Ich, ein String-Variable genannt, s. Gut. So was tun Sie hier? Nik. Gut. So Niks Namen haben wir hier. Also das ist, was wörtlich zurückgeführt wurde zu mir, so zu sprechen, von GetString. Ich, jetzt werde führen Sie die linke Seite dieses Ausdrucks, wo ich einfach notieren, für heutige Zwecke, Nik. So, jetzt habe ich eine variable genannt, s, Nik Namen speichern. Ich habe bereits übergeben printf, eine vorherige Argument. Aber in unserem dritten und letzten Zeile des Code, habe ich eigentlich auf der Hand printf haben etwas ein wenig different-- "Hallo,% s" Backslash n. Und so ist die letzte Zeile Ich werde um das letzte, was ich bin send-- denn jetzt notieren, ist dies. So sind die beiden Codezeilen oder vielmehr die letzte Codezeile, Anrufe für zwei inputs-- eins, das, und zwei dieser. Also, wenn Sie unsere Funktion printf können nun diese als Eingabe, Lassen Sie mich klar den Bildschirm für Sie. Eigentlich nicht, können Sie weitermachen. Wir überlasse es, da es ist auf dem gleichen Programm. Wir sollten sehen, hallo, Nik. Gut. Das war also eine ganze Reihe Reifen zu kurz springen, zu schreiben, geben Sie Ihre zu nennen, und, hallo, Nik. Aber diese einfache Idee des Message Passing, Eingangsübergang und Ausgangsempfangs, ist genau das Modell, das wir gehen zu müssen selbst für die komplexesten Funktionen. Also vielen Dank an euch beide. Wir haben einen schönen Stress Ball für Sie da. Und ich danke Ihnen für unsere GetString printf und Freiwillige gleichermaßen. Danke. Gut. Vielen Dank an euch beide. Also haben wir gesprochen haben bisher, vor allem über Saiten. Und es stellt sich heraus, dass C tatsächlich verstehen, ein paar verschiedene Datentypen. In der Tat, lassen Sie uns eine an diese hier. So C, und eine Menge von Sprachen, verstehen, Dinge genannt chars. Ein Zeichen ist im Allgemeinen ein Single-Byte oder acht Bits. Und es steht für ein einzelnes Zeichen, wie der Buchstabe A, oder die Hauptstadt Buchstabe A, oder der Kleinbuchstabe A, oder einem Ausrufezeichen, oder ein beliebiges Zeichen, die Sie eingeben können Ihrer Tastatur, und manchmal sogar mehr. Wir zufällig auch Schwimmer zu sehen. Ein Schwimmer ist im Allgemeinen ein 32-Bit-Wert oder vier Bytes denn einmal ist ein Byte acht Bits. So ein Schwimmer ist ein Fließkommawert, etwas mit einem Komma. Und in der Tat, das ist was der Film wurde im Gespräch etwa wenn sie über schwimm sprachen Punktwerte, einige feste Anzahl von Bits verwendet wird, um eine reelle Zahl zu repräsentieren. Aber es gibt auch Dinge genannt Doppelzimmer. Diese gibt es in Java, wenn Sie APCS genommen haben, und eine doppelte, wie der Name zum Glück sagt, ist doppelt so groß wie einen Schwimmer. Es ist immer noch eine reelle Zahl, es muss nur mehr Bits mit denen jemals genauer oder auch größere Zahlen zu speichern. int ist einfach. Wir haben darüber gesprochen, dass das letzte Mal. Es ist nur eine Zahl. Und es ist in der Regel 32 Bits oder vier Bytes. Und so, wenn Sie haben, lassen Sie uns nun sehen, 32 bits-- und wir haben dies in Woche 0, noch so briefly-- wenn Sie 32 Bit, was ist der größte Nummer, die Sie als ganze Zahl darstellen kann? Geben oder nehmen? Es ist wie 4 Milliarden, und das ist nur, wenn wir was nur positive Zahlen. Wenn Sie 32 Bit, und Sie möchten repräsentieren negative Zahlen als gut, Ihren Bereich ist, im wesentlichen, negativen 2 Milliarden zu positiven 2 Milliarden. Aber im Allgemeinen, wir starten bei 0 gehen bis zu 4 Milliarden. Sie müssen nicht genau wissen, aber Wir können dies zu sehen, in der Tat, wenn ich nur eröffnen ein kleines Taschenrechner, hier. I 2 der 32 tun können, und das ist genau, wie groß, wie viele Werte möglich darstellen, mit 32 Bit. Und es ist ungefähr 4 Milliarden. Also werden wir sehen immer diese Zahl in einigen verschiedenen Orten. Aber wenn Sie mehr benötigen, Zahlen als das, es stellt sich heraus, es gibt so etwas wie eine lange, lange. Und ein langer, langer ist Regel 64 Bit, die bedeutet, es ist eine Größenordnung sogar größer als ein int. So kann ich nicht einmal das größte ausspricht Nummer, die Sie stellen können, aber es ist deutlich größer. Jetzt nebenbei, historisch, wenn ein int ist 32 Bit, und ein langer, langer 64 Bits, wie Big ist ein langer, nicht eine lange lange? Sie würden denken, es ist mehr als ein int aber vielleicht weniger lang als ein langer, langer, aber es hängt wirklich. Und so stellt sich heraus, ein von den Frustrationen zu, mit dem Schreiben von Code auf bestimmten Systemen, ist, dass nicht alle diese Datentypen haben vor, eine ermittelten Werte. Manchmal ist es so viele Bits. Manchmal ist es, dass viele Bits. So haben Sie eigentlich wissen, manchmal, welche Hardware Sie laufen Ihre Software auf. Gott sei Dank, andere Sprachen und andere Datentypen, die heute existieren, können Sie um genauer zu sein. Nun haben wir gesehen, string, und wir sahen, bool, auch, aber es stellt sich heraus, denen kommen nur mit der CS50-Bibliothek. Das sind also nicht gebaut in C. Diejenigen, statt, kommen in dieser Datei mit dem Namen CS50.h, dass wir irgendwann Ziehen Sie die Schichten. Aber für jetzt, nur sind sie zusätzliche Datentypen. Ein bool ist ein wahr oder falsch ist, und eine String ist eine Folge von Zeichen, wie ein Wort. Jetzt printf, die wir gesehen haben, hat Platzhalter ist% s ein. Und Sie könnten in der Lage, zu sein, jetzt, folgern aus diesen anderen Beispielen, wie Sie könnten einen Platzhalter haben für unterschiedliche Datentypen. Nehmen Sie zum Beispiel eine Vermutung, wenn Sie wollte zum Ausdrucken eines einzelnen char mit printf, ist der Platzhalter wahrscheinlich% c. Und wenn Sie ausdrucken wollen ein ganze Zahl mit dem Platzhalter% i. % LLD ist ein langer, langer Dezimalwert, aber lange, lange, so dass Karten dazu. Und dann% f für schwimm Punktwert oder für ein Doppelzimmer, so dass manchmal sie wiederverwendet in unterschiedlichen Kontexten. Also werden wir sehen und benutzen einige von denen im Laufe der Zeit. Und printf und andere Funktionen auch Unterstützung anderer Escape-Sequenzen, und manchmal sind dies notwendig ist. So Backslash-n ist eine neue Linie. Backslash t, hat jemand wollen einen Stich zu nehmen? Zuschauer: Tab. DAVID J MALAN: Tab. Also, wenn Sie wirklich wollen, , drucken Sie eine Registerkarte, nicht eine feste Anzahl von Räumen, aber ein tatsächlicher Tab-Zeichen, Sie schlagen Sie nicht Ihre, Tab-Taste auf der Tastatur, in der Regel, Sie tatsächlich umgekehrten Schrägstrich t. Backslash doppelte Anführungszeichen, warum sollte ich überhaupt, dass? Recht? Warum kann ich nicht geben Sie nur ein Anführungszeichen auf meiner Tastatur? Zuschauer: Denn sonst ist es gehen zu denken, es ist das Ende der gerne Ihre Druck [? Text. ?] DAVID J MALAN: Genau. Denken Sie daran, mit unseren printf Beispielen als wir passierten im Eingangs printf, Links von diesem Eingabestring und auf der rechten Seite dieses Eingangs Frühling, natürlich, war ein doppeltes Anführungszeichen. Wenn Sie Ihre eigenen Eingang verfügt über ein Doppel Angebot in der Mitte, dass, der Computer möglicherweise potenziell verwirrt, um, funktioniert das doppelte Anführungszeichen gehören in der Mitte? Hat es mit der linken einen gehören? Hat es mit dem rechten gehören? Und so, wenn Sie es super machen wollen klare, Backslash doppelte Anführungszeichen sind Sie, so dass es entgangen, so zu sprechen, und es ist nicht für etwas anderes verschmolzen. Und es gibt noch ein paar andere hier, Backslash r, einfache Anführungszeichen, 0, dass wir im Laufe der Zeit zu sehen, wie gut. Und nun, was funktioniert? So Aktionen, die wir bisher zu nehmen in dieser Sprache, C, na ja, die wir gesehen haben, printf natürlich und alles von den anderen auf dem Bildschirm, hier, dass wir für den Gebrauch finden Nur ersten Wochen Kurs ist, kommen, wenn der CS50-Bibliothek. Und sie machen es viel leichter, in C, um tatsächlich eine Benutzereingabe. Es stellt sich heraus, dass in C, und ehrlich gesagt in wenigen Sprachen, es ist eine echte Schmerzen im Nacken zu tun etwas einfach, wie Aufforderung Benutzer für Tastatur, für seine oder ihre Eingabe. Und so sind diese Funktionen erleichtern. Und es hat auch Fehler Überprüfung im gesamten, so daß, wenn man erinnern, am Mittwoch, den wir sah das, versuchen, Warnung, wenn ich nicht kooperieren, und ich tippte ein Wort, statt eine Zahl? Wir haben die schwere Arbeit getan früh auf, um sicherzustellen, dass der Benutzer arbeitet. Aber das sind nur Ausbildungs Räder, dass wir irgendwann, und zwar schnell, ausziehen. So zu rekapitulieren, dann, lassen Sie uns einen kurzen Blick, ähnlich wie wir mit Scratch, bei did einige kanonische Konstrukte in C Dies soll, sortieren von weise eine rasante Tour, gerade so, dass Sie eine Referenz haben und dass Sie die Dinge auf den ersten gesehen habe. Aber dann werden wir zu Ist-Codierung zu suchen verwenden einige dieser Bausteine. So viel wie in Scratch, als wir Aussagen wie: sagen oder, zu warten, in C, haben wir Funktionen sowie, wie printf. Wenn wir, um eine Bedingung zum Ausdruck bringen wollen, in C, es ist ähnlich, im Geist, in diesem Puzzle-Stück, sah wie folgt in Scratch. Sondern wir buchstäblich nur schreiben, wenn. Und dann in Klammern wir einen Zustand, wobei diese Voraussetzung, was wir rufen, wieder ein boolscher Ausdruck ist. Und wieder ist diese Art von Pseudocode. Und in der Tat, ist die // ein Kommentar. Es ist nur englische Wörter, um mich. Aber dies ist die allgemeine Struktur eines Falls, Zustand. Aber wir werden sehen, Beton Beispiele in nur einem Augenblick. Wenn Sie eine haben wollen Zwei-Wege-Gabel in der Straße, ähnlich wie wir mit unseren Freiwilligen auf tat Mittwoch, können Sie eine haben, sonst, wenn. Und wenn Sie einen dritten haben wollen und Endzustand, oder Standard-Situation, können Sie einfach ein anderes Block haben, gibt. Und in ähnlicher Weise mit Booleschen Ausdrücken, Sie können, und, sie zusammen. Und wir sahen am Mittwoch, dass es ist nicht ein einzelnes und-Zeichen, es ist zwei, aus Gründen, auf niedrigerer Ebene, dass wir werden irgendwann zu sehen und spielen mit. Oder-ing Dinge zusammen 2 vertikale Balken. Auf US-Tastatur, diese ist im Allgemeinen ein Tasten mit der Shift-Taste oben Ihre Eingabe oder Return-Taste. Dann ist da noch diese Dinge, werden wir vielleicht einmal oder zweimal zu verwenden. Sie sind funktionell gleichwertig was man mit einem zu tun, wenn else if, else if anderes, konstruieren, aber sie sind auch als Schalter. Sie sehen sehr unterschiedlich, aber wir werden zu sehen in einigen unserer Vertriebscode, für eine zukünftige Problemsatz, wahrscheinlich, dass es manchmal nur ein hübscher über eine ganze exprimierenden Bündel von Bedingungen, ohne dass eine Menge von geschweiften Klammern und eine Menge von Klammern und Einrückungen. Sie haben uns aber geben Sie nicht mehr Leistung als wir bereits haben. Und jetzt Schleifen. Und dieses, wir freuen an einer etwas langsamer. Aber dann werden wir beginnen, diese zu verwenden, vor allem für diejenigen bereits vertraut. Dies ist der übliche Weg, wenn unglaublich Arkane Weg, um eine Schleife in C schreiben Jetzt war eine Schleife in Scratch ziemlich einfach. Sie haben eine, für immer, Block. Sie haben eine, wiederholen, Block mit nur eine Nummer, müssen Sie eintippen. Und mit dem, for-Schleife, können Sie implementieren diese beiden Ideen, aber es ist ein wenig technisch. Aber ehrlich gesagt, ist es auch relativ einfach. Wenn Sie die Reihenfolge der weiß, Operationen, Sie buchstäblich sind gerade dabei, in Werte stecken und sagen dem Computer, was zu tun ist. Also hier ist ein Beispiel. Dies ist eine Schleife, die ganz einfach, zählt von einer Zahl up durch eine andere. Und nur durch einen Blick auf sie, auch wenn Sie keine vorherige Erfahrung mit Diese Sprache, welche Nummer ist es wahrscheinlich anfangen zu zählen an? OK, 0. Und ich vermute, dass ist, weil Sie sehen, dass es ein int und ein i, Das ist eine Variable. Es wird auf 0 initialisiert. Und dann später, sieht es wie wir vorbei printf, Wert. Und in der Tat, ich habe ein wenig Tippfehler hier. Aber das ist leicht zu beheben. Lassen Sie mich hier hinzufügen in, i. Wir haben jetzt printf Befinden bestanden, dass die Platzhalterwert. Und, was los ist, um durch Hochzählen? ZIELGRUPPE: 50. 50. 49. DAVID J MALAN: 49. So 50, auf den ersten Blick scheint recht. Aber das, es stellt sich heraus, sein wird, unsere Bedingung, dass wir immer mal. Und wir werden noch einmal zu stoppen i nicht mehr kleiner als 50. Also diese Schleife, Umgekehrt sollten auszuführen, solange i kleiner als 50 ist. Aber sobald es wird 50 oder 51, oder noch schlimmer, sollte es automatisch gestoppt. Gut. Also, was passiert eigentlich hier? Das ist also die Reihenfolge der Operationen für eine Schleife. Einer, müssen Sie die sogenannte Initialisierung. Diese gelb markiert chunk Code zuerst ausgeführt wird, und es wird bewirkt, dass, je besitzt Mittwoch, den Sie sich wahrscheinlich vorstellen. Es erstellt eine Variable namens i und es Filialen in diese Variable den Wert 0. Also ist i 0 an diesem Punkt in der Geschichte. Das nächste, was geschieht in diesem Konstrukt, ist, dass die Bedingung geprüft wird. So lese ich sofort, i ist kleiner als 50? Und natürlich die Antwort denn nun ist, sicher, ja. Ja, weil ich gleich 0 ist, und das ist sicherlich weniger als 50. Was dann der Fall ist, ist, dass diese Zeile Code wird ausgeführt. Und in der Tat, wenn es mehrfache Codezeilen in diesen geschweiften Klammern, sie alle nacheinander ausgeführt zu werden. Und in der Wirkung hier ist offenbar, zum Ausdrucken die Zahl i, die zu gehen ist, 0, und dann 1, dann 2. Aber warum? Warum dauert es erhöht werden? Nun, die vierte Sache, passiert ist, dass diese Syntax wird ausgeführt, nach dem Semikolon. i ++ ist eine Kurz Art zu sagen; nehmen Sie den Wert von i, und fügen Sie 1, um sie; und dann wird das nächste Mal, fügen Sie 1, um sie; und das nächste Mal, Hinzufügen 1, um sie. Also, wenn wir weiter gehen, was passieren wird nächste ist Ich bin nicht zu gehen initialisieren i nie wieder. Wenn ich hielt Initialisierung i auf 0, dieses Beispiel würde nie enden, weil Ich würde bei 0 geklebt werden. Aber was wird geschehen ist dass der Zustand überprüft wird, die Codezeile ausgeführt zu werden, die i inkrementiert, Zustand wird überprüft, Code ausgeführt zu werden. Und es hielt Radfahren wieder, und wieder und wieder bis i ++ induziert einen Wert von 50. Die Bedingung sagt dann: 50 weniger als 50? Die Antwort natürlich NEIN und so dass die ganze Code stoppt die Ausführung. Und wenn Sie mehr Code auf dem Bildschirm haben, unten ist das, was als nächstes passiert. Sie herausspringt dieser geschweiften Klammern und weiterhin mehr danach zu drucken. So ein Witz jetzt, von Foxtrott, dass Sie werden jetzt vielleicht verstehen. Es ist immer lustig. Es ist wie die kichert Art versickern, und dann können Sie feststellen, dass Sie sollten nicht zumin Humor so lachen. Aber es gibt einige Lieferservice hier, pädagogisch, auch. So stellt sich heraus, dass ich fehlt ein Stück der Syntax, oder FoxTrot die fehlenden ein Stück Syntax hier. Was fehlt, dass wir je hatten in jedem anderen Beispiel bisher? Dafür gibt es, so das ist etwas anderes, dass wir zurück in Kürze kommen. Was noch fehlt, obwohl? Ja. Zuschauer: Die Initialisierung [unverständlich]. DAVID J MALAN: OK. Also ja. Also eigentlich, diese ist-- Nun, und Zählung initialisiert oben, oder besser gesagt, erklärt oben. Also das ist ein weiterer Weg, es zu tun. Aber nicht in einer Linie ist es gültig, wenn. Wie wäre es hier? Zuschauer: Ist es die geschweiften Klammern? DAVID J MALAN: Ja. So sind die geschweiften Klammern fehlen. Aber dieser Code, ich meine, um ihre Kredit, ist eigentlich, syntaktisch gültig. Es stellt sich heraus, Sie dies nicht tun müssen die geschweiften Klammern wenn Sie nur eine Zeile Code, Sie Innenseite der Schleife ausgeführt werden soll. Jetzt sind wir immer in der Klasse und in alle unsere Vertriebscode, sind die geschweiften Klammern wie auch immer, nur aus Gründen der Übersichtlichkeit. Aber klar, dass in den Lehrbüchern und Online-Beispiele können Sie sehr gut sehen, lockig Hosenträger fehlt irgendwann. Und das ist in Ordnung, wenn, was Sie haben eingerückt und bestimmt ist nur eine einzige Zeile Code, und nicht mehrere Zeilen Code, die möglicherweise. Gut. So im Zusammenhang mit der Ausgabe von Ungenauigkeit, ist eine Frage der Überlauf, in dem Sinne, dass, ähnlich, Sie Zahlen haben Grenzen, um sie wie Fließkommazahlen? In der Welt, eine Gleitkomma- Werte, können wir nur so genau zu sein, worauf manchmal schlechte Dinge passieren können, und unsere Programme können fehlerhaft und Irrtum. Jetzt noch mit ganzen Zahlen, können Sie auf Probleme stoßen. Jetzt eine ganze Zahl nicht über eine Komma oder Zahlen, nachdem es. Es ist nur eine natürliche Zahl ist, in der Regel. Also, was mit einem int gehen könnte? Wenn ich mit einem int zu zählen, was schief gehen könnte? Scheint viel einfacher. Ja. Zuschauer: Wenn die Nummer bekommt [unverständlich] DAVID J MALAN: Ja. Was, wenn Sie so hoch zu zählen, dass Sie kann gar nicht ausdrücken, dass wirklich große Nummer. Recht? An einem gewissen Punkt, Sie gehen die Grenzen überschreiten, einer 32-Bit-Wert oder einen 64-Bit-Wert. Jetzt noch einmal, ich bin nicht sicher, wie um eine 64-Bit-Wert ausspricht, aber ich weiß, mit einem 32-Bit-Ganzzahl, der größte Wert es sein kann, wenn es nur positive Werte, ist in etwa 4 Milliarden. Also, wenn ich versuche, auf 5 Milliarden zählen, etwas passieren wird. Aber mal sehen, was in der Tat, kann passieren. In der Welt der ganzzahligen Überlauf, in dem Sie, in gewissem Sinne, Überlauf der Kapazität eines integer, was passieren könnte,? Also hier ist eine binäre Zahl, es ist ein Rückschritt zu 0. Es ist alle 1 ist, und die Platzhalter es sind Potenzen von 2, so ist dies binär. Das sind also 8, 1-Bits auf dem Bildschirm. Und wenn Sie sich daran erinnern, oder Sie schnell die Mathematik, welchen Wert der sich vertreten lässt hier mit diesen acht 1 Bit? 255. Und selbst wenn Sie nicht ganz sicher, der Mathematik, können Sie es tun könnte. Oder Sie könnten nur solche der Vernunft durch sie, warten Sie eine Minute, wenn ich was einem 8-Bit-Wert, und ich habe 256 mögliche Werte hat, aber von denen die erste gleich 0 ist, Ich weiß nur, dass die größten wird zu 255 sein, und das ist, was dieses sein könnte. Also nehme ich versuche, ein auf diesen Wert hinzuzufügen. Was würden Sie tun, in die Besoldungsgruppe Schule beim Hinzufügen eines 1, und es nicht wirklich passen, weil müssen Sie die 1 zu tragen? Was ist diese Zahl gehen zu werden, wenn Sie 1 hinzufügen? Es wird auf 0 zu werden. Recht? Denn wenn Sie hatte mehr bits-- und ich werde versuchen Sie, eine Art, geben Sie es aus hier-- wenn wir mehr Bits, was wir könnte hier zu tun ist, fügen Sie die 1, und dann würden wir diese. Whoops. Wir würden ein 1-Bit den ganzen Weg hier zu haben. Sollte dies jedoch eine endliche Wert, es ist nur 8 Bit, und das ist, vorher festgelegten durch den Computer, dass 1 ist effektiv nicht da. Es fällt nur eine Art von einer Klippe. Und so, wenn Sie 1 bis 255 addieren, was Wert haben Sie offenbar zu bekommen? 0. Und so Nummern versehentlich, und vielleicht unabsichtlich Ende Umwickeln wie diese. Also, was können die Implikation dieses sein? Nun, es gibt ein paar andere Dinge. So eins, es ist am Ende der Suche wie 0, unabsichtlich, aber Sie können Art zu sehen, auch in der realen Welt, zum Guten oder zum Schlechten, Erscheinungsformen dieser Idee einer Begrenzung. Zum Beispiel jeder von Ihnen, je gespielt habe Lego Star Wars, Hat jemand zufällig weiß die maximale Anzahl von Münzen, Sie in Lego Star Wars sammeln können? Nehmen Sie eine Vermutung auf der Grundlage heute zu den führenden Fragen. Es ist größer als 256 oder 255. Es ist 4 Milliarden. So stellt sich heraus, und es gibt einige people-- einige googeln bestätigt letzten night-- haben 4 Milliarden Goldmünzen bekommen, oder Dingsbums, in Lego Star Wars. Obwohl es scheint, gibt es ein Weg, um das Spiel zu überlisten, es gibt einen Bug oder Feature, Sie können, dass gerade erwachsen viele, viele Punkte. Aber die größtmögliche Wert nach zu diesem Screenshot von jemandem, den ich online zu finden, ist in der Tat, 4 Milliarden. Nun, warum ist das so? Es ist genau 4 Milliarden, wahrscheinlich, weil jemand beschlossen, , die Schrift war dieses Spiel, dass sie 4 Mrd. tun konnte, etwas, etwas, etwas, wie der Wert I Aufmachungen mit dem Rechner früher, aber es ist nur ein wenig sauberer für den Menschen die maximale Anzahl sagen von coins-- oder Bolzen, wie sie es nennen them--, dass Sie können sammeln 4 Milliarden. Und so, warum ist das? Wie ist die LEGO-Spiel Umsetzung des Zählers das ist die Verfolgung der Anzahl der Münzen Sie haben? Sie benutzen, was? Zuschauer: Es stoppt Zählen nach dem 4 Milliarden. DAVID J MALAN: Es stoppt Zählen nach dem 4 Milliarden, das heißt, Sie können folgern, als Programmierer, dass sie wahrscheinlich mit einem 32-Bit-Ganzzahl. Wie der Programmierer buchstäblich nur typisierte, int, in seinem Code, und das ist die Art der Variable, sie verwenden, um jemandes Code zu speichern. Es gibt also andere Erscheinungen dieser Art von Grenzen. So habe ich nicht dieses game-- gespielt und ich über die Geschichte liest up wurde als much-- aber in der Bestätigung original Version von Civilization, wo Sie scheint die Interaktion mit jedem anderen und Krieg zu führen oder Frieden, Gandhi sollte einer sein, ruhigsten Zeichen, wie ich verstehen, in der ersten Version von Civilization. Und in der Tat, auf einer Skala von 1 bis 10, seine Aggressivität war nur ein 1. Also noch so mild aggressiv, offenbar. Aber irgendwann, kannst du anscheinend Installieren der Demokratie in Ihrem Geographie. Und wenn man die Demokratie zu installieren in Ihre Version des Spiels, dann geht Ihre Aggression Ebene tiefer. Es ist eine gute Sache. Die Menschen sind eher still offenbar in dieser Situation. Aber anscheinend hat jemand nicht eine, wenn, Zustand in der ursprünglichen Version des Codes. So Gandhis Aggressionspegel ging positiv 1, minus 2, um negative 1, aber das Spiel nicht verstehen, negative Zahlen. Also, was passiert war Gandhis Aggression Ebene ging von 1, 0, 1, negative, was den Effekt hatten Umwickeln zum Sein die aggressiven Charakter im Spiel, bei einem Wert von 255, auf einer Skala von 1 bis 10. Und seitdem es ist schon mehr Inkarnationen von diesem Spiel und sie es als gehalten habe eine Art Osterei, daß Gandhi offenbar so furchtbar aggressiv. Aber es war das Ergebnis ein sehr einfache Programmierfehler in dieser sehr frühen Version des Spiels. Jetzt noch beunruhigender ist, mehr Vor kurzem hat die Boeing 787 wurde mit einer dokumentierten Fehler, nicht die Art von Gerät Sie möchte vor allem einen Fehler haben. Und die Symptome, dass ich lesen hier, aus einem Artikel online, war dies ein Modell 787 Flug dass wurde ständig mit Energie versorgt für 248 Tage alle verlieren können Wechselstrom, AC, Strom, aufgrund die Generatorsteuereinheiten, GCUs gleichzeitig gehen in fehlersicheren Betrieb. Das war also eine Warnung ausgegeben Wenn dieses Problem entdeckt. Dieser Zustand wird verursacht, durch ein Software-Zähler, innerhalb des GCUs, so eine ganze Zahl oder eine Variable, das wird nach dem Überlauf 248 Tage der Dauerleistung. Boeing ist in dem Verfahren der Entwicklung einer Software-Upgrade, das AVV- den unsicheren Zustand zu beheben. So viel wie die Raketen Szenario, bei dem sie irgendeine Art von variablen hatten das war zu zählen, und das Zählen, und Zählen, aber allmählich überfüllt die Grenzen ihrer Leistungsfähigkeit, ähnlich war das verdammte Flugzeug eine variable Überlauf Nach genügend Zeit des Laufens. Und so ist die tongue-in-cheek Weg arbeiten, um dieses Problem ist es wirklich, Neustart, Ihr Flugzeug jeden 247 Tage, so daß der Speicher wird abgewischt und die Variable geht zurück auf 0. Aber erkennen, ist dies eine sehr große Inkarnation von Software, vor allem aber, wie wir über Apples hören Betriebssysteme gehen in Autos, und selbstfahrenden Autos von Google, und eine beliebige Anzahl von Inkarnationen von Software- in unserem täglichen Leben, TV und Uhren, und mehr, erkennen, wurden von Software umgeben, All das wird von uns Menschen geschrieben. Und so werden wir alle bald entdecken, es ist sehr einfach und sehr typisch , Fehler zu machen, wenn das Schreiben von Software. Und wenn Sie nicht fangen sie, einige schlechte Dinge passieren können. Jetzt manchmal, einige lustige Dinge passieren können, oder zumindest manchmal haben wir weiß, einige Schlechtigkeit erwartet. So 0 geteilt durch 0, ab Klasse Schule, ist in der Regel eine schlechte Sache. Es ist nicht definiert. Und es stellt sich out-- und lassen Sie uns sehen, wenn mein Mikrofon kann diese abholen up-- dass Apple hatte etwas Spaß mit diesem vor kurzem. Also ich habe ein iPhone hier. Ich werde zu Siri sprechen und sie fragen mir die Antwort auf 0 geteilt durch 0 zu geben. Was ist 0 geteilt durch 0? SIRI: Stellen Sie sich vor, dass Sie 0 haben Cookies, und Sie sie gleichmäßig aufgeteilt unter 0 Freunde. Wie viele Cookies ist jede Person zu bekommen? Sehen? Es ist nicht sinnvoll. Und Cookie Monster ist traurig dass es keine Cookies. Und du traurig, dass es Sie haben noch keine Freunde. DAVID J MALAN: Es ist irgendwie widerlich. Also das ist, was gerade gesagt gibt. Es ist unbestimmt, es ist nicht festgelegt, und in der Tat, viele Programmiersprachen oder, wirklich, wird Compilern zu erkennen, wenn Sie in einem Programm, versuchen, 0 durch 0 zu teilen. Mehr Spaß als dieses ist jedoch, , dass es scheint, Cookie Monster auf Twitter diesen Tagen. Und er antwortete, dies zu, mit diesem, Das ist absolut entzückend. Aber lassen Sie uns einen kurzen Blick auf ein paar andere Konstrukte, und setzen Sie dann etwas von diesem Code zu verwenden, in gutem Wege. So stellt sich heraus, außerdem for-Schleifen, da ist so etwas wie eine while-Schleife, dass anders aussieht und ausgebildet ist, ein wenig differently-- und wir schließlich sehen examples-- aber in einem gewissen Sinn, ist es einfacher, weil es ermöglicht es Ihnen nicht zu initialisieren und zu Aktualisieren innerhalb der Grenze der Schleife. Sie können immer noch umzusetzen. So können Sie genau die gleichen Dinge tun mit einer while-Schleife, wie bei einer for-Schleife, aber Ihre Syntax ultimately-- Wie wir schließlich see-- wird anders sein. Es gibt sogar eine do while-Schleife, die ist eigentlich ein wenig anders, in der Erwägung, dass dieser eine for-Schleife und eine while-Schleife immer überprüfen Sie ihren Zustand zuerst, wenn Sie lesen diese Sache oben nach unten, es sieht wie es zu gehen überprüfen Sie den Zustand zuletzt, weil es wirklich die letzte Codezeile. Und in der Tat, das wird, nützlich zu sein in bestimmten Programmen, die wir schreiben, ob Sie nur blind etwas tun wollen und schließlich den Zustand. Das ist nicht unbedingt eine schlechte Sache. Wenn wir Variablen möchten, was wir tun können es in einer Reihe von verschiedenen Wegen. Und wir in der FoxTrot sah cartoon, einen Weg, es zu tun, wo Sie Ihre Variable zu deklarieren, wie int Zähler Semikolon, und dann later-- vielleicht die nächste Linie, vielleicht 10 Zeilen later-- Sie tatsächlich initialisieren. Also diese 2 Zeilen Code deklarieren Sie eine Variable vom Typ int und nennen es Zähler, so dass es gibt mir genügend Bits, um einen int zu halten. Und dann schließlich, bringt es der Wert 0 in diese Variable. Es ordnet die 0 und 1 in a Muster, dass wir wissen, aus der vergangenen Woche, steht für die Anzahl die wir kennen als 0. Oder ehrlich gesagt, Sie so viel tun können, kurz und bündig, einfach so. Jetzt haben wir auch die Fähigkeit, Funktionen aufrufen. Und in der Tat, hier ist ein 2-zeiliges Programm oder einen Auszug davon, dass ermöglicht es uns, tatsächlich schreiben einige Code, Ruft eine Zeichenfolge aus dem user-- viel wie unsere Freiwilligen ein Moment ago-- Speichern des Ergebnisses in eine Variable namens name, und then-- ähnlich wie mit unseren Freiwilligen mit printf-- druckt diesen Werten indem man in zwei Argumente, die Schnur, gefolgt von dem variablen genannt, Name, selber. Werfen wir also einen Blick, bevor wir zurück zu Mario kommt es, auf ein paar nun Beispiele. Ich werde weiter und offener gehen bis, sagen wir mal, funktions 0.c. Und wie immer, ist dieser Code auf der Website der Kurs verfügbar ist, so können Sie zusammen zu spielen Hause und schauen Sie es später. Aber hier ist das Programm in seiner Wesentlichen von der Linie 17-22. Das Hauptprogramm ist in dem die Programm wird immer starten. Dieses Programm offenbar wird zum Ausdrucken Ihren Namen, Ihre Doppelpunkt. Es ist dann werde GetString aufrufen, gerade so wie wir mit unseren Freiwilligen. Und dann, das ist interessant, es geht um Printname aufrufen. Es stellt sich heraus, die ganze Zeit, es scheint eine Funktion namens Printname sein. Dass Drucke jemand den Namen. Wir brauchten nicht zu printf aus verwenden gestern, gibt es Printname. Doch das ist irreführend weil Printname nicht sind mit C Leute nicht erfinden sie vor 40 oder 50 Jahren, Ich tat, statt. Und in der Tat, wenn ich blättern weiter nach unten, Hinweis wie kann ich meine eigene zu schreiben Funktionen in C. Wir werden irgendwann erklären, warum wir sagen immer, Leere, an einigen Stellen, aber für heute, lassen Sie uns Schauen Sie sich den Namen. In Zeile 24, wenn Sie wollen erstellen Sie Ihre eigene Funktion, Sie buchstäblich schreiben die Name der Funktion. Ich entschied mich für Printname. In den Klammern, die Sie dann festlegen, welche Arten von Eingängen, und wieviele Sie möchten diese Funktion zu übernehmen. In diesem Fall möchte ich nehmen 1 Variable namens, name, und es wird der sein, Typ, ein String, also wird es einige Folge von Zeichen sein. Und dann diese program-- ähnlich wie in Scratch, können Sie benutzerdefinierte Puzzles haben pieces-- wird diesen benutzerdefinierten Verhalten haben. Es wird printf nennen Weitergabe in, hallo, Platzhalter, und dann, es wird Stecker in welcher der Benutzer aufgerufen. Das ist also ein Beispiel dafür, was Informatiker würden Call Abstraktion oder Funktions Zersetzung, das gerade sind Lust Weisen saying-- ist, wenn Sie möchten dieses hohe Niveau Idee, wie ich will Funktionalität, druckt jemand Name, absolut Sie kann buchstäblich schreiben printf und dann Pass in den Argumenten, die Sie möchten, und das Programm wird funktionieren, da es seit Mittwoch. Aber Sie können zu abstrahieren starten der Begriff Drucken eines Namens. Sie können ihm einen Namen zu geben, wie Printname, und dies ist diese Idee der Schichtung von Woche 0. Von nun an, ich und Sie nicht wissen, oder egal, wie Printname implementiert ist. Ja, es nutzt printf, vielleicht ist es nicht, wer weiß, was nutzt? Wen interessiert das? Jetzt bin ich hier reden up, anstelle von hier unten. Und in der Tat, wie unsere Programme erhalten weiter fortgeschritten und anspruchsvoll, werden wir unternehmen, um für selbstverständlich halten, daß unteren Ebene Puzzleteile existieren. Weil wir sie geschrieben oder jemand anderes getan hat, so dass wir dann über ihnen aufzubauen. Werfen wir einen Blick auf diese Variante funktioniert ein. Also das hier ist ein wenig mehr Fortgeschrittene, aber es stellt sich heraus, dass in CS50 Bibliothek, es gibt nur ein getint Funktion. Wir hätten nicht gedacht, vor Jahren, um Umsetzung einer GetPositiveInt Funktion. Und das ist ein wenig ärgerlich, denn wenn Sie Kerle sind ein Programm schreiben, wobei Ihnen ein positives erhalten möchten Zahl vom Benutzer, Sie absolut verwenden getint. Und Sie können absolut überprüfen Sie mit der Zustand und vielleicht eine Schleife wenn das int größer als 0 und schreien den Benutzer wenn er oder sie nicht geben Sie eine positive Zahl. Aber lasst uns bauen diese Baustein selbst, a, benutzerdefinierte Scratch Stück, wenn man so will. Ich werde ein Programm haben, hier, die letztlich, I wollen in der Lage zu nennen GetPositiveInt, und ich möchte sein in der Lage, drucken Sie, was auch immer, dass int ist. Aber das ist jetzt weg abstrahiert. Es ist nur ein hohes Maß gegeben worden Namen, die sagt, was sie tut, das ist wunderbar, weil es sehr intuitiv jetzt zu lesen. Und wenn ich zu tun pflegen, was darunter die Haube, lassen Sie mich nach unten zu scrollen. Und es ist ein wenig einschüchternd auf den ersten, besonders wenn dies Ihre erste Programm, aber lassen Sie uns einen Blick. Ich bin nicht mehr sagen, Leere, denn es stellt sich heraus, Funktionen, ähnlich wie GetString können liefern einen Wert für mich. Sie haben nicht nur um auf den Bildschirm zu drucken, sie tatsächlich übergeben können mir etwas zurück. Und während vor Printname, Ich habe nichts müssen zurück. Ich brauchte den Nebeneffekt, etwas, das auf dem Bildschirm, aber ich habe einen Menschen nicht brauchen mir etwas zurückgeben. Hier mit GetPositiveInt, wie mit getint, Ich möchte etwas zurückreicht werden. Also ich sage nicht, ungültig auf der Leitung 23, aber int, in dem es heißt, diese Funktion daß ich schreibe, genannt GetPositiveInt Nahmen gib mir wieder eine ganze Zahl, das nicht nichts, nicht nichtig. In der Zwischenzeit, es wird nicht zu nehmen Eingänge, also habe ich, irgendwie, es umgekehrt. Ich gebe keine GetPositiveInt Eingang, ich will es mir seinen Ausgang zu geben. Und was passiert jetzt? Also hier ist, wie kann ich eine Variable deklarieren. Ich habe es außerhalb der Schleife durchgeführt, Gründen wir schließlich sehen aber dies nur gibt me 32 Bits genannt, n, und ich habe vor der Bestimmung sie ganze Zahl zu speichern. Und hier ist, dass zu tun, während Konstrukt, und aus diesem Grund ist es sinnvoll. Buchstäblich dies tun, wobei n kleiner als 1 ist. Also mal sehen, was passiert. Ich ausdrucken, bitte geben Sie mir eine positive int. Ich bekomme dann einen int mit der CS50 Funktion und in N gespeichert. Und dann, was Codezeile wahrscheinlich wird als nächstes ausgeführt, logisch? Die Zeilennummer? Ja, also 31. Sie würden nicht wissen, bis Sie haben wurde gesagt, oder Art folgern sie, aber das ist wahr. Es versteht sich von oben nach unten und dann wieder auftreten. Also, wenn ich in etwa der Zahl eingegeben negativen 1 ist n weniger als minus 1? Ja. Weil Negativ 1 geringer als 1 ist. Also, was soll geschehen? Ich werde dies tun wobei n kleiner als 1 ist, so werde ich wieder auf der Leitung 28 zu gehen. Und jeder Zeit-- und lasst uns laufen this-- Schliesser 1, um es zu kompilieren, und jetzt dot Slash Funktion 1. Wenn ich schreibe negativen 1, ist es gehen, um mich anzuschreien zu halten bis ich zusammenarbeiten, weil jeder meiner Eingänge kleiner als 1 ist und wenn es während weniger als 1 ist, Ich werde weiter machen. Wenn ich es endlich eine Zahl wie 50, Gott sei Dank, heißt es, danke für den 50. Warum? Denn sobald n nicht weniger als 1, ich aufhören, in dieser Schleife stecken, und dieses neue Schlüsselwort heute Rück, wörtlich das tut. Also ich habe gerade realisiert, in ein Gefühl, das Äquivalent von GetString, wo ich Gabe zurück zu Wer wird mit mir, einen gewissen Wert. Es muss nicht zu sein, ein String, es ist ein int. So eine einfache, schnelle Beispiel, aber wir bald sehen Sie einige anspruchsvollere Versionen noch. In der Tat, werfen wir einen Blick auf ein Zahlen ein, die als return.c wird. Und dieser ist eigentlich ein wenig einfacher. So Zweck dieses Programms in life-- wir kompilieren und ausführen, so stellen Gegenzug dot Schrägstrich, return-- Ankündigung das Programm Würfel einfach den Wert 2. Es ist ziemlich dumm, es ist schwer Code, dauert es nicht alle Eingänge, aber es hat eine andere zu demonstrieren Funktion, die ich selbst geschrieben. So, hier, ich erklärt habe ein Variable namens x, vom Typ int, gleich der Zahl 2, völlig willkürlich. Dies ist nur ein paar flauschige Druck. Er sagt, x ist jetzt, wie und wie, Cubing dot dot dot. Und die Magie ist offenbar in Zeile 21. Ich rufe eine Funktion namens, Würfel, Ich reichte sie ein Blatt Papier mit der Nummer 2 auf der es geschrieben, und welchen Wert, mathematisch, will ich aus ihm heraus? So wie eine Plausibilitätsprüfung? 8. Recht? Ich möchte 2 gewürfelt Rücken, 2 bis die Leistung von 3, also 8 zurück. Also, wo ist cube umgesetzt? Nun, bemerken, dass es sich hier implementiert. Und genau wie zuvor, logisch, obwohl die Syntax ist wahrscheinlich sehr neu für viele von Ihnen, Ich möchte diese Funktion zu mir zurückzugeben ein Blatt Papier mit einem int auf sie. So habe ich einen int, die Name ist beliebig, sondern bequem Cube genannt. Der Eingang dazu, ist n von Typ Integer, also ist das wie kann ich in der Zahl übergeben 2 auf einem Blatt Papier. Und dann stellt sich heraus, C Stützen Mathematik, so dass Sie nicht haben, x für Zeiten, verwenden Sie einfach das Sternchen zur Multiplikation. Und das gibt n mal n mal n, die einfach eine gewürfelten Wert. Also wohin gehen wir mit all dem? Dies ist definitiv ein rasante Tour, seien Sie versichert, dass in den Superschnitte und in Problem-Set 1, Sie werden durch begehbar all dies umso mehr. Und in Problem-Set 1, werden wir den Übergang von der grafischen Welt der Scratch etwas mehr Befehlszeile in C. Aber wir werden inspirieren von diesem Spiel hier vom vergangenen Jahr, wobei Verwendung von C und die Standard-Ausgabe des p-Set Sie Mario-Pyramide zu implementieren. Und in der Hacker-Ausgabe der p-Set, wenn Sie dies wünschen, zu wählen, Sie werden ein bisschen mehr zu implementieren herausfordernde Pyramide mit zwei Spitzen. Sie werden auch zu implementieren ein Algorithmus, ein Greedy-Algorithmus. Es stellt sich heraus, es gibt einige interessante Logik hinter dem Verfahren Laufwerk ein Banks und tatsächlich Gabe jemand zurück zu ändern. Es ist ein Algorithmus, ist ziemlich einfach, dass Sie vielleicht sogar erfassen intuitiv, wenn Sie zuerst lesen es-- zu realisieren, dass ist, was ich immer keine Zeit habe ich jemand etwas gegeben getan Geld back--, die Sie immer erlaubt die Anzahl der zu minimieren Notizen auf Papier und Metall-Münzen dass Sie zurück an den Benutzer übergeben sind. Und dies, natürlich, ist überzeugend weil, wenn Sie CVS oder Dingsbums zu gehen, Sie wollen nicht übergeben werden eine ganze Reihe von Einsen oder eine ganze Reihe von ein paar Cent. Sie wollen die wenigsten Münzen, wahrscheinlich, möglich. Schließlich werden Sie auch in Frage gestellt werden um in der Welt des Wasserplantschen und tatsächlich bekommen eine Wertschätzung für eine Zuordnung zwischen Strömungsgeschwindigkeiten, der mag, Wasser in einer Dusche, wie viel Wasser verwendet. Und die Anspielung darin, wird für diesen Clip hier zu sein, was wir für die am Ende auf nur 60 Sekunden, dass malt ein Bild von Low-Flow-Duschköpfe. [VIDEO PLAYBACK] -Gut. Ich habe alles hier. Ich habe die Cyclone F-Serie, Hydra, Jetflow, Stockholm Supers, you name it. -Und Was empfehlen Sie? -Was suchen Sie? -Power Mann. Power. -ähnliche Silkwood. -Das Ist für Strahlung. -Das ist richtig. -Nun Was ist das? -Das Ist das Commando 450. Ich verkaufe nicht, dass man. -Aber Das ist, was wir wollen. Es ist ein Kommando 450. -Keine Glauben Sie mir. Es ist nur im Zirkus verwendet. Es ist für Elefanten. -Ich Werde nichts bezahlen. -Was Ist Jerry? -Er Konnte nicht damit umgehen, dass. Er ist empfindlich. Oh ja. [END PLAYBACK] DAVID J MALAN: Alles klar. Das ist, wenn für CS50. Wir sehen uns nächste Woche. Sprecher 1: [? Scully?], [? Ian,?] soweit dieses Outro Projekt, was hast du Jungs kommen mit? Sprecher 2: Nun, wir gegeben haben es eine Vielzahl von Gedanken, und wir denken, dass der beste Weg zu-- SPEAKER 3: Darf ich? Sprecher 2: Ja. Mit allen Mitteln, tatsächlich. SPEAKER 3: Ich denke also, Wir können zusammenfassen unsere Idee für die outros mit einem word-- nichts. DAVID J MALAN: Nichts? SPEAKER 3: Nichts. DAVID J MALAN: Was bedeutet das? SPEAKER 3: Die Outros sind um nichts. Sprecher 2: Nun, ich meine, in der Philosophie, Ich meine, nichts ist immer etwas. Sprecher 1: So what's-- was ist die Prämisse? SPEAKER 3: So ist es wie das Leben. OK. Was hast du heute gemacht? DAVID J MALAN: Ich stand auf, hatten Frühstück, und kam zu arbeiten. SPEAKER 3: Das ist ein Outro. Sprecher 2: Aber, ich meine, sollte nicht etwas mit ihm geschehen auf the-- SPEAKER 3: Nein, nein, nein, nein. Nichts passiert. Sprecher 1: Warum beobachten wir? SPEAKER 3: Weil es ist ein Outro für CS50. DAVID J MALAN: Noch nicht.