1 00:00:00,000 --> 00:00:02,350 >> [Bermain muzik] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Baiklah. 4 00:00:06,360 --> 00:00:07,770 Jenis topik pelik, bukan? 5 00:00:07,770 --> 00:00:09,050 Nombor ajaib. 6 00:00:09,050 --> 00:00:12,012 Apa doe dia maksudkan apabila dia bercakap tentang nombor ajaib? 7 00:00:12,012 --> 00:00:14,220 Nah, beberapa program bahawa kita telah ditulis dalam CS50 8 00:00:14,220 --> 00:00:16,660 setakat ini mempunyai beberapa pelik nombor jenis dibuang di dalamnya. 9 00:00:16,660 --> 00:00:19,680 Mungkin atas sebab-sebab kita tidak sepenuhnya memahami sekarang. 10 00:00:19,680 --> 00:00:23,950 Sebagai contoh, dalam masalah Mario, kami dihadkan ketinggian piramid di 23. 11 00:00:23,950 --> 00:00:26,880 Kami jelas mengatakan anda tidak boleh pergi lebih tinggi daripada 23. 12 00:00:26,880 --> 00:00:28,702 >> Tetapi apakah 23 bermakna? 13 00:00:28,702 --> 00:00:30,410 Nah, jika anda membaca spec dengan teliti, anda 14 00:00:30,410 --> 00:00:32,493 mungkin telah melihat bahawa Sebab kita dihadkan ia pada 23 15 00:00:32,493 --> 00:00:36,160 kerana ketinggian standard tetingkap terminal adalah 24. 16 00:00:36,160 --> 00:00:38,860 Dan jadi jika kita mempunyai piramid menjadi lebih tinggi daripada itu, 17 00:00:38,860 --> 00:00:41,290 ia mungkin melakukan perkara ini pelik di mana ia berjalan di luar skrin. 18 00:00:41,290 --> 00:00:45,140 Dan anda tahu, apa yang tidak ini bermakna dalam konteks, bukan? 19 00:00:45,140 --> 00:00:48,880 >> Yang dimaksudkan dengan 23 segera jelas kepada seseorang yang melihat program anda 20 00:00:48,880 --> 00:00:51,550 dan mungkin mempunyai berbeza saiz tetingkap terminal? 21 00:00:51,550 --> 00:00:52,330 Mungkin tidak. 22 00:00:52,330 --> 00:00:53,080 Ia seolah-olah seperti, OK. 23 00:00:53,080 --> 00:00:55,005 Nah, mengapa ia hanya kurang daripada 23? 24 00:00:55,005 --> 00:00:56,880 Secara umum, ia adalah jenis tabiat yang tidak baik sebenarnya 25 00:00:56,880 --> 00:00:58,940 untuk menulis pemalar ke dalam kod anda. 26 00:00:58,940 --> 00:01:02,190 Dengan berbuat demikian, apabila anda benar-benar melakukan menulis yang berterusan ke dalam kod anda, 27 00:01:02,190 --> 00:01:05,630 ia kadang-kadang dirujuk sebagai menggunakan nombor ajaib, yang merupakan sesuatu 28 00:01:05,630 --> 00:01:08,030 kita biasanya ingin mencuba dan mengelakkan. 29 00:01:08,030 --> 00:01:12,830 >> Sebagai contoh, mari kita lihat pada majlis ringkas ini di sini. 30 00:01:12,830 --> 00:01:15,726 Jelas sekali tidak ada data taip C dipanggil kad atau dek. 31 00:01:15,726 --> 00:01:16,600 Jadi hanya menanggung dengan saya. 32 00:01:16,600 --> 00:01:18,910 Ia adalah sedikit pseudokod bercampur di sini. 33 00:01:18,910 --> 00:01:21,050 Ini adalah fungsi yang dipanggil berurusan kad yang nampaknya 34 00:01:21,050 --> 00:01:26,570 mengambil dek sebagai parameter, dan output kehendak kepada saya kad tunggal. 35 00:01:26,570 --> 00:01:30,990 >> Dan saya melakukan sesuatu di sini di mana saya mempunyai gelung yang berjalan 0-52, 36 00:01:30,990 --> 00:01:33,394 dan saya berurusan kad. 37 00:01:33,394 --> 00:01:35,310 Nah, kami mempunyai sihir beberapa di sini, betul. 38 00:01:35,310 --> 00:01:38,790 Adakah anda melihat apa bilangan ajaib itu? 39 00:01:38,790 --> 00:01:42,280 Atau yang lebih penting, adakah anda melihat apa masalah sebenar di sini? 40 00:01:42,280 --> 00:01:44,310 Terutama jika ini merupakan salah satu fungsi 41 00:01:44,310 --> 00:01:48,030 dalam fail sendiri dalam folder yang mengandungi 42 00:01:48,030 --> 00:01:49,970 sekumpulan yang berbeza fail, setiap yang 43 00:01:49,970 --> 00:01:51,670 melakukan perkara lain untuk dek kad. 44 00:01:51,670 --> 00:01:57,310 Mungkin ia shuffles mereka, atau memperkatakan tangan lima kad daripada kad tunggal. 45 00:01:57,310 --> 00:01:59,420 >> Adakah anda melihat apa yang masalah boleh berada di sini? 46 00:01:59,420 --> 00:02:03,220 Adakah anda melihat bilangan ajaib Saya telah disuntik ke dalam kod? 47 00:02:03,220 --> 00:02:04,390 Ia adalah 52, betul. 48 00:02:04,390 --> 00:02:06,440 >> Seperti, gerak hati anda mungkin tahu, OK. 49 00:02:06,440 --> 00:02:09,740 Seperti satu set piawai kad mengandungi 52 kad. 50 00:02:09,740 --> 00:02:12,570 Tetapi dalam program kami, ia hanya jenis terapung di dalam sana. 51 00:02:12,570 --> 00:02:15,280 Ia seperti tiba-tiba ada 52. 52 00:02:15,280 --> 00:02:18,290 >> Salah satu cara untuk menyelesaikan masalah ini masalah ialah untuk melakukan ini. 53 00:02:18,290 --> 00:02:22,724 Kami sangat jelas sekarang memanggil saiz dek kerana 52. 54 00:02:22,724 --> 00:02:25,390 Ia memberikan ia sedikit lebih intuitif bermakna apabila dalam gelung 55 00:02:25,390 --> 00:02:28,650 kemudian kita kemudian berkata, i adalah kurang daripada saiz dek. 56 00:02:28,650 --> 00:02:32,666 Ia hanya seolah-olah lebih baik daripada berkata 52. 57 00:02:32,666 --> 00:02:34,290 Sekarang ini tidak benar-benar menyelesaikan masalah. 58 00:02:34,290 --> 00:02:38,460 Ia memberikan beberapa simbolik makna kepada pemalar. 59 00:02:38,460 --> 00:02:40,820 Tetapi ia sejenis sebenarnya memperkenalkan satu lagi masalah 60 00:02:40,820 --> 00:02:43,770 yang mungkin tidak ketara. 61 00:02:43,770 --> 00:02:45,859 Walaupun pembolehubah ini diisytiharkan globally-- 62 00:02:45,859 --> 00:02:47,650 adakah anda masih ingat apa yang ia bermakna apabila kita mengisytiharkan 63 00:02:47,650 --> 00:02:50,500 pembolehubah global berbanding tempatan? 64 00:02:50,500 --> 00:02:53,340 Walaupun kita mengisytiharkan pembolehubah di peringkat global, bagaimana jika ada 65 00:02:53,340 --> 00:02:55,500 satu majlis di suite kami fungsinya 66 00:02:55,500 --> 00:02:59,750 yang berurusan dengan manipulasi kad yang secara tidak sengaja mengubah saiz dek, 67 00:02:59,750 --> 00:03:02,727 atau ia meningkatkan ia dengan 1 atau turun oleh 1. 68 00:03:02,727 --> 00:03:04,060 Yang boleh memberi masalah, bukan? 69 00:03:04,060 --> 00:03:08,261 Terutamanya jika kita sedang berhadapan dengan satu set yang kad shuffling di mana dek penuh 70 00:03:08,261 --> 00:03:08,760 adalah diperlukan. 71 00:03:08,760 --> 00:03:12,804 Jika saiz dek dikurangkan sebanyak 1, sebagai contoh, ke 51, 72 00:03:12,804 --> 00:03:14,970 kita sebenarnya tidak shuffling semua kad mungkin. 73 00:03:14,970 --> 00:03:16,500 Kami meninggalkan salah seorang daripada mereka keluar. 74 00:03:16,500 --> 00:03:21,680 Dan nilai yang mungkin boleh menjadi meramalkan atau dieksploitasi oleh pelakon yang tidak baik. 75 00:03:21,680 --> 00:03:24,920 >> C menyediakan apa yang dipanggil arahan prapemproses, yang 76 00:03:24,920 --> 00:03:27,764 juga dikenali sebagai makro untuk mewujudkan pemalar simbolik. 77 00:03:27,764 --> 00:03:30,180 Dan sebenarnya, anda telah pun lihat arahan prapemproses, 78 00:03:30,180 --> 00:03:32,916 walaupun anda tidak pernah mendengar ia disebut bahawa dengan #include. 79 00:03:32,916 --> 00:03:37,150 Ia adalah satu lagi contoh makro atau prapemproses arahan. 80 00:03:37,150 --> 00:03:41,290 >> Cara untuk membuat pemalar simbolik, atau memberi nama kepada yang tetap 81 00:03:41,290 --> 00:03:43,740 supaya ia mempunyai lebih yang bermaksud, adalah seperti berikut. 82 00:03:43,740 --> 00:03:47,030 # menentukan, nama, penggantian. 83 00:03:47,030 --> 00:03:49,140 Benar-benar penting mengetepikan di sini benar-benar cepat. 84 00:03:49,140 --> 00:03:54,180 Jangan letakkan koma bernoktah di akhir #defines anda. 85 00:03:54,180 --> 00:03:57,310 Jadi ia adalah # menentukan, nama, penggantian. 86 00:03:57,310 --> 00:03:59,540 >> Apabila program anda disusun, apa yang sebenarnya berlaku 87 00:03:59,540 --> 00:04:01,740 adalah pengkompil jika pergi melalui kod anda 88 00:04:01,740 --> 00:04:06,770 dan menggantikan setiap contoh perkataan "nama" dengan apa sahaja yang anda 89 00:04:06,770 --> 00:04:08,860 dimasukkan sebagai pengganti. 90 00:04:08,860 --> 00:04:13,060 Tamsilan, jika #include adalah jenis daripada sama dengan menyalin dan menampal, 91 00:04:13,060 --> 00:04:15,700 kemudian #define adalah jenis sama untuk mencari dan menggantikan, 92 00:04:15,700 --> 00:04:19,180 jika anda pernah menggunakan ciri yang dalam program pemprosesan perkataan, sebagai contoh. 93 00:04:19,180 --> 00:04:26,345 >> Jadi, sebagai contoh, jika saya # menentukan pi sebagai 3.14159265, 94 00:04:26,345 --> 00:04:28,720 jika anda lebih baik secara matematik condong dan anda tiba-tiba 95 00:04:28,720 --> 00:04:31,640 melihat 3.14159265 terbang sekitar dalam kod anda, 96 00:04:31,640 --> 00:04:33,517 anda mungkin tahu ia bercakap tentang pi. 97 00:04:33,517 --> 00:04:35,850 Tetapi mungkin kita boleh memberikan sedikit lebih makna simbolik. 98 00:04:35,850 --> 00:04:39,850 Dan kita bukannya boleh mengatakan # menentukan pi seperti yang sesuap nombor 99 00:04:39,850 --> 00:04:42,110 bahawa saya tidak akan menyimpan membaca berulang kali. 100 00:04:42,110 --> 00:04:45,560 >> Dan apa yang akan berlaku kemudian pada menyusun masa adalah apabila program ini adalah 101 00:04:45,560 --> 00:04:48,530 disusun, perkara pertama yang akan berlaku ialah ia akan melalui 102 00:04:48,530 --> 00:04:51,520 dan ia akan menggantikan setiap kali ia melihat modal P, ibu saya, 103 00:04:51,520 --> 00:04:55,610 ia benar-benar akan menggantikannya dengan 3.14 dan sebagainya, supaya anda 104 00:04:55,610 --> 00:04:58,090 tidak perlu menaip setiap masa semasa program anda masih 105 00:04:58,090 --> 00:05:00,631 mempunyai fungsi yang anda jangkakan, kerana anda bekerja 106 00:05:00,631 --> 00:05:05,090 dengan memanipulasi, darab, membahagikan, apa sahaja oleh pi. 107 00:05:05,090 --> 00:05:08,230 >> Anda tidak terhad kepada ini menggantikan nombor sahaja. 108 00:05:08,230 --> 00:05:12,279 Sebagai contoh, saya boleh #define tentu sebagai CS50 tali. 109 00:05:12,279 --> 00:05:14,070 Dalam kes ini, apabila program disusun, 110 00:05:14,070 --> 00:05:16,236 # menentukan akan melalui kod, menggantikan setiap kali 111 00:05:16,236 --> 00:05:19,900 ia melihat "Kursus" dengan CS50 tali. 112 00:05:19,900 --> 00:05:21,720 >> Anda akan melihat di sini juga bahawa saya sering 113 00:05:21,720 --> 00:05:26,090 # menentukan semua saya ditakrifkan simbolik pemalar, boleh dikatakan, 114 00:05:26,090 --> 00:05:28,130 sentiasa berada dalam semua topi. 115 00:05:28,130 --> 00:05:28,960 Ia konvensyen. 116 00:05:28,960 --> 00:05:30,170 Ia tidak diperlukan. 117 00:05:30,170 --> 00:05:33,900 Sebab biasanya orang akan menggunakan semua ibu apabila mereka #defining 118 00:05:33,900 --> 00:05:37,590 adalah hanya untuk membuat ia benar-benar jelas bahawa ini elemen tertentu kod saya 119 00:05:37,590 --> 00:05:38,820 adalah pemalar ditakrifkan. 120 00:05:38,820 --> 00:05:43,730 Jika ia adalah huruf kecil, ada kemungkinan bahawa ia mungkin dikelirukan dengan pembolehubah. 121 00:05:43,730 --> 00:05:46,120 Dan itu mungkin bukan satu perkara yang baik untuk dilakukan. 122 00:05:46,120 --> 00:05:48,910 >> Jadi ini tertentu penyelesaian adalah lebih baik 123 00:05:48,910 --> 00:05:50,550 daripada salah seorang daripada yang sebelumnya. 124 00:05:50,550 --> 00:05:59,950 Jika saya # menentukan pertama saiz dek 52, maka sekarang kegunaan saya 52 atau saiz dek sini, 125 00:05:59,950 --> 00:06:01,850 adalah lebih intuitif dan lebih selamat. 126 00:06:01,850 --> 00:06:03,280 Anda tidak boleh memanipulasi pemalar. 127 00:06:03,280 --> 00:06:05,259 Anda tidak boleh mengatakan 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 Itu tidak akan menukar kepada 53. 129 00:06:06,800 --> 00:06:09,390 Anda tidak boleh mengubah 52 kepada sesuatu. 130 00:06:09,390 --> 00:06:12,470 >> Anda boleh menukar pembolehubah yang nilainya 52, 131 00:06:12,470 --> 00:06:14,870 yang merupakan fix pertama kami sebelum ini. 132 00:06:14,870 --> 00:06:17,000 Dan anda boleh meningkatkan yang berubah-ubah kepada 53. 133 00:06:17,000 --> 00:06:21,100 Tetapi anda tidak boleh mengatakan 52 plus plus dan ada yang tiba-tiba bertukar 52 ke 53. 134 00:06:21,100 --> 00:06:23,350 52 sentiasa 52. 135 00:06:23,350 --> 00:06:28,860 Dan supaya anda tidak boleh secara tidak sengaja menukar saiz dek sini dengan memanipulasi ia, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Satu lagi bahagian yang baik kesan walaupun ini 138 00:06:32,390 --> 00:06:38,310 yang anda sedar bahawa tidak semua negara di seluruh dunia 139 00:06:38,310 --> 00:06:40,690 menggunakan satu set kad saiz 52? 140 00:06:40,690 --> 00:06:45,630 Sebagai contoh, ia benar-benar biasa dalam Jerman menggunakan saiz dek 32, 141 00:06:45,630 --> 00:06:48,020 di mana mereka jalur beberapa kad nilai yang lebih rendah. 142 00:06:48,020 --> 00:06:50,960 Dan dalam kes ini, saya mahu pelabuhan suite saya 143 00:06:50,960 --> 00:06:55,390 fungsi yang menangani manipulasi kad ke Jerman. 144 00:06:55,390 --> 00:06:59,440 Saya dapat dalam contoh pertama kita menunjukkan, perlu pergi dan menggantikan 145 00:06:59,440 --> 00:07:03,570 semua contoh 52 kod saya dengan 32. 146 00:07:03,570 --> 00:07:07,940 >> Tetapi di sini, jika saya # menentukan saiz dek sebagai 32 di bahagian paling atas kod saya, 147 00:07:07,940 --> 00:07:11,730 jika saya perlu mengubahnya, saya boleh hanya pergi dan mengubah perkara yang satu. 148 00:07:11,730 --> 00:07:15,010 Susun semula kod saya, dan semua tiba-tiba ia merambat melalui. 149 00:07:15,010 --> 00:07:18,850 Malah, kita boleh mengubah dek saiz untuk apa-apa nilai yang kita mahu. 150 00:07:18,850 --> 00:07:22,500 >> Bolehkah saya menarik minat anda dalam permainan pikap saiz dek? 151 00:07:22,500 --> 00:07:23,430 >> Saya Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Dan ini adalah CS50. 153 00:07:25,840 --> 00:07:27,772