1 00:00:00,000 --> 00:00:02,350 >> [Musikwiedergabe] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Alles klar. 4 00:00:06,360 --> 00:00:07,770 Art von einem fremden Thema, oder? 5 00:00:07,770 --> 00:00:09,050 Magischen Zahlen. 6 00:00:09,050 --> 00:00:12,012 Was doe er damit, wenn er reden über magische Zahlen? 7 00:00:12,012 --> 00:00:14,220 Nun, einige der Programme dass wir in CS50 geschrieben 8 00:00:14,220 --> 00:00:16,660 Bisher haben einige seltsame hatten Zahlen Art in sie geworfen. 9 00:00:16,660 --> 00:00:19,680 Vielleicht aus Gründen, die wir nicht tun vollständig verstehen, gerade jetzt. 10 00:00:19,680 --> 00:00:23,950 Beispielsweise in der Mario Problem, wir capped die Höhe der Pyramide bei 23. 11 00:00:23,950 --> 00:00:26,880 Wir Ihnen ausdrücklich gesagt, kann nicht höher als 23. 12 00:00:26,880 --> 00:00:28,702 >> Aber was bedeutet 23 das? 13 00:00:28,702 --> 00:00:30,410 Nun, wenn Sie lesen Sie die spec sorgfältig, Sie 14 00:00:30,410 --> 00:00:32,493 gesehen haben könnte, dass die Grund, warum wir es mit einer Kappe bedeckt bei 23 15 00:00:32,493 --> 00:00:36,160 ist, weil der Standardhöhe von einem Terminalfenster ist 24. 16 00:00:36,160 --> 00:00:38,860 Und so, wenn wir die Pyramide höher als das sein, 17 00:00:38,860 --> 00:00:41,290 könnte es dieses seltsame Sache zu tun wo es läuft aus dem Bildschirm. 18 00:00:41,290 --> 00:00:45,140 Und wissen Sie, was macht dass im Zusammenhang bedeuten, nicht wahr? 19 00:00:45,140 --> 00:00:48,880 >> Ist die Bedeutung von 23 sofort ersichtlich zu jemandem, der an Ihr Programm sieht 20 00:00:48,880 --> 00:00:51,550 und vielleicht eine andere Größe Terminal-Fenster? 21 00:00:51,550 --> 00:00:52,330 Wahrscheinlich nicht. 22 00:00:52,330 --> 00:00:53,080 Es scheint so, OK. 23 00:00:53,080 --> 00:00:55,005 Nun, warum ist es nur weniger als 23? 24 00:00:55,005 --> 00:00:56,880 In der Regel ist es ein bisschen eine schlechte Angewohnheit tatsächlich 25 00:00:56,880 --> 00:00:58,940 Konstanten in den Code zu schreiben. 26 00:00:58,940 --> 00:01:02,190 Dabei, wenn Sie tatsächlich tun, einen konstant in den Code, 27 00:01:02,190 --> 00:01:05,630 es ist manchmal so mit bezeichnet magischen Zahlen, die etwas 28 00:01:05,630 --> 00:01:08,030 wir wollen in der Regel, um zu versuchen und zu vermeiden. 29 00:01:08,030 --> 00:01:12,830 >> Zum Beispiel, nehmen wir einen Blick bei dieser einfachen Funktion hier. 30 00:01:12,830 --> 00:01:15,726 Offensichtlich gibt es keine Daten Typ in C genannt Karte oder Deck. 31 00:01:15,726 --> 00:01:16,600 Also einfach mit mir tragen. 32 00:01:16,600 --> 00:01:18,910 Es ist ein bisschen von Pseudocode in hier gemischt. 33 00:01:18,910 --> 00:01:21,050 Dies ist eine Funktion, die aufgerufen beschäftigen Karte, die scheinbar 34 00:01:21,050 --> 00:01:26,570 dauert ein Deck als Parameter, und Wille Ausgangs mir eine einzelne Karte. 35 00:01:26,570 --> 00:01:30,990 >> Und ich bin hier, wo ich etwas zu tun eine Schleife, die von 0 bis 52 läuft, 36 00:01:30,990 --> 00:01:33,394 und ich beschäftigen eine Karte. 37 00:01:33,394 --> 00:01:35,310 Nun, wir haben eine magische bekam Anzahl in here, right. 38 00:01:35,310 --> 00:01:38,790 Sehen Sie, was die magische Zahl ist? 39 00:01:38,790 --> 00:01:42,280 Oder was noch wichtiger ist, sind Sie zu sehen, was das Problem ist hier nicht? 40 00:01:42,280 --> 00:01:44,310 Insbesondere dann, wenn diese ist nur eine Funktion 41 00:01:44,310 --> 00:01:48,030 in einer eigenen Datei in ein Ordner, enthält 42 00:01:48,030 --> 00:01:49,970 eine Reihe von verschiedenen Dateien, von denen jede 43 00:01:49,970 --> 00:01:51,670 hat eine andere Sache, um ein Kartenspiel. 44 00:01:51,670 --> 00:01:57,310 Vielleicht ist es mischt sie, oder beschäftigt eine Hand aus fünf Karten anstelle einer einzelnen Karte. 45 00:01:57,310 --> 00:01:59,420 >> Sehen Sie, was die Problem könnte hier sein? 46 00:01:59,420 --> 00:02:03,220 Haben Sie die magische Zahl zu sehen Ich habe in den Code injiziert? 47 00:02:03,220 --> 00:02:04,390 Es ist 52, rechts. 48 00:02:04,390 --> 00:02:06,440 >> Wie intuitiv Sie wahrscheinlich wissen, OK. 49 00:02:06,440 --> 00:02:09,740 Wie ein Standard-Deck Karten enthält 52 Karten. 50 00:02:09,740 --> 00:02:12,570 Aber in unserem Programm, es ist einfach Art von Umlauf in dort. 51 00:02:12,570 --> 00:02:15,280 Es ist wie mit einem Mal gibt es eine 52. 52 00:02:15,280 --> 00:02:18,290 >> Eine Möglichkeit, dies zu beheben Problem ist es, dies zu tun. 53 00:02:18,290 --> 00:02:22,724 Wir sind sehr explizit jetzt ruft das Deck Größe wie 52. 54 00:02:22,724 --> 00:02:25,390 Sie gibt es ein wenig mehr intuitive was bedeutet, wenn in der for-Schleife 55 00:02:25,390 --> 00:02:28,650 Später werden wir dann sagen, ich weniger als Deckgröße. 56 00:02:28,650 --> 00:02:32,666 Es scheint nur, besser als zu sagen, 52. 57 00:02:32,666 --> 00:02:34,290 Nun ist dies nicht eigentlich das Problem zu beheben. 58 00:02:34,290 --> 00:02:38,460 Es geben einige symbolische bedeutet die ständige. 59 00:02:38,460 --> 00:02:40,820 Aber es Art von tatsächlich ein anderes Problem eingeführt 60 00:02:40,820 --> 00:02:43,770 daß nicht sofort ersichtlich sein könnten. 61 00:02:43,770 --> 00:02:45,859 Auch wenn diese Variable wird globally-- erklärt 62 00:02:45,859 --> 00:02:47,650 Sie, was es zu erinnern bedeutet, wenn wir erklären, 63 00:02:47,650 --> 00:02:50,500 eine Variable global gegenüber lokal? 64 00:02:50,500 --> 00:02:53,340 Auch wenn wir eine Variable zu deklarieren global, was, wenn es 65 00:02:53,340 --> 00:02:55,500 Eine weitere Funktion in unsere Suite von Funktionen 66 00:02:55,500 --> 00:02:59,750 die sich mit Kartenmanipulation dass versehentlich verändert Deck Größe, 67 00:02:59,750 --> 00:03:02,727 oder es erhöht sich durch 1 oder verringert sie um 1. 68 00:03:02,727 --> 00:03:04,060 Das könnte Ärger buchstabieren, nicht wahr? 69 00:03:04,060 --> 00:03:08,261 Vor allem, wenn wir mit einem Satz zu tun Karten, wo das Mischen der Volldeck 70 00:03:08,261 --> 00:03:08,760 Wird benötigt. 71 00:03:08,760 --> 00:03:12,804 Wenn Deck Größe verringert durch 1, beispielsweise bis 51, 72 00:03:12,804 --> 00:03:14,970 wir sind nicht wirklich schlurfenden alle Karten möglich. 73 00:03:14,970 --> 00:03:16,500 Wir gehen von ihnen aus. 74 00:03:16,500 --> 00:03:21,680 Und dieser Wert könnte vielleicht sein, vorhergesagt, oder durch ein schlechter Schauspieler ausgebeutet. 75 00:03:21,680 --> 00:03:24,920 >> C stellt eine so genannte Präprozessordirektive, die 76 00:03:24,920 --> 00:03:27,764 ist auch ein Makro gefragt Erstellen von symbolischen Konstanten. 77 00:03:27,764 --> 00:03:30,180 Und in der Tat, schon haben Sie gesehen eine Präprozessordirektive, 78 00:03:30,180 --> 00:03:32,916 auch wenn Sie es nicht gehört haben, genannt, dass mit #include. 79 00:03:32,916 --> 00:03:37,150 Es ist ein weiteres Beispiel für ein Makro oder Präprozessordirektive. 80 00:03:37,150 --> 00:03:41,290 >> Die Art und Weise symbolische Konstanten zu schaffen, oder geben Sie einen Namen auf einen konstanten 81 00:03:41,290 --> 00:03:43,740 so dass es mehr was bedeutet, ist wie folgt. 82 00:03:43,740 --> 00:03:47,030 #define, Namen, Ersatz. 83 00:03:47,030 --> 00:03:49,140 Wirklich wichtig beiseite hier wirklich schnell. 84 00:03:49,140 --> 00:03:54,180 Setzen Sie kein Semikolon am das Ende Ihrer #defines. 85 00:03:54,180 --> 00:03:57,310 So ist es #define, Namen, Ersatz. 86 00:03:57,310 --> 00:03:59,540 >> Wenn Ihr Programm kompiliert wird, was tatsächlich passiert 87 00:03:59,540 --> 00:04:01,740 ist der Compiler, wenn gehen um durch den Code zu gehen 88 00:04:01,740 --> 00:04:06,770 und ersetzen Sie jede Instanz das Wort "Name" mit dem, was Sie 89 00:04:06,770 --> 00:04:08,860 legte als Ersatz. 90 00:04:08,860 --> 00:04:13,060 In analoger Weise, wenn #include ist eine Art der ähnlich wie das Kopieren und Einfügen, 91 00:04:13,060 --> 00:04:15,700 dann ist #define Art ähnlich wie Suchen und Ersetzen, 92 00:04:15,700 --> 00:04:19,180 wenn Sie jemals diese Funktion verwendet haben, in ein Textverarbeitungsprogramm, zum Beispiel. 93 00:04:19,180 --> 00:04:26,345 >> So zum Beispiel, wenn I #define PI als 3.14159265, 94 00:04:26,345 --> 00:04:28,720 wenn Sie sich besser mathematisch sind geneigte und plötzlich 95 00:04:28,720 --> 00:04:31,640 siehe 3.14159265 Flug rund in Ihrem Code, 96 00:04:31,640 --> 00:04:33,517 Sie wahrscheinlich wissen, dass es zu pi sprechen. 97 00:04:33,517 --> 00:04:35,850 Aber vielleicht können wir es einen geben wenig mehr symbolische Bedeutung. 98 00:04:35,850 --> 00:04:39,850 Und wir können sagen, anstatt #define pi als dieser Bissen Nummern 99 00:04:39,850 --> 00:04:42,110 dass ich werde nicht zu halten Lesen über und über. 100 00:04:42,110 --> 00:04:45,560 >> Und was wird dann passieren, Kompilierung ist, wenn das Programm 101 00:04:45,560 --> 00:04:48,530 zusammengestellt, das erste, was passieren wird ist, wird es durch zu gehen 102 00:04:48,530 --> 00:04:51,520 und es wird jedes Mal ersetzen sie sieht Kapital P, Kapital I, 103 00:04:51,520 --> 00:04:55,610 es wird buchstäblich ersetzen Sie es mit 3,14 und so weiter, so dass man 104 00:04:55,610 --> 00:04:58,090 nicht haben, um es jeden Typ Zeit, während Ihr Programm noch 105 00:04:58,090 --> 00:05:00,631 hat die Funktionalität, die Sie erwarten, weil Sie gerade arbeiten 106 00:05:00,631 --> 00:05:05,090 mit Manipulations, Multiplikation, Teilung, was es ist, von pi. 107 00:05:05,090 --> 00:05:08,230 >> Sie sind jedoch nicht darauf beschränkt Ersatz für nur Zahlen. 108 00:05:08,230 --> 00:05:12,279 Zum Beispiel, ich könnte #define Natürlich als String CS50. 109 00:05:12,279 --> 00:05:14,070 In diesem Fall, wenn der Programm kompiliert, 110 00:05:14,070 --> 00:05:16,236 #define wird durch das gehen Code, ersetzen Sie jedes Mal, 111 00:05:16,236 --> 00:05:19,900 es sieht, "natürlich" mit der Zeichenfolge CS50. 112 00:05:19,900 --> 00:05:21,720 >> Sie werden hier feststellen, auch, dass ich häufig 113 00:05:21,720 --> 00:05:26,090 #define alle meine definierten symbolischen Konstanten sozusagen 114 00:05:26,090 --> 00:05:28,130 sind immer in Großbuchstaben. 115 00:05:28,130 --> 00:05:28,960 Es ist eine Konvention. 116 00:05:28,960 --> 00:05:30,170 Es ist nicht erforderlich. 117 00:05:30,170 --> 00:05:33,900 Der Grund, warum in der Regel Menschen nutzen Alle Großbuchstaben, wenn sie #defining 118 00:05:33,900 --> 00:05:37,590 Nur ist es wirklich klar, dass zu machen, Dieses besondere Element meines Codes 119 00:05:37,590 --> 00:05:38,820 ist eine definierte Konstante. 120 00:05:38,820 --> 00:05:43,730 Wenn es in Kleinbuchstaben, ist es möglich, dass es könnte mit einem variablen verwechselt werden. 121 00:05:43,730 --> 00:05:46,120 Und das ist wahrscheinlich nicht eine gute Sache zu tun. 122 00:05:46,120 --> 00:05:48,910 >> Also diese besondere Lösung viel besser 123 00:05:48,910 --> 00:05:50,550 als jedes der vorangegangenen. 124 00:05:50,550 --> 00:05:59,950 Wenn ich zum ersten #define Deck Größe 52, dann jetzt meine Verwendung von 52 oder Deck Größe hier 125 00:05:59,950 --> 00:06:01,850 ist viel intuitiver und viel sicherer. 126 00:06:01,850 --> 00:06:03,280 Sie können eine Konstante nicht manipulieren. 127 00:06:03,280 --> 00:06:05,259 Man kann nicht sagen 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 Das wird nicht, um es in 53 zu konvertieren. 129 00:06:06,800 --> 00:06:09,390 Sie können nicht ändern, 52, etwas. 130 00:06:09,390 --> 00:06:12,470 >> Sie können eine Variable ändern deren Wert 52, 131 00:06:12,470 --> 00:06:14,870 , die den ersten fix wir vorher hatten war. 132 00:06:14,870 --> 00:06:17,000 Und Sie erhöhen könnte diese Variable auf 53. 133 00:06:17,000 --> 00:06:21,100 Aber man kann nicht sagen 52 plus plus und haben, dass plötzlich drehen 52 in 53. 134 00:06:21,100 --> 00:06:23,350 52 ist immer 52. 135 00:06:23,350 --> 00:06:28,860 Und damit Sie nicht versehentlich ändern kann Deck Größe hier durch Manipulation es, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Eine weitere gute Seite Wirkung dieser ist aber, 138 00:06:32,390 --> 00:06:38,310 dass Sie sich bewusst, dass nicht Alle Länder auf der ganzen Welt 139 00:06:38,310 --> 00:06:40,690 verwenden ein Kartenspiel von Größe 52? 140 00:06:40,690 --> 00:06:45,630 Beispielsweise ist es in wirklich gemeinsame Deutschland, ein Deck von 32 zu verwenden, 141 00:06:45,630 --> 00:06:48,020 wo sie Streifen aus einigen der niedrigere Wert Karten. 142 00:06:48,020 --> 00:06:50,960 Und in diesem Fall I wollte Port meiner Suite 143 00:06:50,960 --> 00:06:55,390 Funktionen, die behandeln Kartenmanipulation nach Deutschland. 144 00:06:55,390 --> 00:06:59,440 Ich konnte in der ersten Instanz wir zeigten, zu gehen und zu ersetzen 145 00:06:59,440 --> 00:07:03,570 alle Instanzen von 52 in meinem Code mit 32. 146 00:07:03,570 --> 00:07:07,940 >> Aber hier, wenn ich #define Deck Größe als 32 an der Spitze von meinem Code, 147 00:07:07,940 --> 00:07:11,730 wenn ich brauche, um es zu ändern, kann ich einfach hingehen und zu ändern, dass eine Sache. 148 00:07:11,730 --> 00:07:15,010 Kompilieren Sie meinen Code, und alle ein plötzlicher es durch fortpflanzt. 149 00:07:15,010 --> 00:07:18,850 In der Tat können wir Deck ändern Größe auf einen beliebigen Wert wir wollen. 150 00:07:18,850 --> 00:07:22,500 >> Kann ich Sie Interesse an einer Spiel der Liege Size-Pickup? 151 00:07:22,500 --> 00:07:23,430 >> Ich bin Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Und das ist CS50. 153 00:07:25,840 --> 00:07:27,772