1 00:00:00,000 --> 00:00:02,350 >> [RIPRODUZIONE DI BRANI MUSICALI] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Va bene. 4 00:00:06,360 --> 00:00:07,770 Tipo di un argomento strano, giusto? 5 00:00:07,770 --> 00:00:09,050 Numeri magici. 6 00:00:09,050 --> 00:00:12,012 Cosa doe intendeva dire quando è parlando di numeri magici? 7 00:00:12,012 --> 00:00:14,220 Ebbene, alcuni dei programmi che abbiamo scritto in CS50 8 00:00:14,220 --> 00:00:16,660 finora hanno avuto qualche strano numeri tipo di gettato in loro. 9 00:00:16,660 --> 00:00:19,680 Forse per ragioni non lo facciamo interamente capire adesso. 10 00:00:19,680 --> 00:00:23,950 Ad esempio, nel problema Mario, abbiamo ricoperto l'altezza della piramide a 23. 11 00:00:23,950 --> 00:00:26,880 Abbiamo detto in modo esplicito si non si può andare più in alto di 23. 12 00:00:26,880 --> 00:00:28,702 >> Ma cosa vuol dire 23? 13 00:00:28,702 --> 00:00:30,410 Beh, se avete letto il spec attenzione, si 14 00:00:30,410 --> 00:00:32,493 potrebbe aver visto che la motivo per cui abbiamo innevate che a 23 15 00:00:32,493 --> 00:00:36,160 è perché l'altezza standard di una finestra di terminale è 24. 16 00:00:36,160 --> 00:00:38,860 E così, se abbiamo il piramide essere più alto di quello, 17 00:00:38,860 --> 00:00:41,290 si potrebbe fare questa cosa strana dove si corre fuori dallo schermo. 18 00:00:41,290 --> 00:00:45,140 E si sa, che cosa fa che significa in un contesto, giusto? 19 00:00:45,140 --> 00:00:48,880 >> È il significato del 23 immediatamente evidente a qualcuno che guarda il tuo programma 20 00:00:48,880 --> 00:00:51,550 e ha forse un diverso finestra di terminale dimensioni? 21 00:00:51,550 --> 00:00:52,330 Probabilmente no. 22 00:00:52,330 --> 00:00:53,080 Sembra, OK. 23 00:00:53,080 --> 00:00:55,005 Beh, perché è poco meno di 23? 24 00:00:55,005 --> 00:00:56,880 In generale, è una specie di una cattiva abitudine in realtà 25 00:00:56,880 --> 00:00:58,940 scrivere le costanti nel codice. 26 00:00:58,940 --> 00:01:02,190 In tal modo, quando si effettivamente fare scrivere un costante nel codice, 27 00:01:02,190 --> 00:01:05,630 è a volte indicato come l'utilizzo numeri magici, che è qualcosa 28 00:01:05,630 --> 00:01:08,030 generalmente vogliamo cercare di evitare. 29 00:01:08,030 --> 00:01:12,830 >> Ad esempio, diamo un'occhiata in questa semplice funzione qui. 30 00:01:12,830 --> 00:01:15,726 Ovviamente c'è nessun dato tipo in C chiamato carta o del ponte. 31 00:01:15,726 --> 00:01:16,600 Quindi, solo portare con me. 32 00:01:16,600 --> 00:01:18,910 E 'un po' di pseudocodice mescolato qui. 33 00:01:18,910 --> 00:01:21,050 Questa è una funzione denominata trattare carta che a quanto pare 34 00:01:21,050 --> 00:01:26,570 prende un mazzo come parametro, e volontà di uscita per me una singola scheda. 35 00:01:26,570 --> 00:01:30,990 >> E sto facendo qualcosa qui dove mi hanno un ciclo che va da 0 a 52, 36 00:01:30,990 --> 00:01:33,394 e mi occupo di una carta. 37 00:01:33,394 --> 00:01:35,310 Bene, abbiamo una magia numero in qua, a destra. 38 00:01:35,310 --> 00:01:38,790 Vedete quello che il numero magico è? 39 00:01:38,790 --> 00:01:42,280 O ancora più importante, si fa vedere qual è il problema qui? 40 00:01:42,280 --> 00:01:44,310 In particolare se questo è solo una funzione 41 00:01:44,310 --> 00:01:48,030 nel proprio file in un cartella che contiene 42 00:01:48,030 --> 00:01:49,970 un mucchio di diverso file, ciascuna delle quali 43 00:01:49,970 --> 00:01:51,670 fa un'altra cosa da un mazzo di carte. 44 00:01:51,670 --> 00:01:57,310 Forse li rimescola, o infligge una mano di cinque carte invece di una singola scheda. 45 00:01:57,310 --> 00:01:59,420 >> Vedete quello che il problema potrebbe essere qui? 46 00:01:59,420 --> 00:02:03,220 Vedete il numero magico Ho iniettato nel codice? 47 00:02:03,220 --> 00:02:04,390 E '52, a destra. 48 00:02:04,390 --> 00:02:06,440 >> Come, intuitivamente probabilmente sapete, OK. 49 00:02:06,440 --> 00:02:09,740 Come un mazzo standard di carte contiene 52 carte. 50 00:02:09,740 --> 00:02:12,570 Ma nel nostro programma, è solo tipo di galleggianti intorno in là. 51 00:02:12,570 --> 00:02:15,280 E 'come tutto ad un tratto c'è un 52. 52 00:02:15,280 --> 00:02:18,290 >> Un modo per risolvere questo problema è di fare questo. 53 00:02:18,290 --> 00:02:22,724 Siamo molto esplicito ora chiamando la dimensione ponte come 52. 54 00:02:22,724 --> 00:02:25,390 Dà un po 'più intuitivo cioè quando nel ciclo for 55 00:02:25,390 --> 00:02:28,650 in seguito abbiamo poi diciamo, i è di dimensioni inferiori ponte. 56 00:02:28,650 --> 00:02:32,666 Sembra proprio meglio che dire 52. 57 00:02:32,666 --> 00:02:34,290 Ora questo realmente risolvere il problema. 58 00:02:34,290 --> 00:02:38,460 Si dà un po 'simbolica cioè alla costante. 59 00:02:38,460 --> 00:02:40,820 Ma lo fa sorta di realtà introdurre un altro problema 60 00:02:40,820 --> 00:02:43,770 che potrebbe non essere immediatamente evidente. 61 00:02:43,770 --> 00:02:45,859 Anche se questa variabile è dichiarata globally-- 62 00:02:45,859 --> 00:02:47,650 ti ricordi che cosa significa che quando si dichiara 63 00:02:47,650 --> 00:02:50,500 una variabile globale contro a livello locale? 64 00:02:50,500 --> 00:02:53,340 Anche se si dichiara una variabile a livello globale, che cosa se non c'è 65 00:02:53,340 --> 00:02:55,500 un'altra funzione la nostra suite di funzioni 66 00:02:55,500 --> 00:02:59,750 che si occupano di CARTOMAGIA che cambia inavvertitamente le dimensioni della piattaforma, 67 00:02:59,750 --> 00:03:02,727 o aumenta dal 1 o diminuisce entro 1. 68 00:03:02,727 --> 00:03:04,060 Questo potrebbe significare guai, giusto? 69 00:03:04,060 --> 00:03:08,261 Soprattutto se abbiamo a che fare con un set di carte dove mescola il mazzo completo 70 00:03:08,261 --> 00:03:08,760 è obbligatorio. 71 00:03:08,760 --> 00:03:12,804 Se la dimensione della piattaforma è diminuita da 1, per esempio, a 51, 72 00:03:12,804 --> 00:03:14,970 non stiamo in realtà mischiare tutte le carte eventualmente. 73 00:03:14,970 --> 00:03:16,500 Stiamo lasciando uno di loro fuori. 74 00:03:16,500 --> 00:03:21,680 E che valore potrebbe forse previsti o sfruttato da un cattivo attore. 75 00:03:21,680 --> 00:03:24,920 >> C fornisce ciò che è chiamato un direttiva del preprocessore, che 76 00:03:24,920 --> 00:03:27,764 è chiamato anche una macro per creando costanti simboliche. 77 00:03:27,764 --> 00:03:30,180 E infatti, hai già visto una direttiva del preprocessore, 78 00:03:30,180 --> 00:03:32,916 anche se non avete sentito chiamata che con #include. 79 00:03:32,916 --> 00:03:37,150 E 'un altro esempio di una macro o direttiva del preprocessore. 80 00:03:37,150 --> 00:03:41,290 >> Il modo per creare costanti simboliche, o dare un nome a una costante 81 00:03:41,290 --> 00:03:43,740 in modo che abbia più il che significa, è il seguente. 82 00:03:43,740 --> 00:03:47,030 #define, nome, la sostituzione. 83 00:03:47,030 --> 00:03:49,140 Davvero importante da parte qui davvero veloce. 84 00:03:49,140 --> 00:03:54,180 Non mettere un punto e virgola alla fine dei vostri # definisce. 85 00:03:54,180 --> 00:03:57,310 Quindi è #define, nome, la sostituzione. 86 00:03:57,310 --> 00:03:59,540 >> Quando il programma viene compilato, ciò che effettivamente accade 87 00:03:59,540 --> 00:04:01,740 è il compilatore se andare per passare attraverso il codice 88 00:04:01,740 --> 00:04:06,770 e sostituire ogni istanza di la parola "nome" con tutto quello che 89 00:04:06,770 --> 00:04:08,860 mettere in sostituzione. 90 00:04:08,860 --> 00:04:13,060 Analogamente, se #include è una sorta di simile a copiare e incollare, 91 00:04:13,060 --> 00:04:15,700 poi #define è una sorta di simile per trovare e sostituire, 92 00:04:15,700 --> 00:04:19,180 se avete mai usato questa funzione in un programma di elaborazione testi, per esempio. 93 00:04:19,180 --> 00:04:26,345 >> Così, per esempio, se #define pi greco come 3.14159265, 94 00:04:26,345 --> 00:04:28,720 se siete meglio matematicamente improvvisamente inclinato e si 95 00:04:28,720 --> 00:04:31,640 vedi 3.14159265 volare intorno nel codice, 96 00:04:31,640 --> 00:04:33,517 probabilmente sapete che sta parlando pi greco. 97 00:04:33,517 --> 00:04:35,850 Ma forse possiamo dare un poco significato più simbolico. 98 00:04:35,850 --> 00:04:39,850 E possiamo invece dire #define pi come quello boccone di numeri 99 00:04:39,850 --> 00:04:42,110 che io non ho intenzione di continuare a leggere più e più volte. 100 00:04:42,110 --> 00:04:45,560 >> E cosa succederà poi a tempo di compilazione è quando il programma è 101 00:04:45,560 --> 00:04:48,530 compilato, la prima cosa che che accadrà è che passerà attraverso 102 00:04:48,530 --> 00:04:51,520 e sostituirà ogni volta vede la P maiuscola, maiuscola, 103 00:04:51,520 --> 00:04:55,610 che sarà letteralmente sostituirlo con 3.14 e così via, in modo che 104 00:04:55,610 --> 00:04:58,090 non c'è bisogno di digitare ogni tempo mentre il programma ancora 105 00:04:58,090 --> 00:05:00,631 ha la funzionalità che si aspettare, perché si sta lavorando 106 00:05:00,631 --> 00:05:05,090 con manipolazione, moltiplicando, dividendo, qualunque essa sia per pi. 107 00:05:05,090 --> 00:05:08,230 >> Non si sono limitati a questo sostituzione di solo numeri. 108 00:05:08,230 --> 00:05:12,279 Per esempio, potrei #define Naturalmente come il CS50 stringa. 109 00:05:12,279 --> 00:05:14,070 In questo caso, quando il programma è compilato, 110 00:05:14,070 --> 00:05:16,236 #define passerà attraverso il codice, sostituire ogni volta 111 00:05:16,236 --> 00:05:19,900 vede "corso" con il CS50 corda. 112 00:05:19,900 --> 00:05:21,720 >> Noterete qui anche che ho spesso 113 00:05:21,720 --> 00:05:26,090 #define tutto il mio definito simbolico costanti, per così dire, 114 00:05:26,090 --> 00:05:28,130 sono sempre in tutte le protezioni. 115 00:05:28,130 --> 00:05:28,960 Si tratta di una convenzione. 116 00:05:28,960 --> 00:05:30,170 Non è necessario. 117 00:05:30,170 --> 00:05:33,900 La ragione per cui generalmente la gente userà tutte le capitali quando sono #defining 118 00:05:33,900 --> 00:05:37,590 è solo per rendere veramente chiaro che questo particolare elemento del mio codice 119 00:05:37,590 --> 00:05:38,820 è una costante definita. 120 00:05:38,820 --> 00:05:43,730 Se era minuscolo, è possibile che potrebbe essere confusa con una variabile. 121 00:05:43,730 --> 00:05:46,120 E questo è probabilmente non è una buona cosa da fare. 122 00:05:46,120 --> 00:05:48,910 >> Così questo particolare soluzione è molto meglio 123 00:05:48,910 --> 00:05:50,550 a nessuno di quelli precedenti. 124 00:05:50,550 --> 00:05:59,950 Se ho #define formato mazzo di 52, quindi ora il mio uso di 52 o dimensione ponte qui, 125 00:05:59,950 --> 00:06:01,850 è molto più intuitivo e molto più sicuro. 126 00:06:01,850 --> 00:06:03,280 Non è possibile modificare una costante. 127 00:06:03,280 --> 00:06:05,259 Non si può dire 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 Che non sta andando per convertirlo a 53. 129 00:06:06,800 --> 00:06:09,390 Non è possibile modificare 52 a qualcosa. 130 00:06:09,390 --> 00:06:12,470 >> È possibile modificare una variabile il cui valore è 52, 131 00:06:12,470 --> 00:06:14,870 che era il primo fix che avevamo prima. 132 00:06:14,870 --> 00:06:17,000 E si potrebbe aumentare la variabile a 53. 133 00:06:17,000 --> 00:06:21,100 Ma non si può dire 52 plus plus e avere che improvvisamente trasformare 52 in 53. 134 00:06:21,100 --> 00:06:23,350 52 è sempre 52. 135 00:06:23,350 --> 00:06:28,860 E così non si può inavvertitamente cambiare Dimensioni ponte qui manipolando esso, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Un altro lato positivo effetto di questo è però 138 00:06:32,390 --> 00:06:38,310 che sono consapevole che non tutti i paesi del mondo 139 00:06:38,310 --> 00:06:40,690 utilizzare un mazzo di carte di dimensioni 52? 140 00:06:40,690 --> 00:06:45,630 Ad esempio, è molto comune in La Germania di usare una dimensione mazzo di 32, 141 00:06:45,630 --> 00:06:48,020 dove si spogliano alcune delle carte di valore inferiore. 142 00:06:48,020 --> 00:06:50,960 E in questo caso, voluto porto mia suite 143 00:06:50,960 --> 00:06:55,390 di funzioni che si occupano di CARTOMAGIA in Germania. 144 00:06:55,390 --> 00:06:59,440 Ho potuto in primo luogo abbiamo ha dimostrato, devono andare e sostituire 145 00:06:59,440 --> 00:07:03,570 tutte le istanze di 52 nel mio codice con 32. 146 00:07:03,570 --> 00:07:07,940 >> Ma qui, se mi #define dimensioni ponte come 32 in cima del mio codice, 147 00:07:07,940 --> 00:07:11,730 se ho bisogno di cambiare, non posso basta andare a cambiare che una cosa. 148 00:07:11,730 --> 00:07:15,010 Ricompilare mio codice, e tutti All'improvviso si propaga attraverso. 149 00:07:15,010 --> 00:07:18,850 In realtà, siamo in grado di cambiare piattaforma size ad alcun valore che vogliamo. 150 00:07:18,850 --> 00:07:22,500 >> Posso interesse in un gioco di dimensioni ponte ritiro? 151 00:07:22,500 --> 00:07:23,430 >> Sono Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 E questo è CS50. 153 00:07:25,840 --> 00:07:27,772