1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [Woche 2, Fortsetzung] 2 00:00:02,270 --> 00:00:04,220 [David J. Malan, Harvard University] 3 00:00:04,220 --> 00:00:06,880 [Dies ist CS50. - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 Gut. Dies ist CS50, und das ist das Ende der Woche 2. 5 00:00:10,990 --> 00:00:14,410 Wenn Sie erwarten, dass um diese Zeit hungrig morgen 6 00:00:14,410 --> 00:00:18,620 wissen, dass wir gehen, um als eine kleine Gruppe von morgen, Donnerstag, 13.15 Uhr einberufen. 7 00:00:18,620 --> 00:00:21,360 Es gibt diese URL hier, wenn Sie möchten, RSVP. 8 00:00:21,360 --> 00:00:26,740 Die Plätze sind begrenzt, also bitte verzeihen, wenn das Formular von der Zeit, die Sie füllen Sie dieses ausgefüllt. 9 00:00:26,740 --> 00:00:29,300 Ein weiterer URL, obwohl, die von Interesse sein könnte, ist dies. 10 00:00:29,300 --> 00:00:32,369 In knapp einem Monat wird der Kurs werde zur Verfügung gestellt werden 11 00:00:32,369 --> 00:00:36,890 umso breiter über EDX, über die Leute auf dem Internet können zu folgen, 12 00:00:36,890 --> 00:00:39,380 greifen in die natürlich recht aktiv, in der Tat. 13 00:00:39,380 --> 00:00:42,270 Sie werde mit Diskutieren Sie das CS50 Appliance und CS50 14 00:00:42,270 --> 00:00:45,490 und die meisten der verschiedenen Software-Tools, die wir bereits haben mit diesem Semester. 15 00:00:45,490 --> 00:00:48,710 Und eine der Initiativen, die wir gerne annehmen als ein Experiment in diesem Jahr würde 16 00:00:48,710 --> 00:00:51,930 ist zu sehen, wie viel Inhalte können wir übersetzen 17 00:00:51,930 --> 00:00:53,960 in andere Sprachen und Schriften. 18 00:00:53,960 --> 00:00:57,500 Also, wenn Sie vielleicht Interesse an einer Teilnahme an diesem Projekt 19 00:00:57,500 --> 00:01:02,270 wobei wir Deutsch Transkripte und Untertitel für den Kurs Vorlesungen bieten 20 00:01:02,270 --> 00:01:05,450 und Shorts und Seminare und Abschnitte und dergleichen, 21 00:01:05,450 --> 00:01:08,200 wenn Sie sprechen fließend oder schreiben fließend eine andere Sprache, 22 00:01:08,200 --> 00:01:12,290 wir würden uns freuen, Sie in diesem Projekt engagieren, wobei nehmen Sie an einem oder mehreren der Videos, 23 00:01:12,290 --> 00:01:15,200 deren Umsetzung in einer Sprache, die Sie wissen sehr gut. 24 00:01:15,200 --> 00:01:18,700 >> Um Ihnen einen Eindruck von der Schnittstelle, gibt es diese web-basierte Benutzeroberfläche 25 00:01:18,700 --> 00:01:22,090 dass wir verwenden, dass im Wesentlichen eine UI wie diese. 26 00:01:22,090 --> 00:01:24,290 Dies wurde mir lehren einige Halloween vor 27 00:01:24,290 --> 00:01:27,390 und auf der rechten Seite gibt in schwarz neben diesen Zeitstempel, 28 00:01:27,390 --> 00:01:31,210 Sie sehen die verschiedenen Dinge, die aus meinem Mund kam an diesem Tag, 29 00:01:31,210 --> 00:01:34,850 und dann unter ihm werden Sie in der Lage, in eine andere Sprache zu übersetzen 30 00:01:34,850 --> 00:01:38,690 Genau das Mapping zwischen, in diesem Fall ist, sagen Englisch und,, Spanisch. 31 00:01:38,690 --> 00:01:40,440 Also ist es eigentlich ein sehr benutzerfreundliches Tool. 32 00:01:40,440 --> 00:01:43,370 Sie können zurückspulen und vorspulen sehr leicht mit Tastenkombinationen. 33 00:01:43,370 --> 00:01:47,490 Also, wenn Sie möchten, an diesem Experiment teilzunehmen und haben Ihre Worte gesehen und gelesen 34 00:01:47,490 --> 00:01:51,850 von potenziell Tausende von Leute da draußen, bitte fühlen Sie sich frei zu beteiligen. 35 00:01:51,850 --> 00:01:54,350 Ein Wort noch zu dem Kätzchen von Montag. 36 00:01:54,350 --> 00:02:00,350 Damit wir eine allzu beängstigend Nachricht gesendet haben, tun Sie erkennen, dass, wie der Bürozeiten vorschlagen 37 00:02:00,350 --> 00:02:03,300 und als Abschnitte nahelegen, ist die Gestaltung des natürlich sehr 38 00:02:03,300 --> 00:02:07,360 zu haben Schüler zusammen und reden zu arbeiten durch Problem-Sets 39 00:02:07,360 --> 00:02:11,260 und Probleme gemeinsam, und wirklich die Linie kommt nur auf, 40 00:02:11,260 --> 00:02:16,010 hier sollte die Arbeit, die Sie letztendlich reichen Sie Ihre eigenen. 41 00:02:16,010 --> 00:02:18,860 Und so ganz ehrlich, in der Bürozeiten ist es völlig normal, 42 00:02:18,860 --> 00:02:22,240 es ist ganz noch erwarten, mit irgendeinem Freund neben dir zu plaudern. 43 00:02:22,240 --> 00:02:24,370 >> Wenn er oder sie wird mit einer gewissen Thema zu kämpfen und du bist wie, 44 00:02:24,370 --> 00:02:27,940 "Oh, na ja, lassen Sie mich Ihnen einen Einblick in einige Code-Zeile, die ich schrieb," das ist in Ordnung, 45 00:02:27,940 --> 00:02:31,250 das passiert, und das ist sehr viel förderlich, denke ich, mit dem Prozess des Lernens. 46 00:02:31,250 --> 00:02:36,750 Wo die Linie wird überschritten ist, wenn der Kopf ist eine Art gekippt hier viel zu viele Sekunden 47 00:02:36,750 --> 00:02:41,160 oder Minuten für diese wirklich nur gewesen eine Entsperrung Gelegenheit für Ihre Freundin, 48 00:02:41,160 --> 00:02:44,160 und sicherlich, wenn die Dinge zu bekommen per E-Mail und Dropbox und dergleichen ausgetauscht, 49 00:02:44,160 --> 00:02:45,640 auch dort ist die Linie. 50 00:02:45,640 --> 00:02:48,620 So mit allen Mitteln sich wohl fühlen und sich ermutigt fühlen, mit Freunden chatten 51 00:02:48,620 --> 00:02:52,810 und Klassenkameraden zu pset und immer nur erkennen, dass das, was Sie letztendlich einreichen 52 00:02:52,810 --> 00:02:57,340 sollte wirklich das Produkt deiner Schöpfung und nicht jemand anderes zu sein. 53 00:02:57,340 --> 00:03:00,490 Und so einer der Domain-spezifische Probleme für pset2, 54 00:03:00,490 --> 00:03:04,740 was kommt spät morgen Abend, ist in der Welt der Kryptographie tauchen, 55 00:03:04,740 --> 00:03:08,970 das ist die Kunst der Verschlüsselung oder Scrambling Informationen 56 00:03:08,970 --> 00:03:12,600 was letztlich bezieht sich auf die Welt der Sicherheit. 57 00:03:12,600 --> 00:03:16,560 Jetzt kommt Sicherheit für die meisten von uns in Form von ziemlich banalen Mechanismen. 58 00:03:16,560 --> 00:03:19,050 Alle von uns haben Benutzernamen und Passwörter, 59 00:03:19,050 --> 00:03:23,450 und wir alle haben sehr schlechte Benutzernamen und Passwörter, am wahrscheinlichsten. 60 00:03:23,450 --> 00:03:28,240 >> Wenn Sie Ihr Passwort ist das gleiche auf mehreren Websites, das ist wahrscheinlich nicht die beste Idee, 61 00:03:28,240 --> 00:03:30,070 Als wir in Richtung Semester Ende zu diskutieren. 62 00:03:30,070 --> 00:03:34,720 Kein Witz - - Wenn Sie Ihr Passwort auf einem Zettel geschrieben auf Ihrem Monitor, 63 00:03:34,720 --> 00:03:38,350 auch das ist nicht unbedingt die beste Design, sondern eine ganz gewöhnliche Erscheinung. 64 00:03:38,350 --> 00:03:42,470 Und wenn Sie sie nicht verwenden Kryptografie, um Ihre Passwörter zu verschlüsseln, 65 00:03:42,470 --> 00:03:44,210 sie sind besonders gefährdet. 66 00:03:44,210 --> 00:03:47,270 Also, wenn Sie denken, dass Sie als Super-clever einen versteckten Word-Dokument 67 00:03:47,270 --> 00:03:49,910 irgendwo auf Ihrer Festplatte, verfügt über alle Ihre Passwörter 68 00:03:49,910 --> 00:03:53,670 aber es ist in einem Ordner, niemand wird in schauen, das ist auch nicht sehr sicheren Mechanismus. 69 00:03:53,670 --> 00:03:56,990 Und so was pset2 einführen ist diese Kunst der Kryptographie 70 00:03:56,990 --> 00:04:02,010 und Scrambling Informationen, so dass Dinge wie Passwörter umso sicherer sind. 71 00:04:02,010 --> 00:04:05,790 Der Kontext ist hier, dass mit unsicheren Daten 72 00:04:05,790 --> 00:04:07,930 kommt eine Gelegenheit, es zu verschlüsseln und zu verschlüsseln ist. 73 00:04:07,930 --> 00:04:11,470 Und so ist dies, zum Beispiel, das ein Beispiel einer verschlüsselten Nachricht. 74 00:04:11,470 --> 00:04:14,700 Das sagt eigentlich etwas auf Englisch, aber es ist eindeutig nicht ganz klar. 75 00:04:14,700 --> 00:04:18,279 Und wir werden der Kreis heute auseinander zu necken, was diese geheime Botschaft hier ist. 76 00:04:18,279 --> 00:04:23,490 Aber in der realen Welt der Computer, die Dinge nicht selbst schauen, wie sie englische Phrasen sein könnte. 77 00:04:23,490 --> 00:04:28,430 Zum Beispiel ist es das, was Sie vielleicht auf einem Standard-Linux-oder Mac-oder UNIX-Computer zu finden 78 00:04:28,430 --> 00:04:32,070 in einer Datei, war einmal eine Zeit, als die Passwort-Datei. 79 00:04:32,070 --> 00:04:34,200 >> Heutzutage ist es an anderen Orten verschoben worden. 80 00:04:34,200 --> 00:04:39,210 Aber wenn Sie an der richtigen Stelle auf einem System anschauen, werden Sie sehen, nicht nur Ihren Benutzernamen 81 00:04:39,210 --> 00:04:43,400 oder dass andere Menschen auf dem System, aber du wirst eine verschlüsselte Version des Kennworts zu sehen. 82 00:04:43,400 --> 00:04:47,980 Tatsächlich schlägt das Wort Krypta, dass die folgenden Dinge verschlüsselt ist, 83 00:04:47,980 --> 00:04:52,680 und diese Reihe von scheinbar zufälligen Buchstaben und Zeichen und Zahlen und so weiter 84 00:04:52,680 --> 00:04:56,480 kann nur durch allgemein wissen, ein Geheimnis entschlüsselt werden - 85 00:04:56,480 --> 00:04:58,840 eine geheime Wort, eine geheime Zahl - 86 00:04:58,840 --> 00:05:03,160 und so in der Tat, um die Kunst der Kryptographie letztlich darauf irgendeiner Art vertrauen 87 00:05:03,160 --> 00:05:05,650 und zu wissen, dass jemand etwas anderes nicht. 88 00:05:05,650 --> 00:05:10,090 Also werden wir dies ein wenig genauer zu erforschen heute und in der pset zu kommen. 89 00:05:10,090 --> 00:05:12,200 Und nun ein Wort zu Pass / Fail. 90 00:05:12,200 --> 00:05:15,360 Zumal einige von euch haben in pset1 die Appliance getaucht, 91 00:05:15,360 --> 00:05:19,080 und eine ganz neue Welt für sich erkennen, dass Frustration und Verwirrung 92 00:05:19,080 --> 00:05:21,700 und nur technischen Schwierigkeiten sind recht zu erwarten, 93 00:05:21,700 --> 00:05:24,180 vor allem mit dem ersten pset, wo es ist einfach so viel Neues, 94 00:05:24,180 --> 00:05:27,730 gerade erst mit ls und cd vertraut und alle diese geheimnisvollen Befehlen 95 00:05:27,730 --> 00:05:33,050 und eine neue Umgebung, und das ist getrennt von der eigentlichen materiellen und Programmierung selbst. 96 00:05:33,050 --> 00:05:36,940 So ist es auch klar, dass es sicherlich Bürozeiten, die als Tragkonstruktion bestehen. 97 00:05:36,940 --> 00:05:38,880 >> Abschnitte beginnen am kommenden Sonntag. 98 00:05:38,880 --> 00:05:42,960 Aber am wichtigsten ist, wenn du fühlst nur, dass dies nicht die Welt für Sie, 99 00:05:42,960 --> 00:05:44,710 erkennen, dass es wirklich nur die Zeit nehmen. 100 00:05:44,710 --> 00:05:48,600 Und gäbe es nicht diese Gelegenheit Jahren für mich unter einer Klasse Pass / Fail, 101 00:05:48,600 --> 00:05:50,990 ehrlich gesagt, ich würde nie selbst gesetzt haben, einen Fuß in die Klassenzimmer. 102 00:05:50,990 --> 00:05:53,690 Und Sie können diese Einstellung ändern, bis, sagen wir, der fünfte Montag des Kurses, 103 00:05:53,690 --> 00:05:58,280 Wenn Sie also auf der Kante zeigen, erkennen, dass anstatt den Kopf in einigen anderen Gewässern überhaupt, 104 00:05:58,280 --> 00:06:01,260 Sie sicherlich in Betracht ziehen nur die Änderung zu Pass / Fail. 105 00:06:01,260 --> 00:06:04,570 Auch hier gibt es nicht wirklich diese Kultur hier in Harvard die Dinge Pass / Fail 106 00:06:04,570 --> 00:06:08,670 da jeder wirklich will, um zu erreichen oder overachieve, 107 00:06:08,670 --> 00:06:11,130 aber ehrlich gesagt, dies ist ein wunderbarer Weg, zu versuchen, etwas aus 108 00:06:11,130 --> 00:06:16,720 die vielleicht nicht kennen Sie, und Sie werden am Ende tut, in den meisten Fällen sehr gut, 109 00:06:16,720 --> 00:06:18,210 vielleicht viel zu Ihrer Überraschung. 110 00:06:18,210 --> 00:06:20,980 Und noch konkreter, was ich denke, Pass / Fail-Regel der Fall ist, 111 00:06:20,980 --> 00:06:22,940 vor allem, wie Sie vielleicht mit pset0 erlebt haben, 112 00:06:22,940 --> 00:06:26,560 wenn Sie legte in 10 Stunden, 15 Stunden, 25 Stunden in eine pset 113 00:06:26,560 --> 00:06:29,920 und du bist nur dem Kopf gegen die Wand und es wird immer Super spät in die Nacht 114 00:06:29,920 --> 00:06:33,950 aber du hast die pset 90% der Weg genommen und man kann einfach nicht herausfinden, eine Sache, 115 00:06:33,950 --> 00:06:36,520 Pass / Fail wirklich braucht die Kante aus einer Klasse wie dieser, 116 00:06:36,520 --> 00:06:39,100 wo man sortieren der gerne sagen: "Okay, ich weiß, es ist nicht perfekt, 117 00:06:39,100 --> 00:06:42,350 aber ich meinen Arsch abgearbeitet dazu, ich bin ziemlich glücklich mit, wo sie landeten, " 118 00:06:42,350 --> 00:06:44,850 und dass die Erwartungen für Pass treffen / scheitern. 119 00:06:44,850 --> 00:06:47,540 Also man im Hinterkopf behalten. Gut. 120 00:06:47,540 --> 00:06:50,520 >> So diejenigen von Ihnen, kämpfte um die Harvard University Wi-Fi verwenden können, 121 00:06:50,520 --> 00:06:54,780 wissen, dass es eine CS50 SSID, ein Wi-Fi-Verbindung, im Umlauf 122 00:06:54,780 --> 00:06:56,490 dass Sie vielleicht mehr Glück für haben. 123 00:06:56,490 --> 00:07:00,130 Es ist ein wenig ironisch, dass das Kennwort für diese, wenn Sie möchten, versuchen Sie, dies zu 124 00:07:00,130 --> 00:07:08,350 für bessere Geschwindigkeiten - und lassen Sie uns wissen, ob es nicht besser ist - ist 12345, den ganzen Weg bis zu 8 125 00:07:08,350 --> 00:07:10,910 weil 8 ist sicherer als 5. 126 00:07:10,910 --> 00:07:16,910 Also, wenn Sie die Wi-Fi Passwort benötigen, um CS50 drahtlos hier anschließen, 12345678, 127 00:07:16,910 --> 00:07:20,380 und Post auf CS50 Diskutieren wenn Sie noch intermittierende Konnektivität, 128 00:07:20,380 --> 00:07:25,420 und wir lassen die Kräfte, die für diesen Raum werden wissen. Gut. 129 00:07:25,420 --> 00:07:32,230 So eine schnelle Teaser, vor allem für diejenigen von euch, die Fan Jungen oder Mädchen aller Dinge Apple sind. 130 00:07:32,230 --> 00:07:37,460 Was ich ausgegraben von ein paar Jahre zurück war diese Datei hier, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 nur um Art von Make konkreter und komplexer 132 00:07:39,930 --> 00:07:42,560 einige der grundlegenden C Programme, die wir geschrieben haben. 133 00:07:42,560 --> 00:07:46,910 So öffnete ich diese Datei iUnlock.c. Es ist auf dem Lectures Seite für heute. 134 00:07:46,910 --> 00:07:49,810 Auf der linken Seite sehen Sie eine lange Liste von Funktionen. 135 00:07:49,810 --> 00:07:53,230 So der Bursche, der dies schrieb schrieb eine Menge von Funktionen, mehr als nur main. 136 00:07:53,230 --> 00:07:57,340 Er verwendet eine ganze Reihe von Bibliotheken hier, und wenn wir anfangen Scrollen durch, 137 00:07:57,340 --> 00:08:04,890 was das eigentlich ist das allererste, glaube ich, crack für das Original-iPhone. 138 00:08:04,890 --> 00:08:09,830 >> Wenn Sie das Original-iPhone jailbreak wollte, was bedeutet, untether es von AT & T 139 00:08:09,830 --> 00:08:13,710 und tatsächlich installieren spezielle Software drauf und Dinge tun, die Apple nicht, dass die Leute zu tun, 140 00:08:13,710 --> 00:08:18,480 jemand die Zeit genommen, um herauszufinden, wie genau sie könnte Softwarefehlern zu nutzen, 141 00:08:18,480 --> 00:08:22,690 - iUnlock.c-Fehler, Bugs, in Apple-Software, und damit war geboren 142 00:08:22,690 --> 00:08:26,760 dass, wenn Sie es auf Ihrem Computer kompiliert und installiert es auf einem iPhone 143 00:08:26,760 --> 00:08:29,430 Das war zu Ihrem Computer über, sagen wir, ein USB-Kabel angeschlossen ist, 144 00:08:29,430 --> 00:08:32,450 Dies würde Ihnen Verwaltungs-oder Root-Rechte auf Ihrem iPhone 145 00:08:32,450 --> 00:08:34,620 und lassen Sie so ziemlich alles, was Sie wollen. 146 00:08:34,620 --> 00:08:36,400 Und so gibt es seit dieser faszinierenden Katz und Maus Spiel 147 00:08:36,400 --> 00:08:39,340 zwischen Apple und dem Rest der Welt, insbesondere da sie, wie viele andere Unternehmen, 148 00:08:39,340 --> 00:08:43,350 versuchen, ihre Sachen sperren, so dass Sie nur tun können, was sie wollen. 149 00:08:43,350 --> 00:08:47,360 Aber dank Leuten wie diesem und dem Verständnis der Low-Level-Details - 150 00:08:47,360 --> 00:08:50,830 und in diesem Fall C-Programmierung - und viele der bekannten Konstrukte 151 00:08:50,830 --> 00:08:55,280 dass wir angefangen zu spielen mit, sind Sie in der Lage, wirklich nutzen die Hardware 152 00:08:55,280 --> 00:08:59,250 in einer Weise sehen Sie fit und nicht unbedingt etwas Körperschaft. 153 00:08:59,250 --> 00:09:01,600 So zum Beispiel, ich habe keine Ahnung, was das alles tut, 154 00:09:01,600 --> 00:09:03,580 aber GetVersion klingt ziemlich einfach, 155 00:09:03,580 --> 00:09:05,710 und es sieht aus wie das ist eine Funktion, dass diese Person geschrieben hat. 156 00:09:05,710 --> 00:09:09,250 Es dauert eine Art von Integer als Argument, nichts zurück, 157 00:09:09,250 --> 00:09:13,710 scheint aber Schleife mit einer for-Schleife hier und ein, wenn die Bedingung, wenn Bedingung Pause 158 00:09:13,710 --> 00:09:16,770 und irgendwie bezieht sich auf Versionsnummern, wenn wir nach unten scrollen, 159 00:09:16,770 --> 00:09:19,650 obwohl viele dieser Schlüsselwörter gehen zu neu sein. 160 00:09:19,650 --> 00:09:22,590 Und es gibt eine ganze Reihe von Funktionen in hier haben wir noch nie gesehen haben und vielleicht nicht immer sehen 161 00:09:22,590 --> 00:09:24,350 im Laufe des Semesters. 162 00:09:24,350 --> 00:09:29,160 >> Am Ende des Tages, folgt den gleichen Regeln und Logik, dass wir mit wurden bisher spielen. 163 00:09:29,160 --> 00:09:34,340 Also das ist viel zu alt, um dein iPhone 3s oder 4s oder bald 5s in diesen Tagen zu knacken, 164 00:09:34,340 --> 00:09:38,830 aber wissen, dass es sehr viel ist von dieser Welt stammt, die wir in getaucht. 165 00:09:38,830 --> 00:09:42,280 Werfen wir einen Blick auf ein wenig mehr einfaches Beispiel: 166 00:09:42,280 --> 00:09:46,260 diese, nur um mit einigen Syntax aufwärmen und auch einige anderen Datentyp 167 00:09:46,260 --> 00:09:48,910 dass wir darüber gesprochen, aber noch nicht wirklich in C. gesehen 168 00:09:48,910 --> 00:09:53,670 Dies ist eine Datei namens positive1.c und nach den Kommentaren an der Spitze, 169 00:09:53,670 --> 00:09:56,070 dies nur verlangt, dass ein Benutzer eine positive Zahl bereitzustellen. 170 00:09:56,070 --> 00:09:59,910 Es ist also ein Beispiel für eine do-while-Schleife, das ist schön für den Benutzer interaktive Programme 171 00:09:59,910 --> 00:10:02,070 wo Sie dem Benutzer mitteilen müssen etwas tun, 172 00:10:02,070 --> 00:10:05,530 und wenn sie nicht kooperieren man sie schreien oder lehnen ihre Eingabe. 173 00:10:05,530 --> 00:10:10,480 Case in point: Ich werde tun, Zeilen 19 bis 24 174 00:10:10,480 --> 00:10:14,620 so lange, wie der Benutzer nicht mir eine positive Zahl ist. 175 00:10:14,620 --> 00:10:21,340 Dieses Detail hier auf Linie 18, warum erkläre ich n über diesem ganzen Looping bauen 176 00:10:21,340 --> 00:10:26,870 um direkt zu Zeile 22, wo ich eigentlich egal, um n zu erhalten dagegen? Yeah. 177 00:10:26,870 --> 00:10:29,330 [Schüler] Scope. >> Ja, so in dieser Ausgabe von Umfang. 178 00:10:29,330 --> 00:10:31,770 Und in juristischer Hinsicht, was bedeutet Umfang zu beziehen? 179 00:10:34,880 --> 00:10:41,560 Yeah. >> [Unverständlich Student Response] >> Können Sie sprechen ein wenig lauter? 180 00:10:41,560 --> 00:10:45,440 [Schüler] Wo kann man diese Variable zugreifen. >> Perfect. 181 00:10:45,440 --> 00:10:47,610 Wo können Sie eine bestimmte Variable zugreifen. 182 00:10:47,610 --> 00:10:50,990 Und im Allgemeinen, die Faustregel war bisher, dass der Umfang einer Variablen 183 00:10:50,990 --> 00:10:56,140 wird durch die jüngsten geschweiften Klammern, dass Sie gesehen haben, definiert. 184 00:10:56,140 --> 00:11:03,070 >> Und so in diesem Fall, wenn ich den Fehler erklären n on line 22 gemacht, wäre die Linie zu arbeiten. 185 00:11:03,070 --> 00:11:10,840 Ich würde einen int, und ich würde es in dieser Variablen n setzen in Zeile 22, 186 00:11:10,840 --> 00:11:17,060 aber die Codezeile würde jetzt keine Ahnung, was ich rede? >> [Schüler] 25. 187 00:11:17,060 --> 00:11:23,840 [Malan] 25, und es stellt sich heraus, 24 als gut, weil es in diesem Fall außerhalb der geschweiften Klammern fällt. 188 00:11:23,840 --> 00:11:28,550 Also einfach ein wenig lästig, aber sehr einfach durch eine Variable deklarieren gelöst 189 00:11:28,550 --> 00:11:30,700 außerhalb der Funktion selber. 190 00:11:30,700 --> 00:11:32,760 Wir werden sehen, im Laufe des Tages können Sie einen Schritt weiter gehen 191 00:11:32,760 --> 00:11:34,940 und man konnte sogar noch ein wenig faul. 192 00:11:34,940 --> 00:11:39,660 Und dies ist nicht generell empfohlen werden, aber man könnte sogar faul 193 00:11:39,660 --> 00:11:44,150 und legte eine Variable global, so zu sprechen, nicht innerhalb einer Funktion, nicht innerhalb einer Schleife, 194 00:11:44,150 --> 00:11:49,800 aber in der Datei selbst, außerhalb aller Funktionen, die Sie geschrieben haben, wie ich es hier getan habe on line 15. 195 00:11:49,800 --> 00:11:55,220 Dies wird allgemein verpönt, aber weiß, das ist eine Lösung manchmal andere Probleme, 196 00:11:55,220 --> 00:11:56,910 Als wir schließlich sehen. 197 00:11:56,910 --> 00:11:59,500 So jetzt werden wir es so lassen, aber lasst uns sehen, ob wir dies umschreiben 198 00:11:59,500 --> 00:12:02,360 nur zu beginnen, uns auszudrücken ein wenig anders. 199 00:12:02,360 --> 00:12:05,550 Dieses Programm, das nur klar zu sein, ist Positive1. 200 00:12:05,550 --> 00:12:11,980 Lassen Sie mich gehen Sie hier und in meinem Terminal-Fenster zu machen positiv1, Enter. 201 00:12:11,980 --> 00:12:15,080 Kompiliert okay. Ich werde Positive1 laufen, drücken Sie Enter. 202 00:12:15,080 --> 00:12:19,250 Ich verlange, dass Sie mir eine positive ganze Zahl ist. Ich werde -1 sagen. Das hat nicht funktioniert. 203 00:12:19,250 --> 00:12:22,340 0, 99. Das scheint zu funktionieren. 204 00:12:22,340 --> 00:12:25,310 Vielleicht nicht die strengste Test, aber zumindest ist es ein schönes Plausibilitätsprüfung 205 00:12:25,310 --> 00:12:27,100 dass wir auf dem richtigen Weg sind. 206 00:12:27,100 --> 00:12:29,570 >> So, jetzt lassen Sie mich gehen Sie vor und öffnen Version 2 dieser, 207 00:12:29,570 --> 00:12:32,800 und was ist anders schon? 208 00:12:32,800 --> 00:12:39,030 Es implementiert die gleiche Sache, aber was springt so klar diesmal anders? 209 00:12:40,790 --> 00:12:47,090 Diese bool grün. Es ist grün, dieses Schlüsselwort als bool, die ein Datentyp bekannt ist hervorgehoben. 210 00:12:47,090 --> 00:12:50,510 Es ist nicht in allen Versionen von C kommen gebaut 211 00:12:50,510 --> 00:12:52,650 Sie müssen eine bestimmte Bibliothek enthalten. 212 00:12:52,650 --> 00:12:56,460 In unserem Fall enthalten ich den CS50-Bibliothek, so dass wir Zugang zu bool haben. 213 00:12:56,460 --> 00:12:59,860 Aber in Zeile 18, scheinen wir einen booleschen Wert hier als dankbar sind. 214 00:12:59,860 --> 00:13:02,190 Ich konnte diese nichts genannt haben, aber ich nannte es dankbar 215 00:13:02,190 --> 00:13:04,750 nur um Art zu vermitteln einige semantische Bedeutung. 216 00:13:04,750 --> 00:13:07,700 So zunächst in Zeile 18, ich bin offenbar nicht dankbar 217 00:13:07,700 --> 00:13:12,230 weil die booleschen Wert dankbar initialisiert wird, um in Zeile 18 false. 218 00:13:12,230 --> 00:13:16,500 Und dann scheint es, was ich hier in den Zeilen 21 bis 23 durchgeführt 219 00:13:16,500 --> 00:13:19,200 ist habe ich nur irgendwie meine Logik umgeschrieben. 220 00:13:19,200 --> 00:13:26,100 Also keine funktionell verschiedene, aber in Zeile 22 jetzt habe ich überprüfen, ob das int der Benutzer zur Verfügung gestellt 221 00:13:26,100 --> 00:13:31,360 größer als 0 ist, dann habe ich einfach ändern Sie den Wert dankbar wahr. 222 00:13:31,360 --> 00:13:35,590 Und warum mache ich das? Da in Zeile 25, anscheinend werde ich eine Bedingung zu überprüfen. 223 00:13:35,590 --> 00:13:39,760 Haben diese Schleife, während dankbar ist falsch. 224 00:13:39,760 --> 00:13:42,960 So schlug ich dies als eine Alternative zu Version 1 225 00:13:42,960 --> 00:13:47,050 weil es zumindest ein wenig mehr intuitive ist vielleicht ist es ein wenig mehr geerdet in englischer Sprache. 226 00:13:47,050 --> 00:13:51,980 So gehen Sie folgendermaßen vor, wenn Sie nicht dankbar sind oder während dankbar ist falsch. 227 00:13:51,980 --> 00:13:56,220 Und auch dieses Mal ich anscheinend egal zu erinnern, was der Benutzer eingegeben 228 00:13:56,220 --> 00:14:00,050 weil Ankündigung gibt es keine Variable n, also eigentlich eine kleine Notlüge gibt. 229 00:14:00,050 --> 00:14:03,290 >> Funktionell ist das Programm ein bisschen anders, wenn wir auf den Boden zu bekommen 230 00:14:03,290 --> 00:14:04,960 weil ich nicht daran erinnern, was n ist. 231 00:14:04,960 --> 00:14:09,120 Aber ich wollte hier zeigen auch, dass obwohl wir GetInt gesehen 232 00:14:09,120 --> 00:14:13,780 und GetString ist auf der rechten Seite von einem Gleichheitszeichen verwendet bisher 233 00:14:13,780 --> 00:14:17,310 so dass wir den Wert, technisch, das ist nicht unbedingt notwendig zu erinnern. 234 00:14:17,310 --> 00:14:20,290 Wenn Sie aus irgendeinem Grund einfach nicht kümmern, um den Wert zu speichern, 235 00:14:20,290 --> 00:14:25,540 Sie wollen einfach nur, um den Wert zu überprüfen, feststellen, dass wir einfach schreiben dies als GetInt, 236 00:14:25,540 --> 00:14:27,320 offenen paren, in der Nähe paren. 237 00:14:27,320 --> 00:14:30,570 Diese Funktion wird ein Wert zurückgegeben, wie wir gesagt haben. 238 00:14:30,570 --> 00:14:32,220 Es wird Ihnen wieder ein int. 239 00:14:32,220 --> 00:14:34,460 Und so, wenn Sie geistig glaube, dass dies geschieht, 240 00:14:34,460 --> 00:14:38,190 wenn ich in 99 eingeben, gibt GetInt die Zahl 99, 241 00:14:38,190 --> 00:14:41,840 und so konzeptuell, ist es, als ob mein Code tatsächlich waren diese. 242 00:14:41,840 --> 00:14:45,950 Also, wenn 99 der Tat größer als 0 ist, dann dankbar wahr wird, 243 00:14:45,950 --> 00:14:50,810 dann die Linie 25 ooh klar, wir sind fertig, weil ich jetzt dankbar bin, 244 00:14:50,810 --> 00:14:53,970 und in Zeile 26, sagen wir einfach, "Danke für die positive ganze Zahl!" 245 00:14:53,970 --> 00:14:55,960 was es zu sein passiert. 246 00:14:55,960 --> 00:14:59,140 Jetzt lasst uns leichter syntaktischer Zucker hier, so zu sprechen. 247 00:14:59,140 --> 00:15:04,670 Mal sehen, ob wir reinigen können diese Zeile 25 mit diesem dritten und letzten Variante positive3. 248 00:15:04,670 --> 00:15:13,600 >> Beachten Sie die einzige Unterschied ist jetzt, was Codezeile? >> [Schüler] 25. >> [Malan] Yeah, 25. 249 00:15:13,600 --> 00:15:17,680 Und wir haben nicht wirklich diesen Trick nur noch nicht gesehen, aber wir haben das Ausrufezeichen am Montag zu sehen, 250 00:15:17,680 --> 00:15:21,070 was bedeutet was? >> [Schüler] nicht. >> Nicht oder Negation. 251 00:15:21,070 --> 00:15:23,510 So nehmen Sie einen booleschen Wert und drehen ihren Wert. 252 00:15:23,510 --> 00:15:25,810 Wahr wird falsch, falsch wird wahr. 253 00:15:25,810 --> 00:15:30,420 Also das würde ich vorschlagen, ist sogar ein wenig mehr intuitive eine Möglichkeit den Code zu schreiben 254 00:15:30,420 --> 00:15:33,430 weil ich zu initialisieren noch dankbar falsch, habe ich immer noch die folgenden, 255 00:15:33,430 --> 00:15:36,010 Ich dankbar wahr, wenn die Zeit kommt, 256 00:15:36,010 --> 00:15:40,880 aber jetzt kann man wirklich nur übersetzen diesen Code mündlich links nach rechts, 257 00:15:40,880 --> 00:15:45,630 while (dankbar!), weil Knall oder Ausrufezeichen bedeutet der Begriff nicht, 258 00:15:45,630 --> 00:15:47,580 so zwar nicht dankbar. 259 00:15:47,580 --> 00:15:49,900 Also noch einmal, haben wir keine neuen Konzepte per se eingeführt. 260 00:15:49,900 --> 00:15:53,730 Wir sprachen über Booleans zurück, wenn wir mit Scratch gespielt, 261 00:15:53,730 --> 00:15:56,720 aber erkennen, jetzt können wir nur mit dem Schreiben beginnen unseren Code auf viele verschiedene Weisen. 262 00:15:56,720 --> 00:16:01,060 So vor allem in pset1 wenn du Art zu kämpfen, um herauszufinden, die Art und Weise, damit ein Programm zu schreiben, 263 00:16:01,060 --> 00:16:04,340 Chancen sind, haben Sie Glück, weil es eine Reihe von Lösungen sein kann 264 00:16:04,340 --> 00:16:06,110 Sie können auf passieren. 265 00:16:06,110 --> 00:16:10,500 Zum Beispiel ist dies nur 3 selbst für die einfachsten von Programmen. Gut. 266 00:16:10,500 --> 00:16:14,200 Und nun erinnern am Montag haben wir auf dieser Note nach links mit Rückgabewerten. 267 00:16:14,200 --> 00:16:18,450 So zum ersten Mal, dass wir ein Programm geschrieben, das nicht nur über main; 268 00:16:18,450 --> 00:16:22,550 es hat auch seine eigene Funktion, die ich hier geschrieben habe. 269 00:16:22,550 --> 00:16:26,810 So in Zeile 31 bis 34 habe ich einen Würfel implementiert. 270 00:16:26,810 --> 00:16:30,240 Es ist nicht komplex. Es ist nur eine * a * a in diesem Fall. 271 00:16:30,240 --> 00:16:34,750 Aber was ist wichtig daran ist, dass ich unter Input in Form eines 272 00:16:34,750 --> 00:16:39,180 und bin zurückkehrt Ausgabe in Form von a * a * a. 273 00:16:39,180 --> 00:16:43,560 So jetzt habe ich die Möglichkeit, ähnlich wie ich früher mit prinf allein, 274 00:16:43,560 --> 00:16:47,240 diese Funktion durch Aufruf des Würfels Funktion aufrufen. 275 00:16:47,240 --> 00:16:51,970 >> Und der Würfel-Funktion nimmt eine Eingabe, und der Würfel-Funktion liefert eine Ausgabe. 276 00:16:51,970 --> 00:16:56,960 Im Gegensatz dazu printf gerade etwas. 277 00:16:56,960 --> 00:17:00,840 Es kam nicht wieder alles, was wir über betreut, obwohl als neben ihm einen Wert zurückkehrt; 278 00:17:00,840 --> 00:17:03,110 Sie nur in der Regel ignorieren. 279 00:17:03,110 --> 00:17:06,510 Printf gerade etwas. Es hatte eine Nebenwirkung von Drucken auf dem Bildschirm. 280 00:17:06,510 --> 00:17:11,770 Im Gegensatz hier haben wir den Würfel-Funktion, die gibt tatsächlich etwas. 281 00:17:11,770 --> 00:17:15,520 Also für diejenigen, die mit diesem, ist es eine ziemlich einfache Idee. 282 00:17:15,520 --> 00:17:19,640 Aber für die weniger vertraut mit dieser Idee der Übergabe an den Eingängen und immer wieder Ausgänge, 283 00:17:19,640 --> 00:17:21,950 Lassen Sie uns versuchen, nur etwas super einfach. 284 00:17:21,950 --> 00:17:25,490 Ist jemand komfortable kommen auf die Bühne kurz auf? 285 00:17:25,490 --> 00:17:28,040 Sie müssen bequem sein mit einer Kamera auf Sie als gut. Yeah? Okay. 286 00:17:28,040 --> 00:17:31,240 Wie ist dein Name? >> [Schüler] Ken. >> Ken. Gut. Ken, auf bis zu kommen. 287 00:17:31,240 --> 00:17:35,050 Ken wird eine Funktion der möglichen hier sein. 288 00:17:35,050 --> 00:17:38,720 Lasst uns weitermachen und tun. Lassen Sie uns ein wenig Phantasie. 289 00:17:38,720 --> 00:17:42,260 Schön, Sie kennen zu lernen. Willkommen in den Mittelpunkt. Gut. 290 00:17:42,260 --> 00:17:46,640 Lassen Sie uns treffen diese Taste hier. Gut. 291 00:17:46,640 --> 00:17:49,820 So hier haben Sie eine moderne Tafel, 292 00:17:49,820 --> 00:17:53,470 und was ich bin, ist die wichtigste Funktion, zum Beispiel, 293 00:17:53,470 --> 00:17:56,460 und ich habe nicht ein iPad in der Hand. 294 00:17:56,460 --> 00:17:59,710 >> Ich weiß nicht wirklich erinnern, wie man - Nun, ich kann das nicht sagen. 295 00:17:59,710 --> 00:18:02,480 Ich habe nicht wirklich eine gute Handschrift, 296 00:18:02,480 --> 00:18:05,520 und so deshalb möchte ich Sie etwas auf dem Bildschirm für mich zu drucken. 297 00:18:05,520 --> 00:18:12,040 Ich bin da das Hauptprogramm, und ich bin zu haben, Sie sagen, das 298 00:18:12,040 --> 00:18:16,720 indem es in meinem Chicken Scratch und dann Leiten Sie einen Eingang. 299 00:18:16,720 --> 00:18:20,400 So dumm, obwohl diese Übung ist, die Vorstellung der Funktionen und Aufruf einer Funktion 300 00:18:20,400 --> 00:18:22,400 und wieder eine Funktion wirklich darauf an, dies. 301 00:18:22,400 --> 00:18:26,260 Ich bin Haupt, ich habe gerade printf, quote-unquote etwas auf dem Bildschirm geschrieben, 302 00:18:26,260 --> 00:18:29,110 Ich verwende dieses Programm, und sobald printf aufgerufen wird, 303 00:18:29,110 --> 00:18:32,880 es dauert ein Argument oder ein Parameter manchmal zwischen Anführungszeichen. 304 00:18:32,880 --> 00:18:35,880 Hier ist das Argument. Ich bin der Übergabe an Ken. 305 00:18:35,880 --> 00:18:39,020 Er ist ein schwarzer Kasten geschrieben gewisse Anzahl von Jahren 306 00:18:39,020 --> 00:18:41,510 dass offenbar nur weiß, wie die Dinge auf dem Bildschirm auszugeben. 307 00:18:41,510 --> 00:18:43,150 So auszuführen. 308 00:18:49,280 --> 00:18:51,280 Das ist nicht schlecht. Sehr gut. 309 00:18:51,280 --> 00:18:55,510 So, jetzt Ken getan wird ausgeführt. Braucht er zur Hand mir nichts zurück? 310 00:18:55,510 --> 00:18:57,470 Nicht, dass wir bisher gesehen. 311 00:18:57,470 --> 00:19:00,460 Wieder ist printf tatsächlich wieder an, doch werden wir, dass für jetzt ignorieren 312 00:19:00,460 --> 00:19:03,470 denn wir haben es nie benutzt. Also das ist es für Ken. 313 00:19:03,470 --> 00:19:08,580 Und nun wichtigsten übernimmt die Kontrolle über das Programm erneut 314 00:19:08,580 --> 00:19:11,060 weil diese Codezeile, printf, erfolgt die Ausführung. 315 00:19:11,060 --> 00:19:14,050 Und wir unseren Weg gehen, der Ausführung, was andere Leitungen vorhanden sind. 316 00:19:14,050 --> 00:19:17,320 So, jetzt wollen wir versuchen eine etwas andere Beispiel. 317 00:19:17,320 --> 00:19:24,940 Dieses Mal hier wollen wir zunächst den Bildschirm, und dieses Mal werden wir die Cubing Funktion zu tun, 318 00:19:24,940 --> 00:19:27,080 aber diesmal erwarte ich einen Ausgangswert. 319 00:19:27,080 --> 00:19:29,180 >> Also lasst uns weitermachen und tun. 320 00:19:29,180 --> 00:19:35,790 Jetzt habe ich eine Zeile Code, x erhält Würfel x sagt. 321 00:19:41,370 --> 00:19:46,370 Die Codezeile, Rückruf, sieht wie folgt aus: x = cube (x); 322 00:19:46,370 --> 00:19:50,930 Also, wie ist das funktionieren? Fahren wir fort und geben Ihnen einen weißen Bildschirm wieder. 323 00:19:50,930 --> 00:19:54,070 Ich werde zu notieren nun den Wert von x, 324 00:19:54,070 --> 00:20:01,400 die zu diesem Zeitpunkt geschieht, zu sein, sagen wir, 2 es einfach zu halten. 325 00:20:01,400 --> 00:20:06,150 Ich habe auf ein Stück Papier den Wert von 2, die meinen Wert x geschrieben. 326 00:20:06,150 --> 00:20:10,920 Ich gebe es zu Ken. >> Und ich schreibe die Antwort? >> Ja, lasst uns einfach schreiben Sie die Antwort. 327 00:20:12,760 --> 00:20:18,940 Okay. Und jetzt hat er wieder mir etwas. Perfect. Nizza segue. 328 00:20:18,940 --> 00:20:23,120 So, jetzt reicht er mir den Wert von 8 in diesem Fall, und was muss ich tun? 329 00:20:23,120 --> 00:20:28,250 Eigentlich - mal sehen, erhalten dieses Recht. Was soll ich damit zu tun? 330 00:20:28,250 --> 00:20:33,440 Jetzt werde ich diesen Wert zu nehmen und tatsächlich lagern Sie es in den gleichen Bits im Speicher. 331 00:20:33,440 --> 00:20:35,170 Aber ich merke, bin ein bisschen kämpfen hier. 332 00:20:35,170 --> 00:20:38,210 Ich bin ein wenig verwirrt, weil, wo ich schreibe eigentlich den Wert von x, 333 00:20:38,210 --> 00:20:43,150 denn was ich gerade getan haben ist physisch Hand Ken ein Stück Papier, das den Wert 2 hat, 334 00:20:43,150 --> 00:20:46,590 das war x, und in der Tat, das ist genau das, was passiert ist. 335 00:20:46,590 --> 00:20:50,210 So stellt sich heraus, dass, wenn Sie die Funktion aufrufen und Sie in ein Argument übergeben 336 00:20:50,210 --> 00:20:53,290 wie hallo, Welt oder übergeben Sie in einem Argument wie 2, 337 00:20:53,290 --> 00:20:57,110 in der Regel sind Sie in einer Kopie dieses Argument vorbei. 338 00:20:57,110 --> 00:21:00,730 Und so wie ich schrieb mir die Nummer 2 hier und reichte es Ken, 339 00:21:00,730 --> 00:21:04,720 das muss bedeuten, dass ich noch eine Kopie des Wertes 2 irgendwo 340 00:21:04,720 --> 00:21:08,890 weil ja, jetzt, wo ich wieder den Wert 8 bekommen, muss ich zurück in RAM 341 00:21:08,890 --> 00:21:12,130 und tatsächlich aufzuschreiben 8, wo ich einst die Nummer 2. 342 00:21:12,130 --> 00:21:16,950 So visuell, erinnere mich an diese Vorstellung vorbei in buchstäblich eine Kopie des Wertes. 343 00:21:16,950 --> 00:21:20,780 >> Ken macht seine Sache, reicht mir wieder etwas - in diesem Fall einen Wert wie 8 - 344 00:21:20,780 --> 00:21:24,980 und dann habe ich etwas mit diesem Wert tun, wenn ich davon rund wollen. 345 00:21:24,980 --> 00:21:29,650 So wird das alles kommen zurück, um allzu vertraut, bevor lang. 346 00:21:29,650 --> 00:21:34,920 Vielen Dank für diese Demo hier, Ken. [Applaus] 347 00:21:34,920 --> 00:21:36,920 Sehr gut gemacht. 348 00:21:36,920 --> 00:21:42,690 Mal sehen, wie die letztlich bezieht sich auf einige der Funktionen aufrufen, dass wir hier getan. 349 00:21:42,690 --> 00:21:47,910 Lassen Sie mich gehen Sie vor und bringen uns zurück zu dem Cubing Beispiel hier. 350 00:21:47,910 --> 00:21:53,300 Beachten Sie, dass, wenn wir wollen, tatsächlich anfangen, diese weiter, 351 00:21:53,300 --> 00:21:57,570 wir gehen zu müssen, eingedenk der Tatsache, dass die Zahl x das ist in hier vorbei 352 00:21:57,570 --> 00:22:01,530 unterscheidet sich von was tatsächlich an die Funktion übergeben. 353 00:22:01,530 --> 00:22:05,880 Also noch einmal, ist dieser Pass durch Kopieren werde ziemlich Germane in nur einem Augenblick. 354 00:22:05,880 --> 00:22:09,580 Werfen wir einen Blick auf etwas, das nicht ganz stimmt noch arbeiten. 355 00:22:09,580 --> 00:22:13,250 Ich werde weitermachen und öffnen ein Drittel buggy Beispiel, das von Natur aus fehlerhaft ist, 356 00:22:13,250 --> 00:22:18,550 und es heißt buggy3 und implementiert eine Swapping-Funktion. 357 00:22:18,550 --> 00:22:25,110 Hier haben wir ein Hauptfunktion, die x-und y willkürlich auf 1 und 2 initialisiert sind. 358 00:22:25,110 --> 00:22:27,700 Wir könnten GetInt, aber wir brauchen nur eine einfache Übung, 359 00:22:27,700 --> 00:22:30,170 so ist es hartcodierte als 1 und 2. 360 00:22:30,170 --> 00:22:35,340 In den Zeilen 21 und 22, wir scheinbar auszudrucken x und y, 1 pro Zeile. 361 00:22:35,340 --> 00:22:39,720 Dann on line 23, behaupte ich, ich tauschen diese Werte, Punkt, Punkt, Punkt. 362 00:22:39,720 --> 00:22:44,170 Ich anscheinend eine Funktion in Zeile 24 genannten Swap 2 Argumente übernimmt. 363 00:22:44,170 --> 00:22:48,300 Es ist völlig legitim für Funktionen 2 Argumente zu nehmen. Wir haben gesehen, printf tun es bereits. 364 00:22:48,300 --> 00:22:51,830 >> So Swap anscheinend dauert x und y, und wie der Name schon vermuten lässt, 365 00:22:51,830 --> 00:22:54,670 Ich hoffe, dass es geht um diese 2 Werte zu tauschen. 366 00:22:54,670 --> 00:23:00,090 Also ich behaupte on line 25 "Vertauschte!" und ich nachdrucken x-und y- 367 00:23:00,090 --> 00:23:03,070 unter der Annahme, dass sie tatsächlich haben vertauscht. 368 00:23:03,070 --> 00:23:06,080 Aber wenn ich wirklich dieses Programm - lassen Sie mich öffnen Sie ein Terminal-Fenster, 369 00:23:06,080 --> 00:23:09,860 lassen Sie mich buggy3 - wie der Name schon sagt, ist dies nicht gut enden 370 00:23:09,860 --> 00:23:15,770 denn wenn ich Enter feststellen, dass x 1 getroffen wird, ist y 2, 371 00:23:15,770 --> 00:23:19,420 und trotzdem am Ende des Programms, sind sie immer noch in der Tat dasselbe. 372 00:23:19,420 --> 00:23:22,960 So auf der Demonstration basiert gerade jetzt mit Ken, was eigentlich los? 373 00:23:22,960 --> 00:23:28,710 Lassen Sie uns tauchen Sie ein in dieses Swap-Funktion. Es ist super kurz. Es ist nur ein paar Zeilen Code lang. 374 00:23:28,710 --> 00:23:34,520 Aber was ist das grundsätzliche Problem auf die einfache Geschichte erzählt hier mit Ken basiert? 375 00:23:34,520 --> 00:23:36,670 Warum ist Swap gebrochen? 376 00:23:36,670 --> 00:23:39,660 [Schüler] Sie werden zu einer Kopie, nicht die Variable speichert. 377 00:23:39,660 --> 00:23:43,980 Genau. Wir auf eine Kopie speichern, nicht die Variable selbst. 378 00:23:43,980 --> 00:23:47,170 In anderen Worten, Swap anscheinend dauert 2 Argumente, ein int, 379 00:23:47,170 --> 00:23:49,370 und es wird willkürlich als a und b, 380 00:23:49,370 --> 00:23:54,420 und hier oben habe ich in x und y, die jeweils 1 und 2 sind vergangen, 381 00:23:54,420 --> 00:23:58,770 aber ich bin nicht wörtlich vorbei in x, bin ich nicht wörtlich vorbei in y, 382 00:23:58,770 --> 00:24:01,450 Ich Übergeben einer Kopie von x und eine Kopie von y. 383 00:24:01,450 --> 00:24:04,510 Es ist fast, als ob Sie kopiert und in Swap- 384 00:24:04,510 --> 00:24:07,810 die Werte, die Sie wollen, dass es tatsächlich zu manipulieren. 385 00:24:07,810 --> 00:24:14,480 Also, wenn das der Fall ist, wenn ich das Programm Startlinie Ausführung 35 dann 36, 386 00:24:14,480 --> 00:24:18,650 wenn ich in die Linie 37 zu bekommen, an diesem Punkt in der Geschichte, ist das, was der Wert von a? 387 00:24:21,040 --> 00:24:25,050 An diesem Punkt in der Geschichte, die Leitung 37, was der Wert von a zu diesem Zeitpunkt? >> [Schüler] 1. 388 00:24:25,050 --> 00:24:29,280 [Malan] Es sollte nur 1 sein, nicht wahr, weil x wurde als erstes Argument übergeben, 389 00:24:29,280 --> 00:24:33,080 und diese Funktion einfach willkürlich ruft ihr erstes Argument ein. 390 00:24:33,080 --> 00:24:38,200 Ebenso ist y das zweite Argument, und es ist einfach willkürlich ruft das zweite Argument b. 391 00:24:38,200 --> 00:24:40,990 >> Diese Dichotomie ist eigentlich ziemlich einfach erklärt. Denken Sie darüber nach. 392 00:24:40,990 --> 00:24:43,320 Keiner von uns erfüllt die Person, die printf schrieb, 393 00:24:43,320 --> 00:24:50,770 so sicher, hat er oder sie keine Ahnung, was unsere Variablen 30 Jahre später gehen, um aufgerufen werden. 394 00:24:50,770 --> 00:24:56,650 Also muss es einen Unterschied zwischen dem, was Sie anrufen Variablen in Funktionen du schreibst sein 395 00:24:56,650 --> 00:25:02,080 und was Sie Variablen in Funktionen, die Sie anrufen oder Sie verwenden nennen. 396 00:25:02,080 --> 00:25:05,340 Also mit anderen Worten, ich habe meine Variablen x und y geschrieben, 397 00:25:05,340 --> 00:25:08,890 aber wenn jemand anderes die Swap-Funktion geschrieben hatte, er oder sie würde nicht wissen, 398 00:25:08,890 --> 00:25:10,690 was meine Variablen gehen, um aufgerufen werden, 399 00:25:10,690 --> 00:25:13,830 so klar, dass dies, warum Sie diese Dualität von Namen zu haben. 400 00:25:13,830 --> 00:25:16,750 Technisch konnte ich dies durch Zufall zu tun, 401 00:25:16,750 --> 00:25:20,080 aber sie würden immer noch als Kopien weitergegeben werden. 402 00:25:20,080 --> 00:25:23,650 Es wäre nur ein reiner Zufall sein, ästhetisch, wenn diese Person, die Swap schrieb 403 00:25:23,650 --> 00:25:26,150 benutzt hatte den gleichen Namen. 404 00:25:26,150 --> 00:25:32,370 So an diesem Punkt in der Geschichte, Zeile 37, eine 1 ist, b 2, und jetzt kann ich gehen, um sie zu tauschen. 405 00:25:32,370 --> 00:25:34,900 Zunächst lassen Sie mich tatsächlich tun dies viel einfacher. 406 00:25:34,900 --> 00:25:36,690 Ich weiß nicht, was diese 3 Zeilen Code taten. 407 00:25:36,690 --> 00:25:41,210 Lassen Sie mich nur dies zu tun: b = a; a = b; getan. 408 00:25:41,210 --> 00:25:44,690 Warum ist das gebrochene, logisch? 409 00:25:46,490 --> 00:25:48,900 Es ist eine Art der intuitiven Sache, nicht wahr? 410 00:25:48,900 --> 00:25:52,560 So a wird b und b wird ein, 411 00:25:52,560 --> 00:25:57,730 aber das Problem ist, dass, sobald die Leitung 37 führt, was ist der Wert von a und b? 412 00:25:57,730 --> 00:26:03,410 Das gleiche, 1, weil man verprügelt haben, so zu sprechen, haben Sie b geändert, um eine gleich. 413 00:26:03,410 --> 00:26:08,890 Also, wenn Zeile 37 ausgeführt hat, das ist toll, Sie haben jetzt 2 Kopien der Nummer 1 414 00:26:08,890 --> 00:26:13,350 innerhalb dieser Funktion, so dass dann, wenn Sie sagen in Zeile 38 a = b, 415 00:26:13,350 --> 00:26:17,640 Sie Art verschraubt, weil Sie nur die Zuordnung sind 1 bis 1. 416 00:26:17,640 --> 00:26:20,580 Sie haben irgendwie verloren den Wert Sie über betreut. 417 00:26:20,580 --> 00:26:23,220 So in der ursprünglichen Version dieses bemerken, was ich tat. 418 00:26:23,220 --> 00:26:26,850 Ich stattdessen hatte eine dritte Codezeile, die wie folgt aussah. 419 00:26:26,850 --> 00:26:28,580 Ich erkläre eine temporäre Variable. 420 00:26:28,580 --> 00:26:32,170 >> Tmp ist eine sehr gebräuchliche Name für eine temporäre Variable, und es ist ein int 421 00:26:32,170 --> 00:26:34,580 weil es zu entsprechen, was ich eine Kopie machen möchten. 422 00:26:34,580 --> 00:26:39,770 Ich speichere Kopie einer Innenseite tmp, so einmal Zeile 37 ausgeführt wurde, 423 00:26:39,770 --> 00:26:45,860 der Wert von a ist - schnelle Plausibilitätsprüfung - 1, ist der Wert von b 2, 424 00:26:45,860 --> 00:26:48,970 und der Wert von tmp ist ebenfalls ein. 425 00:26:48,970 --> 00:26:52,060 So, jetzt führe ich die Leitung 38. 426 00:26:52,060 --> 00:27:00,540 Nachdem die Leitung 38 ausgeführt wird, erfolgt eine vom Wert b. Und b war 2, so a ist jetzt 2. 427 00:27:00,540 --> 00:27:05,210 So an diesem Punkt in der Geschichte, a 2 ist, b 2, und tmp 1 ist, 428 00:27:05,210 --> 00:27:11,060 so jetzt logischerweise können wir nur plop tmp der Wert in b und wir sind fertig. 429 00:27:11,060 --> 00:27:12,800 So haben wir das Problem gelöst. 430 00:27:12,800 --> 00:27:17,720 Leider, wenn ich dieses Programm in dieser Form, ist es eigentlich nicht tauschen keine Werte. 431 00:27:17,720 --> 00:27:20,100 Aber klar zu sein, warum? 432 00:27:23,660 --> 00:27:26,450 Ich reparierte die logische Problem aus nur einen Augenblick vor 433 00:27:26,450 --> 00:27:31,020 aber wieder, wenn ich dieses Programm ausführen, bleibt x und y unverändert 434 00:27:31,020 --> 00:27:33,310 Bis Ende der Ausführung des Programms. 435 00:27:33,310 --> 00:27:37,220 [Unverständlich Studenten comment] >> Wir haben nichts zurückgegeben, so dass das stimmt. 436 00:27:37,220 --> 00:27:39,670 Aber es stellt sich heraus, es ist ein bisschen ein Problem hier, weil so weit, 437 00:27:39,670 --> 00:27:44,170 das einzige, was wir in der Lage, wieder haben ist eine Sache, und das ist eine Einschränkung der C. 438 00:27:44,170 --> 00:27:49,070 Sie können eigentlich nur einen Wert zurückgeben, in welchem ​​Fall ich irgendwie stecken hier bin 439 00:27:49,070 --> 00:27:53,310 weil ich den neuen Wert von x zurückkehren konnten oder ich könnte wieder den neuen Wert von y, 440 00:27:53,310 --> 00:27:55,190 aber ich will beide zurück. 441 00:27:55,190 --> 00:27:58,650 So Rückgabe ist nicht die einfache Lösung. 442 00:27:58,650 --> 00:28:01,710 Aber das Problem grundlegend ist, warum? Was haben wir eigentlich vertauscht? 443 00:28:01,710 --> 00:28:04,190 [Schüler] a und b. >> A und b. 444 00:28:04,190 --> 00:28:08,230 Aber a und b sind Kopien von x und y, die wir gerade gemacht haben all diese Arbeit bedeutet, 445 00:28:08,230 --> 00:28:11,650 wir haben gerade 3 Minuten reden über die Swap-Funktion und alle 3 dieser Variablen 446 00:28:11,650 --> 00:28:15,420 und das ist großartig, vollkommen richtig isoliert, 447 00:28:15,420 --> 00:28:20,740 aber a und b der Anwendungsbereich nur in diesen Zeilen hier. 448 00:28:20,740 --> 00:28:24,790 >> So wie eine for-Schleife, wenn Sie erklären, eine ganze Zahl i in der for-Schleife 449 00:28:24,790 --> 00:28:28,760 ähnlich, wenn Sie erklären a und b innerhalb einer Funktion, die Sie geschrieben haben, 450 00:28:28,760 --> 00:28:33,320 sie sind nur gültig innerhalb dieser Funktion, was bedeutet, dass, sobald Swap durchgeführt wird ausgeführt 451 00:28:33,320 --> 00:28:38,470 und wir von Zeile 24 bis Zeile 25 gehen, haben x und y nicht an allen geändert. 452 00:28:38,470 --> 00:28:42,790 Sie einfach verschwendet eine Menge Zeit Swapping Kopien von Variablen. 453 00:28:42,790 --> 00:28:47,010 So stellt sich heraus, dass die Lösung für dieses Problem ist eigentlich nicht offensichtlich. 454 00:28:47,010 --> 00:28:50,670 Es ist nicht ganz ausreichend, um Werte zurückgeben, weil wir nur zurückgeben kann 1-Wert, 455 00:28:50,670 --> 00:28:53,470 und ich wirklich wollen, um sowohl x und y zur gleichen Zeit tauschen, 456 00:28:53,470 --> 00:28:55,210 so dass wir gehen zu müssen, kommen darauf zurück. 457 00:28:55,210 --> 00:29:01,020 Aber jetzt erkennen, dass das Problem grundlegend von der Tatsache, dass a und b Kopien abgeleitet 458 00:29:01,020 --> 00:29:03,630 und sie sind in ihren eigenen Anwendungsbereich. 459 00:29:03,630 --> 00:29:05,050 Lasst uns versuchen, diese in irgendeiner Weise zu lösen. 460 00:29:05,050 --> 00:29:11,250 Lassen Sie mich eigentlich blättern hierher zurück und eröffnen, sagen wir, eine vierte Variante davon, buggy4. 461 00:29:11,250 --> 00:29:13,370 Was ist das? 462 00:29:13,370 --> 00:29:17,810 Dies ist eine ähnliche, aber einfacheres Problem auf, bevor wir einen Stich an, es zu lösen suchen. 463 00:29:17,810 --> 00:29:24,190 Dieses Programm heißt Inkrement, und es scheint initialisiert eine x Ganzzahl 1 in Zeile 18. 464 00:29:24,190 --> 00:29:28,150 Ich dann zu behaupten, x 1 ist, habe ich dann Anspruch "Inkrementieren ..." 465 00:29:28,150 --> 00:29:33,730 Dann rufe ich Inkrement, aber dann in den Zeilen 22 und 23, behaupte ich es gewesen ist erhöht, 466 00:29:33,730 --> 00:29:40,220 Ich behaupte x ist nun, was es ist - 2, vermutlich - aber dieses Programm ist buggy. 467 00:29:40,220 --> 00:29:42,610 Was ist das Problem? 468 00:29:43,440 --> 00:29:50,160 Yeah. >> [Unverständlich Student Response] >> Genau. 469 00:29:50,160 --> 00:29:52,490 So x erklärt wurde, offensichtlich auf der Leitung 18. 470 00:29:52,490 --> 00:29:54,700 Das ist in geschweiften Klammern Main. 471 00:29:54,700 --> 00:29:58,440 So die einfache Antwort ist, dass während der x hier existiert, 472 00:29:58,440 --> 00:30:03,930 sie nicht in der Leitung 32 vorhanden sind, so dass dieses Programm tatsächlich nicht einmal kompilieren. 473 00:30:03,930 --> 00:30:07,940 Der Compiler wenn ich versuche Kompilieren dieses Codes wird schreien mich an 474 00:30:07,940 --> 00:30:14,100 über einige Schwarzarbeit Kennung oder etwas in diesem Sinne. In der Tat, lasst uns versuchen. 475 00:30:14,100 --> 00:30:18,470 Dies ist zu buggy4. Da ist es. 476 00:30:18,470 --> 00:30:22,110 Verwendung von nicht deklarierter Bezeichner 'x' in Zeile 32. 477 00:30:22,110 --> 00:30:25,580 Und tatsächlich, wir deutlicher sein heute hier, so dass diese nützlich ist 478 00:30:25,580 --> 00:30:27,580 Sprechzeiten und zu Hause. 479 00:30:27,580 --> 00:30:29,300 >> Beachten Sie, dass es ein wenig kryptisch geschrieben ist. 480 00:30:29,300 --> 00:30:37,270 Aber die Tatsache, dass Clang hat schrie uns an, sagen buggy4.c: 32:5, tatsächlich nützlich ist. 481 00:30:37,270 --> 00:30:42,050 Es bedeutet, dass der Fehler in Zeile 32 an Zeichenposition 5 ist. 482 00:30:42,050 --> 00:30:46,700 Also 1, 2, 3, 4, 5. Das ist in der Tat, wo das Problem liegt. 483 00:30:46,700 --> 00:30:49,790 Und auch auch immer daran Bürozeiten und zu Hause, ich bin glücklich hier. 484 00:30:49,790 --> 00:30:52,990 Ich habe ein Fehler. Es wird relativ einfach zu beheben. 485 00:30:52,990 --> 00:30:55,990 Aber wenn man einen ganzen Bildschirm voller überwältigender Fehlermeldungen 486 00:30:55,990 --> 00:31:00,330 wieder bewusst, dass der unterste ein vielleicht nur symptomatisch für die obersten ein. 487 00:31:00,330 --> 00:31:03,450 Also immer jagen Ihre Fehler von oben nach unten 488 00:31:03,450 --> 00:31:05,820 weil es vielleicht nur eine Daisy-Chain-Effekt 489 00:31:05,820 --> 00:31:09,240 das schlägt Sie haben viel mehr Probleme, als Sie tatsächlich tun. 490 00:31:09,240 --> 00:31:15,150 Also, wie können wir dieses Problem beheben, wenn mein Ziel ist es, x erhöhen? >> [Schüler] Machen x global. 491 00:31:15,150 --> 00:31:17,060 Okay, so können wir x global. 492 00:31:17,060 --> 00:31:20,480 Nehmen wir die Verknüpfung, die ich vorher gewarnt, aber was solls, wir brauchen nur eine schnelle Lösung, 493 00:31:20,480 --> 00:31:25,730 so lasst uns einfach sagen, int x hier oben. Das macht x global. 494 00:31:25,730 --> 00:31:31,800 So, jetzt Haupt hat Zugriff darauf und Inkrement auf ihn zugreifen, 495 00:31:31,800 --> 00:31:34,110 und so lassen Sie mich gehen Sie vor und übersetzen Sie dies jetzt. 496 00:31:34,110 --> 00:31:37,630 Machen buggy4, Enter. Scheint jetzt zu kompilieren. 497 00:31:37,630 --> 00:31:41,230 Laufen wir buggy4. Und es scheint zu funktionieren. 498 00:31:41,230 --> 00:31:45,150 Dies ist eines dieser Dinge, die tun, was ich sage, ist, nicht was ich tue, 499 00:31:45,150 --> 00:31:47,010 wie ich gerade getan haben hier, weil im allgemeinen, 500 00:31:47,010 --> 00:31:50,440 unsere Programme bekommen werden viel interessanter und viel länger als diese, 501 00:31:50,440 --> 00:31:56,390 und wenn Sie Ihre Lösung an die Probleme des Lebens ist gerade auf alle Variablen am Anfang der Datei, 502 00:31:56,390 --> 00:31:59,690 sehr schnell weiß Programme bekommen entsetzlich schwer zu verwalten. 503 00:31:59,690 --> 00:32:02,190 Es wird noch schwieriger, zu denken, neue Variablennamen, 504 00:32:02,190 --> 00:32:05,240 es wird noch schwieriger zu verstehen, was variable was tut, 505 00:32:05,240 --> 00:32:08,460 und so in der Regel ist dies keine gute Lösung. 506 00:32:08,460 --> 00:32:10,030 Also lasst uns das besser. 507 00:32:10,030 --> 00:32:12,160 Wir wollen nicht um eine globale Variable hier verwenden. 508 00:32:12,160 --> 00:32:16,240 >> Ich möchte x erhöhen, so könnte ich natürlich - 509 00:32:16,240 --> 00:32:18,670 am Ende des Tages, ist diese Art von einer dummen Geschichte, weil wir gerade tun - 510 00:32:18,670 --> 00:32:24,450 aber wenn ich nicht über diesen Betreiber wissen oder durfte ich nicht, um es in Haupt selbst zu ändern, 511 00:32:24,450 --> 00:32:30,730 Wie sonst könnte ich umsetzen Ken hier diesmal nicht zu Würfel, sondern zu erhöhen? 512 00:32:31,380 --> 00:32:33,190 Wie ändere ich das Ding hier? Yeah. 513 00:32:33,190 --> 00:32:38,480 [Schüler] Pass in x und dann wieder [unverständlich] >> Okay, gut. 514 00:32:38,480 --> 00:32:41,900 Also, warum nicht ich in x übergeben und dann anstatt zurückgeben, 515 00:32:41,900 --> 00:32:44,870 warum ich nicht einfach return x + 1. 516 00:32:44,870 --> 00:32:47,710 Ein paar mehr Dinge müssen hier ändern. Ich bin auf dem richtigen Weg. 517 00:32:47,710 --> 00:32:49,770 Was muss ich sonst noch zu optimieren? Jemand anderes. Yeah. 518 00:32:49,770 --> 00:32:51,740 [Unverständlich Studenten Antwort] 519 00:32:51,740 --> 00:32:54,730 Ich muss den Rückgabetyp der Abstufung zu verändern, weil es nicht erlischt. 520 00:32:54,730 --> 00:32:57,780 Void bedeutet nichts zurückgegeben wird, aber jetzt klar ist, 521 00:32:57,780 --> 00:32:59,830 so muss dies zu ändern - >> [Schüler] int. 522 00:32:59,830 --> 00:33:02,740 int konsistent zu sein mit dem, was ich eigentlich zurück. 523 00:33:02,740 --> 00:33:05,180 Jetzt etwas anderes ist noch buggy hier. Yeah. 524 00:33:05,180 --> 00:33:08,400 [Unverständlich Student Response] >> [Malan] Also habe ich x erhöhen müssen? 525 00:33:08,400 --> 00:33:12,080 [Unverständlich Student Response] >> [Malan] Ah, also muss ich x passieren. 526 00:33:12,080 --> 00:33:16,660 Also muss ich das hier tun. >> [Unverständlich Studenten comment] 527 00:33:16,660 --> 00:33:20,050 [Malan] So der Prototyp, ich habe dies zu ändern hier oben. 528 00:33:20,050 --> 00:33:22,930 Also das muss ein int zu werden, hat dies zu werden - 529 00:33:22,930 --> 00:33:25,620 hmm, habe ich eigentlich einen Fehler hier unten. Lassen Sie dieses Problem beheben ein erster. 530 00:33:25,620 --> 00:33:29,590 Was soll das eigentlich sein? Es muss ein int etwas sein. 531 00:33:29,590 --> 00:33:32,700 Es könnte x sein, aber ehrlich gesagt, wenn Sie anrufen, allen Ihren Variablen x starten, 532 00:33:32,700 --> 00:33:35,390 es geht um weniger klar, was was ist. 533 00:33:35,390 --> 00:33:39,560 >> So lasst uns einfach beliebig wählen eine andere Namenskonvention für meine Hilfsfunktionen 534 00:33:39,560 --> 00:33:41,940 die Funktionen ich schreibe. Wir nennen es ein, oder wir könnten es nennen - 535 00:33:41,940 --> 00:33:45,010 Nennen wir es die Nummer zu sein sogar noch deutlicher. 536 00:33:45,010 --> 00:33:47,560 So dann habe ich wieder was die Zahl plus 1 ist, 537 00:33:47,560 --> 00:33:50,740 und jetzt habe ich ein andere Sache verändern hier und eine andere Sache, hier oben. 538 00:33:50,740 --> 00:33:54,350 Was muss ich auf Linie 21 zuerst ändern? >> [Unverständlich Studenten Antwort] 539 00:33:54,350 --> 00:33:57,610 [Malan] Ich habe es x zuweisen. Ich kann nicht einfach anrufen Inkrement (x). 540 00:33:57,610 --> 00:34:01,960 Ich brauche die Antwort, indem der Wert von x auf der linken Seite erinnern. 541 00:34:01,960 --> 00:34:04,680 Und obwohl x ist jetzt auf der linken Seite und rechts, das ist völlig in Ordnung 542 00:34:04,680 --> 00:34:08,860 weil die rechte Seite zuerst ausgeführt wird dann wird in die linke Hand, was plumpste - 543 00:34:08,860 --> 00:34:10,600 x in diesem Fall. 544 00:34:10,600 --> 00:34:12,159 Und dann endlich, ist dies eine einfache Lösung jetzt. 545 00:34:12,159 --> 00:34:17,230 Dies sollte nur entsprechen, was ist unten, int number. 546 00:34:17,230 --> 00:34:20,570 So eine ganze Reihe von Änderungen für eine wirklich dumme Funktion 547 00:34:20,570 --> 00:34:24,420 aber Vertreter der Dinge, die wir wollen immer werde zu tun. 548 00:34:24,420 --> 00:34:27,090 So machen buggy4. Ich habe irgendwo geschraubt. 549 00:34:27,090 --> 00:34:30,139 Oh, mein Gott. Fünf Fehler in einem 6-Zeilen-Programm. 550 00:34:30,139 --> 00:34:35,690 Also, was ist falsch in Zeile 18 Zeichen 5? 551 00:34:35,690 --> 00:34:39,610 Also muss ich diese, int deklarieren. 552 00:34:39,610 --> 00:34:41,920 Mal sehen. Es gibt eine ganze Reihe von anderen Fehlern. 553 00:34:41,920 --> 00:34:47,010 Oh, mein Gott - 19, 18, 21 - aber wieder, lass uns einfach den Bildschirm, Control L hier 554 00:34:47,010 --> 00:34:49,380 und erneut Clang. 555 00:34:49,380 --> 00:34:51,340 So 5 Probleme ist eigentlich nur, dass 1. 556 00:34:51,340 --> 00:34:57,520 So, jetzt lasst uns laufen buggy4, Enter. Puh, hat x korrekt erhöht. 557 00:34:57,520 --> 00:35:02,720 Gut. Fragen, wie die Zahlen erhöhen? Yeah. 558 00:35:02,720 --> 00:35:09,870 [Unverständlich Studenten stellen] >> Gute Frage. 559 00:35:09,870 --> 00:35:14,220 Wie kommt es, dass ich nur ändern, x die Nummer und das Programm wird sofort wissen? 560 00:35:14,220 --> 00:35:16,200 >> Auch daran denken, wie diese Abstraktion. 561 00:35:16,200 --> 00:35:21,600 Also, wenn ich Haupt und bin Ken ist Inkrement, ehrlich gesagt, es ist mir egal, was Ken seinem iPad nennt. 562 00:35:21,600 --> 00:35:26,570 Es ist mir egal, was er alles, was mit seiner Implementierung dieser Funktion zu tun hat aufruft. 563 00:35:26,570 --> 00:35:33,340 Dies ist eine Implementierung Detail, dass ich, main, keinen zu kümmern. 564 00:35:33,340 --> 00:35:38,250 Und so einfach ändern konsequent im Inneren der Funktion - Anzahl hier und Nummer hier - 565 00:35:38,250 --> 00:35:40,960 ist alles was man braucht, so lange ich neu kompilieren. 566 00:35:40,960 --> 00:35:44,180 Es ist ein bisschen wie wenn man darüber nachdenkt viele von uns, die von Ihnen mit Führerschein 567 00:35:44,180 --> 00:35:46,770 , die haben oder wenn Sie sogar in einem Auto habe angetrieben, 568 00:35:46,770 --> 00:35:50,950 die meisten von uns haben keine Ahnung, wie ein Auto unter der Haube arbeitet. 569 00:35:50,950 --> 00:35:54,970 Und wörtlich, wenn Sie die Haube, die meisten von uns zu öffnen - mich eingeschlossen - 570 00:35:54,970 --> 00:35:56,940 sind nicht wirklich wissen, was wir gerade sehen, 571 00:35:56,940 --> 00:35:59,220 Art, wie Sie vielleicht mit Sachen wie dieses Recht jetzt fühlen. 572 00:35:59,220 --> 00:36:01,480 Aber wir haben nicht wirklich zu interessieren, wie das Auto funktioniert, 573 00:36:01,480 --> 00:36:05,970 haben wir nicht zu kümmern, was alle Stangen und Kolben und Kabel im Inneren des Autos 574 00:36:05,970 --> 00:36:08,160 tatsächlich tun. 575 00:36:08,160 --> 00:36:12,770 So etwas wie, was Sie nennen sich der Kolben spielt hier keine Rolle in diesem Fall. Gleiche Idee. 576 00:36:12,770 --> 00:36:25,300 Yeah. >> [Unverständlich Studenten stellen] 577 00:36:25,300 --> 00:36:29,180 Wenn es mehrere Verwendungen der variable xa vorhin, 578 00:36:29,180 --> 00:36:32,150 Sie als Programmierer, müsste sie überall zu ändern. 579 00:36:32,150 --> 00:36:36,600 Oder Sie könnten buchstäblich Datei, Menü und dann auf Suchen, Tauschen - so ähnlich - 580 00:36:36,600 --> 00:36:39,170 aber Sie gehen zu müssen, damit die Änderungen sich. 581 00:36:39,170 --> 00:36:47,450 Sie müssen konsequent sein. >> [Schüler] Wenn es mehrere Variablen [unverständlich] 582 00:36:47,450 --> 00:36:53,100 Eine bestimmte Reihenfolge wie hier, wenn dies int andere Nummer? >> [Schüler] Richtig. 583 00:36:53,100 --> 00:36:56,590 [Malan] Yeah. Die Reihenfolge ist wichtig, wenn Sie den Aufruf der Funktion sind. 584 00:36:56,590 --> 00:37:00,050 >> Also, wenn ich riefen Inkrement hier mit etwas Komma etwas, 585 00:37:00,050 --> 00:37:01,680 gibt es eine direkte Zuordnung. 586 00:37:01,680 --> 00:37:05,690 Die erste Variable, was es heißt, wird eine Kopie des ersten Arguments hier gemacht. 587 00:37:05,690 --> 00:37:07,760 Entschuldigung. Dies sollte nicht eine Klammer sein. 588 00:37:07,760 --> 00:37:11,490 Das zweite Argument einer Linie mit dem zweiten. So Ordnung, ja, Angelegenheiten. Gut. 589 00:37:11,490 --> 00:37:17,020 Entschuldigung. Ich nahm den langen Weg, um dorthin zu gelangen. Weitere Fragen? Gut. 590 00:37:17,020 --> 00:37:20,610 Also lasst uns sehen, ob wir nicht ein Bild malen, was ist eigentlich los hier 591 00:37:20,610 --> 00:37:23,090 unter der Haube, so zu sprechen. 592 00:37:23,090 --> 00:37:26,640 Dies ist ein Rechteck, das den Arbeitsspeicher Ihres Computers darstellen könnten. 593 00:37:26,640 --> 00:37:30,970 Selbst wenn Sie keine Ahnung haben, wie das Gedächtnis funktioniert oder wie RAM funktioniert, 594 00:37:30,970 --> 00:37:33,940 zumindest davon ausgehen, dass Sie Sträuße davon haben in diesen Tagen. 595 00:37:33,940 --> 00:37:36,280 Du hast Megabyte es, du hast Gigabyte davon, 596 00:37:36,280 --> 00:37:40,870 und wir wissen aus Woche 0, dass ein Byte genau das, was ist? >> [Schüler] 8 Bit. 597 00:37:40,870 --> 00:37:42,950 8 Bit, nicht wahr? So 8 Nullen und 1. 598 00:37:42,950 --> 00:37:45,880 Also, wenn Ihr Computer verfügt über einen Gig RAM, 2 GB RAM in diesen Tagen, 599 00:37:45,880 --> 00:37:55,030 Sie haben eine Milliarde oder 2 Milliarden Byte Speicher oder grob 8 Milliarden oder 16 Milliarden Bits 600 00:37:55,030 --> 00:37:56,890 im Inneren des Computers. 601 00:37:56,890 --> 00:38:00,590 Im Gegensatz zu dem kleinen Wooly Willy Beispiel ist es nicht magnetische Partikel in der Regel nicht mehr. 602 00:38:00,590 --> 00:38:04,450 Zunehmend - in Laptops zumindest - es ist Solid State Drives, SSDs, 603 00:38:04,450 --> 00:38:08,580 die gerade haben keine beweglichen Teile. Es ist alles elektronisch. Es ist alles Strom-based. 604 00:38:08,580 --> 00:38:14,060 So dieses Rechtecks ​​denke nur als Vertreter der 1 oder 2 Gigabyte Speicher, die Sie haben. 605 00:38:14,060 --> 00:38:16,020 >> Es ist also ein Stück Erinnerung. 606 00:38:16,020 --> 00:38:19,830 Die Welt der Informatik hat Art abgeteilten 607 00:38:19,830 --> 00:38:22,950 Chunks Speicher zu tun verschiedene Dinge. 608 00:38:22,950 --> 00:38:27,190 Zum Beispiel, wenn dies Ihr Arbeitsspeicher des Computers, wie durch das Rechteck es vorgeschlagen, 609 00:38:27,190 --> 00:38:31,130 es stellt sich heraus, dass durch Konvention, an der Spitze des RAM, so zu sprechen, 610 00:38:31,130 --> 00:38:33,660 ist in der Regel eine so genannte Text-Segment. 611 00:38:33,660 --> 00:38:36,740 Das sind die 0 und 1, dass Sie zusammengestellt haben. 612 00:38:36,740 --> 00:38:39,020 Also, wenn wir unter der Haube, was a.out ist aussah, 613 00:38:39,020 --> 00:38:41,980 alle diese 0s und 1s, wenn Sie ein Programm ausführen, 614 00:38:41,980 --> 00:38:46,290 die 0 und 1 sind von Ihrer Festplatte in etwas namens RAM geladen, 615 00:38:46,290 --> 00:38:49,320 und im RAM sie ganz nach oben setzen. 616 00:38:49,320 --> 00:38:52,770 Inzwischen haben Sie andere Dinge: Initialisierung Daten deinitialisieren Daten. 617 00:38:52,770 --> 00:38:57,510 Diese 2 Schwaden von Speicher beziehen sich auf globale Variablen, die man nicht oft verwenden 618 00:38:57,510 --> 00:39:00,760 aber manchmal, wenn Sie das tun, dann landen sie dort als gut. 619 00:39:00,760 --> 00:39:04,260 Dann gibt es noch einige andere Sachen: Umgebungsvariablen, die wir nicht zu verbringen viel Zeit auf, 620 00:39:04,260 --> 00:39:06,860 dann aber 2 wichtige Dinge, die kommen wieder während des Semesters, 621 00:39:06,860 --> 00:39:08,550 Stack und Heap. 622 00:39:08,550 --> 00:39:12,210 So sind die meisten der Arbeitsspeicher Ihres Computers ist reserviert, wenn ein Programm 623 00:39:12,210 --> 00:39:15,370 für etwas genannt Stack und etwas namens den Haufen. 624 00:39:15,370 --> 00:39:18,840 Wir gehen nicht über den Haufen sprechen heute, aber wir werden über den Stapel zu sprechen. 625 00:39:18,840 --> 00:39:24,600 Der Stack soll zaubern die visuelle der Speisesaal Menüschalen in Mather House 626 00:39:24,600 --> 00:39:28,110 oder wo auch immer Sie sich gerade befinden, wo der Speisesaal Mitarbeiter reinigen sie jeden Tag, 627 00:39:28,110 --> 00:39:30,180 sie stapeln sich vom Boden aufwärts, 628 00:39:30,180 --> 00:39:34,550 und ähnlich in Erinnerung, da ist diese Idee, etwas auf einem Stapel, 629 00:39:34,550 --> 00:39:36,860 Putting etwas auf einem Stapel, legt etwas auf einem Stapel. 630 00:39:36,860 --> 00:39:38,240 Und was machen wir damit? 631 00:39:38,240 --> 00:39:41,860 >> Lasst vergrößern nur auf der unteren Hälfte des Bildes, den Arbeitsspeicher des Computers, 632 00:39:41,860 --> 00:39:44,330 folgendes vorzuschlagen. 633 00:39:44,330 --> 00:39:48,170 Es stellt sich heraus, dass, wenn Sie ein Programm wie a.out oder Hallo laufen - 634 00:39:48,170 --> 00:39:50,100 was das Programm ist, dass du geschrieben hast - 635 00:39:50,100 --> 00:39:54,020 wieder, die 0 und 1 sind von Ihrer Festplatte, die langfristige Lagerung ist geladen, 636 00:39:54,020 --> 00:39:57,230 bleibt dort, selbst wenn Sie den Stecker, in den Arbeitsspeicher geladen ziehen. 637 00:39:57,230 --> 00:40:00,610 RAM ist schneller als Festplatten - es ist kleiner als Festplatten - 638 00:40:00,610 --> 00:40:03,300 aber es ist, wo Programme während Sie sie sehen leben. 639 00:40:03,300 --> 00:40:08,230 So Doppelklick auf ein Programm auf einem Mac oder PC, ist es von der Festplatte in den Arbeitsspeicher geladen. 640 00:40:08,230 --> 00:40:11,520 Sobald es in den Arbeitsspeicher, die 0 und 1 unterwegs am Weg oben zu beladen, 641 00:40:11,520 --> 00:40:16,610 die sogenannte Text-Segment, aber dann, sobald Ihr Programm tatsächlich zu laufen beginnt, 642 00:40:16,610 --> 00:40:21,360 die wichtigste Funktion aufgerufen wird, und die wichtigsten, wie wir gesehen haben, hat oft lokale Variablen, 643 00:40:21,360 --> 00:40:24,870 und es hat ints und Streicher und Saiblinge und dergleichen. 644 00:40:24,870 --> 00:40:29,180 Also, wenn Ihr Programm, das Sie geschrieben haben oder das Programm, dass Sie doppelt geklickt 645 00:40:29,180 --> 00:40:32,970 verwendet einige Variablen innerhalb von Haupt-, 646 00:40:32,970 --> 00:40:37,240 sie am Ende an der Unterseite Ihres Stacks der Erinnerung, so zu sprechen. 647 00:40:37,240 --> 00:40:39,410 Genauer gesagt, was bedeutet das eigentlich? 648 00:40:39,410 --> 00:40:48,450 Dies bedeutet nur, dass, wenn wir wollten Anzahl der Bytes des RAM in Ihrem Computer, 649 00:40:48,450 --> 00:40:55,750 bemerken, dass dies Byte Zahl 0, dann sollte dieser Byte-Zahl 1, 2, 3, 4, 5, 6 liegen, 650 00:40:55,750 --> 00:41:01,480 den ganzen Weg bis zu 2 Milliarden würde den ganzen Weg bis es an der Spitze zu sein. 651 00:41:01,480 --> 00:41:05,880 Also mit anderen Worten, wenn wir über RAM oder Speicher sprechen von Bytes, 652 00:41:05,880 --> 00:41:11,500 es bedeutet nur, dass jemand entschieden hat, was auf jeden dieser Brocken von Memory-Nummer. 653 00:41:11,500 --> 00:41:16,650 Also, wenn Sie 32 Bits für einen int müssen oder wenn 8 Bits für ein char, 654 00:41:16,650 --> 00:41:18,840 wo enden sie in Erinnerung? 655 00:41:18,840 --> 00:41:22,350 >> Konzeptionell, sie am Ende nur an der Unterseite dieser Sache genannt Stack. 656 00:41:22,350 --> 00:41:25,870 Aber was ist interessant ist jetzt, wenn der Haupt ruft eine Funktion - 657 00:41:25,870 --> 00:41:28,750 nehme eine Funktion namens foo, nur ein beliebiger Name - 658 00:41:28,750 --> 00:41:32,330 was passiert ist, Haupt ist an der Unterseite dieses Stapels des Gedächtnisses; 659 00:41:32,330 --> 00:41:35,680 foo ist nun an der Spitze der wichtigsten in Speicher abgelegt. 660 00:41:35,680 --> 00:41:40,990 Also keine lokalen Variablen, die foo hat am Ende eine Art konzeptionell über denen in main. 661 00:41:40,990 --> 00:41:47,070 Wenn foo ruft eine andere Funktion aufgerufen bar, enden diese Variablen hier oben. 662 00:41:47,070 --> 00:41:50,120 Wenn bar fordert etwas anderes, hier, hier, hier. 663 00:41:50,120 --> 00:41:53,830 Also, was ist interessant über ein Programm ist, dass, wie Sie Funktionen aufrufen 664 00:41:53,830 --> 00:41:57,750 und als diese Funktionen aufrufen Funktionen und wie diese Funktionen aufrufen Funktionen 665 00:41:57,750 --> 00:42:01,470 Sie bauen diese Stapel von Funktionen im Speicher. 666 00:42:01,470 --> 00:42:06,890 Und nur einmal eine Funktion zurück, müssen Sie anfangen, diese Erinnerung zurück. 667 00:42:06,890 --> 00:42:10,860 So ist eine der einfachsten Möglichkeiten, um über genügend Arbeitsspeicher ausgeführt in einem Computerprogramm 668 00:42:10,860 --> 00:42:14,360 ist auf Funktionen, die nie wieder schreiben. 669 00:42:14,360 --> 00:42:18,900 So zum Beispiel, lasst uns so viel zeigen, mit einer absichtlich fehlerhaftes Programm. 670 00:42:18,900 --> 00:42:22,230 Lassen Sie mich gehen Sie vor und nicht # include, 671 00:42:22,230 --> 00:42:25,000 int main (void) 672 00:42:25,000 --> 00:42:32,940 und ich werde tun, während (2> 1), die wahrscheinlich nie auf uns zu ändern, 673 00:42:32,940 --> 00:42:37,560 und lassen Sie mich gehen Sie jetzt und tun printf. 674 00:42:37,560 --> 00:42:40,700 Eigentlich ist das sein wird visuell weniger interessant. Lassen Sie uns dies tun. 675 00:42:40,700 --> 00:42:50,240 Für int i = 0; i> 0 - lassen Sie uns diesen Fehler - i + +. 676 00:42:50,240 --> 00:42:52,720 Und lasst uns nicht printf hier. Lasst uns praktizieren, was ich predige. 677 00:42:52,720 --> 00:43:00,190 Lassen Sie uns hier eine Methode, void Chor, und wir int i say, 678 00:43:00,190 --> 00:43:06,830 und dann werde ich printf sagen - nein, lassen Sie uns dies mehr interessant. 679 00:43:06,830 --> 00:43:15,790 Lasst uns eigentlich nicht gedruckt überhaupt nichts. Lass uns einfach tun: Chor (i). 680 00:43:15,790 --> 00:43:20,390 Gut. Also das ist buggy denn warum? 681 00:43:20,390 --> 00:43:23,380 Ich mache dies als ich, weil das Programm nicht wirklich etwas tun Interesse gehen. 682 00:43:23,380 --> 00:43:25,320 >> Aber das ist nicht das Ziel. 683 00:43:25,320 --> 00:43:29,630 Das Ziel ist es, ein Programm deren Hauptfunktion das tut, was offenbar zu schreiben? 684 00:43:30,720 --> 00:43:32,860 Selbst aufrufen. Und tatsächlich, wir brauchen nicht die Schleife. 685 00:43:32,860 --> 00:43:37,200 Lasst uns einmal zu vereinfachen dies nur, um nicht aus den Augen wirklich die grundlegende Fehler zu verlieren. 686 00:43:37,200 --> 00:43:39,640 Haupt-Anrufe Chorus etwas Chor singen, 687 00:43:39,640 --> 00:43:41,440 dann habe ich etwas Dummes, und ich hatte Chorus Call chorus 688 00:43:41,440 --> 00:43:43,760 weil ich davon ausgegangen, jemand anderes würde es vielleicht zu implementieren, 689 00:43:43,760 --> 00:43:47,210 und jetzt das wird nicht noch kompilieren. Ich brauche was zu tun? 690 00:43:47,210 --> 00:43:49,970 Ich brauche den Prototyp erinnern. 691 00:43:49,970 --> 00:43:56,110 Also muss ich hier oben nichtig Chor (int i); 692 00:43:56,110 --> 00:43:59,210 So jetzt, wenn ich mich hier gehen - eigentlich, verwenden wir das größere Fenster. 693 00:43:59,210 --> 00:44:01,980 Lasst uns voran gehen und Chor. 694 00:44:01,980 --> 00:44:06,490 Lasst uns voran gehen und Chor. 695 00:44:06,490 --> 00:44:08,370 Verwendung von nicht deklarierter Bezeichner i. 696 00:44:08,370 --> 00:44:12,500 Oh, das war dumm. Wir brauchen nicht das Argument. Lass uns einfach tun. 697 00:44:12,500 --> 00:44:16,370 Ich wünschte, wir hätten auf diese Weise gestartet. Es wäre viel einfacher Programm zu schreiben. 698 00:44:16,370 --> 00:44:25,590 There. Jetzt gehen wir zu meinem Terminal-Fenster, führen Clang, und hier gehen wir. 699 00:44:25,590 --> 00:44:28,460 Das war wirklich schnell. 700 00:44:28,460 --> 00:44:31,150 Was ist eigentlich gerade passiert, wenn? 701 00:44:31,150 --> 00:44:33,730 Nun, ich will hinzufügen, die Druckzeile damit wir sehen können. 702 00:44:33,730 --> 00:44:43,490 Lassen Sie mich sagen printf ("Ich bin hier") - keine Variablen. Wir werden es so lassen. 703 00:44:43,490 --> 00:44:47,480 Lassen Sie mich erneut zu machen. Lassen Sie mich erneut Chor. 704 00:44:47,480 --> 00:44:57,380 Und ... komm schon. Keep going. 705 00:44:57,380 --> 00:44:59,930 Nebenbei, warum hat es nicht abgestürzt noch? 706 00:44:59,930 --> 00:45:02,080 Die Segmentation Fault passiert super schnell vor. 707 00:45:02,080 --> 00:45:06,570 [Unverständlich Student Response] >> Genau. So braucht es Zeit zu drucken, nicht wahr? 708 00:45:06,570 --> 00:45:08,610 Es dauert nur mehr Arbeit auf dem Computer-Teil. 709 00:45:08,610 --> 00:45:10,620 Und da ist es: Segmentation fault. 710 00:45:10,620 --> 00:45:12,340 >> So bemerken, wie schnell Programme auszuführen. 711 00:45:12,340 --> 00:45:14,130 Wenn Sie nicht drucken alles, super schnell. 712 00:45:14,130 --> 00:45:18,770 Aber wir haben noch diese Segmentation Fault, weil, was geschah? 713 00:45:18,770 --> 00:45:21,210 Wenn Sie darüber nachdenken, wie den Arbeitsspeicher Ihres Computers gelegt wird, 714 00:45:21,210 --> 00:45:28,740 dies geschieht zu sein Haupt, aber hier lasst uns einfach nennen diesen Chor, und nennen wir diesen Chor. 715 00:45:28,740 --> 00:45:34,550 Und jetzt, wenn ich meine Ästhetik richtig machen, wird diese gerade dabei, Chor, Chor, Chor sagen, 716 00:45:34,550 --> 00:45:40,550 Chor, Chor, Chor, Chor, bis zum Überdruss, und schließlich, was passieren wird? 717 00:45:40,550 --> 00:45:45,630 Wenn das große Bild, buchstäblich, ist das, was gerade geschieht, konzeptionell? 718 00:45:46,520 --> 00:45:48,630 Die Stacküberläufe der Haufen. 719 00:45:48,630 --> 00:45:51,940 Oder, schlimmer noch, man muss nur alles, einschließlich der Textsegment überrannt, 720 00:45:51,940 --> 00:45:54,590 welches die 0 und 1, die Ihr Programm vertreten. 721 00:45:54,590 --> 00:45:57,080 Kurz gesagt, ist dies nur super, super schlecht. 722 00:45:57,080 --> 00:45:58,830 Ihr Programm hat außer Kontrolle geraten. 723 00:45:58,830 --> 00:46:01,220 Sie verwenden viel mehr Speicher, als Sie gedacht 724 00:46:01,220 --> 00:46:03,960 alles wegen einer dummen Fehler in diesem Fall 725 00:46:03,960 --> 00:46:08,040 oder in diesem Fall ein sehr bewusst getan Funktion nennt sich. 726 00:46:08,040 --> 00:46:09,500 Nun, dies ist nicht alles schlecht. 727 00:46:09,500 --> 00:46:13,800 Funktionen, die sich selbst tatsächlich hat große Macht, wenn Sie es richtig zu verwenden. 728 00:46:13,800 --> 00:46:15,800 Ich habe es nicht richtig eingesetzt sind. 729 00:46:15,800 --> 00:46:19,780 Also das ist nicht alles schlecht, aber die Tatsache, dass ich eigentlich nie aufhören, mich selbst 730 00:46:19,780 --> 00:46:23,520 ist eine grundlegende Schwäche hier dieses Programms. 731 00:46:23,520 --> 00:46:26,400 Also, wo gehen wir mit dieser ganzen Sache? Was ist wirklich passiert? 732 00:46:26,400 --> 00:46:30,340 Als ich das Inkrement Funktion aufrufen, wie wir in diesen Beispielen taten, 733 00:46:30,340 --> 00:46:33,420 Ich habe einen Wert wie 1, dass ich gehe in. 734 00:46:33,420 --> 00:46:37,570 Ich gehe in eine Kopie der Nummer 1, so passiert folgendes. 735 00:46:37,570 --> 00:46:44,240 Lassen Sie uns in die Schrittweite beispielsweise gehen, dieser Kerl hier drüben. 736 00:46:44,240 --> 00:46:46,870 Hier ist, was tatsächlich passiert. 737 00:46:46,870 --> 00:46:53,400 Wenn ich Inkrement anrufen und ich gehe in x, bildlich, was ist hier los ist. 738 00:46:53,400 --> 00:46:59,520 >> Wenn ich den Wert 1 gespeichert hier und ich eigentlich nennen Inkrement 739 00:46:59,520 --> 00:47:04,330 Welches ist nun als Chor - das iPad wirft mich hier. 740 00:47:04,330 --> 00:47:09,760 Nennen wir dieses Inkrement, und wir wissen nicht, was das nächste Funktion sein wird. 741 00:47:09,760 --> 00:47:14,840 Also, was tatsächlich passiert ist hier irgendwo in main Ich habe ein Stück Speicher 742 00:47:14,840 --> 00:47:17,000 das ist das Speichern der Nummer 1. 743 00:47:17,000 --> 00:47:19,380 Wenn ich Inkrement nennen, bin ich mit einem anderen Stück Speicher, 744 00:47:19,380 --> 00:47:21,230 aber jetzt habe ich die Kopie des 1. 745 00:47:21,230 --> 00:47:26,660 Wenn ich diesen Wert erhöhen, wird dies 2, 746 00:47:26,660 --> 00:47:30,560 aber was dann geschieht, sobald Inkrement zurückkehrt? 747 00:47:30,560 --> 00:47:33,630 Dieser Speicher bekommt nur zurück an das Betriebssystem übergeben, 748 00:47:33,630 --> 00:47:37,450 was bedeutet, alles, was Sie getan haben, ist nichts Brauchbares. 749 00:47:37,450 --> 00:47:43,120 Die 1, die ursprünglich in den wichtigsten enthielt noch wirklich da ist. 750 00:47:43,120 --> 00:47:44,890 Also, wo gehen wir damit um? 751 00:47:44,890 --> 00:47:49,770 Es stellt sich heraus, dass im Speicher Sie diesen back-to-back Folge von Bytes haben 752 00:47:49,770 --> 00:47:53,050 dass man Sachen in gesetzt, und es stellt sich heraus, dass wir schon etwas gesehen 753 00:47:53,050 --> 00:47:55,390 Das beinhaltet die Dinge Rücken an Rücken an Rücken an Rücken. 754 00:47:55,390 --> 00:47:59,860 Was ist eine Zeichenkette Woche 1 und jetzt Woche 2? 755 00:48:00,020 --> 00:48:01,980 Es ist einfach eine Sammlung von Zeichen. 756 00:48:01,980 --> 00:48:04,310 So stellt sich heraus wie Sie können Nummern in den Speicher zu schreiben, 757 00:48:04,310 --> 00:48:06,990 ähnlich kannst du Zeichen im Speicher. 758 00:48:06,990 --> 00:48:10,530 Und wenn wir damit beginnen, Zeichen im Speicher Rücken an Rücken an Rücken an Rücken, 759 00:48:10,530 --> 00:48:13,620 es stellt sich heraus, dass mit einfachsten Dinge wie eine for-Schleife oder eine while-Schleife, 760 00:48:13,620 --> 00:48:17,170 man von links nach rechts über die Zeichen in einer Zeichenfolge iterieren 761 00:48:17,170 --> 00:48:20,600 und starten Sie massiert sie in verschiedene Charaktere insgesamt - 762 00:48:20,600 --> 00:48:23,370 a könnte b werden, könnte b c geworden - 763 00:48:23,370 --> 00:48:27,780 so dass letztlich, können wir einen englischen Satz, die tatsächlich Sinn macht 764 00:48:27,780 --> 00:48:30,310 und konvertieren jedes dieser Briefe ein zu einer Zeit, 765 00:48:30,310 --> 00:48:34,400 zu Fuß durch unsere Computer-Speicher von links nach rechts, um tatsächlich zu verschlüsseln. 766 00:48:34,400 --> 00:48:35,810 So lasst uns unsere fünf Minuten Pause hier 767 00:48:35,810 --> 00:48:40,730 und wenn wir zurück kommen, werden wir beginnen diesen Prozess der Scrambling Informationen. 768 00:48:42,020 --> 00:48:43,520 >> Gut. 769 00:48:43,520 --> 00:48:48,070 Bevor wir in eine Krypto tauchen und diese Dinge genannt Arrays 770 00:48:48,070 --> 00:48:51,470 Lassen Sie mich Pause für alle Fragen, weil ich, wie ich Art wirklich verwirrt fühlen 771 00:48:51,470 --> 00:48:54,080 einige dieser Themen. Lassen Sie uns also fix jetzt, wenn wir können. 772 00:48:54,080 --> 00:48:58,700 Wir haben gerade darüber gesprochen Rückgabewerte, sprachen wir über Argumente, 773 00:48:58,700 --> 00:49:03,250 und wir sprachen über diese Vorstellung, die wir kommen zurück, um in den kommenden Wochen, 774 00:49:03,250 --> 00:49:08,720 der Betrachtung Speicher als eine ganze Reihe dieser gestapelten Schalen, so zu sprechen, 775 00:49:08,720 --> 00:49:12,660 von unten nach oben auf, so dass jeder Boden, der auf den Stapel gelegt wird 776 00:49:12,660 --> 00:49:16,530 stellt eine Funktion, die derzeit nennt. 777 00:49:17,900 --> 00:49:20,260 Haben Sie Fragen? 778 00:49:20,260 --> 00:49:22,640 Lassen Sie mich eine Frage stellen hier. 779 00:49:22,640 --> 00:49:27,890 Lassen Sie mich vereinfachen diese zurück, was es war, bevor einige unserer früheren Q & A. 780 00:49:27,890 --> 00:49:35,570 Die Tatsache, dass Inkrement öffnende Klammer, int Zahl hat, geschlossen Klammern - 781 00:49:35,570 --> 00:49:39,110 was bedeutet int Zahl darstellen? 782 00:49:39,110 --> 00:49:42,790 [Schüler] Ein Argument. >> Ein Argument. Okay. Aber was ist ein Argument? 783 00:49:42,790 --> 00:49:46,370 [Unverständlich Student Response] >> Was ist das? >> [Schüler] Etwas, das Sie weitergeben in. 784 00:49:46,370 --> 00:49:49,940 Okay, so etwas, dass Sie vorbei in. Und ganz allgemein, es ist nur der Eingang. 785 00:49:49,940 --> 00:49:52,450 Wenn Sie schreiben eine Funktion und diese Funktion der Sinn des Lebens 786 00:49:52,450 --> 00:49:55,770 ist zu tun, etwas ein wenig anders, jedesmal wenn Sie es verwenden, 787 00:49:55,770 --> 00:50:00,110 dann besteht der einzige Weg für die wirklich passieren würde zu sein scheinen, um es mit Input versorgen 788 00:50:00,110 --> 00:50:03,510 so dass es etwas anderes mit diesem Eingang tun jedesmal. 789 00:50:03,510 --> 00:50:06,650 >> So müssen Sie zwei Dinge festlegen, wann eine Funktion nimmt die Eingabe. 790 00:50:06,650 --> 00:50:09,590 Sie müssen den Namen, die Sie an diesem Eingang geben angeben 791 00:50:09,590 --> 00:50:12,700 rein für Ihren eigenen Komfort, so dass Sie sich darauf beziehen 792 00:50:12,700 --> 00:50:16,540 in der Funktion, die Sie selbst schreiben, wie ich es hier getan habe in Zeile 32. 793 00:50:16,540 --> 00:50:20,800 Aber Sie müssen auch angeben, welchen Typ, weil C ist eine Programmiersprache 794 00:50:20,800 --> 00:50:25,940 das erfordert nur, dass, wenn Sie eine Variable wollen, um dem Computer mitzuteilen, welchen Datentyp es haben, 795 00:50:25,940 --> 00:50:30,200 zu einem großen Teil, so dass es weiß, wie viele Bits für diese Variable zuordnen 796 00:50:30,200 --> 00:50:33,020 denn es könnte 6 sein - sorry, wird es nicht 6 sein. 797 00:50:33,020 --> 00:50:37,080 Es kann 16 sein, es kann 8 sein, es kann 32 sein, auch 64, 798 00:50:37,080 --> 00:50:39,130 aber der Computer wissen muss. 799 00:50:39,130 --> 00:50:43,180 Nun stellt der int auf der linken Seite, was hingegen? 800 00:50:46,350 --> 00:50:48,850 [Unverständlich Student Response] >> Was ist das? >> [Schüler] Art der Funktion. 801 00:50:48,850 --> 00:50:53,610 Der Typ einer Funktion und, genauer gesagt, die Art ihrer Ausgabe. Right. 802 00:50:53,610 --> 00:50:57,380 Während also die Sache in Klammern stellt seine Eingabe, wenn überhaupt, 803 00:50:57,380 --> 00:50:59,660 die Sache auf der linken Seite stellt seinen Ausgang. 804 00:50:59,660 --> 00:51:03,530 Und in diesem Fall, increment anscheinend gibt einen int, 805 00:51:03,530 --> 00:51:07,690 und so int ist der Rückgabetyp dieser Funktion. 806 00:51:07,690 --> 00:51:09,340 Was bedeutet es, zurückzukehren? 807 00:51:09,340 --> 00:51:15,090 Buchstäblich, verwenden Sie das Schlüsselwort return und dann, wenn, was Sie kehren zurück 808 00:51:15,090 --> 00:51:18,600 rechts von dem Schlüsselwort eine ganze Zahl, 809 00:51:18,600 --> 00:51:21,660 dann ist das in der Tat im Einklang mit dem, was wir versprochen haben. 810 00:51:21,660 --> 00:51:26,410 Man konnte nicht etwas tun - Hallo Welt - denn das ist ein String. 811 00:51:26,410 --> 00:51:28,860 >> Offensichtlich ist es nicht ganzzahlig. 812 00:51:28,860 --> 00:51:33,140 Also kurz gesagt, die Belastung ist wirklich auf uns, der Programmierer, um genau zu sein 813 00:51:33,140 --> 00:51:37,770 , was wir zurückkehren und dann tatsächlich über die Rückkehr zu gehen. 814 00:51:37,770 --> 00:51:43,440 Der Kontext jetzt hier ist, dass den Arbeitsspeicher Ihres Computers ein Gigabyte, 2 Gigabyte - 815 00:51:43,440 --> 00:51:45,920 was - vielleicht ist es mehr ist, ist es vielleicht weniger, 816 00:51:45,920 --> 00:51:49,050 aber der Computer sieht es als mit unterschiedlichen Abschnitten. 817 00:51:49,050 --> 00:51:51,200 Irgend etwas geht da unten, geht etwas anderes dort oben, 818 00:51:51,200 --> 00:51:54,290 verschiedene Sachen geht in die Mitte, und heute haben wir gerade anfangen erzählt die Geschichte, 819 00:51:54,290 --> 00:51:56,340 aber wir kommen zurück zu dieser Zeit. 820 00:51:56,340 --> 00:51:59,980 Denn jetzt ist das einzige Stück der Erinnerung uns wirklich wichtig das Textsegment 821 00:51:59,980 --> 00:52:03,360 weil die gerade stellt die 0 und 1, dass Clang hat ausgegeben. 822 00:52:03,360 --> 00:52:06,050 Also, wenn Sie einen Befehl ausführen, an der Tastatur wie a.out 823 00:52:06,050 --> 00:52:09,110 oder doppelklicken Sie auf ein Symbol auf Mac OS oder Windows 824 00:52:09,110 --> 00:52:11,880 Ihr Programm von der Festplatte in den Arbeitsspeicher geladen 825 00:52:11,880 --> 00:52:16,330 und es ist an der Spitze der Arbeitsspeicher Ihres Computers plumpste, so zu sprechen. 826 00:52:16,330 --> 00:52:20,450 Inzwischen, wie Ihr Programm beginnt zu laufen und die wichtigsten aufgerufen wird 827 00:52:20,450 --> 00:52:23,640 im Programm, das Sie geschrieben oder das Programm Microsoft oder Apple schrieb, 828 00:52:23,640 --> 00:52:27,860 seine lokalen Variablen am Ende dort unten an der Unterseite Ihres Computers. 829 00:52:27,860 --> 00:52:33,230 Aber wenn Haupt eine andere Funktion aufruft, die selbst Variablen oder Argumente hat, landen sie darüber. 830 00:52:33,230 --> 00:52:36,680 Und wenn diese Funktion nennt etwas, landen sie darüber, darüber, darüber. 831 00:52:36,680 --> 00:52:41,460 >> Und nur einmal eine Funktion erfolgt die Ausführung ist der Stapel von Ablagen, so zu sprechen, 832 00:52:41,460 --> 00:52:43,240 beginnen, sich tiefer und tiefer. 833 00:52:43,240 --> 00:52:48,250 Und das ist, was dann in einer Nussschale, erklärt, warum, wenn Sie cube nennen 834 00:52:48,250 --> 00:52:51,550 oder Sie Inkrement nennen, sind Sie in einer Kopie des Wertes vorbei. 835 00:52:51,550 --> 00:52:55,520 Und was das bedeutet bildlich ist, dass Sie buchstäblich schriftlich die Nummer 1 836 00:52:55,520 --> 00:53:00,460 in einem anderen Teil des Speichers, verändert, daß 1 bis 2 in dem Fall eines Inkrements 837 00:53:00,460 --> 00:53:04,820 oder einem 8 im Fall von Cube und dann wirft diesen Speicher auswärts 838 00:53:04,820 --> 00:53:09,140 sobald der Inkrement oder den Cube Funktion zurückkehrt. Frage. 839 00:53:09,140 --> 00:53:12,900 [Schüler] Wo werden globale Variablen gespeichert? 840 00:53:12,900 --> 00:53:18,100 Globale Variablen werden in dem, was derzeit als die initialisierten Daten oder initialisierte Daten gespeichert werden, 841 00:53:18,100 --> 00:53:21,920 Der Unterschied ist, wenn Sie eine globale Variable haben und weisen Sie ihm sofort einen Wert 842 00:53:21,920 --> 00:53:24,640 mit dem Gleichheitszeichen, landet es an der Spitze gibt, 843 00:53:24,640 --> 00:53:29,200 und wenn Sie nur sagen, int x; ohne Wert, landet es etwas niedriger RAM 844 00:53:29,200 --> 00:53:31,710 einfach durch Konvention. 845 00:53:31,710 --> 00:53:34,940 Weitere Fragen? Gut. 846 00:53:34,940 --> 00:53:37,340 So Dieses Bild wird wieder kommen, wie wir stärker erhalten 847 00:53:37,340 --> 00:53:39,170 mit dem, was wir mit dem Computer zu tun, 848 00:53:39,170 --> 00:53:42,720 aber für jetzt, lasst uns eine kurze Einführung in Kryptographie, 849 00:53:42,720 --> 00:53:46,080 eine bestimmte Art von Kryptographie, nicht lösen alle Probleme der Welt 850 00:53:46,080 --> 00:53:47,720 aber lösen einige von ihnen. 851 00:53:47,720 --> 00:53:51,700 In diesem Fall hier haben wir etwas namens secret-Key-Kryptographie. 852 00:53:51,700 --> 00:53:56,410 Secret-Key-Kryptographie, wie der Name schon sagt, bezieht seine Sicherheit aus einer geheim. 853 00:53:56,410 --> 00:54:00,690 >> Zum Beispiel, wenn Sie wieder zurück in die Grundschule und Sie waren auf der Durchreise ein kleines Geheimnis Liebesbrief 854 00:54:00,690 --> 00:54:04,850 zu dem Jungen oder Mädchen du Zerkleinerung auf, wenn Sie diesen Hinweis durch das Publikum weitergeben wollte, 855 00:54:04,850 --> 00:54:08,380 würden Sie wahrscheinlich nicht schreiben wie eine Notiz in Englisch oder was auch immer Ihre Muttersprache ist. 856 00:54:08,380 --> 00:54:13,340 Vielmehr können Sie verschlüsseln oder Sie könnten dann schicken Sie einfach eine SMS-Nachricht in diesen Tagen. 857 00:54:13,340 --> 00:54:15,460 Aber man könnte tatsächlich passieren sie eine Notiz über den Klassenraum. 858 00:54:15,460 --> 00:54:18,700 Und um dies sicher zu tun in einer Weise, dass Ihre Freunde und Lehrer 859 00:54:18,700 --> 00:54:22,650 weiß nicht, was du schreibst, könnte man sich mit einem relativ einfachen Algorithmus, 860 00:54:22,650 --> 00:54:25,920 junge, obwohl Sie vielleicht, um nur kriechen die Worte. 861 00:54:25,920 --> 00:54:28,130 Anstatt also das Schreiben eines könnten Sie schreiben, b, 862 00:54:28,130 --> 00:54:30,220 anstelle von b den Sie schreiben c, 863 00:54:30,220 --> 00:54:32,140 anstelle von c könnten Sie schreiben, d, und so weiter. 864 00:54:32,140 --> 00:54:34,360 Oder Sie könnten sich mit einem komplexeren Übersetzung 865 00:54:34,360 --> 00:54:36,720 Briefe an verschiedene Buchstaben. 866 00:54:36,720 --> 00:54:39,740 Aber der Haken ist, der Junge oder das Mädchen, dem Sie senden diese Notiz 867 00:54:39,740 --> 00:54:45,020 muss man wissen, etwas, das, was offensichtlich ist? >> [Schüler] Was Sie Senden. 868 00:54:45,020 --> 00:54:49,720 Was Ihr Geheimnis ist, wie, was ist das Mapping zwischen a und b-und c-und d's. 869 00:54:49,720 --> 00:54:54,650 Ist es nur die Zugabe von 1 zu jedem der Buchstaben von a nach b, b to c gehen? 870 00:54:54,650 --> 00:54:56,670 Ist es komplizierter als das? 871 00:54:56,670 --> 00:55:01,540 >> Also, du und dein Schwarm müssen diese geheimen Informationen haben, 872 00:55:01,540 --> 00:55:03,190 aber es ist eine Art catch-22 hier. 873 00:55:03,190 --> 00:55:06,830 Wenn dies das erste Mal, Sie senden diesen Liebesbrief durch die Klasse, 874 00:55:06,830 --> 00:55:10,720 wie ist das Junge oder ein Mädchen zu wissen, was das Geheimnis ist sogar? 875 00:55:10,720 --> 00:55:13,930 So geheimen Schlüssel crypto nicht lösen alle Probleme der Welt, 876 00:55:13,930 --> 00:55:16,320 und es gibt tatsächlich eine Beziehung hier, dass wir kommen zurück, um in Richtung Semester Ende. 877 00:55:16,320 --> 00:55:25,110 Ebenso haben die meisten von uns nicht wissen, dass jemand, der arbeitet zum Beispiel bei Amazon.com, 878 00:55:25,110 --> 00:55:28,190 und noch viele von uns haben wahrscheinlich Zeug bei Amazon.com gekauft, 879 00:55:28,190 --> 00:55:31,990 und wir haben gelernt, davon ausgehen, dass diese E-Commerce-Transaktionen sicher sind. 880 00:55:31,990 --> 00:55:36,470 Die URL sagt wohl https, gibt es vielleicht eine dumme kleine Schloss-Symbol irgendwo, 881 00:55:36,470 --> 00:55:39,930 es gibt eine Art von Kryptographie Sicherung Ihrer Kreditkarten-Informationen 882 00:55:39,930 --> 00:55:42,160 zwischen Ihnen und Amazon.com. 883 00:55:42,160 --> 00:55:45,430 Und doch, wenn der Kryptographie geht zu wissen, ein Geheimnis 884 00:55:45,430 --> 00:55:48,620 und doch habe ich kenne niemanden, bei Amazon und ich habe sicherlich nicht jede Art von geheimen angeordnet 885 00:55:48,620 --> 00:55:52,710 mit jemandem bei Amazon, wie ist mein Computer oder mein Browser dies zu tun? 886 00:55:52,710 --> 00:55:55,720 Es stellt sich heraus, es gibt andere Arten der Kryptographie überhaupt, dass das Problem lösen. 887 00:55:55,720 --> 00:55:57,670 Aber für heute, werden wir auf die einfache ein Schwerpunkt 888 00:55:57,670 --> 00:56:00,290 wo man im voraus zu vereinbaren, um ein Geheimnis wissen, 889 00:56:00,290 --> 00:56:03,760 wie +1 oder eine Zuordnung zwischen a und b der. 890 00:56:03,760 --> 00:56:05,840 Und das Verfahren der Kryptographie Regel handelt es sich dabei. 891 00:56:05,840 --> 00:56:08,620 Sie haben einige Klartext, hier auf der linken Seite dargestellt, 892 00:56:08,620 --> 00:56:12,930 Sie führen Sie es durch irgendeine Art von Algorithmus oder Verfahren für deren Verschlüsselung - 893 00:56:12,930 --> 00:56:15,100 vielleicht ist das nur ein b wird, wird b c - 894 00:56:15,100 --> 00:56:17,490 und dann am Ende mit chiffrierten Text. 895 00:56:17,490 --> 00:56:20,380 Inzwischen einmal dein Schwarm erhält dieses Geheimnis beachten Sie, 896 00:56:20,380 --> 00:56:24,200 er oder sie muss dann entschlüsseln durch allgemein die Umkehrung dieses Algorithmus 897 00:56:24,200 --> 00:56:27,190 so, um wieder den Klartext. 898 00:56:27,190 --> 00:56:28,960 Es gibt physische Inkarnationen dies. 899 00:56:28,960 --> 00:56:31,680 >> Zum Beispiel, ist dies ein kleines Geheimnis Decoder Ring, 900 00:56:31,680 --> 00:56:35,110 und dies ist ein Ring in dem Sinne, dass es zwei Zifferblättern hier. 901 00:56:35,110 --> 00:56:38,490 Auf dem Außenumfang dieser Sache gibt es Buchstaben A bis Z, 902 00:56:38,490 --> 00:56:40,340 obwohl sie sind in zufälliger Reihenfolge 903 00:56:40,340 --> 00:56:42,880 und auf der Innenseite, es gibt tatsächlich einige Zahlen 904 00:56:42,880 --> 00:56:46,620 so dass mit diesem Ring können Sie Art schalten Sie die Außenseite, aber nicht das Innere 905 00:56:46,620 --> 00:56:49,140 um Line-Up Zahlen mit Buchstaben. 906 00:56:49,140 --> 00:56:53,020 Von einem Film namens A Christmas Story, werden Sie sehen, dass kleine Ralphie 907 00:56:53,020 --> 00:56:58,000 war so eifrig, um herauszufinden, was Little Orphan Annie geheime Nachricht an ihn war 908 00:56:58,000 --> 00:57:02,570 Das war mitgeteilt worden, glaube ich, in der Form von numerischen Nachrichten auf einem Cornflakes-Packung 909 00:57:02,570 --> 00:57:07,220 und man musste all die kleinen Karten, die in der Cornflakes-Packung kam ansammeln, 910 00:57:07,220 --> 00:57:09,770 Sie hatten, sie zu versenden in, musste man wieder das Geheimnis Decoder Ring 911 00:57:09,770 --> 00:57:13,910 so dass Sie endlich herausfinden, was die Zuordnung zwischen Buchstaben und Zahlen 912 00:57:13,910 --> 00:57:15,550 oder Buchstaben und Buchstaben. 913 00:57:15,550 --> 00:57:19,520 Wie in einem Computer können wir über die Implementierung oder vertreten Dinge wie diese gehen? 914 00:57:19,520 --> 00:57:22,560 Wir brauchen einen Weg, uns auszudrücken ein wenig mehr flexibel 915 00:57:22,560 --> 00:57:25,080 als unsere Variablen bisher erlaubt haben. 916 00:57:25,080 --> 00:57:29,000 Wir hatten ints, wir hatten chars, wir hatten die Schwimmer und Doppelzimmer und ein paar andere, 917 00:57:29,000 --> 00:57:34,200 aber das sind einzelne Stücke der Erinnerung, die nicht wirklich erlauben uns, Dinge auszudrücken 918 00:57:34,200 --> 00:57:36,440 wie Wörter und Sätze und Phrasen. 919 00:57:36,440 --> 00:57:38,630 In der Tat haben wir solche Dinge Strings genannt, 920 00:57:38,630 --> 00:57:42,660 aber wir versprechen, dass dies wirklich nur eine Vereinfachung der CS50-Bibliothek 921 00:57:42,660 --> 00:57:45,540 dass wir zu schälen Absicht zurück. 922 00:57:45,540 --> 00:57:47,500 Und so beginnen wir, dass hier tun. 923 00:57:47,500 --> 00:57:49,840 Lassen Sie mich gehen Sie vor und öffnen einer Datei - 924 00:57:49,840 --> 00:57:54,100 alle diese Dateien zur Verfügung stehen, wie gewohnt, online - sogenannte array.c 925 00:57:54,100 --> 00:57:58,960 ein Problem nicht mit Saiten zu lösen, sondern dass ein Bild malt hier 926 00:57:58,960 --> 00:58:01,520 wie könnten wir so etwas als ein Array. 927 00:58:01,520 --> 00:58:04,050 >> Ein Array ist ein Datentyp. 928 00:58:04,050 --> 00:58:10,730 Es ist eine Art von variablen der Art, dass mehrere kleinere Datentypen innerhalb der IT hat 929 00:58:10,730 --> 00:58:12,680 Rücken an Rücken an Rücken an Rücken. 930 00:58:12,680 --> 00:58:16,980 So zum Beispiel, wenn wir wollten ein kleines Programm, das Ihnen Ihr Quiz durchschnittliche schreiben 931 00:58:16,980 --> 00:58:19,780 für einen Kurs wie 50, 2 Quiz hat, 932 00:58:19,780 --> 00:58:23,450 man konnte sehr leicht zu schreiben dieses Programm auch auf einige der letzten Woche Materials 933 00:58:23,450 --> 00:58:28,830 mit GetInt und ein paar Variablen: int quiz1, int quiz2. 934 00:58:28,830 --> 00:58:30,550 Und es ist ziemlich einfach. 935 00:58:30,550 --> 00:58:33,500 Es ist vielleicht 10, 20 Zeilen Code max, ein Programm zu implementieren 936 00:58:33,500 --> 00:58:38,940 , die den Benutzer für 2 Quiz Partituren fragt und berechnet dann ihre durchschnittliche 937 00:58:38,940 --> 00:58:42,020 indem sie zusammen, Dividieren durch zwei und dann Drucken der Ergebnisse. 938 00:58:42,020 --> 00:58:46,400 Wir könnten wahrscheinlich tun ziemlich leicht jetzt nach einer bestimmten Anzahl von Minuten. 939 00:58:46,400 --> 00:58:49,450 Aber das Problem ist wohl die, dass 50 3 Quiz oder 4 hatte. 940 00:58:49,450 --> 00:58:52,830 Angenommen, Sie möchten das gleiche Programm für eine Klasse, die sich wöchentlich musste Quiz verwenden wollte. 941 00:58:52,830 --> 00:58:55,100 Denken Sie über eine Klasse, die wöchentliche Quiz hat. 942 00:58:55,100 --> 00:58:58,840 Wenn es 16 oder so Woche in einem Semester, jetzt haben Sie 16 Variablen: 943 00:58:58,840 --> 00:59:03,030 int quiz1, int quiz2, int quiz3, int quiz4. 944 00:59:03,030 --> 00:59:06,870 Sobald Sie sehen, diese Redundanz zu starten, kopieren Sie diese und Einfügen von Code, 945 00:59:06,870 --> 00:59:09,810 es sollte beginnen, machen Sie wünschte, es gäbe einen besseren Weg. 946 00:59:09,810 --> 00:59:13,610 Und glücklicherweise, denn von Arrays ist. Also lasst uns dies tun. 947 00:59:13,610 --> 00:59:16,700 Zunächst lassen Sie mich Ihnen eine sehr einfache Sache, dass wir nicht verwendet so weit, 948 00:59:16,700 --> 00:59:18,820 aber du wirst es gelegentlich sehen im Code. 949 00:59:18,820 --> 00:59:21,270 >> Dies ist, was allgemein als eine Konstante. 950 00:59:21,270 --> 00:59:24,410 Also ist es eine Konstante in dem Sinne, dass dieser Wert sich nie ändert. 951 00:59:24,410 --> 00:59:26,450 Der menschliche Konvention, wenn damit eine konstante 952 00:59:26,450 --> 00:59:30,420 ist es, alle Großbuchstaben einfach so, dass es wirklich steht in Ihrem Code verwenden, 953 00:59:30,420 --> 00:59:34,270 und das spezielle Schlüsselwort, die Sie in C # definieren. 954 00:59:34,270 --> 00:59:39,970 Also sagen wir # define, dann ein Leerzeichen, dann das Wort, das Sie für den Namen der Konstanten verwenden 955 00:59:39,970 --> 00:59:41,730 und dann wird der Wert der Konstante. 956 00:59:41,730 --> 00:59:44,710 Achtung: Dies ist anders als das Zuordnen zu einer Variablen. 957 00:59:44,710 --> 00:59:46,430 Es gibt keine Gleichheitszeichen, es gibt kein Semikolon. 958 00:59:46,430 --> 00:59:49,140 Dies ist, was allgemein als Präprozessordirektive bekannt, 959 00:59:49,140 --> 00:59:50,840 sondern mehr auf, dass eine andere Zeit. 960 00:59:50,840 --> 00:59:56,350 Denn jetzt, schafft dies einen unveränderlichen Wert namens QUIZ 961 00:59:56,350 --> 00:59:58,290 deren tatsächlichen numerischen Wert 2 ist. 962 00:59:58,290 --> 01:00:02,180 So überall zu sehen Quiz, Quiz, Quizfragen über diese Datei 963 01:00:02,180 --> 01:00:04,230 das ist nur die Nummer 2. 964 01:00:04,230 --> 01:00:06,550 Wenn ich an Haupt jetzt aussehen, mal sehen, wie das funktioniert. 965 01:00:06,550 --> 01:00:09,770 Zunächst sieht es ein wenig kryptisch, aber es ist alles Zeug aus Woche 1. 966 01:00:09,770 --> 01:00:12,210 Bitten Sie den Benutzer für die Klassen. Wie machen wir das? 967 01:00:12,210 --> 01:00:17,350 In Zeile 22 - das ist wirklich der saftigen Teil - Ich erkläre einen Schwimmer 968 01:00:17,350 --> 01:00:23,240 aber nicht nur ein einzelner Schwimmer. Ich erkläre, sondern ein Array von Gleitkommazahlen. 969 01:00:23,240 --> 01:00:27,700 Diese Variable wird als Noten, da hier implizierte, 970 01:00:27,700 --> 01:00:31,420 aber das einzige Stück neue Syntax dann sind diese eckigen Klammern. 971 01:00:31,420 --> 01:00:37,280 Die Tatsache, dass ich gesagt habe, float Noten und dann Klammer und dann eine Nummer - 972 01:00:37,280 --> 01:00:40,980 feststellen, ob dies eine Konstante ist, so wie wir taten dies - 973 01:00:40,980 --> 01:00:46,840 dies bedeutet, "Hey Computer, gib mir 2 Schwimmern und lassen gemeinsam nennen sie Noten." 974 01:00:46,840 --> 01:00:51,780 >> Dies steht im Gegensatz zu einem viel langwieriger Prozess wie folgt: float grade1; 975 01:00:51,780 --> 01:00:54,580 grade2 schweben, und so weiter. 976 01:00:54,580 --> 01:00:58,310 So ein Array ermöglicht es uns, diese Idee umzusetzen, aber viel weniger messily, 977 01:00:58,310 --> 01:01:04,560 in einer solchen Weise, dass wir 1 Zeile Code anstatt eine, sagen wir, 16 für eine 16-wöchige Semester. 978 01:01:04,560 --> 01:01:09,060 Ich wollte nicht zu hart-Code 2, denn wenn Sie denken jetzt darüber logisch, 979 01:01:09,060 --> 01:01:12,560 nehme nächstes Jahr CS50 Änderungen 3 Quiz statt 980 01:01:12,560 --> 01:01:15,010 und ich die Nummer 2 hier hatte, hatte ich die Nummer 2 hier 981 01:01:15,010 --> 01:01:17,210 Ich hatte die Nummer 2 hier die Nummer 2 hier. 982 01:01:17,210 --> 01:01:19,890 Es wird sehr mühsam und sehr einfach zu vermasseln 983 01:01:19,890 --> 01:01:26,550 und versehentlich zu ändern Wert 1 bis 3 und vermisse einen anderen Wert von 2. 984 01:01:26,550 --> 01:01:30,660 Also ich bin, anstatt abstrakte gehen diese weg und verwenden Sie diese Konstante, dass 985 01:01:30,660 --> 01:01:32,520 wie der Name schon vermuten lässt, ändert sich nie. 986 01:01:32,520 --> 01:01:35,870 Und jetzt egal, ob wir anders haben Tests in diesem oder nächsten, 987 01:01:35,870 --> 01:01:39,380 Ich muss es nur an einer Stelle ändern hier an der Spitze. 988 01:01:39,380 --> 01:01:41,230 So das ist alles eine Konstante ist. 989 01:01:41,230 --> 01:01:47,100 Inzwischen ist die neue konzeptionelle Merkmal, dass eines Arrays. 990 01:01:47,100 --> 01:01:55,030 So die eckigen Klammern geben mir so viele Schwimmer und lässt mich zusammenfassend nennen Noten hier. 991 01:01:55,030 --> 01:01:56,720 So, jetzt wollen wir mal sehen, was ich tun werde. 992 01:01:56,720 --> 01:01:59,220 Hier in der Leitung 24 ist der Anfang einer for-Schleife. 993 01:01:59,220 --> 01:02:03,380 >> Das ist wirklich nichts Besonderes. Es ist nur mit QUIZZES anstelle eines hartcodierte Nummer. 994 01:02:03,380 --> 01:02:06,740 Aber es gibt nichts intellektuell dort anders aus der vergangenen Woche. 995 01:02:06,740 --> 01:02:11,650 Dies ist nur printf, so printf ("Quiz #% d von% d:") 996 01:02:11,650 --> 01:02:16,670 weil ich einfach ausdrucken möchten mir quiz number 1 von 2 und dann 2 von 2. 997 01:02:16,670 --> 01:02:18,480 Das ist also eine rein ästhetische Sache. 998 01:02:18,480 --> 01:02:21,000 Aber der interessante Teil ist jetzt in Zeile 27. 999 01:02:21,000 --> 01:02:27,840 Um in einer der zwei Platzhalter mit einem Gleitkommawert füllen, 1000 01:02:27,840 --> 01:02:29,640 Sie wieder in eckige Klammern. 1001 01:02:29,640 --> 01:02:35,170 In diesem Fall bin ich mit i, weil diese for-Schleife mit i gleich welchen Wert begonnen hat, offenbar? 1002 01:02:35,170 --> 01:02:36,670 [Student] 0. >> [Malan] 0. 1003 01:02:36,670 --> 01:02:40,990 So bei der ersten Iteration dieser Schleife ist es, als ob ich dies schrieb im Code 1004 01:02:40,990 --> 01:02:46,310 aber auf der zweiten Iteration dieser Schleife ist es, als ob ich dies schrieb in meinem Code. 1005 01:02:46,310 --> 01:02:49,970 Aber die Tatsache, dass ich mit einer Variablen ist perfekt, weil, wie der Name schon vermuten lässt, 1006 01:02:49,970 --> 01:02:52,600 es variiert der Wert bei jeder Iteration, 1007 01:02:52,600 --> 01:02:55,900 so bin ich Ausfüllen dieses Array einer Stelle zu einer Zeit. 1008 01:02:55,900 --> 01:02:57,380 Was bedeutet das Array aussehen? 1009 01:02:57,380 --> 01:03:01,570 Der Grund warum ich zog die super einfache Rechteck auf dem Bildschirm hier vorher war aus diesem Grund. 1010 01:03:01,570 --> 01:03:05,590 Ein Array ist nur ein Stück Speicher von einem anderen Stück Speicher gefolgt 1011 01:03:05,590 --> 01:03:08,570 gefolgt von einem weiteren Block arbeiten und so weiter. 1012 01:03:08,570 --> 01:03:13,120 Also, wenn meine Array der Größe 2 ist in diesem Fall hier, alles, was ich tun würde, 1013 01:03:13,120 --> 01:03:20,200 indem in my quiz Partituren wie hier - ich bekam 100 auf dieser ein und dann bekam ich eine 99 auf dieser ein - 1014 01:03:20,200 --> 01:03:24,970 dann diese Erinnerung vielleicht gar nicht benutzt, weil ich nur den Computer habe gefragt 1015 01:03:24,970 --> 01:03:26,840 für ein Array der Größe 2. 1016 01:03:26,840 --> 01:03:28,600 Diese Plätze sind immer noch da, nicht wahr? 1017 01:03:28,600 --> 01:03:32,670 Sie haben noch 2 Gigabyte RAM, auch wenn Sie nur fragen, sind für 2 schwimmt. 1018 01:03:32,670 --> 01:03:36,840 So die Idee hinter Arrays ist, dass der Computer dauert nur ein Stück Speicher 1019 01:03:36,840 --> 01:03:41,340 und dann aufteilt kleinere Stücke Rücken an Rücken an Rücken an Rücken. 1020 01:03:41,340 --> 01:03:43,310 Und damit ist alles ein Array ist. 1021 01:03:43,310 --> 01:03:47,350 >> Es ist ein zusammenhängender Block arbeiten, innerhalb dessen man die Dinge stellen können. 1022 01:03:47,350 --> 01:03:50,700 Dies geschieht, um dann nur einige langweilige Arithmetik. 1023 01:03:50,700 --> 01:03:54,640 Wenn ich hier unten scrollen, das ist, wo ich über das Array dann durchlaufen. 1024 01:03:54,640 --> 01:03:58,020 I kommen mit der Summierung aller Werte in der Anordnung, 1025 01:03:58,020 --> 01:04:02,470 und dann verwende ich die Funktion round hier, um tatsächlich die Summe durch Quizzes unterteilt. 1026 01:04:02,470 --> 01:04:06,320 Aber lassen Sie mich winken meine Hand an, dass als eine Art genug Arithmetik für jetzt. 1027 01:04:06,320 --> 01:04:08,370 Aber alles, was für mich tun ist letztlich Berechnen einer durchschnittlichen. 1028 01:04:08,370 --> 01:04:13,580 Also zuerst Quiz plus zweite Quiz durch 2 geteilt und dann auszudrucken als int. 1029 01:04:13,580 --> 01:04:17,280 Aber lasst uns jetzt Übergang zu einem anderen Beispiel genannt string1, 1030 01:04:17,280 --> 01:04:20,700 was zeichnet ein ähnliches Bild, jedoch mit Strings. 1031 01:04:20,700 --> 01:04:23,940 Lassen Sie mich gehen Sie vor und zu vereinfachen, nur für einen Augenblick. 1032 01:04:23,940 --> 01:04:27,090 Verzeihen Sie die Einkerbung für den Moment. 1033 01:04:27,090 --> 01:04:30,870 Beachten Sie in Zeile 19 der diesem Beispiel, bekomme ich einen String vom Benutzer. 1034 01:04:30,870 --> 01:04:34,640 Aber bemerken, was ich nächstes tun in den Zeilen 22 weiter. 1035 01:04:34,640 --> 01:04:41,250 Ich bin eigentlich Iteration von i bis - und das ist ein neuer Trick - strlen, Stringlänge. 1036 01:04:41,250 --> 01:04:44,880 Dies ist eine Funktion, die mit C kommt es, dass, wenn Sie ihr einen String, 1037 01:04:44,880 --> 01:04:47,730 es sagt Ihnen, wie viele Zeichen in diesem String. Das ist alles. 1038 01:04:47,730 --> 01:04:51,550 Und die Tatsache, dass es strlen anstelle von String-Länge ist nur, weil es mehr prägnante ist. 1039 01:04:51,550 --> 01:04:55,100 Vor dreißig Jahren, mochte die Menschen, die Dinge so prägnant wie möglich zu schreiben, 1040 01:04:55,100 --> 01:04:57,630 Deshalb haben wir diese Konvention halten hier. 1041 01:04:57,630 --> 01:05:00,660 i + + bedeutet nur erhöhen i in jeder Iteration. 1042 01:05:00,660 --> 01:05:02,990 Und nun merkt das, das ist wirklich interessant. 1043 01:05:02,990 --> 01:05:09,180 In Zeile 24, sage ich, "Computer, gib mir ein Zeichen, 8 bits, und nennen es c." 1044 01:05:09,180 --> 01:05:12,630 Aber was ist das auf der rechten Seite sagen? 1045 01:05:13,490 --> 01:05:16,530 In Englisch, was bedeutet, dass vertreten? 1046 01:05:16,530 --> 01:05:18,730 [Schüler] Das erste Zeichen im Array. 1047 01:05:18,730 --> 01:05:20,790 Genau. Gib mir das erste Zeichen im Array. 1048 01:05:20,790 --> 01:05:24,090 Oder, allgemeiner, gib mir das i-te Zeichen im Array. 1049 01:05:24,090 --> 01:05:26,100 Und erkennen, es ist jetzt wichtig, dass als Informatiker, 1050 01:05:26,100 --> 01:05:27,890 wir eigentlich Zählen von 0. 1051 01:05:27,890 --> 01:05:29,720 >> Sie haben nicht die Wahl jetzt an, dies zu tun. 1052 01:05:29,720 --> 01:05:34,160 Jetzt haben Sie in Übereinstimmung mit dem Computer die Erwartungen verhalten und zählt von 0 1053 01:05:34,160 --> 01:05:38,180 weil [0] wird das erste Zeichen in einem String, 1054 01:05:38,180 --> 01:05:42,150 [1] wird der zweite sein, [2] wird der dritte und so weiter sein. 1055 01:05:42,150 --> 01:05:49,720 So dieses Programm, wenn ich es kompilieren, das ist wieder string1, so stellen string1, 1056 01:05:49,720 --> 01:05:54,670 und jetzt habe ich string1 in meinem Terminal-Fenster laufen. 1057 01:05:54,670 --> 01:05:58,330 Es ist eine Eingabe wartet, so werde ich in David geben, Enter, 1058 01:05:58,330 --> 01:06:02,540 und jetzt ist es druckt David alle auf verschiedenen Linien, da bemerken, was ich tue. 1059 01:06:02,540 --> 01:06:05,820 Ich bin Drucken ein Zeichen in einer Zeit. 1060 01:06:05,820 --> 01:06:10,100 Wir werden nicht ins Detail gehen heute, aber ich gelöscht vorhin dieser Prüfung hier. 1061 01:06:10,100 --> 01:06:15,480 Es stellt sich heraus, dass, wenn der Benutzer sich fehlerhaft verhält, kontradiktorische, oder einfach nur verwirrt, 1062 01:06:15,480 --> 01:06:20,210 Sie können tatsächlich nicht um eine Reihe von einiger Länge geben. 1063 01:06:20,210 --> 01:06:22,860 Wenn Sie die falsche Taste drücken auf der Tastatur, können Sie keinen String an alles geben, 1064 01:06:22,860 --> 01:06:26,950 oder wenn Sie bösartige sind, könnten Sie versuchen, in einem Gigabyte im Wert von einem Essay fügen 1065 01:06:26,950 --> 01:06:29,290 diese Zeichenfolge zu füllen, und wenn der Computer der Speicher ausgeht, 1066 01:06:29,290 --> 01:06:32,710 es stellt sich heraus, dass wir gehen, um wieder diesen besonderen Wert namens NULL. 1067 01:06:32,710 --> 01:06:35,580 So jetzt wissen nur, dass es diese besondere Wert namens NULL 1068 01:06:35,580 --> 01:06:39,580 die es uns ermöglicht, um zu überprüfen, wenn wir unterwegs sind Speicher, unter anderem. 1069 01:06:39,580 --> 01:06:45,630 Aber wenn ich eröffnen nun string2, bemerkt ein Unterschied. 1070 01:06:45,630 --> 01:06:48,210 Unsere einzige Unterschied hier mit string2. 1071 01:06:48,210 --> 01:06:51,340 Mit string2 ist dies for-Schleife ein wenig anders. 1072 01:06:51,340 --> 01:06:55,010 >> Lassen Sie mich löschen NULL, so dass wir über jene andere Zeit sprechen kann. 1073 01:06:55,010 --> 01:06:57,800 Was ist anders an der for-Schleife dieses Mal? 1074 01:06:59,620 --> 01:07:01,670 Ich kann zurück zu dem vorherigen Beispiel. 1075 01:07:01,670 --> 01:07:08,580 Also das ist Version 2, ist diese Version ein. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 Die strlen Anruf ist wo? 1078 01:07:16,660 --> 01:07:18,860 Es ist im ersten Teil der for-Schleife. 1079 01:07:18,860 --> 01:07:21,830 Irgendwelche Gedanken, warum ich das tue? Yeah. 1080 01:07:21,830 --> 01:07:24,560 [Schüler] So müssen Sie nicht rufen Sie die Funktion jede einzelne Zeit. 1081 01:07:24,560 --> 01:07:26,440 [Malan] Wir rufen Sie nicht die Funktion jede einzelne Zeit. Genau. 1082 01:07:26,440 --> 01:07:28,300 Erinnern Sie sich an für Loops, dass sie super einfach sind 1083 01:07:28,300 --> 01:07:31,770 wenn Sie eine Art verstehen, dass dies die Initialisierung, die Bedingung, und das Update ist. 1084 01:07:31,770 --> 01:07:34,750 Das Problem ist, dass die Bedingung auf jeder Iteration der Schleife passiert. 1085 01:07:34,750 --> 01:07:40,010 Und so in diesem Beispiel hier ist das, was schlecht über die Tatsache, dass dies mein Zustand ist? 1086 01:07:40,010 --> 01:07:41,830 [Schüler] Du nennst strlen sind. 1087 01:07:41,830 --> 01:07:44,340 [Malan] Du nennst strlen wieder und wieder und wieder. 1088 01:07:44,340 --> 01:07:47,410 Aber sobald ich in David eingegeben, ist die Länge der Zeichenkette 5, 1089 01:07:47,410 --> 01:07:49,650 und es wird nicht auf jeder Iteration der Schleife ändern 1090 01:07:49,650 --> 01:07:51,670 da die Zeichenfolge noch D-a-v-i-d. 1091 01:07:51,670 --> 01:07:55,320 So ist dies ein Hinweis auf, was los ist, um eine zunehmend wichtige Idee geworden 1092 01:07:55,320 --> 01:08:00,410 bekannt als eine Design-Entscheidung, wo nur nicht machen den Computer zu tun unnötige Arbeit. 1093 01:08:00,410 --> 01:08:03,920 >> Genauso wie eine Vorpremiere pset2, pset2 in der Standard Edition 1094 01:08:03,920 --> 01:08:07,030 wird Sie herausfordern tatsächlich umzusetzen gewisse Anzahl von Ziffern, 1095 01:08:07,030 --> 01:08:10,410 eine gewisse Anzahl von Verschlüsselungs-Algorithmen, so dass Sie sowohl verschlüsseln 1096 01:08:10,410 --> 01:08:13,840 und Entschlüsseln geheimer Nachrichten ähnlich wie das ein Ralphie dort decodiert. 1097 01:08:13,840 --> 01:08:16,810 In der Hacker-Ausgabe pset2, werden wir noch ein wenig weiter gehen. 1098 01:08:16,810 --> 01:08:19,649 Wir gehen Hand Sie eine Datei von einem tatsächlichen Computer-System 1099 01:08:19,649 --> 01:08:23,479 das enthält eine ganze Reihe von Benutzernamen und tatsächlichen verschlüsselte Passwörter, 1100 01:08:23,479 --> 01:08:26,939 und die Herausforderung für den Hacker Ausgabe sein wird, um diese Passwörter zu knacken 1101 01:08:26,939 --> 01:08:33,200 und herauszufinden, was Kryptographie oder welches Geheimnis wurde verwendet, um tatsächlich zu generieren, diese Passwörter. 1102 01:08:33,200 --> 01:08:36,109 Und wir werden dies durch den Einsatz einer neuen Funktion hier C zu tun 1103 01:08:36,109 --> 01:08:40,630 dass ich Ihnen nur eine Demo als Kommandozeilen-Argumente bekannt. 1104 01:08:40,630 --> 01:08:44,229 Es stellt sich heraus, wie einige von euch im Schnitt oder in Lehrbüchern gesehen haben, 1105 01:08:44,229 --> 01:08:48,260 Haupt nicht immer für nichtig in Klammern sein. 1106 01:08:48,260 --> 01:08:52,430 Es stellt sich heraus, dass Haupt auch wie folgt geschrieben werden, mit zwei Argumenten, 1107 01:08:52,430 --> 01:08:56,870 argc und argv, wo argc ist die Anzahl der Wörter 1108 01:08:56,870 --> 01:09:00,020 Sie geben nach den Namen des Programms auf der Kommandozeile 1109 01:09:00,020 --> 01:09:03,420 und argv ist die tatsächlichen Worte. 1110 01:09:03,420 --> 01:09:07,540 Und wie die eckigen Klammern gibt vorschlagen, ist argv offenbar ein Array. 1111 01:09:07,540 --> 01:09:12,210 Es wird ein String nach einer Zeichenfolge nach einer Zeichenkette in Erinnerung sein. 1112 01:09:12,210 --> 01:09:16,010 >> Also, was wir in der Lage sein zu tun, beginnend mit pset 2 ist so etwas wie dieses. 1113 01:09:16,010 --> 01:09:21,350 Wenn ich argv1, die ein Beispiel kommen wir wieder werde am Montag, und führen Sie es, 1114 01:09:21,350 --> 01:09:23,370 feststellen, dass es nicht scheinen, um etwas noch nicht. 1115 01:09:23,370 --> 01:09:25,490 Es gibt einfach seine eigenen Namen. 1116 01:09:25,490 --> 01:09:31,479 Aber wenn ich Abschied Klasse, beachten Sie, dass dieses Programm offenbar iteriert 1117 01:09:31,479 --> 01:09:35,479 gegenüber jedem der Worte, die bei der Eingabeaufforderung eingegeben wurden. 1118 01:09:35,479 --> 01:09:41,630 Und die Mittel, mit denen wir den Zugang zu Worten gewinnen wird, dass der Benutzer an der Eingabeaufforderung eingegeben 1119 01:09:41,630 --> 01:09:49,160 ist durch Änderung Haupt ab diesem Wochenende von int main (void) to main (argc, argv) int 1120 01:09:49,160 --> 01:09:52,050 und somit wird Befehlszeilenargumente geboren werden. 1121 01:09:52,050 --> 01:09:57,100 Und wenn Sie wirklich anspruchsvolle bekommen an dieser, werden Sie in der Lage sein, um wirklich trippy Programme schreiben 1122 01:09:57,100 --> 01:09:59,610 wie dieser hier, die jenseits geht 1123 01:09:59,610 --> 01:10:03,940 einige der Funktionen haben wir bisher getan, aber alle ziemlich mächtig. 1124 01:10:03,940 --> 01:10:08,950 >> Also werden wir dies mit diesen verlassen auf dem Bildschirm, und wir werden Sie am Montag zu sehen. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]