[Powered by Google Translate] DAVID J. MALAN: All right, dies CS50, und dies ist der Beginn der zweiten Woche. Danke. Lassen Sie uns hier beginnen mit einem Telefonanruf. Ich bin über 617-BUG-CS50-Wahlrad auf. CS50: Dies ist CS50. Für Shuttle Boy, 1 drücken. Um neu zu starten, drücken Sie 9. DAVID J. MALAN: So sagte er zum Shuttle Boy, 1 drücken. Also werden wir Sie 1 drücken. CS50: Was ist Ihre Herkunft? Für Quad, 1 drücken. Mather, drücken Sie 2. Boylston, drücken Sie 3. Lamont, drücken Sie 4. Mem Hall, Taste 5 drücken. Um neu zu starten, drücken Sie 0. DAVID J. MALAN: Wir werden ein für Quad drücken. CS50: Next Shuttle fährt in dieser Minute um 1:10 Uhr und dann um 1:20 Uhr, 13.30 Uhr, 01.40 Uhr. Dies ist CS50. DAVID J. MALAN: Also das ist CS50 Stimme. Und es ist ein Beispiel für die Art der endgültigen Projekte, So können Sie beispielsweise abbeißen Richtung das Ende des Semesters. Zum Beispiel besteht, dass shuttleboy.cs50.net - eigentlich ein Projekt, dass ich zum ersten Mal schrieb nach der Einnahme von CS51 zurück, wenn ich ein grundständiges war. Und die Inspiration war hier damals war alles, was sie hatten die gedruckten Shuttle-Bus Zeitpläne, und es gab keine Begriff suchen Dinge online. Und so habe ich eine Art Taube in ein Wochenende, strömte durch die gedruckten Zeitplan, und es ein Computerprogramm portiert. Zu dieser Zeit passiert das Computerprogramm geschrieben werden in C. Und Sie tatsächlich lief es, indem Shuttle Boy at a Blinken aufgefordert, wie wir wurden bisher habe tun. Aber im Laufe der Jahre hat sie in einem Augenblick entwickelt Messaging bot. Es ist vor kurzem in diese Website entwickelt, in eine SMS-basiertes Tool, sowie in dieser Stimme-basiertes Tool. Und das ist an den möglichen Dinge anzudeuten, dass man für sich selbst tut, indem Semester Ende. Zum Beispiel gibt, geschieht das SMS-Version von Shuttle Boy wie folgt zu arbeiten. Wenn auf Ihrem Handy, senden Sie eine SMS an 41411 und senden Sie dann die Sonderzeichen sboy für Shuttle Boy, gefolgt von A und B, wobei A ein Ursprung und B ein Ziel - zum Beispiel Boylston Raum Quad - was sollte man wieder innerhalb von wenigen Sekunden ist ein Text Nachricht von Shuttle Boy sagen Ihnen genau, wenn die nächsten Shuttles sind, von diesem Punkt A werde, dass Punkt B. Und dies ist ein allgemeineres Beispiel von dem, was bekannt als Verwendung einer API. So zum Beispiel, ist dies hier nur shuttleboy.cs50.net, die tatsächliche Web-basierte Inkarnation dies. Aber die Daten, die diese und andere Anwendungen unterstreicht, dass CS50 entwickelt werden alle an alle hier in Form ausgesetzt von APIs, Application Programming Interfaces. Und das ist nur eine andere Art zu sagen, dass Leute wie wir das Internet und andere haben einige Zeit damit verbracht, Software, die Sie verwenden können, um Daten von uns zu packen und Dann bauen Sie Ihre eigenen Anwendungen auf dieses Datensatzes. So zum Beispiel, diese Shuttle Boy API-Seite hier, die zufällig in der CS50 Bedienungsanleitung, im wesentlichen Dokumente werden wie Sie zu fragen CS50-Server für die Daten gehen. Zum Beispiel, wenn Sie sich mit CSV-Dateien, Komma getrennte Werte, das sind nur eine Art quick and dirty Excel-ähnliche Dateien. So können Sie Shuttle Boy für alle Daten auf allen der Fragen Häuser und ihre GPS-Koordinaten, und Sie erhalten Zurück im Wesentlichen eine Tabellenkalkulation so, dass Sie können dann in einem Programm Ihrer eigenen zu lesen und dann generieren Ergebnisse, wie Shuttle Boy selbst passiert zu tun. Für die mehr vertraut, moderner Datendarstellungen gehören JSON, JavaScript Object Notation. Etwas wird sich dann mit Ihnen in Richtung das Ende des Semesters. Aber noch einmal, dies ist nur eine von mehreren eigenen APIs CS50 ist. Und die aufregendste Sache ist jetzt, in diesen Tagen, Facebook und Twitter und Google und so ziemlich jede populäre Website aus muss es irgendeine Art von API, die, wenn Sie die ausgelesenen Dokumentation auf ihrer Website, melden Sie sich für eine Account haben, können Sie mit dem Schreiben beginnen Software auf der Oberseite welche Werkzeuge oder Daten, die Unternehmen dort zur Verfügung stellt. Und so ein eigener Lehre Stipendiaten vor ein paar Jahren schrieb eine Mac-Version davon. So auf den Link mit dem Titel Mac hier links oben, können Sie tatsächlich laden Sie ein Mac OS Widget, das auf dem eigenen Mac läuft die tun gleiche Art von Dingen. So geht es um den Bau auf der Oberseite von Datensätzen wie diese. Aber mehr auf, daß gegen Ende des Semesters. Lassen Sie uns also in Echtzeit schnell einen Fehler tauchen, nur um eine Art, an Dinge, erwärmt sich noch heute, und denke zurück auf einige der Dinge, die wir sahen in der vergangenen Woche. Insbesondere, lass mich gehen Sie vor und nach oben ziehen, sagen wir, Dieses Beispiel hier. Buggy1.c, ist dies auf den Verlauf der Website verfügbar, wenn Sie würde es gerne herunterladen und herumzustochern sich. Aber lasst uns hier vergrößern zu diesem relativ kurzen Programm, und nur a super-schnelle Rekapitulation der einige der grundlegenden Bausteine, die wir wirklich gehen, um nur anfangen, für selbstverständlich. So das blaue Zeug, in den Zeilen 1 bis 9 sind nur Softball Fragen. So sind nur Kommentare. Sie haben keine funktionelle Bedeutung. Aber sie sind Kommentare in dem Sinne, dass sie Hinweise sind, dass Ich, der Mensch, machte mich so, dass in der Vorlesung und nach Vortrag, kann ich eigentlich daran erinnern, was dieses Programm macht, ohne sich durch sie Zeile für Zeile lesen und Neuerstellung Geschichte in meinem Kopf. Außerdem, wenn ich die Hand dieses Programm, um jemand anderes, wie Sie ist es viel klarer zu Ihnen, weil von Kommentaren wie diesem, was das Programm ist eigentlich zu tun, oder zumindest, was die Programm tun soll. Ob es richtig ist eine ganz andere Sache. Jetzt, in C, mit mehrzeiligen Kommentaren, daran erinnern, dass on line hier ist die Magie Symbol / *. Es bedeutet, hier kommt der Beginn eines Kommentars. Und nichts anderes zählt, bis Sie das Ende Terminator erreichen, das ist * /, das Gegenteil. So ist die Tatsache, dass ich 80-einige seltsame Sterne haben hier von links nach rechts ist wirklich nur ein ästhetisches Detail. Es hat keine funktionale Bedeutung. Nun, wie etwa Zeile 11? Was bedeutet das in juristischer Hinsicht zu tun? Was ist das? PUBLIKUM: Beinhaltet die Norm. DAVID J. MALAN: OK, gut. So umfasst die stdio.h Bibliothek. Also, was bedeutet das? Nun, in diesen Dateien, stdio.h, sind eine ganze Reihe von Funktion Erklärungen - das ist, Code, dass jemand anderes geschrieben hat. Und ein perfektes Beispiel für eine Funktion, die in deklariert ist stdio.h ist - die beliebtesten inzwischen? So printf, zu einem der gebräuchlichsten verwenden, sicher früh, aus dieser Bibliothek ist da. Wenn ich diese Zeile Code auszuschließen, wird Clang gehen zu schreien bei mir etwas über einen unerklärten Symbol. Etwas Schwarzarbeit ist wohl das Schlüsselwort, denn wir haben nicht den Compiler, was printf sieht informiert wie wenn wir diese Linie gehören. Und mehr auf die Erde, wirklich, was diese Zeile sagt, ist öffnen Sie die Datei, stdio.h, wo sie auf dem Server ist Festplatte oder das Gerät auf die Festplatte, und copy-paste es Recht dort in meine Akte, ohne meine dass Sie dies manuell tun. Nun, wenn wir hier unten, um Haupt-, bald fangen wir Hänseleien auseinander, was int und was nichtig ist. Aber jetzt, lasst uns an den drei Zeilen sehen innerhalb von 15 bis 17. Diese hier habe ich Anspruch als buggy. Linie 7 in meinen Kommentaren sagt: "Sollte 10 ausgeben Sternchen aber nicht. "Warum funktioniert das nicht drucken, in der Tat, 10 solcher Sterne? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Genau. So bemerken, dass wir beginnen, um von 0 zu zählen. Und das ist eigentlich eine Konvention in der Programmierung und Informatik allgemein, beginnend zu zählen von 0 statt 1. Und das wirklich nur aus der Tatsache, dass für Beispiel, wenn wir acht Leute hatten auf der Bühne, wenn Niemand hob ihre Hand, sie waren alle effektiv Nullen. Und so ist es nur eine Art Computer-Konvention so, daher beginnt bei 0.. Wenn es das ist die niedrigste Zahl können Sie in binärer darstellen. Also hier haben wir begonnen Initialisierung i auf 0 gesetzt. Wir haben festgelegt i gleich 0 ist. Aber dann habe ich diesen Fehler gemacht hier zu sagen i kleiner oder gleich 10 ist. Aber wenn Sie denken, dass durch, wenn ich bei 0 und starten Sie dann gehe ich bis zu 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ich bin eigentlich los drucken Sie 11 Sterne auf dem Bildschirm, weil ich oben gegangen waren zu und gleich 10 ist. So ist die einfache Lösung hier dann ist was? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Ändern Sie einfach auf weniger als. Wenn Sie wirklich wollen, können Sie dies tun. Aber im Allgemeinen ist das verpönt. Und so beginnen, von 0 zu zählen ist nur etwas, sollten Sie Regel gewöhnen. Nun, was dieses ganze Konstrukt in sich selbst? Diese Zeile 15 renzeichen eine for-Schleife. Also für keine Funktion. Es ist nur eine Feststellung. Es ist ein Looping Konstrukt, wie wir in Scratch sah. Und es besteht aus drei Teilen. Feststellen, dass es das erste Teil um links von der Strichpunkt. Es ist der mittlere Teil zwischen den beiden Semikola. Und dann gibt es noch die rechte Hand auf der rechten Seite des zweiten Semikolon. Nun hat der erste davon und? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Zurück da? Yeah? PUBLIKUM: Initialisierung. DAVID J. MALAN: Initialisierung. Also, was bedeutet das? Wir haben eine Variable namens i deklariert. Es ist vom Typ int, weil ich int i angegeben haben. Und ich bin der Initialisierung i auf den Wert von 0 auf. Also, was ist das wirklich sagen? Es ist tatsächlich sagen dem Computer hey, gib mir genug Speicher, genug RAM, um eine Reihe passen, und setzen Sie dann die Nummer 0 in diesem Stück RAM. Und nebenbei, wie groß ist ein int in der Regel, zumindest innerhalb des Gerätes? PUBLIKUM: 32 bit. DAVID J. MALAN: 32 Bit. Das heißt also, gib mir 32 Bit, sonst als 4 Bytes bekannt, und setzen Sie den Wert 0 in ihm, das ist ziemlich einfach, weil Es bedeutet nur, alle Bits auf 0 gesetzt. So, jetzt ist der zweite Teil hier die Bedingung. Und der Zustand, wie der Name schon vermuten lässt, ist das, was wird geprüft wieder und wieder und wieder, ob es wahr oder falsch ist. Das ist also nur sagen, führen Sie die folgenden Zeilen Code - nämlich Linie 16, weil das die einzige eingerückt ist darunter - solange i kleiner als 10 ist. Und nach jedem Durchlauf dieser Schleife, gehen Sie Inkrementierung, die in diesem Fall ist i + +. Nun hat es nicht bis i + + sein. Es könnte i sein -. Aber wenn ich das tat, was ist das Verhalten gehen um dieses Programms sein? PUBLIKUM: Es wird eine Endlosschleife. DAVID J. MALAN: Es wird eine Art Endlosschleife, es sei denn, wir bekommen nach negativer 2 Milliarden oder so viel Glück. Vielleicht Dinge herum wickeln, nur von der Natur der endlichen Anzahl der Bits, die wir für eine int zugewiesen. Aber es ist sicherlich noch weit mehr als 10 durchlaufen und sicherlich mehr als 11 Mal hier. Und jetzt, nur so nebenbei, erkennen, dass i + + und i - sind wirklich nur syntaktischer Zucker. Es ist nur Kurzschreibweise für das, was ein wenig mehr explizit wie folgt geschrieben: i = i + 1. Das heißt identisch i + +. Es nur irgendwie sieht schöner zu sagen i + +. Es ist mehr prägnant, besser lesbar. Und so die meisten Menschen tun, statt. Dies ist aber funktionell identisch was wir gerade gesehen haben. Also kurz gesagt, ist die schnelle Lösung hier nur zu sagen, iterieren i von 0 bis hinauf zu weniger als 10 ist. Und dann werden wir in der Tat erhalten 10 Sterne. Also lasst uns versuchen. Lassen Sie mich öffnen Sie das Terminal an der Unterseite. Lassen Sie mich in das Verzeichnis zu gehen, dass diese ist in. Und ich werde es manuell kompilieren mit Clang für jetzt. Und ich werde dies als buggy1.c kompilieren Sie die Eingabetaste. Und jetzt buggy1, warum gibt es keine solche Datei oder das Verzeichnis genannt buggy1? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Yeah. Also ist es eigentlich als a.out. So erinnern, wenn Sie laufen nur Clang, wo Clang ist die Compiler, und Sie nicht den Namen Sie geben, um Ihr Programm, es geht um standardmäßig auf a.out. So in der Tat, wenn ich ls - oops. Und ich didn't - die Schwarz-Weiß-Thema einige Sie konfrontiert wurde behoben. Aber lassen Sie mich dies tun. Dort haben wir a.out auf der linken Seite befindet. Also müssen wir a.out statt buggy1 laufen. Also lass mich gehen Sie vor und tun dies. . / A.out, Enter. Und ich anscheinend nicht was tun? PUBLIKUM: Speichern. DAVID J. MALAN: Speichern meiner Datei. Also das ist einfach durch Drücken Control S, oder gehen zu lösen Datei, Speichern, wie in den meisten Programmen. Lassen Sie mich gehen hier unten, löschen Sie den Bildschirm, führen Sie es erneut. Und es gibt noch ein Bug. So, was los ist - PUBLIKUM: Sie haben nicht kompilieren. DAVID J. MALAN: Ah, gut. Ich wusste nicht kompilieren. Wie ein Idiot, ich bin auf den Code schauen, um zu sehen, was los ist. So clang buggy1.c, jetzt a.out. Und puh, gespeichert. So sieht es ein wenig hässlich, weil es keine neue Linie überall im Programm. Aber noch einmal, das ist nur ein ästhetisches Detail. Und zumindest, wenn wir diejenigen zähle, sollten wir nun 10 solcher Sterne. Nun, was ist mit diesem zweiten Warm-up Beispiel? So in buggy2, behaupte ich, dass diese Version auch gedruckt werden 10 Sterne, eine pro Zeile. Also dieser Zeit habe ich einen Zeilenumbruch, nur um Dinge ein wenig schöner. Aber anstatt, was ich bekomme ist. So lass mich tun clang buggy2.c, Enter. Jetzt ist es wieder aufgerufen a.out. Enter. Ich sehe nur eine neue Linie, nur das letzte neue Zeile, bewegt meine Aufforderung, die nächste Zeile. Und doch klar ich habe Druck *, dann eine neue Zeile, *, Dann eine neue Zeile. Aber was ist der Fehler hier? Yeah? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Genau. Ganz im Gegensatz zu einigen Sprachen wie Python, wo Einkerbung tatsächlich funktionelle Bedeutung, in Sprache wie C - wie wir sehen werden, PHP, JavaScript - die Vertiefung ist wirklich nur für den Menschen 'profitieren. So ist die Tatsache, dass ich 16 und 17 eingerückt sieht toll aus, aber es hat keine funktionale Bedeutung hier. Wenn ich beide Leitungen als Teil der für die Ausführung Schleife, dann muss ich sie in geschweiften Klammern umschließen indem Sie diese. Sie können nur schneiden diese Ecke und lassen Sie die geschweiften Klammern ein, wenn Was ist der Fall? PUBLIKUM: Nur eine Zeile. DAVID J. MALAN: Nur eine Zeile. Also das ist einfach irgendwie eine nette Art von Syntax Detail, so dass Sie verschwenden keine Zeit mit dem Schreiben drei Linien, von denen zwei geschweiften Klammern, nur zu schreiben eine einzige Zeile Code. Aber wenn Sie zwei oder mehr Zeilen, wir Tat brauchen, dies zu tun. So, jetzt lass mich speichern Sie diese. Lassen Sie mich gehen Sie vor und erneut ausführen Clang. Dann lass mich erneut a.out, und jetzt bekomme ich sie eine pro Zeile. Nun, a.out ist wieder eine Art stummen Namen für ein Programm. Wie kann ich feststellen Clang tatsächlich geben mir einen Dateinamen das ist mehr benutzerfreundlich, wie buggy2 selbst? Ein wenig mehr klar? PUBLIKUM: [unverständlich]. DAVID J. MALAN: OK, ich kann also tatsächlich die sehr benutzerfreundliche Verknüpfung und schreiben Sie einfach machen buggy2. Ich weiß nicht angeben. C in diesem Fall, und drücken Sie Enter. Und was machen tut, ist es kompiliert buggy2.c für mich durch fragen Clang es zu tun. Insbesondere ist es Clang nennt, läuft es Clang mit viel mehr Kommandozeilen-Argumente oder Schalter, als ich tatsächlich benötigen. In der Zeit werden wir wieder zu dem, was alle diese verschiedenen kryptischen Bindestrich Ausdrücken bedeutet. Aber jetzt ist das nur sparen mir die Mühe mit sich zu erinnern und zu tippen all jene verschiedenen Bindestrich Ausdrücke. Und der Kopf der es letztlich dass ich jetzt haben buggy2. Wenn ich dies tun manuell will, obwohl ich kann stattdessen tun - Klang-o buggy2 und dann buggy2.c. Und das wird ähnlich wie mir eine Datei namens buggy2. Also kurz gesagt, ist Clang der Compiler. Stellen Sie nur ein benutzerfreundliches Tool, das werden wir mit mehr und mehr, weil es nur beginnt, Dinge zu vereinfachen für uns. Und wir geben 0 schließlich. Denn jetzt, nur weil, aber wir beginnen Hänseleien, dass ein Teil heute und am Mittwoch. Haben Sie Fragen zu irgendwas davon? Yeah? PUBLIKUM: [unverständlich] ls in Anführungszeichen da? DAVID J. MALAN: OK. Wenn ich typisierte ls in Anführungszeichen, die mich tat etwas Magie hinter den Kulissen einen Fehler beheben. Ich habe vergessen, wie wir erzählt haben viele von Ihnen auf der Diskussionsrunden zu tun - wir tun dies jetzt - sudo yum-y update appliance50. Whoops, dass das stimmt geschrieben. So ist das Gerät wie ein Betriebssystem. Es läuft dieses Betriebssystem namens Fedora. Und jetzt wegen meiner langsamen Internet-Verbindung, ich habe wirklich abgespritzt es. So läuft sudo yum update, wie wir Sie in der tun soll Problem gesetzt, wird im wesentlichen wie läuft automatische Updates in Mac OS oder Windows. Und der Grund für das Funktionieren dieser ganz am Anfang der Problem-Set ist, denn wenn wir das Gerät geschaffen, I up, versaut und ich versehentlich alle Ihre Programme suchen schwarz auf einem schwarzen Bildschirm, weshalb Sie nicht sehen, sind sie standardmäßig aktiviert. Aber die neueste Version des Gerätes behebt dieses. Und das werde ich in der Pause fix, sobald ich Internet haben Konnektivität. So die Anführungszeichen nur versteckt mein Fehler, sehr diskret, anscheinend. Weitere Fragen? Ja? PUBLIKUM: Woher kommen aus machen? [Unverständlich] DAVID J. MALAN: Gute Frage. Woher stammen aus machen? Es ist ein Linux-Programm, das für viele Jahre bestanden hat, lange vor CS50. Und es kommt mit einem Betriebssystem wie Fedora. Es ist nicht von der CS50-Bibliothek. In der Tat, das einzige, was von der CS50-Bibliothek gekommen so weit, dass wir gesehen haben, sind GetString, GetInt, die alle die Hole-Funktionen, und das Wort string, und einige Soweit das Wort bool. Aber wir, dass neben necken, wenn wir tauchen in den CS50 Gerät selbst. Also ja, eine weitere Frage hier. PUBLIKUM: Als Sie sagten zu machen und dann fehlerhaft, wie funktioniert das Computer wissen [unverständlich]? DAVID J. MALAN: Gute Frage. Also, wenn Sie gerade laufen zu lassen buggy1 oder machen buggy2, wie nicht zu wissen? So standardmäßig, wenn Sie buggy1 geben, machen sucht nach einem Datei namens buggy1.c. Und dann führt die entsprechenden Clang Befehle wodurch das Überschreiben der Standard-Ausgabe-Datei namens a.out. In der Tat, wenn wir was machen schauen, was - Beenden wir diese. Wenn wir was machen wirklich tat schauen, machen buggy2, es ist bereits up to date. Also lassen Sie mich entfernen rm-Befehl, der Programm, das ich schrieb vor. Eingabe Y-E-S, um zu bestätigen, dass ich es entfernen wollen. Wenn ich jetzt tun zu machen, feststellen, dass in dieser sehr langen Linie, es ist das letzte, was hier-o buggy2. Alle machen tut vergeht dieses Argument, so zu sprechen, Clang, so dass ich nicht haben geben Sie es mir. Alles klar, so dass eine schnelle paar administrative Ankündigungen. So für Abschnitte, die offiziell begann kommenden Sonntag, werden Sie wollen immer bringen, wenn Sie haben ein, ein Laptop. Wenn Sie nicht über einen Laptop, nicht erreichen, um mich fallen mir eine E-Mail. Und wir werden herausfinden, einen Workflow. Was in der Regel werden Sie im Abschnitt zu finden, ist, dass sie Teil sind konzeptionellen Teil hands-on. Wir gezielt einsetzen Abschnitt von Fragen, Teil der Woche gestellten Aufgabe, durch einige der Fuß Das konzeptionelle Material aus der Vorlesung. Und das ist alles im aktuellen Problem-Set. Und wir werden auch in einigen Mitmach-Aktionen tauchen, manchmal von denen wird benötigt, um eingereicht werden, manchmal welche nicht. Zum Beispiel, diese erste Woche, sind sie nur als gedacht Aufwärmübung. Und Sie werden feststellen, dass diese Probleme wirklich nur, dass. Sie soll eher klein, aber nicht notwendigerweise triviale Programme zu schreiben, die nicht unbedingt spannende an und für sich, sind aber gute Chancen, üben mit Syntax, mit neuen Funktionen, in den Komfort eines wo Sie ein paar von deinen Klassenkameraden vorstellen, wie sowie Ihre TF. Und was wir im Laufe der Zeit tun kann, ist ein Tool namens CS50 Spaces, wobei anstelle der nur mit dem CS50 Appliance, werden Sie Statt auf eine Webseite gehen, in einem Browser, wo Sie in der Lage Code in einem Browser-Fenster während der Abschnitt zu schreiben. Und dann, wenn Sie in entscheiden, können Sie Ihre Lehre Kollegen dann zeigen was auch immer es ist, Sie auf Ihrem Bildschirm Eingabe in Ihrem Browser Fenster an der Vorderseite der Klasse, ob anonym oder öffentlich, so dass er oder sie kann dann durch mit Fuß Ihre Klassenkameraden, was Sie gut gemacht, was du nicht auch tun. Und wieder, versicherte Rest alles schön können anonymisiert werden. Aber es wird eine schöne Gelegenheit für viel mehr Interaktivität als so etwas wie Vortrag ermöglicht. In der Zwischenzeit müssen wir diese Dinge als Super Abschnitte, die optional sind, aber offen für alle in die Klasse, so dass man dies mehr gemeinsam tun für Aufgabe gestellt ein. Hier ist der Zeitplan. Dies ist auch auf der Homepage cs50.net geschrieben. Beachten Sie, dass es dann ein Hacker-spezifisch sein ein morgen Nachmittag. Und wir werden filmen ein heute und morgen einen und veröffentlichen die online innerhalb von 24 Stunden. Also, wenn Sie nicht können jede dieser Zeiten keine Sorgen machen. Und wieder ist der Zeitplan jetzt online unter cs50.net. In Bezug auf die Schnitte selbst, sollten Sie einen bekommen haben E-Mail, die Sie auffordert, den Kurs der homepage zu finden Ihre Sektion. Wenn das Leben hat sich verändert, und Sie müssen Ihren Bereich zu ändern, kein Problem. Gehen Sie zurück zu der gleichen URL, cs50.net/section, Singular, und du wirst füllen ähnlicher Form, so dass Sie dann geben Sie uns Ihre Wünsche. Und wir werden Follow-up durch Ende der Woche, was wir können unterzubringen. Letzte Woche erinnern, dass wir mit CS50 Discuss vorgeschlagen, des Kurses Diskussionsplattform, in der Vorlesung. Also mussten wir 40 Fragen, die gestellt und wurden antwortete während der Vorlesungszeit. So schien es gut zu funktionieren, so dass wir weiterhin versuchen, dies zu tun. Wenn während der Vorlesungszeit, müssen Sie nicht nur wohl fühlen Anhebung Ihre Hand, kein Problem. Zum cs50.net/discuss, dort posten, und einer unserer Lehre Fellows werden entweder beantworten elektronisch oder heben ihre Hand auf Ihrem Namen anonym zu fragen, abhängig auf der Art der Frage. Und in Bezug auf Feedback, werden in der Regel pset sein wieder innerhalb einer Woche. Weil es dauert eine Weile für die Abschnitte zu erreichen Gleichgewichtslage wird die erste pset, 0 und 1, ein wenig sein verzögert wie die Dinge beruhigen. Aber dafür in den nächsten Wochen dran bleiben, um zu kommen. Alles klar, also lassen Sie mich auf meinem schweren gestellt Stimme für einen Moment. Also das ist eigentlich eine interessante Klima zu sein diese Diskussion, was mit all den anderen Dingen, los auf dem Campus verwandten dazu. Aber CS50 hat sicherlich hatte seine Geschichte dieser besonderen Thema in so viel wie in jedem Jahr, dieser Kurs ist für viele Jahr, Ad-Boards rund 3% der Klasse. Das letzte Jahr, 2011, CS50 Ad-Boarded 35 Studenten. Dies ist nicht, denke ich, wegen des Mangels an Klarheit. Erkenne, dass im Laufe der Lehrplan, gibt es eine Seite der Erklärung, wo die Linien sind. Das gleiche Aussage auf jedem der wiederholten Problem setzt auf Seite eins. Also habe ich erwähne dies heute wirklich nur um Leute von diesem aufmerksam. Und wir haben verschiedene Dinge ausprobiert. Und was ich dachte, wir würden heute gerade einen Moment Zeit nehmen, um tatsächlich einige der jüngsten Fälle, die kommen haben aussehen. Anstatt sollten Sie diese als schmutzigen kleinen Geheimnisse, eigentlich weisen darauf hin, was die Schüler gemacht haben und wie wir festgestellt es und wirklich das, was das übergeordnete Motivation ist für auch dieses Gespräch. Also mit dieser sagte, die Linie im wesentlichen ist dies - gemäß dem Lehrplan, sind Sie willkommen, Sie werden aufgefordert, die sprechen Sie mit Klassenkameraden. Das ist der ganze Zweck der mit diese kollaborative Sprechstunden in Annenberg und die Menschen ermutigen für die endgültige Projekt zusammen zu arbeiten. Aber die Linie wird gezeichnet, wenn es Zeit kommt, um tatsächlich zu schreiben Ihre endgültige Lösung. Speaking in Englisch, völlig in Ordnung, spricht in Pseudo-Code, völlig in Ordnung. E-Mail ein Klassenkamerad Ihrer pset, ließ sie schauen über der Bildschirm wie die Hände der Eingabe fortfahren, über die Leitung als auch. Sie auf dem Lehrplan für die besonderen Linien. Aber nur um ein Bild zu malen, wie diese ist leider ein Wirklichkeit erkennen, dass es Websites gibt, Lösungen haben von dieser Klasse und viele andere Klassen. Die Tatsache, dass Sie oder rund 3% von euch wissen, dass diese existiert bedeutet, dass wir wissen, dass diese existiert. Die Tatsache, dass es Websites wie dieses, wo Sie kann jemand zahlen, um tatsächlich das Problem Sätze - das war eine tatsächliche Fall, kam im letzten Jahr. Dies ist eine Website namens odesk.com. Und Tim war der Name der Person hier, die über die Entsendung wurde diese Website und fragte jemand seine pset 7 in zu tun diesem besonderen Fall. Nun, das ist odesk.com sehr Google-Lage, und auch wir sind sehr gut googeln. Auch hier gibt es Seiten - und das ist eher ein grauenhaft, ehrlich gesagt. [Gelächter] DAVID J. MALAN: Die lustige Sache über diese Seite ist, wenn lesen Sie die Info-Seite, reden sie über ihre Corporate Kultur und wie Kunden-Service ist die Nummer eins Priorität, um sicherzustellen, dass Ihre Aufträge zu bekommen wandte sich in der Zeit. Aber im Ernst, wieder die Tatsache, dass diese Seiten existieren, erkennen wir auch, sind bewusst diese Art von Websites. Und um Ihnen ein Gefühl von dem, was bildet dies in der Regel dauert, wir in der Regel keine großen Skandale, wo Menschen sind auf jede Art von massiven zusammen, sondern Es ist diese Late-Night-Momente der Schwäche, in dem Sie haben, so viel zu tun, es 04.00 Uhr ist, du bist erschöpft, und Sie denken sich, na ja, lassen Sie mich nur einen Blick auf meine Mitbewohnerin oder mein Freund den Code oder dergleichen. Und die Manifestationen dies leider beinhalten Studenten Eine Vorlage etwas und Schüler B submitting etwas, was sicherlich in einem Computer Wissenschaft Klasse, ist bemerkenswert einfach für Informatiker mit Software zu erkennen. Dies ist ein weiteres gemeinsames Paradigma, wo Sie Art habe wurde neben der jemand arbeitet, vielleicht reden in Englisch, just fine, Pseudocode. Aber dann ist es an der Zeit, um tatsächlich zu unterwerfen und die pset nur über E-Mail oder Dropbox oder dergleichen ausgetauscht zu werden. Aber in einem Versuch, um es weniger offensichtlich, dass dies was passiert ist, dann ist dies, was eingereicht werden. Auch dies nicht stolpern gut geschriebenen Stücke Software wie wir tatsächlich erkennen diese Art von Dingen. Und in der Tat, was wir tun müssen, ist Software benutzt, die vergleicht alle diesjährigen Einreichungen gegen alle vergangenen Jahres Einreichungen, gegen alles, was wir gefunden auf der Internet, gegen jede Job-Website gibt. Es ist alles sehr automatisiert. Und so machen wir das wirklich in großer Fairness gegenüber den 97%, die arbeiten wirklich ihre Ärsche off in diesem und in anderen Klassen und setzen in all dieser Bemühungen, so dass die Arbeit sie letztlich einzureichen ist ihre eigene. Und ich kann gehen für Alters. Dies sind nur eine Handvoll der letztjährigen Fälle. Ein paar Studenten eingereichten diese Dateien identisch für pset 2, pset 3, pset 4, pset 5, pset 6, pset 9. In diesem Fall war das Quiz 0 und im letzten Jahr, wo zwei Studenten eingereicht identisch Satz unter vielen andere, "Die Anforderung des Typs -" Punkt, Punkt, Punkt. So auch in einer Klasse von 600 haben wir dies erkennen vorgelegt am Quiz. Also kurz gesagt, das - ehrlich gesagt, ich hasse mit dieser Art von Gespräch - aber das ist wirklich eine bewusste Anstrengung in diesem Jahr versuchen, zur Senkung dieser Nummer. Denn obwohl wir sagen, diese Art von Dingen alle Jahr, denke ich, die Realität wobei an wohnte für ein paar mehr Sekunden als üblich und eigentlich nur darauf hinweisen, dass das, was könnte wie, äh, nicht so eine große Sache scheint, zumindest denken Sie zurück an diesem besonderen Augenblick, sowohl in Fairness Sie und Ihre Mitschüler hier. Also, wenn Sie irgendwelche Fragen haben, wo die Linie ist, bitte einfach erreichen, um mich persönlich. Aber die Antwort ist immer, völlig betonte bei der last minute, Bargeld in einem späten Tage. Oder wenn es eine Frage der nicht mit einer späten Tagen, ehrlich, mailen Sie mir persönlich. Wir werden herausfinden etwas heraus. Bitte nicht Ihre Zeit hier an der Harvard in Gefahr. Nun, ich dachte, wir sollten die Stimmung aufzuhellen, so dass ich enthalten diese als die nächste Folie. [Gelächter] DAVID J. MALAN: Diese Website war großartig. Ich habe tatsächlich ein wenig abgelenkt. Es gibt diese ein. Und dann dieses war erstaunlich. Okay, so dieser kitten späten denke nachts, wenn so diese Entscheidungen. Alles klar, also zurück zu mehr Spaß und weniger ernste Sachen, wie Bedingungen. Alles klar, also unterhielten wir uns kurz über diese. Dies ist etwas, das wahrscheinlich sehr vertraut aus die Welt der Scratch. Und in der Welt der Scratch, haben wir dieses Bedürfnis manchmal hinausgehen Gabel in der Straße. Entweder dies oder jenes tun oder diese andere Sache hier. Und wenn wir dies tun wollen, können wir, in C jetzt dies, wenn else-Konstrukt. Und dann haben wir hier boolesche Ausdrücke. Zum Beispiel, Boolesche Ausdrücke Hier können wir OR sie zusammen, in dem Sinne, dass wir diesen Zustand haben oder Diese Bedingung. Wir können und sie zusammen, in dem Sinne, dass wir wollen check this Zustand und Zustand. Und hier haben wir eine Switch-Anweisung jetzt, das ist nicht so ähnliche syntaktisch zu diesen Arten von Bedingungen, aber es ermöglicht es uns, den Gegenwert von if, else if, else if, else do wenn und dergleichen durch einfaches aufzuzählen fallweise von Fall zu Fall. So sahen wir diese letzten Zeit. Und dann begannen wir zu berühren, auf Dinge wie Schleifen. Wir sahen eine von diesen einen Moment vor. Aber es gibt diese anderen looping Konstrukte. Zum Beispiel werden diese hier. So while (Bedingung), tun diese Sache wieder und wieder. So grundlegend, scheint, was anders zu sein zwischen diesem for-Schleife und dieser while-Schleife hier? Diese for-Schleife und diese while-Schleife. Yeah? Was ist das? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Gut. Während also in der for-Schleife Zustand, es ist eindeutig mehr Syntax. Es gibt diese Initialisierung, gibt es dieses Update. In einer while-Schleife, es gibt nur diese Bedingung. So scheint es, dass es ein wenig nach unten gegenüber der for Vergleich ist Schleife, was bedeutet, dass, wenn wir die Variablen haben wollen, und wir wollen einer Inkrementierung haben, wir haben tatsächlich zu Tun Sie dies, was uns. Also lass mich gehen Sie vor und eröffnen gedit. Lassen Sie mich Umstieg auf das Gerät. Und lassen Sie uns einfach eine schnelle kleine Beispiel, dass zeichnet eine davon von der anderen. Und im Hinterkopf hier sollte ich sagen eine Sache. Ich habe ausdrücklich erwähnte den Namen Tim. Tim war eigentlich jemand, dass ein Schüler zu finden, zu tun versucht ihre Hausaufgaben für sie. Wir hatten keine Tim in diesem Bereich vor. So realisieren, damit ich einen Schüler offenbart, war es nicht ein Student. Es war eine zufällige Person im Internet Dinge zu tun durch einen Bevollmächtigten im letzten Jahr. So finden wir auch. Also in diesem Fall hier, lass mich gehen Sie vor und Öffnen Sie eine neue Datei. Datei, Neu. Das gibt mir eine Registerkarte hier. Lassen Sie mich gehen Sie vor und speichern Sie es als loop.c. Lassen Sie mich gehen, und klicken Sie auf Speichern. Und dann hier unten, lasst uns weitermachen und schriftlich # Include. Lassen Sie mich zu vergrößern in. Jetzt tun wir int main (void). Nun lassen Sie mich gehen Sie vor und tun for (int i = 0; i < oh, 10; i + +). Und jetzt werde ich weitermachen und haben den Stern zu drucken, dass ich habe früher. Und dann am Ende des Programms, wir gerade dabei, drucken Sie eine neue Zeile, nur so, dass meine Aufforderung sieht nicht alles chaotisch. 0 zurück. Scheint syntaktisch korrekt? So weit. Also mal sehen. Lassen Sie mich also verkleinern, gehe in mein Terminal-Fenster. Und lassen Sie mich gehen Sie vor und führen Sie Schleife, weil ich dies als was loop.c. So stellen Schleife. Scheint OK zu kompilieren. Lassen Sie mich laufen Schleife, und jetzt die Eingabetaste. Und es scheint zu druckenden 10 Sterne haben. So lasst uns einfach wandeln diese in eine while-Schleife und sehen, was Arten von Fragen, die wir stolpern. Also anstatt dies, lass mich gehen hier und sagen, während i weniger als 10 - Lassen Sie mich loszuwerden der for-Schleife. OK, so haben wir ein paar Probleme bereits. So die Bedingung ist die gleiche, aber ich bin natürlich fehlen die Initialisierung. Ich vermisse die Inkrementierung. Also, was soll der Compiler wahrscheinlich sagen Sie mir, wenn ich es versuchen dieses Programm kompilieren? Yeah? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Gut. Es wird also so etwas wie Schwarzarbeit sagen - in diesem Fall Variable I. Und in der Tat, der nicht deklarierte Bezeichner i verwenden. Und so ist dies im Gegensatz zu Sprachen wie PHP und Python und Ruby, mit denen einige von euch vielleicht bekannt sein, wo man nur irgendwie Beginn der Verwendung von Variablen nolens volens und nicht um sie zu deklarieren Sorgen explizit immer. In C und in Sprachen wie Java und C + +, muss man Super explizit. Und wenn Sie eine Variable namens i wollen, müssen Sie mir sagen, Welche Art von Variable es sich handelt. So werden wir zu haben, um dieses Problem beheben wie folgt. Ich werde gehen müssen hier und geben int i; daher Ich habe erklärt, eine Variable namens i. Jetzt habe ich übersprungen einem Schritt. Ich habe natürlich nicht sie initialisiert, aber wir sehen, ob das am mindestens Fabrikate Clang Stop beschweren. Lassen Sie mich also ein Remake dieses Programm. Alles klar, jetzt ist es nur beschweren aus einem anderen Grund. "Variable 'i' ist nicht initialisiert, wenn hier verwendet." Alle Rechte, so das ist ziemlich eindeutig. Initialisiert bedeutet nur, setzen sie gleich einem Wert. Und wir haben das nicht getan, so lassen Sie gleich 0 mich versuchen. Nun wollen wir versuchen, diese wieder und wieder laufen Clang. Zusammengestellt dieser Zeit. Und ich bin zu, um sie auszuführen. Aber große alte Endlosschleife, weil ich das getan Initialisierung, habe ich den Zustand getan, aber ich habe noch nie getan jede Art von Inkrementierung. Also, wie kann ich tun, die Inkrementierung? Nun, in einer while-Schleife, fühlt es sich wie ich zu haben bin um es im Inneren der Schleife zu tun, denn ähnlich wie die erste Woche Beispielen zu tun looping Konstrukte, wie bei die Socken und mit dem Selbst-Zählung, hatten wir zu tun etwas ganz am Ende, wie gehen Sie zurück auf die nächste Zeile. Was, wenn ich voran gehen und tun dies i + + hier? Lassen Sie uns nicht einmal kompilieren dies. Fang mich schon. Was ist hier falsch? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Also ist es definitiv nicht int. Es ist i. Und die geschweiften Klammern, wie zuvor, Einrückung ist nicht genug. So, jetzt habe ich dieses Konstrukt. So, während ich weniger als 10 ist, drucken Sie einen Stern, dann erhöhen i. Und die Art und Weise eine while-Schleife funktioniert ist, dass, sobald Sie traf die Ende der Schleife, die in diesem Fall sieht die Leitung 10, es geht zurück in die Linie 6, an welcher Stelle die Bedingung wird erneut geprüft werden. Und wenn ich noch weniger als 10, werden wir tun Linien 8 und dann 9, dann werden wir treffen 10, und gehen Sie zurück bis 6, wieder und wieder und wieder und wieder, so lange, wie ich weniger als 10 ist. So lasst uns wieder laufen hier zu machen. Okay, haben wir zusammengestellt okay. Lassen Sie mich re-run-Schleife. Und jetzt scheint es tatsächlich zu funktionieren. So Vor-und Nachteile hier? Nun, so weit es ist eigentlich nicht ganz plo - so cute. Alles klar, das war ein - ah, das war ein Unfall. Alles klar, also gehen wir zurück in die for-Schleife. So for-Schleifen sind nett, weil sie super ausdrückliche sind. Und obwohl sie ein wenig klobig zu schreiben sind, ist es sehr mächtig und erlaubt es Ihnen zu tun mehrere Dinge auf einmal. While-Schleifen nicht scheinen, um eine riesige Menge an Wert haben nur noch nicht, weil es sich anfühlt, wir müssen nur mehr Arbeit zu tun. Wir haben, um die Initialisierung hier aufgestellt, die Update hier unten, und wir müssen uns daran erinnern, um all das zu tun. Also werden wir in der Zeit sehen, dass while-Schleifen tatsächlich verleihen sich nahezu verschiedenen Kontexten unterschiedliche Daten Strukturen wie Listen und Hash-Tabellen, die Dinge werden wir um Mitte Semester. Aber jetzt wissen, dass es diese dritte Art bekannt als do- while-Schleife. Und wir haben das kurz gesehen. Und dies könnte super hilfsbereit mit pset 1. Jedes Mal, wenn Sie wollen, etwas zu tun, und dann prüfen, ob der Benutzer zusammen, und wenn sie es nicht tat, es wieder tun, eine do- while-Schleife eignet sich für diese Art von Logik. Denn als der Besteller von oben nach unten hier andeutet, Sie bedeutet wörtlich tun. Und tun dies immer und immer wieder, was könnte das sein? Vielleicht bedeutet es ruft GetInt oder GetString und dann Überprüfen Sie den Wert GetInt oder GetString und dann schreien an den Benutzer, wenn sie nicht, indem man sie zusammen wieder und wieder und wieder. Wo möchten Sie einmal etwas zu tun, dann prüfen eine Bedingung. Also lasst uns versuchen. Lassen Sie mich tatsächlich ändern dies nun zu einem do-while-Schleife. Und ich werde weitermachen und gehen Sie folgendermaßen vor. So gehen Sie folgendermaßen vor. Lasst uns int i = GetInt (), aber lassen Sie uns zuerst sagen, der Benutzer was zu tun ist. So ein wenig anders diesmal. "Gib mir ein int". Also werde ich printf dafür. Und jetzt werde ich nach unten gehen hier, und ich werde dies tun, während ich es, sagen wir, mehr als - Lassen Sie uns sehen, ist i, sagen wir, weniger als 0, oder i größer als 10 ist. In anderen Worten, ich möchte eine Zahl von 1 bis 9, nur willkürlich. Also bin ich mit einem kombinierten booleschen Ausdruck hier sicherstellen, dass i kleiner als 0 oder größer als 10 ist, in dem Fall werde ich diese Schleife hier wieder tun. Also noch einmal, dies zu tun - solange i kleiner als 0 oder i größer als 10 ist. So, jetzt lass uns weitermachen und tun dies, wenn wir das getan haben. Lass uns einfach tun, eine schnelle Plausibilitätsprüfung. printf ("Thanks, i% d", i). Also das einfache Programm fragt den Benutzer nach einem int, sorgt dafür, dass es innerhalb eines gewissen Bereich, 1 bis 9, und dann dankt dem Benutzer durch sie daran erinnern, was sie gerade eingetippt, nur als kleine Plausibilitätsprüfung. Aber mal sehen, ob das funktioniert wie vorgesehen. Lassen Sie mich gehen Kopf runter und wieder zum Laufen zu bringen Schleife. Hmm. "Schwarzarbeit Kennung 'i' verwenden". Das ist merkwürdig. Ich dachte, wir beschlossen, dass. Gleiche Symptom, aber unterschiedliche Codes. Yeah? PUBLIKUM: [unverständlich] innerhalb der beiden, müssen wir [Unverständlich]. DAVID J. MALAN: Genau. So dies tatsächlich führt uns zu einem Thema wie Umfang bekannt. Es stellt sich heraus, dass C wieder, es wirklich braucht man buchstäblich. Und wenn Sie etwas tun, wo Sie deklarieren int und ordnen sie dann einen Wert, aber Sie tun, der in einer Paar von geschweiften Klammern, was C tut, ist es davon ausgegangen, dass wollen nur die 32 Bit bekannt als i existieren, um innerhalb der Rahmen dieser geschweiften Klammern, die im Rahmen von Linien 6 bis 9. So i erklärt wird, und es wird eine zugewiesene Wert in Zeile 8, aber sobald man außerhalb zu bekommen Linie 9 unterhalb der geschweiften Klammer ist i nicht mehr in Umfang, so zu sprechen. S-C-O-P-E. Es ist nicht mehr im richtigen Kontext. So, jetzt gibt es kein i, so ist es, als ob wir noch nicht einmal erklärt es überhaupt nicht. Also, was ist ein Update dann für so etwas, wenn die Grund ist, dass ich innerhalb der geschweiften Klammern deklariert ist, die ist offenbar schlecht? Hier? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Yeah. So können wir initialisieren außen. Also lass mich gehen Sie vor und löschen Sie die Erklärung Teilen, wobei I die Art und lass es mich tun hier oben. So in Zeile 5, heißt es nun: "Gib mir einen int." Nennen Sie es i. Beachten Sie in Zeile 9, Ich will nicht, dies zu tun, weil ich bereits die 32 Bit. Ich will nicht, um den Computer für eine frage verschiedene 32 Bit. Ich möchte die gleichen 32 Bit verwenden. Und jetzt, weil ich in Zeile 5 deklariert ist, ist es immer noch legit um es in Zeile 11 und Zeile 12 zu verwenden. Also lassen Sie mich versuchen, dies zu kompilieren und zu sehen wenn Clang stoppt schreien. machen Schleife. So, jetzt ist es "implicit declaration of function 'GetInt' ist ungültig in C99. "Was ist das? Yeah? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Yeah. So, jetzt, dass ich tatsächlich mit GetInt, ist dies nicht etwas, das kommt einfach mit C. Das kommt von CS50. Also müssen wir das hier. Und lassen Sie mich zurück in die Eingabeaufforderung nach unten hier und wieder zum Laufen zu bringen. Okay, endlich. Jetzt haben wir das und das andere Fehler behoben. Lassen Sie mich jetzt laufen Schleife und sehen was passiert. "Gib mir ein int." Ich gebe es 11. Ich gebe es -1. Ich gebe es foo. Ich gebe es 5. Und jetzt ist es tatsächlich funktioniert. Aber die Aufforderung für einen Grund hier geändert. Warum hat es zu sagen versuchen eine dieser Zeiten, aber geben Sie mir eine int Die anderen drei Zeiten? Warum ist das Verhalten anders? PUBLIKUM: Gab es einen String zurück. DAVID J. MALAN: Sorry? PUBLIKUM: Sie gab ihm einen String. DAVID J. MALAN: Yeah. So haben wir es einen String in diesem dritten Versuch, wenn ich foo getippt. Foo ist ein String. Es ist natürlich nicht ein int. Und die Art und Weise, dass CS50 hat GetInt implementiert ist, dass wir nicht überprüfen, ob etwas ist kleiner als 0 oder größer als 10 für Sie, denn wie wir im Voraus wissen, welche Art von int du? Aber wir können minimal für Sie zu prüfen, haben die Benutzer mindestens Geben Sie eine ganze Zahl? Und wenn sie es nicht taten, haben wir beim Anwender schreien, indem Sie "retry" auf der Bildschirm. So, jetzt haben wir ein Programm, das ist eine Schleife. Okay. Nun ist das der diese Art von besseren Konstrukt? Also das ist, wo die Dinge ein wenig chaotisch zu starten, wird die Tatsache, dass Sie daran denken, eine Variable zu deklarieren hier haben wenn Sie wollen, um es in einiger verwenden geschweiften Klammern und außen. Aber selbst wenn dies sieht ein wenig kryptisch auf den ersten Blick gerade wieder, erinnere mich an die einfachen Logik. Um etwas in C zu verwenden, ob sie eine Funktion ist oder es ist eine Variable, müssen Sie es schließen, wenn es eine Funktion ist in irgendeiner Bibliothek, oder Sie brauchen, um es zu erklären. Aber jetzt müssen Sie zusätzliche eingedenk der Tatsache, dass Sie erklären es im richtigen Rahmen. Sie sind nicht Putting es zu fest in Klammern. Lassen Sie mich also tatsächlich wieder rollen. Wenn wir zurück zu unserem beispielsweise von früher, und ich gehe zurück, um int, int i = 0; i <10; i + +, und ich do printf Sterne, wie diese, und schließen Sie dann paren, und jetzt printf i ist jetzt - nach der gleichen Logik, was wird passieren, wenn ich versuchen dieses Programm kompilieren? PUBLIKUM: Invalid Kennung. DAVID J. MALAN: So es ist eine andere ungültige Kennung, Schwarzarbeit Kennung. Nun, das ist der Grund, ein wenig anders. Es gibt offensichtlich keine geschweiften Klammern hier, aber die gleichen Idee, gilt die gleiche Geschichte des Anwendungsbereichs. Wenn Sie eine Variable wie i Innenseite ein erklärtes for-Schleife, auch wenn Sie nicht explizit die geschweiften geschrieben Hosenträger, der sie geistig denken, wie immer dort zu sein, in denen Fall i ist nur gültig innerhalb der for-Schleife. Es ist nicht gültig, wenn Sie in die nächste Zeile, erhalten die in In diesem Fall ist jetzt 10. Also einfach ein paar Fragen der Reichweite und dergleichen. Alles klar, noch Fragen? Alles klar, so ist dies eine Art trivial kleines Programm, Drucken gerade kleine Sterne. Aber mal sehen, ob du dieses Lied hier zu erinnern. Dies ist ein unglaublich ärgerlich Lied, das die Kinder auf zu singen würde der Schulbus und dergleichen. Aber was ist schön daran ist, dass es auf diese Zyklizität hat, wobei es "99 Flaschen Bier an der Wand, 99 Flaschen Bier. Nehmen Sie eine unten, Pass It Around, 98 Flaschen Bier an der Wand. "Und dann das Lied wiederholt die 97, dann 96, dann 95, dann 94, den ganzen Weg hinunter auf 0, wenn du eigentlich, dass weit auf dem Bus. Also das ist ein nettes Programm, von Gerät zu sortieren, weil meine Gott, wenn du könntest einfach implementieren diese mit ein paar Zeilen Code, können Sie spuckte den gesamten Texte zu diesem Song recht schnell. Aber auf dem Weg, können wir beginnen jetzt zu necken neben einigen dieser grundlegenden looping Konstrukte und jetzt auch Einführung Funktionen, die wir selbst zu schreiben, Werte zurückgeben dass wir umfahren. Aber zuerst, warum wir nicht voran gehen und nehmen unsere Fünf-Minuten- brechen hier? Und wenn wir zurück sind, werden wir dieses Lied singen. Alles klar, also sind wir zurück. Und wenn ich sage wir jetzt dieses Lied singen, ich meine, programmatisch, nicht verbal. Also hier haben wir beer1.c, die eine Implementierung ist bestimmtes Lied. Und nur klar zu sein, für diejenigen, die nicht vertraut mit dem, was dieses Ding aussieht, lassen Sie mich gehen Sie vor und machen beer1, Enter. Nun lassen Sie mich laufen beer1, und was wir sehen - wie viele Flaschen Bier wird es geben? Ich werde in 99 geben, wie das Lied sagt. Enter. Und wenn wir jetzt blättern - oops - wenn wir durch all dies zu blättern, werden wir sehen, dass Diese Tat singen das ganze Lied. Warten Sie eine Minute. Meine Bildlaufleiste ist ein wenig durcheinander. Lassen Sie uns die größeren Fenster. So beer1, 99, es geht los. Also hier haben wir den ganzen Song, viel schneller durch die gesungen Computer als könnte es von uns gewesen. So bemerken, aber die zyklische Natur hier. Er sagt, 99, dann 99, dann "nehmen Sie eine unten, geben sie herum ", dann 98. Und jetzt ist es wiederholt immer und immer wieder. Also das ist eigentlich eine perfekte Gelegenheit für eine Art von Looping konstruieren. Beachten Sie, dass ich irgendwie Schneiden einer Ecke hier bin. Beachten Sie, dass ich sage "98 Flaschen Bier an der Wand, 97 Flaschen Bier an der Wand, "und das war nur so dass, wenn wir ein Flaschen Bier zu bekommen, habe ich nicht über die englische Grammatik zu kümmern. Aber wir können auch dieses Problem beheben mit ein wenig einer if Zustand, vielleicht. Wenn diese Zahl ist einzigartig, voran gehen und sagen, "flasche", ansonsten, wenn es plural ist, sagen Sie "Flaschen". Aber jetzt bin ich völlig schneiden diese Ecke. Also lasst uns sehen, was wir hier haben. Also haben wir einige Kommentare an der Spitze. Ich bin auch diese beiden Bibliotheken, wie Wir haben allgemein gewesen. Und jetzt lassen Sie mich unten scrollen, um die erste Ist Codezeilen. Zeile 17 startet main. Linie 21 und 20 hat, wie viele Flaschen Bier wird es geben? Und dann rufe ich GetInt. Und jetzt habe ich ein bisschen eine Plausibilitätsprüfung. Also das ist eine Konvention, dass wir jetzt beginnen die Annahme zu strenger überprüfen die Eingaben des Benutzers. Manchmal muss man einfach nicht wollen, um sie wieder aufgefordert und immer wieder. Wenn der Benutzer Schrauben und nicht kooperieren, in Ordnung. Beenden und einfach nicht mit ihnen umzugehen. Und damit ist das, was ich hier tue. Wenn n kleiner als 1 ist, bin ich gerade dabei, beim Anwender schreien, "Sorry, das macht keinen Sinn." Und dann bin ich zu gehen beliebig 1 zurück. Also noch einmal, dies ist nur eine Konvention zu gewöhnen. Denn jetzt, nehmen Sie es auf den Glauben. Aber bis jetzt haben wir immer wieder 0, da wir gesagt haben wieder 0 bedeutet was? PUBLIKUM: Erfolg. DAVID J. MALAN: Erfolg, das ist alles. So, jetzt haben wir endlich beginnen zu denken Nicht-Erfolge - mit anderen Worten, Grenzfälle, Fehlerbedingungen - jetzt habe ich eine unendliche Versorgung, oder zumindest vier Milliarden möglichen Dinge, die schief gehen können in meinen Programmen. Und ich kann beginnen Zuordnung zu einzelnen Nummern. Nun, in der Regel genügt es, einfach zurück etwas anderes als 0 ist. So werden wir einfach zurück 1 für jetzt. Aber der Grund für die Rückkehr 1 ist, dass, sobald Sie wieder 1, erraten, was passiert mit dem Rest des Programms? Es stoppt. Das war's. So ist die Tatsache, dass ich wieder 1 ist effektiv Kurzschließen dieses Programms Ausführung, so dass nichts unterhalb der Linie 27 wird weiter ausgeführt. Sobald Haupt zurück, das ist es. Alles klar, also wenn der Benutzer nicht kooperieren und wir erreichen line 30 weil sie in einem legitimen Zahl eingegeben haben, hier ist meine Umsetzung dieses Lied. Also habe ich zuerst gedruckt einen Zeilenumbruch, nur für Ästhetik. Ich habe jetzt eine for-Schleife. Und ich merke, mache die Dinge in einem etwas von einer anderen Richtung. Ich habe nicht weniger als zu tun, habe ich nicht zu + + zu tun. Ich kann stattdessen sagen initialisieren eine Variable i, setzen Sie sie auf n, die Anzahl der Benutzer eingegeben wird, gehen Sie wie folgt, so solange i größer als 0 ist, dann habe ich - sobald Sie eine Iteration dieser Schleife beendet. So können wir Countdown mit einer for-Schleife als gut. Nun, dies ist so ziemlich Wochen ein Zeug jetzt mit printf. So print "% d Flaschen Bier an der Wand." Print "% d Flaschen Bier. "" Nehmen Sie ein unten, geben sie herum. "Print "% D Flaschen Bier an der Wand." So ist es immer noch% d, aber feststellen, dass das Argument für printf ist im Wandel. Nach dem Komma, ich habe ich, weil ich bis 99 sagen wollen. Nach diesem Komma, habe ich i, weil ich 99 sagen wollen. Nach diesem Komma, habe ich i - 1, weil ich 98 in sagen wollen diese erste Iteration, und so weiter. Und jetzt hier unten, ich habe nur einige kleine dumme Bemerkung. Und dann die Linie 42, zurück I 0 durch Konvention, was bedeutet, dass alles ist okay. So was, wenn ich vermasselt? Was könnte ein häufiger Fehler hier zu sein? Nun, was ist, wenn ich sagte versehentlich gut, will ich zu zählen auf 0, ich will 0 Flaschen Bier an der Wand? Also sage ich, i größer oder gleich 0 ist. Was wird das Symptom, dass ich jetzt sehen, ob ich neu kompilieren zu sein beer1 und führen Sie es? PUBLIKUM: Negativ. DAVID J. MALAN: Ja, es ist gonna go negativ. Dies ist ein Off-by-one-Fehler, ein unglaublich häufiger Fehler zu machen. Lasst uns tatsächlich zurück zum Terminal-Fenster und tun es Hier, so können wir mehr in einer Zeit zu sehen. Geben, 99 Flaschen Bier. Schließen, aber wir gingen immer so leicht zu weit. Wir sangen das Lied zu weit nach unten, so dass wir jetzt noch den negative Zahl ist. So ist es nicht ganz geklappt. Alle Rechte, so können wir leicht beheben, dass durch den Rückgriff auf die wie es einmal war. Aber was sind einige Möglichkeiten nun für Verbesserung? Nun, lassen Sie mich offen beer2.c und scrollen Sie hier und nehmen Sie eine Blick auf diese Version. Was ist das erste, was ins Auge springt dich an, als verschiedene in dieser Version hier? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Yeah, so nicht mehr i, weil es sich um mir wissen Sie was, ich frage den Benutzer n, und dann bin ich Setzen i gleich n, und dann bin ich ändern i, aber ich bin nie Berühren n wieder. Also, was zum Teufel war der Punkt von Ihnen Zuteilung weitere 32 Bits als ich gerade so, dass ich eine andere Variable haben? Also in diesem Fall, ich irgendwie erkannt, dass unnötige Design-Merkmal. Und ich gehe jetzt zu sagen, während n größer als 0 ist, gehen vor und drucken Sie das gleiche Lied, indem ein n printf die zweite Argument, n - 1 als zweites Argument hier unten. Und dann bei jeder Iteration dieser Schleife vor und gehen Sie einfach dekrementieren n sich. Jetzt, funktional, dieses Programm wird identisch sein. Wenn ich in 99 geben, startet n bei 99. Ich Dekrement, Dekrement, Dekrement, Dekrement. Ich werde den ganzen Weg runter auf "Eine Flasche Bier auf die Wand, eine Flasche Bier. Nehmen Sie eine unten, geben sie herum. 0 Flaschen Bier an der Wand. "Das Ende, denn ich habe erhalten die Bedingung richtig. Es ist größer als 0. Ich habe diesen Fehler nicht machen. Also, was ist besser, Version ein oder Version zwei? So hörte ich einen Haufen Murren für zwei Personen. Warum zwei? Was ist das? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Oh, okay. So wird es nicht unter 0 gehen, aber denken Sie daran, in der Version ein, die Original richtige Version nicht unter 0 entweder gehen. Also denken Sie daran, dass dies die richtige Version ist. Also lassen Sie es mindestens vergleichen die beiden richtigen Versionen. Was ist ein Argument zugunsten der Version zwei davon, mmm, besser? Yeah? Zielgruppe: IT benötigt weniger Platz. DAVID J. MALAN: Okay, so dass es weniger Platz, nicht wahr? Während Version ein verwendet 32 ​​Bits für n, und dann noch 32 Bit für i. Version zwei verwendet nur 32 Bits für n, so dass scheint ein Plus. Andere Gedanken? Möchte jemand zu Gunsten der man argumentieren? Yeah? PUBLIKUM: Sie müssen zusätzliche Zeile Code für n verwenden -. DAVID J. MALAN: Okay, sicher. Also das ist fair. So dies nur, zumindest für mich - Ich meine, das fühlt sich tatsächlich ein wenig chaotischer, die Tatsache, dass Ich kann mir nicht kapseln alle meine Logik sortieren in einem schöne Linie, die for-Schleife, wie die for-Schleife können. Hier, ich Art zum Wenden auf dieser n - am Ende der Schleife, weil Es ist logisch notwendig. Aber es ist irgendwie reibt mich in die falsche Richtung, nur weil es scheint unabhängig von der Logik der hier oben, obwohl wieder, es ist notwendig. Andere Gedanken? Yeah? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Yeah. So was, wenn Sie stattdessen am Ende des Liedes, wollte drucken Sie wieder den Namen des Songs? Wie "Danke fürs Mitspielen 99 Flaschen Bier", oder etwas dumme wie das? Aber der Punkt ist, du wolltest Zugriff auf den ursprünglichen Wert. Die Tatsache, dass Sie mutiert oder n verändert auf jeder Iteration und haben daher ihren ursprünglichen Wert vernichtet bedeutet, dass Sie einfach nicht tun, dass am Ende. Nun wohl, wir eindeutig nicht wollen daß in diesem Programm. So who cares? Aber das ist ein sehr wichtigen Punkt. Und um ehrlich zu sein, es gibt wirklich keine ein Recht hier zu beantworten. Sie sind beide gleich richtig. Ich könnte so oder so überzeugt sein. Ich werde sagen, dass im Allgemeinen, es ist ein gutes Prinzip ist, wenn Sie fragte der Benutzer für einen gewissen Wert und Sie in einer Variable gespeichert wie n, einfach irgendwie im Prinzip, ist es wahrscheinlich eine gute zu, dass etwa halten. Und alle Daten, die Sie immer und immer wieder mutieren, nur geben Sie sich eine Kopie dieser Variablen, nur so, dass Sie Zugriff auf das Original. Sie verbringen 32 weitere Bits, aber die Realität ist dies Computer, wie, zwei Gigabyte RAM in diesen Tagen, und wir sind mehr als 32 Bits Wortklauberei? Wirklich nicht so eine große Sache. Und auch auf diesem Gerät hier, mit einem halben Gig oder ein Gigabyte RAM, 32-Bit im Vergleich zu 64 Bits, nicht so eine große Sache. Noch heute, es geht um den Weg von der Größe überwältigt des Programms selbst, die sein würde mehrere hundert Kilobyte, wenn nicht ein paar Megabyte, in diesen Tagen. So vernünftigen Bedenken, keine richtige Antwort. Aber zumindest das sind die Gedanken, die beginnen, sollten gehen Ihnen durch den Kopf? Denn in pset 0, obwohl wir eigentlich nur zu erwarten Korrektheit, oder zumindest Ablehnung diverse Bugs, dass Sie könnten auftreten, haben, wie wir vorankommen, ist Design werde ein weiterer wichtiger Aspekt sein, sowohl das Schreiben von Code und auch unsere Auswertung Code. Und so zumindest Gedanken machen, Dinge wie diese. Und nur weil etwas funktioniert, bedeutet nicht, es ist gut, bedeutet nicht, es ist gut entwickelt. Und das ist eines der Dinge, die Lehre Stipendiaten und Übungsaufgaben helfen uns zu necken Teil im Laufe der Zeit. Nun, was ist, sagen wir, diese Version hier? Lassen Sie mich etwas tun, ein wenig sexy hier in einem Augenblick. Lassen Sie mich zunächst loszuwerden dies. Und nun dieses Problem beheben grammatische Frage. So in dieser Version möchte ich die Grammatik zu fixieren, so dass anstatt nur sagen, Klammern s, wie "Flasche" oder "Flaschen" - Ich will nicht, dass Ecken abgeschnitten - Ich möchte auch dynamisch auszudrucken das Wort "Flaschen" oder "Flasche", so Mit diesen% s Platzhalter heute. Also muss ich bedingt überprüfen, was ist der Wert von i. Und wenn es 1 ist, möchte ich "Flasche" sagen, und wenn es etwas anderes, ich will "Flaschen" zu sagen. So wollen wir versuchen, dies zu tun. Also, wenn i == 1, dann lassen Sie mich gehen Sie vor und erklären - Ich brauche einen String, so lass es mich tun String s1, weil es die erste String Ich kümmere mich jetzt. Ich werde "Flasche" sagen. Und dann wollen wir mal sehen, string s2 - und ich werde erklären, wo ich in einem Moment gehe - "Flaschen." So erinnern, dass in diesem Lied haben wir in der Lage sein müssen Dinge, zwei verschiedene Wörter potenziell drucken. Also, wenn wir wieder hier schauen, bemerken, dass, wenn wir um Dieses Beispiel hier ", zwei Flaschen Bier an der Wand, zwei Flaschen Bier, nehmen Sie eine unten, Pass It Around ", ich will Diese vierte Zeile, jetzt zu sagen "eine Flasche Bier auf die Wand ". Also habe ich zu entscheiden brauchen, möchte ich sagen:" Flaschen "oder "Flasche"? Also werde ich willkürlich sagen, alles in Ordnung, Ich werde jetzt eine Variable namens s1, string ein, das geht eingesteckt hier und auch hier zu bekommen, , weil diese Worte sind immer gleich, nur weil der Natur des Songs. Und ich werde zu nennen s2, was Wort ich will schließlich erscheinen hier unten. Jetzt, buchstäblich, 99 von 100, es geht um das zu sein gleichen in diesen beiden Fällen, denn 3 ist Plural, 2 Plural, ist 4 Plural. Aber in dieser Ecke Fall, wo wir auf 2 und dann 1 oder sogar 1 und dann 0, ich brauche diese Logik. So habe ich einige Zeit in meinem Code immer dieses Recht zu verbringen. Also, wenn ich das tue, wenn i == 1, dann s1 gleich "flasche" und s2 gleich "Flaschen", weil dies für 1 sein Flasche, und dies wird für 0 Flaschen. Und das hier, was soll das darstellen? Nur um klar sein. Dies ist nur ein Kommentar. So ist die Tatsache, dass man einzeilige Kommentare haben bedeutet, dass Sie kann Ihr Code wie folgt kommentieren, aber eine weitere gemeinsame Paradigma ist auch, dass, wenn Sie einen super-kurzen Satz, dass Sie wollen sich selbst gestellt und es ist einfach besser lesbar zu setzen es richtig am Ende der Zeile Code, können Sie absolut etwas tun. Und was jetzt, wenn ich das tun? Else if i ist nicht gleich 1 ist. So Paukenschlag gleich - Ausrufezeichen wird als "bang" bekannt. So Knall = 1. Also, wenn ich nicht gleich 1 ist, was ich stattdessen tun wollen? Nun, das erste Wort will ich was? So String 1 sollte "Flaschen" für mehrere Flaschen sein, und dann wird das Plural "Flaschen" als gut, denn jetzt. Und wir werden sehen, ob dies tatsächlich bringt uns zu wohin wir gehen wollen. So wenn ich nun hier unten scrollen, bemerken, dass ich in dem Einstecken nicht nur ich, sondern s1. Ich bin in i und s1 Einstecken. Und dann hier unten, ich bin minus 1, welches das gleiche wie vorher, aber s2. In anderen Worten, ich möchte das englische Wort, basierend ändern auf dieser Logik. Nun, es ist schon einige Probleme in diesem Code. Was ist schon aus dem Tor durchbrochen hier? Yeah? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Genau. So habe ich schon verletzt die Lektion des Anwendungsbereichs. Also habe ich erklärt, S1 und S2, aber ich habe es innerhalb von getan geschweiften Klammern, was bedeutet, yeah, dieser Code funktioniert bis bis Zeile 42, aber sobald ich die Leitung 43 getroffen, erraten, was nicht mehr existiert? Nun, ich denke, was nicht mehr in diesem Bereich - weder S1 oder S2. Also müssen wir dieses Problem beheben. Also lassen Sie mich löschen Erklärungen. Und ich lasse die Variablennamen und löschen diese hier und löschen Sie diese hier ein. Und in welchem ​​Leitungen sollte ich wirklich erklären, diese Dinge? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Yeah, also wahrscheinlich hier oben, 33-ish. So String s1 und dann String s2. Und es stellt sich heraus, kann ich dies tun. Wenn Sie deklarieren zwei Variablen des gleichen Typs, Sie können eigentlich nur ein Komma und das tun in C. Alle rechts, so jetzt habe ich zwei Variablen - S1 und S2. Ich Zuweisung ihnen Werte in diesen Bedingungen hier oder hier. Und dann bin ich mit ihnen unten. Wie gut ist das jetzt zur Arbeit gehen? Nun, es ist immer noch ein wenig buggy, aber wir wenigstens sehen wie weit wir gekommen. Also lassen Sie mich voran gehen und beer3. Ist das beer3? Yep, das ist beer3. Und jetzt lassen Sie mich gehen Sie vor und führen Sie beer3. 399 99. Wir können wahrscheinlich überspringen meisten von ihnen. Und hier unten, schau dir das an. "Eine Flasche Bier an der Wand, eine Flasche Bier, nehmen ein nach unten, Pass It Around, 0 Flaschen Bier an der Wand. " Aber ich Ihre Aufmerksamkeit auf nur die Hälfte der Lösung. Art von hier oben geschraubt. So scheint es, dass die Ecke Fällen, wenn i gleich ergeben, was zwei Werte? PUBLIKUM: 2, 1. DAVID J. MALAN: 2 und 1 liegt. Es ist nicht 1 und nicht 1. Es ist wirklich nur die letzten beiden Strophen dieses Liedes. Also, was kann ich statt möchten Sie tun? So scheine ich fing den Fall gewesen, wo, wenn i == 1 ist, dann das erste Wort ist "flasche", aber das zweite Wort ist "Flaschen". Aber hier, ich möchte dies ändern, um == 2 sein. Und wenn dies der Fall ist, was ich will die erste Wort sein? Publikum: "Bottles". DAVID J. MALAN: "Bottles", so für zwei Flaschen. Und dann dieses Wort hier sein sollte - Publikum: "Bottle". DAVID J. MALAN: "Bottle", Singular. Alles klar, lasst uns zu verkleinern, gehen Sie zurück hierher, re-make ausführe, re-run beer3, Typ 99 wieder. Okay, "Segmentation fault (core dumped)." Was habe ich falsch gemacht? PUBLIKUM: Sie haben noch einen Wert [unverständlich]. DAVID J. MALAN: Ah, ausgezeichneter Ausgangspunkt. Alles klar, so was ist hier falsch? So Segmentation Fault, und wir sind eigentlich los, um zu sehen dies schon ein paar Mal in der Zukunft bewusst. Aber jetzt, was bedeutet das eigentlich? Eine Segmentation Fault fast immer bedeutet, dass Sie irgendwie versucht, Speicher, RAM in Ihrem Computer zuzugreifen, dass Sie nicht selbst, dass Sie nicht wirklich fragte der Betriebssystem für. Also in diesem Fall, bemerken, was ich getan habe, das ist fehlerhaft in meiner Logik. Ich habe S1 und S2 ein Wert zugewiesen, wenn i gleich 1 ist. Ich habe auch getan, wenn ich 2 gleich. Aber ich habe es nicht in der unendlichen Reihe von anderen getan Möglichkeiten - insbesondere 3 oder 4 oder Punkt, Punkt, Punkt, 99. So ein Update für dieses konnte nur lasst uns haben einen anderen Zustand. Und lassen Sie mich hier hingehen und sagen s1 entspricht - was sollte es hier sein? PUBLIKUM: [unverständlich]. DAVID J. MALAN: "Bottles", denn in den üblichen Fall, es ist nur die gleiche Sache. So entspricht Zitat unquote "Flaschen." So für mehrere Flaschen und dann hier für mehrere Flaschen. Okay, jetzt lassen Sie mich zurück zu meinem Terminal-Fenster, recompile, re-starten Sie es. 99. Puh. Und lassen Sie uns tun, eine schnelle Plausibilitätsprüfung. Technisch wären wir wollen alle diese zu lesen, um sicherzustellen, dass sie sind richtig, aber wir betrachten zumindest die bekannten Täter. 3 Flaschen, 2 Flaschen, 2 Flaschen, 1 Flasche, 1 Flasche, 0 Flaschen. Wir scheinen zumindest behoben haben es für jetzt. Aber der Haken dabei ist, dass das, was ein Gott schreckliches Durcheinander ist nur zu lösen eine dumme ein Zeichen grammatische Details. Es gibt also eine Art Grund, dass ich geschnitten diese Ecke früher, weil es einfach völlig nervig müssen schreibe diesen viel Code. Aber es stellt sich heraus, dass es etwas eleganter Wege Ausdruck der genau dasselbe. Und wir können dies wie folgt tun. Lassen Sie mich lassen Sie dieses auf dem Bildschirm für einen Moment und einzuführen etwas bekannt als ternäre Operator. Dies ist eine Art One-Liner, der meinte nur ist, um unsere lebt ein wenig sexier, wie versprochen. Und ich werde tun dies wie folgt. Gib mir einen String namens s1, und lassen Sie mich zuweisen wie folgt. (I == 1)? "Flasche", ansonsten "Flaschen". String s2 erhält (i == 2)? "Flasche", ansonsten "Flaschen". Also, was ist dann der Unterschied? Diese beiden Zeilen Code, argumentiere ich, kann ersetzen Sie diesen ganzen Schlamassel. So nenne ich es ein Chaos, nur weil es eine Art reibt mir die falsche Weg, dass es so viele Zeilen Code ist. Nicht falsch. Es ist nicht schlechtes Design. Möchten, ist dies vollkommen richtig und völlig in Ordnung. Aber Codierung erhält langweilig, wenn du dich so auszudrücken verdammt gezielt wieder und wieder und wieder mit einer einfachen Szenario wie diesem. So C hat einige Shortcuts, wie diese. So dies im Wesentlichen sagt erklären, einen String namens s1 und weisen sie entweder diesen Wert oder der Wert, wenn i == ist - sorry, sollte ich dies deutlicher zu sagen. Deklarieren Sie eine Variable s1, weisen Sie diesen Wert, wenn das wahr ist. Ansonsten weisen Sie diesen Wert. Also mit anderen Worten, ist diese Art von einer einzeiligen Weg sagen, wenn sonst aber dabei eine Zuordnung auf dem Weg. Also, wenn i 1 ist, dann gehen Sie vor und nennen das "Flasche". Und dann ist dies anders, nennen es "Flaschen". Unterdessen, s2, das zweite Wort, dass wir definieren müssen, wenn i gleich 2 ist, schreiben wir S2 auf "Flasche". Andernfalls setzen Sie ihn auf "Flaschen". Und was Das bedeutet jetzt ist, kann ich durch diese gehen und löschen Sie alle diese Zeilen Code. Und wenn ich sage, etwas lächerlich, dass dies jetzt sexier, es ist sexier in der Art von Stilgefühl. Die Tatsache, dass funktionell, dieser Code tatsächlich zu tun genau dasselbe. Und auch wenn es vielleicht ein wenig kryptisch auf den ersten Blick Blick, denn wir haben nicht dieses Konstrukt gesehen, würde ich argumentieren, dass es letztendlich würde so viel mehr sein lesbar und so viel einfacher für uns Menschen zu sortieren der zu verstehen, denn jetzt kann man einfach lesen Sie die Code alle auf einer Linie. Es ist immer noch im Geiste ein, wenn, wo dieser ist die Zustand und dann ist was drin ist der, wenn, und dies ist, was im Inneren des anderen. Aber wir können dies nur wesentlich eleganter machen. Und wenn ich jetzt zurück zu meinem Terminal, nachdem alle gelöschten dieser Zeilen und ersetzte sie mit nur diesen beiden, recompile, re-run Flaschen Bier mit 99, Ankündigung, dass mein Grammatik ist in der Tat noch richtig. Also noch einmal, etwas zu beginnen. 2 Flaschen Bier, 1 Flasche Bier. Sieht richtig. Yeah. So, da haben wir eine viel prägnante Lösung. So auch dieses, wie Sie sich wohler mit C, nicht unbedingt mit dem ersten pset oder sogar Sekunden, aber erkennen, dass diese Konstrukte können uns erlauben, die Dinge jemals tun mehr elegant. Jetzt machen wir eine andere Sache hier. Lassen Sie mich gehen Sie vor und eröffnen return1.c. Jetzt beginnen wir ein anderes Problem in einer Weise, dass zu lösen ermöglicht es uns, komplexere Code zu schreiben. Also hier ist ein einfaches kleines Programm, dessen Zweck im Leben ist, um Werte zu inkrementieren. Und tatsächlich, lassen Sie uns einen Schritt zurück. Lassen Sie mich dies manuell tun. Lass es mich tun sind und int main (void). Und lassen Sie mich nennen diese increment.c. Und was will ich tun? Ich werde weitermachen und so etwas sagen wie - nennen wir die Zahlen gleich - int x. So int x erhält 2; printf x ist% d, neue Zeile, x. Also ich tippe schnell, aber irgendwie vertraute Dinge jetzt. Dann werde ich x + + zu tun. Dann werde ich die gleiche Satz noch einmal zu drucken. Und dann werde ich auf 0 zurück, nur um das Programm zu beenden. Alles klar, so ist dies ein Programm, das Inkremente eine Zahl ist. Es ist zuerst zu etwas zu 2 zu initialisieren, und dann ist es werde es erhöhen und erneut ausdrucken. So lasst uns laufen Inkrement, unglaublich einfaches Programm. Aber jetzt nehme an, dass ich cube den Wert wollen, dies zu tun etwas willkürlich. Und ich wirklich tun möchte, x erhält den Würfel von ihm. So konnte ich nutzen, was die pow-Funktion aufgerufen, aber ich weiß nicht wirklich wissen, wo das ist leer. Also werde ich dies zu tun auf die altmodische Art und Weise. x mal dies entspricht x mal x mal x. Also ich bin Cubing den Wert, multipliziert sie von selbst wieder und wieder und wieder, so dass wir die Macht von 3 in diesem Fall. So, jetzt die Zahlen, die ich drucken soll sein sollte, wie wir sehen, hier - machen Schrittweite, so ist es eigentlich nicht wirklich erhöhen mehr, aber wir werden den Namen allein zu lassen - 2 und dann 8. Jetzt haben wir die Anfänge der Möglichkeit zur Verfeinerung Hier, wobei diese Cubing Ding Multiplizieren eines Anzahl selbst für sich selbst fühlt, wie diese könnte nur sein, nützlich als eine Funktion haben, so wie jemand beschlossen Jahren - Sie wissen, eine Art nützlich, wenn einer von uns setzt sich und schreibt printf so daß der Rest der Welt benutzt werden kann, warum gehen wir nicht hinsetzen und schreiben eine Funktion namens cube das tut dieses Cubing für uns, so dass wir nicht mehr manuell Umsetzung der Begriff der Cubing Werte hier? So ein einfaches Beispiel, aber wir gehen Sie vor und nutzen dies als Gelegenheit, unsere eigene Funktion zu schreiben. So bisher haben wir nur die wichtigsten, verwendet und die wir verwendet haben andere Menschen funktioniert, aber wir haben nicht unsere eigene geschrieben. So here we go. Ich werde weitermachen und schreibe eine Funktion namens cube. Und ich bin zu haben, dauert eine Eingabe. So seine Eingabe wird ein Integer sein. Und wie ist es jetzt tun? Es wird int Ausgang erklären = Eingang eingegebene Zeit Mal-Eingang. Und dann geht es los, um diesen Ausgang zurück. Und dann habe ich um genau zu sein jetzt. Diese Funktion wird einen int zurück. Also hier ist dann, wie würden Sie Ihre eigenen Funktionen schreiben. Sie zunächst entscheiden, was ist der Name Ihres Funktion sein wird. Und im Allgemeinen, ist etwas erläuternden gut, also werde ich nennen es Würfels. Dann müssen Sie angeben, was es wird zurückkehren, ist das, was sein Ausgang sein wird. Und wir haben nicht so viele Möglichkeiten noch. Int, char, float, bool, string. Denn jetzt, ich werde mit einem int bleiben, weil ich es will um eine ganze Zahl zurück. Dann müssen Sie angeben, welche ihre Eingaben, wenn überhaupt, sind. Und wenn cube ein Argument nimmt etwas zwischen Klammern, haben Sie zu geben, dass Argument einen Namen, so dass Sie nennen es etwas, wie Sie durchführen oder Sie schreiben diese Funktion, und Sie haben, um ihm eine Art, die in diesem Fall sein wird int. Also kurz gesagt, ist cube eine Funktion, die einen Integer übernimmt als Eingabe und gibt eine ganze Zahl als Ausgabe. Also, was bedeutet es mit diesem Eingang zu tun? Nun, in Zeile 14, erkläre ich eine Variable namens Ausgang, und ich weisen Sie ihm den Wert, Eingang eingegebene Zeit mal Eingang. Und dann habe ich wieder ausgegeben. So wie verwende ich das dann? Was muss ich ändern, diese markierten Zeichen on line 7 zu werden, denken Sie? PUBLIKUM: [unverständlich]. DAVID J. MALAN: Yeah, so Würfel x. So x eine Variable ist, die es hält einige Wert bedeutet. Glücklicherweise ist es vom Typ integer. Und weil x ist ein int, das heißt, ich kann es, in Würfel weitergeben. Und obwohl ich das Überschreiben der Wert von x mit dem Wert von cube x, als der Fall gewesen bisher, jedes Mal, wenn haben die gleichen Zeichen und eine Zeile Code, das Zeug auf der rechten Seite ausgeführt und dann wird die zugeordnete Wert links. So die Reihenfolge der Operationen ist, wie wir hoffen. So funktioniert das? Nun, lassen Sie mich gehen hier unten. Lassen Sie mich öffne meine Terminal-Fenster. Lassen Sie mich wissen Inkrement zu machen, die Eingabetaste. "Implizite Deklaration der Funktion 'cube' ist ungültig C99. "Nebenbei bezieht C99 auf die Sprache C, wie es war definiert im Jahr 1999 war das ein Update über die Version von 1989, ein Update über die ursprüngliche ist. So das ist alles das bedeutet. Also, was bedeutet es, dass "implizite Deklaration der Funktion 'Cube' ist ungültig? "Es ist hier genau richtig. Es ist richtig, es in Zeile 12. PUBLIKUM: [unverständlich]. DAVID J. MALAN: Was ist das? PUBLIKUM: Es ist nicht vor. DAVID J. MALAN: Es ist nicht vor. Also das ist die Sache. C ist eine Art von dumm, oder C-Compiler sind irgendwie dumm. Sie haben wirklich nur tun, was man von ihnen erzählen. Und sie insbesondere nur lesen den Code von oben nach unten, links nach rechts. Also, wenn der Compiler, Clang, liest den Code, Linie 1, es heraus, wie dies zu tun. Oh, hier kommt main. Okay, lass mich gehen Sie vor und deklarieren Sie eine Variable x. Lassen Sie mich etwas ausdrucken. Line 7, was zum Teufel ist cube? Es ist nicht in stdio.h deklariert. Es funktioniert nicht mit C. komme ich habe keine Ahnung, was zu tun ist. Und so Clang nur bails und beendet mit dieser Fehlermeldung. So können wir das in ein paar Möglichkeiten zu beheben. Wir lehren kann Clang was cube durch Verschieben nur wo das ist Erklärung. Also habe ich ausgeschnitten und eingefügt es atop main. Jetzt erkennen, dass, nur weil Haupt nicht mehr erste, ist es noch standardmäßig ausgeführt. Main main. Es ist das Standard-Name der Funktion. Es spielt keine Rolle, wo sie in einer Datei. Aber zumindest jetzt Clang hat cube gesehen, bevor ich es zu benutzen. Also lasst uns sehen, ob Clang ist jetzt glücklicher. Machen Inkrement, kam es zu kompilieren diese Zeit. Lassen Sie mich laufen Inkrement. Und in der Tat, es scheint zu funktionieren. Jetzt können Sie kommen mit Szenarien schließlich, wo es ist nicht möglich, jede Funktion gesetzt über jede andere Funktion. Du wirst in diesem Endlosschleife in der Realität nicht weiterkommen, wo dieser Kerl will hier aber dies Mann muss da sein. Also das funktioniert nicht immer. So glücklicherweise hat C eine elegantere Lösung. Ich werde diese zurück gebracht, wo es war, nur weil ich bevorzugen, als grundsätzlich, dass Haupt immer an der Spitze, weil es ist einfach schön zu sehen, was dieses Programm hat standardmäßig. Und was ich tun werde hier wird erklärt, was heißt ein Prototyp. Ich werde wieder erkläre mich cube-Funktion, indem sie buchstäblich Kopieren und Einfügen. Eigentlich ist das nicht wörtlich. So wörtlich Kopieren und Einfügen line 15 bis oberhalb der Linie 6. Es spielt keine Rolle, welche Linie diese landet auf. Es passiert in Zeile 4 sein. Aber es muss sein müssen, bevor main. Aber den Unterschied bemerken. Linie 4 endet mit einem Semikolon, was bedeutet, hey, Clang, nimm mein Wort für sie, dass es existiert eine Funktion als Würfel, der einen int und gibt eine int. Aber ich werde nicht sagen, was es ist. Genau wissen, dass ich Sie schließlich sagen versprechen. Und in der Tat, jetzt ist es in Ordnung, dass diese nach unten ist unten. So ist dies im Allgemeinen besser, da dann an der Oberseite Ihre Datei können Sie einfach rattern, Schnellfeuer-, eine Zeile jeder, was die Namen der Funktionen sind, was ihre Eingänge sind, was ihre Ausgänge sind. Und um es noch deutlicher, Eingang bedeutet in der Regel Argument oder Parameter synonym. Output bedeutet, Rückgabewert, was bedeutet es Hand zurück zu mir. Also in diesem Fall hier hat cube an der Spitze erklärt worden, aber definiert, sonst bekannt als implementiert, an der Unterseite. So, jetzt gehen wir wieder hier und starten Sie diese. So, jetzt lass mich voran gehen und wieder zum Laufen zu bringen, erneut ausführen Inkrement. Und jetzt scheint es zu funktionieren prima. So können wir jetzt weitermachen und sich so etwas wie der Faktor Bier Beispiel in dieser vierten Version. Lassen Sie mich also nach unten scrollen hier. Und feststellen, dass ich irgendwie hat diese Lektion zu Herzen gerade jetzt. Die Tatsache, dass ich sang die gleiche Strophe wieder und immer und immer wieder das gleiche chorus line in dem Lied, fühlte wie, warum nicht ich Faktor, in eine Funktion? Und in der Tat, sollte dies eine der Motivationen sein. Neben der Tatsache, dass jemand anderes in der Welt Vielleicht möchten einen Würfel Funktion - das ist ein guter Grund, um etwas ausklammern und schreiben Sie Ihre eigene benutzerdefinierte Funktion - wenn es ein Stück Code in Ihrem Programm, das macht einfach konzeptionellen Sinn, dass Sie Art will give it a Namen - wie in diesem Fall, Chorus - dann kann man ähnlich schreiben, dass als separate Funktion. Sie müssen nicht alles in main schreiben, wenn es nur fühlt sich sauberer zu trennen und ihm einen Namen geben. Also in diesem Fall hier bemerken, dass ich einen Kommentar atop haben Diese Funktion, die gerade singt über die bestimmte Anzahl von Flaschen. Beachten Sie hier, dass ich nicht brauchen, um diese aufrufen Dinge Eingang und Ausgang. In der Tat, dieses Mal habe ich gerade angerufen meinen Input b für Flasche. Und hier bemerken, Leere schlägt was? Das Chor - PUBLIKUM: nicht zurückgeben. DAVID J. MALAN: Hat keinen Wert zurück. Und in der Tat haben Funktionen keine Werte zurück. Sie können nur etwas tun. Sie haben, was Nebenwirkungen genannt, welche in diesem Fall ist nur eine ganze Reihe von Drucken auf dem Bildschirm. So bemerken, dass dieser Code hier, ich buchstäblich nur gestohlen das vorherige Beispiel. Der einzige Unterschied besteht darin, anstelle der Verwendung von i als meinen Variable, bin ich jetzt mit b als meine Variable. So I b haben hier unten, I b haben hier unten habe ich b minus 1 hier unten. Aber der Code ist genau gleich. Aber nur, um Sie jetzt zeigen, wie wir diese verwenden, lassen Sie mich gehen voraus und tatsächlich ändern sich hierbei um ein für Schleife. for (int i = n; i> n; i -). Also habe ich, dass von unserem vorherigen Beispiel gestohlen. Bisher ist es in Zeile 37, dass ich begonnen habe singen dieses lästige Lied. Aber anstatt, ich bin gerade dabei, jetzt rufen Chor der i. Fertig. So, jetzt in jeder Iteration dieser Schleife, nenne ich diese andere Funktion, Chorus, die ich zufällig zu schreiben. Es wurde nicht von jemand anderem Jahren geschrieben. Aber Chor, inzwischen verwendet printf zu drucken Ohne diese vier Zeilen. Aber die Tatsache, dass ich rufe Chor wieder und wieder in ein Schleife bedeutet, dass ich gehe zu bekommen, ganz am Ende, die genau das gleiche Lied wie ich bisher haben. Also kurz gesagt, wenn ich jetzt zurückblicke auf mein Code, obwohl funktional dies entspricht, feststellen, dass es Ausgangspunkt, um noch besser lesbar. Ich weiß nicht genau wissen, wie GetInt umgesetzt wird. Ehrlich gesagt, ich weiß nicht, wie Chor umgesetzt wird. Aber es macht mir nichts aus. Es ist mir egal, weil ich jetzt der sortieren zu können, wie ein Mensch, lesen Diese von oben nach unten. Und weil die Funktionen nach, was sie mit dem Namen tun, ist mein Code immer lesbar. Und da unsere Programme bekommen viel komplexer - durch die Semester Ende, werden Sie schriftlich Hunderte von Zeilen Code, der in Sprachen wie PHP und JavaScript und dergleichen - Sie finden, dass es so viel einfacher, als den Überblick zu behalten der ist was du getan hast. Und wenn Sie beginnen die Zusammenarbeit mit Freunden oder Partnern oder Kollegen, werden Sie in der Lage sein, viel mehr schreiben massiven Programme ab, um diese Grundübung Bausteine. Also mit dieser sagte, warum nicht wir nennen es einen Tag? Und wir werden Sie am Mittwoch sehen. [Applaus]