1 00:00:00,000 --> 00:00:02,350 >> [MUSIC PLAYING] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Bütün hüququ. 4 00:00:06,360 --> 00:00:07,770 Qəribə mövzu cür, sağ? 5 00:00:07,770 --> 00:00:09,050 Magic nömrələri. 6 00:00:09,050 --> 00:00:12,012 O zaman o nə deməkdir doe sehrli nömrələri haqqında söhbət? 7 00:00:12,012 --> 00:00:14,220 Yaxşı, proqramların bəzi biz CS50 yazdıq ki, 8 00:00:14,220 --> 00:00:16,660 indiyə qədər bəzi qəribə var nömrələri cür onlara atılan. 9 00:00:16,660 --> 00:00:19,680 Yəqin ki, səbəblərə görə biz deyil tamamilə indi başa düşürük. 10 00:00:19,680 --> 00:00:23,950 Məsələn, Mario problem, biz 23 piramida hündürlüyü başıbağlı. 11 00:00:23,950 --> 00:00:26,880 Biz açıq-aydın ifadə etdi daha yüksək 23 getmək bilməz. 12 00:00:26,880 --> 00:00:28,702 >> Amma 23 nə deməkdir? 13 00:00:28,702 --> 00:00:30,410 Yaxşı, siz oxumaq əgər Diqqətlə sizə spec 14 00:00:30,410 --> 00:00:32,493 ki, görmüşəm bilər səbəbi 23 onu başıbağlı 15 00:00:32,493 --> 00:00:36,160 standart hündürlüyü çünki bir terminal pəncərə 24. 16 00:00:36,160 --> 00:00:38,860 Və biz əgər piramida daha taller olmaq, 17 00:00:38,860 --> 00:00:41,290 Bu qəribə şey ola bilər harada ekran off çalışır. 18 00:00:41,290 --> 00:00:45,140 Bildiyiniz Və nə doğru, kontekstində deməkdir? 19 00:00:45,140 --> 00:00:48,880 >> 23 dərhal aydın mənası kimsə olan proqram baxır 20 00:00:48,880 --> 00:00:51,550 və bəlkə başqa bir var size terminal pəncərə? 21 00:00:51,550 --> 00:00:52,330 Yəqin ki, deyil. 22 00:00:52,330 --> 00:00:53,080 OK, kimi görünür. 23 00:00:53,080 --> 00:00:55,005 Yaxşı, niyə yalnız az 23-dən? 24 00:00:55,005 --> 00:00:56,880 Ümumiyyətlə, bu cür var pis vərdiş həqiqətən 25 00:00:56,880 --> 00:00:58,940 Sizin kodu daxil sabitləri yazmaq. 26 00:00:58,940 --> 00:01:02,190 Siz, həqiqətən, nə zaman, bunu Sizin kodu daxil daimi yazmaq 27 00:01:02,190 --> 00:01:05,630 istifadə edərək kimi istinad bəzən var sehrli nömrələri, bir şey deyil 28 00:01:05,630 --> 00:01:08,030 biz ümumiyyətlə cəhd və qarşısını almaq istəyirik. 29 00:01:08,030 --> 00:01:12,830 >> Məsələn, bir nəzər salaq Burada bu sadə funksiyası. 30 00:01:12,830 --> 00:01:15,726 Aydındır ki, heç bir məlumat yoxdur C tipli kart və ya göyərtə çağırıb. 31 00:01:15,726 --> 00:01:16,600 Belə ki, yalnız mənimlə daşıyırlar. 32 00:01:16,600 --> 00:01:18,910 Bu bir az var pseudocode burada qarışdırılır. 33 00:01:18,910 --> 00:01:21,050 Bu adlı bir funksiyası var ki, yəqin kart məşğul 34 00:01:21,050 --> 00:01:26,570 onun parametri kimi bir göyərtə edir və Mənə çıxış edəcək bir kart. 35 00:01:26,570 --> 00:01:30,990 >> Mən burada mən bir şey edirəm , 0-dan 52 çalışan bir loop var 36 00:01:30,990 --> 00:01:33,394 və mən bir kart məşğul. 37 00:01:33,394 --> 00:01:35,310 Bəli, biz bir sehrli var burada sayı, doğru. 38 00:01:35,310 --> 00:01:38,790 Siz sehrli sayı nə görürsünüz? 39 00:01:38,790 --> 00:01:42,280 Və ya daha əhəmiyyətlisi, siz problem burada nə görmək? 40 00:01:42,280 --> 00:01:44,310 Xüsusilə bu halda yalnız bir funksiyası var 41 00:01:44,310 --> 00:01:48,030 bir öz fayl ehtiva qovluq 42 00:01:48,030 --> 00:01:49,970 müxtəlif bir dəstə faylları hər hansı 43 00:01:49,970 --> 00:01:51,670 kartlar göyərtə başqa şey yoxdur. 44 00:01:51,670 --> 00:01:57,310 Bəlkə onları shuffles, və ya bir tərəfdən məşğul beş kartları əvəzinə bir kart. 45 00:01:57,310 --> 00:01:59,420 >> Siz nə görürsünüz problem burada ola bilər? 46 00:01:59,420 --> 00:02:03,220 Siz sehrli sayı görürsünüzmü Mən kodu enjekte etdik? 47 00:02:03,220 --> 00:02:04,390 Bu doğru, 52 var. 48 00:02:04,390 --> 00:02:06,440 >> Kimi, daxilən siz yəqin ki, bilirsiniz, OK. 49 00:02:06,440 --> 00:02:09,740 Standart göyərtə kimi kartları 52 kartları ehtiva edir. 50 00:02:09,740 --> 00:02:12,570 Amma bizim proqramda, yalnız var cür orada ətrafında üzən. 51 00:02:12,570 --> 00:02:15,280 Qəflətən 52 var kimi deyil. 52 00:02:15,280 --> 00:02:18,290 >> Bu həll etmək üçün bir yolu problem bunu edir. 53 00:02:18,290 --> 00:02:22,724 Biz indi çox açıq-aydın istəyirik 52 kimi göyərtə ölçüsü səslənərək. 54 00:02:22,724 --> 00:02:25,390 Bu bir az daha asan verir zaman loop üçün mənası 55 00:02:25,390 --> 00:02:28,650 biz sonra deyirəm sonra göyərtə ölçüsü azdır. 56 00:02:28,650 --> 00:02:32,666 Bu, sadəcə 52 deyərək daha yaxşı görünür. 57 00:02:32,666 --> 00:02:34,290 İndi bu həqiqətən problemi həll etmir. 58 00:02:34,290 --> 00:02:38,460 Bəzi rəmzi verir daimi mənasını. 59 00:02:38,460 --> 00:02:40,820 Amma bu cür həqiqətən yoxdur başqa bir problem təqdim 60 00:02:40,820 --> 00:02:43,770 ki, dərhal aydın ola bilər. 61 00:02:43,770 --> 00:02:45,859 Hətta bu dəyişən əgər globally-- elan 62 00:02:45,859 --> 00:02:47,650 Siz nə geri yoxdur biz bəyan zaman deməkdir 63 00:02:47,650 --> 00:02:50,500 qlobal yerli qarşı dəyişən? 64 00:02:50,500 --> 00:02:53,340 Biz bir dəyişən elan bile qlobal, nə var, əgər 65 00:02:53,340 --> 00:02:55,500 başqa funksiyası funksiyaları bizim suite 66 00:02:55,500 --> 00:02:59,750 kart manipulyasiya ilə məşğul ki səhvən, göyərtə ölçüsü dəyişir 67 00:02:59,750 --> 00:03:02,727 və ya onu artırır 1 və ya 1 ilə azalır. 68 00:03:02,727 --> 00:03:04,060 Bu doğru, narahatlıq sehr bilər? 69 00:03:04,060 --> 00:03:08,261 Biz bir sıra ilə məşğul olduğunuz, xüsusilə də əgər kartları tam göyərtə shuffling harada 70 00:03:08,261 --> 00:03:08,760 tələb olunur. 71 00:03:08,760 --> 00:03:12,804 Göyərtə ölçüsü azalır, əgər 1, məsələn, 51, 72 00:03:12,804 --> 00:03:14,970 biz, həqiqətən, shuffling deyilik bəlkə bütün kartları. 73 00:03:14,970 --> 00:03:16,500 Biz onlardan biri tərk edirik. 74 00:03:16,500 --> 00:03:21,680 Və ki, dəyəri bəlkə ola bilər proqnozlaşdırılan və ya pis aktyor tərəfindən istismar. 75 00:03:21,680 --> 00:03:24,920 >> C deyirlər nə təmin edir preprocessor direktiv olan 76 00:03:24,920 --> 00:03:27,764 də makro adlanır simvolik sabitləri yaradılması. 77 00:03:27,764 --> 00:03:30,180 Və əslində, siz artıq var bir preprocessor direktiv görüldü 78 00:03:30,180 --> 00:03:32,916 Siz onu eşitməmişəm, hətta # daxildir ilə çağırıb. 79 00:03:32,916 --> 00:03:37,150 Bu makro bir misal var və ya preprocessor direktiv. 80 00:03:37,150 --> 00:03:41,290 >> yol simvolik sabitləri yaratmaq, və ya daimi bir ad verilməsi 81 00:03:41,290 --> 00:03:43,740 daha var ki, yəni belə. 82 00:03:43,740 --> 00:03:47,030 # müəyyən, adı, dəyişdirilməsi. 83 00:03:47,030 --> 00:03:49,140 Kənara həqiqətən vacibdir Burada həqiqətən sürətli. 84 00:03:49,140 --> 00:03:54,180 Bir nöqtəli vergül qoymaq etməyin Sizin # müəyyənləşdirir sonu. 85 00:03:54,180 --> 00:03:57,310 Belə ki Saylı, adı, əvəz edir. 86 00:03:57,310 --> 00:03:59,540 >> Proqram tərtib edildikdə, nə həqiqətən olur 87 00:03:59,540 --> 00:04:01,740 gedir, əgər compiler edir Sizin kod vasitəsilə getmək 88 00:04:01,740 --> 00:04:06,770 və hər instansiya əvəz hər hansı ilə sözü "adı" Siz 89 00:04:06,770 --> 00:04:08,860 əvəz kimi qoydu. 90 00:04:08,860 --> 00:04:13,060 Analoji, # daxildir əgər sort çıxarmaq və yapıştırma oxşar, 91 00:04:13,060 --> 00:04:15,700 sonra Saylı sort edir tapmaq və əvəz oxşar, 92 00:04:15,700 --> 00:04:19,180 Heç bir ki xüsusiyyət istifadə etdiyiniz halda söz emal proqram, misal üçün. 93 00:04:19,180 --> 00:04:26,345 >> Məsələn, əgər mən 3.14159265 kimi pi # müəyyən, 94 00:04:26,345 --> 00:04:28,720 Daha yaxşı riyazi əgər maili və birdən 95 00:04:28,720 --> 00:04:31,640 3.14159265 uçan görmək ətrafında kodu, 96 00:04:31,640 --> 00:04:33,517 Siz yəqin ki, pi söhbət bilirik. 97 00:04:33,517 --> 00:04:35,850 Amma bəlkə biz onu bir verə bilər az daha simvolik mənası. 98 00:04:35,850 --> 00:04:39,850 Və biz əvəzinə # müəyyən demək olar nömrələri ki, qurtum kimi pi 99 00:04:39,850 --> 00:04:42,110 Mən saxlamaq fikrində deyiləm ki, üzərində oxu. 100 00:04:42,110 --> 00:04:45,560 >> Və nə sonra nə olacaq proqram zaman tərtib vaxt 101 00:04:45,560 --> 00:04:48,530 tərtib, ilk şey ki, baş verəcək onun vasitəsilə getmək olacaq 102 00:04:48,530 --> 00:04:51,520 və hər zaman əvəz edəcək Bu, kapital P, kapital I görür 103 00:04:51,520 --> 00:04:55,610 bu sözün ilə əvəz edəcəyik 3.14 və s, ki, 104 00:04:55,610 --> 00:04:58,090 hər növü yoxdur vaxt hələ proqram isə 105 00:04:58,090 --> 00:05:00,631 funksionallıq var ki, Siz çalışırıq, çünki gözləyirik 106 00:05:00,631 --> 00:05:05,090 manipulyasiya ilə vurulması, Bu pi tərəfindən nə, bölünməsi. 107 00:05:05,090 --> 00:05:08,230 >> Bu məhdud deyil yalnız nömrələri üçün əvəz. 108 00:05:08,230 --> 00:05:12,279 Məsələn, mən # müəyyən edə bilər string CS50 kimi kurs. 109 00:05:12,279 --> 00:05:14,070 Bu halda, zaman proqram tərtib, 110 00:05:14,070 --> 00:05:16,236 # müəyyən keçəcəyi indeksi, hər zaman əvəz 111 00:05:16,236 --> 00:05:19,900 Bu string CS50 ilə "kursu" görür. 112 00:05:19,900 --> 00:05:21,720 >> Baş görəcəksiniz I ki, tez-tez 113 00:05:21,720 --> 00:05:26,090 # müəyyən bütün simvolik müəyyən sabitləri, belə ki, danışmaq 114 00:05:26,090 --> 00:05:28,130 bütün caps həmişə var. 115 00:05:28,130 --> 00:05:28,960 Bu konvensiya var. 116 00:05:28,960 --> 00:05:30,170 Bu lazım deyil. 117 00:05:30,170 --> 00:05:33,900 səbəbi ümumiyyətlə insanlar istifadə edəcək bütün paytaxtlarında onlar #defining edirik 118 00:05:33,900 --> 00:05:37,590 ki, yalnız bu, həqiqətən, açıq-aşkar etmək üçün edir mənim kodu bu xüsusi element 119 00:05:37,590 --> 00:05:38,820 müəyyən daimi deyil. 120 00:05:38,820 --> 00:05:43,730 Bu kiçik idi, bu mümkündür bir dəyişən səhv ola bilər. 121 00:05:43,730 --> 00:05:46,120 Və yəqin ki, var yaxşı bir şey etmək deyil. 122 00:05:46,120 --> 00:05:48,910 >> Belə ki, bu xüsusi həll daha yaxşı 123 00:05:48,910 --> 00:05:50,550 əvvəlki və ya daha. 124 00:05:50,550 --> 00:05:59,950 Mən ilk Saylı göyərtə ölçüsü 52, onda indi burada 52 və ya göyərtə ölçüsü mənim istifadə, 125 00:05:59,950 --> 00:06:01,850 bir çox daha asan və çox təhlükəsiz edir. 126 00:06:01,850 --> 00:06:03,280 Siz daimi manipulyasiya edə bilməz. 127 00:06:03,280 --> 00:06:05,259 52 plus plus deyə bilmərəm. 128 00:06:05,259 --> 00:06:06,800 53 çevirmək niyyətində deyil. 129 00:06:06,800 --> 00:06:09,390 Siz bir şey 52 dəyişə bilməz. 130 00:06:09,390 --> 00:06:12,470 >> Siz dəyişən dəyişə bilərsiniz onların dəyəri 52, 131 00:06:12,470 --> 00:06:14,870 olan biz əvvəl idi ilk fix idi. 132 00:06:14,870 --> 00:06:17,000 Və arta bilər 53 ki, dəyişən. 133 00:06:17,000 --> 00:06:21,100 Amma 52 Plus Plus və deyə bilmərəm birdən 53 daxil 52 çevirmək ki, var. 134 00:06:21,100 --> 00:06:23,350 52 həmişə 52. 135 00:06:23,350 --> 00:06:28,860 Və belə ki, təsadüfən dəyişə bilməz burada manipulyasiya ilə göyərtə ölçüsü, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Yaxşı bir tərəfi Bu baxmayaraq təsiri 138 00:06:32,390 --> 00:06:38,310 ki, bilirik ki, deyil Dünyanın bütün ölkələri 139 00:06:38,310 --> 00:06:40,690 ölçüsü 52 kartlar göyərtə istifadə? 140 00:06:40,690 --> 00:06:45,630 Məsələn, həqiqətən ümumi var Almaniya, 32 göyərtə ölçüsü istifadə etmək 141 00:06:45,630 --> 00:06:48,020 bəzi soyunmaq harada aşağı dəyəri kartları. 142 00:06:48,020 --> 00:06:50,960 Və bu halda, mən limanına mənim suite istədi 143 00:06:50,960 --> 00:06:55,390 ilə məşğul funksiyaları Almaniya kart manipulyasiya. 144 00:06:55,390 --> 00:06:59,440 Mən ilk növbədə bilər biz göstərdi, getmək və əvəz var 145 00:06:59,440 --> 00:07:03,570 32 mənim kodu 52 bütün hallarda. 146 00:07:03,570 --> 00:07:07,940 >> Amma burada, mən # müəyyən əgər göyərtə ölçüsü mənim kodu çox üst 32 kimi, 147 00:07:07,940 --> 00:07:11,730 Mən bunu dəyişmək lazımdır, əgər, mən yalnız getmək və bir şey dəyişir. 148 00:07:11,730 --> 00:07:15,010 Mənim kodu compile və bütün ani vasitəsilə təbliğ edir. 149 00:07:15,010 --> 00:07:18,850 Əslində, biz göyərtə dəyişə bilərsiniz biz istədiyiniz hər hansı bir dəyəri ölçüsü. 150 00:07:18,850 --> 00:07:22,500 >> Mən üçün gedir göyərtə ölçüsü alma oyun? 151 00:07:22,500 --> 00:07:23,430 >> Mən Doug Lloyd edirəm. 152 00:07:23,430 --> 00:07:25,840 Bu CS50 edir. 153 00:07:25,840 --> 00:07:27,772