1 00:00:00,000 --> 00:00:02,350 >> [MUSIC SPILLE] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: All right. 4 00:00:06,360 --> 00:00:07,770 Slag av en merkelig tema, ikke sant? 5 00:00:07,770 --> 00:00:09,050 Magiske tall. 6 00:00:09,050 --> 00:00:12,012 Hva doe han mener når han er snakker om magiske tall? 7 00:00:12,012 --> 00:00:14,220 Vel, noen av programmene som vi har skrevet i CS50 8 00:00:14,220 --> 00:00:16,660 så langt har hatt noen rare nummer slags kastet i dem. 9 00:00:16,660 --> 00:00:19,680 Kanskje av grunner vi ikke helt forstår akkurat nå. 10 00:00:19,680 --> 00:00:23,950 For eksempel, i Mario problem, vi avkortet høyden av pyramiden ved 23. 11 00:00:23,950 --> 00:00:26,880 Vi eksplisitt sa du kan ikke gå høyere enn 23. 12 00:00:26,880 --> 00:00:28,702 >> Men hva betyr 23 mener? 13 00:00:28,702 --> 00:00:30,410 Vel, hvis du leser spec nøye, du 14 00:00:30,410 --> 00:00:32,493 har kanskje sett at Grunnen til at vi avkortet det ved 23 15 00:00:32,493 --> 00:00:36,160 er fordi standard høyde av et terminalvindu er 24. 16 00:00:36,160 --> 00:00:38,860 Og så hvis vi har pyramide være høyere enn det, 17 00:00:38,860 --> 00:00:41,290 det kan gjøre dette rare ting hvor det går utenfor skjermen. 18 00:00:41,290 --> 00:00:45,140 Og du vet, hva gjør det betyr i sammenheng, ikke sant? 19 00:00:45,140 --> 00:00:48,880 >> Er betydningen av 23 umiddelbart åpen til noen som ser på programmet 20 00:00:48,880 --> 00:00:51,550 og kanskje har en annen størrelse terminalvindu? 21 00:00:51,550 --> 00:00:52,330 Sannsynligvis ikke. 22 00:00:52,330 --> 00:00:53,080 Det virker som, OK. 23 00:00:53,080 --> 00:00:55,005 Vel, hvorfor er det bare mindre enn 23? 24 00:00:55,005 --> 00:00:56,880 Generelt er det slag av en dårlig vane faktisk 25 00:00:56,880 --> 00:00:58,940 å skrive konstanter inn koden din. 26 00:00:58,940 --> 00:01:02,190 Ved å gjøre det, når du faktisk gjør skrive en konstant i koden din, 27 00:01:02,190 --> 00:01:05,630 det er noen ganger referert til som bruker magiske tall, som er noe 28 00:01:05,630 --> 00:01:08,030 vi vanligvis ønsker å prøve og unngå. 29 00:01:08,030 --> 00:01:12,830 >> For eksempel, la oss ta en titt på dette enkle funksjon her. 30 00:01:12,830 --> 00:01:15,726 Tydeligvis er det ingen data type i C kalles kort eller dekk. 31 00:01:15,726 --> 00:01:16,600 Så bare bære over med meg. 32 00:01:16,600 --> 00:01:18,910 Det er en liten bit av pseudo blandet inn her. 33 00:01:18,910 --> 00:01:21,050 Dette er en funksjon som kalles håndtere kort som tilsynelatende 34 00:01:21,050 --> 00:01:26,570 tar en kortstokk som parameter, og vilje utgang til meg et enkelt kort. 35 00:01:26,570 --> 00:01:30,990 >> Og jeg gjør noe her hvor jeg har en løkke som går 0-52, 36 00:01:30,990 --> 00:01:33,394 og jeg håndtere et kort. 37 00:01:33,394 --> 00:01:35,310 Vel, vi har fått en magisk Tallet i her, ikke sant. 38 00:01:35,310 --> 00:01:38,790 Ser du hva det magiske tallet er? 39 00:01:38,790 --> 00:01:42,280 Eller enda viktigere, gjør du se hva problemet er her? 40 00:01:42,280 --> 00:01:44,310 Særlig hvis dette er bare en funksjon 41 00:01:44,310 --> 00:01:48,030 i en egen fil i en mappen som inneholder 42 00:01:48,030 --> 00:01:49,970 en haug med forskjellige filer, som hver for seg 43 00:01:49,970 --> 00:01:51,670 gjør en annen ting til en kortstokk. 44 00:01:51,670 --> 00:01:57,310 Kanskje det stokker dem, eller omhandler en hånd av fem kort i stedet for ett enkelt kort. 45 00:01:57,310 --> 00:01:59,420 >> Ser du hva Problemet kan være her? 46 00:01:59,420 --> 00:02:03,220 Ser du det magiske tallet Jeg har sprøytet inn koden? 47 00:02:03,220 --> 00:02:04,390 Det er 52, ikke sant. 48 00:02:04,390 --> 00:02:06,440 >> Liker, intuitivt du sikkert vet, OK. 49 00:02:06,440 --> 00:02:09,740 Som en standard kortstokk med kort inneholder 52 kort. 50 00:02:09,740 --> 00:02:12,570 Men i vårt program, det er bare slags flyter rundt der inne. 51 00:02:12,570 --> 00:02:15,280 Det er som plutselig er det en 52. 52 00:02:15,280 --> 00:02:18,290 >> En måte å løse dette Problemet er å gjøre dette. 53 00:02:18,290 --> 00:02:22,724 Vi er veldig eksplisitt nå roper dekk størrelse som 52. 54 00:02:22,724 --> 00:02:25,390 Det gir det litt mer intuitivt betyr når du er i for loop 55 00:02:25,390 --> 00:02:28,650 senere vi da si, jeg er mindre enn dekk størrelse. 56 00:02:28,650 --> 00:02:32,666 Det virker bare bedre enn å si 52. 57 00:02:32,666 --> 00:02:34,290 Nå er dette løser faktisk problemet. 58 00:02:34,290 --> 00:02:38,460 Det gir noen symbolske noe som betyr at vi hele tiden. 59 00:02:38,460 --> 00:02:40,820 Men det gjør slags faktisk introdusere et annet problem 60 00:02:40,820 --> 00:02:43,770 som kanskje ikke er umiddelbart åpenbare. 61 00:02:43,770 --> 00:02:45,859 Selv om denne variabelen erklæres globally-- 62 00:02:45,859 --> 00:02:47,650 Husker du hva det betyr at når vi erklærer 63 00:02:47,650 --> 00:02:50,500 en variabel globalt versus lokalt? 64 00:02:50,500 --> 00:02:53,340 Selv om vi erklære en variabel globalt, hva om det er 65 00:02:53,340 --> 00:02:55,500 en annen funksjon vår pakke med funksjoner 66 00:02:55,500 --> 00:02:59,750 som omhandler kort manipulasjon at utilsiktet endrer dekkstørrelse, 67 00:02:59,750 --> 00:03:02,727 eller det øker den ved En eller reduserer den ved en. 68 00:03:02,727 --> 00:03:04,060 Det kan stave problemer, ikke sant? 69 00:03:04,060 --> 00:03:08,261 Spesielt hvis vi har å gjøre med et sett kort hvor shuffling full dekk 70 00:03:08,261 --> 00:03:08,760 er nødvendig. 71 00:03:08,760 --> 00:03:12,804 Hvis dekk størrelse er redusert av en, for eksempel til 51, 72 00:03:12,804 --> 00:03:14,970 vi faktisk ikke shuffling alle kortene muligens. 73 00:03:14,970 --> 00:03:16,500 Vi drar en av dem ut. 74 00:03:16,500 --> 00:03:21,680 Og at verdien kan kanskje være spådd eller utnyttes av en dårlig skuespiller. 75 00:03:21,680 --> 00:03:24,920 >> C gir det som kalles en preprocessor direktiv som 76 00:03:24,920 --> 00:03:27,764 er også kalt en makro for skape symbolske konstanter. 77 00:03:27,764 --> 00:03:30,180 Og faktisk, har du allerede sett en preprosessor direktivet 78 00:03:30,180 --> 00:03:32,916 selv om du ikke har hørt det heter det med # include. 79 00:03:32,916 --> 00:03:37,150 Det er et annet eksempel på en makro eller preprosessor direktivet. 80 00:03:37,150 --> 00:03:41,290 >> Måten å opprette symbolske konstanter, eller gi et navn til en konstant 81 00:03:41,290 --> 00:03:43,740 slik at den har mer betydning, er som følger. 82 00:03:43,740 --> 00:03:47,030 #define, navn, utskifting. 83 00:03:47,030 --> 00:03:49,140 Veldig viktig side her virkelig rask. 84 00:03:49,140 --> 00:03:54,180 Ikke legg et semikolon på slutten av dine #defines. 85 00:03:54,180 --> 00:03:57,310 Så det er #define, navn, utskifting. 86 00:03:57,310 --> 00:03:59,540 >> Når programmet er kompilert, hva som faktisk skjer 87 00:03:59,540 --> 00:04:01,740 er kompilatoren hvis du går å gå gjennom koden din 88 00:04:01,740 --> 00:04:06,770 og erstatte alle forekomster av ordet "navn" med hva du 89 00:04:06,770 --> 00:04:08,860 satt som erstatning. 90 00:04:08,860 --> 00:04:13,060 Analogt, hvis #include er liksom av lik kopiere og lime inn, 91 00:04:13,060 --> 00:04:15,700 deretter #define er liksom lignende for å finne og erstatte, 92 00:04:15,700 --> 00:04:19,180 Hvis du noen gang har brukt denne funksjonen i en tekstbehandlingsprogram, for eksempel. 93 00:04:19,180 --> 00:04:26,345 >> Så for eksempel, hvis jeg #define pi som 3.14159265, 94 00:04:26,345 --> 00:04:28,720 hvis du er bedre matematisk tilbøyelig og du plutselig 95 00:04:28,720 --> 00:04:31,640 se 3.14159265 flying rundt i koden, 96 00:04:31,640 --> 00:04:33,517 har du sannsynligvis vet at det er snakk om pi. 97 00:04:33,517 --> 00:04:35,850 Men kanskje vi kan gi det en litt mer symbolsk betydning. 98 00:04:35,850 --> 00:04:39,850 Og vi kan i stedet si #define pi som at munnfull av tall 99 00:04:39,850 --> 00:04:42,110 at jeg ikke kommer til å holde lese om og om igjen. 100 00:04:42,110 --> 00:04:45,560 >> Og hva kommer til å skje da på kompilering er når programmet er 101 00:04:45,560 --> 00:04:48,530 kompilert, det første som vil skje er det vil gå gjennom 102 00:04:48,530 --> 00:04:51,520 og det vil erstatte hver gang det ser kapital P, kapital I, 103 00:04:51,520 --> 00:04:55,610 det vil bokstavelig talt erstatte det med 3.14 og så videre, slik at du 104 00:04:55,610 --> 00:04:58,090 trenger ikke å skrive det hver tid mens programmet fortsatt 105 00:04:58,090 --> 00:05:00,631 har funksjonalitet som du forvente, fordi du jobber 106 00:05:00,631 --> 00:05:05,090 med manipulering, multiplisere, dele, uansett hva det er ved pi. 107 00:05:05,090 --> 00:05:08,230 >> Man er ikke begrenset til denne erstatning for nummere. 108 00:05:08,230 --> 00:05:12,279 For eksempel kan jeg #define Kurset som strengen CS50. 109 00:05:12,279 --> 00:05:14,070 I dette tilfelle, når Programmet er utarbeidet, 110 00:05:14,070 --> 00:05:16,236 #define vil gå gjennom kode, bytter hver gang 111 00:05:16,236 --> 00:05:19,900 det ser "kurs" med strengen CS50. 112 00:05:19,900 --> 00:05:21,720 >> Du vil merke her også at jeg ofte 113 00:05:21,720 --> 00:05:26,090 #define all min definert symbolsk konstanter, så å si, 114 00:05:26,090 --> 00:05:28,130 er alltid i store bokstaver. 115 00:05:28,130 --> 00:05:28,960 Det er en konvensjon. 116 00:05:28,960 --> 00:05:30,170 Det er ikke nødvendig. 117 00:05:30,170 --> 00:05:33,900 Grunnen generelt folk vil bruke alle hovedsteder når de er #defining 118 00:05:33,900 --> 00:05:37,590 er bare å gjøre det veldig klart at denne spesielle element av min kode 119 00:05:37,590 --> 00:05:38,820 er en definert konstant. 120 00:05:38,820 --> 00:05:43,730 Hvis det var små bokstaver, er det mulig at den kan forveksles med en variabel. 121 00:05:43,730 --> 00:05:46,120 Og det er sannsynligvis ikke en god ting å gjøre. 122 00:05:46,120 --> 00:05:48,910 >> Så dette Løsningen er mye bedre 123 00:05:48,910 --> 00:05:50,550 enn noen av de foregående. 124 00:05:50,550 --> 00:05:59,950 Hvis jeg først #define dekk størrelse 52, deretter nå min bruk av 52, eller dekk størrelse her, 125 00:05:59,950 --> 00:06:01,850 er mye mer intuitivt og mye tryggere. 126 00:06:01,850 --> 00:06:03,280 Du kan ikke manipulere en konstant. 127 00:06:03,280 --> 00:06:05,259 Du kan ikke si 52 pluss pluss. 128 00:06:05,259 --> 00:06:06,800 Det er ikke til å konvertere den til 53. 129 00:06:06,800 --> 00:06:09,390 Du kan ikke endre 52 til noe. 130 00:06:09,390 --> 00:06:12,470 >> Du kan endre en variabel hvis verdi er 52, 131 00:06:12,470 --> 00:06:14,870 som var den første fix vi hadde før. 132 00:06:14,870 --> 00:06:17,000 Og du kan øke denne variabelen til 53. 133 00:06:17,000 --> 00:06:21,100 Men du kan ikke si 52 pluss pluss og har som plutselig slår 52 til 53. 134 00:06:21,100 --> 00:06:23,350 52 er alltid 52. 135 00:06:23,350 --> 00:06:28,860 Og så du kan ikke utilsiktet kan endre dekk størrelse her ved å manipulere den, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> En annen god side Effekten av dette er skjønt 138 00:06:32,390 --> 00:06:38,310 at du er klar over at ikke alle land rundt om i verden 139 00:06:38,310 --> 00:06:40,690 bruke en kortstokk med størrelse 52? 140 00:06:40,690 --> 00:06:45,630 For eksempel er det veldig vanlig i Tyskland å bruke en dekkstørrelse på 32, 141 00:06:45,630 --> 00:06:48,020 hvor de stripe ut noen av lavere verdi kortene. 142 00:06:48,020 --> 00:06:50,960 Og i dette tilfellet, I ønsket å port min suite 143 00:06:50,960 --> 00:06:55,390 av funksjoner som omhandler kort manipulasjon til Tyskland. 144 00:06:55,390 --> 00:06:59,440 Jeg kunne i første omgang vi viste, må gå og erstatte 145 00:06:59,440 --> 00:07:03,570 alle forekomster av 52 i min kode med 32. 146 00:07:03,570 --> 00:07:07,940 >> Men her, hvis jeg #define dekk størrelse som 32 på toppen av min kode, 147 00:07:07,940 --> 00:07:11,730 hvis jeg trenger å endre det, kan jeg bare gå og endre det én ting. 148 00:07:11,730 --> 00:07:15,010 Rekompilere koden min, og alle plutselig det forplanter seg gjennom. 149 00:07:15,010 --> 00:07:18,850 Faktisk kan vi endre dekk størrelsen til en verdi vi ønsker. 150 00:07:18,850 --> 00:07:22,500 >> Kan jeg interessere deg i en Spillet av dekk størrelse pickup? 151 00:07:22,500 --> 00:07:23,430 >> Jeg er Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Og dette er CS50. 153 00:07:25,840 --> 00:07:27,772