[Música tocando] Doug LLOYD: Todo ben. Tipo de un tema estraño, non? Números máxicos. Que doe quere dicir cando é falando de números máxicos? Ben, algúns dos programas que temos escrito en CS50 ata agora tiveron algún estraño números tipo de xogado neles. Quizais por razóns que non facer enteiramente comprender agora. Por exemplo, o problema en Mario, nós tapado a altura da pirámide a 23. Nós explicitamente dixo que non pode ir máis alto do que 23. Pero o que significa 23 significa? Ben, se ler o especificación coidado, pode ver que o razón pola cal el tampou a 23 é porque a altura estándar dunha fiestra da terminal é de 24. E por iso, se ten por pirámide ser máis alto do que iso, pode facer esa cousa estraña onde é executado fóra da pantalla. E vostede sabe, o que fai isto significa no contexto, non? É o significado do 23 inmediatamente obvio para alguén que mira para o seu programa e quizais un diferente posúe fiestra de terminal tamaño? Probablemente non. Parece que, OK. Ben, por que é algo menos de 23? En xeral, é unha especie de un mal hábito, en realidade, para escribir constantes no seu código. Ao facelo, cando realmente fazê- escribir constante no seu código, ás veces é referido como usar números máxicos, que é algo que xeralmente quere probar e evitar. Por exemplo, imos dar un ollo nesta función simple aquí. Obviamente, non hai datos tipo en C chamado tarxeta ou deck. Entón, só teña paciencia comigo. É un pouco de pseudocódigo mesturados aquí. Esta é unha función chamada tratar tarxeta que aparentemente leva un deck como parámetro, e saída ganas de me un único cartón. E eu estou facendo algo aquí onde eu teño un loop que vai de 0 a 52, e eu tratar unha tarxeta. Ben, nós temos unha maxia número aquí, certo. Vostede ve o que o número máxico é? Ou, máis importante, ver cal é o problema aquí? Particularmente, se esta é só unha función no seu propio arquivo nunha cartafol que contén unha morea de diferentes arquivos, cada un dos cales fai outra cousa que un baralla de cartas. Quizais embaralha-los, ou negocia unha man de cinco cartas, en vez de un único cartón. Vostede ve o que o problema podería estar aquí? Ve o número máxico Teño inxectado no código? É 52, á dereita. Como, intuitivamente probablemente sabe, Aceptar. Como unha plataforma estándar de tarxetas contén 52 cartas. Pero, no noso programa, é só tipo de flotante en torno de alí. É como se, de súpeto, hai un 52. Unha forma de solucionar este problema é facelo. Estamos moi explicitamente agora chamando o tamaño da plataforma como 52. Dálle un pouco máis intuitivo é dicir, cando o loop for Máis tarde, a continuación, dicir, i é menor que o tamaño da plataforma. Ela só parece mellor que dicir 52. Agora que realmente resolver o problema. Dá algúns simbólico significado para a constante. Pero fai tipo de realmente introducir outro problema que pode non ser inmediatamente aparente. Aínda que esta variable é declarado globally-- se lembra o que significa que cando declaramos unha variable global contra localmente? Aínda que declarar unha variable globalmente, o que se fai outra función no noso conxunto de funcións que lidan con CARTOMAGIA que, inadvertidamente, cambia o tamaño da plataforma, ou por el aumenta- 1 ou diminúe-lo por un. Isto podería causar problemas, non? Especialmente se estamos lidando con un conxunto de tarxetas onde barallar o baralla completo precísase. Se o tamaño da plataforma é diminuída 1 por, por exemplo, a 51, non estamos realmente barallar Todas as tarxetas Posiblemente. Estamos deixando un deles para fóra. E ese valor talvez puidese ser do previsto ou explotado por un actor malo. C ofrece o que se chama un pre-procesador directiva, que é tamén chamado de unha macro para creación constantes simbólicas. E, de feito, xa visto un pre-procesador directiva, mesmo se nunca escoitou falar diso chamado que con #include. É máis un exemplo dunha macro ou pre-procesador directiva. O xeito de crear constantes simbólicas, ou dar un nome a unha constante de xeito que teña máis é dicir, é como segue. #define, nome, substitución. Realmente importante de lado aquí realmente rápido. Non coloque un punto e coma no o fin dos seus #defines. Polo tanto, é #define, nome, substitución. Cando o programa está compilado, o que realmente acontece é o compilador vaise pasar polo seu código e substituír cada instancia de a palabra "nome" co que poñer como substituto. Analogamente, se #include é unha especie semellante ao de copiar e pegar, logo # define é unha especie de semellante para localizar e substituír, Se xa usou este recurso nun programa de procesamento de texto, por exemplo. Así, por exemplo, se eu #define pi como 3.14159265, se está mellor matematicamente inclinado e de súpeto vexa 3.14159265 voo ao redor do seu código, probablemente sabe que está falando pi. Pero quizais poidamos darlle un pouco significado máis simbólico. E podemos dicir, en vez #define pi como a boca chea de números que eu non vou seguir ler máis e máis. E o que vai pasar a continuación, en é o tempo de compilación cando estexa compilado, o primeiro que vai ocorrer é que vai pasar por e ha substituír cada vez ve P maiúsculo, principal min, vai literalmente substituílo con 3,14 e así por diante, de modo que non precise escriba-la cada tempo, mentres aínda o seu programa ten a función de que esperar, porque se está a traballar con manipulación, multiplicando, división, sexa o que sexa por pi. Non está limitado a esta substitución por só números. Por exemplo, podería #define Por suposto, o CS50 cadea. Neste caso, cando o programa está feita, #define pasará polo código, substitúe cada vez ve "claro" co CS50 cadea. Notará aquí tamén que eu frecuentemente # Define toda a miña definido simbólico constantes, por así dicir, están sempre en todo tapóns. É unha convención. Non é necesario. A razón xeralmente a xente usalo todas as capitais cando están #defining é só para deixar ben claro que este elemento particular do meu código é unha constante definida. Se era minúscula, é posible que que podería ser confundida cunha variable. E iso pode ser non é bo para facer. Entón este particular solución é moito mellor do que calquera dos anteriores. 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í, é moito máis intuitivo e moito máis seguro. Non pode manipular unha constante. Non pode dicir 52 plus plus. Iso non vai convertelo para 53. Non pode cambiar de 52 para algo. Pode cambiar unha variable cuxo valor é de 52, que foi a primeira corrección que tiñamos antes. E pode aumentar esa variable para 53. Pero non se pode dicir 52 plus plus e ten que, de súpeto virar 52 a 53. 52 é sempre 52. E entón non pode cambiar inadvertidamente tamaño da plataforma aquí, manipulando-o, Doutra banda bo efecto desta, pero é que está consciente de que non todos os países de todo o mundo usar un baralla de cartas de tamaño 52? Por exemplo, é moi común en Alemaña para usar un tamaño baralla de 32, onde tira algúns das cartas de menor valor. E neste caso, eu quería porto miña suite das funcións que lidan con CARTOMAGIA para a Alemaña. Podería, no primeiro caso, mostrou, teño que ir e substituí- todas as instancias de 52 no meu código con 32. Pero aquí, se eu #define tamaño da plataforma como 32 na parte superior do meu código, se eu teño muda-lo, podo só tes que ir e cambiar isto unha cousa. Recompilar o meu código, e todos súpeto se propaga a través. De feito, podemos cambiar cuberta tamaño para calquera valor que queremos. Podo interesa-lo en xogo de tamaño da plataforma de captación? Eu son Doug Lloyd. E este é CS50.