1 00:00:00,000 --> 00:00:02,350 >> [Música tocando] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 Doug LLOYD: Todo ben. 4 00:00:06,360 --> 00:00:07,770 Tipo de un tema estraño, non? 5 00:00:07,770 --> 00:00:09,050 Números máxicos. 6 00:00:09,050 --> 00:00:12,012 Que doe quere dicir cando é falando de números máxicos? 7 00:00:12,012 --> 00:00:14,220 Ben, algúns dos programas que temos escrito en CS50 8 00:00:14,220 --> 00:00:16,660 ata agora tiveron algún estraño números tipo de xogado neles. 9 00:00:16,660 --> 00:00:19,680 Quizais por razóns que non facer enteiramente comprender agora. 10 00:00:19,680 --> 00:00:23,950 Por exemplo, o problema en Mario, nós tapado a altura da pirámide a 23. 11 00:00:23,950 --> 00:00:26,880 Nós explicitamente dixo que non pode ir máis alto do que 23. 12 00:00:26,880 --> 00:00:28,702 >> Pero o que significa 23 significa? 13 00:00:28,702 --> 00:00:30,410 Ben, se ler o especificación coidado, 14 00:00:30,410 --> 00:00:32,493 pode ver que o razón pola cal el tampou a 23 15 00:00:32,493 --> 00:00:36,160 é porque a altura estándar dunha fiestra da terminal é de 24. 16 00:00:36,160 --> 00:00:38,860 E por iso, se ten por pirámide ser máis alto do que iso, 17 00:00:38,860 --> 00:00:41,290 pode facer esa cousa estraña onde é executado fóra da pantalla. 18 00:00:41,290 --> 00:00:45,140 E vostede sabe, o que fai isto significa no contexto, non? 19 00:00:45,140 --> 00:00:48,880 >> É o significado do 23 inmediatamente obvio para alguén que mira para o seu programa 20 00:00:48,880 --> 00:00:51,550 e quizais un diferente posúe fiestra de terminal tamaño? 21 00:00:51,550 --> 00:00:52,330 Probablemente non. 22 00:00:52,330 --> 00:00:53,080 Parece que, OK. 23 00:00:53,080 --> 00:00:55,005 Ben, por que é algo menos de 23? 24 00:00:55,005 --> 00:00:56,880 En xeral, é unha especie de un mal hábito, en realidade, 25 00:00:56,880 --> 00:00:58,940 para escribir constantes no seu código. 26 00:00:58,940 --> 00:01:02,190 Ao facelo, cando realmente fazê- escribir constante no seu código, 27 00:01:02,190 --> 00:01:05,630 ás veces é referido como usar números máxicos, que é algo 28 00:01:05,630 --> 00:01:08,030 que xeralmente quere probar e evitar. 29 00:01:08,030 --> 00:01:12,830 >> Por exemplo, imos dar un ollo nesta función simple aquí. 30 00:01:12,830 --> 00:01:15,726 Obviamente, non hai datos tipo en C chamado tarxeta ou deck. 31 00:01:15,726 --> 00:01:16,600 Entón, só teña paciencia comigo. 32 00:01:16,600 --> 00:01:18,910 É un pouco de pseudocódigo mesturados aquí. 33 00:01:18,910 --> 00:01:21,050 Esta é unha función chamada tratar tarxeta que aparentemente 34 00:01:21,050 --> 00:01:26,570 leva un deck como parámetro, e saída ganas de me un único cartón. 35 00:01:26,570 --> 00:01:30,990 >> E eu estou facendo algo aquí onde eu teño un loop que vai de 0 a 52, 36 00:01:30,990 --> 00:01:33,394 e eu tratar unha tarxeta. 37 00:01:33,394 --> 00:01:35,310 Ben, nós temos unha maxia número aquí, certo. 38 00:01:35,310 --> 00:01:38,790 Vostede ve o que o número máxico é? 39 00:01:38,790 --> 00:01:42,280 Ou, máis importante, ver cal é o problema aquí? 40 00:01:42,280 --> 00:01:44,310 Particularmente, se esta é só unha función 41 00:01:44,310 --> 00:01:48,030 no seu propio arquivo nunha cartafol que contén 42 00:01:48,030 --> 00:01:49,970 unha morea de diferentes arquivos, cada un dos cales 43 00:01:49,970 --> 00:01:51,670 fai outra cousa que un baralla de cartas. 44 00:01:51,670 --> 00:01:57,310 Quizais embaralha-los, ou negocia unha man de cinco cartas, en vez de un único cartón. 45 00:01:57,310 --> 00:01:59,420 >> Vostede ve o que o problema podería estar aquí? 46 00:01:59,420 --> 00:02:03,220 Ve o número máxico Teño inxectado no código? 47 00:02:03,220 --> 00:02:04,390 É 52, á dereita. 48 00:02:04,390 --> 00:02:06,440 >> Como, intuitivamente probablemente sabe, Aceptar. 49 00:02:06,440 --> 00:02:09,740 Como unha plataforma estándar de tarxetas contén 52 cartas. 50 00:02:09,740 --> 00:02:12,570 Pero, no noso programa, é só tipo de flotante en torno de alí. 51 00:02:12,570 --> 00:02:15,280 É como se, de súpeto, hai un 52. 52 00:02:15,280 --> 00:02:18,290 >> Unha forma de solucionar este problema é facelo. 53 00:02:18,290 --> 00:02:22,724 Estamos moi explicitamente agora chamando o tamaño da plataforma como 52. 54 00:02:22,724 --> 00:02:25,390 Dálle un pouco máis intuitivo é dicir, cando o loop for 55 00:02:25,390 --> 00:02:28,650 Máis tarde, a continuación, dicir, i é menor que o tamaño da plataforma. 56 00:02:28,650 --> 00:02:32,666 Ela só parece mellor que dicir 52. 57 00:02:32,666 --> 00:02:34,290 Agora que realmente resolver o problema. 58 00:02:34,290 --> 00:02:38,460 Dá algúns simbólico significado para a constante. 59 00:02:38,460 --> 00:02:40,820 Pero fai tipo de realmente introducir outro problema 60 00:02:40,820 --> 00:02:43,770 que pode non ser inmediatamente aparente. 61 00:02:43,770 --> 00:02:45,859 Aínda que esta variable é declarado globally-- 62 00:02:45,859 --> 00:02:47,650 se lembra o que significa que cando declaramos 63 00:02:47,650 --> 00:02:50,500 unha variable global contra localmente? 64 00:02:50,500 --> 00:02:53,340 Aínda que declarar unha variable globalmente, o que se fai 65 00:02:53,340 --> 00:02:55,500 outra función no noso conxunto de funcións 66 00:02:55,500 --> 00:02:59,750 que lidan con CARTOMAGIA que, inadvertidamente, cambia o tamaño da plataforma, 67 00:02:59,750 --> 00:03:02,727 ou por el aumenta- 1 ou diminúe-lo por un. 68 00:03:02,727 --> 00:03:04,060 Isto podería causar problemas, non? 69 00:03:04,060 --> 00:03:08,261 Especialmente se estamos lidando con un conxunto de tarxetas onde barallar o baralla completo 70 00:03:08,261 --> 00:03:08,760 precísase. 71 00:03:08,760 --> 00:03:12,804 Se o tamaño da plataforma é diminuída 1 por, por exemplo, a 51, 72 00:03:12,804 --> 00:03:14,970 non estamos realmente barallar Todas as tarxetas Posiblemente. 73 00:03:14,970 --> 00:03:16,500 Estamos deixando un deles para fóra. 74 00:03:16,500 --> 00:03:21,680 E ese valor talvez puidese ser do previsto ou explotado por un actor malo. 75 00:03:21,680 --> 00:03:24,920 >> C ofrece o que se chama un pre-procesador directiva, que 76 00:03:24,920 --> 00:03:27,764 é tamén chamado de unha macro para creación constantes simbólicas. 77 00:03:27,764 --> 00:03:30,180 E, de feito, xa visto un pre-procesador directiva, 78 00:03:30,180 --> 00:03:32,916 mesmo se nunca escoitou falar diso chamado que con #include. 79 00:03:32,916 --> 00:03:37,150 É máis un exemplo dunha macro ou pre-procesador directiva. 80 00:03:37,150 --> 00:03:41,290 >> O xeito de crear constantes simbólicas, ou dar un nome a unha constante 81 00:03:41,290 --> 00:03:43,740 de xeito que teña máis é dicir, é como segue. 82 00:03:43,740 --> 00:03:47,030 #define, nome, substitución. 83 00:03:47,030 --> 00:03:49,140 Realmente importante de lado aquí realmente rápido. 84 00:03:49,140 --> 00:03:54,180 Non coloque un punto e coma no o fin dos seus #defines. 85 00:03:54,180 --> 00:03:57,310 Polo tanto, é #define, nome, substitución. 86 00:03:57,310 --> 00:03:59,540 >> Cando o programa está compilado, o que realmente acontece 87 00:03:59,540 --> 00:04:01,740 é o compilador vaise pasar polo seu código 88 00:04:01,740 --> 00:04:06,770 e substituír cada instancia de a palabra "nome" co que 89 00:04:06,770 --> 00:04:08,860 poñer como substituto. 90 00:04:08,860 --> 00:04:13,060 Analogamente, se #include é unha especie semellante ao de copiar e pegar, 91 00:04:13,060 --> 00:04:15,700 logo # define é unha especie de semellante para localizar e substituír, 92 00:04:15,700 --> 00:04:19,180 Se xa usou este recurso nun programa de procesamento de texto, por exemplo. 93 00:04:19,180 --> 00:04:26,345 >> Así, por exemplo, se eu #define pi como 3.14159265, 94 00:04:26,345 --> 00:04:28,720 se está mellor matematicamente inclinado e de súpeto 95 00:04:28,720 --> 00:04:31,640 vexa 3.14159265 voo ao redor do seu código, 96 00:04:31,640 --> 00:04:33,517 probablemente sabe que está falando pi. 97 00:04:33,517 --> 00:04:35,850 Pero quizais poidamos darlle un pouco significado máis simbólico. 98 00:04:35,850 --> 00:04:39,850 E podemos dicir, en vez #define pi como a boca chea de números 99 00:04:39,850 --> 00:04:42,110 que eu non vou seguir ler máis e máis. 100 00:04:42,110 --> 00:04:45,560 >> E o que vai pasar a continuación, en é o tempo de compilación cando estexa 101 00:04:45,560 --> 00:04:48,530 compilado, o primeiro que vai ocorrer é que vai pasar por 102 00:04:48,530 --> 00:04:51,520 e ha substituír cada vez ve P maiúsculo, principal min, 103 00:04:51,520 --> 00:04:55,610 vai literalmente substituílo con 3,14 e así por diante, de modo que 104 00:04:55,610 --> 00:04:58,090 non precise escriba-la cada tempo, mentres aínda o seu programa 105 00:04:58,090 --> 00:05:00,631 ten a función de que esperar, porque se está a traballar 106 00:05:00,631 --> 00:05:05,090 con manipulación, multiplicando, división, sexa o que sexa por pi. 107 00:05:05,090 --> 00:05:08,230 >> Non está limitado a esta substitución por só números. 108 00:05:08,230 --> 00:05:12,279 Por exemplo, podería #define Por suposto, o CS50 cadea. 109 00:05:12,279 --> 00:05:14,070 Neste caso, cando o programa está feita, 110 00:05:14,070 --> 00:05:16,236 #define pasará polo código, substitúe cada vez 111 00:05:16,236 --> 00:05:19,900 ve "claro" co CS50 cadea. 112 00:05:19,900 --> 00:05:21,720 >> Notará aquí tamén que eu frecuentemente 113 00:05:21,720 --> 00:05:26,090 # Define toda a miña definido simbólico constantes, por así dicir, 114 00:05:26,090 --> 00:05:28,130 están sempre en todo tapóns. 115 00:05:28,130 --> 00:05:28,960 É unha convención. 116 00:05:28,960 --> 00:05:30,170 Non é necesario. 117 00:05:30,170 --> 00:05:33,900 A razón xeralmente a xente usalo todas as capitais cando están #defining 118 00:05:33,900 --> 00:05:37,590 é só para deixar ben claro que este elemento particular do meu código 119 00:05:37,590 --> 00:05:38,820 é unha constante definida. 120 00:05:38,820 --> 00:05:43,730 Se era minúscula, é posible que que podería ser confundida cunha variable. 121 00:05:43,730 --> 00:05:46,120 E iso pode ser non é bo para facer. 122 00:05:46,120 --> 00:05:48,910 >> Entón este particular solución é moito mellor 123 00:05:48,910 --> 00:05:50,550 do que calquera dos anteriores. 124 00:05:50,550 --> 00:05:59,950 Se eu primeiro #define cuberta tamaño 52, a continuación, agora a miña utilización de 52, ou tamaño da plataforma aquí, 125 00:05:59,950 --> 00:06:01,850 é moito máis intuitivo e moito máis seguro. 126 00:06:01,850 --> 00:06:03,280 Non pode manipular unha constante. 127 00:06:03,280 --> 00:06:05,259 Non pode dicir 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 Iso non vai convertelo para 53. 129 00:06:06,800 --> 00:06:09,390 Non pode cambiar de 52 para algo. 130 00:06:09,390 --> 00:06:12,470 >> Pode cambiar unha variable cuxo valor é de 52, 131 00:06:12,470 --> 00:06:14,870 que foi a primeira corrección que tiñamos antes. 132 00:06:14,870 --> 00:06:17,000 E pode aumentar esa variable para 53. 133 00:06:17,000 --> 00:06:21,100 Pero non se pode dicir 52 plus plus e ten que, de súpeto virar 52 a 53. 134 00:06:21,100 --> 00:06:23,350 52 é sempre 52. 135 00:06:23,350 --> 00:06:28,860 E entón non pode cambiar inadvertidamente tamaño da plataforma aquí, manipulando-o, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Doutra banda bo efecto desta, pero é 138 00:06:32,390 --> 00:06:38,310 que está consciente de que non todos os países de todo o mundo 139 00:06:38,310 --> 00:06:40,690 usar un baralla de cartas de tamaño 52? 140 00:06:40,690 --> 00:06:45,630 Por exemplo, é moi común en Alemaña para usar un tamaño baralla de 32, 141 00:06:45,630 --> 00:06:48,020 onde tira algúns das cartas de menor valor. 142 00:06:48,020 --> 00:06:50,960 E neste caso, eu quería porto miña suite 143 00:06:50,960 --> 00:06:55,390 das funcións que lidan con CARTOMAGIA para a Alemaña. 144 00:06:55,390 --> 00:06:59,440 Podería, no primeiro caso, mostrou, teño que ir e substituí- 145 00:06:59,440 --> 00:07:03,570 todas as instancias de 52 no meu código con 32. 146 00:07:03,570 --> 00:07:07,940 >> Pero aquí, se eu #define tamaño da plataforma como 32 na parte superior do meu código, 147 00:07:07,940 --> 00:07:11,730 se eu teño muda-lo, podo só tes que ir e cambiar isto unha cousa. 148 00:07:11,730 --> 00:07:15,010 Recompilar o meu código, e todos súpeto se propaga a través. 149 00:07:15,010 --> 00:07:18,850 De feito, podemos cambiar cuberta tamaño para calquera valor que queremos. 150 00:07:18,850 --> 00:07:22,500 >> Podo interesa-lo en xogo de tamaño da plataforma de captación? 151 00:07:22,500 --> 00:07:23,430 >> Eu son Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 E este é CS50. 153 00:07:25,840 --> 00:07:27,772