1 00:00:00,000 --> 00:00:02,350 [MŪZIKA SKAN] 2 00:00:05,444 --> 00:00:06,360 DAGS LOIDS: Labi. 3 00:00:06,360 --> 00:00:07,770 Dīvaina tēma, vai ne? 4 00:00:07,770 --> 00:00:09,050 Maģiskie skaitļi. 5 00:00:09,050 --> 00:00:12,012 Ko viņš domā, runājot par maģiskajiem skaitļiem? 6 00:00:12,012 --> 00:00:14,336 Dažās programmās, kuras līdz šim esam rakstījuši CS50 valodā, ir 7 00:00:14,336 --> 00:00:16,660 bijuši dīvaini skaitļi. 8 00:00:16,660 --> 00:00:19,680 Varbūt tādu iemeslu dēļ, kurus mēs šobrīd līdz galam neizprotam. 9 00:00:19,680 --> 00:00:23,950 Piemēram, Mario uzdevumā mēs ierobežojām piramīdas augstumu ar 23. 10 00:00:23,950 --> 00:00:26,880 Mēs skaidri pateicām, ka nevar pārsniegt 23. 11 00:00:26,880 --> 00:00:28,702 Bet ko nozīmē 23? 12 00:00:28,702 --> 00:00:31,188 Ja jūs uzmanīgi izlasījāt specifikācijas, iespējams, esat pamanījuši, 13 00:00:31,188 --> 00:00:33,674 ka iemesls, kāpēc mēs ierobežojām to ar 23, ir tāpēc, ka termināļa 14 00:00:33,674 --> 00:00:36,160 loga standarta augstums ir 24. 15 00:00:36,160 --> 00:00:38,725 Un tāpēc, ja piramīdai jābūt garākai par šo, tā var radīt šo dīvaino 16 00:00:38,725 --> 00:00:41,290 parādību, kad tā nokrīt no ekrāna. 17 00:00:41,290 --> 00:00:45,140 Un jūs zināt, ko tas nozīmē kontekstā, vai ne? 18 00:00:45,140 --> 00:00:48,345 Vai 23 nozīme uzreiz ir acīmredzama kādam, kurš skatās uz jūsu 19 00:00:48,345 --> 00:00:51,550 programmu, un varbūt viņam ir cita izmēra termināļa logs? 20 00:00:51,550 --> 00:00:52,330 Visticamāk, ka ne. 21 00:00:52,330 --> 00:00:53,080 Tas izskatās ok., labi. 22 00:00:53,080 --> 00:00:55,005 Nu, kāpēc tad tikai tas ir mazāks par 23? 23 00:00:55,005 --> 00:00:58,940 Kopumā rakstīt konstantes savā kodā ir slikts ieradums. 24 00:00:58,940 --> 00:01:01,970 Tā darot, kad jūs faktiski savā kodā ierakstāt konstanti, to dažreiz 25 00:01:01,970 --> 00:01:05,000 sauc par maģisko skaitļu izmantošanu, no kā mēs parasti vēlamies 26 00:01:05,000 --> 00:01:08,030 izvairīties. 27 00:01:08,030 --> 00:01:12,830 Piemēram, apskatīsim šeit šo vienkāršo funkciju. 28 00:01:12,830 --> 00:01:15,726 Acīmredzot C valodā nav datu tipa, ko sauc par kārti vai kavu 29 00:01:15,726 --> 00:01:16,600 Tāpēc vienkārši pacietieties ar mani. 30 00:01:16,600 --> 00:01:18,910 Šeit mazliet ir iejaukts pseidokods. 31 00:01:18,910 --> 00:01:22,740 Šī ir funkcija, ko sauc par deal card . Tā šķietami izmanto kavu kā 32 00:01:22,740 --> 00:01:26,570 parametru un izvada man vienu karti. 33 00:01:26,570 --> 00:01:29,982 Un es šeit daru kaut ko tādu, kur man ir cilpa, kas iet no 0 līdz 52, 34 00:01:29,982 --> 00:01:33,394 un es izdalu kārti. 35 00:01:33,394 --> 00:01:35,310 Nu, mums šeit ir maģiskais skaitlis, pareizi. 36 00:01:35,310 --> 00:01:38,790 Vai redzat, kas ir maģiskais skaitlis? 37 00:01:38,790 --> 00:01:42,280 Vai vēl svarīgāk: vai jūs redzat, kur ir problēma? 38 00:01:42,280 --> 00:01:46,975 It īpaši, ja šī ir vienīgā datnes funkcija mapē, kurā ir virkne 39 00:01:46,975 --> 00:01:51,670 dažādu datņu, katra no kurām veic savu darbību kāršu komplektā. 40 00:01:51,670 --> 00:01:57,310 Varbūt tā tās sajauc vai izdala piecas kārtis, nevis vienu kārti. 41 00:01:57,310 --> 00:01:59,420 Vai redzat, kāda šeit varētu būt problēma? 42 00:01:59,420 --> 00:02:03,220 Vai redzat maģisko skaitli, ko esmu ievadījis kodā? 43 00:02:03,220 --> 00:02:04,390 Tas ir 52, pareizi. 44 00:02:04,390 --> 00:02:06,440 Tāpat kā intuitīvi jūs droši vien zināt, labi. 45 00:02:06,440 --> 00:02:09,740 Ka standarta kāršu komplektā ir 52 kārtis. 46 00:02:09,740 --> 00:02:12,570 Bet mūsu programmā tas vienkārši tur peld. 47 00:02:12,570 --> 00:02:15,280 It kā pēkšņi tur ir 52. 48 00:02:15,280 --> 00:02:18,290 Viens veids, kā atrisināt šo problēmu - ir to darīt. 49 00:02:18,290 --> 00:02:22,724 Mēs ļoti skaidri tagad sakām, ka kāršu komplektā ir 52 kārtis. 50 00:02:22,724 --> 00:02:25,687 Tas piešķir tam nedaudz intuitīvāku nozīmi, kad for cilpā vēlāk mēs 51 00:02:25,687 --> 00:02:28,650 sakām: i ir mazāks par kavas izmēru. 52 00:02:28,650 --> 00:02:32,666 Tas vienkārši šķiet labāk nekā teikt 52. 53 00:02:32,666 --> 00:02:34,290 Tagad tas faktiski atrisina problēmu. 54 00:02:34,290 --> 00:02:38,460 Konstantei tas piešķir simbolisku nozīmi. 55 00:02:38,460 --> 00:02:43,770 Bet tas faktiski rada citu problēmu, kas var nebūt uzreiz pamanāma. 56 00:02:43,770 --> 00:02:47,135 Pat ja šis mainīgais ir deklarēts globāli. Vai atceraties, ko tas 57 00:02:47,135 --> 00:02:50,500 nozīmē, ja mēs deklarējam mainīgo globāli pret lokāli? 58 00:02:50,500 --> 00:02:53,556 Pat ja mēs deklarējam mainīgo globāli, kā būtu, ja mūsu funkciju 59 00:02:53,556 --> 00:02:56,613 komplektā ir cita funkcija, kas nodarbojas ar manipulācijām ar 60 00:02:56,613 --> 00:02:59,670 kārtīm? Kas netīšām maina kavas izmēru vai palielina to par 1 vai 61 00:02:59,670 --> 00:03:02,727 samazina par 1? 62 00:03:02,727 --> 00:03:04,060 Tas varētu radīt problēmas, vai ne? 63 00:03:04,060 --> 00:03:06,410 It īpaši, ja mums ir darīšana ar kāršu komplektu, kurā ir jāsajauc 64 00:03:06,410 --> 00:03:08,760 visa kava. 65 00:03:08,760 --> 00:03:11,865 Ja kavas izmērs tiek samazināts par 1, piemēram, līdz 51, mēs, 66 00:03:11,865 --> 00:03:14,970 iespējams, nesajaucam visas kārtis. 67 00:03:14,970 --> 00:03:16,500 Mēs atstājam vienu no tām ārpusē. 68 00:03:16,500 --> 00:03:21,680 Un šo vērtību varbūt varētu paredzēt vai izmantot slikts aktors. 69 00:03:21,680 --> 00:03:24,722 C valoda nodrošina tā saukto priekšprocesora direktīvu, ko simbolisku 70 00:03:24,722 --> 00:03:27,764 konstantu izveidošanā sauc arī par makro. 71 00:03:27,764 --> 00:03:30,340 Un patiesībā jūs jau esat redzējuši priekšprocesora direktīvu, pat ja 72 00:03:30,340 --> 00:03:32,916 neesat dzirdējuši to saucam ar #include. 73 00:03:32,916 --> 00:03:37,150 Tas ir vēl viens makro vai priekšprocesora direktīvas piemērs. 74 00:03:37,150 --> 00:03:40,445 Veids, kā izveidot simboliskas konstantes vai piešķirt konstantei 75 00:03:40,445 --> 00:03:43,740 nosaukumu, lai tai būtu lielāka nozīme, ir šāds: 76 00:03:43,740 --> 00:03:47,030 #define, name, replacement. 77 00:03:47,030 --> 00:03:49,140 Tiešām svarīgs komentārs ļoti ātri. 78 00:03:49,140 --> 00:03:54,180 #defines beigās nelieciet semikolu. 79 00:03:54,180 --> 00:03:57,310 Tātad tas ir #define, name, replacement. 80 00:03:57,310 --> 00:04:01,160 Kad jūsu programma ir kompilēta, tas, kas patiesībā notiek, ir 81 00:04:01,160 --> 00:04:05,010 sekojošs: kompilators if iet cauri jūsu kodam un aizstāj katru vārda 82 00:04:05,010 --> 00:04:08,860 name gadījumu ar to, ko ievietojat kā replacement. 83 00:04:08,860 --> 00:04:12,300 Līdzīgi, ja #include ir līdzīga kopēšanai un ielīmēšanai, tad #define 84 00:04:12,300 --> 00:04:15,740 ir līdzīga meklēšanai un aizstāšanai, ja, piemēram, kādreiz esat 85 00:04:15,740 --> 00:04:19,180 izmantojis šo līdzekli tekstapstrādes programmā. 86 00:04:19,180 --> 00:04:23,959 Piemēram, ja es #define pi kā 3.14159265, ja jums ir labamatemātiskā 87 00:04:23,959 --> 00:04:28,738 nosliece un pēkšņi savā kodā redzat lidojam 3.14159265, jūs droši 88 00:04:28,738 --> 00:04:33,517 vien zināt, ka runa iet par pi. 89 00:04:33,517 --> 00:04:35,850 Bet varbūt mēs tam varam piešķirt mazliet simboliskāku nozīmi. 90 00:04:35,850 --> 00:04:38,980 Tā vietā mēs varam teikt #define pi kā skaitļu gabalu, ko es netaisos 91 00:04:38,980 --> 00:04:42,110 lasīt atkal un atkal. 92 00:04:42,110 --> 00:04:45,392 Un tas, kas notiks pēc tam - kompilēšanas laikā, tad, kad programma 93 00:04:45,392 --> 00:04:48,675 tiks kompilēta: pirmā lieta, kas notiks, ir tas, ka katru reizi ejot 94 00:04:48,675 --> 00:04:51,958 cauri un redzot lielo P, lielo I burtu, tā tos aizstās, tā burtiski 95 00:04:51,958 --> 00:04:55,241 aizstās tos ar 3.14 un tā tālāk.Tā, lai jums tie nebūtu jāievada 96 00:04:55,241 --> 00:04:58,524 katru reizi, jo programmai ir funkcionalitāte, ko jūs sagaidāt, kamēr 97 00:04:58,524 --> 00:05:01,807 jūs strādājat ar manipulācijām, reizināšanu, dalīšanu, jebko kas ir 98 00:05:01,807 --> 00:05:05,090 ar pi. 99 00:05:05,090 --> 00:05:08,230 Jūs neaprobežojaties tikai ar šo skaitļu aizstāšanu. 100 00:05:08,230 --> 00:05:12,279 Piemēram, es varētu #define KURSU kā VIRKNI CS50. 101 00:05:12,279 --> 00:05:16,089 Šajā gadījumā, kad programma ir kompilēta, #define izies cauri kodam, 102 00:05:16,089 --> 00:05:19,900 katru reizi, redzot KURSU,tas aizstās to ar VIRKNI CS50. 103 00:05:19,900 --> 00:05:24,015 Šeit jūs arī pamanīsiet, ka es bieži #define visas savas definētās 104 00:05:24,015 --> 00:05:28,130 simboliskās konstantes, tā sakot, vienmēr ar lielajiem burtiem. 105 00:05:28,130 --> 00:05:28,960 Tā ir konvencija. 106 00:05:28,960 --> 00:05:30,170 Tas nav obligāti. 107 00:05:30,170 --> 00:05:33,053 Iemesls, kāpēc cilvēki, #definējot, parasti izmantos lielos burtus, 108 00:05:33,053 --> 00:05:35,936 ir tikai tāpēc, lai būtu tiešām skaidrs, ka šis konkrētais mana koda 109 00:05:35,936 --> 00:05:38,820 elements ir definētā konstante. 110 00:05:38,820 --> 00:05:43,730 Ja tas bija ar mazajiem burtiem, iespējams, to var sajaukt ar mainīgo. 111 00:05:43,730 --> 00:05:46,120 Un tas, iespējams, nav labi. 112 00:05:46,120 --> 00:05:48,335 Tātad šis konkrētais risinājums ir daudz labāks, nekā jebkurš no 113 00:05:48,335 --> 00:05:50,550 iepriekšējiem. 114 00:05:50,550 --> 00:05:56,200 Ja es vispirms #define kavas izmēru 52, tad tagad mana 52 vai kavas 115 00:05:56,200 --> 00:06:01,850 izmēra izmantošana šeit ir daudz intuitīvāka un daudz drošāka. 116 00:06:01,850 --> 00:06:03,280 Jūs nevarat manipulēt ar konstanti. 117 00:06:03,280 --> 00:06:05,259 Nevar teikt, ka 52 plus plus. 118 00:06:05,259 --> 00:06:06,800 Tas nepārvērsīs to par 53. 119 00:06:06,800 --> 00:06:09,390 Jūs nevarat mainīt 52 uz kaut ko. 120 00:06:09,390 --> 00:06:12,130 Varat mainīt mainīgo, kura vērtība ir 52. Tas bija pirmais labojums, 121 00:06:12,130 --> 00:06:14,870 kas mums bija iepriekš. 122 00:06:14,870 --> 00:06:17,000 Un jūs varētu palielināt šo mainīgo līdz 53. 123 00:06:17,000 --> 00:06:19,050 Bet jūs nevarat teikt, ka 52 plus plus, un tas pēkšņi pārvērš 52 par 124 00:06:19,050 --> 00:06:21,100 53. 125 00:06:21,100 --> 00:06:23,350 52 vienmēr ir 52. 126 00:06:23,350 --> 00:06:29,130 Un tāpēc jūs nevarat nejauši mainīt kāršu kavas izmēru, manipulējot 127 00:06:29,130 --> 00:06:34,910 ar to. Tomēr vēl viena laba blakusparādība ir tāda, ka jūs zināt, ka 128 00:06:34,910 --> 00:06:40,690 ne visās pasaules valstīs tiek izmantots 52kāršu komplekts? 129 00:06:40,690 --> 00:06:44,355 Piemēram, Vācijā patiešām ir ierasts izmantot 32 kāršu kavu, kurā 130 00:06:44,355 --> 00:06:48,020 tiek noņemtas dažas no zemākas vērtības kārtīm. 131 00:06:48,020 --> 00:06:51,705 Un šajā gadījumā es gribēju pārnest savu funkciju komplektu, kas 132 00:06:51,705 --> 00:06:55,390 nodarbojas ar kāršu manipulācijām, uz Vāciju. 133 00:06:55,390 --> 00:06:59,480 Pirmajā reizē, ko mēs parādījām, savā kodā es varētu ņemt un aizstāt 134 00:06:59,480 --> 00:07:03,570 visus 52 gadījumus ar 32. 135 00:07:03,570 --> 00:07:07,650 Bet šeit, ja es sava koda pašā augšdaļā #define kavas izmēru kā 32, 136 00:07:07,650 --> 00:07:11,730 ja man tas ir jāmaina, tad es varu vienkārši ņemt un mainīt to. 137 00:07:11,730 --> 00:07:15,010 Pārkompilēju manu kodu, un pēkšņi tas tiek pavairots. 138 00:07:15,010 --> 00:07:18,850 Faktiski mēs varam mainīt kavas izmēru uz jebkuru vēlamo vērtību. 139 00:07:18,850 --> 00:07:22,50 Vai varu jūs ieinteresēt ar kavas izmēra pick-up spēli? 140 00:07:22,500 --> 00:07:23,430 Es esmu Dags Loids. 141 00:07:23,430 --> 00:07:25,840 Un tas ir CS50.