[Powered by Google Translate] DAVID J. MALAN: All right. Dies ist CS50, und das ist das Ende der zweiten Woche. Wenn Sie hungrig zu sein um diese Zeit morgen erwarten, wissen, dass wir gehen als eine kleine Gruppe von morgen, Donnerstag, 01.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 ausgefüllt haben füllen diese aus. Ein weiterer URL, obwohl die von Interesse sein könnte, ist dies. So in nur etwa einem Monat wird der Kurs werde zur Verfügung gestellt werden umso breiter über EDX, über die Leute auf dem Internet werden Lage zu folgen, greifen im Verlauf recht aktiv, in der Tat. Sie werden mit dem CS50 Appliance und CS50 diskutieren 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 in andere gesprochen übersetzen und Schriftsprachen. Also, wenn Sie vielleicht Interesse an einer Teilnahme an diesem Projekt, wobei wir Deutsch Transkripte und Untertitel für den Kurs des bieten Vorträge und Shorts und Seminare und Abschnitte und dergleichen - wenn Sie fließend sprechen oder schreiben fließend eine andere Sprache, würden wir gerne in diesem Projekt engagieren, wobei Sie auf eine oder mehrere der zu nehmen Videos, übersetzt sie in eine 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 darunter, werden Sie in der Lage sein, in einer anderen Sprache zu übersetzen. Genau das ist die Abbildung zwischen, in diesem Fall englisch und, sagen wir, Spanisch. Also ist es eigentlich ein sehr benutzerfreundliches Tool. Sie können Vor-und Rücklauf 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 die Teilnahme freigestellt. Nun ein Wort über das Kätzchen von Montag, damit haben wir eine allzu geschickt beängstigend Nachricht. Sie erkennen, dass der Bürozeiten und schlagen als Abschnitte vorschlagen, die Gestaltung des Kurses ist sehr zu haben die Schüler zusammen und zu reden durch Problem-Sets und Probleme gemeinsam zu arbeiten. Und wirklich die Linie kommt nur auf, wieder die Arbeit, die Sie letztendlich sollten vorlegen können, sollten Sie Ihre eigenen. Und so ist es, ganz ehrlich - in Sprechstunden, es ist völlig normal - es ist völlig zu erwarten, auch werden - mit einigen plaudern Freunden neben Ihnen. Wenn er oder sie wird mit einer gewissen Thema kämpfen, und du bist, oh, auch lassen Ich gebe Ihnen einen Einblick in einige Codezeile, die ich geschrieben habe. Das ist in Ordnung. Das passiert. Und das ist sehr viel förderlich, denke ich, mit dem Prozess des Lernens. Wird die Strecke, wieder, wird überschritten, wenn der Kopf ist Art gekippt hier für viel zu viele Sekunden oder Minuten, dass wirklich haben nur war eine Entsperrung Gelegenheit für Ihre Freundin. Und sicher, wenn die Dinge zu bekommen per E-Mail und Dropbox und ausgetauscht dergleichen, 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 vieles mehr. Und nur erkennen, dass das, was Sie letztendlich einreichen sollten wirklich die Produkt Ihrer Schöpfung und nicht jemand anderes. So in die gleiche Richtung aus kuscheligem Kreaturen, könnten Sie kenne diesen Kerl hier. Dies ist also eine erschreckend kitschig Film von Jahren. Wer hier Spaceballs gesehen? Gut. Also eine gute Nummer hier. Das ist also unsere wunderbar akademischen Weg zur Einführung heute letztendlich der Begriff der Kryptographie. Und so einer der Domain-spezifische Probleme für pset 2, die wird kommen spät morgen Abend, ist in der Welt der Kryptographie tauchen, die ist die Kunst der Verschlüsselung oder Scrambling Informationen. Und dies letztlich bezieht sich auf die Welt der Sicherheit. Nun Sicherheit für die meisten von uns kommt 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, ist das wohl nicht die beste Idee, wie wir in Richtung Semester Ende zu diskutieren. Kein Witz - - auf Ihrem Wenn Sie Ihr Passwort auf einem Zettel geschrieben Monitor, auch das ist nicht unbedingt die beste Design, sondern ein ganz gewöhnlicher Phänomen. Und wenn Sie nicht mit Kryptographie, um Ihre Passwörter zu verschlüsseln, sind sie besonders gefährdet. Also, wenn Sie denken, dass Sie als Super-clever eine verborgene Wort dokumentieren irgendwo auf Ihrer Festplatte, die alle Ihre Passwörter hat, aber es ist in einem Ordner, niemand wird in schauen, das ist auch nicht sehr sicheren Mechanismus. Und so was pset 2 wird einzuführen, ist diese Kunst der Kryptographie und Scrambling Informationen, so dass Dinge wie Passwörter sind umso sicherer. So daß diese sehr realen Problem mit einer stark nicht-realen motivieren Szenario lassen Sie mich Ihnen eines unserer Lieblings-Clips hier aus diesem Film, Spaceballs. [VIDEO PLAYBACK] -Helm, du Teufel, was ist los? Was machst du mit meiner Tochter? -Lassen Sie mich den brillanten jungen plastischen Chirurgen, Dr. Philip einzuführen Schlotkin, die größte Nase Job Mann in der gesamten Universum und Beverly Hills. -Eure Hoheit. -Nose Job? Ich verstehe nicht. Sie hat bereits eine Nasenkorrektur. Es war ein süßer 16 vorhanden. -Nein, es ist nicht das, was Sie denken. Es ist viel, viel schlimmer. Wenn Sie nicht geben mir die Kombination der Luft Schild, wird Dr. Schlotkin geben Sie Ihre Tochter wieder ihre alte Nase. -Nein! Wo hast du das her? In Ordnung. Ich sage. Ich sage. Nein, Daddy, nein. Sie müssen nicht. -Du bist gut, mein Lieber. Ich werde dich vermissen Ihre neue Nase. Aber ich werde ihnen nicht sagen die Kombination egal was passiert. -Sehr gut. Dr. Schlotkin, tun Sie Ihre schlimmsten. -My pleasure. -Nein! Warte, warte. Ich sage. Ich sage. -Ich wusste, dass es funktionieren würde. Alles klar, gib es mir. Die Kombination-eins ist. -One. -One. -Two. -Two. -Two. -Drei -Drei. -Drei. -Four. -Four. -Four. -Five -Five. -Five. -So ist die Kombination ein, zwei, drei, vier, fünf. Das ist das dümmste Kombination, die ich je in meinem Leben gehört habe. Das ist die Art von Dingen ein Idiot auf seinem Gepäck haben würde. -Danke, Eure Hoheit. -Was hast du getan? -Ich drehte mich von der Wand. Nein, hast du nicht. Sie schaltete den ganzen Film. -Ich muss den falschen Knopf gedrückt haben. Nun, legte es wieder auf. Legen Sie den Film wieder auf. -Ja, Sir. Ja, Sir. -Lasst uns gehen, Erna. Komm, Gretchen. Natürlich wissen Sie, ich werde immer noch Sie für diese in Rechnung stellen. Nun, hat es funktioniert? Wo ist das Tor? -Es funktionierte, Sir. Wir haben die Kombination. -Große. Jetzt können wir nehmen jeden letzten Atemzug frischer Luft vom Planeten Druidia. Was ist die Kombination? Ein-, zwei, drei, vier, fünf. Ein-, zwei, drei, vier, fünf? -Ja. -Das ist erstaunlich. Ich habe die gleiche Kombination auf mein Gepäck. Bereiten Spaceball 1 für sofortige Ausreise. -Ja, Sir. -Und ändern Sie die Kombination auf mein Gepäck. -Ow! [END VIDEO PLAYBACK] DAVID J. MALAN: An amazing movie Sie sollten jetzt alle zu sehen. So aus dem Zusammenhang ist, dass mit unsicheren Daten kommt die Möglichkeit, 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 dieses Geheimnis Botschaft hier ist. Aber in der realen Welt der Computer, die Dinge gar nicht, wie sie aussehen könnte Englisch sein Phrasen. Zum Beispiel ist es das, was Sie vielleicht auf einem Standard-Linux-oder Mac oder finden Unix-Rechner in einer Datei, die einst genannt wurde 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 Ihre Benutzernamen oder das anderer Menschen auf dem System, aber du wirst sehen, ein verschlüsselte Version ihres Passworts. Tatsächlich schlägt das Wort Krypta, dass die folgenden Dinge verschlüsselt ist. Und diese Serie von scheinbar zufälligen Buchstaben und Zeichen und Zahlen usw. können nur von in der Regel wissen, ein Geheimnis entschlüsselt werden - eine geheime Wort, eine Geheimnummer. Und so tatsächlich, die Kunst der Kryptographie letztlich darauf einigen vertrauen sortieren und zu wissen, dass jemand etwas anderes nicht. Wir werden dies in etwas mehr Detail zu erforschen heute und in der pset zu kommen. Und nun ein Wort zu Pass / Fail. So haben besonders, da einige von euch ins pset 1, das Gerät tauchten und eine ganz neue Welt für sich, erkannte, dass Frustrationen und Verwirrung und gerade technische Schwierigkeiten zu erwarten sind. Besonders mit dem ersten pset, wo es nur so viel neuen, gerade erst vertraut mit ls und cd und all diese obskuren Befehle in einer neuen Umgebung. Und das ist getrennt von der eigentlichen materiellen und Programmierung selbst. So erkennen Sie auch, dass es sicherlich Bürozeiten, die als vorhanden die Trägerstruktur. Abschnitte beginnen am kommenden Sonntag. Aber am wichtigsten ist, wenn Sie das Gefühl nur, dass du dies nicht der 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. Also, wenn Sie am Rande zeigen, erkennen, dass anstatt den Kopf in eine andere Wasser ausbleibt, dürfen 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 möglicherweise nicht Ihnen vertraut sein. Und du wirst am Ende dabei in den meisten Fällen ziemlich fein, vielleicht viel zu Ihrer Überraschung. Und noch konkreter, was ich denke, Pass / Fail-Regel der Fall ist, vor allem, wie Sie vielleicht mit pset 0 erlebt haben, wenn Sie gesteckt haben in 10 Stunden, 15 Stunden, 25 Stunden in eine pset - und du bist nur hämmern mit dem Kopf gegen die Wand, und es wird immer Super spät in die Nacht, aber du hast die pset wie 90% der Weg genommen, Sie wissen, man kann einfach nicht herausfinden, eine Sache - Pass / Fail wirklich braucht die Kante aus einer Klasse wie dieser, wo Sie sortieren können der gerne sagen, okay, ich weiß, es ist nicht perfekt. Aber ich habe mir den Arsch ab zu diesem Thema. Ich bin ziemlich glücklich mit dem es endete. 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 haben, 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, um zu versuchen würden Anschluss an das für bessere Geschwindigkeiten und lassen Sie uns wissen, ob es nicht besser ist - eins, zwei, drei, vier, fünf, den ganzen Weg bis zu acht weil acht ist sicherer als fünf. Also, wenn Sie die Wi-Fi Passwort benötigen, um CS50 drahtlos hier anschließen. Eins, zwei, drei, vier, fünf, sechs, sieben, acht. Und Beitrag am 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 sind aller Dinge Apple. Was ich ausgegraben von ein paar Jahre zurück war diese Datei hier, ilock.c, nur um Art von Make konkreter und komplexer einigen der grundlegenden C Programme, die wir geschrieben haben. So öffnete ich diese Datei ilock.c. Es ist auf dem Vorträge 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 Scrolling starten durch, was das eigentlich ist, ist das sehr erste, glaube ich, für den ursprünglichen iPhone knacken. Wenn Sie das Original-iPhone jailbreak wollte, was bedeutet, untether es von AT & T und tatsächlich installieren spezielle Software drauf und Dinge tun, dass Apple wollte nicht die Menschen zu tun - gut, hat jemand die Zeit, um genau herauszufinden, wie sie ausnutzen könnten Software-Fehler, Fehler, Fehler, in Apples Software. Und so war geboren ilock.c. Dass, wenn Sie es auf einem Computer kompiliert und installiert es auf einem iPhone, dass wurde an Ihren Computer über, sagen wir, ein USB-Kabel angeschlossen ist, würde dies Ihnen Verwaltungs-oder Root-Rechte auf Ihrem iPhone und können Sie so ziemlich alles was Sie wollen. Und so gibt es seit dieser faszinierenden Katz und Maus Spiel zwischen Apple und der Rest der Welt, insbesondere da sie, wie viele andere Unternehmen, versuchen zu sperren ihre Sachen nach unten, so dass Sie nur tun können, was sie wollen. Aber dank Leuten wie diese und ihr Verständnis von Low-Level- Details und, in diesem Fall, C-Programmierung und ein Großteil der bekannten Konstrukte dass wir angefangen zu spielen mit, sind Sie in der Lage, wirklich nutzen die Hardware in einer Art und 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 wie es aussieht ist dies eine Funktion, dass diese Person geschrieben hat. Nehmen Sie irgendeine Art von Integer als Argument, nichts zurück, sondern scheint Schleife mit einer for-Schleife hier und einer if-Bedingung, wenn die Bedingung, brechen, und irgendwie bezieht sich auf Versionsnummern. Wenn wir nach unten scrollen - obwohl viele dieser Schlüsselwörter sein werden neue, und es gibt eine ganze Reihe von Funktionen, hier haben wir noch nie gesehen und vielleicht nicht immer über zu sehen der Verlauf des Semesters - am Ende des Tages, folgt den gleichen Regeln und Logik, wir waren Spiel mit so weit. 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, dass wir tauchte in. Werfen wir also einen Blick auf ein wenig mehr einfaches Beispiel. Dieser, nur um mit einigen Syntax aufwärmen und auch einige andere Daten Typ, den wir gesprochen haben, aber noch nicht wirklich in C. gesehen ist also ein Datei namens positive1.c. Und nach den Kommentaren an der Spitze, das nur verlangt, dass ein Benutzer bereitstellen positive Zahl ist. Es ist also ein Beispiel für eine do-while-Schleife, das ist schön für Benutzer interaktiv Programme, wo Sie brauchen, um den Benutzer zu sagen, etwas zu tun. Und wenn sie nicht kooperieren, man sie schreien oder lehnen ihre Eingabe. Case in point, werde ich tun, Zeilen 19 bis 24, so lange hat der Anwender nicht mir eine positive Zahl ist. Nun ist dies hier ausführlich on line 18, warum erkläre ich n oberhalb dieser ganzen Looping Konstrukt nach rechts neben die Linie 22 entgegen, wo ich eigentlich egal, um n zu bekommen? Yeah? [Unverständlich] DAVID J. MALAN: Ja, so in dieser Ausgabe von Umfang. Und in juristischer Begriff, was bedeutet Umfang zu beziehen? Yeah? [Unverständlich] DAVID J. MALAN: Können Sie sprechen ein wenig lauter? Sprecher 1: Wo kann man eine bestimmte Variable zugreifen. DAVID J. MALAN: Perfect. Wo können Sie eine bestimmte Variable zugreifen. Und im Allgemeinen, die Faustregel war bisher, dass der Umfang von einigen Variable wird durch die jüngsten geschweiften Klammern, dass Sie gesehen haben, definiert. Und so in diesem Fall, wenn ich den Fehler gemacht, zu erklären, n on line 22, diese Zeile funktionieren würde. Ich würde einen int, und ich würde es in dieser Variablen n in Zeile 22 setzen. Aber welche Codezeile würde jetzt keine Ahnung, was ich rede? So 25, und es stellt sich heraus, 24, als auch, weil in diesem Fall, es draußen fällt der geschweiften Klammern. Also einfach ein wenig lästig, aber sehr einfach durch Erklärung gelöst die Variable außerhalb der Funktion selbst. Jetzt werden wir später sehen, heute kann man einen Schritt weiter gehen. Und man konnte sogar noch ein wenig faul - und das ist nicht zu empfehlen, im Allgemeinen - aber man konnte 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 von allen Funktionen, die Sie geschrieben haben, wie ich es hier getan habe on line 15. Aber das ist allgemein verpönt. Aber klar, dass das eine Lösung manchmal andere Probleme, wie wir schließlich sehen. So jetzt werden wir es so lassen. Aber lasst uns sehen, ob wir umschreiben können dies nur zu beginnen, uns auszudrücken a wenig anders. Also das Programm 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 strengsten Tests. Aber zumindest ist es ein schönes Plausibilitätsprüfung, dass wir auf dem richtigen Weg. So, jetzt lassen Sie mich gehen Sie vor und öffnen Sie die zweite Version davon. Und was ist anders schon? Es implementiert die gleiche Sache. Aber was springt so klar diesmal anders? Ja, so ist dies bool grün. Gedit hat in grün diesem Schlüsselwort als bool bekannt hervorgehoben, das ist ein Datentyp. Es ist nicht in allen Versionen von C kommen errichtet Sie müssen ein beinhalten spezifische Bibliothek. In unserem Fall enthalten ich den CS50-Bibliothek, so dass wir Zugang zu bool. Aber in Zeile 18, scheinen wir einen booleschen Wert hier als dankbar sind. So konnte ich dieses alles 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 gemacht ist, ich habe gerade Art umgeschrieben meine Logik. Also keine funktional unterschiedlich. Aber in Zeile 22 jetzt, überprüfe ich, wenn die int der Benutzer vorgesehen ist größer als 0, dann habe ich einfach ändern Sie den Wert dankbar wahr. Und warum mache ich das? Da in Zeile 25, offenbar, werde ich eine Bedingung zu überprüfen. Haben diese Schleife, während dankbar ist falsch. So schlage ich vor, dies als Alternative zur Variante ein, weil es zumindest eine ist wenig mehr intuitive, vielleicht. Es ist 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 in, weil Ankündigung gibt es keine variable n. Also eigentlich, I - ein kleines weißes daliegen. Funktionell ist das Programm ein bisschen anders, wenn wir auf den Boden zu bekommen weil ich nicht erinnern werde, was n ist. Aber ich wollte hier zeigen auch, dass obwohl wir GetInt gesehen und GetString ist auf der rechten Seite von einem Gleichheitszeichen bislang eingesetzten so daß erinnern wir uns den Wert, technisch, das ist nicht unbedingt notwendig. Wenn aus irgendeinem Grund die Sie gerade 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 offen 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 geben, GetInt gibt die Nummer 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 Zeile 25 ooh merkt, wir sind fertig, weil ich jetzt dankbar bin. Und in Zeile 26, sagen wir einfach, danke für die positive ganze Zahl, was es passiert zu sein. 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 Varianz in positive3. So bemerkt der einzige Unterschied ist jetzt, was Codezeile? Ja, so 25. Und wir haben nicht wirklich diesen Trick gesehen nur noch. Aber wir sahen das Ausrufezeichen am Montag, das ist, was bedeutet? So nicht, oder Negation. So nehmen Sie einen booleschen Wert und drehen ihren Wert. Wahre falsch wird. Falsche wahr wird. Also das würde ich vorschlagen, ist sogar ein wenig mehr intuitive einer Art Schreiben des Codes, weil ich zu initialisieren immer noch dankbar auf false. Ich weiß immer noch die folgenden. Ich dankbar wahr, wenn die Zeit kommt. Aber jetzt können Sie wirklich nur übersetzen diesen Code mündlich links nach rechts, zwar nicht dankbar. Da bang, oder Ausrufezeichen, bedeutet der Begriff nicht, so dass während nicht dankbar. Also noch einmal, haben wir keine neuen Konzepte per se eingeführt. Wir haben über Booleans zurück, wenn wir mit Scratch spielte gesprochen. Aber merke jetzt, können wir nur mit dem Schreiben beginnen unseren Code in viele verschiedene Arten. So vor allem in pset1, wenn Sie eine Art zu kämpfen, um herauszufinden, den Weg zu schreiben einige Programm werden Sie Glück Quote, weil es geht um beliebig sein Reihe von Lösungen, die Sie bei passieren kann. Zum Beispiel ist dies nur drei selbst für die einfachsten von Programmen. Gut. Und nun erinnern am Montag, verließen wir auf diesem Zettel mit Rückgabewerten. So zum ersten Mal schrieben wir ein Programm, das nicht nur über Haupt-, 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 ein mal ein mal ein, in diesem Fall. Aber was ist wichtig daran ist, dass ich unter Input in Form von a und Ich bin wieder Ausgang in Form eines mal ein mal ein. So jetzt habe ich die Möglichkeit, ähnlich wie ich früher mit printf allein, zu nennen diese Funktion, indem Sie die Würfel Funktion. Und der Würfel-Funktion nimmt eine Eingabe. Und der Würfel-Funktion liefert eine Ausgabe. Und so dagegen printf gerade etwas. Es kam nicht wieder alles, was wir über gepflegt - obwohl, wie ein beiseite, tut es einen Wert zurückgeben. Sie haben 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. Das ist also in der Regel - Für diejenigen, die mit diesem, ist es eine ziemlich einfache Idee. Aber für diejenigen, die weniger vertraut mit dieser Idee der Weitergabe an den Eingängen und bekommen zurück Ausgänge, versuchen wir nur etwas super einfach. Ist jemand komfortable kommen auf die Bühne kurz auf? Sie müssen bequem sein mit einer Kamera auf Sie, wie gut. Yeah. Okay, was ist Ihr Name? KEN: Ken. DAVID J. MALAN: Ken. Alle Rechte, Ken. Komm rauf. Ken so wird eine Funktion der möglichen hier sein. Und 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 einen modernen 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 - na ja, eigentlich kann das nicht sagen. Ich habe nicht wirklich eine gute Handschrift. Und so also, ich möchte Sie etwas auf dem Bildschirm für mich zu drucken. Also ich bin da das Hauptprogramm. Und ich werde Ihnen sagen, dass dies, indem er es in meinem Chicken Scratch und dann vorbei Sie einen Eingang. So wie dumm obwohl diese Übung ist, die Vorstellung der Funktionen und Aufruf einer Funktion und eine Funktion zurückgibt, läuft wirklich auf diese. Ich bin main. Ich habe gerade printf ("irgendwas") auf den Bildschirm geschrieben. Ich bin mit diesem Programm. Und sobald printf aufgerufen wird, dauert es ein Argument - oder einen Parameter, manchmal - zwischen Anführungszeichen. Hier ist das Argument. Ich bin der Übergabe an Ken. Jetzt ist er ein Black-Box geschrieben gewisse Anzahl von Jahren, dass offenbar nur weiß, wie die Dinge auf dem Bildschirm auszugeben. So führen. Das ist nicht schlecht. Also, sehr gut. So, jetzt Ken getan wird ausgeführt. Braucht er zur Hand mir nichts zurück? Also nicht, dass wir bisher gesehen. Wieder ist printf tatsächlich wieder eine Nummer. Aber wir werden, dass für jetzt ignorieren, weil wir es nie benutzt habe. Also das ist es für Ken. Und nun Haupt kommt zurück zu führen - Haupt übernimmt die Steuerung des Programms wieder, weil dieser Code-Zeile, printf, erfolgt die Ausführung. Und wir gehen über unsere Art der Ausführung, was andere Leitungen vorhanden sind. Gut. So, jetzt wollen wir versuchen eine etwas andere Beispiel. Und diese Zeit hier, lassen Sie uns zuerst den Bildschirm hier. Und dieses Mal werden wir tun das Cubing-Funktion. Aber diesmal erwarte ich einen Ausgangswert. Also lasst uns weitermachen und tun. So jetzt habe ich eine Zeile Code, die sagt x = cube (x). Also eigentlich let's - die Codezeile, Rückruf, sieht wie folgt aus. x = cube (x). Also, wie ist das funktionieren? Also lasst uns gehen Sie vor und geben Ihnen einen weißen Bildschirm wieder. Und ich gehe jetzt notieren den Wert von x, die in diesem Moment Es passiert zu sein, sagen wir, 2, es einfach zu halten. Also habe ich auf ein Stück Papier den Wert von 2 geschrieben, das ist mein Wert x. Ich gebe es zu Ken. KEN: Und ich schreibe die Antwort? DAVID J. MALAN: Yeah, lasst uns einfach schreiben Sie die Antwort. Okay. Und jetzt hat er wieder mir etwas. So - perfekt. Nizza segue. So, jetzt reicht er mir den Wert von 8, in diesem Fall. Und was mache ich damit zu tun? Na ja, eigentlich, mal sehen. Holen Sie dieses Recht. Was soll ich damit zu tun? Jetzt werde ich diesen Wert zu nehmen und tatsächlich lagern Sie es in die gleichen Bits im Speicher. Beachten Sie aber, ich bin Art zu 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 hatte den Wert 2, die x war. Und in der Tat, das ist genau das, was passiert. So stellt sich heraus, dass, wenn Sie eine Funktion aufrufen, und Sie in ein Argument übergeben wie "Hallo Welt", oder Sie übergeben ein Argument wie 2, in der Regel, du bist Übergabe einer Kopie dieses Argument. 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. Denn in der Tat, 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 optisch erinnere mich an diese Vorstellung vorbei buchstäblich eine Kopie des Wertes. Ken macht seine Sache, reicht mir wieder etwas - in diesem Fall ein Wert wie 8. Und dann habe ich etwas mit diesem Wert tun, wenn ich soll es auch bleiben rund. So wird das alles nur allzu vertraut, bevor lang. Vielen Dank für diese Demo hier, Ken. Gut. Sehr gut gemacht. Also mal sehen, wie das letztlich bezieht sich auf einige der Funktion ruft, dass wir hier getan. Also lass mich gehen Sie vor und bringen uns zurück zu dem Cubing Beispiel hier. Und feststellen, dass, wenn wir tatsächlich anfangen, diese weiter wollen, werden wir zu müssen, eingedenk der Tatsache, dass die Zahl x, die ist in weitergegeben hier ist es anders aus, was tatsächlich an die Funktion übergeben. Also noch einmal, wird dies durch Kopie übergeben werde ganz geworden Germane in nur einem Augenblick. Werfen wir also einen Blick auf etwas, das nicht ganz stimmt noch arbeiten. Ich werde weitermachen und öffnen ein Drittel buggy Beispiel, das ist von der Natur fehlerhaft. Und es heißt buggy3, und es setzt eine Swapping-Funktion. Also hier haben wir eine Hauptfunktion, die x-und y beliebig ist initialisiert 1 und 2 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, eine pro Zeile. Dann on line 23, behaupte ich, ich tauschen diese Werte, Punkt, Punkt, Punkt. Ich anscheinend eine Funktion in Zeile 24 als Swap das nimmt zwei Argumente. Es ist völlig legitim für Funktionen zweier Argumente zu nehmen. Wir haben gesehen, printf tun es bereits. Also nimmt offensichtlich Swap x und y. Und wie der Name schon sagt, würde ich hoffen, dass es zu gehen Swap diese beiden Werte. Also habe ich on line 25, dadurch gekennzeichnet, getauscht. Und I nachzudrucken x und y unter der Voraussetzung, daß sie haben zwar schon getauscht. Aber wenn ich wirklich dieses Programm - Lassen Sie mich öffnen Sie ein Terminal-Fenster. Lassen Sie mich buggy3. Wie der Name andeutet, ist dies nicht gut enden. Denn wenn ich die Eingabetaste drücken, bemerken, dass x 1 ist. y 2 ist. 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? Nun, lasst uns in diesen Swap-Funktion zu tauchen. Es ist super kurz. Es ist nur ein paar Zeilen Code lang. Aber was ist das grundlegende Problem der einfachen Geschichte erzählte hier mit Ken? Warum ist Swap gebrochen? [Unverständlich] Genau. Daher freuen wir uns auf eine Kopie speichern, nicht die Variable selbst. In anderen Worten, Swap scheinbar nimmt zwei Argumente, ein int. Und es ist willkürlich bezeichnet a und b. Und hier habe ich in x und y, die jeweils 1 und 2 geführt. Aber ich bin nicht wörtlich vorbei in x. Ich bin nicht wörtlich vorbei in y. Ich Übergeben einer Kopie von x und eine Kopie von y. Es ist wie fast, als ob Sie kopiert und eingefügt in vertauschen die Werte, die Sie wollen, dass es tatsächlich zu manipulieren. Also, wenn das der Fall ist, wenn ich das Programm, das Ausführen starten Zeile 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? So sollte es nur 1 sein. Right? Da x wurde als erstes Argument übergeben. Und diese Funktion einfach willkürlich ruft das erste Argument, ein. Ebenso ist y, das zweite Argument. Und es ist einfach willkürlich ruft das zweite Argument b. Nun ist diese Dichotomie ist eigentlich recht 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 aufgerufen werden. Also muss es einen Unterschied zwischen dem, was Sie anrufen Variablen werden Funktionen, die Sie gerade schreiben und was Sie nennen Variablen in Funktionen sind Sie telefonisch oder verwenden. Also mit anderen Worten, ich habe meine Variablen x und y geschrieben. Aber wenn jemand anderes die Swap-Funktion geschrieben hatte, sicherlich er oder sie wüsste nicht, 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, ästhetisch, wenn die Person, die schrieb sein Swap hatte die gleichen Namen verwendet. Gut. So an diesem Punkt in der Geschichte, Zeile 37, eine 1 ist. b 2 ist. Und jetzt gehe ich vor, um sie auszutauschen. Nun zunächst einmal, lassen Sie mich tatsächlich tun dies viel einfacher. Ich weiß nicht, was diese drei Zeilen Code taten. Lassen Sie mich nur dies tun. b erhält ein. a erhält b. Fertig. Warum ist das gebrochene, logisch? Es ist eine Art der intuitiven Sache, nicht wahr? So a wird b. Und b wird zu einem. Aber das Problem ist, dass, sobald die Leitung 37 führt, was ist das Wert von a und b? Das gleiche, 1. Weil du verprügelt haben, so zu sprechen, haben Sie b geändert, um eine gleich. Also, wenn Zeile 37 ausgeführt wird, das ist großartig. Sie haben nun zwei Kopien der Nummer 1 im Inneren dieser Funktion. Also, wenn Sie in Zeile 38 sagen, ein b erhält, gut, du bist Art verschraubt. Weil Sie nur die Zuordnung von 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 häufige Namen für eine temporäre Variable. Es ist ein int, weil es zu entsprechen, was ich eine Kopie machen wollen hat. Ich speichere eine Kopie einer Innenseite tmp. Also, wenn Zeile 37 ausgeführt wurde, der Wert von a ist - schnelle Plausibilitätsprüfung - Ein. Der Wert von b gleich 2 ist. Und der Wert von tmp ist ebenfalls ein. So, jetzt führe ich die Leitung 38. So dass, sobald 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 alle Werte. Aber klar zu sein, warum? Ich reparierte die logische Problem aus eben noch. Aber noch einmal, wenn ich dieses Programm ausführen, bleibt x und y am Ende unverändert der Ausführung des Programms. [Unverständlich] DAVID J. MALAN: So haben wir nichts zurückgegeben. Also das ist wahr. Aber es stellt sich heraus, es ist ein bisschen ein Problem hier, weil bisher die einzige, was wir in der Lage, wieder habe, ist eine Sache. Und dies ist eine Einschränkung von C. Sie nur zurückgeben kann wirklich ein Wert, In diesem Fall bin ich irgendwie stecken hier weil ich den neuen Wert von x zurückkehren konnten oder ich könnte wieder die neue 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? a und b. Aber a und b sind Kopien von x und y, die wir gerade tat all dies bedeutet arbeiten - wir genauso wie 3 Minuten damit verbracht, über die Swap- Funktion und alle drei 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 innerhalb der für loop - ähnlich, wenn Sie erklären sind a und b innerhalb einer Funktion, dass Sie geschrieben haben, sind sie nur gültig innerhalb dieser Funktion. Das bedeutet, sobald Swap getan ausgeführt wird, und wir gehen von der Linie 24 bis Zeile 25, x und y sind 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, denn wir können nur einen Wert zurückgeben. Und ich will wirklich, sowohl x und y zur gleichen Zeit zu tauschen. Also werden wir kommen darauf zurück. Aber jetzt erkennen, dass das Problem grundsätzlich ergibt sich aus der Tatsache, daß a und b sind Kopien. Und sie sind in ihren eigenen Anwendungsbereich. Nun, 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 Aus diesem buggy4. Und was ist das? Dies ist eine ähnliche, aber einfacheres Problem zu betrachten, bevor wir einen Stich nehmen es zu lösen. Dieses Programm heißt Inkrement. Und es scheint initialisiert eine x Ganzzahl 1 in Zeile 18. Ich dann zu behaupten, x 1 ist. Ich dann zu behaupten, Inkrementieren, Punkt, Punkt, Punkt. 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 fehlerhaft. Was ist das Problem? Yeah? [Unverständlich] DAVID J. MALAN: Genau. So x wurde offensichtlich auf Linie 18 erklärt. Das ist in geschweiften Klammern Main. So die einfache Antwort ist, dass, na ja, x hier existiert. Es ist nicht in Leitung 32 abgegeben. Also das Programm tatsächlich nicht einmal kompilieren. Der Compiler, wenn ich kompilieren diesen Code auszuprobieren, 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 Bürozeiten 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 fünf ist. So ein, zwei, drei, vier, fünf. Das ist in der Tat, wo das Problem liegt. Und auch im Auge zu Bürozeiten und zu Hause zu halten, bin ich glücklich hier. Ich habe ein Fehler. Es wird relativ einfach zu beheben. Aber wenn man einen ganzen Bildschirm voller überwältigender Fehlermeldungen wieder erkennen, dass die unterste ein vielleicht nur symptomatisch die obersten diejenigen. Also immer jagen Ihre Fehler von oben nach unten. Weil es vielleicht nur eine Daisy-Chain-Effekt, was darauf hindeutet, Sie ist sein 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? Was ist das? Okay. So können wir x global. Nehmen wir die Verknüpfung, die ich früher gewarnt. Aber was solls, wir brauchen nur eine schnelle Lösung. Also lassen Sie uns einfach sagen, int x hier oben. Das macht x global. So, jetzt Haupt Zugriff darauf hat. Und Inkrement Zugriff darauf hat. 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. Nun ist dies eines dieser Dinge - was ich sage, nicht was ich tue, wie ich gerade gemacht habe hier. Denn in der Regel werden unsere Programme gehen, um viel interessanter und wesentlich länger als dieser. Und wenn Sie Ihre Lösung an die Probleme des Lebens ist einfach ah, setzen alle Variablen am Anfang der Datei, sehr schnell tun Programme erhalten horrifically 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 konnte ich natürlich - am Ende des Tages, es ist irgendwie eine dumme Geschichte, weil wir genau dies. Aber wenn ich nicht zu diesem Betreiber kannte, oder ich war nicht erlaubt ändern Sie es in Haupt selbst, wie könnte ich sonst noch umzusetzen Ken hier rüber, diese Zeit nicht zu cube, sondern zu erhöhen? Wie ändere ich das Ding hier? Yeah. [Unverständlich] DAVID J. MALAN: Okay, gut. Also, warum nicht ich in x passieren? Und dann, anstatt zurückgeben, warum ich nicht einfach tun return x + 1? Jetzt haben ein paar mehr Dinge zu ändern. Ich bin auf dem richtigen Weg. Was muss ich sonst noch zu optimieren? Jemand anderes. Yeah? [Unverständlich] DAVID J. MALAN: Ich muss den Rückgabetyp Inkrement ändern weil es nicht erlischt. Void bedeutet nichts ist zurückgekehrt. Aber klar, jetzt ist es. So dies geändert werden muss, um int konsistent zu sein mit dem, was Ich bin eigentlich zurückkehren. Jetzt etwas anderes ist noch buggy hier. Yeah? [Unverständlich] DAVID J. MALAN: So ich x erhöhen müssen? [Unverständlich] DAVID J. MALAN: Ah, also muss ich x passieren. Also muss ich das hier tun. So der Prototyp, ich habe dies zu ändern hier oben. Also das muss ein int geworden. Dies hat zu werden - hmm. Ich habe eigentlich einen Fehler hier unten. Lassen Sie dieses Problem beheben ein erster. Was soll das eigentlich sein? So es muss ein int etwas sein. Es könnte x. Aber ehrlich gesagt, wenn Sie anrufen allen Ihren Variablen x zu 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 even_number werden noch deutlicher. So dann habe ich wieder was die Zahl plus 1 ist. Und jetzt habe ich eine andere Sache verändern hier und ein andere Sache hier. Was muss ich auf Linie 21 zuerst ändern? Ich habe es x zuweisen. Ich kann also nicht einfach anrufen Inkrement x. Ich brauche die Antwort, indem der Wert von x auf Speichern die linke Seite. Und obwohl x ist jetzt auf der linken Seite und rechts, das ist völlig in Ordnung, weil die rechte Seite wird zuerst ausgeführt dann wird in die linke plumpste Hand Sache, x in diesem Fall. Und dann endlich, ist dies eine einfache Lösung jetzt. Dies sollte nur entsprechen, was ist unten. Int-Nummer. Gut. 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, wie, ein sechs-Programm. Also, was ist falsch in Zeile 18 Zeichen 5? Gut. Also muss ich diese int deklarieren. Gut. Also mal sehen, eine ganze Reihe von anderen Fehlern. Oh my god. 19, 18, 21. Aber noch einmal, lasst uns einfach den Bildschirm - Steuerung L hier - und re-run Clang. So fünf Probleme ist eigentlich nur, dass man. So, jetzt lasst uns laufen buggy4, Enter. Puh. x wurde korrekt erhöht. Gut. Fragen, wie die Zahlen erhöhen? Yeah? Sprecher 2: Warum ist es, dass man nur ändern, x die Nummer in der Variablen nennen und es wird wissen, was du meinst? DAVID J. MALAN: Gute Frage. Wie kommt es, dass ich nur ändern x Anzahl und weiß das Programm, sofort? Also noch einmal, daran zu denken, wie diese Abstraktion. Also, wenn ich Haupt und bin Ken ist inkrementell, ehrlich gesagt, es ist mir egal was Ken nennt seine iPad. Es ist mir egal, was er alles, was mit seiner Umsetzung zu tun hat ruft dieser Funktionalität. Also das ist eine Implementierung Detail, dass ich, Haupt-, nicht haben zu kümmern. Und so einfach ändern konsequent im Inneren der Funktion Nummer hier und Nummer hier ist alles was man braucht, so lange ich neu kompilieren. Es ist eine Art, wie wenn man darüber nachdenkt - viele von uns, die von Ihnen mit Fahrer Lizenzen, die getrieben haben oder wenn Sie selbst in einem Auto gefahren - 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. Wir haben nicht zu kümmern, was alle Stangen und Kolben und Kabel im Inneren des das Auto tatsächlich tun. So etwas wie, was Sie nennen sich der Kolben keine Rolle Hier in diesem Fall. Gleiche Idee. Yeah? [Unverständlich] DAVID J. MALAN: 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 / Ersetzen, so ähnlich. Aber Sie gehen zu müssen, damit die Änderungen sich. Sie müssen konsequent sein. [Unverständlich] DAVID J. MALAN: Eine bestimmte Reihenfolge wie hier? Wenn dies int andere Nummer? Yeah. So um es ankommt, 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 gemacht Streit über hier. Leider sollte dies nicht eine Klammer sein. Das zweite Argument einer Linie mit dem zweiten. So Ordnung, ja, Angelegenheiten. Gut. Leider machte ich einen langen Weg dorthin. Weitere Fragen? Gut. Also lasst uns sehen, ob wir nicht ein Bild malen, was ist eigentlich los hier unter der Haube, so zu sprechen. Also das ist ein Rechteck, das den Arbeitsspeicher Ihres Computers darstellen könnten. Also selbst wenn Sie keine Ahnung haben, wie das Gedächtnis funktioniert oder wie RAM funktioniert, zumindest annehmen, dass Sie Bündel es in diesen Tagen haben. Du hast Megabyte es. Du hast Gigabyte davon. Und wir wissen aus Woche null, dass ein Byte genau das, was ist? 8 Bits. Richtig, also 8 Nullen und Einsen. Also, wenn Ihr Computer verfügt über einen Gig RAM, zwei GB RAM in diesen Tagen haben Sie ein Milliarden oder 2 Milliarden Byte Speicher oder rund 8 Milliarden oder 16 Milliarden Bits, im Inneren des Computers. Nun im Gegensatz zu den kleinen Woolly Willy Beispiel ist es nicht magnetischen Partikeln typischerweise mehr. Zunehmend in Laptops zumindest ist es Solid State Drives, SSDs, dass nur haben keine beweglichen Teile. Es ist alles elektronisch. Es ist alles Strom. So denke aber, dieses Rechtecks ​​als nur die die ein oder zwei Gigabyte Speicher, die Sie haben. Es ist also ein Stück Erinnerung. Nun ist die Welt der Informatik hat Art abgetrennten Stücke Speicher verschiedene Dinge tun. So zum Beispiel, wenn dies den Arbeitsspeicher des Computers - wie die vorgeschlagene Rechteck gibt - 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 Nullen und Einsen, dass Sie zusammengestellt haben. Also, wenn wir unter der Haube, was a.out ist sah, alle die Nullen und Einsen - wenn Sie ein Programm ausführen, werden diese Nullen und Einsen von Ihrer Festplatte geladen Laufwerk in etwas namens RAM. Und im RAM, sind sie ganz nach oben setzen. Jetzt Inzwischen haben Sie andere Dinge. Initialisierte Daten, initialisierte Daten. Diese beiden Schwaden von Speicher beziehen sich auf globale Variablen, die Sie 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 viel Zeit auf wird. Aber dann zwei wichtige Dinge, die kommen wieder in diesem Semester, Stack und Heap. So sind die meisten der Arbeitsspeicher Ihres Computers ist reserviert, wenn ein Programm für etwas namens den Stapel und etwas namens den Haufen. Und wir werden nicht über den Haufen sprechen heute, aber wir werden reden über den Stapel. Und der Stapel soll zaubern die visuelle sind wie der Speisesaal Menüschalen in Mather House, oder wo auch immer Sie sich gerade befinden, wo die Speisesaal Personal reinigen sie jeden Tag. Sie stapeln sich vom Boden aufwärts. Und ähnlich in Erinnerung, da ist diese Idee, etwas auf eine stapeln, indem etwas auf einem Stapel, legt etwas auf einem Stapel. Und was machen wir damit? Nun, lassen Sie es zu vergrößern nur auf der unteren Hälfte des Bildes, des Computers RAM, folgendes vorzuschlagen. Es stellt sich heraus, dass, wenn Sie ein Programm wie a.out auszuführen oder hallo, was auch immer das Programm ist, dass du geschrieben hast, wieder, werden diese Nullen und Einsen von Ihrer Festplatte geladen - und das ist Langzeitlagerung, bleibt dort, selbst wenn Sie den Stecker ziehen - geladen in den Arbeitsspeicher. RAM ist schneller als Festplatten. Er ist kleiner als Festplatten. Aber es ist, wo Programme während Sie sie sehen leben. So Doppelklick auf ein Programm auf einem Mac oder einem PC - es ist aus geladenen Festplatte in den Arbeitsspeicher. Sobald es in den Arbeitsspeicher geladen ist, gehen die Nullen und Einsen auf dem Weg oben, die sogenannte Text-Segment. Aber dann, sobald Ihr Programm tatsächlich beginnt zu laufen, die wichtigsten 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, das Sie doppelgeklickt verwendet einige Variablen innerhalb von Haupt-, landen sie an der Unterseite des Stapel-Speicher, so zu sprechen. Jetzt konkret, was bedeutet das eigentlich? Dies bedeutet nur, dass, wenn wir wollten die Dinge Nummer - wenn wir wollten Anzahl der Bytes des RAM in Ihrem Computer feststellen, dass dies könnte Byte-Zahl Null. Dies könnte Byte Nummer eins, zwei, drei, vier, fünf, sechs, alle sein Weg bis zu wollen - 2 Milliarden würden 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 jeder der Anzahl diese Einheiten des Speichers. Also, wenn Sie 32 Bits für einen int benötigen, oder Sie müssen 8 Bits für ein char, wo sie am Ende in Erinnerung? Nun konzeptionell, sie nur am Ende auf den Grund Ding namens den Stapel. Aber was ist interessant ist jetzt, wenn der Haupt ruft eine Funktion. Angenommen, eine Funktion namens foo, nur ein beliebiger Name. Was passiert, ist wichtigsten ist an der Unterseite dieses Stapels an Speicher. Foo nun an der Spitze der wichtigsten in Speicher abgelegt. Also keine lokalen Variablen, die foo hat am Ende eine Art konzeptionell oben die 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 Funktionen schreiben, die nie zurückkehren. So zum Beispiel, lasst uns so viel zeigen, mit einem 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 werden Änderungen auf uns. 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 sagen. Und dann werde ich sagen, printf - oh, wir machen dies mehr interessant. Lasst uns eigentlich nicht gedruckt überhaupt nichts. Lass uns einfach tun. Chorus (i). Gut. Also das ist buggy denn warum? Ich mache dies auf, als ich gehen, weil das Programm nicht wirklich etwas tun von Interesse. 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 zu verlieren, wirklich die grundlegende Fehler. Haupt-Anrufe Chorus etwas Chor singen. Dann tat ich etwas dumm, und ich hatte Chorus Call Chor, weil ich davon ausgegangen, jemand anderes würde es vielleicht zu implementieren. Und nun dies 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 gehe hier unten - Eigentlich verwenden wir das größere Fenster. Lasst uns voran gehen und Chor. Lasst uns voran gehen und Chor. Verwenden von unbekannten Alleinspieler i. Oh, das war dumm. Wir brauchen nicht das Argument. Lass uns einfach tun. Wünschte, wir hätten auf diese Weise gestartet. Es wäre viel einfacher Programm zu schreiben. So gibt. Jetzt gehen wir zu meinem Terminal-Fenster, re-run Clang. Und hier gehen wir. Das war wirklich schnell. Was ist eigentlich gerade passiert, wenn? Nun, jetzt werde ich den Druck Zeile hinzufügen, damit wir sehen können. Also lassen Sie mich sagen, printf, sagen wir mal, ich bin hier. Okay, keine Variablen, werden wir es so lassen. Lassen Sie mich wieder zum Laufen zu bringen. Lassen Sie mich re-run Chor. Und komm schon. Keep going. Nebenbei, warum hat es nicht abgestürzt noch? Die Segmentation Fault passiert super schnell vor. [Unverständlich] DAVID J. MALAN: Genau. So ist es braucht Zeit, um zu drucken. 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? Nun, wenn Sie darüber nachdenken, wie den Arbeitsspeicher Ihres Computers gelegt wird, diese passiert 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, Chorus sagen, Chor, Chor, Chor, Chor, Chor, Chor, bis zum Überdruss. Und schließlich, was ist geschehen? Wenn das große Bild wörtlich ist das, was gerade geschieht, konzeptionell? Die Stacküberläufe der Haufen. Oder schlimmer noch, man muss nur alles, einschließlich der Text-Segment, das ist überrannt die Nullen und Einsen, die Ihr Programm vertreten. Kurz gesagt, ist dies nur super, super schlecht. Right? Ihr Programm hat außer Kontrolle geraten. Sie verwenden viel mehr Speicher, als Sie alle gedacht wegen eines läppischen Fehler, in diesem Fall. Oder in diesem Fall, ruft ein sehr bewusst getan Funktion selbst ist. Nun ist dies nicht alles schlecht. Funktionen, die sich selbst tatsächlich hat große Macht wenn Sie es richtig ein. 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 ein grundlegendes Schwäche hier dieses Programms. Also, wo gehen wir mit dieser ganzen Sache? Nun, was ist wirklich passiert? Als ich das Inkrement Funktion aufrufen, wie wir in diesen Beispielen zu tun, Ich habe einen Wert wie 1, dass ich gehe in. Ich gehe in eine Kopie der Nummer eins. So geschieht folgendes. Also lasst uns in die Schrittweite beispielsweise gehen. Und dieser Kerl hier drüben. Also hier ist was tatsächlich passiert. Als ich anrief Inkrement, und ich gebe in x, bildlich, was hier los ist - wenn ich den Wert 1 gespeichert hier haben und ich eigentlich nennen Inkrement, das wird nun Chorus genannt - Ja, das ist warf mich hier ab. So nennen wir diesen Zuwachs. Und wir wissen nicht, was das nächste Funktion geht zu sein. Also, was tatsächlich passiert ist hier irgendwo in main, habe ich ein Stück Speicher, Speichern der Nummer 1 ist. Wenn ich Inkrement nennen, bin ich mit einem anderen Stück Erinnerung, aber jetzt habe ich haben die Kopie des 1. Als ich diesen Wert zu erhöhen, wird das 2 - furchtbar auf die schriftliche Bildschirm hier. Aber dann, was passiert, sobald Inkrement zurückkehrt? Dieser Speicher bekommt nur zurück an das Betriebssystem übergeben, was bedeutet, dass alle Sie getan haben ist nichts nützlich. Die eine, die ursprünglich in den wichtigsten enthielt noch wirklich da ist. Also, wo gehen wir damit um? Nun, es stellt sich heraus, dass im Speicher Sie diese zurück zu Folge wieder zu haben Bytes, die Sie Zeug kann in. Und es stellt sich heraus, dass wir schon etwas, bezieht mit gesehen Dinge, die Rücken an Rücken an Rücken an Rücken. Was ist ein String, am Wochenende ein und jetzt Woche zwei basiert? So ist es nur eine Sammlung von Zeichen. So stellt sich heraus, wie Sie können Nummern in den Speicher zu schreiben, ähnlich wie du kannst setzen Zeichen im Speicher. Und wenn wir damit beginnen, Zeichen im Speicher Rücken an Rücken an Rücken zurück, stellt sich heraus, dass die Verwendung der einfachsten Dinge wie eine for-Schleife oder eine while-Schleife, können wir durchlaufen - von links nach rechts über die Zeichen in einem String - und starten Sie massiert sie in verschiedene Charaktere überhaupt. A könnte B. B könnte C. geworden, so dass letztlich sind wir ein kann Englisch Satz, der tatsächlich Sinn macht und konvertieren jedes dieser Briefe ein zu einer Zeit, zu Fuß durch unsere Computer-Speicher von links nach Recht tatsächlich 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. Also, bevor wir tauchen in bis zu einem gewissen crypto und diese Dinge als Arrays, lassen Sie mich Pause für alle Fragen, weil ich, wie ich Art wirklich verwirrt fühlen, einige diese Themen. Lassen Sie uns also fix jetzt, wenn wir können. So haben wir gerade gesprochen haben Rückgabewerte. Wir sprachen über Argumente. Und wir sprachen über diese Vorstellung, die wir kommen zurück, um in den nächsten Wochen kommen, der sich Speicher als eine ganze Reihe von diesen stacked Tabletts, so zu sprechen. Von unten an aufwärts, so dass jeder Boden, der auf den Stapel gelegt wird repräsentiert Eine Funktion, die ist derzeit genannt. Haben Sie Fragen? So wie über - lassen Sie mich versuchen eine Frage zu stellen. Ich halte verderben, aber jetzt es ist - du hast all das Gesicht des Jungen gesehen. So kommen wir darauf zurück. Also lassen Sie mich eine Frage stellen hier. Lassen Sie mich vereinfachen diese zurück, was es war, bevor einige unserer früheren Q & A. Und die Tatsache, dass Inkrement öffnende Klammer hat, int number, geschlossen Klammer. Was bedeutet int Zahl darstellen? [Unverständlich] DAVID J. MALAN: Ein Argument. Okay, aber was ist ein Argument? [Unverständlich] DAVID J. MALAN: Sorry, was ist das? SPEAKER 3: Etwas passieren Sie in. DAVID J. MALAN: Okay. So etwas, das passieren Sie in. Und ganz allgemein, es ist nur der Eingang. Wenn Sie eine Funktion schreiben und diese Funktion den Zweck im Leben sind ist zu tun etwas ein wenig anders, jedesmal wenn Sie es verwenden, dann besteht der einzige Weg für das wirklich passieren würde zu sein scheinen, um es mit Input versorgen, so dass es kann etwas anderes mit diesem Eingang zu tun jeder Zeit. So müssen Sie zwei Dinge festlegen, wann eine Funktion übernimmt Eingänge. Sie müssen den Namen, die Sie an diesem Eingang geben, rein geben eigene Bequemlichkeit, so dass Sie es in der Funktion verweisen, die Sie Sie sind schriftlich, 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, müssen Sie den Computer zu sagen, was Datentyp ist es, zu einem großen Teil, so dass es weiß, wie viele Bits zum Zuweisung für diese Variable. Da könnte es sechs sein - sorry, wird es nicht sechs sein. Es kann 16 sein. Es können 8 sein. Es kann 32 sein, sogar 64. Aber der Computer wissen muss. Nun ist die int auf der linken Seite darstellt, was hingegen? [Unverständlich] DAVID J. MALAN: Was ist das? [Unverständlich] DAVID J. MALAN: Der Typ der Funktion und, genauer gesagt, die Typ von seinem Ausgang. Right. Während also die Sache in Klammern stellt seinen Eingang, falls vorhanden, die was zu 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 auf der rechten Seite des Schlüsselwortes wieder ein integer, 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, wie zu dem, was wir sind zurück und dann tatsächlich über die Rückkehr zu gehen. Und dann, um ein bisschen mehr klar, dass der Kontext - da ist er wieder. Der Kontext - große Überraschung kommt in einem Moment. Der Kontext jetzt hier ist, dass den Arbeitsspeicher Ihres Computers ist, wieder ein Gigabyte, zwei Gigabyte, was auch immer. Vielleicht ist es mehr. Vielleicht ist es weniger. Aber der Computer sieht es als mit unterschiedlichen Abschnitten. Irgend etwas geht da unten. Etwas anderes geht da oben. Verschiedene Zeug geht in der Mitte. Und heute haben wir gerade anfangen erzählt diese Geschichte. Aber kommen wir zurück zu dieser Zeit. Denn jetzt ist das einzige Stück der Erinnerung uns wirklich wichtig das Textsegment weil die gerade vertritt die Nullen und Einsen das Clang hat ausgegeben. Also, wenn Sie einen Befehl ausführen an der Tastatur wie a.out, oder Sie doppelklicken Klicken Sie auf ein Symbol auf Mac OS oder Windows, ist Ihr Programm von der Festplatte geladen fahren in RAM. Und es ist an der Spitze der Arbeitsspeicher Ihres Computers plumpste, so zu sprechen. Jetzt mittlerweile, wie Ihr Programm beginnt zu laufen und wichtigsten wird in die aufgerufene Programm, das Sie geschrieben oder das Programm Microsoft oder Apple schrieb einer ihrer lokale Variablen am Ende dort unten an der Unterseite Ihres Computers. Aber wenn Haupt eine andere Funktion aufruft, dass selbst Variablen oder Argumente, landen sie darüber. Und wenn diese Funktion nennt etwas, landen sie darüber, darüber, darüber. Und nur einmal eine Funktion erfolgt Ausführen funktioniert 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 rufen Sie Inkrement - Sie in einer Kopie des Wertes vorbei. Und was das bedeutet bildlich ist, dass Sie buchstäblich Schreiben der Nummer 1 in einem anderen Teil des Speichers, verändert, daß 1 bis 2, im Fall von Schrittweite - oder einem 8, bei Würfels - und dann wirft diesen Speicher entfernt, sobald die Schrittweite bzw. des Würfels Funktion zurückkehrt. Frage. [Unverständlich] DAVID J. MALAN: Wo - globale Variablen in, was gespeichert werden derzeit als die initialisierten Daten oder initialisierte Daten. Der Unterschied ist, wenn Sie eine globale Variable haben, und weisen Sie sofort ein Wert mit dem Gleichheitszeichen, landet es an der Spitze gibt. Und wenn Sie nur sagen, int x Semikolon ohne Wert, landet es leicht niedriger RAM einfach durch Konvention. Andere Fragen. Gut. So Dieses Bild wird wieder kommen, wie wir stärker mit dem, was wir tun können, erhalten mit dem Computer. Aber jetzt lassen Sie uns eine kurze Einführung in die Kryptographie, eine bestimmte Art von Kryptographie, nicht lösen alle Probleme der Welt aber zu lösen einige von ihnen. In diesem Fall hier haben wir etwas namens geheimen Schlüsseln. Und geheimen Schlüsseln, wie der Name schon sagt, stammt seine Sicherheit von einem Geheimnis. So zum Beispiel, wenn Sie zurück in der Grundschule sind und Sie Übergabe eines kleines Geheimnis Liebesbrief an den Jungen oder Mädchen, das du auf das Brechen werden - wenn Sie wollte, dass durch das Publikum passieren, würden Sie wahrscheinlich nicht schreiben wie eine Notiz in Englisch oder was auch immer Ihre Muttersprache ist, sondern Sie könnte es zu 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, so dass Ihre Freunde und Lehrer weiß nicht, was du schreibst, könnte man sich mit einem relativ einfachen Algorithmus - junge, obwohl Sie vielleicht - nur kriechen die Worte. So anstelle des Schreibens A, könnte man B. Statt B schreibt, schreibt man C. Statt C, schreibt man D, und so weiter. Oder Sie könnten sich mit einem komplexeren Übersetzung von Briefen unterschiedliche Buchstaben. Aber der Haken ist, der Junge oder das Mädchen, dem Sie senden diese Notiz muss etwas wissen. Welches ist, was offensichtlich? Wie, was Ihr Geheimnis ist. Wie, was ist das Mapping zwischen As und Bs und Cs und Ds? Ist es einfach nur mit ein, so zu sprechen, zu jedem der Briefe aus gehen A nach B zu B C? Ist es komplizierter als das? Also, du und dein Schwarm müssen diese geheimen Informationen haben. Aber es gibt eine Art catch-22 hier. Wenn dies das erste Mal, Sie senden diesen Liebesbrief durch die Klasse, wie das Junge oder ein Mädchen zu wissen, was das Geheimnis ist sogar? So geheimen Schlüssel Krypto löst nicht alle Probleme der Welt. Und es gibt tatsächlich eine Beziehung, dass wir kommen zurück in Richtung Semester Ende. Ebenso haben keiner von uns wohl jemals gesendet a - ähnlich, die meisten von uns nicht wissen, dass jemand arbeitet zum Beispiel bei Amazon.com. Und doch haben viele von uns wahrscheinlich Zeug bei Amazon.com gekauft. Und wir haben gelernt, davon ausgehen, dass diese E-Commerce Transaktionen sicher sind. Right? Die URL sagt wohl https. Es ist vielleicht eine dumme kleine Schloss-Symbol irgendwo. Es ist 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 nicht weiß jemand bei Amazon, und ich habe sicherlich nicht jede Art von angeordnet Geheimnis mit jemandem bei Amazon, wie wird mein Computer oder mein Browser dies zu tun? Nun, stellt sich heraus, es gibt andere Arten der Kryptographie überhaupt, dass zu lösen das Problem. Aber für heute, werden wir auf die einfache eins, wo man gerne im Fokus voranzutreiben, um ein Geheimnis wissen, wie plus 1 oder eine Zuordnung zwischen As und Bs. Und das Verfahren der Kryptographie Regel handelt es sich dabei. Sie haben einige Klartext, hier auf der linken Seite dargestellt. Sie führen sie 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 Chiffretext. Inzwischen einmal dein Schwarm das Geheimnis Note empfängt, hat er oder sie dann entschlüsseln durch allgemein die Umkehrung dieses Algorithmus so zu erhalten Sichern des Klartext. Nun gibt es physischen Inkarnationen dafür. 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 an der Innenseite, gibt es tatsächlich einige Zahlen, so daß mit diesem Ring, können Sie Art drehen außerhalb aber nicht das Innere, um Line-Up Zahlen mit Buchstaben. Und in dem Clip, du bist zu zu sehen - von denen einige Sie schon 24/7 haben um die Weihnachtszeit von einem Film namens A Christmas Story. Du wirst sehen, dass kleine Ralphie war so eifrig, um herauszufinden, was kleine Waise Annies geheime Botschaft war für ihn, dass mitgeteilt worden sei, glaube ich, in der Form von numerischen Nachrichten auf einem seriellen Box. Und man musste all die kleinen Karten, die kamen sammeln in der Cornflakes-Packung. Sie hatten, sie zu versenden in. Sie hatten, um wieder das Geheimnis Decoder Ring, so dass man endlich herausfinden herauszufinden, was die Zuordnung zwischen Buchstaben und Zahlen, oder Buchstaben und Buchstaben. So gebe ich Ihnen diesen kurzen Clip aus einer Weihnachtsgeschichte pset 2 motivieren und unsere Diskussion, in einem Augenblick, von Arrays. Also hier haben wir Ralphie. [VIDEO PLAYBACK] -Sei es allen und jedem bekannt, dass Ralph Parker wird hiermit ernannt Mitglied der Little Orphan Annie Secret Circle und alle Titel die Ehren und Vorteile auftretenden dazu. -Signed, Little Orphan Annie. Gegengezeichnet, Pierre Andre! In Tinte! Ehrungen und Leistungen, bereits im Alter von neun Jahren. Komm, lasst uns mit ihm zu bekommen. Ich brauche nicht all that jazz über Schmuggler und Piraten. -Listen morgen Abend für die abschließende Abenteuer The Black Pirate Ship. Jetzt ist es Zeit für die geheime Botschaft Annies für Sie Mitglieder des Secret Circle. Denken Sie daran, Kinder, können nur Mitglieder der Secret Circle Annies dekodieren Annie geheime Nachricht. Denken Sie daran, Annie auf Sie. Stellen Sie Ihre Stifte B2. Hier ist die Botschaft. 12, 11 - -Ich bin in meinem ersten geheimen Treffen. -14, 11, 18, 16 - -Pierre war in großer Stimme heute Abend. Ich könnte sagen, dass die heutige Nachricht wirklich wichtig war. -3, 25. Das ist eine Nachricht von Annie sich. Denken Sie daran, es niemandem erzählen. -90 Sekunden später bin ich in der einzige Raum im Haus, wo ein Junge von neun könnte Privatsphäre und decode sitzen. Aha, ging B. ich zum nächsten. E. Das erste Wort ist. S. war es einfacher jetzt kommen. U. -Oh, komm schon, Ralphie. Ich muss gehen. -Ich gleich runter, ma. -Gee Whiz. -T, Be O. sicher. Achten Sie darauf, was? Was war Little Orphan Annie versucht zu sagen? Achten Sie darauf, was? -Ralphie! Randy hat zu gehen. Würdest du bitte raus? -Gut, ma. Ich werde direkt aus sein. -Ich war immer näher. Die Spannung war schrecklich. Was war es? Das Schicksal des Planeten kann in der Schwebe. -Ralphie! Randy muss doch gehen. -Ich direkt aus sein, für crying out loud. -Gee, fast da. Meine Finger flogen. Mein Geist war ein Stahl-Falle. Jede Pore vibrierte. Es war fast klar. Ja, ja, ja, ja. -Achten Sie darauf, Ihren Ovomaltine trinken. Ovomaltine? A miesen Geschäfte? Son of a bitch. [END VIDEO PLAYBACK] DAVID J. MALAN: So, da haben wir Kryptographie. So wie in einem Computer können wir über die Umsetzung zu gehen oder was Dinge wie diese? Nun, wir müssen einen Weg auszudrücken uns ein wenig flexibler 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, äußern Dinge wie Wörter und Sätze und Phrasen. In der Tat haben wir solche Dinge Strings genannt. Aber wir versprochen, dass dies wirklich nur eine Vereinfachung der CS50 Bibliothek, die wir zu schälen zurück wollen. Und so beginnen wir, dass hier tun. Lassen Sie mich gehen Sie vor und öffnen einer Datei - Alle diese Dateien sind wie gewohnt zur Verfügung online - genannt array.c ein Problem nicht mit Saiten zu lösen, sondern dass malt ein Bild hier, wie wir vielleicht etwas zu verwenden als ein Array. Ein Array ist ein Datentyp. Es ist eine Art von Variablen, von Sorten, das hat mehrere kleinere Datentypen innen von ihr Rücken an Rücken an Rücken an Rücken. So zum Beispiel, wenn wir wollen ein kleines Programm, das Ihnen schreiben Sie Ihre quiz Durchschnitt für einen Kurs wie 50, das zwei Tests, man konnte sehr leicht Schreiben Sie dieses Programm - basierend auch auf einige der letzten Woche Material - 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, das fragt umsetzen Benutzer für zwei Quiz Partituren und berechnet dann ihre durchschnittliche indem Sie sie zusammen, durch zwei geteilt, und dann Drucken der Ergebnisse. Wir könnten wahrscheinlich tun ziemlich leicht jetzt nach eine gewisse Anzahl von Minuten. Aber das Problem ist, dass anzunehmen, dass 50 drei hatten Quiz oder vier. Angenommen, Sie möchten das gleiche Programm für eine Klasse, musste verwenden wollte wöchentliche Quiz. Denken Sie über eine Klasse, die wöchentliche Quiz hat. Wenn es wie 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 Code, sollte es zu starten, damit Sie wünschte, es gäbe einen besseren Weg. Und glücklicherweise, denn von Arrays, die es gibt. 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 bei der Erstellung eines konstant ist, alle Kapital zu nutzen Briefe, gerade so, dass es wirklich steht in Ihrem Code. Und das besondere Schlüsselwort, das Sie in C # definieren. Also, wenn Sie sagen, # define, dann ein Leerzeichen, dann das Wort, das Sie verwenden wollen Namen der Konstanten, und dann wird der Wert der Konstante. So Ankündigung, unterscheidet sich dies von Zuordnen von Daten zu einer Variablen. Es gibt keine Gleichheitszeichen. Es gibt kein Semikolon. Dies ist, was allgemein als Präprozessordirektive bekannt, aber mehr auf dass eine andere Zeit. Denn jetzt, schafft dies eine unveränderliche Wert namens QUIZZES deren tatsächliche numerischen Wert gleich 2 ist. So überall Quizzes zu sehen, Quiz, Quizfragen in diesem file, das ist nur die Nummer 2. Nun, wenn ich an Haupt jetzt aussehen, mal sehen, wie das funktioniert. Zunächst sieht es ein wenig kryptisch. Aber es ist alles Sachen von Wochen ein. Bitten Sie den Benutzer für die Klassen. Wie machen wir das? Nun, in Zeile 22 - das ist wirklich der saftigen Teil - Ich erkläre einen Schwimmer, aber nicht nur ein einzelner Schwimmer. Ich erkläre, sondern eine Reihe von Fließkommazahlen. Diese Variable wird als Noten, da hier implizierte. Aber das einzige Stück neue Syntax dann sind diese eckigen Klammern, die Tatsache, dass ich dem Schwimmer-Typen und dann Klammer und dann eine Nummer. Hinweis, wenn dies eine Konstante ist, ist dies nur, wie wir das getan haben. Dies bedeutet, hey Computer, geben Sie mir zwei Schwimmern, und lassen Sie uns gemeinsam rufen sie Noten. Dies steht im Gegensatz zu einer viel mühsamer Prozess wie diese. Float grade1 schweben grade2, und so weiter. So ein Array ermöglicht es uns, diese Idee umzusetzen, aber viel weniger messily, in eine solche Weise, dass wir eine Codezeile anstatt eine etwa 16 für ein 16 Woche Semester. So wollte ich nicht zu hart-Code 2, denn wenn man jetzt darüber denken logisch - wohl im nächsten Jahr CS50 Änderungen 3 Quiz statt. Und ich hatte die Nummer 2 hier. Ich hatte die Nummer 2 hier. Ich hatte die Nummer 2 hier. Ich hatte die Nummer 2 hier. Es wird sehr mühsam und sehr einfach zu vermasseln und versehentlich ändern ein Wert auf 3 und verpassen einen anderen Wert von 2. Also ich bin, anstatt abstrakte gehen diese weg und verwenden Sie diese Konstante, die, wie der Name vermuten lässt, ändert sich nie. Und jetzt, Quiz, egal ob wir anders haben dieses oder nächstes Jahr, ich müssen es nur an einer Stelle ändern, hier oben an der Spitze. Damit ist alles konstant ist. Inzwischen ist die neue konzeptionelle Merkmal, dass eines Arrays. So die eckigen Klammern geben mir so viele Schwimmer und lässt mich zusammen nennen sie 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 Quiz statt eines hartcodierte Nummer. Aber es gibt nichts intellektuell dort anders aus der vergangenen Woche. Dies ist nur printf. So printf ("Quiz-Nummer% d von% d"), weil ich einfach ausdrucken möchten mir quiz Nummer eins von zwei und dann zwei von zwei. Das ist also eine rein ästhetische Sache. Aber der interessante Teil ist jetzt in Zeile 27. Um in einer der zwei Platzhalter mit einem Floating-Point füllen Wert, Sie wieder in eckige Klammern. In diesem Fall bin ich mit i, weil diese for-Schleife mit i gleich begonnen hat Welchen Wert, offenbar? 0. Also bei der ersten Iteration dieser Schleife, ist es, als ob ich schrieb im Code. Aber auf der zweiten Iteration dieser Schleife ist es, als ob ich schrieb in meinem Code. Aber die Tatsache, dass ich mit einer Variablen ist perfekt, weil, wie der Name schlägt, ist es unterschiedliche seinen Wert bei jeder Iteration. Also ich bin Ausfüllen dieses Array einer Stelle zu einer Zeit. Was bedeutet das Array aussehen? Nun, der Grund zog ich diese super einfaches Rechteck auf dem Bildschirm hier zuvor 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, in diesem Fall hier, ich würde tun Eingabe in my quiz Partituren, wie hier. Ich bekam 100 auf diesen einen. Und dann bekam ich eine 99 in diesem Fall. Dann diese Erinnerung vielleicht gar nicht benutzt, weil ich nur gefragt habe werden die Computer für ein Array der Größe 2. Diese Plätze sind immer noch da. Right? Sie haben noch zwei Gigabyte RAM, auch wenn Sie nur sind bat um zwei Schwimmern. 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 derer man die Dinge richten kann. Jetzt in diesem Fall zu tun, dann nur einige langweilige Arithmetik. Wenn ich hier unten scrollen, das ist, wo ich über das Array dann durchlaufen. Ich komme mit der Summe aller Werte im Array. Und dann habe ich mit der Funktion round hier, um tatsächlich die Zusammenfassend geteilt durch Quizfragen. 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, geteilt durch 2, und dann Druck es 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. Und vergib den Einzug für jetzt. 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 es einen String, erzählt er Sie, wie viele Zeichen in diesem String. Das ist alles. Die Tatsache, dass es strlen anstelle von String-Länge ist nur, weil es prägnanter. Vor 30 Jahren, mochte die Menschen, die Dinge so knapp wie möglich zu schreiben. So haben wir diese Konvention halten hier. i + + bedeutet nur erhöhen i in jeder Iteration. Und nun merkt das, das ist wirklich interessant. So in Zeile 24, sage ich Computer, gib mir ein Zeichen, acht Bits, und nennen es c. Aber was ist das auf der rechten Seite sagen? In Englisch, was bedeutet, dass vertreten? [Unverständlich] DAVID J. MALAN: 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 sind Zählen von 0. Sie haben noch kein Ermessen jetzt an, dies zu tun. Jetzt haben Sie in Übereinstimmung mit dem Computer die Erwartungen verhalten und zählt von Null, da [0] wird der erste sein 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 machen string1. Und jetzt laufe ich string1 in meinem Terminal-Fenster. Es ist eine Eingabe wartet, so werde ich in, sagen wir, David geben. Enter. Und jetzt ist es druckt DAVID alle auf verschiedenen Linien, weil bemerken, was ich tue. Ich bin Drucken ein Zeichen in einer Zeit. Jetzt werden wir nicht ins Detail gehen heute zu diesem Thema. Aber ich vorhin dieser Prüfung hier gelöscht. Es stellt sich heraus, dass, wenn der Benutzer fehlverhaltenden, kontradiktorische oder einfach verwirrt, kann man eigentlich nicht um eine Reihe von einiger Länge geben. Wenn Sie die falsche Taste drücken auf der Tastatur, können Sie geben, keine Zeichenfolge überhaupt. Oder wenn Sie bösartige sind, könnten Sie versuchen, in einem Gigabyte im Wert von einer fügen Essay zu diesen String zu füllen. Und wenn der Computer über genügend Arbeitsspeicher ausgeführt, stellt sich heraus, dass wir gehen um wieder diesen besonderen Wert namens null. So jetzt wissen nur, dass es diese besondere Wert namens null, dass wird es uns ermöglichen 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 Nullen, so dass wir über jene andere Zeit sprechen kann. Aber was ist anders an der for-Schleife dieses Mal? Und ich kann zurück zu dem vorherigen Beispiel. Also das ist die zweite Version. Dies ist die Version ein. Eins, zwei, eins zwei. Also das strlen Anruf ist wo? Es ist im ersten Teil der for-Schleife. Irgendwelche Gedanken, warum ich das tue? Yeah. [Unverständlich] DAVID J. MALAN: Also haben wir nicht rufen Sie 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 Zustand, und das Update. Das Problem ist, dass die Bedingung auf jeden Fall Iteration der Schleife. Und so in diesem Beispiel hier ist das, was schlecht über die Tatsache, dass dies mein Zustand? Du nennst strlen wieder und wieder und wieder. Aber sobald ich in DAVID eingegeben, ist die Länge der Zeichenkette fünf. 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 ein zu zunehmend wichtige Idee als Design-Entscheidung bekannt, wo - nur nicht machen den Computer zu tun unnötige Arbeit. Wie nun eine Vorschau auf pset 2, pset 2 in der Standard Edition ist werde dich herausfordern tatsächlich umzusetzen gewisse Anzahl von Ziffern, einige Anzahl der Verschlüsselungs-Algorithmen, so dass Sie sowohl verschlüsseln und entschlüsseln geheime Botschaften, ähnlich wie das ein Ralphie dort decodiert. In der Hacker-Ausgabe pset 2, werden wir noch ein wenig weiter gehen. Wir gehen Hand Sie eine Datei von einem tatsächlichen Computer-System, das a enthält ganze Reihe von Benutzernamen und tatsächlichen verschlüsselte Passwörter und die Herausforderung Für die Hacker Edition wird es sein, die Passwörter und Gestalt zu knacken was Kryptographie oder welches Geheimnis wurde tatsächlich verwendet erzeugen die Passwörter. Und wir werden dies durch den Einsatz einer neuen Funktion hier C, dass ich gebe zu tun Sie nur eine Demo, wie Befehlszeilenargumente bekannt. So 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, die Sie nach Typ 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, etwas wie dieses. Wenn ich argv1 zu machen, ist das ein Beispiel wir wieder kommen 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 Worte, die der Benutzer gewinnen wird eingegeben an der Eingabeaufforderung ist durch Änderung main, ab diesem Wochenende, von int main (void) auf int main (argc, argv). Und so wird Befehlszeilenargumente geboren werden. Und wenn Sie wirklich anspruchsvolle bekommen an dieser, werden Sie in der Lage sein zu schreiben wirklich trippy Programme wie dieses hier, das darüber hinaus 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 uns am Montag sehen.