1 00:00:00,000 --> 00:00:02,350 >> [MUZYKI] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Wszystko w porządku. 4 00:00:06,360 --> 00:00:07,770 Niby dziwny temat, prawda? 5 00:00:07,770 --> 00:00:09,050 Numery magii. 6 00:00:09,050 --> 00:00:12,012 Co miał na myśli, gdy łania, że ​​jest mówić o magii liczb? 7 00:00:12,012 --> 00:00:14,220 Oraz niektóre programy że mamy napisane w CS50 8 00:00:14,220 --> 00:00:16,660 do tej pory nie miałem jakiś dziwny numery rodzaj rzucone w nich. 9 00:00:16,660 --> 00:00:19,680 Być może ze względu na nie robimy całkowicie rozumiem teraz. 10 00:00:19,680 --> 00:00:23,950 Na przykład, w problemu Mario, że ograniczona wysokość piramidy w 23. 11 00:00:23,950 --> 00:00:26,880 Wyraźnie powiedział ci nie może iść wyżej niż 23. 12 00:00:26,880 --> 00:00:28,702 >> Ale co oznacza 23 oznacza? 13 00:00:28,702 --> 00:00:30,410 Cóż, jeśli czytasz spec, ostrożnie, ci 14 00:00:30,410 --> 00:00:32,493 mógłby zauważyć, że Powodem, że zamknięto go w 23 15 00:00:32,493 --> 00:00:36,160 Jest tak, ponieważ wysokości standardowej w oknie terminala wynosi 24. 16 00:00:36,160 --> 00:00:38,860 I tak, jeśli mamy Piramida być wyższy niż, 17 00:00:38,860 --> 00:00:41,290 może to zrobić, to dziwne rzeczy gdzie spływa z ekranu. 18 00:00:41,290 --> 00:00:45,140 I wiesz, co robi to oznacza, że ​​w kontekście, prawda? 19 00:00:45,140 --> 00:00:48,880 >> Jest sens 23 oczywiste do kogoś, kto patrzy na swojego programu 20 00:00:48,880 --> 00:00:51,550 a może ma inny Rozmiar okno terminalu? 21 00:00:51,550 --> 00:00:52,330 Prawdopodobnie nie. 22 00:00:52,330 --> 00:00:53,080 Wydaje się, że, OK. 23 00:00:53,080 --> 00:00:55,005 A dlaczego jest to tylko mniej niż 23? 24 00:00:55,005 --> 00:00:56,880 Ogólnie rzecz biorąc, jest to swego rodzaju złego nawyku rzeczywistości 25 00:00:56,880 --> 00:00:58,940 napisać stałe w kodzie. 26 00:00:58,940 --> 00:01:02,190 W ten sposób, gdy faktycznie Napisać do stałej do kodu, 27 00:01:02,190 --> 00:01:05,630 Czasami jest dalej za pomocą magiczne liczby, które jest czymś 28 00:01:05,630 --> 00:01:08,030 na ogół chcą spróbować uniknąć. 29 00:01:08,030 --> 00:01:12,830 >> Na przykład, rzućmy okiem w tym prostej funkcji tutaj. 30 00:01:12,830 --> 00:01:15,726 Oczywiście nie ma danych wpisz C o nazwie karty lub taras. 31 00:01:15,726 --> 00:01:16,600 Więc po prostu pokrywa się ze mną. 32 00:01:16,600 --> 00:01:18,910 To trochę pseudokod mieszane tutaj. 33 00:01:18,910 --> 00:01:21,050 Jest to funkcja o nazwie radzić sobie kartę, która najwidoczniej 34 00:01:21,050 --> 00:01:26,570 bierze talię jako parametru, a Wyjście wola do mnie jedna karta. 35 00:01:26,570 --> 00:01:30,990 >> I robię coś tu, gdzie ja mają pętlę, która biegnie od 0 do 52, 36 00:01:30,990 --> 00:01:33,394 a ja sobie karty. 37 00:01:33,394 --> 00:01:35,310 Cóż, mamy magię Numer tutaj, w prawo. 38 00:01:35,310 --> 00:01:38,790 Czy widzisz to, co magiczna liczba? 39 00:01:38,790 --> 00:01:42,280 Lub, co ważniejsze, prawda zobaczyć, co problem jest tutaj? 40 00:01:42,280 --> 00:01:44,310 Szczególnie, jeśli to jest tylko jedna funkcja 41 00:01:44,310 --> 00:01:48,030 w swoim pliku w Folder zawiera 42 00:01:48,030 --> 00:01:49,970 kilka różnych plików, z których każda 43 00:01:49,970 --> 00:01:51,670 robi coś innego do talii kart. 44 00:01:51,670 --> 00:01:57,310 Może to tasuje je, lub zajmuje rękę z pięciu kart zamiast jednej karty. 45 00:01:57,310 --> 00:01:59,420 >> Czy widzisz, co się Problemem może być tutaj? 46 00:01:59,420 --> 00:02:03,220 Czy widzisz magiczna liczba Mam wstrzykiwany do kodu? 47 00:02:03,220 --> 00:02:04,390 Jest to 52, w prawo. 48 00:02:04,390 --> 00:02:06,440 >> Jak, intuicyjnie zapewne wiesz, OK. 49 00:02:06,440 --> 00:02:09,740 Podobnie jak w standardowym pokładzie Karty zawiera 52 kart. 50 00:02:09,740 --> 00:02:12,570 Ale w naszym programie, to tylko rodzaj krąży tam. 51 00:02:12,570 --> 00:02:15,280 To tak, jakby nagle istnieje 52. 52 00:02:15,280 --> 00:02:18,290 >> Jednym ze sposobów, aby rozwiązać ten problem Problem polega na tym, aby to zrobić. 53 00:02:18,290 --> 00:02:22,724 Jesteśmy bardzo wyraźnie teraz wołając wielkości pokładu jako 52. 54 00:02:22,724 --> 00:02:25,390 Daje to trochę bardziej intuicyjny co oznacza, gdy w pętli for 55 00:02:25,390 --> 00:02:28,650 później my wtedy powiedzieć, że jest mniejszy niż rozmiar pokładu. 56 00:02:28,650 --> 00:02:32,666 To po prostu wydaje się lepszy, niż mówiąc 52. 57 00:02:32,666 --> 00:02:34,290 Teraz to ma właściwie rozwiązać problem. 58 00:02:34,290 --> 00:02:38,460 To daje pewne symboliczne oznacza na stałe. 59 00:02:38,460 --> 00:02:40,820 Ale to nie rodzaj rzeczywistości przedstawić inny problem 60 00:02:40,820 --> 00:02:43,770 że może nie być od razu widoczne. 61 00:02:43,770 --> 00:02:45,859 Nawet jeśli ta zmienna deklaruje globally-- 62 00:02:45,859 --> 00:02:47,650 wspominasz, co to Oznacza kiedy deklarujemy 63 00:02:47,650 --> 00:02:50,500 zmienną globalnie kontra lokalnie? 64 00:02:50,500 --> 00:02:53,340 Nawet jeśli zadeklarować zmienną na całym świecie, co będzie, jeśli nie ma 65 00:02:53,340 --> 00:02:55,500 inna funkcja w nasz pakiet funkcji 66 00:02:55,500 --> 00:02:59,750 które zajmują się manipulacji karty że przypadkowo zmienia rozmiar pokładu, 67 00:02:59,750 --> 00:03:02,727 lub zwiększa go 1 lub zmniejsza się o 1. 68 00:03:02,727 --> 00:03:04,060 To może oznaczać kłopoty, prawda? 69 00:03:04,060 --> 00:03:08,261 Zwłaszcza, jeśli mamy do czynienia z zestawem tasowanie kart, gdzie całą talię 70 00:03:08,261 --> 00:03:08,760 jest wymagane. 71 00:03:08,760 --> 00:03:12,804 Jeśli rozmiar talii jest zmniejszony od 1, na przykład, 51, 72 00:03:12,804 --> 00:03:14,970 nie jesteśmy właściwie tasowanie wszystkie karty ewentualnie. 73 00:03:14,970 --> 00:03:16,500 Wyjeżdżamy z nich na zewnątrz. 74 00:03:16,500 --> 00:03:21,680 I ta wartość może być może należnej lub wykorzystana przez złego aktora. 75 00:03:21,680 --> 00:03:24,920 >> C zapewnia to, co się nazywa dyrektywy preprocesora, które 76 00:03:24,920 --> 00:03:27,764 jest również nazywany makrofotografii tworzenie stałych symbolicznych. 77 00:03:27,764 --> 00:03:30,180 I faktycznie, już mam widziałem dyrektywy preprocesora, 78 00:03:30,180 --> 00:03:32,916 nawet jeśli jej nie słyszał nazywa, że ​​z #include. 79 00:03:32,916 --> 00:03:37,150 Jest to kolejny przykład makra lub dyrektywa preprocesora. 80 00:03:37,150 --> 00:03:41,290 >> Sposobem na stworzenie stałych symbolicznych, lub podając nazwę na stałe 81 00:03:41,290 --> 00:03:43,740 tak, że ma bardziej oznacza się następująco. 82 00:03:43,740 --> 00:03:47,030 #define, nazwisko, wymiana. 83 00:03:47,030 --> 00:03:49,140 Naprawdę ważne bok tutaj naprawdę szybkie. 84 00:03:49,140 --> 00:03:54,180 Nie postawić średnik na koniec waszych #defines. 85 00:03:54,180 --> 00:03:57,310 Więc to #define, nazwisko, wymiana. 86 00:03:57,310 --> 00:03:59,540 >> Gdy program jest kompilowany, co faktycznie się dzieje 87 00:03:59,540 --> 00:04:01,740 to kompilator, jeśli będzie przejść przez kod 88 00:04:01,740 --> 00:04:06,770 i zastąpić wszystkie wystąpienia słowo "imię" z Cokolwiek 89 00:04:06,770 --> 00:04:08,860 umieścić jako zamiennik. 90 00:04:08,860 --> 00:04:13,060 Analogicznie, jeśli #include jest rodzajem z podobna do kopiowania i wklejania, 91 00:04:13,060 --> 00:04:15,700 następnie #define jest rodzajem podobna do wyszukiwania i zamiany, 92 00:04:15,700 --> 00:04:19,180 jeśli kiedykolwiek używałeś tej funkcji w sposób edytor tekstu, na przykład. 93 00:04:19,180 --> 00:04:26,345 >> Tak na przykład, jeśli #define pi jako 3,14159265, 94 00:04:26,345 --> 00:04:28,720 jeśli jesteś lepszy matematycznie pochylona i nagle 95 00:04:28,720 --> 00:04:31,640 zobacz 3,14159265 latanie wokół w kodzie, 96 00:04:31,640 --> 00:04:33,517 to zapewne wiesz, że mówi o pi. 97 00:04:33,517 --> 00:04:35,850 Ale może uda nam się nadać mu małe znaczenie bardziej symboliczny. 98 00:04:35,850 --> 00:04:39,850 I możemy zamiast powiedzieć #define pi w tym ustami pełnymi numerami 99 00:04:39,850 --> 00:04:42,110 że nie będę trzymać czytanie w kółko. 100 00:04:42,110 --> 00:04:45,560 >> A co się stanie potem na kompilacji jest, gdy program jest 101 00:04:45,560 --> 00:04:48,530 kompilowane, pierwszą rzeczą, która stanie się to będzie przejść przez 102 00:04:48,530 --> 00:04:51,520 i zastąpi ona za każdym razem, widzi kapitałowej P, kapitału I, 103 00:04:51,520 --> 00:04:55,610 będzie to dosłownie zastąpić go 3,14 i tak dalej, tak, że 104 00:04:55,610 --> 00:04:58,090 nie trzeba wpisywać go za każdym razem, gdy twój program wciąż 105 00:04:58,090 --> 00:05:00,631 posiada funkcje, które Cię spodziewać, bo pracujesz 106 00:05:00,631 --> 00:05:05,090 manipulacyjne, mnożenie, podziału, cokolwiek to jest, przez pi. 107 00:05:05,090 --> 00:05:08,230 >> Nie jest do tego ograniczony zastąpienie tylko liczby. 108 00:05:08,230 --> 00:05:12,279 Na przykład, mogę #define Oczywiście jak CS50 smyczkowy. 109 00:05:12,279 --> 00:05:14,070 W tym przypadku, gdy program jest kompilowany, 110 00:05:14,070 --> 00:05:16,236 #define będzie przejść przez Kod, wymienić za każdym razem, 111 00:05:16,236 --> 00:05:19,900 widzi "kurs" z CS50 smyczkowy. 112 00:05:19,900 --> 00:05:21,720 >> Zauważysz tutaj również, że ja często 113 00:05:21,720 --> 00:05:26,090 #define całe zdefiniowane symboliczne Stałe, że tak powiem, 114 00:05:26,090 --> 00:05:28,130 zawsze są wielkimi literami. 115 00:05:28,130 --> 00:05:28,960 Jest to konwencja. 116 00:05:28,960 --> 00:05:30,170 To nie jest wymagane. 117 00:05:30,170 --> 00:05:33,900 Powodem zwykle ludzie będą używać wszystkie stolice, gdy są #defining 118 00:05:33,900 --> 00:05:37,590 jest tylko, aby to naprawdę jasne, że ten konkretny element mojego kodu 119 00:05:37,590 --> 00:05:38,820 jest zdefiniowane stałe. 120 00:05:38,820 --> 00:05:43,730 Jeśli to było małe, możliwe jest, że to może być mylony ze zmienną. 121 00:05:43,730 --> 00:05:46,120 I to jest chyba nie jest dobrą rzeczą do zrobienia. 122 00:05:46,120 --> 00:05:48,910 >> Więc ten szczególny Rozwiązanie to jest o wiele lepsza 123 00:05:48,910 --> 00:05:50,550 od jednego z poprzednich. 124 00:05:50,550 --> 00:05:59,950 Jeśli pierwszy raz #define rozmiar talia 52, a następnie teraz moje użycie 52 lub wielkości pokładu tutaj, 125 00:05:59,950 --> 00:06:01,850 jest o wiele bardziej intuicyjny i dużo bezpieczniejsze. 126 00:06:01,850 --> 00:06:03,280 Nie można manipulować stałą. 127 00:06:03,280 --> 00:06:05,259 Nie można powiedzieć, 52 oraz plusem. 128 00:06:05,259 --> 00:06:06,800 To nie będzie przekonwertować go do 53. 129 00:06:06,800 --> 00:06:09,390 Nie można zmienić 52 do czegoś. 130 00:06:09,390 --> 00:06:12,470 >> Możesz zmienić zmienną którego wartość wynosi 52, 131 00:06:12,470 --> 00:06:14,870 która pierwsza poprawka mieliśmy wcześniej. 132 00:06:14,870 --> 00:06:17,000 I można zwiększyć zmienna do 53. 133 00:06:17,000 --> 00:06:21,100 Ale nie można powiedzieć, 52 plusa plus i mają, że nagle obrócić 52 do 53. 134 00:06:21,100 --> 00:06:23,350 52 jest zawsze 52. 135 00:06:23,350 --> 00:06:28,860 A więc nie można przypadkowo zmienić Rozmiar tutaj manipulując jej pokład, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Kolejna dobra strona Efektem tego jest jednak, 138 00:06:32,390 --> 00:06:38,310 że jesteś świadomy, że nie wszystkie kraje na całym świecie 139 00:06:38,310 --> 00:06:40,690 użyć talię kart o rozmiarze 52? 140 00:06:40,690 --> 00:06:45,630 Na przykład, jest to bardzo powszechne w Niemcy użyć wielkości pokładu 32, 141 00:06:45,630 --> 00:06:48,020 gdzie usuwają niektóre dolnych wartości karty. 142 00:06:48,020 --> 00:06:50,960 I w tym przypadku, chciał portu Mój apartament 143 00:06:50,960 --> 00:06:55,390 funkcji, które zajmują się Manipulacja karty do Niemiec. 144 00:06:55,390 --> 00:06:59,440 Mogłem w pierwszej instancji, że pokazał, trzeba iść i wymienić 145 00:06:59,440 --> 00:07:03,570 wszystkie instancje 52 w kodzie z 32. 146 00:07:03,570 --> 00:07:07,940 >> Ale tutaj, jeśli #define rozmiar talii jako 32 na samym początku mojego kodu, 147 00:07:07,940 --> 00:07:11,730 czy muszę go zmienić, mogę tylko iść i zmienić tej jednej rzeczy. 148 00:07:11,730 --> 00:07:15,010 Rekompilacji mój kod, a wszystkie nagle to rozchodzi. 149 00:07:15,010 --> 00:07:18,850 W rzeczywistości, możemy zmienić talię Rozmiar na dowolną wartość, którą chcemy. 150 00:07:18,850 --> 00:07:22,500 >> Czy mogę cię zainteresowanie Gra od wielkości pokładu pickup? 151 00:07:22,500 --> 00:07:23,430 >> Jestem Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 I to jest CS50. 153 00:07:25,840 --> 00:07:27,772