1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [Musik zu spielen] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 David J. MALAN: In Ordnung. 5 00:00:12,660 --> 00:00:15,590 Dies ist CS50, und dies ist der Beginn der Woche zwei. 6 00:00:15,590 --> 00:00:19,120 Also lassen Sie uns beginnen heute mit einem Fehler. 7 00:00:19,120 --> 00:00:20,974 Ein Fehler, natürlich, ist ein Fehler in einem Programm, 8 00:00:20,974 --> 00:00:22,890 und Sie werden sehr erhalten mit diesem Konzept vertraut 9 00:00:22,890 --> 00:00:26,050 wenn Sie noch nie programmiert haben zuvor. pset0 und jetzt pset1. 10 00:00:26,050 --> 00:00:29,280 Aber betrachten wir etwas ein wenig einfach auf den ersten. 11 00:00:29,280 --> 00:00:32,189 Dieses Programm hier, dass ich warf zusammen im Voraus, 12 00:00:32,189 --> 00:00:37,280 und ich behaupte, dass dies zu drucken 10 Sterne auf dem Bildschirm mit printf, 13 00:00:37,280 --> 00:00:41,020 aber es ist offensichtlich Buggy in gewisser Weise. 14 00:00:41,020 --> 00:00:45,370 >> Da die Spezifikation, die sollte es 10 Sterne zu drucken, 15 00:00:45,370 --> 00:00:50,230 aber es hat offenbar nicht, was würden Sie behaupten, ist der Fehler? 16 00:00:50,230 --> 00:00:52,004 Ja? 17 00:00:52,004 --> 00:00:54,420 Also es ist eine durch einen Fehler, und was tun Sie damit? 18 00:00:54,420 --> 00:01:00,991 19 00:01:00,991 --> 00:01:01,490 Ok. 20 00:01:01,490 --> 00:01:09,820 21 00:01:09,820 --> 00:01:10,410 Ausgezeichnet. 22 00:01:10,410 --> 00:01:13,930 Also haben wir festgelegt haben, ein Startwert von Null für i, 23 00:01:13,930 --> 00:01:18,399 und wir ein n-Wert von 10 festgelegt haben, aber wir haben weniger als oder gleich verwendet. 24 00:01:18,399 --> 00:01:21,190 Und der Grund dafür, dass dies zwei Zeichen und nicht nur ein Symbol, 25 00:01:21,190 --> 00:01:22,630 wie in einem Mathebuch, ist, dass Sie nicht haben, 26 00:01:22,630 --> 00:01:24,880 ein Weg, die ein Zeichen gleichwertig. 27 00:01:24,880 --> 00:01:28,450 >> Das heißt also, weniger als, aber wenn Sie das Zählen bei Null zu beginnen, 28 00:01:28,450 --> 00:01:31,690 Sie zählen aber den ganzen Weg nach oben durch und gleich 10, 29 00:01:31,690 --> 00:01:34,170 Sie natürlich werde sind 11 Dinge zählen insgesamt. 30 00:01:34,170 --> 00:01:35,900 Und so wirst du 11 Sterne zu drucken. 31 00:01:35,900 --> 00:01:37,990 Also, was könnte eine Lösung für dieses sein? 32 00:01:37,990 --> 00:01:39,970 Ja? 33 00:01:39,970 --> 00:01:43,980 >> Also nur die weniger als einstellen gleich oder knapp sein, 34 00:01:43,980 --> 00:01:46,250 und es gibt, ich behaupte, vielleicht Eine andere Lösung, zu. 35 00:01:46,250 --> 00:01:47,210 Was könnte sonst noch tun? 36 00:01:47,210 --> 00:01:48,590 Ja? 37 00:01:48,590 --> 00:01:53,660 >> So starten gleich es auf 1, und verlassen die weniger als oder gleich. 38 00:01:53,660 --> 00:01:56,187 Und ehrlich gesagt, ich würde behaupten, dass bei einer typischen menschlichen, 39 00:01:56,187 --> 00:01:57,770 Dies ist wahrscheinlich einfacher. 40 00:01:57,770 --> 00:02:00,280 Zählen beginnen bei 1 und zählen bis 10 durch. 41 00:02:00,280 --> 00:02:01,690 Wesentlichen tun, was du meinst. 42 00:02:01,690 --> 00:02:04,010 >> Aber die Realität ist in Programmierung, wie wir gesehen haben, 43 00:02:04,010 --> 00:02:07,598 Informatiker und Programmierer in der Regel nicht anfangen zu zählen bei Null. 44 00:02:07,598 --> 00:02:09,389 Und so ist das in Ordnung, wenn Sie daran zu gewöhnen. 45 00:02:09,389 --> 00:02:12,640 Ihr Zustand wird in der Regel so etwas wie weniger als. 46 00:02:12,640 --> 00:02:14,910 Also einfach eine logische Fehler, dass wir jetzt 47 00:02:14,910 --> 00:02:17,990 zu fixieren und schließlich neu kompilieren dies und bekommen nur 10. 48 00:02:17,990 --> 00:02:19,610 >> Nun, wie über diesen Fehler hier? 49 00:02:19,610 --> 00:02:24,200 Auch hier behaupte ich, dass ich ein Ziel von 10 Drucken stars-- 50 00:02:24,200 --> 00:02:28,140 eine pro Zeile dieser Zeit, aber es funktioniert nicht. 51 00:02:28,140 --> 00:02:30,940 Bevor wir vorschlagen, was das Update ist, was hat das 52 00:02:30,940 --> 00:02:34,640 drucken visuell, wenn ich zu kompilieren und führen Sie dieses Programm denken Sie? 53 00:02:34,640 --> 00:02:35,140 Ja? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Stern. 56 00:02:38,860 --> 00:02:41,690 Also alle die Sterne auf dem gleichen Linie ist das, was ich gehört habe, 57 00:02:41,690 --> 00:02:43,391 und dann die neue Zeile. 58 00:02:43,391 --> 00:02:44,140 Also lassen Sie uns versuchen. 59 00:02:44,140 --> 00:02:48,710 So machen Buggy-1, ein, und ich sehe den Befehl Klang 60 00:02:48,710 --> 00:02:50,090 dass wir darüber gesprochen letzten Mal. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, und in der Tat sehe ich alle 10 Sterne auf der gleichen Linie, auch wenn ich behaupten, 62 00:02:55,180 --> 00:02:58,690 in meinem Spezifikation nur ein Kommentar oben der Code, den ich auf einen pro tun soll 63 00:02:58,690 --> 00:02:59,230 Linie. 64 00:02:59,230 --> 00:03:00,580 Aber das sieht recht. 65 00:03:00,580 --> 00:03:04,620 >> Jetzt Zeile 15 sieht es aus wie ich bin Druck einen Stern, und dann die Linie 16 66 00:03:04,620 --> 00:03:06,620 es sieht aus wie ich bin Druck eine neue Zeile, 67 00:03:06,620 --> 00:03:09,560 und sie sind beide so eingerückt Ich bin in der Schleife deutlich. 68 00:03:09,560 --> 00:03:13,610 Also sollte ich nicht tun, werden Sterne, neue Linie, Stern, neue Linie, Stern, neue Linie? 69 00:03:13,610 --> 00:03:14,110 Ja? 70 00:03:14,110 --> 00:03:18,430 71 00:03:18,430 --> 00:03:21,240 >> Ja, im Gegensatz zu einer Sprache wie Python, wenn Sie nicht vertraut sind, 72 00:03:21,240 --> 00:03:23,540 Einzug nicht Rolle mit dem Computer. 73 00:03:23,540 --> 00:03:25,280 Es kommt nur auf den Menschen. 74 00:03:25,280 --> 00:03:29,860 Während also hier habe ich erfunden habe Linien 15 und 16--, die schön aussieht, 75 00:03:29,860 --> 00:03:31,330 aber der Computer ist es egal. 76 00:03:31,330 --> 00:03:34,640 Der Computer kümmert sich um tatsächlich mit geschweiften Klammern 77 00:03:34,640 --> 00:03:36,310 um diese Codezeilen. 78 00:03:36,310 --> 00:03:39,520 >> , So dass es genau wie in clear-- Scratch--, dass diese beiden Zeilen Code 79 00:03:39,520 --> 00:03:40,450 ausgeführt werden soll. 80 00:03:40,450 --> 00:03:44,390 Wie einer dieser gelben Scratch-Puzzle Stücke wieder und wieder und wieder. 81 00:03:44,390 --> 00:03:50,920 >> So, jetzt, wenn ich wieder laufen diese program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 Ich habe jetzt einen Fehler. 83 00:03:51,770 --> 00:03:54,212 Was habe ich vergessen zu tun? 84 00:03:54,212 --> 00:03:55,420 Ja, so habe ich nicht kompilieren. 85 00:03:55,420 --> 00:03:56,740 So machen Buggy-2. 86 00:03:56,740 --> 00:03:59,840 Keine solche Datei, weil ich nicht tatsächlich kompilieren die zweite Version. 87 00:03:59,840 --> 00:04:04,860 So, jetzt interessant nicht angemeldete variable-- nicht 2. 88 00:04:04,860 --> 00:04:05,510 Wir machen 1. 89 00:04:05,510 --> 00:04:11,050 Machen Buggy-1-- ./buggy-1-- und jetzt Jede von ihnen ist auf der gleichen Linie. 90 00:04:11,050 --> 00:04:13,880 >> Jetzt gibt es eine Ausnahme diese vermeintliche Anspruch von mir 91 00:04:13,880 --> 00:04:15,520 dass Sie diese geschweiften Klammern. 92 00:04:15,520 --> 00:04:20,160 Wann ist es eigentlich, wenn Sie noch OK-- in Abschnitt oder textbooks-- bemerkt 93 00:04:20,160 --> 00:04:22,130 die geschweiften Klammern weglassen? 94 00:04:22,130 --> 00:04:22,630 Ja? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Genau. 97 00:04:26,870 --> 00:04:28,940 Wenn es nur eine Code-Zeile, die Sie 98 00:04:28,940 --> 00:04:32,830 wollen mit dem in Verbindung gebracht werden Schleife, wie in unserem ersten Beispiel. 99 00:04:32,830 --> 00:04:36,380 Es ist vollkommen legitim die geschweiften Klammern weglassen 100 00:04:36,380 --> 00:04:40,310 nur als eine Art Bequemlichkeit von der Compiler für Sie. 101 00:04:40,310 --> 00:04:40,810 Ja? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Gute Frage. 104 00:04:43,930 --> 00:04:45,500 Würde es als eine Art Fehler werden? 105 00:04:45,500 --> 00:04:49,340 Wir würden uns wie in CS50 promote-- Styleguide, die URL für die 106 00:04:49,340 --> 00:04:51,926 ist in pset1--, die immer verwenden Sie die geschweiften Klammern. 107 00:04:51,926 --> 00:04:53,550 Sicherlich, wenn Sie neu in der Programmierung sind. 108 00:04:53,550 --> 00:04:56,800 Die Realität ist, wir sind nicht euch verbieten 109 00:04:56,800 --> 00:04:58,680 zu tun, diese Annehmlichkeiten. 110 00:04:58,680 --> 00:05:00,846 Aber wenn Sie gerade erst in den Swing der Dinge, 111 00:05:00,846 --> 00:05:04,020 absolut nur immer die geschweiften Hosenträger, bis Sie den Dreh raus. 112 00:05:04,020 --> 00:05:04,640 Gute Frage. 113 00:05:04,640 --> 00:05:05,320 >> In Ordnung. 114 00:05:05,320 --> 00:05:07,660 So dass dann war ein Fehler. 115 00:05:07,660 --> 00:05:09,190 Zumindest in etwas ziemlich einfach. 116 00:05:09,190 --> 00:05:11,260 Und doch könnte man denken ist ziemlich rudimentär, oder? 117 00:05:11,260 --> 00:05:13,635 Dies ist eine Art der ersten Woche der Blick auf die Sprache 118 00:05:13,635 --> 00:05:14,890 wie finden Sie Ihre Fehler darin. 119 00:05:14,890 --> 00:05:17,250 Aber die Realität sind tatsächlich repräsentativ 120 00:05:17,250 --> 00:05:20,310 von ein paar ziemlich erschreckend Probleme dass in der realen Welt auftreten können. 121 00:05:20,310 --> 00:05:23,530 >> So einige von euch erinnern sich vielleicht an wenn Sie Tech-News zu folgen, 122 00:05:23,530 --> 00:05:25,740 oder vielleicht sogar gefangen Wind davon im Februar 123 00:05:25,740 --> 00:05:29,434 des vergangenen Jahres, dass Apple hatte machte ein bisschen ein Fehler in iOS, 124 00:05:29,434 --> 00:05:31,350 das Betriebssystem auf ihre Handys, und auch 125 00:05:31,350 --> 00:05:34,220 Mac OS, das Betriebssystem auf ihren Desktops und Laptops. 126 00:05:34,220 --> 00:05:36,480 Und Sie sah Schriften wie diese. 127 00:05:36,480 --> 00:05:41,120 Und danach, Apfel versprochen, diesen Fehler zu beheben, 128 00:05:41,120 --> 00:05:45,950 und sehr schnell habe beheben in iOS, aber dann letztlich in Mac OS fest es 129 00:05:45,950 --> 00:05:46,810 als auch. 130 00:05:46,810 --> 00:05:50,370 >> Jetzt keines dieser Schlagzeilen allein wirklich zeigen, was das eigentliche Problem war, 131 00:05:50,370 --> 00:05:55,640 aber der Fehler wurde schließlich reduziert ein Fehler in SSL, Secure Sockets Layer. 132 00:05:55,640 --> 00:05:57,390 Und lange Geschichte kurz, Dies ist die Software 133 00:05:57,390 --> 00:06:01,030 dass unsere Browser und andere Software verwendet werden, um was zu tun? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Wenn ich sagte, dass SSL beteiligt sind, wann immer Sie 136 00:06:06,860 --> 00:06:13,920 besuchen Sie eine URL, die mit HTTPS beginnt, was dann könnten SSL verwandt werden? 137 00:06:13,920 --> 00:06:14,580 Verschlüsselung. 138 00:06:14,580 --> 00:06:16,470 Also werden wir darüber reden dies in den kommenden Tagen. 139 00:06:16,470 --> 00:06:18,750 Verschlüsselung, die Kunst des Scrambling-Informationen. 140 00:06:18,750 --> 00:06:22,200 >> Aber lange Rede, kurzer Sinn, Apfel vor einiger Zeit einen Fehler gemacht hatte 141 00:06:22,200 --> 00:06:25,970 in ihrer Implementierung von SSL, die Software, die letztlich implementiert 142 00:06:25,970 --> 00:06:30,120 URLs wie HTTPS oder max Verbindungen gibt es auch. 143 00:06:30,120 --> 00:06:32,850 Das Ergebnis davon ist, dass die Verbindungen könnten potenziell 144 00:06:32,850 --> 00:06:33,920 abgefangen werden. 145 00:06:33,920 --> 00:06:37,130 Und Ihre Verbindungen waren nicht notwendigerweise verschlüsselt 146 00:06:37,130 --> 00:06:40,350 wenn Sie hatte einige schlechte Kerl in zwischen Sie und die Ziel-Website, die 147 00:06:40,350 --> 00:06:42,170 wusste, wie man dies nutzen. 148 00:06:42,170 --> 00:06:45,090 >> Jetzt von Apple letztlich geschrieben ein Update für dieses schließlich 149 00:06:45,090 --> 00:06:46,920 und die Beschreibung ihrer fix war diese. 150 00:06:46,920 --> 00:06:49,878 Sicherer Transport konnte nicht validieren die Authentizität der Verbindung. 151 00:06:49,878 --> 00:06:52,920 Das Problem wurde durch adressiert Wiederherstellung der fehlenden Validierungsschritte. 152 00:06:52,920 --> 00:06:57,250 >> Das ist also ein sehr wellig Hand Erklärung für einfach zu sagen, dass wir vermasselt. 153 00:06:57,250 --> 00:07:00,920 Es ist buchstäblich ein Codezeile, die Buggy war 154 00:07:00,920 --> 00:07:05,130 bei der Umsetzung der SSL und wenn Sie online gehen und suchen für diese 155 00:07:05,130 --> 00:07:07,210 Sie tatsächlich finden der ursprüngliche Quellcode. 156 00:07:07,210 --> 00:07:11,960 Zum Beispiel, das ist ein Screenshot nur ein Teil einer größeren Datei, 157 00:07:11,960 --> 00:07:15,965 aber dies ist eine Funktion scheinbar genannt SSL-Server überprüfen Zeichen Schlüsselaustausch. 158 00:07:15,965 --> 00:07:17,840 Und es dauert eine Reihe von Argumente und Eingänge. 159 00:07:17,840 --> 00:07:20,298 Und wir gehen nicht zu konzentrieren zu sehr auf die Minutien es, 160 00:07:20,298 --> 00:07:24,390 aber wenn man auf dem Code konzentrieren innen dieser obersten function-- uns gelassen 161 00:07:24,390 --> 00:07:25,590 Zoom auf das. 162 00:07:25,590 --> 00:07:28,140 Sie vielleicht schon vermuten, Was könnte der Fehler 163 00:07:28,140 --> 00:07:31,230 sein, auch wenn Sie keine Ahnung haben letztlich, was Sie suchen auf. 164 00:07:31,230 --> 00:07:35,924 Es ist irgendwie eine Anomalie hier, das ist, was? 165 00:07:35,924 --> 00:07:38,940 >> Ja, ich mag es nicht wirklich Das Aussehen der beiden goto ausfällt. 166 00:07:38,940 --> 00:07:42,060 Ehrlich gesagt, weiß ich nicht wirklich, was goto nicht Mittel, sondern mit zwei von ihnen 167 00:07:42,060 --> 00:07:42,810 Rücken an Rücken. 168 00:07:42,810 --> 00:07:45,290 Dass nur irgendwie reibt mich intellektuell der falsche Weg, 169 00:07:45,290 --> 00:07:48,910 und in der Tat, wenn wir auf Vergrößern nur jene Linien, das ist C. 170 00:07:48,910 --> 00:07:52,220 >> So dass eine Menge von Apple-Code wird selbst in C geschrieben, 171 00:07:52,220 --> 00:07:55,780 und dies offenbar ist wirklich equivalent-- 172 00:07:55,780 --> 00:07:59,060 nicht zu diesem ziemlich Einbuchtung Version, aber wenn Sie erkennen die Tatsache, 173 00:07:59,060 --> 00:08:02,560 dass es keine geschweiften Klammern, was Apple wirklich schrieb, war Code, der aussieht 174 00:08:02,560 --> 00:08:03,540 so was. 175 00:08:03,540 --> 00:08:07,080 Also habe ich aus und gezoomt ich gerade Fest den Einzug in dem Sinne, 176 00:08:07,080 --> 00:08:10,690 dass, wenn es keine geschweiften Klammern, dass zweiten goto scheitern, das ist in gelb 177 00:08:10,690 --> 00:08:12,500 wird, egal was auszuführen. 178 00:08:12,500 --> 00:08:15,540 Es ist nicht im Zusammenhang mit der Zustand, wenn über ihm. 179 00:08:15,540 --> 00:08:19,590 >> Also auch wieder, wenn Sie nicht ganz verstehen, was dies möglicherweise 180 00:08:19,590 --> 00:08:23,230 tun wissen, dass jeder dieser conditions-- jede dieser Linien 181 00:08:23,230 --> 00:08:26,180 ist ein sehr wichtiger Schritt, in dem Prozess der Überprüfung 182 00:08:26,180 --> 00:08:28,350 Wenn Ihre Daten ist in der Tat verschlüsselt. 183 00:08:28,350 --> 00:08:31,710 So Überspringen eines davon Schritte, nicht die beste Idee. 184 00:08:31,710 --> 00:08:34,840 >> Aber weil wir das haben zweiten goto nicht in gelb, 185 00:08:34,840 --> 00:08:36,840 und weil, wenn wir Art von ästhetisch 186 00:08:36,840 --> 00:08:40,480 bewegen Sie sie nach links, wo es logisch ist im Moment, was 187 00:08:40,480 --> 00:08:43,230 bedeutet das für die Linie bedeuten, Code unterhalb dieser zweiten goto 188 00:08:43,230 --> 00:08:46,480 scheitern würden Sie denken? 189 00:08:46,480 --> 00:08:48,860 Es wird immer übersprungen werden. 190 00:08:48,860 --> 00:08:52,100 So werden in der Regel GOTOs verpönt Gründen, die wir nicht wirklich in zu gehen, 191 00:08:52,100 --> 00:08:54,940 und zwar in CS50 wir eher nicht , diese Erklärung goto lehren, 192 00:08:54,940 --> 00:08:58,130 aber Sie von goto denken kann nicht dahin gehen Sprung 193 00:08:58,130 --> 00:08:59,600 zu einem anderen Teil des Codes. 194 00:08:59,600 --> 00:09:03,120 >> Mit anderen Worten springen diese letzte Zeile ganz, 195 00:09:03,120 --> 00:09:07,420 und so das Ergebnis dieser blöde einfache Fehler, die einfach war 196 00:09:07,420 --> 00:09:10,330 ein Ergebnis wahrscheinlich jemand Kopieren und Einfügen zu einem 197 00:09:10,330 --> 00:09:14,150 oft war, dass die gesamte Sicherheit von iOS und Mac OS 198 00:09:14,150 --> 00:09:18,240 war anfällig für Abfangen von bösen Jungs für einige Zeit. 199 00:09:18,240 --> 00:09:19,940 Bis Apple endlich behoben diese. 200 00:09:19,940 --> 00:09:23,100 >> Nun, wenn einige von euch sind eigentlich Laufen alte Versionen von iOS oder Mac OS, 201 00:09:23,100 --> 00:09:27,250 Sie können gotofail.com gehen die ist eine Website, dass jemand eingestellt 202 00:09:27,250 --> 00:09:29,190 zu bestimmen wesentlich programm 203 00:09:29,190 --> 00:09:30,980 Wenn Ihr Computer ist immer noch anfällig. 204 00:09:30,980 --> 00:09:33,600 Und ehrlich gesagt, wenn es ist, es ist wahrscheinlich eine gute Idee 205 00:09:33,600 --> 00:09:36,870 , um Ihr Telefon zu aktualisieren oder zu Ihr Mac an dieser Stelle. 206 00:09:36,870 --> 00:09:40,120 Aber es gibt nur Zeugnis, wie eine Wertschätzung dieser unteren Ebene 207 00:09:40,120 --> 00:09:42,400 Details und fair einfachen Ideen wirklich kann 208 00:09:42,400 --> 00:09:44,590 übersetzen in Entscheidungen und Probleme, die 209 00:09:44,590 --> 00:09:47,320 affected-- in diesem case-- Millionen von Menschen. 210 00:09:47,320 --> 00:09:49,107 >> Nun ein Wort zur Verwaltung. 211 00:09:49,107 --> 00:09:50,690 Abschnitt wird am kommenden Sonntag starten. 212 00:09:50,690 --> 00:09:53,360 Sie erhalten eine E-Mail von der Empfangs Wochenende zu Abschnitt, an welchem ​​Punkt 213 00:09:53,360 --> 00:09:55,290 die Resektion Prozess beginnt, wenn Sie noch 214 00:09:55,290 --> 00:09:56,998 realisiert haben Sie jetzt einige neue Konflikte. 215 00:09:56,998 --> 00:10:00,180 Also das passiert jedes Jahr, und wir wird in den nächsten Tagen aufnehmen, um zu kommen. 216 00:10:00,180 --> 00:10:02,430 >> Büro hours-- tun halten ein Auge auf diesen Zeitplan hier. 217 00:10:02,430 --> 00:10:05,100 Ändert ein wenig in dieser Woche, insbesondere die Startzeit 218 00:10:05,100 --> 00:10:08,180 und die Lage, also konsultieren dass, bevor Sie sich der Bürozeiten 219 00:10:08,180 --> 00:10:09,520 einem der nächsten vier Nächte. 220 00:10:09,520 --> 00:10:12,680 Und nun ein Wort über die Bewertung, besonders, wie Sie tauchen ein in Problem 221 00:10:12,680 --> 00:10:14,350 setzt ein und darüber hinaus. 222 00:10:14,350 --> 00:10:17,070 >> Also gemäß der Spezifikation, diese sind im Allgemeinen 223 00:10:17,070 --> 00:10:20,360 die Achsen, entlang derer Wir bewerten Ihre Arbeit. 224 00:10:20,360 --> 00:10:23,170 Bereich bezieht sich auf das, was Umfang der Code implementiert 225 00:10:23,170 --> 00:10:25,690 Die Funktionen erforderlich durch unsere Spezifikation. 226 00:10:25,690 --> 00:10:28,290 In anderen Worten, wie viel von ein Stück Satz haben Sie abbeißen. 227 00:10:28,290 --> 00:10:30,440 Haben Sie ein Drittel der es zu tun, eine Hälfte, 100% davon. 228 00:10:30,440 --> 00:10:33,000 Auch wenn es nicht richtig ist, wie viel haben Sie versucht? 229 00:10:33,000 --> 00:10:35,290 So dass die Höhe erfasst Aufwand und die Menge 230 00:10:35,290 --> 00:10:38,260 , zu dem Sie etwas abseits der Probleme Problem Satzes. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- diese, um Inwieweit ist Ihr Code 232 00:10:40,690 --> 00:10:43,150 im Einklang mit unseren Spezifikationen und frei von Fehlern. 233 00:10:43,150 --> 00:10:44,770 So funktioniert es richtig? 234 00:10:44,770 --> 00:10:48,700 Wenn wir es eine Eingabe, tut es Geben Sie uns die Ausgabe, die wir erwarten? 235 00:10:48,700 --> 00:10:52,570 Design-- jetzt ist dies die erste von Die besonders qualitative diejenigen, 236 00:10:52,570 --> 00:10:56,180 oder die, die menschliche Beurteilung erfordern. 237 00:10:56,180 --> 00:10:59,690 Und in der Tat, das ist, warum wir haben einen Stab von so vielen Lehr Stipendiaten und natürlich 238 00:10:59,690 --> 00:11:00,350 Assistenten. 239 00:11:00,350 --> 00:11:03,480 Inwieweit ist Ihr Code gut geschrieben? 240 00:11:03,480 --> 00:11:05,810 >> Und auch dies ist eine sehr qualitative Bewertung 241 00:11:05,810 --> 00:11:09,100 das wird sich mit Ihnen zu arbeiten bi-direktional in den kommenden Wochen. 242 00:11:09,100 --> 00:11:12,060 So dass, wenn Sie nicht bekommen nur numerische Werte, sondern auch 243 00:11:12,060 --> 00:11:16,682 Eine schriftliche Partituren, oder getippte Feedback oder schriftliche Rückmeldung in englischer Wörter. 244 00:11:16,682 --> 00:11:19,640 Das ist, was wir nutzen, um Sie zu fahren Richtung eigentlich schreiben besseren Code. 245 00:11:19,640 --> 00:11:23,320 Und in Vortrag und Abschnitt werden wir versuchen, darauf out-- so oft wie wir can-- 246 00:11:23,320 --> 00:11:26,420 was macht ein Programm nicht nur korrekte und funktionell gut, 247 00:11:26,420 --> 00:11:28,200 sondern auch gut gestaltet. 248 00:11:28,200 --> 00:11:31,850 Die effizienteste es könnte sein, oder auch der schönste kann es sein. 249 00:11:31,850 --> 00:11:33,100 >> Das führt uns zu stylen. 250 00:11:33,100 --> 00:11:36,876 Stil letztlich ein ästhetisches Urteil. 251 00:11:36,876 --> 00:11:38,750 Haben Sie gut wählen Namen für Ihre Variablen? 252 00:11:38,750 --> 00:11:40,330 Haben Sie Ihren Code eingerückt richtig? 253 00:11:40,330 --> 00:11:44,010 Ist es gut aussehen, und deshalb ist es einfach für einen anderen Menschen 254 00:11:44,010 --> 00:11:46,550 Lesen Sie Ihre jeweiligen von deren Richtigkeit. 255 00:11:46,550 --> 00:11:50,300 >> Jetzt allgemein pro Lehrplan punkten wir diese Dinge auf einer Fünf-Punkte-Skala. 256 00:11:50,300 --> 00:11:53,640 Und lassen Sie mich nach Hause Hammer der Punkt dass eine drei ist in der Tat gut. 257 00:11:53,640 --> 00:11:55,550 Sehr schnell machen Leute tun beginnen Arithmetik. 258 00:11:55,550 --> 00:11:58,133 Wenn sie erhalten eine drei von fünf auf Richtigkeit für einige pSoll 259 00:11:58,133 --> 00:12:02,040 und sie verdammt denke, ich werde zu 60% Das ist im wesentlichen ein D oder E. 260 00:12:02,040 --> 00:12:03,980 >> Das ist nicht die Art, wie wir Denken Sie an diese Zahlen. 261 00:12:03,980 --> 00:12:06,880 Eine drei ist in der Tat gut, und das, was wir im allgemeinen am Anfang erwarten 262 00:12:06,880 --> 00:12:09,820 des Begriffs ist, dass wenn Sie bekommen ein Haufen von three's-- vielleicht ein paar 263 00:12:09,820 --> 00:12:12,540 von Messen, ein paar fours-- oder ein paar zu zweit, ein paar fours-- 264 00:12:12,540 --> 00:12:13,748 das ist ein guter Ort, um zu starten. 265 00:12:13,748 --> 00:12:16,320 Und so lange, wie wir sehen ein Aufwärtstrend über die Zeit, 266 00:12:16,320 --> 00:12:18,540 Sie sind in einer besonders guten Ort. 267 00:12:18,540 --> 00:12:20,752 >> Die Formel, die wir zur Gewichts Dinge ist im Wesentlichen 268 00:12:20,752 --> 00:12:22,710 dies pro Lehrplan, das bedeutet nur, dass wir 269 00:12:22,710 --> 00:12:24,750 mehr Gewicht auf Richtigkeit. 270 00:12:24,750 --> 00:12:27,930 Weil es sehr oft Korrektheit das nimmt die meiste Zeit. 271 00:12:27,930 --> 00:12:28,760 Vertrauen Sie mir jetzt. 272 00:12:28,760 --> 00:12:31,190 Sie werden mindestens find-- in einem pset--, dass Sie 273 00:12:31,190 --> 00:12:36,790 verbringen 90% Ihrer Zeit Arbeits auf 10% des Problems. 274 00:12:36,790 --> 00:12:39,320 >> Und alles, was irgendwie funktioniert außer einem oder zwei Fehlern, 275 00:12:39,320 --> 00:12:41,570 und das sind die Fehler, die halten Sie bis spät in die Nacht. 276 00:12:41,570 --> 00:12:43,380 Das sind diejenigen, die Art entkommen Sie. 277 00:12:43,380 --> 00:12:45,560 Aber nach dem Schlafen darauf oder die Teilnahme an der Bürozeiten 278 00:12:45,560 --> 00:12:48,844 oder Fragen online, wird wenn Sie zu diesem Ziel zu 100% zu erhalten, 279 00:12:48,844 --> 00:12:50,760 und das ist, warum wir Gewicht Richtigkeit die meisten. 280 00:12:50,760 --> 00:12:54,102 Entwerfen Sie ein bisschen weniger, und Stil ein wenig weniger. 281 00:12:54,102 --> 00:12:56,060 Aber in mind-- Stil zu halten ist vielleicht die einfachste 282 00:12:56,060 --> 00:12:58,890 von diesen zu abbeißen nach dem Style-Guide. 283 00:12:58,890 --> 00:13:01,580 >> Und nun eine ernstere Hinweis auf akademische Ehrlichkeit. 284 00:13:01,580 --> 00:13:05,000 CS50 hat die unglückliche Unterscheidung von der größte Hersteller von Ad-Board 285 00:13:05,000 --> 00:13:07,330 Fällen fast jedes Jahr historisch. 286 00:13:07,330 --> 00:13:11,012 Dies ist nicht, weil die Studenten betrügen in CS50 mehr als jede andere Klasse, 287 00:13:11,012 --> 00:13:13,720 aber wegen der Natur der Arbeit, Die Tatsache, dass es elektronisch, 288 00:13:13,720 --> 00:13:16,636 die Tatsache, dass wir uns für sie, und die Tatsache, wir sind Informatiker, 289 00:13:16,636 --> 00:13:20,570 Ich kann sagen, wir sind leider sehr gut im Erkennen sie. 290 00:13:20,570 --> 00:13:22,710 >> Also, was bedeutet das konkret bedeuten? 291 00:13:22,710 --> 00:13:24,820 So ist es, pro Lehrplan, der Kurs Philosophie 292 00:13:24,820 --> 00:13:28,090 wirklich einkochen, vernünftig zu sein. 293 00:13:28,090 --> 00:13:31,684 Es ist diese Linie zwischen dass man seine Arbeit auf eigene Faust 294 00:13:31,684 --> 00:13:34,100 und immer ein bisschen angemessenen Hilfe von einem Freund, 295 00:13:34,100 --> 00:13:38,020 und regelrechte tun, dass die Arbeit für Ihre Freund, oder das Versenden von ihm oder ihr den Code 296 00:13:38,020 --> 00:13:41,080 so dass er oder sie kann einfach nehmen oder leihen Sie es aus rechts. 297 00:13:41,080 --> 00:13:43,580 Und dass die Linie überquert dass wir in der Klasse gezogen. 298 00:13:43,580 --> 00:13:45,410 >> Sehen, den Lehrplan schließlich für die Leitungen 299 00:13:45,410 --> 00:13:48,209 dass wir als angemessen zu ziehen und unvernünftiges Verhalten, 300 00:13:48,209 --> 00:13:50,000 aber es wirklich kochen auf das Wesen 301 00:13:50,000 --> 00:13:53,980 Ihre Arbeit benötigen, um dein eigener am Ende. 302 00:13:53,980 --> 00:13:56,230 Jetzt mit dieser sagte, es ist ein heuristisches. 303 00:13:56,230 --> 00:13:58,980 Denn wie Sie vielleicht imagine-- von Bürozeiten und den Visuals 304 00:13:58,980 --> 00:14:01,060 und die Videos, die wir haben gezeigt somit far-- CS50 305 00:14:01,060 --> 00:14:04,530 ist in der Tat gedacht, als kollaborative sein und als kooperative und soziale 306 00:14:04,530 --> 00:14:06,450 wie möglich. 307 00:14:06,450 --> 00:14:08,570 Als kollaborative, wie es ist streng. 308 00:14:08,570 --> 00:14:11,314 >> Aber mit diesen Worten, die Heuristik, wie Sie in den Lehrplan zu sehen, 309 00:14:11,314 --> 00:14:12,980 ist, dass, wenn Sie ein Problem mit bist. 310 00:14:12,980 --> 00:14:16,470 Sie haben einige Fehler in Ihrem Code, den Sie nicht lösen können, für Sie zumutbar ist es 311 00:14:16,470 --> 00:14:18,039 Ihren Code an jemand anderen zu zeigen. 312 00:14:18,039 --> 00:14:21,080 Ein Freund, auch in der Klasse, ein Freund neben Ihnen sitzt an der Bürozeiten, 313 00:14:21,080 --> 00:14:22,680 oder ein Mitglied des Personals. 314 00:14:22,680 --> 00:14:25,810 Aber sie können ihren Code, um Sie nicht zu zeigen. 315 00:14:25,810 --> 00:14:27,710 >> In anderen Worten, ein Antwort auf Ihre question-- 316 00:14:27,710 --> 00:14:29,940 Ich brauche help-- nicht oh, hier ist mein Code. 317 00:14:29,940 --> 00:14:32,440 Werfen Sie einen Blick auf diese und folgern daraus, was du willst. 318 00:14:32,440 --> 00:14:34,580 Nun, natürlich, es gibt ein Weg, deutlich zu Spiel 319 00:14:34,580 --> 00:14:37,760 Dieses System, bei dem werde ich Ihnen zeigen, mein Code, bevor er eine Frage. 320 00:14:37,760 --> 00:14:40,150 Sie zeigen mir mein Code bevor er eine Frage. 321 00:14:40,150 --> 00:14:45,870 Aber sehen Sie den Lehrplan wieder für die feineren Details, wo diese Linie. 322 00:14:45,870 --> 00:14:50,606 >> Nur um jetzt das Bild malen und teilen so transparent wie möglich 323 00:14:50,606 --> 00:14:53,480 Wo sind wir bei der letzten Jahre, Dies ist die Anzahl der Ad-Board Fällen 324 00:14:53,480 --> 00:14:56,260 dass CS50 hat sich hatte In den letzten sieben Jahren. 325 00:14:56,260 --> 00:14:58,717 Mit 14 Fällen diese jüngste Fall. 326 00:14:58,717 --> 00:15:01,300 In Bezug auf die beteiligten Studenten, es war 20 einige merkwürdige Studenten 327 00:15:01,300 --> 00:15:02,490 im vergangenen Herbst. 328 00:15:02,490 --> 00:15:05,670 Es wurde eine Spitze von 33 Studenten vor einigen Jahren. 329 00:15:05,670 --> 00:15:08,830 Viele von ihnen sind leider nicht mehr hier auf dem Campus. 330 00:15:08,830 --> 00:15:13,100 >> Studenten als Prozentsatz der beteiligten Klasse war in der Vergangenheit von 0% reichten 331 00:15:13,100 --> 00:15:17,300 bis 5,3%, das heißt nur Das ist jährlich eine Herausforderung. 332 00:15:17,300 --> 00:15:20,390 Und auf dieses Ziel hin, was wir tun müssen, ist einen vermitteln wollen 333 00:15:20,390 --> 00:15:24,310 dass wir nur dd-- FYI-- vergleichen zu eine Fairness zu den Studenten, die 334 00:15:24,310 --> 00:15:26,520 sind im Anschluss an die Linie entsprechend. 335 00:15:26,520 --> 00:15:29,620 Wir tun vergleiche alle aktuellen Einreichungen gegen alle vergangenen Missionen 336 00:15:29,620 --> 00:15:30,840 aus den letzten vielen Jahren. 337 00:15:30,840 --> 00:15:33,620 >> Wir wissen auch, wie man sich googelt und finden Sie Code-Repositories 338 00:15:33,620 --> 00:15:36,360 Online-Diskussionsforen online, Job-Websites online. 339 00:15:36,360 --> 00:15:41,580 Wenn ein Schüler es finden kann, können wir sicher finde es so viel wie wir mit Bedauern zu tun. 340 00:15:41,580 --> 00:15:45,330 Also, was Sie in den Lehrplan zu sehen obwohl dies ist Bedauern Klausel. 341 00:15:45,330 --> 00:15:47,500 Ich kann mit Sicherheit schätzen, und wir alle hat 342 00:15:47,500 --> 00:15:50,870 Bediensteten, die natürlich wie gemacht diese oder dieses selbst im Laufe der Zeit, 343 00:15:50,870 --> 00:15:53,997 sicher wissen, wie es ist, wenn Leben im Weg, wenn man bekommt 344 00:15:53,997 --> 00:15:56,080 einige spät in die Nacht deadline-- nicht nur in dieser Klasse, 345 00:15:56,080 --> 00:15:58,660 aber wenn man another-- völlig erschöpft, gestresst, 346 00:15:58,660 --> 00:16:00,659 haben eine ungewöhnlich hohe Zahl andere Dinge zu tun. 347 00:16:00,659 --> 00:16:03,660 Sie werden irgendwann in machen Leben sicherlich ein schlechter, vielleicht zu spät 348 00:16:03,660 --> 00:16:04,620 Nacht Entscheidung. 349 00:16:04,620 --> 00:16:06,520 >> Also pro Lehrplan, gibt es diese Klausel, 350 00:16:06,520 --> 00:16:10,629 so dass, wenn innerhalb von 72 Stunden nach der einige schlechte Entscheidung, bis besitzen Sie es 351 00:16:10,629 --> 00:16:12,670 und erreichen, um mich und einer der Köpfe des Kurses 352 00:16:12,670 --> 00:16:14,300 und wir werden ein Gespräch. 353 00:16:14,300 --> 00:16:16,220 Wir werden Dinge zu behandeln intern in der Hoffnung, 354 00:16:16,220 --> 00:16:18,770 der es immer mehr zu einem Lehr Moment oder Lebenslektion, 355 00:16:18,770 --> 00:16:22,120 und nicht etwas mit Besonders drastisch Auswirkungen 356 00:16:22,120 --> 00:16:24,570 wie man auf diesen Karten hier sehen könnten. 357 00:16:24,570 --> 00:16:26,540 >> Also das ist eine sehr ernste Ton. 358 00:16:26,540 --> 00:16:29,960 Lassen Sie uns für nur ein paar pausieren Sekunden, um die Spannung zu brechen. 359 00:16:29,960 --> 00:16:34,442 >> [Musik zu spielen] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> David J. MALAN: All right, so war, wie das für einen Übergang? 362 00:17:20,250 --> 00:17:22,059 Um den heutigen primären Themen. 363 00:17:22,059 --> 00:17:23,859 Die erste davon ist die Abstraktion. 364 00:17:23,859 --> 00:17:26,900 Ein weiteres, von denen wird sich das sein Darstellung von Daten, die offen 365 00:17:26,900 --> 00:17:31,640 ist ein wirklich trocken Art zu sagen, wie können wir gehen über die Lösung von Problemen und Denken 366 00:17:31,640 --> 00:17:33,250 über die Lösung von Problemen? 367 00:17:33,250 --> 00:17:37,285 So können Sie in Scratch gesehen haben, und Sie haben vielleicht schon in pset1 mit C gesehen 368 00:17:37,285 --> 00:17:39,930 dass Sie nicht nur nutzen können Funktionen, wie printf, 369 00:17:39,930 --> 00:17:42,770 dass andere Menschen in den vergangenen Jahren schrieb für Sie. 370 00:17:42,770 --> 00:17:45,340 Sie können auch eigene Funktionen schreiben. 371 00:17:45,340 --> 00:17:48,440 >> Und auch wenn Sie möglicherweise nicht über dies in C in pset1 getan, und ehrlich gesagt 372 00:17:48,440 --> 00:17:51,866 Sie nicht wirklich brauchen, um schreiben Sie Ihre eigene Funktion, weil der problem-- 373 00:17:51,866 --> 00:17:53,990 während vielleicht auf gewaltige ersten glance-- Sie werden sehen, 374 00:17:53,990 --> 00:17:57,910 kann letztlich gelöst werden nicht so viele Codezeilen. 375 00:17:57,910 --> 00:18:01,140 Aber mit dieser sagte, in Bezug auf von Schreiben eigener Funktion, 376 00:18:01,140 --> 00:18:03,570 erkennen, dass C nicht geben Sie diese Möglichkeit. 377 00:18:03,570 --> 00:18:06,940 >> Ich werde in der heutigen Quellcode zu gehen, die zur Verfügung steht bereits online, 378 00:18:06,940 --> 00:18:10,900 und ich werde weitergehen und offen bis ein Programm namens Funktion 0.c, 379 00:18:10,900 --> 00:18:14,620 und in der Funktion Null Wir werden ein paar Dinge zu sehen. 380 00:18:14,620 --> 00:18:19,160 Im ersten Zeilen 18 bis 23 ist meine Hauptaufgabe. 381 00:18:19,160 --> 00:18:22,414 Und jetzt, wo wir angefangen zu lesen Code, den wir nicht auf der Fliege, Sie schreiben, 382 00:18:22,414 --> 00:18:25,080 sondern ich habe im Voraus geschrieben oder dass Sie in einem Problem eingestellt 383 00:18:25,080 --> 00:18:27,910 möglicherweise erhält mit wurde im Vorfeld geschrieben. 384 00:18:27,910 --> 00:18:30,040 Ein guter Anfang Lesen Code ist jemand anderes 385 00:18:30,040 --> 00:18:31,400 , ist nach der Hauptfunktion. 386 00:18:31,400 --> 00:18:34,420 Herauszufinden, wo Sie diesen Eintrag Punkt ist, um die Ausführung des Programms, 387 00:18:34,420 --> 00:18:36,580 und dann folgen sie logisch von dort. 388 00:18:36,580 --> 00:18:40,190 >> Also dieses Programm offenbar Drucke Ihren Namen gefolgt von einem Doppelpunkt. 389 00:18:40,190 --> 00:18:42,490 Wir verwenden Sie dann GetString von der CS50-Bibliothek 390 00:18:42,490 --> 00:18:46,050 um einen String oder ein Wort oder einen Satz zu bekommen vom Benutzer an der Tastatur. 391 00:18:46,050 --> 00:18:48,390 Und dann gibt es diese Sache hier-- Printname. 392 00:18:48,390 --> 00:18:51,420 >> Jetzt Printname ist nicht ein Funktion, die mit C. kommt 393 00:18:51,420 --> 00:18:52,970 Es ist nicht im Standard-io.h 394 00:18:52,970 --> 00:18:55,570 Es ist nicht in CS50.h. 395 00:18:55,570 --> 00:18:57,880 Es ist ziemlich in der gleichen Datei. 396 00:18:57,880 --> 00:19:01,000 Merken, wenn ich nach unten scrollen ein bit-- Zeilen 25 bis 27-- 397 00:19:01,000 --> 00:19:05,330 es ist nur eine hübsche Weise zu kommentieren Ihr Code mit den Sternen und Schrägstriche. 398 00:19:05,330 --> 00:19:07,320 Dies ist ein Mehrzeilen kommentieren, und das ist nur 399 00:19:07,320 --> 00:19:10,570 meine Beschreibung in Blau Was diese Funktion tut. 400 00:19:10,570 --> 00:19:14,530 >> Da in den Zeilen 28 bis 31, Ich habe ein super einfache Funktion geschrieben 401 00:19:14,530 --> 00:19:16,280 dessen Name Printname. 402 00:19:16,280 --> 00:19:19,560 Es dauert, wie viele Argumente würden Sie sagen? 403 00:19:19,560 --> 00:19:25,120 So ein argument--, weil es eine Argument in den Klammern aufgeführt. 404 00:19:25,120 --> 00:19:27,000 Dessen Typ String ist. 405 00:19:27,000 --> 00:19:30,240 Welche ist die Printname sagen ist wie dieser Black-Box 406 00:19:30,240 --> 00:19:32,910 oder Funktion, die nimmt als Eingabe eine Zeichenfolge. 407 00:19:32,910 --> 00:19:35,730 >> Und der Name dieser String bequem wird der Name sein. 408 00:19:35,730 --> 00:19:37,840 Nicht S, N nicht, aber Namen. 409 00:19:37,840 --> 00:19:41,090 Also, was bedeutet Printname tun? 410 00:19:41,090 --> 00:19:42,210 Es ist schön einfach. 411 00:19:42,210 --> 00:19:45,390 So wie eine Zeile Code für printf, aber anscheinend ist es 412 00:19:45,390 --> 00:19:47,950 druckt "Hallo", so und so. 413 00:19:47,950 --> 00:19:50,070 Wo das so und so kommt aus der Argument. 414 00:19:50,070 --> 00:19:52,300 >> Nun ist dies nicht eine große Neuerung. 415 00:19:52,300 --> 00:19:56,710 Wirklich, ich habe ein Programm, das ergriffen werden könnten, haben mit einer Zeile Code geschrieben wurde 416 00:19:56,710 --> 00:20:00,190 indem diese hier oben, und verändert es zu etwas 417 00:20:00,190 --> 00:20:04,920 dazu gehört etwa sechs oder sieben oder so Zeilen Code den ganzen Weg hier unten. 418 00:20:04,920 --> 00:20:08,190 >> Aber es ist das Üben von ein Prinzip als Abstraktion bekannt. 419 00:20:08,190 --> 00:20:12,550 Art der Einkapselung innerhalb eines neuen Funktion, die einen Namen hat, und besser 420 00:20:12,550 --> 00:20:14,590 noch, dass der Name buchstäblich sagt, was sie tut. 421 00:20:14,590 --> 00:20:16,880 Ich meine, das ist nicht printf-- besonders beschreibend. 422 00:20:16,880 --> 00:20:18,932 Wenn ich eine erstellen Puzzle-Stück, oder wenn ich 423 00:20:18,932 --> 00:20:21,140 möchte eine Funktion erstellen dass druckt jemand Name, 424 00:20:21,140 --> 00:20:23,230 die Schönheit Dadurch ist, dass ich eigentlich 425 00:20:23,230 --> 00:20:27,170 geben, die Funktion einen Namen das beschreibt, was es tut. 426 00:20:27,170 --> 00:20:29,844 >> Jetzt dauert es in einen Eingang, Ich habe willkürlich genannt Name, 427 00:20:29,844 --> 00:20:32,760 aber auch das ist wunderbar beschreibenden statt ein wenig 428 00:20:32,760 --> 00:20:36,140 generische wie S. und Leere, denn jetzt, bedeutet nur, 429 00:20:36,140 --> 00:20:38,330 dass diese Funktion nicht gib mir etwas zurück. 430 00:20:38,330 --> 00:20:41,127 Es ist nicht so, dass GetString buchstäblich reicht mir einen String zurück 431 00:20:41,127 --> 00:20:43,960 wie wir mit den Stücken von Papier hat mit Ihren Klassenkameraden in der vergangenen Woche, 432 00:20:43,960 --> 00:20:45,990 sondern es hat nur ein Nebeneffekt. 433 00:20:45,990 --> 00:20:48,080 Er druckt etwas auf den Bildschirm. 434 00:20:48,080 --> 00:20:53,880 >> So dass am Ende des Tages, wenn ich Sie machen Funktion-0, ./function-0, 435 00:20:53,880 --> 00:20:55,450 wir werden sehen, dass es nach meinem Namen fragt. 436 00:20:55,450 --> 00:20:58,150 Ich tippe David, und es Typen, die meinen Namen. 437 00:20:58,150 --> 00:21:01,080 Wenn ich es wieder tun mit Rob, es geht zu sagen: "Hallo, Rob." 438 00:21:01,080 --> 00:21:04,280 So eine einfache Idee, aber vielleicht extrapolieren aus dieser geistig 439 00:21:04,280 --> 00:21:06,750 dass Ihre Programme bekommen ein wenig komplizierter, 440 00:21:06,750 --> 00:21:10,290 und Sie ein Stück schreiben wollen Code und Anruf, dass code-- invoke 441 00:21:10,290 --> 00:21:13,270 dass code-- von einigen beschreibenden Namen wie Printname, 442 00:21:13,270 --> 00:21:15,600 C tut uns leisten diese Fähigkeit. 443 00:21:15,600 --> 00:21:17,660 >> Hier ist ein weiteres einfaches Beispiel. 444 00:21:17,660 --> 00:21:22,940 Zum Beispiel, wenn ich öffnen ein Datei ab heute genannt return.c, 445 00:21:22,940 --> 00:21:24,270 feststellen, was ich hier getan. 446 00:21:24,270 --> 00:21:26,330 Die meisten dieser Hauptfunktion ist printf. 447 00:21:26,330 --> 00:21:30,360 Ich zum ersten Mal zu initialisieren willkürlich ein Variable namens x der Anzahl 2. 448 00:21:30,360 --> 00:21:34,110 Ich habe dann ausdrucken "x ist jetzt % I "übergeben den Wert von x. 449 00:21:34,110 --> 00:21:35,500 Also bin ich einfach nur sagen, was es ist. 450 00:21:35,500 --> 00:21:37,208 >> Jetzt bin ich einfach nur dreist behaupten, mit printf. 451 00:21:37,208 --> 00:21:42,050 Ich Cubing diesen Wert x, und ich bin Dabei durch den Aufruf einer Funktion 452 00:21:42,050 --> 00:21:45,590 genannt Würfel Gang in x als Argument, 453 00:21:45,590 --> 00:21:49,300 und dann die Rettung der Ausgangs in der Variablen selbst, x. 454 00:21:49,300 --> 00:21:51,340 Also ich bin clobbering den Wert von x. 455 00:21:51,340 --> 00:21:53,380 Ich bin das Überschreiben der Wert von x mit dem, was 456 00:21:53,380 --> 00:21:56,510 das Ergebnis des Aufrufens Dieser Würfel Funktion ist. 457 00:21:56,510 --> 00:21:59,530 Und dann habe ich nur einige ausdrucken flauschige Zeug hier zu sagen, was ich getan habe. 458 00:21:59,530 --> 00:22:01,600 >> Also, was ist dann Würfel? 459 00:22:01,600 --> 00:22:03,510 Beachten Sie, was ist grundlegend anders. 460 00:22:03,510 --> 00:22:05,540 Ich habe die Funktion gegeben ein Name wie vorher. 461 00:22:05,540 --> 00:22:08,270 Ich habe einen Namen für ein Argument angegeben. 462 00:22:08,270 --> 00:22:11,650 Dieses Mal ist es als n anstelle des Namens, aber ich könnte es, was ich will. 463 00:22:11,650 --> 00:22:12,650 Dies ist jedoch anders. 464 00:22:12,650 --> 00:22:14,080 Das Ding auf der linken Seite. 465 00:22:14,080 --> 00:22:16,290 Bisher war es, was Keyword? 466 00:22:16,290 --> 00:22:16,870 Boys. 467 00:22:16,870 --> 00:22:18,580 Jetzt ist es offensichtlich Int. 468 00:22:18,580 --> 00:22:20,630 >> Also, was ist vielleicht das wegnehmen? 469 00:22:20,630 --> 00:22:24,090 Wohingegen Leere bedeutet Art Nichts, und das war der Fall. 470 00:22:24,090 --> 00:22:25,970 Printname zurückgegeben nichts. 471 00:22:25,970 --> 00:22:27,942 Sie tat etwas, aber es hat mich nicht zurückgeben 472 00:22:27,942 --> 00:22:30,650 etwas, das ich auf der Put- linken Seite des Gleichheitszeichens 473 00:22:30,650 --> 00:22:32,460 wie ich hier auf der Linie 22 durchgeführt. 474 00:22:32,460 --> 00:22:36,780 >> Also, wenn ich in der Linie 30 zu sagen, was ist das wohl was bedeutet, 475 00:22:36,780 --> 00:22:38,610 über das, was Würfel für mich tut? 476 00:22:38,610 --> 00:22:41,110 Ja? 477 00:22:41,110 --> 00:22:42,310 Es gibt eine ganze Zahl. 478 00:22:42,310 --> 00:22:44,590 So ist es reicht mir zurück, für beispielsweise ein Stück Papier, 479 00:22:44,590 --> 00:22:46,580 , auf die er die Antwort geschrieben. 480 00:22:46,580 --> 00:22:50,130 2 Würfel geschnitten, gewürfelt oder 3 oder 4 cubed-- was auch immer ich in vergangen, 481 00:22:50,130 --> 00:22:51,540 und wie implementiere ich das? 482 00:22:51,540 --> 00:22:54,810 Nun, nur n mal n mal n ist, wie ich könnte einen Wert Würfel. 483 00:22:54,810 --> 00:22:57,110 Also noch einmal, super einfach Idee, aber demonstrative 484 00:22:57,110 --> 00:23:00,100 jetzt, wie wir Funktionen schreiben dass tatsächlich hatten uns zurück 485 00:23:00,100 --> 00:23:02,380 Werte, die von Interesse sein könnten. 486 00:23:02,380 --> 00:23:05,740 >> Schauen wir uns ein letztes Beispiel hier eine Funktion aufgerufen. 487 00:23:05,740 --> 00:23:08,530 In diesem Beispiel beginnt es mehr zwingend zu bekommen. 488 00:23:08,530 --> 00:23:12,400 Also in einer Funktion, diese program-- Ankündigung letztlich 489 00:23:12,400 --> 00:23:14,920 ruft eine Funktion namens GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt kein Funktion in der CS50-Bibliothek, 491 00:23:17,800 --> 00:23:20,400 aber wir beschlossen, wir möchten, dass es existiert. 492 00:23:20,400 --> 00:23:24,550 >> Also, wenn wir später in der Datei nach unten scrollen, merken, wie ich über die Implementierung 493 00:23:24,550 --> 00:23:26,560 bekommen positive int, und ich sagen, es ist mehr zwingend 494 00:23:26,560 --> 00:23:28,992 denn dies ist ein anständiges Anzahl von Codezeilen. 495 00:23:28,992 --> 00:23:30,700 Es ist nicht nur ein dummer kleine Spielzeug-Programm. 496 00:23:30,700 --> 00:23:33,870 Es ist eigentlich habe einige Fehlerprüfung und noch etwas mehr Nützliches zu tun. 497 00:23:33,870 --> 00:23:38,470 >> Also, wenn Sie noch nicht die Komplettlösung gesehen Videos, die wir in pset1 eingebettet haben, 498 00:23:38,470 --> 00:23:42,350 weiß, dass dies eine Art von Schleife in C, im Geiste 499 00:23:42,350 --> 00:23:44,270 auf die Art von Dingen, Scratch tun können. 500 00:23:44,270 --> 00:23:46,320 Und zu tun, sagt dies tun. 501 00:23:46,320 --> 00:23:47,500 Drucken Sie diese aus. 502 00:23:47,500 --> 00:23:51,860 Dann gehen Sie vor und erhalten n-- bekommen einen int und speichern sie in n, 503 00:23:51,860 --> 00:23:55,760 und halten Sie wieder und wieder und tun dies wieder solange n kleiner als eins ist. 504 00:23:55,760 --> 00:23:58,720 >> SO n wird auf weniger als eins nur wenn die menschlichen nicht zusammen. 505 00:23:58,720 --> 00:24:01,980 Wenn er oder sie ist die Eingabe in 0 oder -1 oder -50, 506 00:24:01,980 --> 00:24:04,790 Diese Schleife wird sich halten wieder und wieder ausführen. 507 00:24:04,790 --> 00:24:07,549 Und letztlich feststellen, ich einfach das Wert. 508 00:24:07,549 --> 00:24:09,590 So, jetzt haben wir eine Funktion dass wäre schön gewesen 509 00:24:09,590 --> 00:24:14,040 wenn CS50 würde umzusetzen in CS50.h und CS50.c für Sie, 510 00:24:14,040 --> 00:24:16,520 aber hier können wir nun implementieren diese uns. 511 00:24:16,520 --> 00:24:19,230 >> Aber zwei Anmerkungen zu einigen wichtigen Details. 512 00:24:19,230 --> 00:24:24,390 One-- warum habe ich zu erklären int n, denken Sie, auf der Linie 29 513 00:24:24,390 --> 00:24:27,139 statt nur dabei das hier, das ist, 514 00:24:27,139 --> 00:24:28,930 mehr im Einklang mit was wir getan haben in der vergangenen Woche? 515 00:24:28,930 --> 00:24:29,430 Ja? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 Ein guter Gedanke. 518 00:24:35,110 --> 00:24:37,080 Also, wenn wir sie gestellt wurden hier, es ist, als ob wir 519 00:24:37,080 --> 00:24:39,110 halten Sie es immer und immer wieder erklärt. 520 00:24:39,110 --> 00:24:42,000 Dass an und für sich ist nicht problematisch, per se, 521 00:24:42,000 --> 00:24:43,940 denn wir brauchen nur der Wert einmal und dann 522 00:24:43,940 --> 00:24:45,330 wir werden eine neue sowieso. 523 00:24:45,330 --> 00:24:45,940 Aber ein guter Gedanke. 524 00:24:45,940 --> 00:24:46,440 Ja? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Schließen. 527 00:24:53,330 --> 00:24:59,030 Also, weil ich n für deklarierte Linie 29 außerhalb der Schleife, 528 00:24:59,030 --> 00:25:01,390 es ist im gesamten Hotel verfügbar diese ganze Funktion. 529 00:25:01,390 --> 00:25:05,400 Nicht die anderen Funktionen, da n ist immer noch innerhalb dieser geschweiften 530 00:25:05,400 --> 00:25:06,470 Hosenträger hier. 531 00:25:06,470 --> 00:25:07,940 SO- sicher. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Genau. 534 00:25:12,940 --> 00:25:14,356 Das ist also noch mehr auf den Punkt. 535 00:25:14,356 --> 00:25:18,600 Wenn wir stattdessen erklärt n gleich hier auf der Linie 32, 536 00:25:18,600 --> 00:25:22,340 es ist problematisch, weil Vermutung Wo sonst muss ich darauf zugreifen? 537 00:25:22,340 --> 00:25:25,620 Auf der Linie 34 und der einfache Faustregel ist, 538 00:25:25,620 --> 00:25:30,060 dass Sie nur eine Variable innerhalb der letzten geschweiften Klammern 539 00:25:30,060 --> 00:25:31,420 , in dem Sie sie deklariert. 540 00:25:31,420 --> 00:25:35,230 >> Leider, Zeile 34 ist eine Zeile zu spät, 541 00:25:35,230 --> 00:25:38,560 weil ich schon geschlossen die geschweifte Klammer in Zeile 33 542 00:25:38,560 --> 00:25:41,220 Das entspricht dem geschweifte Klammer auf der Leitung 30. 543 00:25:41,220 --> 00:25:44,180 Und so ist dies eine Art zu sagen, dass diese Variable int ist Gültigkeitsbereich, 544 00:25:44,180 --> 00:25:46,970 sozusagen nur innerhalb dieser geschweiften Klammern. 545 00:25:46,970 --> 00:25:48,910 Es funktioniert einfach nicht außerhalb von ihnen existieren. 546 00:25:48,910 --> 00:25:51,580 >> Also in der Tat, wenn ich dies tun falsch, lassen Sie mich den Code zu speichern 547 00:25:51,580 --> 00:25:53,530 wie es ist-- falsch geschrieben. 548 00:25:53,530 --> 00:25:57,990 Lassen Sie mich gehen Sie vor und machen Sie Funktion-1 und notice-- Fehler. 549 00:25:57,990 --> 00:26:03,502 Verwendung von nicht deklarierter Bezeichner n auf der Linie 35, die hier ist. 550 00:26:03,502 --> 00:26:05,210 Und wenn wir nach oben Weiterhin eine andere. 551 00:26:05,210 --> 00:26:08,750 Verwendung von Schwarz Kennung n auf der Leitung 34. 552 00:26:08,750 --> 00:26:11,200 >> So dass der Compiler, Clang, ist zu bemerken, dass es nur 553 00:26:11,200 --> 00:26:13,720 nicht vorhanden ist, obwohl klar, dass es da visuell. 554 00:26:13,720 --> 00:26:16,090 So eine einfache Lösung wird es dort erklärt. 555 00:26:16,090 --> 00:26:18,790 >> Nun lassen Sie mich zum Blättern der Anfang der Datei. 556 00:26:18,790 --> 00:26:21,080 Was springt dich an, als ein wenig anders 557 00:26:21,080 --> 00:26:23,070 aus dem Material, das wir sahen letzte Woche? 558 00:26:23,070 --> 00:26:26,990 Nicht nur, dass ich Namen, nicht nur Ich habe einige scharfe beinhaltet bis oben, 559 00:26:26,990 --> 00:26:29,340 Ich habe etwas, was ich bin Aufruf eines Prototyps. 560 00:26:29,340 --> 00:26:36,100 Nun, da sieht furchtbar ähnlich, was wir gerade gesehen vor einem Augenblick auf der Linie 27. 561 00:26:36,100 --> 00:26:39,230 >> Lassen Sie uns also folgern aus einer anderen Fehlermeldung, warum ich das getan. 562 00:26:39,230 --> 00:26:42,050 Lassen Sie mich gehen Sie vor und diese Zeilen zu löschen gibt. 563 00:26:42,050 --> 00:26:44,240 Und so wissen wir nichts über Prototyp. 564 00:26:44,240 --> 00:26:45,430 Remake diese Datei. 565 00:26:45,430 --> 00:26:46,890 Machen Sie eine Funktion. 566 00:26:46,890 --> 00:26:48,090 Und jetzt, verdammt, vier Fehler. 567 00:26:48,090 --> 00:26:50,220 Lassen Sie uns nach oben auf die erste. 568 00:26:50,220 --> 00:26:55,070 >> Implizite Deklaration der Funktion bekommen positive int ist ungültig in C99. 569 00:26:55,070 --> 00:26:57,780 C99 bedeutet nur, das 1999 Version der Sprache 570 00:26:57,780 --> 00:26:59,710 C, das, was wir in der Tat mit ist. 571 00:26:59,710 --> 00:27:01,050 Also, was bedeutet das? 572 00:27:01,050 --> 00:27:05,250 Nun C-- und insbesondere C compilers-- sind ziemlich dumm Programme. 573 00:27:05,250 --> 00:27:07,420 Sie wissen nur das, was Sie haben, sagte sie, und das ist 574 00:27:07,420 --> 00:27:08,960 tatsächlich thematischen von letzter Woche. 575 00:27:08,960 --> 00:27:12,910 >> Das Problem ist, dass, wenn ich gehen über die Implementierung Namen hier oben, 576 00:27:12,910 --> 00:27:17,640 und ich eine Funktion namens nennen GetPositiveInt hier auf der Linie 20, 577 00:27:17,640 --> 00:27:22,520 diese Funktion technisch nicht bestehen, bis der Compiler sieht Leitung 27. 578 00:27:22,520 --> 00:27:25,450 Leider ist der Compiler Dinge oben, unten, links, rechts zu tun, 579 00:27:25,450 --> 00:27:29,580 so, weil es nicht gesehen dem Umsetzung der GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 aber es sieht Sie versuchen es hier verbrauchen, 581 00:27:32,400 --> 00:27:35,810 es nur geht, um bail-- schreien Sie mit einer Fehler nachrichten-- vielleicht 582 00:27:35,810 --> 00:27:38,440 kryptisch, und nicht die tatsächlich kompilieren Sie die Datei. 583 00:27:38,440 --> 00:27:41,940 >> Also eine so genannte Prototyp bis hier ist zwar redundant. 584 00:27:41,940 --> 00:27:47,870 Wörtlich ging ich hier, und ich kopiert und eingefügt, und ich legen Sie ihn hier. 585 00:27:47,870 --> 00:27:51,020 Leere wäre richtig, so dass wir wörtlich zu kopieren und diese Zeit. 586 00:27:51,020 --> 00:27:52,854 Ich habe buchstäblich kopiert und eingefügt es. 587 00:27:52,854 --> 00:27:54,270 Wirklich nur als wie ein Brotkrümel. 588 00:27:54,270 --> 00:27:56,260 >> Ein wenig Ahnung, um den Compiler. 589 00:27:56,260 --> 00:27:58,860 Ich weiß nicht, was das bedeutet noch nicht, aber ich versprach, die Sie 590 00:27:58,860 --> 00:28:00,260 daß es schließlich existiert. 591 00:28:00,260 --> 00:28:04,010 Und das ist, warum dies in line-- Linie 16-- endet mit einem Semikolon. 592 00:28:04,010 --> 00:28:05,486 Es ist überflüssig, von Entwurf. 593 00:28:05,486 --> 00:28:05,986 Ja? 594 00:28:05,986 --> 00:28:11,340 595 00:28:11,340 --> 00:28:14,360 >> Wenn Sie Ihre Bibliothek nicht verlinken zu the-- oh, gute Frage. 596 00:28:14,360 --> 00:28:17,350 Sharp enthält Header-Datei Einschlüsse. 597 00:28:17,350 --> 00:28:20,040 Müssen fast sollte BE-- immer an der Spitze sein 598 00:28:20,040 --> 00:28:23,270 der Datei für eine similar-- für genau der gleiche Grund, ja. 599 00:28:23,270 --> 00:28:26,430 Denn in Standard- io.h ist buchstäblich eine Linie 600 00:28:26,430 --> 00:28:30,560 wie diese, aber mit dem Wort printf und mit seinen Argumenten und der Rückgabetyp. 601 00:28:30,560 --> 00:28:33,310 Und so scharf, indem Sie beinhalten bis hier, was Sie tun buchstäblich 602 00:28:33,310 --> 00:28:36,380 ist das Kopieren und Einfügen der Inhalte von jemand anderem geschrieben bis oben. 603 00:28:36,380 --> 00:28:39,660 Dabei cluing Ihren Code ein, um die Tatsache, dass diese Funktionen nicht vorhanden sind. 604 00:28:39,660 --> 00:28:40,160 Ja? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Absolut. 607 00:28:48,260 --> 00:28:51,690 Also eine sehr kluge und richtige Lösung wäre, wissen Sie was? 608 00:28:51,690 --> 00:28:53,760 Ich weiß nicht, was für ein Prototyp ist, aber ich weiß, 609 00:28:53,760 --> 00:28:56,390 wenn ich verstehe, dass C ist nur dumm und überdenkt oben nach unten. 610 00:28:56,390 --> 00:28:57,820 Nun versuchen wir es, was es will. 611 00:28:57,820 --> 00:29:01,650 Lassen Sie uns diesen Code zu schneiden, fügen Sie ihn bis oben, und jetzt schieben Haupt unten. 612 00:29:01,650 --> 00:29:03,470 Auch dies würde das Problem lösen. 613 00:29:03,470 --> 00:29:07,409 >> Aber man konnte sehr leicht kommen mit ein Szenario, in dem die Notwendigkeit, B nennen, 614 00:29:07,409 --> 00:29:10,075 B und vielleicht ruft zurück zu A. Diese ist die so genannte Rekursion 615 00:29:10,075 --> 00:29:11,370 und wir werden darauf zurückkommen. 616 00:29:11,370 --> 00:29:13,911 Und es kann oder auch nicht eine gute sein Sache, aber man kann auf jeden Fall 617 00:29:13,911 --> 00:29:15,110 brechen diese Lösung. 618 00:29:15,110 --> 00:29:17,690 >> Und außerdem würde ich behaupten, stilistisch, 619 00:29:17,690 --> 00:29:20,760 vor allem, wenn Sie Ihre Programme werden diese lange und so lange, 620 00:29:20,760 --> 00:29:23,064 es ist einfach super praktisch an der Spitze Haupt zu setzen 621 00:29:23,064 --> 00:29:25,730 denn es ist das, was die meisten Programmierer gehen zu interessieren. 622 00:29:25,730 --> 00:29:28,150 Und so ist es ein wenig sauberer, wohl, um es zu tun, wie 623 00:29:28,150 --> 00:29:30,380 Ursprünglich habe ich es tat mit einem Prototyp auch 624 00:29:30,380 --> 00:29:33,396 obwohl es ein wenig sieht auf den ersten Blick überflüssig. 625 00:29:33,396 --> 00:29:33,895 Ja? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Es tut uns leid, können Sie es sagen, lauter? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Wenn Sie die Standorte der Schalter Umsetzung und der Prototyp? 630 00:29:49,580 --> 00:29:51,270 Also das ist eine gute Frage. 631 00:29:51,270 --> 00:29:53,780 Wenn Sie wieder erklären, diese nach unten hier, mal sehen, was passiert. 632 00:29:53,780 --> 00:29:55,530 Also, wenn ich diese nach unten hier, du sagst. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Oh, sorry. 635 00:29:58,360 --> 00:29:58,859 Lauter? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Noch lauter. 638 00:30:04,011 --> 00:30:04,760 Oh, gute Frage. 639 00:30:04,760 --> 00:30:05,860 Wäre es die Funktion ungültig? 640 00:30:05,860 --> 00:30:08,901 Sie wissen, nach all den Jahren, habe ich haben nie einen Prototyp danach. 641 00:30:08,901 --> 00:30:13,810 Also lassen Sie uns machen-1-Funktion nach tun. 642 00:30:13,810 --> 00:30:15,279 >> [Murmelnd] 643 00:30:15,279 --> 00:30:16,320 David J. MALAN: Oh, warten. 644 00:30:16,320 --> 00:30:17,944 Wir haben immer noch alles bis oben setzen. 645 00:30:17,944 --> 00:30:21,400 Also lassen Sie uns das tun hier, wenn ich mich richtig zu verstehen Ihre Frage. 646 00:30:21,400 --> 00:30:24,700 Ich setze alles, einschließlich der Prototyp über Haupt, 647 00:30:24,700 --> 00:30:28,180 aber ich setze den Prototyp unterhalb der Umsetzung. 648 00:30:28,180 --> 00:30:33,190 >> Also, wenn ich eine machen, ich bin immer zurück error-- eine nicht verwendete Variable n. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Oh, da gibt. 651 00:30:37,860 --> 00:30:38,360 Danke. 652 00:30:38,360 --> 00:30:39,430 Mal sehen, bekommen wir das beheben. 653 00:30:39,430 --> 00:30:41,304 Das ist eine andere Bug, also lasst uns ignorieren. 654 00:30:41,304 --> 00:30:43,910 Lassen Sie uns ganz schnell ein Remake dieses. 655 00:30:43,910 --> 00:30:48,100 >> OK, so dass die Daten nicht Argument durch Format-String 656 00:30:48,100 --> 00:30:52,310 n-- oh, das ist, weil Ich änderte diese hier. 657 00:30:52,310 --> 00:30:55,885 Alles klar, wir wissen, was die Antwort ist alles in Ordnung gehen zu--, hier gehen wir. 658 00:30:55,885 --> 00:31:00,560 Ah, danke für die positive. 659 00:31:00,560 --> 00:31:03,430 Alles klar, ich werde diesen Code beheben after-- ignorieren diese besondere Bug 660 00:31:03,430 --> 00:31:08,300 da dies was-- es funktioniert, ist die Antwort. 661 00:31:08,300 --> 00:31:11,560 >> So ist es nicht überschreiben was Sie gerade getan haben. 662 00:31:11,560 --> 00:31:14,800 Ich vermute, dass der Compiler in einer solchen Weise geschrieben 663 00:31:14,800 --> 00:31:18,420 dass es Ihr Prototyp ignorieren Weil der Körper, so zu sprechen, 664 00:31:18,420 --> 00:31:20,922 der die Funktion hat bereits wurden höher implementiert. 665 00:31:20,922 --> 00:31:23,380 Ich müsste eigentlich konsultieren Das Handbuch des Compilers 666 00:31:23,380 --> 00:31:26,171 zu verstehen, wenn es andere Implikation, aber auf den ersten Blick 667 00:31:26,171 --> 00:31:29,290 nur durch Ausprobieren und Experimentieren, scheint es keine Auswirkungen. 668 00:31:29,290 --> 00:31:30,730 Gute Frage. 669 00:31:30,730 --> 00:31:33,660 >> Also lassen Sie uns jetzt vorantreiben, bewegen weg von Nebenwirkungen, die 670 00:31:33,660 --> 00:31:36,660 sind Funktionen, die so etwas wie visuell auf dem Bildschirm mit printf, 671 00:31:36,660 --> 00:31:38,090 aber keinen Wert zurück. 672 00:31:38,090 --> 00:31:41,550 Und Funktionen, die haben Rück Werte wie wir gerade gesehen haben einige. 673 00:31:41,550 --> 00:31:45,350 Wir haben bereits gesehen diese Vorstellung von Umfang, und wir werden dies immer wieder zu sehen. 674 00:31:45,350 --> 00:31:47,210 Aber jetzt wieder, verwenden Sie die Faustregel 675 00:31:47,210 --> 00:31:51,410 dass eine Variable kann nur verwendet werden, Innenseite der zuletzt geöffneten 676 00:31:51,410 --> 00:31:54,350 und geschlossenen geschweiften Klammern, wie wir sah in diesem speziellen Beispiel. 677 00:31:54,350 --> 00:31:56,910 >> Und wie Sie wies darauf hin, es ist ein ability-- 678 00:31:56,910 --> 00:32:00,040 Sie könnten einige dieser Probleme zu lösen, indem eine Variable global 679 00:32:00,040 --> 00:32:01,290 an der Spitze einer Datei. 680 00:32:01,290 --> 00:32:03,630 Aber in fast allen Fällen würden wir auf, dass die Stirn runzeln, 681 00:32:03,630 --> 00:32:06,170 und in der Tat auch nicht gehen in dieser Lösung für jetzt. 682 00:32:06,170 --> 00:32:09,890 So jetzt ist das Essen zum Mitnehmen, dass Variablen haben diese Vorstellung von Umfang. 683 00:32:09,890 --> 00:32:13,430 >> Aber jetzt einen Blick auf ein weiteres lassen trockenen Weg eigentlich auf der Suche 684 00:32:13,430 --> 00:32:15,810 irgend ziemlich interessant Details der Implementierung. 685 00:32:15,810 --> 00:32:17,810 Wie wir Informationen darstellen. 686 00:32:17,810 --> 00:32:20,370 Und wir schon bei diesem sah in der ersten Woche der Klasse. 687 00:32:20,370 --> 00:32:23,320 Mit Blick auf die Binaries, und erinnert uns der Nachkommastellen. 688 00:32:23,320 --> 00:32:28,310 >> Aber erinnern aus der vergangenen Woche, dass C hat verschiedene Datentypen und Bündeln mehr, 689 00:32:28,310 --> 00:32:30,600 aber die nützlichsten jetzt könnte dieser sein. 690 00:32:30,600 --> 00:32:36,030 Ein char oder Charakter, der passiert, zu einem Byte oder acht Bits insgesamt sein. 691 00:32:36,030 --> 00:32:40,060 Und das ist zu sagen, dass die Größe eines char ist nur ein Byte. 692 00:32:40,060 --> 00:32:45,370 Ein Byte acht Bits, so bedeutet dies, dass wir stellen dar, wie viele Zeichen. 693 00:32:45,370 --> 00:32:47,320 Wie viele Buchstaben oder Symbole auf der Tastatur 694 00:32:47,320 --> 00:32:49,210 wenn wir ein Byte oder acht Bits. 695 00:32:49,210 --> 00:32:51,546 Denken Sie zurück an Woche Null. 696 00:32:51,546 --> 00:32:53,420 Wenn Sie acht Bits, wie viele Gesamtwerte 697 00:32:53,420 --> 00:32:55,503 Sie stellen mit Muster von Nullen und Einsen? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 One-- mehr. 700 00:33:00,260 --> 00:33:03,490 Also insgesamt 256, wenn Sie Zählen beginnen bei Null. 701 00:33:03,490 --> 00:33:07,120 Also, wenn Sie acht bits-- also, wenn wir hatten unsere Binär-Lampen bis hier wieder, 702 00:33:07,120 --> 00:33:12,180 wir könnten diese Glühbirnen einzuschalten und aus einem von 256 einzigartige Muster. 703 00:33:12,180 --> 00:33:13,640 >> Nun, das ist ein bisschen problematisch. 704 00:33:13,640 --> 00:33:16,857 Nicht so sehr für Englisch und romanischen Sprachen, aber sicherlich 705 00:33:16,857 --> 00:33:19,190 wenn Ihnen vorstellen, für Beispiel asiatische Sprachen, die 706 00:33:19,190 --> 00:33:22,580 haben weit mehr als Symbole wie 26 Buchstaben des Alphabets. 707 00:33:22,580 --> 00:33:24,390 Wir könnten tatsächlich benötigen mehr als ein Byte. 708 00:33:24,390 --> 00:33:28,240 Und zum Glück in den letzten Jahren hat die Gesellschaft 709 00:33:28,240 --> 00:33:31,040 angenommen, die andere Standards verwenden mehr als ein Byte pro Ladung. 710 00:33:31,040 --> 00:33:34,210 >> Aber jetzt in C, der Standard- ist nur ein Byte oder acht Bits. 711 00:33:34,210 --> 00:33:38,195 Eine ganze Zahl ist unterdessen vier Bytes, auch als 32 Bit bekannt. 712 00:33:38,195 --> 00:33:41,320 Was bedeutet, was ist die größte mögliche Anzahl können wir mit einem int darstellen 713 00:33:41,320 --> 00:33:41,820 scheinbar? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Mit einer Milliarde. 716 00:33:45,050 --> 00:33:46,760 So ist es vier Milliarden zu geben oder zu nehmen. 717 00:33:46,760 --> 00:33:49,840 2 auf den 32. Macht, wenn wir nehmen keine negativen Zahlen 718 00:33:49,840 --> 00:33:52,530 und verwenden Sie nur alle positiven Zahlen, es ist vier Milliarden 719 00:33:52,530 --> 00:33:53,730 geben oder nehmen Möglichkeiten. 720 00:33:53,730 --> 00:33:57,890 Ein Schwimmer, mittlerweile ist eine andere Art der Datentyp in C. Es ist immer noch eine Nummer, 721 00:33:57,890 --> 00:33:58,990 aber es ist eine reelle Zahl ist. 722 00:33:58,990 --> 00:34:00,660 Etwas mit einem Komma. 723 00:34:00,660 --> 00:34:03,000 Und es stellt sich heraus, dass C verwendet auch vier Bytes 724 00:34:03,000 --> 00:34:05,340 Fließkommawerte repräsentieren. 725 00:34:05,340 --> 00:34:09,420 >> Leider, wie viele schwimm Punktwerte gibt es in der Welt? 726 00:34:09,420 --> 00:34:11,582 Wie viele reelle Zahlen gibt es? 727 00:34:11,582 --> 00:34:13,540 Es gibt eine unendliche Nummer und für diese Angelegenheit 728 00:34:13,540 --> 00:34:15,164 es gibt eine unendliche Anzahl von ganzen Zahlen. 729 00:34:15,164 --> 00:34:18,070 So sind wir bereits Art von Graben wir uns hier ein Loch. 730 00:34:18,070 --> 00:34:21,780 Wobei offenbar in computers-- an dest Programme in C geschrieben auf them-- 731 00:34:21,780 --> 00:34:24,110 kann nur so hoch wie zu zählen vier Milliarden geben oder nehmen, 732 00:34:24,110 --> 00:34:26,260 und Fließkommawerte kann nur scheinbar 733 00:34:26,260 --> 00:34:28,330 eine gewisse endliche Menge an Präzision. 734 00:34:28,330 --> 00:34:30,810 Nur so viele Stellen nach ihre Komma. 735 00:34:30,810 --> 00:34:32,822 >> Denn natürlich, wenn Sie haben nur 32 Bits, 736 00:34:32,822 --> 00:34:36,030 Ich weiß nicht, wie wir gehen, um zu gehen dargestellt durch reale numbers-- wahrscheinlich 737 00:34:36,030 --> 00:34:37,409 mit verschiedenen Mustern. 738 00:34:37,409 --> 00:34:40,030 Aber es gibt sicherlich eine endliche Anzahl solcher Muster, 739 00:34:40,030 --> 00:34:41,830 so auch hier, ist dies problematisch. 740 00:34:41,830 --> 00:34:43,710 >> Jetzt können wir das Problem leicht zu vermeiden. 741 00:34:43,710 --> 00:34:45,710 Wenn Sie nicht mit einem Schwimmer, Sie ein Doppel verwenden 742 00:34:45,710 --> 00:34:50,230 in C, die Ihnen acht Bytes, die ist viel mehr möglich, Muster von Nullen 743 00:34:50,230 --> 00:34:50,730 und Einsen. 744 00:34:50,730 --> 00:34:55,199 Aber es ist immer noch endlich, die gehen zu sein, problematisch, wenn Sie Software schreiben 745 00:34:55,199 --> 00:34:57,670 für Grafiken oder für ausgefallene mathematischen Formeln. 746 00:34:57,670 --> 00:35:00,410 Sie könnten also eigentlich wollen zu zählen größer als die. 747 00:35:00,410 --> 00:35:05,640 Eine lange long-- dumm named-- Auch acht Bytes oder 64 Bits, 748 00:35:05,640 --> 00:35:10,260 und das ist doppelt so lang wie ein int, und es ist für eine lange Ganzzahl. 749 00:35:10,260 --> 00:35:15,655 >> Spaß fact-- wenn ein int vier Bytes, wie lange ist eine lange in der Regel C? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 Auch vier Bytes, aber lange lange ist acht Byte, 752 00:35:21,560 --> 00:35:23,050 und das ist aus historischen Gründen. 753 00:35:23,050 --> 00:35:26,450 >> Aber die jetzt zum Mitnehmen ist nur, dass Daten 754 00:35:26,450 --> 00:35:29,625 in einem computer-- das ist, dargestellt werden ein physisches Gerät mit Strom, 755 00:35:29,625 --> 00:35:32,190 es ist in der Regel Fahr diese Nullen und ones-- 756 00:35:32,190 --> 00:35:34,320 mit begrenzter Mengen an Präzision. 757 00:35:34,320 --> 00:35:35,620 Also, was ist das Problem? 758 00:35:35,620 --> 00:35:37,480 >> Nun gibt es ein Problem von Integer-Überlauf. 759 00:35:37,480 --> 00:35:39,780 Nicht nur in C, sondern in Computer im Allgemeinen. 760 00:35:39,780 --> 00:35:42,590 Zum Beispiel, wenn diese ist ein Byte im Wert bit-- 761 00:35:42,590 --> 00:35:45,120 so, wenn dies acht bit-- alle von denen sind die Nummer eins. 762 00:35:45,120 --> 00:35:47,300 Was diese Nummer darstellt, wenn wir annehmen, 763 00:35:47,300 --> 00:35:50,730 es ist alles positive Werte in binärer? 764 00:35:50,730 --> 00:35:54,410 >> 255, und es ist nicht 256, weil Null ist der niedrigste Zahl. 765 00:35:54,410 --> 00:35:56,760 So 255 ist die höchste , aber das Problem 766 00:35:56,760 --> 00:36:00,330 ist wohl, dass ich es wollte erhöhen diese Variable, 767 00:36:00,330 --> 00:36:04,030 wird mit insgesamt acht Bits wenn ich es zu erhöhen. 768 00:36:04,030 --> 00:36:07,160 >> Nun, sobald ich eine einem auf alle diese diejenigen, 769 00:36:07,160 --> 00:36:10,500 Sie können sich wohl vorstellen, nur visually-- wie die Durchführung einer mit decimals-- 770 00:36:10,500 --> 00:36:12,300 etwas los ist, nach links fließen. 771 00:36:12,300 --> 00:36:15,590 Und in der Tat, wenn ich die Nummer hinzufügen man dies, was passiert, in binärer 772 00:36:15,590 --> 00:36:17,670 ist, dass es wieder auf Null überläuft. 773 00:36:17,670 --> 00:36:21,730 >> Also, wenn Sie nur nicht use-- einen int, aber ein einziges Byte auf ganze Zahlen zählen 774 00:36:21,730 --> 00:36:27,170 in einem Programm, das von default-- sobald Sie bekommen 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 kommt nach 255, das ist wahrscheinlich nicht das, was 776 00:36:32,710 --> 00:36:34,790 ein Benutzer sowieso zufrieden. 777 00:36:34,790 --> 00:36:39,620 >> Jetzt mittlerweile in Gleitkomma-Welt, Sie haben auch ein ähnliches Problem. 778 00:36:39,620 --> 00:36:42,670 Nicht so sehr mit der größten number-- aber das ist immer noch ein Thema. 779 00:36:42,670 --> 00:36:45,360 Aber mit der Menge an Fein dass Sie darstellen kann. 780 00:36:45,360 --> 00:36:49,490 Werfen wir also einen Blick auf dieses Beispiel hier auch aus heutiger Quelle code-- 781 00:36:49,490 --> 00:36:52,070 float-0.c. 782 00:36:52,070 --> 00:36:54,280 >> Und bemerken, dass es ein super einfaches Programm, das 783 00:36:54,280 --> 00:36:56,580 sollten offenbar ausdrucken, was Wert? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 Was wollen Sie wetten, das wird gedruckt auch wenn es ein bisschen neue Syntax 786 00:37:04,110 --> 00:37:05,540 hier? 787 00:37:05,540 --> 00:37:06,700 So hoffentlich 0.1. 788 00:37:06,700 --> 00:37:10,000 So entspricht einem Zehntel denn ich tue 1 geteilt durch 10. 789 00:37:10,000 --> 00:37:12,430 Ich Speichern der Antwort in einer Variablen namens f. 790 00:37:12,430 --> 00:37:15,850 Diese Variable ist vom Typ Float, der ist ein Schlüsselwort, Ich habe gerade vorgeschlagen existierte. 791 00:37:15,850 --> 00:37:18,910 >> Wir haben das nicht gesehen, aber Dies ist eine Art nette Art und Weise in printf 792 00:37:18,910 --> 00:37:22,110 um wie viele Stellen geben Sie wollen, um nach einem Komma sehen. 793 00:37:22,110 --> 00:37:25,020 Also diese Notation bedeutet nur, dass hier ist ein Platzhalter. 794 00:37:25,020 --> 00:37:27,900 Es ist für eine Floating-Point- Wert, und oh, übrigens, 795 00:37:27,900 --> 00:37:31,389 zeigen Sie sie mit dem Komma mit eine Zahl nach dem Komma. 796 00:37:31,389 --> 00:37:33,180 Also das ist die Anzahl der signifikanten Stellen, 797 00:37:33,180 --> 00:37:34,650 so zu sprechen, dass Sie vielleicht. 798 00:37:34,650 --> 00:37:40,450 >> Also lassen Sie mich gehen Sie vor und tun Schwimmer machen-0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 und anscheinend 1 geteilt durch 10 ist 0,0. 800 00:37:46,660 --> 00:37:47,760 Nun, warum ist das? 801 00:37:47,760 --> 00:37:51,380 >> Wieder gut, ist der Computer unter mich buchstäblich, und ich habe 1 geschrieben 802 00:37:51,380 --> 00:37:56,680 und ich geschrieben 10, und nehmen Sie eine Vermutung, was die angenommene Datentyp für diese beiden 803 00:37:56,680 --> 00:37:58,440 Werte? 804 00:37:58,440 --> 00:38:00,970 Int, ist es technisch etwas ein wenig anders. 805 00:38:00,970 --> 00:38:04,150 Es ist typischerweise eine lange, aber es ist letztlich ein wesentlicher Wert. 806 00:38:04,150 --> 00:38:06,030 Nicht eine Fließkommazahl. 807 00:38:06,030 --> 00:38:09,456 >> Welches ist zu sagen, dass wenn diese ist ein int und das ist ein int, 808 00:38:09,456 --> 00:38:11,830 Das Problem ist, dass der Computer nicht die Fähigkeit haben 809 00:38:11,830 --> 00:38:13,680 noch zu speichern, dass Komma. 810 00:38:13,680 --> 00:38:16,430 Also, wenn Sie tun, 1 geteilt 10 mit ganzen Zahlen 811 00:38:16,430 --> 00:38:20,950 sowohl für den Zähler und Nenner, sollte die Antwort 0,1. 812 00:38:20,950 --> 00:38:24,930 Aber die computer-- weil das sind integers-- 813 00:38:24,930 --> 00:38:27,430 nicht weiß, was mit dem 0,1 zu tun. 814 00:38:27,430 --> 00:38:30,010 >> Also was ist es klar machen? 815 00:38:30,010 --> 00:38:33,120 Es ist einfach zu werfen es weg, und was ich letztendlich sehen 816 00:38:33,120 --> 00:38:38,830 ist 0,0, nur weil ich darauf bestanden, dass printf zeigen Sie mir eine Dezimalstelle. 817 00:38:38,830 --> 00:38:41,740 Aber das Problem ist, dass, wenn Sie teilen eine ganze Zahl durch eine ganze Zahl, 818 00:38:41,740 --> 00:38:44,347 Sie werden per Definition get-- von c-- eine ganze Zahl. 819 00:38:44,347 --> 00:38:46,680 Und es wird nicht zu tun etwas schön und bequem 820 00:38:46,680 --> 00:38:49,040 wie um sie herum bis zu der nächste ein oben oder unten. 821 00:38:49,040 --> 00:38:51,860 Es wird abgeschnitten alles nach dem Komma. 822 00:38:51,860 --> 00:38:54,030 >> Also einfach intuitiv, was ist wohl eine Lösung? 823 00:38:54,030 --> 00:38:55,351 Was ist der einfachste Fix hier? 824 00:38:55,351 --> 00:38:55,850 Ja? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Genau. 827 00:39:01,100 --> 00:39:04,200 Warum wir nicht einfach behandeln, diese als effektiv Fließkommawerte 828 00:39:04,200 --> 00:39:05,860 indem er sie in Schwimmern oder Doppelzimmer. 829 00:39:05,860 --> 00:39:10,500 Und jetzt, wenn ich machen Schwimmer-0, oder wenn ich Schwimmer-1 zu kompilieren, 830 00:39:10,500 --> 00:39:12,570 Das ist identisch mit was gerade vorgeschlagen. 831 00:39:12,570 --> 00:39:16,400 Und jetzt habe ich zu tun Schwimmer-0, jetzt bekomme ich mein 0.1. 832 00:39:16,400 --> 00:39:17,234 >> Nun, das ist erstaunlich. 833 00:39:17,234 --> 00:39:19,441 Aber jetzt gehe ich zu tun etwas ein wenig anders. 834 00:39:19,441 --> 00:39:22,280 Ich bin neugierig zu sehen, was wirklich geht unter der Haube, 835 00:39:22,280 --> 00:39:26,050 und ich werde diesen Druck out bis 28 Nachkommastellen. 836 00:39:26,050 --> 00:39:29,730 Ich möchte wirklich sehen, 0.1000-- ein infinite-- 837 00:39:29,730 --> 00:39:32,710 [Unverständlich] 27 Nullen nach diesem 0.1. 838 00:39:32,710 --> 00:39:34,740 >> Na mal sehen, ob das was ich in der Tat zu bekommen. 839 00:39:34,740 --> 00:39:39,430 Schwimmer machen-0 gleiche Datei. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Lassen Sie uns Zoom auf die dramatische Antwort. 842 00:39:44,380 --> 00:39:49,980 Die ganze Zeit, die Sie habe darüber nachgedacht 1 geteilt durch 10 ist, 10% oder 0,1. 843 00:39:49,980 --> 00:39:50,810 Es ist nicht. 844 00:39:50,810 --> 00:39:53,210 Wenigstens soweit die Computer besorgt. 845 00:39:53,210 --> 00:39:57,060 >> Jetzt why-- OK, das komplette Lüge 1 geteilt durch 10 ist 0,1. 846 00:39:57,060 --> 00:39:59,710 Aber das ist nicht why-- das Mitnehmen heute. 847 00:39:59,710 --> 00:40:04,010 Also warum der Computer denken, anders als alle von uns auf dem Zimmer, 848 00:40:04,010 --> 00:40:06,870 dass 1 geteilt durch 10 ist eigentlich, dass verrückt Wert? 849 00:40:06,870 --> 00:40:10,620 Was ist der Computer, der offenbar? 850 00:40:10,620 --> 00:40:12,490 Was ist das? 851 00:40:12,490 --> 00:40:13,785 >> Es ist nicht überlaufen, an sich. 852 00:40:13,785 --> 00:40:15,910 Überlauf ist in der Regel, wenn Sie wickeln um einen Wert. 853 00:40:15,910 --> 00:40:18,970 Es ist diese Frage der Ungenauigkeit in einen Fließkommawert 854 00:40:18,970 --> 00:40:22,220 wo Sie nur 32 oder vielleicht sogar 64 Bit. 855 00:40:22,220 --> 00:40:25,230 Aber wenn es eine unendliche Anzahl der realen numbers-- 856 00:40:25,230 --> 00:40:27,940 Zahlen mit Dezimalstellen und Zahlen thereafter-- sicher 857 00:40:27,940 --> 00:40:29,380 Sie repräsentieren können alle von ihnen. 858 00:40:29,380 --> 00:40:32,870 So dass der Computer gegeben hat, uns die nächste Übereinstimmung 859 00:40:32,870 --> 00:40:37,090 auf den Wert darstellen kann mit, dass viele Bits auf den Wert Eigentlich möchte ich, 860 00:40:37,090 --> 00:40:38,690 das ist 0,1. 861 00:40:38,690 --> 00:40:40,685 >> Leider, wenn Sie Mathematik zu tun beginnen, oder Sie 862 00:40:40,685 --> 00:40:44,360 beginnen mit dieser Art von schwimmenden Punktwerte in wichtigen programs-- 863 00:40:44,360 --> 00:40:46,770 Finanz-Software, Militär software-- nichts 864 00:40:46,770 --> 00:40:49,090 wo Wahrnehmung ist wahrscheinlich ziemlich wichtig. 865 00:40:49,090 --> 00:40:51,520 Und Sie beginnen Zugabe Zahlen wie diese, und Anfang 866 00:40:51,520 --> 00:40:54,050 diese Software ausgeführt mit wirklich großen Eingänge 867 00:40:54,050 --> 00:40:56,890 oder für viele Stunden oder Lose Tage oder viele Jahre, 868 00:40:56,890 --> 00:41:01,060 Diese winzig kleinen Fehler sicher können im Laufe der Zeit hinzu. 869 00:41:01,060 --> 00:41:04,252 >> Jetzt als beiseite, wenn Sie jemals gesehen Superman 3 oder Office Space 870 00:41:04,252 --> 00:41:05,960 und Sie sich vielleicht erinnern wie diese Jungs gestohlen 871 00:41:05,960 --> 00:41:08,668 eine Menge Geld von ihrem Computer durch die Verwendung Fließkommawerte 872 00:41:08,668 --> 00:41:11,290 und Addition der kleinen Reste, hoffentlich, dass Film 873 00:41:11,290 --> 00:41:12,390 jetzt mehr Sinn macht. 874 00:41:12,390 --> 00:41:14,930 Dies ist, was sie in Anspielung auf in diesem Film. 875 00:41:14,930 --> 00:41:16,710 Die Tatsache, dass die meisten Unternehmen, die nicht aussehen würde 876 00:41:16,710 --> 00:41:18,600 nach einer bestimmten Anzahl der Nachkommastellen, 877 00:41:18,600 --> 00:41:20,009 aber das sind Bruchteile von Cent. 878 00:41:20,009 --> 00:41:22,550 So können Sie damit beginnen, sie auf, Sie beginnen, eine Menge Geld zu machen 879 00:41:22,550 --> 00:41:23,424 in Ihr Bankkonto. 880 00:41:23,424 --> 00:41:25,160 Also das ist Office Space erläutert. 881 00:41:25,160 --> 00:41:28,220 >> Jetzt leider über Office Space, gibt 882 00:41:28,220 --> 00:41:31,794 sind einige beunruhigende rechtmäßig und erhebliche Auswirkungen 883 00:41:31,794 --> 00:41:33,710 Diese Arten von zugrunde liegenden Design-Entscheidungen, 884 00:41:33,710 --> 00:41:35,990 und in der Tat einer der Gründe wir verwenden C im Verlauf 885 00:41:35,990 --> 00:41:39,640 ist, so dass Sie wirklich diesen Boden haben bis zu verstehen, wie Computer funktionieren, 886 00:41:39,640 --> 00:41:42,440 wie die Software funktioniert und nicht nehmen nichts für selbstverständlich. 887 00:41:42,440 --> 00:41:45,820 >> Und in der Tat leider, auch mit dass grundlegende Verständnis, 888 00:41:45,820 --> 00:41:47,370 wir Menschen machen Fehler. 889 00:41:47,370 --> 00:41:51,310 Und was ich dachte, ich würde zu teilen, ist Das achtminütige Video hier genommen 890 00:41:51,310 --> 00:41:56,980 von einem Modern Marvels Episode, die ist eine pädagogische Show auf, wie Dinge funktionieren 891 00:41:56,980 --> 00:42:00,370 dass zwei Bilder malt der, wenn eine missbräuchliche Verwendung 892 00:42:00,370 --> 00:42:02,540 und das Verständnis der Fließkommawerte 893 00:42:02,540 --> 00:42:05,610 führte zu einigen signifikanten unglücklichen Ergebnissen. 894 00:42:05,610 --> 00:42:06,363 Lassen Sie uns einen Blick. 895 00:42:06,363 --> 00:42:07,029 [VIDEO PLAYBACK] 896 00:42:07,029 --> 00:42:11,290 -Wir Nun "Engineering zurück Katastrophen "auf Modern Marvels. 897 00:42:11,290 --> 00:42:12,940 Computern. 898 00:42:12,940 --> 00:42:15,580 Wir haben alle gekommen, um das zu akzeptieren oft frustrierend Probleme, die 899 00:42:15,580 --> 00:42:20,960 bekam mit them-- Bugs, Viren und Software glitches-- zu kleinen Preisen 900 00:42:20,960 --> 00:42:23,100 für die Bequemlichkeit zu zahlen. 901 00:42:23,100 --> 00:42:27,770 Aber in High-Tech-und High-Speed Militär-und Raumfahrtprogramm Anwendungen, 902 00:42:27,770 --> 00:42:32,780 das kleinste Problem kann in die Katastrophe vergrößert werden. 903 00:42:32,780 --> 00:42:38,880 >> Am 4. Juni 1996 vorbereitet Wissenschaftler um eine unbemannte Rakete Ariane 5 starten. 904 00:42:38,880 --> 00:42:41,190 Es wurde die Durchführung wissenschaftlicher Satelliten 905 00:42:41,190 --> 00:42:44,570 genau, wie das zu schaffen Magnetfeld der Erde in Wechselwirkung 906 00:42:44,570 --> 00:42:47,380 mit Sonnenwinde. 907 00:42:47,380 --> 00:42:50,580 Die Rakete gebaut wurde der Europäischen Weltraumorganisation, 908 00:42:50,580 --> 00:42:54,400 und sich von seinem Standort gehoben an der Küste von Französisch-Guayana. 909 00:42:54,400 --> 00:42:57,520 >> -at Etwa 37 Sekunden in der Flug, sie zum ersten Mal 910 00:42:57,520 --> 00:42:59,070 bemerkte etwas falsch lief. 911 00:42:59,070 --> 00:43:02,240 Daß die Düsen schwenkbar in einer Art, wie sie sollten wirklich nicht. 912 00:43:02,240 --> 00:43:06,550 Rund 40 Sekunden in die Flucht, klar das Fahrzeug war in Schwierigkeiten, 913 00:43:06,550 --> 00:43:08,820 und das ist, wenn sie gemacht Die Entscheidung, es zu zerstören. 914 00:43:08,820 --> 00:43:12,370 Der Bereich Sicherheitsbeauftragten, mit enormen Mut, drückte auf den Knopf 915 00:43:12,370 --> 00:43:18,030 und sprengten die Rakete, bevor es zu einer Gefahr für die öffentliche Sicherheit. 916 00:43:18,030 --> 00:43:21,010 >> Dies war das Mädchen Reise der Ariane 5, 917 00:43:21,010 --> 00:43:23,920 und seine Zerstörung nahm Platz, weil der Fehler 918 00:43:23,920 --> 00:43:25,932 in der Software der Rakete eingebettet. 919 00:43:25,932 --> 00:43:27,640 -Der Problem auf der Ariane war, dass es 920 00:43:27,640 --> 00:43:30,500 war eine Zahl, die erforderlich ist 64 Bit, um auszudrücken, 921 00:43:30,500 --> 00:43:33,560 und sie umtauschen wollte es zu einer 16-Bit-Zahl. 922 00:43:33,560 --> 00:43:36,820 Sie gingen davon aus, dass die Zahl war nie sehr groß zu sein. 923 00:43:36,820 --> 00:43:40,940 Dass die meisten dieser Stellen in die 64-Bit-Zahl waren Nullen. 924 00:43:40,940 --> 00:43:42,450 Sie waren falsch. 925 00:43:42,450 --> 00:43:45,000 >> -Der Unfähigkeit eines Softwareprogramm zu akzeptieren, 926 00:43:45,000 --> 00:43:49,460 die Art der Zahl, erzeugt durch ein anderer war an der Wurzel des Fehlers. 927 00:43:49,460 --> 00:43:54,260 Software-Entwicklung hatte sich zu einem sehr kostspielig Teil der neuen Technologie. 928 00:43:54,260 --> 00:43:57,060 Die Ariane-4-Rakete hatte sehr erfolgreich. 929 00:43:57,060 --> 00:44:01,600 So viel von der Software erstellt Es wurde auch in der Ariane 5 verwendet. 930 00:44:01,600 --> 00:44:04,790 >> -Der Grundproblem das war die Ariane-5. 931 00:44:04,790 --> 00:44:11,200 Wurde faster-- schneller beschleunigt und die Software nicht für die bilanziert. 932 00:44:11,200 --> 00:44:14,910 >> -Der Zerstörung der Rakete war eine enorme finanzielle Katastrophe. 933 00:44:14,910 --> 00:44:18,630 Alle aufgrund eines Software-Fehlers Minute. 934 00:44:18,630 --> 00:44:21,160 Aber das war nicht das erste Zeitdatenkonvertierungsprobleme 935 00:44:21,160 --> 00:44:24,770 hatte modernen Raketentechnik geplagt. 936 00:44:24,770 --> 00:44:28,020 >> -In 1991 mit dem Start des ersten Golfkriegs, 937 00:44:28,020 --> 00:44:30,540 der Patriot-Raketen erlebt eine ähnliche Art 938 00:44:30,540 --> 00:44:32,465 einer Reihe Konvertierungsproblem. 939 00:44:32,465 --> 00:44:36,760 Und als Ergebnis 28 people-- 28 Amerikanischen soldiers-- wurden getötet, 940 00:44:36,760 --> 00:44:39,010 und etwa hundert weitere verletzt. 941 00:44:39,010 --> 00:44:42,830 Wenn der Patriot, der angeblich gegen eingehend Scud-Raketen zu schützen, 942 00:44:42,830 --> 00:44:45,780 konnte eine Rakete abzufeuern. 943 00:44:45,780 --> 00:44:51,610 >> -Wenn Irak in Kuwait einmarschierte und Amerika Desert Storm gestartet Anfang 1991, 944 00:44:51,610 --> 00:44:55,720 Patriot Raketen-Batterien eingesetzt wurden zum Schutz Saudi-Arabien und Israel 945 00:44:55,720 --> 00:44:59,180 von irakischen Scud-Raketenangriffen. 946 00:44:59,180 --> 00:45:03,080 Der Patriot ist ein US-Mittelstrecken Boden-Luft-System 947 00:45:03,080 --> 00:45:06,530 von der Raytheon Company. 948 00:45:06,530 --> 00:45:09,500 >> -Der Größe des Patriot Abfangjäger itself-- 949 00:45:09,500 --> 00:45:14,705 es geht um rund 20 Meter lang, und es wiegt etwa 2000 Pfund. 950 00:45:14,705 --> 00:45:19,090 Und es trägt einen Sprengkopf von etwa, Ich denke, es ist rund 150 Pfund. 951 00:45:19,090 --> 00:45:23,880 Und der Gefechtskopf selbst ist eine hochexplosive, die 952 00:45:23,880 --> 00:45:26,700 Fragmente hat um ihn herum. 953 00:45:26,700 --> 00:45:31,630 So daß die Hülle des Gefechtskopfes ist ausgelegt, wie ein Schrotkugeln handeln. 954 00:45:31,630 --> 00:45:34,040 >> -Die Raketen durchgeführt werden vier pro Container, 955 00:45:34,040 --> 00:45:37,170 und von einem Sattelauflieger transportiert. 956 00:45:37,170 --> 00:45:44,880 >> -Der Patriot-Raketenabwehrsystem geht mindestens 20 Jahren. 957 00:45:44,880 --> 00:45:48,380 Es wurde ursprünglich entwickelt, als Luftabwehrraketen 958 00:45:48,380 --> 00:45:50,810 zu schießen Sie feindliche Flugzeuge. 959 00:45:50,810 --> 00:45:54,410 Im ersten Golfkrieg wenn dieser Krieg kam auf, 960 00:45:54,410 --> 00:45:59,650 die Armee wollte es benutzen Scud-Raketen abzuschießen, keine Flugzeuge. 961 00:45:59,650 --> 00:46:03,580 Die irakische Luftwaffe nicht so sehr ein Problem, 962 00:46:03,580 --> 00:46:06,590 aber die Armee über Scud-Raketen besorgt. 963 00:46:06,590 --> 00:46:10,120 Und so versuchten sie, Upgrade der Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting Einen Feind Raketen Reisen mit Mach 5 965 00:46:12,740 --> 00:46:15,670 sein würde genug Herausforderung. 966 00:46:15,670 --> 00:46:18,440 Aber wenn der Patriot wurde in Dienst stürzte, 967 00:46:18,440 --> 00:46:22,580 Die Armee war nicht bewusst ein irakischer Abänderung, daß 968 00:46:22,580 --> 00:46:25,880 machten ihre fast scuds nicht zu. 969 00:46:25,880 --> 00:46:30,690 >> Was ist passiert ist, dass die Scud-Raketen kamen in instabil waren. 970 00:46:30,690 --> 00:46:32,000 Sie waren wackelig. 971 00:46:32,000 --> 00:46:37,210 Der Grund dafür war die Iraqis-- um 600 Kilometer raus 972 00:46:37,210 --> 00:46:41,680 von einem 300-Kilometer-Bereich missile-- nahm Gewicht aus der vorderen Gefechtskopf, 973 00:46:41,680 --> 00:46:43,340 und aus der Gefechtskopf leichter. 974 00:46:43,340 --> 00:46:48,490 So, jetzt die Patrioten versuchen zu kommen am Jagen, und die meisten der Zeit-- 975 00:46:48,490 --> 00:46:52,880 die überwiegende Mehrheit der Zeit-- es wäre nur fliegen durch die Scud. 976 00:46:52,880 --> 00:46:57,120 >> -once Den Patriot Netzbetreiber realisiert der Patriot sein Ziel verfehlt, 977 00:46:57,120 --> 00:47:01,630 sie den Sprengkopf detoniert Patriot , um mögliche Verluste zu vermeiden, wenn es 978 00:47:01,630 --> 00:47:04,440 wurde auf den Boden fallen. 979 00:47:04,440 --> 00:47:08,700 >> -Das War, was die meisten Leute sahen, so groß Feuerbälle in den Himmel, 980 00:47:08,700 --> 00:47:14,180 und als missverstanden Abschnitte mit Scud-Sprengköpfe. 981 00:47:14,180 --> 00:47:18,020 >> -Obwohl In den Nachthimmel, Patrioten zu sein schien erfolgreich zu zerstören 982 00:47:18,020 --> 00:47:23,280 Scud-Raketen, bei Dhahran könnte es keinen Fehler über seine Leistung. 983 00:47:23,280 --> 00:47:27,930 Dort werden die Patriot-Radarsystem verlor einer eingehenden Scud 984 00:47:27,930 --> 00:47:30,260 und nie aufgrund gestartet zu einem Software-Fehler. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Es waren die Israelis, die zum ersten Mal entdeckt dass je länger das System eingeschaltet war, 987 00:47:38,880 --> 00:47:41,130 desto größer ist der Zeitunterschied wurde. 988 00:47:41,130 --> 00:47:44,770 Aufgrund eines Takt eingebettet in dem Computer des Systems. 989 00:47:44,770 --> 00:47:48,190 >> -Über Zwei Wochen vor Die Tragödie in Dhahran, 990 00:47:48,190 --> 00:47:50,720 die Israelis berichtet, das Verteidigungsministerium 991 00:47:50,720 --> 00:47:52,410 dass das System Zeit zu verlieren. 992 00:47:52,410 --> 00:47:54,410 Nach etwa acht Stunden Laufen, bemerkten sie 993 00:47:54,410 --> 00:47:57,690 dass das System immer merklich weniger genau. 994 00:47:57,690 --> 00:48:01,850 Das Verteidigungsministerium reagierte mit sagen alle der Patriot-Batterien 995 00:48:01,850 --> 00:48:04,800 die Systeme nicht verlassen für eine lange Zeit. 996 00:48:04,800 --> 00:48:06,980 Sie sagten nie, was eine lange Zeit war. 997 00:48:06,980 --> 00:48:09,140 8 Stunden 10 Stunden, mehr als tausend Stunden. 998 00:48:09,140 --> 00:48:11,300 Niemand wusste. 999 00:48:11,300 --> 00:48:13,320 >> -Der Patriot-Batterie in der Kaserne stationiert 1000 00:48:13,320 --> 00:48:18,310 bei Dhahran und seine fehlerhaften internen Uhr befand sich in der über 100 Stunden gewesen 1001 00:48:18,310 --> 00:48:21,520 In der Nacht des 25. Februar. 1002 00:48:21,520 --> 00:48:25,792 >> -Es Verfolgt Zeit mit einer Genauigkeit von etwa einem Zehntel einer Sekunde. 1003 00:48:25,792 --> 00:48:27,950 Nun wird ein Zehntel einer Sekunde ist eine interessante Zahl 1004 00:48:27,950 --> 00:48:31,850 weil es nicht ausgedrückt werden können, in binärer genau, was 1005 00:48:31,850 --> 00:48:36,500 bedeutet, es kann nicht genau angegeben werden in jedem modernen digitalen Computers. 1006 00:48:36,500 --> 00:48:41,070 Es ist schwer zu glauben, aber dies als ein Beispiel. 1007 00:48:41,070 --> 00:48:43,420 >> Nehmen wir die Zahl ein Drittel. 1008 00:48:43,420 --> 00:48:47,330 Ein Drittel kann nicht sein, in dezimal ausgedrückt genau. 1009 00:48:47,330 --> 00:48:52,060 Ein Drittel ist 0,333 geht für die Unendlichkeit. 1010 00:48:52,060 --> 00:48:56,420 Es gibt keinen Weg, das zu tun, mit absolute Genauigkeit in eine Dezimalzahl. 1011 00:48:56,420 --> 00:48:59,530 Das ist genau die Art von Problem, das geschah in der Patriot. 1012 00:48:59,530 --> 00:49:04,040 Je länger das System lief, die schlechter die Zeitfehler wurde. 1013 00:49:04,040 --> 00:49:08,840 >> -after 100 Betriebsstunden, die Fehler in Zeit nur etwa ein Drittel 1014 00:49:08,840 --> 00:49:10,440 einer Sekunde. 1015 00:49:10,440 --> 00:49:14,150 Aber in Bezug auf Targeting ein Raketen Reisen bei Mach 5, 1016 00:49:14,150 --> 00:49:18,560 es ergab sich ein Tracking Fehler von mehr als 600 Metern. 1017 00:49:18,560 --> 00:49:21,870 Es wäre ein fataler Fehler sein für die Soldaten in Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> Was ist passiert wird eine Scud Start war von Frühwarnsatelliten entdeckt, 1019 00:49:28,455 --> 00:49:32,710 und sie wussten, dass eine Scud kam in ihrer allgemeinen Richtung. 1020 00:49:32,710 --> 00:49:35,150 Sie wussten nicht, wo es kam. 1021 00:49:35,150 --> 00:49:38,210 Es war nun an der Radar Bestandteil des Patriot-System 1022 00:49:38,210 --> 00:49:43,150 Verteidigung Dhahran zu finden und zu halten Spur der ankommenden feindlichen Rakete. 1023 00:49:43,150 --> 00:49:44,561 >> -Der Radar war sehr smart. 1024 00:49:44,561 --> 00:49:46,560 Es wäre tatsächlich verfolgen die Position der Scud 1025 00:49:46,560 --> 00:49:48,930 und dann vorhersagen, wo es wohl wäre, 1026 00:49:48,930 --> 00:49:51,380 das nächste Mal die Radar schickte einen Impuls aus. 1027 00:49:51,380 --> 00:49:53,040 Das war der Range-Gate bezeichnet. 1028 00:49:53,040 --> 00:49:57,620 >> -Dann Einmal Patriot entscheidet genug Zeit hat 1029 00:49:57,620 --> 00:50:02,400 geleitet, um zurück zu gehen und überprüfen Sie die nächsten Lage für dieses Objekt erkannt 1030 00:50:02,400 --> 00:50:03,550 es geht zurück. 1031 00:50:03,550 --> 00:50:07,820 Also, wenn es ging zurück in die falsche Ort, dann sieht kein Objekt. 1032 00:50:07,820 --> 00:50:10,360 Und es entscheidet, dass es kein Objekt. 1033 00:50:10,360 --> 00:50:13,630 , Dass es eine falsche Erfassung und es fällt die Strecke. 1034 00:50:13,630 --> 00:50:16,970 >> -Der Eingehenden Scud verschwunden vom Radarschirm, 1035 00:50:16,970 --> 00:50:20,200 und Sekunden später, schlug in der Kaserne. 1036 00:50:20,200 --> 00:50:22,570 Die Scud getötet 28. 1037 00:50:22,570 --> 00:50:26,110 Es war die letzte gefeuert während des ersten Golfkriegs. 1038 00:50:26,110 --> 00:50:31,920 Tragischerweise der aktualisierten Software in der Morgendämmerung kam am folgenden Tag. 1039 00:50:31,920 --> 00:50:34,870 Die Software Fehler hatte wurde behoben, Schließen 1040 00:50:34,870 --> 00:50:39,150 ein Kapitel in der unruhigen Geschichte des Patriot-Raketen. 1041 00:50:39,150 --> 00:50:40,030 >> [END VIDEO PLAYBACK] 1042 00:50:40,030 --> 00:50:41,488 >> David J. MALAN: Das ist es für CS50. 1043 00:50:41,488 --> 00:50:42,820 Wir werden Sie am Mittwoch sehen. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [Musik zu spielen] 1046 00:50:50,370 --> 00:54:23,446