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: Baiklah. 4 00:00:06,360 --> 00:00:07,770 Jenis topik yang aneh, kan? 5 00:00:07,770 --> 00:00:09,050 Angka ajaib. 6 00:00:09,050 --> 00:00:12,012 Apa doe dia maksud ketika dia berbicara tentang angka ajaib? 7 00:00:12,012 --> 00:00:14,220 Nah, beberapa program bahwa kita telah ditulis dalam CS50 8 00:00:14,220 --> 00:00:16,660 sejauh ini memiliki beberapa aneh nomor jenis dilemparkan mereka. 9 00:00:16,660 --> 00:00:19,680 Mungkin karena alasan kita tidak sepenuhnya memahami sekarang. 10 00:00:19,680 --> 00:00:23,950 Misalnya, dalam masalah Mario, kami capped ketinggian piramida di 23. 11 00:00:23,950 --> 00:00:26,880 Kami secara eksplisit mengatakan Anda tidak bisa lebih tinggi dari 23. 12 00:00:26,880 --> 00:00:28,702 >> Tapi apa artinya 23? 13 00:00:28,702 --> 00:00:30,410 Nah, jika Anda membaca spek hati-hati, Anda 14 00:00:30,410 --> 00:00:32,493 mungkin telah melihat bahwa Alasan kami capped itu pada 23 15 00:00:32,493 --> 00:00:36,160 adalah karena ketinggian standar dari jendela terminal adalah 24. 16 00:00:36,160 --> 00:00:38,860 Dan jadi jika kita memiliki piramida lebih tinggi dari itu, 17 00:00:38,860 --> 00:00:41,290 mungkin melakukan hal yang aneh ini di mana ia berjalan dari layar. 18 00:00:41,290 --> 00:00:45,140 Dan kau tahu, apa itu berarti dalam konteks, kan? 19 00:00:45,140 --> 00:00:48,880 >> Apakah arti dari 23 segera jelas untuk seseorang yang melihat program Anda 20 00:00:48,880 --> 00:00:51,550 dan mungkin memiliki berbeda Ukuran terminal window? 21 00:00:51,550 --> 00:00:52,330 Mungkin tidak. 22 00:00:52,330 --> 00:00:53,080 Sepertinya, OK. 23 00:00:53,080 --> 00:00:55,005 Nah, mengapa hanya kurang dari 23? 24 00:00:55,005 --> 00:00:56,880 Secara umum, itu semacam dari kebiasaan buruk sebenarnya 25 00:00:56,880 --> 00:00:58,940 menulis konstanta ke dalam kode Anda. 26 00:00:58,940 --> 00:01:02,190 Dengan demikian, ketika Anda benar-benar melakukan menulis konstan ke dalam kode Anda, 27 00:01:02,190 --> 00:01:05,630 itu kadang-kadang disebut sebagai menggunakan nomor ajaib, yang merupakan sesuatu 28 00:01:05,630 --> 00:01:08,030 kita biasanya ingin mencoba dan menghindari. 29 00:01:08,030 --> 00:01:12,830 >> Sebagai contoh, mari kita lihat di fungsi sederhana ini di sini. 30 00:01:12,830 --> 00:01:15,726 Jelas ada data ketik C disebut kartu atau dek. 31 00:01:15,726 --> 00:01:16,600 Jadi hanya beruang dengan saya. 32 00:01:16,600 --> 00:01:18,910 Ini sedikit pseudocode dicampur dalam sini. 33 00:01:18,910 --> 00:01:21,050 Ini adalah fungsi yang disebut berurusan kartu yang tampaknya 34 00:01:21,050 --> 00:01:26,570 mengambil dek sebagai parameter, dan akan menampilkan kepada saya satu kartu. 35 00:01:26,570 --> 00:01:30,990 >> Dan aku melakukan sesuatu di sini di mana saya memiliki loop yang berjalan 0-52, 36 00:01:30,990 --> 00:01:33,394 dan saya menangani kartu. 37 00:01:33,394 --> 00:01:35,310 Nah, kita punya sihir nomor di sini, benar. 38 00:01:35,310 --> 00:01:38,790 Apakah Anda melihat apa angka ajaib adalah? 39 00:01:38,790 --> 00:01:42,280 Atau lebih penting, apakah Anda melihat apa masalahnya di sini? 40 00:01:42,280 --> 00:01:44,310 Terutama jika ini adalah salah satu fungsi 41 00:01:44,310 --> 00:01:48,030 di file sendiri dalam folder yang berisi 42 00:01:48,030 --> 00:01:49,970 sekelompok berbeda file, yang masing-masing 43 00:01:49,970 --> 00:01:51,670 melakukan hal lain untuk setumpuk kartu. 44 00:01:51,670 --> 00:01:57,310 Mungkin mengocok mereka, atau Penawaran tangan dari lima kartu bukan kartu tunggal. 45 00:01:57,310 --> 00:01:59,420 >> Apakah Anda melihat apa yang masalah bisa berada di sini? 46 00:01:59,420 --> 00:02:03,220 Apakah Anda melihat angka ajaib Aku sudah disuntikkan ke dalam kode? 47 00:02:03,220 --> 00:02:04,390 Ini 52, benar. 48 00:02:04,390 --> 00:02:06,440 >> Seperti, intuitif Anda mungkin tahu, OK. 49 00:02:06,440 --> 00:02:09,740 Seperti setumpuk standar kartu berisi 52 kartu. 50 00:02:09,740 --> 00:02:12,570 Namun dalam program kami, itu hanya jenis yang beredar di sana. 51 00:02:12,570 --> 00:02:15,280 Ini seperti tiba-tiba ada 52. 52 00:02:15,280 --> 00:02:18,290 >> Salah satu cara untuk mengatasi ini Masalahnya adalah untuk melakukan hal ini. 53 00:02:18,290 --> 00:02:22,724 Kami sangat eksplisit sekarang memanggil ukuran dek 52. 54 00:02:22,724 --> 00:02:25,390 Ini memberikan sedikit lebih intuitif artinya ketika di untuk loop 55 00:02:25,390 --> 00:02:28,650 nanti kita katakan, saya kurang dari ukuran deck. 56 00:02:28,650 --> 00:02:32,666 Sepertinya lebih baik daripada mengatakan 52. 57 00:02:32,666 --> 00:02:34,290 Sekarang ini tidak benar-benar memperbaiki masalah. 58 00:02:34,290 --> 00:02:38,460 Ini memberikan beberapa simbolik berarti konstan. 59 00:02:38,460 --> 00:02:40,820 Tapi itu jenis sebenarnya memperkenalkan masalah lain 60 00:02:40,820 --> 00:02:43,770 yang mungkin tidak segera jelas. 61 00:02:43,770 --> 00:02:45,859 Bahkan jika variabel ini dinyatakan globally-- 62 00:02:45,859 --> 00:02:47,650 Anda ingat apa yang berarti ketika kita mendeklarasikan 63 00:02:47,650 --> 00:02:50,500 variabel global dibandingkan lokal? 64 00:02:50,500 --> 00:02:53,340 Bahkan jika kita mendeklarasikan variabel global, bagaimana jika ada 65 00:02:53,340 --> 00:02:55,500 fungsi lain di suite kami fungsi 66 00:02:55,500 --> 00:02:59,750 yang berhubungan dengan manipulasi kartu yang secara tidak sengaja mengubah ukuran dek, 67 00:02:59,750 --> 00:03:02,727 atau meningkatkan dengan 1 atau menurun dengan 1. 68 00:03:02,727 --> 00:03:04,060 Itu bisa menyebabkan masalah, kan? 69 00:03:04,060 --> 00:03:08,261 Apalagi jika kita sedang berhadapan dengan satu set kartu mana mengocok dek penuh 70 00:03:08,261 --> 00:03:08,760 Dibutuhkan. 71 00:03:08,760 --> 00:03:12,804 Jika ukuran deck menurun oleh 1, misalnya, untuk 51, 72 00:03:12,804 --> 00:03:14,970 kita tidak benar-benar mengocok semua kartu mungkin. 73 00:03:14,970 --> 00:03:16,500 Kami meninggalkan salah satu dari mereka keluar. 74 00:03:16,500 --> 00:03:21,680 Dan nilai yang mungkin bisa diprediksi atau dimanfaatkan oleh aktor yang buruk. 75 00:03:21,680 --> 00:03:24,920 >> C memberikan apa yang disebut preprocessor direktif, yang 76 00:03:24,920 --> 00:03:27,764 juga disebut makro untuk menciptakan konstanta simbolik. 77 00:03:27,764 --> 00:03:30,180 Dan pada kenyataannya, Anda sudah sudah melihat direktif preprocessor, 78 00:03:30,180 --> 00:03:32,916 bahkan jika Anda belum pernah mendengar hal itu disebut bahwa dengan #include. 79 00:03:32,916 --> 00:03:37,150 Ini contoh lain dari makro atau preprocessor direktif. 80 00:03:37,150 --> 00:03:41,290 >> Cara untuk membuat konstanta simbolik, atau memberikan nama untuk sebuah konstanta 81 00:03:41,290 --> 00:03:43,740 sehingga memiliki lebih yang berarti, adalah sebagai berikut. 82 00:03:43,740 --> 00:03:47,030 #define, nama, pengganti. 83 00:03:47,030 --> 00:03:49,140 Benar-benar penting selain di sini benar-benar cepat. 84 00:03:49,140 --> 00:03:54,180 Jangan menaruh titik koma di akhir # mendefinisikan Anda. 85 00:03:54,180 --> 00:03:57,310 Jadi itu define, nama, pengganti. 86 00:03:57,310 --> 00:03:59,540 >> Ketika program Anda dikompilasi, apa yang sebenarnya terjadi 87 00:03:59,540 --> 00:04:01,740 adalah compiler jika akan untuk pergi melalui kode Anda 88 00:04:01,740 --> 00:04:06,770 dan mengganti setiap contoh kata "nama" dengan apa pun yang Anda 89 00:04:06,770 --> 00:04:08,860 ditempatkan sebagai pengganti. 90 00:04:08,860 --> 00:04:13,060 Analog, jika #include adalah semacam dari mirip dengan copy dan paste, 91 00:04:13,060 --> 00:04:15,700 maka #define adalah semacam mirip dengan mencari dan mengganti, 92 00:04:15,700 --> 00:04:19,180 jika Anda pernah menggunakan fitur yang di program pengolah kata, misalnya. 93 00:04:19,180 --> 00:04:26,345 >> Jadi misalnya, jika saya # define pi sebagai 3.14159265, 94 00:04:26,345 --> 00:04:28,720 jika Anda lebih matematis miring dan Anda tiba-tiba 95 00:04:28,720 --> 00:04:31,640 melihat 3.14159265 terbang di dalam kode Anda, 96 00:04:31,640 --> 00:04:33,517 Anda mungkin tahu itu berbicara tentang pi. 97 00:04:33,517 --> 00:04:35,850 Tapi mungkin kita dapat memberikan sedikit makna yang lebih simbolis. 98 00:04:35,850 --> 00:04:39,850 Dan kita justru bisa mengatakan #define pi sebagai yang seteguk nomor 99 00:04:39,850 --> 00:04:42,110 bahwa aku tidak akan terus membaca berulang-ulang. 100 00:04:42,110 --> 00:04:45,560 >> Dan apa yang akan terjadi kemudian di waktu kompilasi adalah ketika program ini adalah 101 00:04:45,560 --> 00:04:48,530 disusun, hal pertama yang akan terjadi itu akan melalui 102 00:04:48,530 --> 00:04:51,520 dan itu akan menggantikan setiap kali itu melihat P modal, modal saya, 103 00:04:51,520 --> 00:04:55,610 itu akan benar-benar menggantinya dengan 3.14 dan seterusnya, sehingga Anda 104 00:04:55,610 --> 00:04:58,090 tidak perlu mengetik setiap waktu saat program Anda masih 105 00:04:58,090 --> 00:05:00,631 memiliki fungsi yang Anda harapkan, karena Anda bekerja 106 00:05:00,631 --> 00:05:05,090 dengan memanipulasi, mengalikan, membagi, apa pun itu adalah dengan pi. 107 00:05:05,090 --> 00:05:08,230 >> Anda tidak terbatas pada ini substitusi untuk angka saja. 108 00:05:08,230 --> 00:05:12,279 Sebagai contoh, saya bisa # define Tentu saja sebagai string CS50. 109 00:05:12,279 --> 00:05:14,070 Dalam hal ini, ketika Program dikompilasi, 110 00:05:14,070 --> 00:05:16,236 #define akan pergi melalui kode, ganti setiap kali 111 00:05:16,236 --> 00:05:19,900 ia melihat "Tentu saja" dengan string CS50. 112 00:05:19,900 --> 00:05:21,720 >> Anda akan melihat di sini juga yang sering saya 113 00:05:21,720 --> 00:05:26,090 #define semua saya didefinisikan simbolik konstanta, sehingga untuk berbicara, 114 00:05:26,090 --> 00:05:28,130 selalu dalam semua topi. 115 00:05:28,130 --> 00:05:28,960 Ini konvensi. 116 00:05:28,960 --> 00:05:30,170 Itu tidak diperlukan. 117 00:05:30,170 --> 00:05:33,900 Alasannya umumnya orang akan menggunakan semua ibukota ketika mereka #defining 118 00:05:33,900 --> 00:05:37,590 hanya untuk membuatnya benar-benar jelas bahwa elemen tertentu dari kode saya 119 00:05:37,590 --> 00:05:38,820 adalah konstanta didefinisikan. 120 00:05:38,820 --> 00:05:43,730 Jika itu huruf kecil, itu mungkin bahwa mungkin bingung dengan variabel. 121 00:05:43,730 --> 00:05:46,120 Dan itu mungkin bukan hal yang baik untuk dilakukan. 122 00:05:46,120 --> 00:05:48,910 >> Jadi ini khususnya solusi jauh lebih baik 123 00:05:48,910 --> 00:05:50,550 daripada salah satu dari yang sebelumnya. 124 00:05:50,550 --> 00:05:59,950 Jika saya #define pertama ukuran dek 52, maka sekarang saya gunakan 52, atau ukuran malas, 125 00:05:59,950 --> 00:06:01,850 jauh lebih intuitif dan jauh lebih aman. 126 00:06:01,850 --> 00:06:03,280 Anda tidak dapat memanipulasi konstan. 127 00:06:03,280 --> 00:06:05,259 Anda tidak bisa mengatakan 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 Itu tidak akan mengubahnya menjadi 53. 129 00:06:06,800 --> 00:06:09,390 Anda tidak dapat mengubah 52 untuk sesuatu. 130 00:06:09,390 --> 00:06:12,470 >> Anda dapat mengubah variabel yang nilainya 52, 131 00:06:12,470 --> 00:06:14,870 yang merupakan fix pertama kami miliki sebelumnya. 132 00:06:14,870 --> 00:06:17,000 Dan Anda dapat meningkatkan bahwa variabel ke 53. 133 00:06:17,000 --> 00:06:21,100 Tapi Anda tidak bisa mengatakan 52 plus plus dan memiliki yang tiba-tiba berubah menjadi 52 53. 134 00:06:21,100 --> 00:06:23,350 52 selalu 52. 135 00:06:23,350 --> 00:06:28,860 Dan sehingga Anda tidak dapat secara tidak sengaja mengubah Ukuran malas dengan memanipulasi itu, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Sisi lain baik Pengaruh meskipun ini adalah 138 00:06:32,390 --> 00:06:38,310 yang Anda menyadari bahwa tidak semua negara di seluruh dunia 139 00:06:38,310 --> 00:06:40,690 menggunakan setumpuk kartu ukuran 52? 140 00:06:40,690 --> 00:06:45,630 Sebagai contoh, itu benar-benar umum di Jerman menggunakan ukuran dek dari 32, 141 00:06:45,630 --> 00:06:48,020 di mana mereka menghapus beberapa dari bawah kartu nilai. 142 00:06:48,020 --> 00:06:50,960 Dan dalam hal ini, saya ingin pelabuhan suite saya 143 00:06:50,960 --> 00:06:55,390 fungsi yang berhubungan dengan kartu manipulasi ke Jerman. 144 00:06:55,390 --> 00:06:59,440 Aku bisa di contoh pertama kami menunjukkan, harus pergi dan mengganti 145 00:06:59,440 --> 00:07:03,570 semua contoh 52 dalam kode saya dengan 32. 146 00:07:03,570 --> 00:07:07,940 >> Tapi di sini, jika saya # define ukuran dek 32 di bagian paling atas dari kode saya, 147 00:07:07,940 --> 00:07:11,730 jika saya harus mengubahnya, saya bisa hanya pergi dan mengubah itu satu hal. 148 00:07:11,730 --> 00:07:15,010 Mengkompilasi ulang kode saya, dan semua tiba-tiba itu menyebar melalui. 149 00:07:15,010 --> 00:07:18,850 Bahkan, kita dapat mengubah dek ukuran nilai apapun yang kita inginkan. 150 00:07:18,850 --> 00:07:22,500 >> Dapatkah saya menarik minat Anda dalam permainan ukuran dek pikap? 151 00:07:22,500 --> 00:07:23,430 >> Aku Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Dan ini CS50. 153 00:07:25,840 --> 00:07:27,772