[Powered by Google Translate] [Woche 2, Fortsetzung] [David J. Malan, Harvard University] [Dies ist CS50. - CS50.TV] Gut. Dies ist CS50, und das ist das Ende der Woche 2. Wenn Sie erwarten, dass um diese Zeit hungrig morgen wissen, dass wir gehen, um als eine kleine Gruppe von morgen, Donnerstag, 13.15 Uhr einberufen. Es gibt diese URL hier, wenn Sie möchten, RSVP. Die Plätze sind begrenzt, also bitte verzeihen, wenn das Formular von der Zeit, die Sie füllen Sie dieses ausgefüllt. Ein weiterer URL, obwohl, die von Interesse sein könnte, ist dies. In knapp einem Monat wird der Kurs werde zur Verfügung gestellt werden umso breiter über EDX, über die Leute auf dem Internet können zu folgen, greifen in die natürlich recht aktiv, in der Tat. Sie werde mit Diskutieren Sie das CS50 Appliance und CS50 und die meisten der verschiedenen Software-Tools, die wir bereits haben mit diesem Semester. Und eine der Initiativen, die wir gerne annehmen als ein Experiment in diesem Jahr würde ist zu sehen, wie viel Inhalte können wir übersetzen in andere Sprachen und Schriften. Also, wenn Sie vielleicht Interesse an einer Teilnahme an diesem Projekt wobei wir Deutsch Transkripte und Untertitel für den Kurs Vorlesungen bieten und Shorts und Seminare und Abschnitte und dergleichen, wenn Sie sprechen fließend oder schreiben fließend eine andere Sprache, wir würden uns freuen, Sie in diesem Projekt engagieren, wobei nehmen Sie an einem oder mehreren der Videos, deren Umsetzung in einer Sprache, die Sie wissen sehr gut. Um Ihnen einen Eindruck von der Schnittstelle, gibt es diese web-basierte Benutzeroberfläche dass wir verwenden, dass im Wesentlichen eine UI wie diese. Dies wurde mir lehren einige Halloween vor und auf der rechten Seite gibt in schwarz neben diesen Zeitstempel, Sie sehen die verschiedenen Dinge, die aus meinem Mund kam an diesem Tag, und dann unter ihm werden Sie in der Lage, in eine andere Sprache zu übersetzen Genau das Mapping zwischen, in diesem Fall ist, sagen Englisch und,, Spanisch. Also ist es eigentlich ein sehr benutzerfreundliches Tool. Sie können zurückspulen und vorspulen sehr leicht mit Tastenkombinationen. Also, wenn Sie möchten, an diesem Experiment teilzunehmen und haben Ihre Worte gesehen und gelesen von potenziell Tausende von Leute da draußen, bitte fühlen Sie sich frei zu beteiligen. Ein Wort noch zu dem Kätzchen von Montag. Damit wir eine allzu beängstigend Nachricht gesendet haben, tun Sie erkennen, dass, wie der Bürozeiten vorschlagen und als Abschnitte nahelegen, ist die Gestaltung des natürlich sehr zu haben Schüler zusammen und reden zu arbeiten durch Problem-Sets und Probleme gemeinsam, und wirklich die Linie kommt nur auf, hier sollte die Arbeit, die Sie letztendlich reichen Sie Ihre eigenen. Und so ganz ehrlich, in der Bürozeiten ist es völlig normal, es ist ganz noch erwarten, mit irgendeinem Freund neben dir zu plaudern. Wenn er oder sie wird mit einer gewissen Thema zu kämpfen und du bist wie, "Oh, na ja, lassen Sie mich Ihnen einen Einblick in einige Code-Zeile, die ich schrieb," das ist in Ordnung, das passiert, und das ist sehr viel förderlich, denke ich, mit dem Prozess des Lernens. Wo die Linie wird überschritten ist, wenn der Kopf ist eine Art gekippt hier viel zu viele Sekunden oder Minuten für diese wirklich nur gewesen eine Entsperrung Gelegenheit für Ihre Freundin, und sicherlich, wenn die Dinge zu bekommen per E-Mail und Dropbox und dergleichen ausgetauscht, auch dort ist die Linie. So mit allen Mitteln sich wohl fühlen und sich ermutigt fühlen, mit Freunden chatten und Klassenkameraden zu pset und immer nur erkennen, dass das, was Sie letztendlich einreichen sollte wirklich das Produkt deiner Schöpfung und nicht jemand anderes zu sein. Und so einer der Domain-spezifische Probleme für pset2, was kommt spät morgen Abend, ist in der Welt der Kryptographie tauchen, das ist die Kunst der Verschlüsselung oder Scrambling Informationen was letztlich bezieht sich auf die Welt der Sicherheit. Jetzt kommt Sicherheit für die meisten von uns in Form von ziemlich banalen Mechanismen. Alle von uns haben Benutzernamen und Passwörter, und wir alle haben sehr schlechte Benutzernamen und Passwörter, am wahrscheinlichsten. Wenn Sie Ihr Passwort ist das gleiche auf mehreren Websites, das ist wahrscheinlich nicht die beste Idee, Als wir in Richtung Semester Ende zu diskutieren. Kein Witz - - Wenn Sie Ihr Passwort auf einem Zettel geschrieben auf Ihrem Monitor, auch das ist nicht unbedingt die beste Design, sondern eine ganz gewöhnliche Erscheinung. Und wenn Sie sie nicht verwenden Kryptografie, um Ihre Passwörter zu verschlüsseln, sie sind besonders gefährdet. Also, wenn Sie denken, dass Sie als Super-clever einen versteckten Word-Dokument irgendwo auf Ihrer Festplatte, verfügt über alle Ihre Passwörter aber es ist in einem Ordner, niemand wird in schauen, das ist auch nicht sehr sicheren Mechanismus. Und so was pset2 einführen ist diese Kunst der Kryptographie und Scrambling Informationen, so dass Dinge wie Passwörter umso sicherer sind. Der Kontext ist hier, dass mit unsicheren Daten kommt eine Gelegenheit, es zu verschlüsseln und zu verschlüsseln ist. Und so ist dies, zum Beispiel, das ein Beispiel einer verschlüsselten Nachricht. Das sagt eigentlich etwas auf Englisch, aber es ist eindeutig nicht ganz klar. Und wir werden der Kreis heute auseinander zu necken, was diese geheime Botschaft hier ist. Aber in der realen Welt der Computer, die Dinge nicht selbst schauen, wie sie englische Phrasen sein könnte. Zum Beispiel ist es das, was Sie vielleicht auf einem Standard-Linux-oder Mac-oder UNIX-Computer zu finden in einer Datei, war einmal eine Zeit, als die Passwort-Datei. Heutzutage ist es an anderen Orten verschoben worden. Aber wenn Sie an der richtigen Stelle auf einem System anschauen, werden Sie sehen, nicht nur Ihren Benutzernamen oder dass andere Menschen auf dem System, aber du wirst eine verschlüsselte Version des Kennworts zu sehen. Tatsächlich schlägt das Wort Krypta, dass die folgenden Dinge verschlüsselt ist, und diese Reihe von scheinbar zufälligen Buchstaben und Zeichen und Zahlen und so weiter kann nur durch allgemein wissen, ein Geheimnis entschlüsselt werden - eine geheime Wort, eine geheime Zahl - und so in der Tat, um die Kunst der Kryptographie letztlich darauf irgendeiner Art vertrauen und zu wissen, dass jemand etwas anderes nicht. Also werden wir dies ein wenig genauer zu erforschen heute und in der pset zu kommen. Und nun ein Wort zu Pass / Fail. Zumal einige von euch haben in pset1 die Appliance getaucht, und eine ganz neue Welt für sich erkennen, dass Frustration und Verwirrung und nur technischen Schwierigkeiten sind recht zu erwarten, vor allem mit dem ersten pset, wo es ist einfach so viel Neues, gerade erst mit ls und cd vertraut und alle diese geheimnisvollen Befehlen und eine neue Umgebung, und das ist getrennt von der eigentlichen materiellen und Programmierung selbst. So ist es auch klar, dass es sicherlich Bürozeiten, die als Tragkonstruktion bestehen. Abschnitte beginnen am kommenden Sonntag. Aber am wichtigsten ist, wenn du fühlst nur, dass dies nicht die Welt für Sie, erkennen, dass es wirklich nur die Zeit nehmen. Und gäbe es nicht diese Gelegenheit Jahren für mich unter einer Klasse Pass / Fail, ehrlich gesagt, ich würde nie selbst gesetzt haben, einen Fuß in die Klassenzimmer. Und Sie können diese Einstellung ändern, bis, sagen wir, der fünfte Montag des Kurses, Wenn Sie also auf der Kante zeigen, erkennen, dass anstatt den Kopf in einigen anderen Gewässern überhaupt, Sie sicherlich in Betracht ziehen nur die Änderung zu Pass / Fail. Auch hier gibt es nicht wirklich diese Kultur hier in Harvard die Dinge Pass / Fail da jeder wirklich will, um zu erreichen oder overachieve, aber ehrlich gesagt, dies ist ein wunderbarer Weg, zu versuchen, etwas aus die vielleicht nicht kennen Sie, und Sie werden am Ende tut, in den meisten Fällen sehr gut, vielleicht viel zu Ihrer Überraschung. Und noch konkreter, was ich denke, Pass / Fail-Regel der Fall ist, vor allem, wie Sie vielleicht mit pset0 erlebt haben, wenn Sie legte in 10 Stunden, 15 Stunden, 25 Stunden in eine pset und du bist nur dem Kopf gegen die Wand und es wird immer Super spät in die Nacht aber du hast die pset 90% der Weg genommen und man kann einfach nicht herausfinden, eine Sache, Pass / Fail wirklich braucht die Kante aus einer Klasse wie dieser, wo man sortieren der gerne sagen: "Okay, ich weiß, es ist nicht perfekt, aber ich meinen Arsch abgearbeitet dazu, ich bin ziemlich glücklich mit, wo sie landeten, " und dass die Erwartungen für Pass treffen / scheitern. Also man im Hinterkopf behalten. Gut. So diejenigen von Ihnen, kämpfte um die Harvard University Wi-Fi verwenden können, wissen, dass es eine CS50 SSID, ein Wi-Fi-Verbindung, im Umlauf dass Sie vielleicht mehr Glück für haben. Es ist ein wenig ironisch, dass das Kennwort für diese, wenn Sie möchten, versuchen Sie, dies zu für bessere Geschwindigkeiten - und lassen Sie uns wissen, ob es nicht besser ist - ist 12345, den ganzen Weg bis zu 8 weil 8 ist sicherer als 5. Also, wenn Sie die Wi-Fi Passwort benötigen, um CS50 drahtlos hier anschließen, 12345678, und Post auf CS50 Diskutieren wenn Sie noch intermittierende Konnektivität, und wir lassen die Kräfte, die für diesen Raum werden wissen. Gut. So eine schnelle Teaser, vor allem für diejenigen von euch, die Fan Jungen oder Mädchen aller Dinge Apple sind. Was ich ausgegraben von ein paar Jahre zurück war diese Datei hier, iUnlock.c, nur um Art von Make konkreter und komplexer einige der grundlegenden C Programme, die wir geschrieben haben. So öffnete ich diese Datei iUnlock.c. Es ist auf dem Lectures Seite für heute. Auf der linken Seite sehen Sie eine lange Liste von Funktionen. So der Bursche, der dies schrieb schrieb eine Menge von Funktionen, mehr als nur main. Er verwendet eine ganze Reihe von Bibliotheken hier, und wenn wir anfangen Scrollen durch, was das eigentlich ist das allererste, glaube ich, crack für das Original-iPhone. Wenn Sie das Original-iPhone jailbreak wollte, was bedeutet, untether es von AT & T und tatsächlich installieren spezielle Software drauf und Dinge tun, die Apple nicht, dass die Leute zu tun, jemand die Zeit genommen, um herauszufinden, wie genau sie könnte Softwarefehlern zu nutzen, - iUnlock.c-Fehler, Bugs, in Apple-Software, und damit war geboren dass, wenn Sie es auf Ihrem Computer kompiliert und installiert es auf einem iPhone Das war zu Ihrem Computer über, sagen wir, ein USB-Kabel angeschlossen ist, Dies würde Ihnen Verwaltungs-oder Root-Rechte auf Ihrem iPhone und lassen Sie so ziemlich alles, was Sie wollen. Und so gibt es seit dieser faszinierenden Katz und Maus Spiel zwischen Apple und dem Rest der Welt, insbesondere da sie, wie viele andere Unternehmen, versuchen, ihre Sachen sperren, so dass Sie nur tun können, was sie wollen. Aber dank Leuten wie diesem und dem Verständnis der Low-Level-Details - und in diesem Fall C-Programmierung - und viele der bekannten Konstrukte dass wir angefangen zu spielen mit, sind Sie in der Lage, wirklich nutzen die Hardware in einer Weise sehen Sie fit und nicht unbedingt etwas Körperschaft. So zum Beispiel, ich habe keine Ahnung, was das alles tut, aber GetVersion klingt ziemlich einfach, und es sieht aus wie das ist eine Funktion, dass diese Person geschrieben hat. Es dauert eine Art von Integer als Argument, nichts zurück, scheint aber Schleife mit einer for-Schleife hier und ein, wenn die Bedingung, wenn Bedingung Pause und irgendwie bezieht sich auf Versionsnummern, wenn wir nach unten scrollen, obwohl viele dieser Schlüsselwörter gehen zu neu sein. Und es gibt eine ganze Reihe von Funktionen in hier haben wir noch nie gesehen haben und vielleicht nicht immer sehen im Laufe des Semesters. Am Ende des Tages, folgt den gleichen Regeln und Logik, dass wir mit wurden bisher spielen. Also das ist viel zu alt, um dein iPhone 3s oder 4s oder bald 5s in diesen Tagen zu knacken, aber wissen, dass es sehr viel ist von dieser Welt stammt, die wir in getaucht. Werfen wir einen Blick auf ein wenig mehr einfaches Beispiel: diese, nur um mit einigen Syntax aufwärmen und auch einige anderen Datentyp dass wir darüber gesprochen, aber noch nicht wirklich in C. gesehen Dies ist eine Datei namens positive1.c und nach den Kommentaren an der Spitze, dies nur verlangt, dass ein Benutzer eine positive Zahl bereitzustellen. Es ist also ein Beispiel für eine do-while-Schleife, das ist schön für den Benutzer interaktive Programme wo Sie dem Benutzer mitteilen müssen etwas tun, und wenn sie nicht kooperieren man sie schreien oder lehnen ihre Eingabe. Case in point: Ich werde tun, Zeilen 19 bis 24 so lange, wie der Benutzer nicht mir eine positive Zahl ist. Dieses Detail hier auf Linie 18, warum erkläre ich n über diesem ganzen Looping bauen um direkt zu Zeile 22, wo ich eigentlich egal, um n zu erhalten dagegen? Yeah. [Schüler] Scope. >> Ja, so in dieser Ausgabe von Umfang. Und in juristischer Hinsicht, was bedeutet Umfang zu beziehen? Yeah. >> [Unverständlich Student Response] >> Können Sie sprechen ein wenig lauter? [Schüler] Wo kann man diese Variable zugreifen. >> Perfect. Wo können Sie eine bestimmte Variable zugreifen. Und im Allgemeinen, die Faustregel war bisher, dass der Umfang einer Variablen wird durch die jüngsten geschweiften Klammern, dass Sie gesehen haben, definiert. Und so in diesem Fall, wenn ich den Fehler erklären n on line 22 gemacht, wäre die Linie zu arbeiten. Ich würde einen int, und ich würde es in dieser Variablen n setzen in Zeile 22, aber die Codezeile würde jetzt keine Ahnung, was ich rede? >> [Schüler] 25. [Malan] 25, und es stellt sich heraus, 24 als gut, weil es in diesem Fall außerhalb der geschweiften Klammern fällt. Also einfach ein wenig lästig, aber sehr einfach durch eine Variable deklarieren gelöst außerhalb der Funktion selber. Wir werden sehen, im Laufe des Tages können Sie einen Schritt weiter gehen und man konnte sogar noch ein wenig faul. Und dies ist nicht generell empfohlen werden, aber man könnte sogar faul und legte eine Variable global, so zu sprechen, nicht innerhalb einer Funktion, nicht innerhalb einer Schleife, aber in der Datei selbst, außerhalb aller Funktionen, die Sie geschrieben haben, wie ich es hier getan habe on line 15. Dies wird allgemein verpönt, aber weiß, das ist eine Lösung manchmal andere Probleme, Als wir schließlich sehen. So jetzt werden wir es so lassen, aber lasst uns sehen, ob wir dies umschreiben nur zu beginnen, uns auszudrücken ein wenig anders. Dieses Programm, das nur klar zu sein, ist Positive1. Lassen Sie mich gehen Sie hier und in meinem Terminal-Fenster zu machen positiv1, Enter. Kompiliert okay. Ich werde Positive1 laufen, drücken Sie Enter. Ich verlange, dass Sie mir eine positive ganze Zahl ist. Ich werde -1 sagen. Das hat nicht funktioniert. 0, 99. Das scheint zu funktionieren. Vielleicht nicht die strengste Test, aber zumindest ist es ein schönes Plausibilitätsprüfung dass wir auf dem richtigen Weg sind. So, jetzt lassen Sie mich gehen Sie vor und öffnen Version 2 dieser, und was ist anders schon? Es implementiert die gleiche Sache, aber was springt so klar diesmal anders? Diese bool grün. Es ist grün, dieses Schlüsselwort als bool, die ein Datentyp bekannt ist hervorgehoben. Es ist nicht in allen Versionen von C kommen gebaut Sie müssen eine bestimmte Bibliothek enthalten. In unserem Fall enthalten ich den CS50-Bibliothek, so dass wir Zugang zu bool haben. Aber in Zeile 18, scheinen wir einen booleschen Wert hier als dankbar sind. Ich konnte diese nichts genannt haben, aber ich nannte es dankbar nur um Art zu vermitteln einige semantische Bedeutung. So zunächst in Zeile 18, ich bin offenbar nicht dankbar weil die booleschen Wert dankbar initialisiert wird, um in Zeile 18 false. Und dann scheint es, was ich hier in den Zeilen 21 bis 23 durchgeführt ist habe ich nur irgendwie meine Logik umgeschrieben. Also keine funktionell verschiedene, aber in Zeile 22 jetzt habe ich überprüfen, ob das int der Benutzer zur Verfügung gestellt größer als 0 ist, dann habe ich einfach ändern Sie den Wert dankbar wahr. Und warum mache ich das? Da in Zeile 25, anscheinend werde ich eine Bedingung zu überprüfen. Haben diese Schleife, während dankbar ist falsch. So schlug ich dies als eine Alternative zu Version 1 weil es zumindest ein wenig mehr intuitive ist vielleicht ist es ein wenig mehr geerdet in englischer Sprache. So gehen Sie folgendermaßen vor, wenn Sie nicht dankbar sind oder während dankbar ist falsch. Und auch dieses Mal ich anscheinend egal zu erinnern, was der Benutzer eingegeben weil Ankündigung gibt es keine Variable n, also eigentlich eine kleine Notlüge gibt. Funktionell ist das Programm ein bisschen anders, wenn wir auf den Boden zu bekommen weil ich nicht daran erinnern, was n ist. Aber ich wollte hier zeigen auch, dass obwohl wir GetInt gesehen und GetString ist auf der rechten Seite von einem Gleichheitszeichen verwendet bisher so dass wir den Wert, technisch, das ist nicht unbedingt notwendig zu erinnern. Wenn Sie aus irgendeinem Grund einfach nicht kümmern, um den Wert zu speichern, Sie wollen einfach nur, um den Wert zu überprüfen, feststellen, dass wir einfach schreiben dies als GetInt, offenen paren, in der Nähe paren. Diese Funktion wird ein Wert zurückgegeben, wie wir gesagt haben. Es wird Ihnen wieder ein int. Und so, wenn Sie geistig glaube, dass dies geschieht, wenn ich in 99 eingeben, gibt GetInt die Zahl 99, und so konzeptuell, ist es, als ob mein Code tatsächlich waren diese. Also, wenn 99 der Tat größer als 0 ist, dann dankbar wahr wird, dann die Linie 25 ooh klar, wir sind fertig, weil ich jetzt dankbar bin, und in Zeile 26, sagen wir einfach, "Danke für die positive ganze Zahl!" was es zu sein passiert. Jetzt lasst uns leichter syntaktischer Zucker hier, so zu sprechen. Mal sehen, ob wir reinigen können diese Zeile 25 mit diesem dritten und letzten Variante positive3. Beachten Sie die einzige Unterschied ist jetzt, was Codezeile? >> [Schüler] 25. >> [Malan] Yeah, 25. Und wir haben nicht wirklich diesen Trick nur noch nicht gesehen, aber wir haben das Ausrufezeichen am Montag zu sehen, was bedeutet was? >> [Schüler] nicht. >> Nicht oder Negation. So nehmen Sie einen booleschen Wert und drehen ihren Wert. Wahr wird falsch, falsch wird wahr. Also das würde ich vorschlagen, ist sogar ein wenig mehr intuitive eine Möglichkeit den Code zu schreiben weil ich zu initialisieren noch dankbar falsch, habe ich immer noch die folgenden, Ich dankbar wahr, wenn die Zeit kommt, aber jetzt kann man wirklich nur übersetzen diesen Code mündlich links nach rechts, while (dankbar!), weil Knall oder Ausrufezeichen bedeutet der Begriff nicht, so zwar nicht dankbar. Also noch einmal, haben wir keine neuen Konzepte per se eingeführt. Wir sprachen über Booleans zurück, wenn wir mit Scratch gespielt, aber erkennen, jetzt können wir nur mit dem Schreiben beginnen unseren Code auf viele verschiedene Weisen. So vor allem in pset1 wenn du Art zu kämpfen, um herauszufinden, die Art und Weise, damit ein Programm zu schreiben, Chancen sind, haben Sie Glück, weil es eine Reihe von Lösungen sein kann Sie können auf passieren. Zum Beispiel ist dies nur 3 selbst für die einfachsten von Programmen. Gut. Und nun erinnern am Montag haben wir auf dieser Note nach links mit Rückgabewerten. So zum ersten Mal, dass wir ein Programm geschrieben, das nicht nur über main; es hat auch seine eigene Funktion, die ich hier geschrieben habe. So in Zeile 31 bis 34 habe ich einen Würfel implementiert. Es ist nicht komplex. Es ist nur eine * a * a in diesem Fall. Aber was ist wichtig daran ist, dass ich unter Input in Form eines und bin zurückkehrt Ausgabe in Form von a * a * a. So jetzt habe ich die Möglichkeit, ähnlich wie ich früher mit prinf allein, diese Funktion durch Aufruf des Würfels Funktion aufrufen. Und der Würfel-Funktion nimmt eine Eingabe, und der Würfel-Funktion liefert eine Ausgabe. Im Gegensatz dazu printf gerade etwas. Es kam nicht wieder alles, was wir über betreut, obwohl als neben ihm einen Wert zurückkehrt; Sie nur in der Regel ignorieren. Printf gerade etwas. Es hatte eine Nebenwirkung von Drucken auf dem Bildschirm. Im Gegensatz hier haben wir den Würfel-Funktion, die gibt tatsächlich etwas. Also für diejenigen, die mit diesem, ist es eine ziemlich einfache Idee. Aber für die weniger vertraut mit dieser Idee der Übergabe an den Eingängen und immer wieder Ausgänge, Lassen Sie uns versuchen, nur etwas super einfach. Ist jemand komfortable kommen auf die Bühne kurz auf? Sie müssen bequem sein mit einer Kamera auf Sie als gut. Yeah? Okay. Wie ist dein Name? >> [Schüler] Ken. >> Ken. Gut. Ken, auf bis zu kommen. Ken wird eine Funktion der möglichen hier sein. Lasst uns weitermachen und tun. Lassen Sie uns ein wenig Phantasie. Schön, Sie kennen zu lernen. Willkommen in den Mittelpunkt. Gut. Lassen Sie uns treffen diese Taste hier. Gut. So hier haben Sie eine moderne Tafel, und was ich bin, ist die wichtigste Funktion, zum Beispiel, und ich habe nicht ein iPad in der Hand. Ich weiß nicht wirklich erinnern, wie man - Nun, ich kann das nicht sagen. Ich habe nicht wirklich eine gute Handschrift, und so deshalb möchte ich Sie etwas auf dem Bildschirm für mich zu drucken. Ich bin da das Hauptprogramm, und ich bin zu haben, Sie sagen, das indem es in meinem Chicken Scratch und dann Leiten Sie einen Eingang. So dumm, obwohl diese Übung ist, die Vorstellung der Funktionen und Aufruf einer Funktion und wieder eine Funktion wirklich darauf an, dies. Ich bin Haupt, ich habe gerade printf, quote-unquote etwas auf dem Bildschirm geschrieben, Ich verwende dieses Programm, und sobald printf aufgerufen wird, es dauert ein Argument oder ein Parameter manchmal zwischen Anführungszeichen. Hier ist das Argument. Ich bin der Übergabe an Ken. Er ist ein schwarzer Kasten geschrieben gewisse Anzahl von Jahren dass offenbar nur weiß, wie die Dinge auf dem Bildschirm auszugeben. So auszuführen. Das ist nicht schlecht. Sehr gut. So, jetzt Ken getan wird ausgeführt. Braucht er zur Hand mir nichts zurück? Nicht, dass wir bisher gesehen. Wieder ist printf tatsächlich wieder an, doch werden wir, dass für jetzt ignorieren denn wir haben es nie benutzt. Also das ist es für Ken. Und nun wichtigsten übernimmt die Kontrolle über das Programm erneut weil diese Codezeile, printf, erfolgt die Ausführung. Und wir unseren Weg gehen, der Ausführung, was andere Leitungen vorhanden sind. So, jetzt wollen wir versuchen eine etwas andere Beispiel. Dieses Mal hier wollen wir zunächst den Bildschirm, und dieses Mal werden wir die Cubing Funktion zu tun, aber diesmal erwarte ich einen Ausgangswert. Also lasst uns weitermachen und tun. Jetzt habe ich eine Zeile Code, x erhält Würfel x sagt. Die Codezeile, Rückruf, sieht wie folgt aus: x = cube (x); Also, wie ist das funktionieren? Fahren wir fort und geben Ihnen einen weißen Bildschirm wieder. Ich werde zu notieren nun den Wert von x, die zu diesem Zeitpunkt geschieht, zu sein, sagen wir, 2 es einfach zu halten. Ich habe auf ein Stück Papier den Wert von 2, die meinen Wert x geschrieben. Ich gebe es zu Ken. >> Und ich schreibe die Antwort? >> Ja, lasst uns einfach schreiben Sie die Antwort. Okay. Und jetzt hat er wieder mir etwas. Perfect. Nizza segue. So, jetzt reicht er mir den Wert von 8 in diesem Fall, und was muss ich tun? Eigentlich - mal sehen, erhalten dieses Recht. Was soll ich damit zu tun? Jetzt werde ich diesen Wert zu nehmen und tatsächlich lagern Sie es in den gleichen Bits im Speicher. Aber ich merke, bin ein bisschen kämpfen hier. Ich bin ein wenig verwirrt, weil, wo ich schreibe eigentlich den Wert von x, denn was ich gerade getan haben ist physisch Hand Ken ein Stück Papier, das den Wert 2 hat, das war x, und in der Tat, das ist genau das, was passiert ist. So stellt sich heraus, dass, wenn Sie die Funktion aufrufen und Sie in ein Argument übergeben wie hallo, Welt oder übergeben Sie in einem Argument wie 2, in der Regel sind Sie in einer Kopie dieses Argument vorbei. Und so wie ich schrieb mir die Nummer 2 hier und reichte es Ken, das muss bedeuten, dass ich noch eine Kopie des Wertes 2 irgendwo weil ja, jetzt, wo ich wieder den Wert 8 bekommen, muss ich zurück in RAM und tatsächlich aufzuschreiben 8, wo ich einst die Nummer 2. So visuell, erinnere mich an diese Vorstellung vorbei in buchstäblich eine Kopie des Wertes. Ken macht seine Sache, reicht mir wieder etwas - in diesem Fall einen Wert wie 8 - und dann habe ich etwas mit diesem Wert tun, wenn ich davon rund wollen. So wird das alles kommen zurück, um allzu vertraut, bevor lang. Vielen Dank für diese Demo hier, Ken. [Applaus] Sehr gut gemacht. Mal sehen, wie die letztlich bezieht sich auf einige der Funktionen aufrufen, dass wir hier getan. Lassen Sie mich gehen Sie vor und bringen uns zurück zu dem Cubing Beispiel hier. Beachten Sie, dass, wenn wir wollen, tatsächlich anfangen, diese weiter, wir gehen zu müssen, eingedenk der Tatsache, dass die Zahl x das ist in hier vorbei unterscheidet sich von was tatsächlich an die Funktion übergeben. Also noch einmal, ist dieser Pass durch Kopieren werde ziemlich Germane in nur einem Augenblick. Werfen wir einen Blick auf etwas, das nicht ganz stimmt noch arbeiten. Ich werde weitermachen und öffnen ein Drittel buggy Beispiel, das von Natur aus fehlerhaft ist, und es heißt buggy3 und implementiert eine Swapping-Funktion. Hier haben wir ein Hauptfunktion, die x-und y willkürlich auf 1 und 2 initialisiert sind. Wir könnten GetInt, aber wir brauchen nur eine einfache Übung, so ist es hartcodierte als 1 und 2. In den Zeilen 21 und 22, wir scheinbar auszudrucken x und y, 1 pro Zeile. Dann on line 23, behaupte ich, ich tauschen diese Werte, Punkt, Punkt, Punkt. Ich anscheinend eine Funktion in Zeile 24 genannten Swap 2 Argumente übernimmt. Es ist völlig legitim für Funktionen 2 Argumente zu nehmen. Wir haben gesehen, printf tun es bereits. So Swap anscheinend dauert x und y, und wie der Name schon vermuten lässt, Ich hoffe, dass es geht um diese 2 Werte zu tauschen. Also ich behaupte on line 25 "Vertauschte!" und ich nachdrucken x-und y- unter der Annahme, dass sie tatsächlich haben vertauscht. Aber wenn ich wirklich dieses Programm - lassen Sie mich öffnen Sie ein Terminal-Fenster, lassen Sie mich buggy3 - wie der Name schon sagt, ist dies nicht gut enden denn wenn ich Enter feststellen, dass x 1 getroffen wird, ist y 2, und trotzdem am Ende des Programms, sind sie immer noch in der Tat dasselbe. So auf der Demonstration basiert gerade jetzt mit Ken, was eigentlich los? Lassen Sie uns tauchen Sie ein in dieses Swap-Funktion. Es ist super kurz. Es ist nur ein paar Zeilen Code lang. Aber was ist das grundsätzliche Problem auf die einfache Geschichte erzählt hier mit Ken basiert? Warum ist Swap gebrochen? [Schüler] Sie werden zu einer Kopie, nicht die Variable speichert. Genau. Wir auf eine Kopie speichern, nicht die Variable selbst. In anderen Worten, Swap anscheinend dauert 2 Argumente, ein int, und es wird willkürlich als a und b, und hier oben habe ich in x und y, die jeweils 1 und 2 sind vergangen, aber ich bin nicht wörtlich vorbei in x, bin ich nicht wörtlich vorbei in y, Ich Übergeben einer Kopie von x und eine Kopie von y. Es ist fast, als ob Sie kopiert und in Swap- die Werte, die Sie wollen, dass es tatsächlich zu manipulieren. Also, wenn das der Fall ist, wenn ich das Programm Startlinie Ausführung 35 dann 36, wenn ich in die Linie 37 zu bekommen, an diesem Punkt in der Geschichte, ist das, was der Wert von a? An diesem Punkt in der Geschichte, die Leitung 37, was der Wert von a zu diesem Zeitpunkt? >> [Schüler] 1. [Malan] Es sollte nur 1 sein, nicht wahr, weil x wurde als erstes Argument übergeben, und diese Funktion einfach willkürlich ruft ihr erstes Argument ein. Ebenso ist y das zweite Argument, und es ist einfach willkürlich ruft das zweite Argument b. Diese Dichotomie ist eigentlich ziemlich einfach erklärt. Denken Sie darüber nach. Keiner von uns erfüllt die Person, die printf schrieb, so sicher, hat er oder sie keine Ahnung, was unsere Variablen 30 Jahre später gehen, um aufgerufen werden. Also muss es einen Unterschied zwischen dem, was Sie anrufen Variablen in Funktionen du schreibst sein und was Sie Variablen in Funktionen, die Sie anrufen oder Sie verwenden nennen. Also mit anderen Worten, ich habe meine Variablen x und y geschrieben, aber wenn jemand anderes die Swap-Funktion geschrieben hatte, er oder sie würde nicht wissen, was meine Variablen gehen, um aufgerufen werden, so klar, dass dies, warum Sie diese Dualität von Namen zu haben. Technisch konnte ich dies durch Zufall zu tun, aber sie würden immer noch als Kopien weitergegeben werden. Es wäre nur ein reiner Zufall sein, ästhetisch, wenn diese Person, die Swap schrieb benutzt hatte den gleichen Namen. So an diesem Punkt in der Geschichte, Zeile 37, eine 1 ist, b 2, und jetzt kann ich gehen, um sie zu tauschen. Zunächst lassen Sie mich tatsächlich tun dies viel einfacher. Ich weiß nicht, was diese 3 Zeilen Code taten. Lassen Sie mich nur dies zu tun: b = a; a = b; getan. Warum ist das gebrochene, logisch? Es ist eine Art der intuitiven Sache, nicht wahr? So a wird b und b wird ein, aber das Problem ist, dass, sobald die Leitung 37 führt, was ist der Wert von a und b? Das gleiche, 1, weil man verprügelt haben, so zu sprechen, haben Sie b geändert, um eine gleich. Also, wenn Zeile 37 ausgeführt hat, das ist toll, Sie haben jetzt 2 Kopien der Nummer 1 innerhalb dieser Funktion, so dass dann, wenn Sie sagen in Zeile 38 a = b, Sie Art verschraubt, weil Sie nur die Zuordnung sind 1 bis 1. Sie haben irgendwie verloren den Wert Sie über betreut. So in der ursprünglichen Version dieses bemerken, was ich tat. Ich stattdessen hatte eine dritte Codezeile, die wie folgt aussah. Ich erkläre eine temporäre Variable. Tmp ist eine sehr gebräuchliche Name für eine temporäre Variable, und es ist ein int weil es zu entsprechen, was ich eine Kopie machen möchten. Ich speichere Kopie einer Innenseite tmp, so einmal Zeile 37 ausgeführt wurde, der Wert von a ist - schnelle Plausibilitätsprüfung - 1, ist der Wert von b 2, und der Wert von tmp ist ebenfalls ein. So, jetzt führe ich die Leitung 38. Nachdem die Leitung 38 ausgeführt wird, erfolgt eine vom Wert b. Und b war 2, so a ist jetzt 2. So an diesem Punkt in der Geschichte, a 2 ist, b 2, und tmp 1 ist, so jetzt logischerweise können wir nur plop tmp der Wert in b und wir sind fertig. So haben wir das Problem gelöst. Leider, wenn ich dieses Programm in dieser Form, ist es eigentlich nicht tauschen keine Werte. Aber klar zu sein, warum? Ich reparierte die logische Problem aus nur einen Augenblick vor aber wieder, wenn ich dieses Programm ausführen, bleibt x und y unverändert Bis Ende der Ausführung des Programms. [Unverständlich Studenten comment] >> Wir haben nichts zurückgegeben, so dass das stimmt. Aber es stellt sich heraus, es ist ein bisschen ein Problem hier, weil so weit, das einzige, was wir in der Lage, wieder haben ist eine Sache, und das ist eine Einschränkung der C. Sie können eigentlich nur einen Wert zurückgeben, in welchem ​​Fall ich irgendwie stecken hier bin weil ich den neuen Wert von x zurückkehren konnten oder ich könnte wieder den neuen Wert von y, aber ich will beide zurück. So Rückgabe ist nicht die einfache Lösung. Aber das Problem grundlegend ist, warum? Was haben wir eigentlich vertauscht? [Schüler] a und b. >> A und b. Aber a und b sind Kopien von x und y, die wir gerade gemacht haben all diese Arbeit bedeutet, wir haben gerade 3 Minuten reden über die Swap-Funktion und alle 3 dieser Variablen und das ist großartig, vollkommen richtig isoliert, aber a und b der Anwendungsbereich nur in diesen Zeilen hier. So wie eine for-Schleife, wenn Sie erklären, eine ganze Zahl i in der for-Schleife ähnlich, wenn Sie erklären a und b innerhalb einer Funktion, die Sie geschrieben haben, sie sind nur gültig innerhalb dieser Funktion, was bedeutet, dass, sobald Swap durchgeführt wird ausgeführt und wir von Zeile 24 bis Zeile 25 gehen, haben x und y nicht an allen geändert. Sie einfach verschwendet eine Menge Zeit Swapping Kopien von Variablen. So stellt sich heraus, dass die Lösung für dieses Problem ist eigentlich nicht offensichtlich. Es ist nicht ganz ausreichend, um Werte zurückgeben, weil wir nur zurückgeben kann 1-Wert, und ich wirklich wollen, um sowohl x und y zur gleichen Zeit tauschen, so dass wir gehen zu müssen, kommen darauf zurück. Aber jetzt erkennen, dass das Problem grundlegend von der Tatsache, dass a und b Kopien abgeleitet und sie sind in ihren eigenen Anwendungsbereich. Lasst uns versuchen, diese in irgendeiner Weise zu lösen. Lassen Sie mich eigentlich blättern hierher zurück und eröffnen, sagen wir, eine vierte Variante davon, buggy4. Was ist das? Dies ist eine ähnliche, aber einfacheres Problem auf, bevor wir einen Stich an, es zu lösen suchen. Dieses Programm heißt Inkrement, und es scheint initialisiert eine x Ganzzahl 1 in Zeile 18. Ich dann zu behaupten, x 1 ist, habe ich dann Anspruch "Inkrementieren ..." Dann rufe ich Inkrement, aber dann in den Zeilen 22 und 23, behaupte ich es gewesen ist erhöht, Ich behaupte x ist nun, was es ist - 2, vermutlich - aber dieses Programm ist buggy. Was ist das Problem? Yeah. >> [Unverständlich Student Response] >> Genau. So x erklärt wurde, offensichtlich auf der Leitung 18. Das ist in geschweiften Klammern Main. So die einfache Antwort ist, dass während der x hier existiert, sie nicht in der Leitung 32 vorhanden sind, so dass dieses Programm tatsächlich nicht einmal kompilieren. Der Compiler wenn ich versuche Kompilieren dieses Codes wird schreien mich an über einige Schwarzarbeit Kennung oder etwas in diesem Sinne. In der Tat, lasst uns versuchen. Dies ist zu buggy4. Da ist es. Verwendung von nicht deklarierter Bezeichner 'x' in Zeile 32. Und tatsächlich, wir deutlicher sein heute hier, so dass diese nützlich ist Sprechzeiten und zu Hause. Beachten Sie, dass es ein wenig kryptisch geschrieben ist. Aber die Tatsache, dass Clang hat schrie uns an, sagen buggy4.c: 32:5, tatsächlich nützlich ist. Es bedeutet, dass der Fehler in Zeile 32 an Zeichenposition 5 ist. Also 1, 2, 3, 4, 5. Das ist in der Tat, wo das Problem liegt. Und auch auch immer daran Bürozeiten und zu Hause, ich bin glücklich hier. Ich habe ein Fehler. Es wird relativ einfach zu beheben. Aber wenn man einen ganzen Bildschirm voller überwältigender Fehlermeldungen wieder bewusst, dass der unterste ein vielleicht nur symptomatisch für die obersten ein. Also immer jagen Ihre Fehler von oben nach unten weil es vielleicht nur eine Daisy-Chain-Effekt das schlägt Sie haben viel mehr Probleme, als Sie tatsächlich tun. Also, wie können wir dieses Problem beheben, wenn mein Ziel ist es, x erhöhen? >> [Schüler] Machen x global. Okay, so können wir x global. Nehmen wir die Verknüpfung, die ich vorher gewarnt, aber was solls, wir brauchen nur eine schnelle Lösung, so lasst uns einfach sagen, int x hier oben. Das macht x global. So, jetzt Haupt hat Zugriff darauf und Inkrement auf ihn zugreifen, und so lassen Sie mich gehen Sie vor und übersetzen Sie dies jetzt. Machen buggy4, Enter. Scheint jetzt zu kompilieren. Laufen wir buggy4. Und es scheint zu funktionieren. Dies ist eines dieser Dinge, die tun, was ich sage, ist, nicht was ich tue, wie ich gerade getan haben hier, weil im allgemeinen, unsere Programme bekommen werden viel interessanter und viel länger als diese, und wenn Sie Ihre Lösung an die Probleme des Lebens ist gerade auf alle Variablen am Anfang der Datei, sehr schnell weiß Programme bekommen entsetzlich schwer zu verwalten. Es wird noch schwieriger, zu denken, neue Variablennamen, es wird noch schwieriger zu verstehen, was variable was tut, und so in der Regel ist dies keine gute Lösung. Also lasst uns das besser. Wir wollen nicht um eine globale Variable hier verwenden. Ich möchte x erhöhen, so könnte ich natürlich - am Ende des Tages, ist diese Art von einer dummen Geschichte, weil wir gerade tun - aber wenn ich nicht über diesen Betreiber wissen oder durfte ich nicht, um es in Haupt selbst zu ändern, Wie sonst könnte ich umsetzen Ken hier diesmal nicht zu Würfel, sondern zu erhöhen? Wie ändere ich das Ding hier? Yeah. [Schüler] Pass in x und dann wieder [unverständlich] >> Okay, gut. Also, warum nicht ich in x übergeben und dann anstatt zurückgeben, warum ich nicht einfach return x + 1. Ein paar mehr Dinge müssen hier ändern. Ich bin auf dem richtigen Weg. Was muss ich sonst noch zu optimieren? Jemand anderes. Yeah. [Unverständlich Studenten Antwort] Ich muss den Rückgabetyp der Abstufung zu verändern, weil es nicht erlischt. Void bedeutet nichts zurückgegeben wird, aber jetzt klar ist, so muss dies zu ändern - >> [Schüler] int. int konsistent zu sein mit dem, was ich eigentlich zurück. Jetzt etwas anderes ist noch buggy hier. Yeah. [Unverständlich Student Response] >> [Malan] Also habe ich x erhöhen müssen? [Unverständlich Student Response] >> [Malan] Ah, also muss ich x passieren. Also muss ich das hier tun. >> [Unverständlich Studenten comment] [Malan] So der Prototyp, ich habe dies zu ändern hier oben. Also das muss ein int zu werden, hat dies zu werden - hmm, habe ich eigentlich einen Fehler hier unten. Lassen Sie dieses Problem beheben ein erster. Was soll das eigentlich sein? Es muss ein int etwas sein. Es könnte x sein, aber ehrlich gesagt, wenn Sie anrufen, allen Ihren Variablen x starten, es geht um weniger klar, was was ist. So lasst uns einfach beliebig wählen eine andere Namenskonvention für meine Hilfsfunktionen die Funktionen ich schreibe. Wir nennen es ein, oder wir könnten es nennen - Nennen wir es die Nummer zu sein sogar noch deutlicher. So dann habe ich wieder was die Zahl plus 1 ist, und jetzt habe ich ein andere Sache verändern hier und eine andere Sache, hier oben. Was muss ich auf Linie 21 zuerst ändern? >> [Unverständlich Studenten Antwort] [Malan] Ich habe es x zuweisen. Ich kann nicht einfach anrufen Inkrement (x). Ich brauche die Antwort, indem der Wert von x auf der linken Seite erinnern. Und obwohl x ist jetzt auf der linken Seite und rechts, das ist völlig in Ordnung weil die rechte Seite zuerst ausgeführt wird dann wird in die linke Hand, was plumpste - x in diesem Fall. Und dann endlich, ist dies eine einfache Lösung jetzt. Dies sollte nur entsprechen, was ist unten, int number. So eine ganze Reihe von Änderungen für eine wirklich dumme Funktion aber Vertreter der Dinge, die wir wollen immer werde zu tun. So machen buggy4. Ich habe irgendwo geschraubt. Oh, mein Gott. Fünf Fehler in einem 6-Zeilen-Programm. Also, was ist falsch in Zeile 18 Zeichen 5? Also muss ich diese, int deklarieren. Mal sehen. Es gibt eine ganze Reihe von anderen Fehlern. Oh, mein Gott - 19, 18, 21 - aber wieder, lass uns einfach den Bildschirm, Control L hier und erneut Clang. So 5 Probleme ist eigentlich nur, dass 1. So, jetzt lasst uns laufen buggy4, Enter. Puh, hat x korrekt erhöht. Gut. Fragen, wie die Zahlen erhöhen? Yeah. [Unverständlich Studenten stellen] >> Gute Frage. Wie kommt es, dass ich nur ändern, x die Nummer und das Programm wird sofort wissen? Auch daran denken, wie diese Abstraktion. Also, wenn ich Haupt und bin Ken ist Inkrement, ehrlich gesagt, es ist mir egal, was Ken seinem iPad nennt. Es ist mir egal, was er alles, was mit seiner Implementierung dieser Funktion zu tun hat aufruft. Dies ist eine Implementierung Detail, dass ich, main, keinen zu kümmern. Und so einfach ändern konsequent im Inneren der Funktion - Anzahl hier und Nummer hier - ist alles was man braucht, so lange ich neu kompilieren. Es ist ein bisschen wie wenn man darüber nachdenkt viele von uns, die von Ihnen mit Führerschein , die haben oder wenn Sie sogar in einem Auto habe angetrieben, die meisten von uns haben keine Ahnung, wie ein Auto unter der Haube arbeitet. Und wörtlich, wenn Sie die Haube, die meisten von uns zu öffnen - mich eingeschlossen - sind nicht wirklich wissen, was wir gerade sehen, Art, wie Sie vielleicht mit Sachen wie dieses Recht jetzt fühlen. Aber wir haben nicht wirklich zu interessieren, wie das Auto funktioniert, haben wir nicht zu kümmern, was alle Stangen und Kolben und Kabel im Inneren des Autos tatsächlich tun. So etwas wie, was Sie nennen sich der Kolben spielt hier keine Rolle in diesem Fall. Gleiche Idee. Yeah. >> [Unverständlich Studenten stellen] Wenn es mehrere Verwendungen der variable xa vorhin, Sie als Programmierer, müsste sie überall zu ändern. Oder Sie könnten buchstäblich Datei, Menü und dann auf Suchen, Tauschen - so ähnlich - aber Sie gehen zu müssen, damit die Änderungen sich. Sie müssen konsequent sein. >> [Schüler] Wenn es mehrere Variablen [unverständlich] Eine bestimmte Reihenfolge wie hier, wenn dies int andere Nummer? >> [Schüler] Richtig. [Malan] Yeah. Die Reihenfolge ist wichtig, wenn Sie den Aufruf der Funktion sind. Also, wenn ich riefen Inkrement hier mit etwas Komma etwas, gibt es eine direkte Zuordnung. Die erste Variable, was es heißt, wird eine Kopie des ersten Arguments hier gemacht. Entschuldigung. Dies sollte nicht eine Klammer sein. Das zweite Argument einer Linie mit dem zweiten. So Ordnung, ja, Angelegenheiten. Gut. Entschuldigung. Ich nahm den langen Weg, um dorthin zu gelangen. Weitere Fragen? Gut. Also lasst uns sehen, ob wir nicht ein Bild malen, was ist eigentlich los hier unter der Haube, so zu sprechen. Dies ist ein Rechteck, das den Arbeitsspeicher Ihres Computers darstellen könnten. Selbst wenn Sie keine Ahnung haben, wie das Gedächtnis funktioniert oder wie RAM funktioniert, zumindest davon ausgehen, dass Sie Sträuße davon haben in diesen Tagen. Du hast Megabyte es, du hast Gigabyte davon, und wir wissen aus Woche 0, dass ein Byte genau das, was ist? >> [Schüler] 8 Bit. 8 Bit, nicht wahr? So 8 Nullen und 1. Also, wenn Ihr Computer verfügt über einen Gig RAM, 2 GB RAM in diesen Tagen, Sie haben eine Milliarde oder 2 Milliarden Byte Speicher oder grob 8 Milliarden oder 16 Milliarden Bits im Inneren des Computers. Im Gegensatz zu dem kleinen Wooly Willy Beispiel ist es nicht magnetische Partikel in der Regel nicht mehr. Zunehmend - in Laptops zumindest - es ist Solid State Drives, SSDs, die gerade haben keine beweglichen Teile. Es ist alles elektronisch. Es ist alles Strom-based. So dieses Rechtecks ​​denke nur als Vertreter der 1 oder 2 Gigabyte Speicher, die Sie haben. Es ist also ein Stück Erinnerung. Die Welt der Informatik hat Art abgeteilten Chunks Speicher zu tun verschiedene Dinge. Zum Beispiel, wenn dies Ihr Arbeitsspeicher des Computers, wie durch das Rechteck es vorgeschlagen, es stellt sich heraus, dass durch Konvention, an der Spitze des RAM, so zu sprechen, ist in der Regel eine so genannte Text-Segment. Das sind die 0 und 1, dass Sie zusammengestellt haben. Also, wenn wir unter der Haube, was a.out ist aussah, alle diese 0s und 1s, wenn Sie ein Programm ausführen, die 0 und 1 sind von Ihrer Festplatte in etwas namens RAM geladen, und im RAM sie ganz nach oben setzen. Inzwischen haben Sie andere Dinge: Initialisierung Daten deinitialisieren Daten. Diese 2 Schwaden von Speicher beziehen sich auf globale Variablen, die man nicht oft verwenden aber manchmal, wenn Sie das tun, dann landen sie dort als gut. Dann gibt es noch einige andere Sachen: Umgebungsvariablen, die wir nicht zu verbringen viel Zeit auf, dann aber 2 wichtige Dinge, die kommen wieder während des Semesters, Stack und Heap. So sind die meisten der Arbeitsspeicher Ihres Computers ist reserviert, wenn ein Programm für etwas genannt Stack und etwas namens den Haufen. Wir gehen nicht über den Haufen sprechen heute, aber wir werden über den Stapel zu sprechen. Der Stack soll zaubern die visuelle der Speisesaal Menüschalen in Mather House oder wo auch immer Sie sich gerade befinden, wo der Speisesaal Mitarbeiter reinigen sie jeden Tag, sie stapeln sich vom Boden aufwärts, und ähnlich in Erinnerung, da ist diese Idee, etwas auf einem Stapel, Putting etwas auf einem Stapel, legt etwas auf einem Stapel. Und was machen wir damit? Lasst vergrößern nur auf der unteren Hälfte des Bildes, den Arbeitsspeicher des Computers, folgendes vorzuschlagen. Es stellt sich heraus, dass, wenn Sie ein Programm wie a.out oder Hallo laufen - was das Programm ist, dass du geschrieben hast - wieder, die 0 und 1 sind von Ihrer Festplatte, die langfristige Lagerung ist geladen, bleibt dort, selbst wenn Sie den Stecker, in den Arbeitsspeicher geladen ziehen. RAM ist schneller als Festplatten - es ist kleiner als Festplatten - aber es ist, wo Programme während Sie sie sehen leben. So Doppelklick auf ein Programm auf einem Mac oder PC, ist es von der Festplatte in den Arbeitsspeicher geladen. Sobald es in den Arbeitsspeicher, die 0 und 1 unterwegs am Weg oben zu beladen, die sogenannte Text-Segment, aber dann, sobald Ihr Programm tatsächlich zu laufen beginnt, die wichtigste Funktion aufgerufen wird, und die wichtigsten, wie wir gesehen haben, hat oft lokale Variablen, und es hat ints und Streicher und Saiblinge und dergleichen. Also, wenn Ihr Programm, das Sie geschrieben haben oder das Programm, dass Sie doppelt geklickt verwendet einige Variablen innerhalb von Haupt-, sie am Ende an der Unterseite Ihres Stacks der Erinnerung, so zu sprechen. Genauer gesagt, was bedeutet das eigentlich? Dies bedeutet nur, dass, wenn wir wollten Anzahl der Bytes des RAM in Ihrem Computer, bemerken, dass dies Byte Zahl 0, dann sollte dieser Byte-Zahl 1, 2, 3, 4, 5, 6 liegen, den ganzen Weg bis zu 2 Milliarden würde den ganzen Weg bis es an der Spitze zu sein. Also mit anderen Worten, wenn wir über RAM oder Speicher sprechen von Bytes, es bedeutet nur, dass jemand entschieden hat, was auf jeden dieser Brocken von Memory-Nummer. Also, wenn Sie 32 Bits für einen int müssen oder wenn 8 Bits für ein char, wo enden sie in Erinnerung? Konzeptionell, sie am Ende nur an der Unterseite dieser Sache genannt Stack. Aber was ist interessant ist jetzt, wenn der Haupt ruft eine Funktion - nehme eine Funktion namens foo, nur ein beliebiger Name - was passiert ist, Haupt ist an der Unterseite dieses Stapels des Gedächtnisses; foo ist nun an der Spitze der wichtigsten in Speicher abgelegt. Also keine lokalen Variablen, die foo hat am Ende eine Art konzeptionell über denen in main. Wenn foo ruft eine andere Funktion aufgerufen bar, enden diese Variablen hier oben. Wenn bar fordert etwas anderes, hier, hier, hier. Also, was ist interessant über ein Programm ist, dass, wie Sie Funktionen aufrufen und als diese Funktionen aufrufen Funktionen und wie diese Funktionen aufrufen Funktionen Sie bauen diese Stapel von Funktionen im Speicher. Und nur einmal eine Funktion zurück, müssen Sie anfangen, diese Erinnerung zurück. So ist eine der einfachsten Möglichkeiten, um über genügend Arbeitsspeicher ausgeführt in einem Computerprogramm ist auf Funktionen, die nie wieder schreiben. So zum Beispiel, lasst uns so viel zeigen, mit einer absichtlich fehlerhaftes Programm. Lassen Sie mich gehen Sie vor und nicht # include, int main (void) und ich werde tun, während (2> 1), die wahrscheinlich nie auf uns zu ändern, und lassen Sie mich gehen Sie jetzt und tun printf. Eigentlich ist das sein wird visuell weniger interessant. Lassen Sie uns dies tun. Für int i = 0; i> 0 - lassen Sie uns diesen Fehler - i + +. Und lasst uns nicht printf hier. Lasst uns praktizieren, was ich predige. Lassen Sie uns hier eine Methode, void Chor, und wir int i say, und dann werde ich printf sagen - nein, lassen Sie uns dies mehr interessant. Lasst uns eigentlich nicht gedruckt überhaupt nichts. Lass uns einfach tun: Chor (i). Gut. Also das ist buggy denn warum? Ich mache dies als ich, weil das Programm nicht wirklich etwas tun Interesse gehen. Aber das ist nicht das Ziel. Das Ziel ist es, ein Programm deren Hauptfunktion das tut, was offenbar zu schreiben? Selbst aufrufen. Und tatsächlich, wir brauchen nicht die Schleife. Lasst uns einmal zu vereinfachen dies nur, um nicht aus den Augen wirklich die grundlegende Fehler zu verlieren. Haupt-Anrufe Chorus etwas Chor singen, dann habe ich etwas Dummes, und ich hatte Chorus Call chorus weil ich davon ausgegangen, jemand anderes würde es vielleicht zu implementieren, und jetzt das wird nicht noch kompilieren. Ich brauche was zu tun? Ich brauche den Prototyp erinnern. Also muss ich hier oben nichtig Chor (int i); So jetzt, wenn ich mich hier gehen - eigentlich, verwenden wir das größere Fenster. Lasst uns voran gehen und Chor. Lasst uns voran gehen und Chor. Verwendung von nicht deklarierter Bezeichner i. Oh, das war dumm. Wir brauchen nicht das Argument. Lass uns einfach tun. Ich wünschte, wir hätten auf diese Weise gestartet. Es wäre viel einfacher Programm zu schreiben. There. Jetzt gehen wir zu meinem Terminal-Fenster, führen Clang, und hier gehen wir. Das war wirklich schnell. Was ist eigentlich gerade passiert, wenn? Nun, ich will hinzufügen, die Druckzeile damit wir sehen können. Lassen Sie mich sagen printf ("Ich bin hier") - keine Variablen. Wir werden es so lassen. Lassen Sie mich erneut zu machen. Lassen Sie mich erneut Chor. Und ... komm schon. Keep going. Nebenbei, warum hat es nicht abgestürzt noch? Die Segmentation Fault passiert super schnell vor. [Unverständlich Student Response] >> Genau. So braucht es Zeit zu drucken, nicht wahr? Es dauert nur mehr Arbeit auf dem Computer-Teil. Und da ist es: Segmentation fault. So bemerken, wie schnell Programme auszuführen. Wenn Sie nicht drucken alles, super schnell. Aber wir haben noch diese Segmentation Fault, weil, was geschah? Wenn Sie darüber nachdenken, wie den Arbeitsspeicher Ihres Computers gelegt wird, dies geschieht zu sein Haupt, aber hier lasst uns einfach nennen diesen Chor, und nennen wir diesen Chor. Und jetzt, wenn ich meine Ästhetik richtig machen, wird diese gerade dabei, Chor, Chor, Chor sagen, Chor, Chor, Chor, Chor, bis zum Überdruss, und schließlich, was passieren wird? Wenn das große Bild, buchstäblich, ist das, was gerade geschieht, konzeptionell? Die Stacküberläufe der Haufen. Oder, schlimmer noch, man muss nur alles, einschließlich der Textsegment überrannt, welches die 0 und 1, die Ihr Programm vertreten. Kurz gesagt, ist dies nur super, super schlecht. Ihr Programm hat außer Kontrolle geraten. Sie verwenden viel mehr Speicher, als Sie gedacht alles wegen einer dummen Fehler in diesem Fall oder in diesem Fall ein sehr bewusst getan Funktion nennt sich. Nun, dies ist nicht alles schlecht. Funktionen, die sich selbst tatsächlich hat große Macht, wenn Sie es richtig zu verwenden. Ich habe es nicht richtig eingesetzt sind. Also das ist nicht alles schlecht, aber die Tatsache, dass ich eigentlich nie aufhören, mich selbst ist eine grundlegende Schwäche hier dieses Programms. Also, wo gehen wir mit dieser ganzen Sache? Was ist wirklich passiert? Als ich das Inkrement Funktion aufrufen, wie wir in diesen Beispielen taten, Ich habe einen Wert wie 1, dass ich gehe in. Ich gehe in eine Kopie der Nummer 1, so passiert folgendes. Lassen Sie uns in die Schrittweite beispielsweise gehen, dieser Kerl hier drüben. Hier ist, was tatsächlich passiert. Wenn ich Inkrement anrufen und ich gehe in x, bildlich, was ist hier los ist. Wenn ich den Wert 1 gespeichert hier und ich eigentlich nennen Inkrement Welches ist nun als Chor - das iPad wirft mich hier. Nennen wir dieses Inkrement, und wir wissen nicht, was das nächste Funktion sein wird. Also, was tatsächlich passiert ist hier irgendwo in main Ich habe ein Stück Speicher das ist das Speichern der Nummer 1. Wenn ich Inkrement nennen, bin ich mit einem anderen Stück Speicher, aber jetzt habe ich die Kopie des 1. Wenn ich diesen Wert erhöhen, wird dies 2, aber was dann geschieht, sobald Inkrement zurückkehrt? Dieser Speicher bekommt nur zurück an das Betriebssystem übergeben, was bedeutet, alles, was Sie getan haben, ist nichts Brauchbares. Die 1, die ursprünglich in den wichtigsten enthielt noch wirklich da ist. Also, wo gehen wir damit um? Es stellt sich heraus, dass im Speicher Sie diesen back-to-back Folge von Bytes haben dass man Sachen in gesetzt, und es stellt sich heraus, dass wir schon etwas gesehen Das beinhaltet die Dinge Rücken an Rücken an Rücken an Rücken. Was ist eine Zeichenkette Woche 1 und jetzt Woche 2? Es ist einfach eine Sammlung von Zeichen. So stellt sich heraus wie Sie können Nummern in den Speicher zu schreiben, ähnlich kannst du Zeichen im Speicher. Und wenn wir damit beginnen, Zeichen im Speicher Rücken an Rücken an Rücken an Rücken, es stellt sich heraus, dass mit einfachsten Dinge wie eine for-Schleife oder eine while-Schleife, man von links nach rechts über die Zeichen in einer Zeichenfolge iterieren und starten Sie massiert sie in verschiedene Charaktere insgesamt - a könnte b werden, könnte b c geworden - so dass letztlich, können wir einen englischen Satz, die tatsächlich Sinn macht und konvertieren jedes dieser Briefe ein zu einer Zeit, zu Fuß durch unsere Computer-Speicher von links nach rechts, um tatsächlich zu verschlüsseln. So lasst uns unsere fünf Minuten Pause hier und wenn wir zurück kommen, werden wir beginnen diesen Prozess der Scrambling Informationen. Gut. Bevor wir in eine Krypto tauchen und diese Dinge genannt Arrays Lassen Sie mich Pause für alle Fragen, weil ich, wie ich Art wirklich verwirrt fühlen einige dieser Themen. Lassen Sie uns also fix jetzt, wenn wir können. Wir haben gerade darüber gesprochen Rückgabewerte, sprachen wir über Argumente, und wir sprachen über diese Vorstellung, die wir kommen zurück, um in den kommenden Wochen, der Betrachtung Speicher als eine ganze Reihe dieser gestapelten Schalen, so zu sprechen, von unten nach oben auf, so dass jeder Boden, der auf den Stapel gelegt wird stellt eine Funktion, die derzeit nennt. Haben Sie Fragen? Lassen Sie mich eine Frage stellen hier. Lassen Sie mich vereinfachen diese zurück, was es war, bevor einige unserer früheren Q & A. Die Tatsache, dass Inkrement öffnende Klammer, int Zahl hat, geschlossen Klammern - was bedeutet int Zahl darstellen? [Schüler] Ein Argument. >> Ein Argument. Okay. Aber was ist ein Argument? [Unverständlich Student Response] >> Was ist das? >> [Schüler] Etwas, das Sie weitergeben in. Okay, so etwas, dass Sie vorbei in. Und ganz allgemein, es ist nur der Eingang. Wenn Sie schreiben eine Funktion und diese Funktion der Sinn des Lebens ist zu tun, etwas ein wenig anders, jedesmal wenn Sie es verwenden, dann besteht der einzige Weg für die wirklich passieren würde zu sein scheinen, um es mit Input versorgen so dass es etwas anderes mit diesem Eingang tun jedesmal. So müssen Sie zwei Dinge festlegen, wann eine Funktion nimmt die Eingabe. Sie müssen den Namen, die Sie an diesem Eingang geben angeben rein für Ihren eigenen Komfort, so dass Sie sich darauf beziehen in der Funktion, die Sie selbst schreiben, wie ich es hier getan habe in Zeile 32. Aber Sie müssen auch angeben, welchen Typ, weil C ist eine Programmiersprache das erfordert nur, dass, wenn Sie eine Variable wollen, um dem Computer mitzuteilen, welchen Datentyp es haben, zu einem großen Teil, so dass es weiß, wie viele Bits für diese Variable zuordnen denn es könnte 6 sein - sorry, wird es nicht 6 sein. Es kann 16 sein, es kann 8 sein, es kann 32 sein, auch 64, aber der Computer wissen muss. Nun stellt der int auf der linken Seite, was hingegen? [Unverständlich Student Response] >> Was ist das? >> [Schüler] Art der Funktion. Der Typ einer Funktion und, genauer gesagt, die Art ihrer Ausgabe. Right. Während also die Sache in Klammern stellt seine Eingabe, wenn überhaupt, die Sache auf der linken Seite stellt seinen Ausgang. Und in diesem Fall, increment anscheinend gibt einen int, und so int ist der Rückgabetyp dieser Funktion. Was bedeutet es, zurückzukehren? Buchstäblich, verwenden Sie das Schlüsselwort return und dann, wenn, was Sie kehren zurück rechts von dem Schlüsselwort eine ganze Zahl, dann ist das in der Tat im Einklang mit dem, was wir versprochen haben. Man konnte nicht etwas tun - Hallo Welt - denn das ist ein String. Offensichtlich ist es nicht ganzzahlig. Also kurz gesagt, die Belastung ist wirklich auf uns, der Programmierer, um genau zu sein , was wir zurückkehren und dann tatsächlich über die Rückkehr zu gehen. Der Kontext jetzt hier ist, dass den Arbeitsspeicher Ihres Computers ein Gigabyte, 2 Gigabyte - was - vielleicht ist es mehr ist, ist es vielleicht weniger, aber der Computer sieht es als mit unterschiedlichen Abschnitten. Irgend etwas geht da unten, geht etwas anderes dort oben, verschiedene Sachen geht in die Mitte, und heute haben wir gerade anfangen erzählt die Geschichte, aber wir kommen zurück zu dieser Zeit. Denn jetzt ist das einzige Stück der Erinnerung uns wirklich wichtig das Textsegment weil die gerade stellt die 0 und 1, dass Clang hat ausgegeben. Also, wenn Sie einen Befehl ausführen, an der Tastatur wie a.out oder doppelklicken Sie auf ein Symbol auf Mac OS oder Windows Ihr Programm von der Festplatte in den Arbeitsspeicher geladen und es ist an der Spitze der Arbeitsspeicher Ihres Computers plumpste, so zu sprechen. Inzwischen, wie Ihr Programm beginnt zu laufen und die wichtigsten aufgerufen wird im Programm, das Sie geschrieben oder das Programm Microsoft oder Apple schrieb, seine lokalen Variablen am Ende dort unten an der Unterseite Ihres Computers. Aber wenn Haupt eine andere Funktion aufruft, die selbst Variablen oder Argumente hat, landen sie darüber. Und wenn diese Funktion nennt etwas, landen sie darüber, darüber, darüber. Und nur einmal eine Funktion erfolgt die Ausführung ist der Stapel von Ablagen, so zu sprechen, beginnen, sich tiefer und tiefer. Und das ist, was dann in einer Nussschale, erklärt, warum, wenn Sie cube nennen oder Sie Inkrement nennen, sind Sie in einer Kopie des Wertes vorbei. Und was das bedeutet bildlich ist, dass Sie buchstäblich schriftlich die Nummer 1 in einem anderen Teil des Speichers, verändert, daß 1 bis 2 in dem Fall eines Inkrements oder einem 8 im Fall von Cube und dann wirft diesen Speicher auswärts sobald der Inkrement oder den Cube Funktion zurückkehrt. Frage. [Schüler] Wo werden globale Variablen gespeichert? Globale Variablen werden in dem, was derzeit als die initialisierten Daten oder initialisierte Daten gespeichert werden, Der Unterschied ist, wenn Sie eine globale Variable haben und weisen Sie ihm sofort einen Wert mit dem Gleichheitszeichen, landet es an der Spitze gibt, und wenn Sie nur sagen, int x; ohne Wert, landet es etwas niedriger RAM einfach durch Konvention. Weitere Fragen? Gut. So Dieses Bild wird wieder kommen, wie wir stärker erhalten mit dem, was wir mit dem Computer zu tun, aber für jetzt, lasst uns eine kurze Einführung in Kryptographie, eine bestimmte Art von Kryptographie, nicht lösen alle Probleme der Welt aber lösen einige von ihnen. In diesem Fall hier haben wir etwas namens secret-Key-Kryptographie. Secret-Key-Kryptographie, wie der Name schon sagt, bezieht seine Sicherheit aus einer geheim. Zum Beispiel, wenn Sie wieder zurück in die Grundschule und Sie waren auf der Durchreise ein kleines Geheimnis Liebesbrief zu dem Jungen oder Mädchen du Zerkleinerung auf, wenn Sie diesen Hinweis durch das Publikum weitergeben wollte, würden Sie wahrscheinlich nicht schreiben wie eine Notiz in Englisch oder was auch immer Ihre Muttersprache ist. Vielmehr können Sie verschlüsseln oder Sie könnten dann schicken Sie einfach eine SMS-Nachricht in diesen Tagen. Aber man könnte tatsächlich passieren sie eine Notiz über den Klassenraum. Und um dies sicher zu tun in einer Weise, dass Ihre Freunde und Lehrer weiß nicht, was du schreibst, könnte man sich mit einem relativ einfachen Algorithmus, junge, obwohl Sie vielleicht, um nur kriechen die Worte. Anstatt also das Schreiben eines könnten Sie schreiben, b, anstelle von b den Sie schreiben c, anstelle von c könnten Sie schreiben, d, und so weiter. Oder Sie könnten sich mit einem komplexeren Übersetzung Briefe an verschiedene Buchstaben. Aber der Haken ist, der Junge oder das Mädchen, dem Sie senden diese Notiz muss man wissen, etwas, das, was offensichtlich ist? >> [Schüler] Was Sie Senden. Was Ihr Geheimnis ist, wie, was ist das Mapping zwischen a und b-und c-und d's. Ist es nur die Zugabe von 1 zu jedem der Buchstaben von a nach b, b to c gehen? Ist es komplizierter als das? Also, du und dein Schwarm müssen diese geheimen Informationen haben, aber es ist eine Art catch-22 hier. Wenn dies das erste Mal, Sie senden diesen Liebesbrief durch die Klasse, wie ist das Junge oder ein Mädchen zu wissen, was das Geheimnis ist sogar? So geheimen Schlüssel crypto nicht lösen alle Probleme der Welt, und es gibt tatsächlich eine Beziehung hier, dass wir kommen zurück, um in Richtung Semester Ende. Ebenso haben die meisten von uns nicht wissen, dass jemand, der arbeitet zum Beispiel bei Amazon.com, und noch viele von uns haben wahrscheinlich Zeug bei Amazon.com gekauft, und wir haben gelernt, davon ausgehen, dass diese E-Commerce-Transaktionen sicher sind. Die URL sagt wohl https, gibt es vielleicht eine dumme kleine Schloss-Symbol irgendwo, es gibt eine Art von Kryptographie Sicherung Ihrer Kreditkarten-Informationen zwischen Ihnen und Amazon.com. Und doch, wenn der Kryptographie geht zu wissen, ein Geheimnis und doch habe ich kenne niemanden, bei Amazon und ich habe sicherlich nicht jede Art von geheimen angeordnet mit jemandem bei Amazon, wie ist mein Computer oder mein Browser dies zu tun? Es stellt sich heraus, es gibt andere Arten der Kryptographie überhaupt, dass das Problem lösen. Aber für heute, werden wir auf die einfache ein Schwerpunkt wo man im voraus zu vereinbaren, um ein Geheimnis wissen, wie +1 oder eine Zuordnung zwischen a und b der. Und das Verfahren der Kryptographie Regel handelt es sich dabei. Sie haben einige Klartext, hier auf der linken Seite dargestellt, Sie führen Sie es durch irgendeine Art von Algorithmus oder Verfahren für deren Verschlüsselung - vielleicht ist das nur ein b wird, wird b c - und dann am Ende mit chiffrierten Text. Inzwischen einmal dein Schwarm erhält dieses Geheimnis beachten Sie, er oder sie muss dann entschlüsseln durch allgemein die Umkehrung dieses Algorithmus so, um wieder den Klartext. Es gibt physische Inkarnationen dies. Zum Beispiel, ist dies ein kleines Geheimnis Decoder Ring, und dies ist ein Ring in dem Sinne, dass es zwei Zifferblättern hier. Auf dem Außenumfang dieser Sache gibt es Buchstaben A bis Z, obwohl sie sind in zufälliger Reihenfolge und auf der Innenseite, es gibt tatsächlich einige Zahlen so dass mit diesem Ring können Sie Art schalten Sie die Außenseite, aber nicht das Innere um Line-Up Zahlen mit Buchstaben. Von einem Film namens A Christmas Story, werden Sie sehen, dass kleine Ralphie war so eifrig, um herauszufinden, was Little Orphan Annie geheime Nachricht an ihn war Das war mitgeteilt worden, glaube ich, in der Form von numerischen Nachrichten auf einem Cornflakes-Packung und man musste all die kleinen Karten, die in der Cornflakes-Packung kam ansammeln, Sie hatten, sie zu versenden in, musste man wieder das Geheimnis Decoder Ring so dass Sie endlich herausfinden, was die Zuordnung zwischen Buchstaben und Zahlen oder Buchstaben und Buchstaben. Wie in einem Computer können wir über die Implementierung oder vertreten Dinge wie diese gehen? Wir brauchen einen Weg, uns auszudrücken ein wenig mehr flexibel als unsere Variablen bisher erlaubt haben. Wir hatten ints, wir hatten chars, wir hatten die Schwimmer und Doppelzimmer und ein paar andere, aber das sind einzelne Stücke der Erinnerung, die nicht wirklich erlauben uns, Dinge auszudrücken wie Wörter und Sätze und Phrasen. In der Tat haben wir solche Dinge Strings genannt, aber wir versprechen, dass dies wirklich nur eine Vereinfachung der CS50-Bibliothek dass wir zu schälen Absicht zurück. Und so beginnen wir, dass hier tun. Lassen Sie mich gehen Sie vor und öffnen einer Datei - alle diese Dateien zur Verfügung stehen, wie gewohnt, online - sogenannte array.c ein Problem nicht mit Saiten zu lösen, sondern dass ein Bild malt hier wie könnten wir so etwas als ein Array. Ein Array ist ein Datentyp. Es ist eine Art von variablen der Art, dass mehrere kleinere Datentypen innerhalb der IT hat Rücken an Rücken an Rücken an Rücken. So zum Beispiel, wenn wir wollten ein kleines Programm, das Ihnen Ihr Quiz durchschnittliche schreiben für einen Kurs wie 50, 2 Quiz hat, man konnte sehr leicht zu schreiben dieses Programm auch auf einige der letzten Woche Materials mit GetInt und ein paar Variablen: int quiz1, int quiz2. Und es ist ziemlich einfach. Es ist vielleicht 10, 20 Zeilen Code max, ein Programm zu implementieren , die den Benutzer für 2 Quiz Partituren fragt und berechnet dann ihre durchschnittliche indem sie zusammen, Dividieren durch zwei und dann Drucken der Ergebnisse. Wir könnten wahrscheinlich tun ziemlich leicht jetzt nach einer bestimmten Anzahl von Minuten. Aber das Problem ist wohl die, dass 50 3 Quiz oder 4 hatte. Angenommen, Sie möchten das gleiche Programm für eine Klasse, die sich wöchentlich musste Quiz verwenden wollte. Denken Sie über eine Klasse, die wöchentliche Quiz hat. Wenn es 16 oder so Woche in einem Semester, jetzt haben Sie 16 Variablen: int quiz1, int quiz2, int quiz3, int quiz4. Sobald Sie sehen, diese Redundanz zu starten, kopieren Sie diese und Einfügen von Code, es sollte beginnen, machen Sie wünschte, es gäbe einen besseren Weg. Und glücklicherweise, denn von Arrays ist. Also lasst uns dies tun. Zunächst lassen Sie mich Ihnen eine sehr einfache Sache, dass wir nicht verwendet so weit, aber du wirst es gelegentlich sehen im Code. Dies ist, was allgemein als eine Konstante. Also ist es eine Konstante in dem Sinne, dass dieser Wert sich nie ändert. Der menschliche Konvention, wenn damit eine konstante ist es, alle Großbuchstaben einfach so, dass es wirklich steht in Ihrem Code verwenden, und das spezielle Schlüsselwort, die Sie in C # definieren. Also sagen wir # define, dann ein Leerzeichen, dann das Wort, das Sie für den Namen der Konstanten verwenden und dann wird der Wert der Konstante. Achtung: Dies ist anders als das Zuordnen zu einer Variablen. Es gibt keine Gleichheitszeichen, es gibt kein Semikolon. Dies ist, was allgemein als Präprozessordirektive bekannt, sondern mehr auf, dass eine andere Zeit. Denn jetzt, schafft dies einen unveränderlichen Wert namens QUIZ deren tatsächlichen numerischen Wert 2 ist. So überall zu sehen Quiz, Quiz, Quizfragen über diese Datei das ist nur die Nummer 2. Wenn ich an Haupt jetzt aussehen, mal sehen, wie das funktioniert. Zunächst sieht es ein wenig kryptisch, aber es ist alles Zeug aus Woche 1. Bitten Sie den Benutzer für die Klassen. Wie machen wir das? In Zeile 22 - das ist wirklich der saftigen Teil - Ich erkläre einen Schwimmer aber nicht nur ein einzelner Schwimmer. Ich erkläre, sondern ein Array von Gleitkommazahlen. Diese Variable wird als Noten, da hier implizierte, aber das einzige Stück neue Syntax dann sind diese eckigen Klammern. Die Tatsache, dass ich gesagt habe, float Noten und dann Klammer und dann eine Nummer - feststellen, ob dies eine Konstante ist, so wie wir taten dies - dies bedeutet, "Hey Computer, gib mir 2 Schwimmern und lassen gemeinsam nennen sie Noten." Dies steht im Gegensatz zu einem viel langwieriger Prozess wie folgt: float grade1; grade2 schweben, und so weiter. So ein Array ermöglicht es uns, diese Idee umzusetzen, aber viel weniger messily, in einer solchen Weise, dass wir 1 Zeile Code anstatt eine, sagen wir, 16 für eine 16-wöchige Semester. Ich wollte nicht zu hart-Code 2, denn wenn Sie denken jetzt darüber logisch, nehme nächstes Jahr CS50 Änderungen 3 Quiz statt und ich die Nummer 2 hier hatte, hatte ich die Nummer 2 hier Ich hatte die Nummer 2 hier die Nummer 2 hier. Es wird sehr mühsam und sehr einfach zu vermasseln und versehentlich zu ändern Wert 1 bis 3 und vermisse einen anderen Wert von 2. Also ich bin, anstatt abstrakte gehen diese weg und verwenden Sie diese Konstante, dass wie der Name schon vermuten lässt, ändert sich nie. Und jetzt egal, ob wir anders haben Tests in diesem oder nächsten, Ich muss es nur an einer Stelle ändern hier an der Spitze. So das ist alles eine Konstante ist. Inzwischen ist die neue konzeptionelle Merkmal, dass eines Arrays. So die eckigen Klammern geben mir so viele Schwimmer und lässt mich zusammenfassend nennen Noten hier. So, jetzt wollen wir mal sehen, was ich tun werde. Hier in der Leitung 24 ist der Anfang einer for-Schleife. Das ist wirklich nichts Besonderes. Es ist nur mit QUIZZES anstelle eines hartcodierte Nummer. Aber es gibt nichts intellektuell dort anders aus der vergangenen Woche. Dies ist nur printf, so printf ("Quiz #% d von% d:") weil ich einfach ausdrucken möchten mir quiz number 1 von 2 und dann 2 von 2. Das ist also eine rein ästhetische Sache. Aber der interessante Teil ist jetzt in Zeile 27. Um in einer der zwei Platzhalter mit einem Gleitkommawert füllen, Sie wieder in eckige Klammern. In diesem Fall bin ich mit i, weil diese for-Schleife mit i gleich welchen Wert begonnen hat, offenbar? [Student] 0. >> [Malan] 0. So bei der ersten Iteration dieser Schleife ist es, als ob ich dies schrieb im Code aber auf der zweiten Iteration dieser Schleife ist es, als ob ich dies schrieb in meinem Code. Aber die Tatsache, dass ich mit einer Variablen ist perfekt, weil, wie der Name schon vermuten lässt, es variiert der Wert bei jeder Iteration, so bin ich Ausfüllen dieses Array einer Stelle zu einer Zeit. Was bedeutet das Array aussehen? Der Grund warum ich zog die super einfache Rechteck auf dem Bildschirm hier vorher war aus diesem Grund. Ein Array ist nur ein Stück Speicher von einem anderen Stück Speicher gefolgt gefolgt von einem weiteren Block arbeiten und so weiter. Also, wenn meine Array der Größe 2 ist in diesem Fall hier, alles, was ich tun würde, indem in my quiz Partituren wie hier - ich bekam 100 auf dieser ein und dann bekam ich eine 99 auf dieser ein - dann diese Erinnerung vielleicht gar nicht benutzt, weil ich nur den Computer habe gefragt für ein Array der Größe 2. Diese Plätze sind immer noch da, nicht wahr? Sie haben noch 2 Gigabyte RAM, auch wenn Sie nur fragen, sind für 2 schwimmt. So die Idee hinter Arrays ist, dass der Computer dauert nur ein Stück Speicher und dann aufteilt kleinere Stücke Rücken an Rücken an Rücken an Rücken. Und damit ist alles ein Array ist. Es ist ein zusammenhängender Block arbeiten, innerhalb dessen man die Dinge stellen können. Dies geschieht, um dann nur einige langweilige Arithmetik. Wenn ich hier unten scrollen, das ist, wo ich über das Array dann durchlaufen. I kommen mit der Summierung aller Werte in der Anordnung, und dann verwende ich die Funktion round hier, um tatsächlich die Summe durch Quizzes unterteilt. Aber lassen Sie mich winken meine Hand an, dass als eine Art genug Arithmetik für jetzt. Aber alles, was für mich tun ist letztlich Berechnen einer durchschnittlichen. Also zuerst Quiz plus zweite Quiz durch 2 geteilt und dann auszudrucken als int. Aber lasst uns jetzt Übergang zu einem anderen Beispiel genannt string1, was zeichnet ein ähnliches Bild, jedoch mit Strings. Lassen Sie mich gehen Sie vor und zu vereinfachen, nur für einen Augenblick. Verzeihen Sie die Einkerbung für den Moment. Beachten Sie in Zeile 19 der diesem Beispiel, bekomme ich einen String vom Benutzer. Aber bemerken, was ich nächstes tun in den Zeilen 22 weiter. Ich bin eigentlich Iteration von i bis - und das ist ein neuer Trick - strlen, Stringlänge. Dies ist eine Funktion, die mit C kommt es, dass, wenn Sie ihr einen String, es sagt Ihnen, wie viele Zeichen in diesem String. Das ist alles. Und die Tatsache, dass es strlen anstelle von String-Länge ist nur, weil es mehr prägnante ist. Vor dreißig Jahren, mochte die Menschen, die Dinge so prägnant wie möglich zu schreiben, Deshalb haben wir diese Konvention halten hier. i + + bedeutet nur erhöhen i in jeder Iteration. Und nun merkt das, das ist wirklich interessant. In Zeile 24, sage ich, "Computer, gib mir ein Zeichen, 8 bits, und nennen es c." Aber was ist das auf der rechten Seite sagen? In Englisch, was bedeutet, dass vertreten? [Schüler] Das erste Zeichen im Array. Genau. Gib mir das erste Zeichen im Array. Oder, allgemeiner, gib mir das i-te Zeichen im Array. Und erkennen, es ist jetzt wichtig, dass als Informatiker, wir eigentlich Zählen von 0. Sie haben nicht die Wahl jetzt an, dies zu tun. Jetzt haben Sie in Übereinstimmung mit dem Computer die Erwartungen verhalten und zählt von 0 weil [0] wird das erste Zeichen in einem String, [1] wird der zweite sein, [2] wird der dritte und so weiter sein. So dieses Programm, wenn ich es kompilieren, das ist wieder string1, so stellen string1, und jetzt habe ich string1 in meinem Terminal-Fenster laufen. Es ist eine Eingabe wartet, so werde ich in David geben, Enter, und jetzt ist es druckt David alle auf verschiedenen Linien, da bemerken, was ich tue. Ich bin Drucken ein Zeichen in einer Zeit. Wir werden nicht ins Detail gehen heute, aber ich gelöscht vorhin dieser Prüfung hier. Es stellt sich heraus, dass, wenn der Benutzer sich fehlerhaft verhält, kontradiktorische, oder einfach nur verwirrt, Sie können tatsächlich nicht um eine Reihe von einiger Länge geben. Wenn Sie die falsche Taste drücken auf der Tastatur, können Sie keinen String an alles geben, oder wenn Sie bösartige sind, könnten Sie versuchen, in einem Gigabyte im Wert von einem Essay fügen diese Zeichenfolge zu füllen, und wenn der Computer der Speicher ausgeht, es stellt sich heraus, dass wir gehen, um wieder diesen besonderen Wert namens NULL. So jetzt wissen nur, dass es diese besondere Wert namens NULL die es uns ermöglicht, um zu überprüfen, wenn wir unterwegs sind Speicher, unter anderem. Aber wenn ich eröffnen nun string2, bemerkt ein Unterschied. Unsere einzige Unterschied hier mit string2. Mit string2 ist dies for-Schleife ein wenig anders. Lassen Sie mich löschen NULL, so dass wir über jene andere Zeit sprechen kann. Was ist anders an der for-Schleife dieses Mal? Ich kann zurück zu dem vorherigen Beispiel. Also das ist Version 2, ist diese Version ein. 1, 2. 1, 2. Die strlen Anruf ist wo? Es ist im ersten Teil der for-Schleife. Irgendwelche Gedanken, warum ich das tue? Yeah. [Schüler] So müssen Sie nicht rufen Sie die Funktion jede einzelne Zeit. [Malan] Wir rufen Sie nicht die Funktion jede einzelne Zeit. Genau. Erinnern Sie sich an für Loops, dass sie super einfach sind wenn Sie eine Art verstehen, dass dies die Initialisierung, die Bedingung, und das Update ist. Das Problem ist, dass die Bedingung auf jeder Iteration der Schleife passiert. Und so in diesem Beispiel hier ist das, was schlecht über die Tatsache, dass dies mein Zustand ist? [Schüler] Du nennst strlen sind. [Malan] Du nennst strlen wieder und wieder und wieder. Aber sobald ich in David eingegeben, ist die Länge der Zeichenkette 5, und es wird nicht auf jeder Iteration der Schleife ändern da die Zeichenfolge noch D-a-v-i-d. So ist dies ein Hinweis auf, was los ist, um eine zunehmend wichtige Idee geworden bekannt als eine Design-Entscheidung, wo nur nicht machen den Computer zu tun unnötige Arbeit. Genauso wie eine Vorpremiere pset2, pset2 in der Standard Edition wird Sie herausfordern tatsächlich umzusetzen gewisse Anzahl von Ziffern, eine gewisse Anzahl von Verschlüsselungs-Algorithmen, so dass Sie sowohl verschlüsseln und Entschlüsseln geheimer Nachrichten ähnlich wie das ein Ralphie dort decodiert. In der Hacker-Ausgabe pset2, werden wir noch ein wenig weiter gehen. Wir gehen Hand Sie eine Datei von einem tatsächlichen Computer-System das enthält eine ganze Reihe von Benutzernamen und tatsächlichen verschlüsselte Passwörter, und die Herausforderung für den Hacker Ausgabe sein wird, um diese Passwörter zu knacken und herauszufinden, was Kryptographie oder welches Geheimnis wurde verwendet, um tatsächlich zu generieren, diese Passwörter. Und wir werden dies durch den Einsatz einer neuen Funktion hier C zu tun dass ich Ihnen nur eine Demo als Kommandozeilen-Argumente bekannt. Es stellt sich heraus, wie einige von euch im Schnitt oder in Lehrbüchern gesehen haben, Haupt nicht immer für nichtig in Klammern sein. Es stellt sich heraus, dass Haupt auch wie folgt geschrieben werden, mit zwei Argumenten, argc und argv, wo argc ist die Anzahl der Wörter Sie geben nach den Namen des Programms auf der Kommandozeile und argv ist die tatsächlichen Worte. Und wie die eckigen Klammern gibt vorschlagen, ist argv offenbar ein Array. Es wird ein String nach einer Zeichenfolge nach einer Zeichenkette in Erinnerung sein. Also, was wir in der Lage sein zu tun, beginnend mit pset 2 ist so etwas wie dieses. Wenn ich argv1, die ein Beispiel kommen wir wieder werde am Montag, und führen Sie es, feststellen, dass es nicht scheinen, um etwas noch nicht. Es gibt einfach seine eigenen Namen. Aber wenn ich Abschied Klasse, beachten Sie, dass dieses Programm offenbar iteriert gegenüber jedem der Worte, die bei der Eingabeaufforderung eingegeben wurden. Und die Mittel, mit denen wir den Zugang zu Worten gewinnen wird, dass der Benutzer an der Eingabeaufforderung eingegeben ist durch Änderung Haupt ab diesem Wochenende von int main (void) to main (argc, argv) int und somit wird Befehlszeilenargumente geboren werden. Und wenn Sie wirklich anspruchsvolle bekommen an dieser, werden Sie in der Lage sein, um wirklich trippy Programme schreiben wie dieser hier, die jenseits geht einige der Funktionen haben wir bisher getan, aber alle ziemlich mächtig. Also werden wir dies mit diesen verlassen auf dem Bildschirm, und wir werden Sie am Montag zu sehen. [CS50.TV]