[Musikwiedergabe] DOUG LLOYD: Alles klar. Art von einem fremden Thema, oder? Magischen Zahlen. Was doe er damit, wenn er reden über magische Zahlen? Nun, einige der Programme dass wir in CS50 geschrieben Bisher haben einige seltsame hatten Zahlen Art in sie geworfen. Vielleicht aus Gründen, die wir nicht tun vollständig verstehen, gerade jetzt. Beispielsweise in der Mario Problem, wir capped die Höhe der Pyramide bei 23. Wir Ihnen ausdrücklich gesagt, kann nicht höher als 23. Aber was bedeutet 23 das? Nun, wenn Sie lesen Sie die spec sorgfältig, Sie gesehen haben könnte, dass die Grund, warum wir es mit einer Kappe bedeckt bei 23 ist, weil der Standardhöhe von einem Terminalfenster ist 24. Und so, wenn wir die Pyramide höher als das sein, könnte es dieses seltsame Sache zu tun wo es läuft aus dem Bildschirm. Und wissen Sie, was macht dass im Zusammenhang bedeuten, nicht wahr? Ist die Bedeutung von 23 sofort ersichtlich zu jemandem, der an Ihr Programm sieht und vielleicht eine andere Größe Terminal-Fenster? Wahrscheinlich nicht. Es scheint so, OK. Nun, warum ist es nur weniger als 23? In der Regel ist es ein bisschen eine schlechte Angewohnheit tatsächlich Konstanten in den Code zu schreiben. Dabei, wenn Sie tatsächlich tun, einen konstant in den Code, es ist manchmal so mit bezeichnet magischen Zahlen, die etwas wir wollen in der Regel, um zu versuchen und zu vermeiden. Zum Beispiel, nehmen wir einen Blick bei dieser einfachen Funktion hier. Offensichtlich gibt es keine Daten Typ in C genannt Karte oder Deck. Also einfach mit mir tragen. Es ist ein bisschen von Pseudocode in hier gemischt. Dies ist eine Funktion, die aufgerufen beschäftigen Karte, die scheinbar dauert ein Deck als Parameter, und Wille Ausgangs mir eine einzelne Karte. Und ich bin hier, wo ich etwas zu tun eine Schleife, die von 0 bis 52 läuft, und ich beschäftigen eine Karte. Nun, wir haben eine magische bekam Anzahl in here, right. Sehen Sie, was die magische Zahl ist? Oder was noch wichtiger ist, sind Sie zu sehen, was das Problem ist hier nicht? Insbesondere dann, wenn diese ist nur eine Funktion in einer eigenen Datei in ein Ordner, enthält eine Reihe von verschiedenen Dateien, von denen jede hat eine andere Sache, um ein Kartenspiel. Vielleicht ist es mischt sie, oder beschäftigt eine Hand aus fünf Karten anstelle einer einzelnen Karte. Sehen Sie, was die Problem könnte hier sein? Haben Sie die magische Zahl zu sehen Ich habe in den Code injiziert? Es ist 52, rechts. Wie intuitiv Sie wahrscheinlich wissen, OK. Wie ein Standard-Deck Karten enthält 52 Karten. Aber in unserem Programm, es ist einfach Art von Umlauf in dort. Es ist wie mit einem Mal gibt es eine 52. Eine Möglichkeit, dies zu beheben Problem ist es, dies zu tun. Wir sind sehr explizit jetzt ruft das Deck Größe wie 52. Sie gibt es ein wenig mehr intuitive was bedeutet, wenn in der for-Schleife Später werden wir dann sagen, ich weniger als Deckgröße. Es scheint nur, besser als zu sagen, 52. Nun ist dies nicht eigentlich das Problem zu beheben. Es geben einige symbolische bedeutet die ständige. Aber es Art von tatsächlich ein anderes Problem eingeführt daß nicht sofort ersichtlich sein könnten. Auch wenn diese Variable wird globally-- erklärt Sie, was es zu erinnern bedeutet, wenn wir erklären, eine Variable global gegenüber lokal? Auch wenn wir eine Variable zu deklarieren global, was, wenn es Eine weitere Funktion in unsere Suite von Funktionen die sich mit Kartenmanipulation dass versehentlich verändert Deck Größe, oder es erhöht sich durch 1 oder verringert sie um 1. Das könnte Ärger buchstabieren, nicht wahr? Vor allem, wenn wir mit einem Satz zu tun Karten, wo das Mischen der Volldeck Wird benötigt. Wenn Deck Größe verringert durch 1, beispielsweise bis 51, wir sind nicht wirklich schlurfenden alle Karten möglich. Wir gehen von ihnen aus. Und dieser Wert könnte vielleicht sein, vorhergesagt, oder durch ein schlechter Schauspieler ausgebeutet. C stellt eine so genannte Präprozessordirektive, die ist auch ein Makro gefragt Erstellen von symbolischen Konstanten. Und in der Tat, schon haben Sie gesehen eine Präprozessordirektive, auch wenn Sie es nicht gehört haben, genannt, dass mit #include. Es ist ein weiteres Beispiel für ein Makro oder Präprozessordirektive. Die Art und Weise symbolische Konstanten zu schaffen, oder geben Sie einen Namen auf einen konstanten so dass es mehr was bedeutet, ist wie folgt. #define, Namen, Ersatz. Wirklich wichtig beiseite hier wirklich schnell. Setzen Sie kein Semikolon am das Ende Ihrer #defines. So ist es #define, Namen, Ersatz. Wenn Ihr Programm kompiliert wird, was tatsächlich passiert ist der Compiler, wenn gehen um durch den Code zu gehen und ersetzen Sie jede Instanz das Wort "Name" mit dem, was Sie legte als Ersatz. In analoger Weise, wenn #include ist eine Art der ähnlich wie das Kopieren und Einfügen, dann ist #define Art ähnlich wie Suchen und Ersetzen, wenn Sie jemals diese Funktion verwendet haben, in ein Textverarbeitungsprogramm, zum Beispiel. So zum Beispiel, wenn I #define PI als 3.14159265, wenn Sie sich besser mathematisch sind geneigte und plötzlich siehe 3.14159265 Flug rund in Ihrem Code, Sie wahrscheinlich wissen, dass es zu pi sprechen. Aber vielleicht können wir es einen geben wenig mehr symbolische Bedeutung. Und wir können sagen, anstatt #define pi als dieser Bissen Nummern dass ich werde nicht zu halten Lesen über und über. Und was wird dann passieren, Kompilierung ist, wenn das Programm zusammengestellt, das erste, was passieren wird ist, wird es durch zu gehen und es wird jedes Mal ersetzen sie sieht Kapital P, Kapital I, es wird buchstäblich ersetzen Sie es mit 3,14 und so weiter, so dass man nicht haben, um es jeden Typ Zeit, während Ihr Programm noch hat die Funktionalität, die Sie erwarten, weil Sie gerade arbeiten mit Manipulations, Multiplikation, Teilung, was es ist, von pi. Sie sind jedoch nicht darauf beschränkt Ersatz für nur Zahlen. Zum Beispiel, ich könnte #define Natürlich als String CS50. In diesem Fall, wenn der Programm kompiliert, #define wird durch das gehen Code, ersetzen Sie jedes Mal, es sieht, "natürlich" mit der Zeichenfolge CS50. Sie werden hier feststellen, auch, dass ich häufig #define alle meine definierten symbolischen Konstanten sozusagen sind immer in Großbuchstaben. Es ist eine Konvention. Es ist nicht erforderlich. Der Grund, warum in der Regel Menschen nutzen Alle Großbuchstaben, wenn sie #defining Nur ist es wirklich klar, dass zu machen, Dieses besondere Element meines Codes ist eine definierte Konstante. Wenn es in Kleinbuchstaben, ist es möglich, dass es könnte mit einem variablen verwechselt werden. Und das ist wahrscheinlich nicht eine gute Sache zu tun. Also diese besondere Lösung viel besser als jedes der vorangegangenen. Wenn ich zum ersten #define Deck Größe 52, dann jetzt meine Verwendung von 52 oder Deck Größe hier ist viel intuitiver und viel sicherer. Sie können eine Konstante nicht manipulieren. Man kann nicht sagen 52 plus plus. Das wird nicht, um es in 53 zu konvertieren. Sie können nicht ändern, 52, etwas. Sie können eine Variable ändern deren Wert 52, , die den ersten fix wir vorher hatten war. Und Sie erhöhen könnte diese Variable auf 53. Aber man kann nicht sagen 52 plus plus und haben, dass plötzlich drehen 52 in 53. 52 ist immer 52. Und damit Sie nicht versehentlich ändern kann Deck Größe hier durch Manipulation es, Eine weitere gute Seite Wirkung dieser ist aber, dass Sie sich bewusst, dass nicht Alle Länder auf der ganzen Welt verwenden ein Kartenspiel von Größe 52? Beispielsweise ist es in wirklich gemeinsame Deutschland, ein Deck von 32 zu verwenden, wo sie Streifen aus einigen der niedrigere Wert Karten. Und in diesem Fall I wollte Port meiner Suite Funktionen, die behandeln Kartenmanipulation nach Deutschland. Ich konnte in der ersten Instanz wir zeigten, zu gehen und zu ersetzen alle Instanzen von 52 in meinem Code mit 32. Aber hier, wenn ich #define Deck Größe als 32 an der Spitze von meinem Code, wenn ich brauche, um es zu ändern, kann ich einfach hingehen und zu ändern, dass eine Sache. Kompilieren Sie meinen Code, und alle ein plötzlicher es durch fortpflanzt. In der Tat können wir Deck ändern Größe auf einen beliebigen Wert wir wollen. Kann ich Sie Interesse an einer Spiel der Liege Size-Pickup? Ich bin Doug Lloyd. Und das ist CS50.