>> [Bermain muzik]
DOUG LLOYD: Baiklah.
Jenis topik pelik, bukan?
Nombor ajaib.
Apa doe dia maksudkan apabila dia bercakap tentang nombor ajaib?
Nah, beberapa program bahawa kita telah ditulis dalam CS50
setakat ini mempunyai beberapa pelik nombor jenis dibuang di dalamnya.
Mungkin atas sebab-sebab kita tidak sepenuhnya memahami sekarang.
Sebagai contoh, dalam masalah Mario, kami dihadkan ketinggian piramid di 23.
Kami jelas mengatakan anda tidak boleh pergi lebih tinggi daripada 23.
>> Tetapi apakah 23 bermakna?
Nah, jika anda membaca spec dengan teliti, anda
mungkin telah melihat bahawa Sebab kita dihadkan ia pada 23
kerana ketinggian standard tetingkap terminal adalah 24.
Dan jadi jika kita mempunyai piramid menjadi lebih tinggi daripada itu,
ia mungkin melakukan perkara ini pelik di mana ia berjalan di luar skrin.
Dan anda tahu, apa yang tidak ini bermakna dalam konteks, bukan?
>> Yang dimaksudkan dengan 23 segera jelas kepada seseorang yang melihat program anda
dan mungkin mempunyai berbeza saiz tetingkap terminal?
Mungkin tidak.
Ia seolah-olah seperti, OK.
Nah, mengapa ia hanya kurang daripada 23?
Secara umum, ia adalah jenis tabiat yang tidak baik sebenarnya
untuk menulis pemalar ke dalam kod anda.
Dengan berbuat demikian, apabila anda benar-benar melakukan menulis yang berterusan ke dalam kod anda,
ia kadang-kadang dirujuk sebagai menggunakan nombor ajaib, yang merupakan sesuatu
kita biasanya ingin mencuba dan mengelakkan.
>> Sebagai contoh, mari kita lihat pada majlis ringkas ini di sini.
Jelas sekali tidak ada data taip C dipanggil kad atau dek.
Jadi hanya menanggung dengan saya.
Ia adalah sedikit pseudokod bercampur di sini.
Ini adalah fungsi yang dipanggil berurusan kad yang nampaknya
mengambil dek sebagai parameter, dan output kehendak kepada saya kad tunggal.
>> Dan saya melakukan sesuatu di sini di mana saya mempunyai gelung yang berjalan 0-52,
dan saya berurusan kad.
Nah, kami mempunyai sihir beberapa di sini, betul.
Adakah anda melihat apa bilangan ajaib itu?
Atau yang lebih penting, adakah anda melihat apa masalah sebenar di sini?
Terutama jika ini merupakan salah satu fungsi
dalam fail sendiri dalam folder yang mengandungi
sekumpulan yang berbeza fail, setiap yang
melakukan perkara lain untuk dek kad.
Mungkin ia shuffles mereka, atau memperkatakan tangan lima kad daripada kad tunggal.
>> Adakah anda melihat apa yang masalah boleh berada di sini?
Adakah anda melihat bilangan ajaib Saya telah disuntik ke dalam kod?
Ia adalah 52, betul.
>> Seperti, gerak hati anda mungkin tahu, OK.
Seperti satu set piawai kad mengandungi 52 kad.
Tetapi dalam program kami, ia hanya jenis terapung di dalam sana.
Ia seperti tiba-tiba ada 52.
>> Salah satu cara untuk menyelesaikan masalah ini masalah ialah untuk melakukan ini.
Kami sangat jelas sekarang memanggil saiz dek kerana 52.
Ia memberikan ia sedikit lebih intuitif bermakna apabila dalam gelung
kemudian kita kemudian berkata, i adalah kurang daripada saiz dek.
Ia hanya seolah-olah lebih baik daripada berkata 52.
Sekarang ini tidak benar-benar menyelesaikan masalah.
Ia memberikan beberapa simbolik makna kepada pemalar.
Tetapi ia sejenis sebenarnya memperkenalkan satu lagi masalah
yang mungkin tidak ketara.
Walaupun pembolehubah ini diisytiharkan globally--
adakah anda masih ingat apa yang ia bermakna apabila kita mengisytiharkan
pembolehubah global berbanding tempatan?
Walaupun kita mengisytiharkan pembolehubah di peringkat global, bagaimana jika ada
satu majlis di suite kami fungsinya
yang berurusan dengan manipulasi kad yang secara tidak sengaja mengubah saiz dek,
atau ia meningkatkan ia dengan 1 atau turun oleh 1.
Yang boleh memberi masalah, bukan?
Terutamanya jika kita sedang berhadapan dengan satu set yang kad shuffling di mana dek penuh
adalah diperlukan.
Jika saiz dek dikurangkan sebanyak 1, sebagai contoh, ke 51,
kita sebenarnya tidak shuffling semua kad mungkin.
Kami meninggalkan salah seorang daripada mereka keluar.
Dan nilai yang mungkin boleh menjadi meramalkan atau dieksploitasi oleh pelakon yang tidak baik.
>> C menyediakan apa yang dipanggil arahan prapemproses, yang
juga dikenali sebagai makro untuk mewujudkan pemalar simbolik.
Dan sebenarnya, anda telah pun lihat arahan prapemproses,
walaupun anda tidak pernah mendengar ia disebut bahawa dengan #include.
Ia adalah satu lagi contoh makro atau prapemproses arahan.
>> Cara untuk membuat pemalar simbolik, atau memberi nama kepada yang tetap
supaya ia mempunyai lebih yang bermaksud, adalah seperti berikut.
# menentukan, nama, penggantian.
Benar-benar penting mengetepikan di sini benar-benar cepat.
Jangan letakkan koma bernoktah di akhir #defines anda.
Jadi ia adalah # menentukan, nama, penggantian.
>> Apabila program anda disusun, apa yang sebenarnya berlaku
adalah pengkompil jika pergi melalui kod anda
dan menggantikan setiap contoh perkataan "nama" dengan apa sahaja yang anda
dimasukkan sebagai pengganti.
Tamsilan, jika #include adalah jenis daripada sama dengan menyalin dan menampal,
kemudian #define adalah jenis sama untuk mencari dan menggantikan,
jika anda pernah menggunakan ciri yang dalam program pemprosesan perkataan, sebagai contoh.
>> Jadi, sebagai contoh, jika saya # menentukan pi sebagai 3.14159265,
jika anda lebih baik secara matematik condong dan anda tiba-tiba
melihat 3.14159265 terbang sekitar dalam kod anda,
anda mungkin tahu ia bercakap tentang pi.
Tetapi mungkin kita boleh memberikan sedikit lebih makna simbolik.
Dan kita bukannya boleh mengatakan # menentukan pi seperti yang sesuap nombor
bahawa saya tidak akan menyimpan membaca berulang kali.
>> Dan apa yang akan berlaku kemudian pada menyusun masa adalah apabila program ini adalah
disusun, perkara pertama yang akan berlaku ialah ia akan melalui
dan ia akan menggantikan setiap kali ia melihat modal P, ibu saya,
ia benar-benar akan menggantikannya dengan 3.14 dan sebagainya, supaya anda
tidak perlu menaip setiap masa semasa program anda masih
mempunyai fungsi yang anda jangkakan, kerana anda bekerja
dengan memanipulasi, darab, membahagikan, apa sahaja oleh pi.
>> Anda tidak terhad kepada ini menggantikan nombor sahaja.
Sebagai contoh, saya boleh #define tentu sebagai CS50 tali.
Dalam kes ini, apabila program disusun,
# menentukan akan melalui kod, menggantikan setiap kali
ia melihat "Kursus" dengan CS50 tali.
>> Anda akan melihat di sini juga bahawa saya sering
# menentukan semua saya ditakrifkan simbolik pemalar, boleh dikatakan,
sentiasa berada dalam semua topi.
Ia konvensyen.
Ia tidak diperlukan.
Sebab biasanya orang akan menggunakan semua ibu apabila mereka #defining
adalah hanya untuk membuat ia benar-benar jelas bahawa ini elemen tertentu kod saya
adalah pemalar ditakrifkan.
Jika ia adalah huruf kecil, ada kemungkinan bahawa ia mungkin dikelirukan dengan pembolehubah.
Dan itu mungkin bukan satu perkara yang baik untuk dilakukan.
>> Jadi ini tertentu penyelesaian adalah lebih baik
daripada salah seorang daripada yang sebelumnya.
Jika saya # menentukan pertama saiz dek 52, maka sekarang kegunaan saya 52 atau saiz dek sini,
adalah lebih intuitif dan lebih selamat.
Anda tidak boleh memanipulasi pemalar.
Anda tidak boleh mengatakan 52 plus plus.
Itu tidak akan menukar kepada 53.
Anda tidak boleh mengubah 52 kepada sesuatu.
>> Anda boleh menukar pembolehubah yang nilainya 52,
yang merupakan fix pertama kami sebelum ini.
Dan anda boleh meningkatkan yang berubah-ubah kepada 53.
Tetapi anda tidak boleh mengatakan 52 plus plus dan ada yang tiba-tiba bertukar 52 ke 53.
52 sentiasa 52.
Dan supaya anda tidak boleh secara tidak sengaja menukar saiz dek sini dengan memanipulasi ia,
>> Satu lagi bahagian yang baik kesan walaupun ini
yang anda sedar bahawa tidak semua negara di seluruh dunia
menggunakan satu set kad saiz 52?
Sebagai contoh, ia benar-benar biasa dalam Jerman menggunakan saiz dek 32,
di mana mereka jalur beberapa kad nilai yang lebih rendah.
Dan dalam kes ini, saya mahu pelabuhan suite saya
fungsi yang menangani manipulasi kad ke Jerman.
Saya dapat dalam contoh pertama kita menunjukkan, perlu pergi dan menggantikan
semua contoh 52 kod saya dengan 32.
>> Tetapi di sini, jika saya # menentukan saiz dek sebagai 32 di bahagian paling atas kod saya,
jika saya perlu mengubahnya, saya boleh hanya pergi dan mengubah perkara yang satu.
Susun semula kod saya, dan semua tiba-tiba ia merambat melalui.
Malah, kita boleh mengubah dek saiz untuk apa-apa nilai yang kita mahu.
>> Bolehkah saya menarik minat anda dalam permainan pikap saiz dek?
>> Saya Doug Lloyd.
Dan ini adalah CS50.