1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J. Malan: Ini adalah CS50 dan ini adalah awal minggu keempat. 3 00:00:14,050 --> 00:00:18,630 Dan, anak laki-laki, adalah Volkswagen di masalah semua karena software. 4 00:00:18,630 --> 00:00:20,264 Mari kita lihat. 5 00:00:20,264 --> 00:00:20,930 [VIDEO PLAYBACK] 6 00:00:20,930 --> 00:00:25,560 -Cars, Karakter cerdas di film Fast and Furious. 7 00:00:25,560 --> 00:00:29,100 Minggu mobil Jerman ini Volkswagen menemukan dirinya 8 00:00:29,100 --> 00:00:32,490 di tengah-tengah skandal proporsi berpotensi kriminal. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Yang menguatkan untuk miliaran denda, tuntutan pidana mungkin 10 00:00:36,060 --> 00:00:38,560 untuk eksekutif, seperti perusahaan meminta maaf 11 00:00:38,560 --> 00:00:41,840 untuk mencurangi 11 juta mobil untuk membantu mengalahkan tes emisi. 12 00:00:41,840 --> 00:00:44,950 >> Model diesel -Certain yang dirancang dengan perangkat lunak yang canggih 13 00:00:44,950 --> 00:00:48,440 bahwa informasi yang digunakan termasuk posisi kemudi dan kendaraan 14 00:00:48,440 --> 00:00:51,870 mempercepat untuk menentukan mobil itu menjalani uji emisi. 15 00:00:51,870 --> 00:00:55,650 Dalam situasi itu, mesin akan mengurangi emisi beracun. 16 00:00:55,650 --> 00:00:59,070 Tapi mobil itu dicurangi untuk memotong bahwa ketika sedang didorong. 17 00:00:59,070 --> 00:01:03,320 Emisi meningkat 10 sampai 40 kali di atas tingkat EPA diterima. 18 00:01:03,320 --> 00:01:04,280 >> [END PLAYBACK] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J. Malan: Jadi mari Lihatlah ini 20 00:01:05,220 --> 00:01:07,250 dan melihat persis bagaimana ini mungkin dilaksanakan 21 00:01:07,250 --> 00:01:09,680 dan bagaimana hal ini dapat mempengaruhi begitu banyak mobil seperti ini. 22 00:01:09,680 --> 00:01:12,840 Jadi di tangan saya di sini adalah pers melepaskan yang dikeluarkan oleh EPA-- 23 00:01:12,840 --> 00:01:14,620 Lingkungan Badan Perlindungan yang 24 00:01:14,620 --> 00:01:18,032 adalah badan pengawas AS yang menangani masalah lingkungan, 25 00:01:18,032 --> 00:01:19,740 dan kemudian aktual pemberitahuan hukum yang 26 00:01:19,740 --> 00:01:22,420 kirim ke Volkswagen hanya beberapa hari yang lalu. 27 00:01:22,420 --> 00:01:26,530 >> Jadi EPA menulis, dan mengungkapkan sekarang publik, sebuah perangkat lunak yang canggih 28 00:01:26,530 --> 00:01:29,390 algoritma tertentu pada Kendaraan Volkswagen mendeteksi 29 00:01:29,390 --> 00:01:32,630 ketika mobil sedang mengalami uji emisi resmi 30 00:01:32,630 --> 00:01:36,505 dan ternyata emisi penuh kontrol hanya pada saat tes. 31 00:01:36,505 --> 00:01:38,380 Efektivitas kendaraan ini polusi 32 00:01:38,380 --> 00:01:43,260 perangkat kontrol emisi adalah sangat dikurangi selama semua mengemudi normal 33 00:01:43,260 --> 00:01:44,320 situasi. 34 00:01:44,320 --> 00:01:48,190 Hal ini mengakibatkan mobil yang memenuhi standar di laboratorium atau pengujian 35 00:01:48,190 --> 00:01:52,790 stasiun, tapi selama operasi normal memancarkan oxides-- nitrogen atau NOx-- 36 00:01:52,790 --> 00:01:54,950 sampai dengan 40 kali standar. 37 00:01:54,950 --> 00:01:58,220 Perangkat lunak yang diproduksi oleh Volkswagen adalah perangkat kutipan tanda kutip, kekalahan, 38 00:01:58,220 --> 00:02:00,650 seperti yang didefinisikan oleh Clean Air Act di Amerika Serikat. 39 00:02:00,650 --> 00:02:03,410 >> Mereka pergi dengan mengatakan bahwa EPA dan lembaga lain 40 00:02:03,410 --> 00:02:07,020 menemukan perangkat kekalahan software setelah analisis independen 41 00:02:07,020 --> 00:02:09,660 oleh para peneliti di Barat Universitas Virginia. 42 00:02:09,660 --> 00:02:14,160 Polusi NOx memberikan kontribusi untuk nitrogen dioksida, tingkat ozon, 43 00:02:14,160 --> 00:02:15,700 dan partikel halus. 44 00:02:15,700 --> 00:02:18,090 Paparan ini polutan telah dikaitkan 45 00:02:18,090 --> 00:02:20,870 dengan berbagai efek kesehatan yang serius, 46 00:02:20,870 --> 00:02:23,637 termasuk peningkatan asma serangan dan pernapasan lainnya 47 00:02:23,637 --> 00:02:26,470 penyakit yang dapat cukup serius untuk mengirim orang ke rumah sakit. 48 00:02:26,470 --> 00:02:28,660 Paparan ozon dan partikel memiliki juga 49 00:02:28,660 --> 00:02:31,960 dikaitkan dengan prematur kematian karena pernapasan terkait 50 00:02:31,960 --> 00:02:35,690 atau kardiovaskular efek terkait. 51 00:02:35,690 --> 00:02:38,940 Anak-anak, orang tua, orang dengan penyakit pernapasan yang sudah ada sebelumnya 52 00:02:38,940 --> 00:02:42,840 sangat beresiko untuk efek kesehatan dari polusi. 53 00:02:42,840 --> 00:02:45,056 >> Cukup untuk mengatakan, itu cukup serius. 54 00:02:45,056 --> 00:02:46,930 Dan mari kita pergi untuk membaca hanya satu kutipan lebih 55 00:02:46,930 --> 00:02:49,370 dan kemudian kita akan melihat pada implikasi yang mendasari 56 00:02:49,370 --> 00:02:50,920 ini dalam konteks sebuah mobil. 57 00:02:50,920 --> 00:02:53,730 Secara khusus, Volkswagen diproduksi dan diinstal 58 00:02:53,730 --> 00:02:56,210 perangkat lunak dalam apa yang disebut kontrol elektronik 59 00:02:56,210 --> 00:02:59,320 module-- atau ECM-- dari kendaraan ini yang merasakan 60 00:02:59,320 --> 00:03:03,580 ketika kendaraan sedang diuji untuk sesuai dengan standar emisi EPA. 61 00:03:03,580 --> 00:03:07,510 Berdasarkan berbagai masukan termasuk Posisi setir, kendaraan 62 00:03:07,510 --> 00:03:11,280 kecepatan, durasi mesin operasi, dan tekanan udara, 63 00:03:11,280 --> 00:03:13,720 input ini tepatnya dilacak parameter 64 00:03:13,720 --> 00:03:17,600 prosedur pengujian federal yang digunakan untuk uji emisi untuk sertifikasi EPA 65 00:03:17,600 --> 00:03:18,400 tujuan. 66 00:03:18,400 --> 00:03:21,850 >> Selama uji emisi EPA, software kendaraan ECM 67 00:03:21,850 --> 00:03:25,060 berlari software yang diproduksi Hasil emisi compliant. 68 00:03:25,060 --> 00:03:28,340 Pada waktu yang lain, yang software kendaraan ECM 69 00:03:28,340 --> 00:03:31,090 berlari jalan terpisah kalibrasi yang mengurangi 70 00:03:31,090 --> 00:03:34,360 efektivitas sistem kontrol emisi secara keseluruhan, 71 00:03:34,360 --> 00:03:37,864 khususnya katalitik selektif pengurangan NOx Bersandar trap-- 72 00:03:37,864 --> 00:03:39,280 yang kita akan melihat tentang sebentar. 73 00:03:39,280 --> 00:03:43,040 Akibatnya, emisi NOx meningkat dengan faktor 10 sampai 40 kali 74 00:03:43,040 --> 00:03:47,450 di atas tingkat compliant EPA tergantung pada jenis siklus drive. 75 00:03:47,450 --> 00:03:50,800 >> Jadi apa ini benar-benar berarti, dan source code untuk perangkat lunak yang berjalan 76 00:03:50,800 --> 00:03:53,190 pada Volkswagen belum belum diungkapkan kepada publik, 77 00:03:53,190 --> 00:03:56,460 adalah bahwa, secara efektif, ini setara adalah suatu tempat ada di dalam 78 00:03:56,460 --> 00:03:57,830 kode Volkswagen. 79 00:03:57,830 --> 00:04:02,200 Jika Anda sedang diuji, dan jika mobil mendeteksi faktor lingkungan tertentu 80 00:04:02,200 --> 00:04:04,330 seperti roda kemudi posisi atau gerakan 81 00:04:04,330 --> 00:04:06,710 atau ketiadaan mobil atau sejumlah faktor lain 82 00:04:06,710 --> 00:04:09,940 yang saat ini dihipotesiskan untuk menjadi bagian dari formula ini, 83 00:04:09,940 --> 00:04:12,370 mereka hanya menyalakan emisi penuh mengontrol. 84 00:04:12,370 --> 00:04:15,670 Dengan kata lain, mereka mulai memancarkan kurang dari polutan. 85 00:04:15,670 --> 00:04:18,769 >> Lain, dalam setiap situasi lain ketika itu tidak terdeteksi sebagai 86 00:04:18,769 --> 00:04:20,790 di laboratorium, mereka hanya tidak. 87 00:04:20,790 --> 00:04:24,320 Dan sehingga Anda dapat menyederhanakan ini ke lebih pseudocode beton dengan sesuatu 88 00:04:24,320 --> 00:04:24,820 seperti ini. 89 00:04:24,820 --> 00:04:27,810 Jika roda yang beralih tetapi kemudi tidak, sugestif 90 00:04:27,810 --> 00:04:30,060 bahwa mobil itu pada beberapa jenis silinder yang berputar 91 00:04:30,060 --> 00:04:32,550 tetapi dalam beberapa jenis gudang sedang diuji, 92 00:04:32,550 --> 00:04:36,070 kemudian berperilaku sebagai EPA ingin Anda. 93 00:04:36,070 --> 00:04:37,960 Jika tidak tidak. 94 00:04:37,960 --> 00:04:40,420 Jadi mari kita lihat di video pendek yang 95 00:04:40,420 --> 00:04:45,391 mengambil melihat apa implikasi adalah ini benar-benar mekanis. 96 00:04:45,391 --> 00:04:48,620 >> [VIDEO PLAYBACK] 97 00:04:48,620 --> 00:04:52,800 >> -Terakhir Jumat EPA mengumumkan bahwa beberapa Mobil Volkswagen Audi dibuat antara 2009 98 00:04:52,800 --> 00:04:55,840 dan tahun ini menggunakan yang disebut perangkat kekalahan 99 00:04:55,840 --> 00:04:59,060 untuk berkeliling hukum emisi dirancang untuk menjaga udara bersih. 100 00:04:59,060 --> 00:05:01,700 Tapi apa artinya tepatnya? 101 00:05:01,700 --> 00:05:04,666 >> Nah, mobil modern memiliki puluhan komputer di dalamnya. 102 00:05:04,666 --> 00:05:07,040 Dan beberapa dari mereka komputer membantu mengkoordinasikan fungsi 103 00:05:07,040 --> 00:05:09,590 mesin untuk optimal kinerja sambil memastikan 104 00:05:09,590 --> 00:05:12,340 bahwa tidak ada terlalu banyak sampah yang keluar dari pipa knalpot. 105 00:05:12,340 --> 00:05:15,170 Mereka sudah benar-benar telah bekerja cara ini selama beberapa dekade sekarang. 106 00:05:15,170 --> 00:05:17,380 Pada dasarnya, setiap bagian mesin mobil modern 107 00:05:17,380 --> 00:05:20,080 memiliki sensor atau kontroler di atasnya, dan komputer ini 108 00:05:20,080 --> 00:05:23,460 membaca data ribuan kali per penyesuaian pembuatan kedua 109 00:05:23,460 --> 00:05:26,220 seperti rasio bahan bakar udara yang masuk ke silinder. 110 00:05:26,220 --> 00:05:28,730 >> Ini kecurangan Volkswagen dan model Audi yang diesel, 111 00:05:28,730 --> 00:05:30,890 dan mesin diesel memiliki satu lagi komputer sangat penting 112 00:05:30,890 --> 00:05:34,030 parameter dikendalikan, yang merupakan jumlah bahan bakar yang tidak terbakar akan 113 00:05:34,030 --> 00:05:35,200 ke knalpot. 114 00:05:35,200 --> 00:05:36,310 Sekarang yang terdengar buruk. 115 00:05:36,310 --> 00:05:39,642 Tidak terdengar seperti Anda ingin bahan bakar tidak terbakar masuk ke knalpot. 116 00:05:39,642 --> 00:05:41,600 Tapi dalam kasus diesel, Anda memiliki sesuatu 117 00:05:41,600 --> 00:05:46,110 disebut perangkap NOx yang merupakan perangkat yang menyerap dan perangkap untuk nitrogen oksida 118 00:05:46,110 --> 00:05:48,880 yang polutan yang akan jika tidak pergi ke atmosfer. 119 00:05:48,880 --> 00:05:53,040 Dan efek yang perangkap NOx ditingkatkan dengan bahan bakar yang tidak terbakar. 120 00:05:53,040 --> 00:05:56,650 Jadi perangkat kekalahan adalah program khusus dalam komputer ini yang dapat membuatnya 121 00:05:56,650 --> 00:05:59,527 terlihat seperti mobil memenuhi emisi standar bahkan ketika tidak. 122 00:05:59,527 --> 00:06:01,110 Volkswagen memiliki masalah pada tangan. 123 00:06:01,110 --> 00:06:04,050 Mesin diesel yang dikenal untuk mendapatkan ekonomi bahan bakar besar, 124 00:06:04,050 --> 00:06:07,510 tapi perangkap NOx hanya bekerja dengan baik ketika lebih banyak bahan bakar yang digunakan. 125 00:06:07,510 --> 00:06:10,460 Sehingga mobil akan mendeteksi, menggunakan perangkat kekalahan ini, 126 00:06:10,460 --> 00:06:13,870 ketika mendapatkan emisi tes, itu akan menggunakan lebih banyak bahan bakar, 127 00:06:13,870 --> 00:06:16,830 membuat NOx kerja perangkap baik, emisi akan baik-baik saja. 128 00:06:16,830 --> 00:06:21,130 Tapi kemudian Anda mendapatkan di jalan, perangkat mematikan, Anda membakar lebih sedikit bahan bakar 129 00:06:21,130 --> 00:06:24,256 tetapi Anda meletakkan sebanyak 40 kali lebih polutan ke atmosfer. 130 00:06:24,256 --> 00:06:26,130 Tapi bagaimana sih melakukan mobil tahu bahwa itu 131 00:06:26,130 --> 00:06:27,720 sedang diuji untuk kepatuhan emisi? 132 00:06:27,720 --> 00:06:30,590 EPA mengatakan itu adalah canggih sistem yang diperiksa hal-hal 133 00:06:30,590 --> 00:06:34,090 seperti posisi roda kemudi, kecepatan, berapa lama mesin itu pada, 134 00:06:34,090 --> 00:06:35,507 dan bahkan tekanan atmosfer. 135 00:06:35,507 --> 00:06:37,673 Dengan kata lain, ada ada cara ini adalah disengaja 136 00:06:37,673 --> 00:06:40,260 karena software ini dirancang sangat hati-hati untuk mendeteksi 137 00:06:40,260 --> 00:06:41,630 tes emisi resmi. 138 00:06:41,630 --> 00:06:43,588 Itu beberapa cukup serius penipuan dan itulah 139 00:06:43,588 --> 00:06:45,420 mengapa Volkswagen di masalah serius tersebut. 140 00:06:45,420 --> 00:06:48,600 Bahkan, CEO mereka, Martin Winterkorn, hanya mengundurkan diri. 141 00:06:48,600 --> 00:06:49,820 >> Jadi apa yang terjadi selanjutnya? 142 00:06:49,820 --> 00:06:53,900 Nah, jika Anda salah satu dari setengah juta jettas diesel, Beatles, Golfs, Passats, 143 00:06:53,900 --> 00:06:56,220 atau Audi A3s dilakukan, kabar baik adalah 144 00:06:56,220 --> 00:06:57,886 bahwa mobil Anda masih aman untuk berkendara. 145 00:06:57,886 --> 00:07:00,510 Anda tidak harus menyimpannya sampai Volkswagen mengeluarkan recall. 146 00:07:00,510 --> 00:07:02,509 Tapi di beberapa titik mereka mungkin akan memiliki 147 00:07:02,509 --> 00:07:04,230 untuk memperbarui perangkat lunak di dalam mobil Anda. 148 00:07:04,230 --> 00:07:06,927 Ketika itu terjadi, Anda mungkin mendapatkan lebih sedikit mil per tangki. 149 00:07:06,927 --> 00:07:09,260 Pengacara sudah bersiap untuk gugatan class action 150 00:07:09,260 --> 00:07:12,500 sehingga pemilik mungkin mendapatkan kompensasi di beberapa titik di masa depan. 151 00:07:12,500 --> 00:07:15,832 Tapi itu tidak akan terjadi dalam waktu dekat. 152 00:07:15,832 --> 00:07:16,711 >> [END PLAYBACK] 153 00:07:16,711 --> 00:07:19,960 DAVID J. Malan: Jadi ini benar-benar menimbulkan pertanyaan gambaran yang lebih besar menarik 154 00:07:19,960 --> 00:07:20,660 sebagai percaya. 155 00:07:20,660 --> 00:07:21,160 Benar? 156 00:07:21,160 --> 00:07:24,300 Semua dari kita memiliki iPhone atau Android atau sesuatu di saku kita kemungkinan besar 157 00:07:24,300 --> 00:07:26,500 hari ini, atau laptop di lap kami yang 158 00:07:26,500 --> 00:07:28,510 menjalankan perangkat lunak yang dibuat oleh Apple dan Microsoft 159 00:07:28,510 --> 00:07:30,710 dan tandan perusahaan lain. 160 00:07:30,710 --> 00:07:34,240 Tapi bagaimana kita tahu bahwa apa yang produk perangkat lunak ini melakukan 161 00:07:34,240 --> 00:07:37,680 sebenarnya apa ini perusahaan mengatakan mereka lakukan? 162 00:07:37,680 --> 00:07:39,610 >> Misalnya, siapa yang mengatakan bahwa setiap kali Anda 163 00:07:39,610 --> 00:07:42,200 membuat panggilan telepon pada iPhone Anda atau telepon Android atau sejenisnya, 164 00:07:42,200 --> 00:07:45,650 bahwa nomor telepon juga tidak yang diupload ke server beberapa perusahaan 165 00:07:45,650 --> 00:07:48,399 karena beberapa program yang sudah tertulis, apakah itu operasi 166 00:07:48,399 --> 00:07:51,070 sistem itu sendiri seperti iOS atau Android, atau karena Anda men-download 167 00:07:51,070 --> 00:07:53,880 beberapa aplikasi pihak ketiga yang entah bagaimana mendengarkan 168 00:07:53,880 --> 00:07:57,120 untuk semua yang Anda mengetikkan atau segala sesuatu yang Anda benar-benar mengatakan. 169 00:07:57,120 --> 00:07:59,500 Bagaimana Anda tahu bahwa, ketika kalian menjalankan dentang 170 00:07:59,500 --> 00:08:02,590 atau Membuat untuk mengkompilasi Anda software sendiri dalam CS50, bagaimana 171 00:08:02,590 --> 00:08:06,080 apakah Anda staf yang CS50 sendiri, dengan cara perpustakaan CS50, 172 00:08:06,080 --> 00:08:08,690 belum login setiap string yang Anda pernah mendapatkan 173 00:08:08,690 --> 00:08:10,276 atau setiap inci Anda pernah mendapatkan? 174 00:08:10,276 --> 00:08:12,900 Nah, Anda pasti bisa melihat pada kode sumber untuk sesuatu 175 00:08:12,900 --> 00:08:15,233 seperti perpustakaan CS50, Anda bisa melihat kode sumber 176 00:08:15,233 --> 00:08:18,170 untuk sistem operasi Linux berjalan pada CS50 IDE. 177 00:08:18,170 --> 00:08:23,090 Tapi presentasi menakjubkan diberikan kembali pada tahun 1984 178 00:08:23,090 --> 00:08:26,730 di penerimaan Turing Award oleh ilmuwan komputer sangat terkenal dikenal 179 00:08:26,730 --> 00:08:29,750 as-- bernama Ken Thompson yang menerima Turing Award yang 180 00:08:29,750 --> 00:08:33,500 adalah semacam ilmu komputer Hadiah Nobel, jika Anda mau, 181 00:08:33,500 --> 00:08:35,309 untuk karyanya pada sistem operasi yang disebut 182 00:08:35,309 --> 00:08:39,039 Unix, yang sangat mirip di semangat untuk apa yang kita gunakan yang Linux. 183 00:08:39,039 --> 00:08:41,960 Dan pertanyaan ia bertanya dalam bukunya pidato penerimaan, pada dasarnya 184 00:08:41,960 --> 00:08:44,910 meletakkan kerangka kerja untuk tahun dan tahun diskusi 185 00:08:44,910 --> 00:08:46,970 tentang kepercayaan dan keamanan, adalah ini. 186 00:08:46,970 --> 00:08:50,410 Sejauh mana harus satu kepercayaan Pernyataan bahwa program-- sepotong 187 00:08:50,410 --> 00:08:53,010 dari software-- bebas dari Trojan horse? 188 00:08:53,010 --> 00:08:56,500 Mungkin itu lebih penting untuk mempercayai orang-orang yang menulis perangkat lunak. 189 00:08:56,500 --> 00:08:58,650 >> Dan pada kenyataannya, kita sudah terkait untuk bicara bahwa ia 190 00:08:58,650 --> 00:09:02,400 berikan saat menerima penghargaan ini di era 80-an di website CS50 ini 191 00:09:02,400 --> 00:09:04,030 bawah halaman Lectures untuk hari ini. 192 00:09:04,030 --> 00:09:06,071 Karena apa yang akan Anda lihat adalah bahwa dia benar-benar memberikan 193 00:09:06,071 --> 00:09:09,430 contoh yang cukup sederhana tentang bagaimana bahkan kompilator seperti dentang atau apa pun 194 00:09:09,430 --> 00:09:13,950 compiler lain telah digunakan di masa lalu, bagaimana jika tertanam dalam kita compiler 195 00:09:13,950 --> 00:09:18,190 diri menggunakan sedikit jika Kondisi yang pada dasarnya mengatakan, 196 00:09:18,190 --> 00:09:22,360 jika Anda melihat bahwa kode ini menggunakan fungsi GetString atau getInt 197 00:09:22,360 --> 00:09:26,600 fungsi, pergi ke depan dan masukkan pintu belakang atau Trojan horse 198 00:09:26,600 --> 00:09:29,340 sehingga program yang sekarang memiliki beberapa angka nol 199 00:09:29,340 --> 00:09:30,930 dan orang-orang yang melakukan sesuatu yang berbahaya. 200 00:09:30,930 --> 00:09:33,080 Penebangan semua Anda keystrokes, meng-upload data yang 201 00:09:33,080 --> 00:09:35,100 ke beberapa server, atau benar-benar sesuatu. 202 00:09:35,100 --> 00:09:37,290 >> Dan apa Ken Thompson terus dilakukan di ceramahnya 203 00:09:37,290 --> 00:09:40,580 adalah untuk menunjukkan bahwa bahkan jika Anda memiliki akses ke sumber 204 00:09:40,580 --> 00:09:43,794 kode kompilator yang jahat mungkin melakukan hal ini, 205 00:09:43,794 --> 00:09:46,210 itu tidak masalah karena ada ayam ini dan telur 206 00:09:46,210 --> 00:09:49,500 realitas dari banyak masa lalu tahun dimana compiler 207 00:09:49,500 --> 00:09:51,960 digunakan untuk mengkompilasi sendiri. 208 00:09:51,960 --> 00:09:55,440 Dengan kata lain, jalan kembali ketika seseorang telah telah menulis compiler pertama. 209 00:09:55,440 --> 00:09:59,060 Dan setelah itu, setiap saat mereka telah memperbarui compiler dengan mengubah kode sumbernya, 210 00:09:59,060 --> 00:10:02,020 menambahkan fitur dan mengkompilasi ulang itu untuk orang-orang seperti kita untuk menggunakan, baik, 211 00:10:02,020 --> 00:10:04,270 mereka menggunakan tua versi compiler 212 00:10:04,270 --> 00:10:06,370 untuk mengkompilasi baru versi compiler. 213 00:10:06,370 --> 00:10:08,370 Dan jika anda melihat di pembicaraan yang ia berikan, 214 00:10:08,370 --> 00:10:10,970 Anda akan melihat bahwa karena dari bundar itu, 215 00:10:10,970 --> 00:10:14,330 Anda benar-benar dapat memiliki bug atau Trojan kuda tertanam dalam perangkat lunak 216 00:10:14,330 --> 00:10:14,990 kita sedang menggunakan. 217 00:10:14,990 --> 00:10:18,010 Dan bahkan jika Anda melihat kode sumber untuk program-program, 218 00:10:18,010 --> 00:10:21,550 bahkan tidak mungkin jelas karena tipu sebenarnya 219 00:10:21,550 --> 00:10:24,710 dalam beberapa versi lama dari compiler bahwa sejak telah 220 00:10:24,710 --> 00:10:27,340 menyuntikkan ancaman ke dalam perangkat lunak kami. 221 00:10:27,340 --> 00:10:29,740 >> Yang hanya untuk mengatakan, kami benar-benar tidak bisa dan tidak boleh 222 00:10:29,740 --> 00:10:32,939 software kepercayaan yang berjalan pada laptop kita atau telepon atau sejumlah tempat. 223 00:10:32,939 --> 00:10:36,230 Dan pada kenyataannya, kemudian di semester ini ketika kita mulai berbicara tentang pemrograman web 224 00:10:36,230 --> 00:10:38,521 dan benar-benar mulai membangun aplikasi web diri kita sendiri, 225 00:10:38,521 --> 00:10:40,285 kita akan bicara tentang ini ancaman dan lain-lain. 226 00:10:40,285 --> 00:10:43,410 Sekarang, Anda mungkin bertanya-tanya dan melihat bahwa ada Darth kecil kecil 227 00:10:43,410 --> 00:10:45,842 Vader dalam klip yang The Verge menunjukkan ada 228 00:10:45,842 --> 00:10:47,550 tentang Volkswagen. Jika Anda belum pernah melihat, saya 229 00:10:47,550 --> 00:10:49,190 pikir kita harus meringankan mood karena ini adalah semua 230 00:10:49,190 --> 00:10:50,780 sangat menyedihkan dan menakutkan. 231 00:10:50,780 --> 00:10:52,910 Aku akan melihat kembali di Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 ketika komersial Volkswagen-- dan ini 233 00:10:55,300 --> 00:10:59,620 hampir membuat mereka menyenangkan again-- ditayangkan untuk pertama kalinya di TV. 234 00:10:59,620 --> 00:11:04,039 Ini adalah 60 klip kedua yang saya pikir Anda akan menikmati. 235 00:11:04,039 --> 00:11:04,705 [VIDEO PLAYBACK] 236 00:11:04,705 --> 00:11:08,198 [MUSIK - TEMA DARI "STAR WARS"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [ANJING kulit yang] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [CAR MULAI] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [END PLAYBACK] 243 00:12:05,955 --> 00:12:06,830 DAVID J. Malan: Ya. 244 00:12:06,830 --> 00:12:07,663 Aku hanya memeriksa. 245 00:12:07,663 --> 00:12:11,360 Mobil yang ada di daftar pelanggaran. 246 00:12:11,360 --> 00:12:12,000 Baiklah. 247 00:12:12,000 --> 00:12:14,040 Jadi kita melihat beberapa pseudocode beberapa saat yang lalu. 248 00:12:14,040 --> 00:12:15,380 Dan ini lebih besar potongan kode pseudocode 249 00:12:15,380 --> 00:12:16,921 bahwa kita telah melihat beberapa kali sejauh ini. 250 00:12:16,921 --> 00:12:19,970 Dan mari kita gunakan ini adalah kesempatan sekarang untuk memperkenalkan pemrograman baru 251 00:12:19,970 --> 00:12:23,776 teknik yang kita lakukan melihat algorithmically 252 00:12:23,776 --> 00:12:25,400 minggu lalu ketika kami melihat merge sort. 253 00:12:25,400 --> 00:12:28,270 Tapi mari kita memformalkan dan melihat bagaimana kita mungkin menggunakannya dalam kode aktual, 254 00:12:28,270 --> 00:12:30,350 dan kemudian kita akan menggunakan ini teknik jalan yang paling 255 00:12:30,350 --> 00:12:32,000 kemungkinan untuk memecahkan masalah tertentu lainnya. 256 00:12:32,000 --> 00:12:35,790 >> Jadi ini adalah salah satu program pertama kami pernah menulis, meskipun dalam kode pseudo. 257 00:12:35,790 --> 00:12:37,790 Dan apa program ini memungkinkan kami untuk melakukan kursus 258 00:12:37,790 --> 00:12:41,510 adalah untuk menemukan Mike Smith dalam buku telepon. 259 00:12:41,510 --> 00:12:46,216 Dan melihat di baris tertentu delapan dan 11 yang memiliki pernyataan Go To ini. 260 00:12:46,216 --> 00:12:48,090 Dan pada kenyataannya, beberapa bahasa, C di antara mereka, 261 00:12:48,090 --> 00:12:50,006 benar-benar melakukan memiliki Pernyataan yang secara harfiah 262 00:12:50,006 --> 00:12:52,710 pergi ke yang memungkinkan Anda untuk melompat ke baris tertentu. 263 00:12:52,710 --> 00:12:55,470 Ini umumnya disukai karena dapat sangat mudah disalahgunakan 264 00:12:55,470 --> 00:12:58,490 dan Anda dapat mulai melompat Anda Program seluruh tempat sebagai lawan 265 00:12:58,490 --> 00:13:00,690 untuk menggunakan jenis logika dan aliran kontrol 266 00:13:00,690 --> 00:13:04,000 bahwa kami telah digunakan sejauh ini dengan hanya loop dan kondisi dan sejenisnya. 267 00:13:04,000 --> 00:13:08,660 >> Tapi kita dapat menyederhanakan algoritma ini dalam kode pseudo sebagai berikut. 268 00:13:08,660 --> 00:13:11,250 Alih-alih ini berulang atau pendekatan perulangan 269 00:13:11,250 --> 00:13:14,160 di mana kita terus kembali dan kembali dan kembali ke garis tiga, 270 00:13:14,160 --> 00:13:18,300 kenapa tidak kita hanya jenis menyepak bola dan lebih umumnya mengatakan sejalan tujuh dan 10, 271 00:13:18,300 --> 00:13:20,570 hanya mengganti dua pasang garis dengan, 272 00:13:20,570 --> 00:13:22,810 lain jika Smith adalah awal dalam buku kita akan 273 00:13:22,810 --> 00:13:25,110 mencari Mike di kiri setengah dari buku ini. 274 00:13:25,110 --> 00:13:28,560 Lain jika Smith adalah kemudian di buku, mencari Mike di kanan 275 00:13:28,560 --> 00:13:29,540 setengah buku. 276 00:13:29,540 --> 00:13:31,180 Dan melihat sudah bundar tersebut. 277 00:13:31,180 --> 00:13:31,680 Benar? 278 00:13:31,680 --> 00:13:34,250 Aku mencari Mike di buku telepon dan kemudian 279 00:13:34,250 --> 00:13:37,090 Saya akhirnya memukul mungkin baris tujuh atau mungkin garis 10 280 00:13:37,090 --> 00:13:41,089 dan instruksi saya kepada diri sendiri adalah pencarian untuk Mike di setengah dari buku telepon. 281 00:13:41,089 --> 00:13:42,380 Nah, bagaimana cara mencari Mike? 282 00:13:42,380 --> 00:13:44,213 Aku di tengah-tengah mencari Mike, mengapa 283 00:13:44,213 --> 00:13:45,860 kau semacam mengirimkan saya dalam lingkaran? 284 00:13:45,860 --> 00:13:49,590 Tapi itu OK karena apa terjadi dengan ukuran masalah, 285 00:13:49,590 --> 00:13:52,630 seperti yang ditulis dalam baris 7 dan 10? 286 00:13:52,630 --> 00:13:54,989 Kami tidak hanya mengatakan pencarian untuk Mike, mencari Mike. 287 00:13:54,989 --> 00:13:56,280 Kami secara khusus mengatakan apa? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Mencari dia di kiri setengah dari kanan setengah yang efektif 290 00:14:01,610 --> 00:14:03,440 setengah ukuran dari masalah. 291 00:14:03,440 --> 00:14:07,170 Jadi itu OK bahwa kita jenis terlibat dalam bundar ini, 292 00:14:07,170 --> 00:14:09,180 argumen ini melingkar, karena setidaknya kami 293 00:14:09,180 --> 00:14:11,090 membuat masalah yang lebih kecil dan lebih kecil. 294 00:14:11,090 --> 00:14:14,220 Dan akhirnya kita akan mencapai bahwa kasus yang disebut basis mana 295 00:14:14,220 --> 00:14:16,780 kita hanya memiliki satu halaman left-- sebagai relawan kami minggu lalu 296 00:14:16,780 --> 00:14:18,684 did-- kami memiliki satu halaman kiri dan kemudian kita tidak 297 00:14:18,684 --> 00:14:21,600 harus terus mencari Mike Smith karena dia baik pada halaman yang 298 00:14:21,600 --> 00:14:23,080 atau dia tidak. 299 00:14:23,080 --> 00:14:27,480 >> Jadi bagaimana kita bisa menerapkan ide ini, ini semacam bundar dalam kode yang sebenarnya? 300 00:14:27,480 --> 00:14:31,030 Nah, kita dapat memanfaatkan teknik yang umumnya dikenal sebagai rekursi. 301 00:14:31,030 --> 00:14:33,960 Dan kita telah melihat ini di pseudocode untuk merge sort pekan lalu. 302 00:14:33,960 --> 00:14:37,190 Ingat bahwa ini adalah pseudocode untuk merge sort. 303 00:14:37,190 --> 00:14:40,560 Ini bisa dibilang lebih sederhana daripada gelembung atau seleksi atau insertion sort 304 00:14:40,560 --> 00:14:43,310 hanya dalam hal kesederhanaan dengan mana Anda dapat mengungkapkannya. 305 00:14:43,310 --> 00:14:46,750 >> Tapi itu karena kami semacam sirkuler 306 00:14:46,750 --> 00:14:51,350 mengatakan, mencari sesuatu dengan mencari lagi. 307 00:14:51,350 --> 00:14:53,960 Tapi kami mencari baik di kiri setengah atau setengah benar 308 00:14:53,960 --> 00:14:56,070 dan kemudian akhirnya kami penggabungan dalam kasus ini. 309 00:14:56,070 --> 00:14:58,520 Tapi di sini, juga, dengan dua baris semacam, 310 00:14:58,520 --> 00:15:01,320 Apakah kita lagi memiliki ini Ide rekursi. 311 00:15:01,320 --> 00:15:05,350 Dan konkret apa artinya ini, dalam konteks algoritma, 312 00:15:05,350 --> 00:15:10,880 adalah bahwa algoritma adalah rekursif jika menggunakan atau menyebut dirinya. 313 00:15:10,880 --> 00:15:14,330 >> Atau dalam hal C, fungsi adalah recursive-- fungsi yang disebut 314 00:15:14,330 --> 00:15:18,510 foo adalah rekursif jika foo, di suatu tempat di kode sumbernya, 315 00:15:18,510 --> 00:15:21,250 memanggil fungsi foo itu sendiri. 316 00:15:21,250 --> 00:15:25,790 Dan itu buruk jika semua foo pernah melakukan adalah menyebut dirinya lagi dan lagi. 317 00:15:25,790 --> 00:15:30,600 Ini OK jika foo akhirnya berhenti, seperti halnya menggabungkan semacam, dengan mengatakan, tunggu sebentar, 318 00:15:30,600 --> 00:15:32,980 jika masalah ini super kecil, misalnya, 319 00:15:32,980 --> 00:15:35,840 atau kutemui Aku mencari, hanya kembali. 320 00:15:35,840 --> 00:15:41,000 Jangan rekursif, tidak siklis menyebut diriku lagi. 321 00:15:41,000 --> 00:15:44,200 >> Dan jadi mari kita lihat bagaimana ini mungkin benar-benar bekerja. 322 00:15:44,200 --> 00:15:48,430 Jadi aku akan pergi ke depan dan terbuka dua contoh kode sumber di sini. 323 00:15:48,430 --> 00:15:50,321 Salah satu yang disebut sigma 0. 324 00:15:50,321 --> 00:15:52,320 Dan ini sama sekali tidak rekursif, tapi mari kita 325 00:15:52,320 --> 00:15:53,694 a melihat apa program ini tidak. 326 00:15:53,694 --> 00:15:55,737 Aku sudah dilucuti semua komentar dari itu tetapi semua 327 00:15:55,737 --> 00:15:58,070 dari kode sumber pada CS50 ini website memiliki komentar jika Anda 328 00:15:58,070 --> 00:15:59,570 ingin membacanya lagi nanti. 329 00:15:59,570 --> 00:16:02,010 Dan mari kita lakukan beberapa kewarasan cek di sini. 330 00:16:02,010 --> 00:16:06,640 >> Jadi di bagian atas kode ini, kita harus menyertakan CS50.h. 331 00:16:06,640 --> 00:16:07,650 Apa ini lakukan? 332 00:16:07,650 --> 00:16:08,990 Mengapa di sini? 333 00:16:08,990 --> 00:16:11,740 Dalam istilah awam yang wajar. 334 00:16:11,740 --> 00:16:12,424 Apa fungsinya? 335 00:16:12,424 --> 00:16:12,858 Ya. 336 00:16:12,858 --> 00:16:14,160 >> AUDIENCE: Sehingga fungsi getInt bekerja. 337 00:16:14,160 --> 00:16:16,243 >> DAVID J. Malan: Jadi yang fungsi getInt bekerja. 338 00:16:16,243 --> 00:16:18,115 Karena dalam hal ini File, CS50.h, yang 339 00:16:18,115 --> 00:16:20,950 kita akan melihat sebelum lama di hal kode sumbernya, 340 00:16:20,950 --> 00:16:23,270 memiliki banyak fungsi declared-- getInt, GetString, 341 00:16:23,270 --> 00:16:26,950 dan sekelompok others-- dan kecuali kami benar-benar memiliki yang Sertakan line, 342 00:16:26,950 --> 00:16:29,320 Klang compiler tidak akan tahu bahwa itu ada. 343 00:16:29,320 --> 00:16:32,400 Dan sama berlaku untuk garis dua di mana int didefinisikan 344 00:16:32,400 --> 00:16:35,101 printf, yang merupakan fungsi kita tetap menggunakan sedikit. 345 00:16:35,101 --> 00:16:37,850 Sekarang, garis empat tampaknya sedikit funky karena itu hanya satu kapal. 346 00:16:37,850 --> 00:16:41,570 Itu punya titik koma, tidak ada keriting kawat gigi, ada kode di dalamnya. 347 00:16:41,570 --> 00:16:44,640 Tapi apa yang kita sebut hal ini di minggu terakhir? 348 00:16:44,640 --> 00:16:45,140 Ya. 349 00:16:45,140 --> 00:16:46,060 Jadi prototipe. 350 00:16:46,060 --> 00:16:48,390 Dan mengapa kita memiliki prototipe yang tampaknya 351 00:16:48,390 --> 00:16:51,050 menjadi berlebihan sedikit biasanya karena kita biasanya 352 00:16:51,050 --> 00:16:53,474 melihat fungsi lagi kemudian dalam file, kan? 353 00:16:53,474 --> 00:16:56,390 Jadi mengapa kita have-- Anda hanya garuk-garuk kepala tapi aku akan mengambilnya. 354 00:16:56,390 --> 00:16:57,302 Ya. 355 00:16:57,302 --> 00:17:00,000 >> AUDIENCE: [tidak terdengar] fungsi setelah utama. 356 00:17:00,000 --> 00:17:01,000 DAVID J. Malan: Tepat. 357 00:17:01,000 --> 00:17:04,089 Sehingga compiler tahu Anda akhirnya akan menentukan atau menerapkan 358 00:17:04,089 --> 00:17:06,579 bahwa fungsi utama setelah, mungkin. 359 00:17:06,579 --> 00:17:08,462 Jadi dentang dan paling compiler adalah jenis bodoh 360 00:17:08,462 --> 00:17:10,510 dan mereka hanya akan tahu apa yang Anda katakan pada mereka. 361 00:17:10,510 --> 00:17:12,569 Dan jika Anda ingin menggunakan fungsi yang disebut sigma, 362 00:17:12,569 --> 00:17:15,710 Anda lebih baik mengajar compiler bahwa itu ada di muka. 363 00:17:15,710 --> 00:17:17,970 >> Sekarang, itu sendiri utama, bahkan meskipun itu sekelompok baris, 364 00:17:17,970 --> 00:17:19,839 cukup familiar mudah-mudahan sekarang. 365 00:17:19,839 --> 00:17:21,942 Itu punya do while tujuan yang dalam hidup 366 00:17:21,942 --> 00:17:24,400 di sini tampaknya adalah untuk mendapatkan bilangan bulat positif dari pengguna. 367 00:17:24,400 --> 00:17:27,349 Dan terus mengganggu dia atau sampai mereka bekerja sama. 368 00:17:27,349 --> 00:17:30,670 Kemudian pada baris 16 Saya memiliki panggilan yang menarik. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Yang di sisi kiri sisi memberikan saya sebuah Int 371 00:17:33,710 --> 00:17:36,650 yang dapat store-- disebut Answer-- yang akan menyimpan, tampaknya, 372 00:17:36,650 --> 00:17:39,090 nilai kembali dari sigma. 373 00:17:39,090 --> 00:17:41,840 Jadi sigma hanya sebuah sewenang-wenang tapi bermakna nama 374 00:17:41,840 --> 00:17:44,500 yang saya berikan ke fungsi tujuan yang dalam hidup 375 00:17:44,500 --> 00:17:47,680 adalah untuk mengambil satu argument-- kita akan menyebutnya N di case-- ini 376 00:17:47,680 --> 00:17:52,280 dan hanya untuk mengambil jumlah nomor yang ditambah setiap angka positif itu 377 00:17:52,280 --> 00:17:53,200 lebih kecil dari itu. 378 00:17:53,200 --> 00:17:58,140 >> Jadi jika saya lulus dalam jumlah 2 sampai sigma, saya ingin menambahkan 2 ditambah 1 379 00:17:58,140 --> 00:18:00,240 ditambah 0-- tidak 0-- sehingga memberi saya 3. 380 00:18:00,240 --> 00:18:05,320 Jika saya lulus dalam 3 sampai sigma, saya ingin memiliki 3 ditambah 2 ditambah 1, yang memberi saya 6. 381 00:18:05,320 --> 00:18:05,900 Dan seterusnya. 382 00:18:05,900 --> 00:18:09,750 Jadi itu hanya menambahkan sampai semua nomor kurang dari atau sama dengan itu. 383 00:18:09,750 --> 00:18:12,040 >> Sekarang, di sini aku hanya akan untuk mencetak jawabannya. 384 00:18:12,040 --> 00:18:17,330 Jadi sebagai kewarasan cek cepat, mari kita membuat sigma 0-- dot slash sigma 0-- 385 00:18:17,330 --> 00:18:18,690 dan biarkan aku ketik 2. 386 00:18:18,690 --> 00:18:19,960 Dan saya memang mendapatkan 3. 387 00:18:19,960 --> 00:18:21,240 Biarkan saya ketik 3. 388 00:18:21,240 --> 00:18:22,860 Saya memang mendapatkan 6. 389 00:18:22,860 --> 00:18:27,636 Dan jika ada yang bisa melakukan matematika cepat, jika saya melakukan 50 apa yang akan saya dapatkan? 390 00:18:27,636 --> 00:18:29,839 >> AUDIENCE: [tidak terdengar]. 391 00:18:29,839 --> 00:18:30,880 DAVID J. Malan: Yah, tidak ada. 392 00:18:30,880 --> 00:18:33,340 Tapi 1275 yang cukup dekat. 393 00:18:33,340 --> 00:18:38,850 Jadi ini adalah hasil dari melakukan 50 ditambah 49 ditambah 48 ditambah 47 ditambah 46 394 00:18:38,850 --> 00:18:40,349 semua jalan ke 1. 395 00:18:40,349 --> 00:18:41,390 Jadi itu semua sigma tidak. 396 00:18:41,390 --> 00:18:43,350 Tapi mari kita lihat bagaimana kita sudah dilaksanakan sekarang. 397 00:18:43,350 --> 00:18:45,790 Jadi di sini adalah fungsi itu sendiri. 398 00:18:45,790 --> 00:18:49,000 Dan ini tampaknya tidak memiliki hubungannya dengan rekursi belum. 399 00:18:49,000 --> 00:18:51,070 Bahkan, kita menggunakan Teknik sekolah tua. 400 00:18:51,070 --> 00:18:56,680 Aku menginisialisasi variabel yang disebut sum nol, maka saya memiliki foreloop di sini, 401 00:18:56,680 --> 00:19:00,790 dan aku mendeklarasikan Int disebut Aku, pengaturan itu sama dengan 1-- 402 00:19:00,790 --> 00:19:04,080 meskipun aku bisa mengaturnya sama dengan nol, tapi karena aku melakukan itu, 403 00:19:04,080 --> 00:19:05,340 siapa yang peduli jika itu nol atau satu. 404 00:19:05,340 --> 00:19:06,660 Ini akan tidak berpengaruh. 405 00:19:06,660 --> 00:19:10,110 >> Jadi aku iterasi selama aku adalah kurang dari atau sama dengan m, yang 406 00:19:10,110 --> 00:19:11,671 adalah argumen yang disahkan di. 407 00:19:11,671 --> 00:19:13,670 Dan kemudian saya hanya terus incrementing I. Dan wawasan 408 00:19:13,670 --> 00:19:20,010 loop semua yang saya lakukan adalah melakukan penjumlahan ditambah sama I. Dan itu disengaja. 409 00:19:20,010 --> 00:19:22,326 Saya tidak ingin lakukan, dalam hal ini kasus, seperti sum plus plus. 410 00:19:22,326 --> 00:19:24,790 Saya ingin benar-benar menambahkan nilai saat ini dari saya 411 00:19:24,790 --> 00:19:28,190 yang terus semakin besar dan besar dan lebih besar untuk penghitungan berjalan. 412 00:19:28,190 --> 00:19:30,210 >> Dan kemudian saya kembali sum. 413 00:19:30,210 --> 00:19:33,850 Dan jawabannya mendapat nilai sum. 414 00:19:33,850 --> 00:19:35,282 Dan kemudian saya mencetaknya. 415 00:19:35,282 --> 00:19:37,740 Jadi ada kesempatan di sini, meskipun, untuk jenis menyederhanakan 416 00:19:37,740 --> 00:19:41,260 kode ini secara konseptual dan jenis pukulan satu ini 417 00:19:41,260 --> 00:19:43,250 keberatan dalam hal kesederhanaan meskipun 418 00:19:43,250 --> 00:19:45,700 perlu waktu untuk menyortir dari menghargai mengapa ini 419 00:19:45,700 --> 00:19:47,330 adalah kuat dalam contoh-contoh kecil. 420 00:19:47,330 --> 00:19:50,380 Berikut adalah sigma satu-- sehingga Versi kedua dari kode ini. 421 00:19:50,380 --> 00:19:55,290 Semuanya atas identik sehingga bahwa cerita yang sama berlaku seperti sebelumnya. 422 00:19:55,290 --> 00:19:59,220 Tapi sekarang mari kita melihat pelaksanaan sigma yang 423 00:19:59,220 --> 00:20:05,040 Saya sudah dipangkas menjadi hanya ini lines-- empat baris kode, benar-benar, 424 00:20:05,040 --> 00:20:06,980 ditambah beberapa kurung kurawal dan ruang putih. 425 00:20:06,980 --> 00:20:07,930 >> Tapi apa yang saya lakukan? 426 00:20:07,930 --> 00:20:11,050 Jika m adalah kurang dari atau sama dengan nol, saya perlu jenis menangani 427 00:20:11,050 --> 00:20:12,490 kasus super sederhana. 428 00:20:12,490 --> 00:20:15,450 Dan jika Anda tangan saya nol atau apa negatif yang hanya aneh, 429 00:20:15,450 --> 00:20:17,909 Aku hanya akan sewenang-wenang tetapi secara konsisten kembali nol. 430 00:20:17,909 --> 00:20:20,200 Saya tidak ingin hal ini untuk masuk ke beberapa terbatas aneh 431 00:20:20,200 --> 00:20:21,810 lingkaran karena nilai negatif. 432 00:20:21,810 --> 00:20:25,070 Jadi aku hanya mengatakan, jika Anda memberi saya nol atau kurang, aku kembali nol. 433 00:20:25,070 --> 00:20:28,220 >> Tapi itu bagus karena itu bahwa halaman dari buku telepon 434 00:20:28,220 --> 00:20:28,790 yang tersisa. 435 00:20:28,790 --> 00:20:32,660 Aku menggigit masalah yang sangat spesifik dan tidak memanggil sesuatu rekursif. 436 00:20:32,660 --> 00:20:36,580 Tapi sejalan 31, apa saya tampaknya akan melakukan? 437 00:20:36,580 --> 00:20:39,780 Kurung hanya menjaga hal, mudah-mudahan, sedikit lebih jelas. 438 00:20:39,780 --> 00:20:42,110 Tapi semua saya lakukan adalah aku kembali m-- apapun 439 00:20:42,110 --> 00:20:45,790 Anda tangan me-- ditambah nilai m-- maaf, 440 00:20:45,790 --> 00:20:49,052 ditambah nilai sigma dari m minus 1. 441 00:20:49,052 --> 00:20:50,010 Jadi apa artinya ini? 442 00:20:50,010 --> 00:20:53,965 Jika Anda memberi saya nomor 3 sebagai masukan, jawabannya saya ingin mendapatkan akhirnya 443 00:20:53,965 --> 00:20:57,307 adalah 6 karena 3 ditambah 2 ditambah 1 memberi saya 6. 444 00:20:57,307 --> 00:20:59,390 Tapi bagaimana saya berpikir tentang bagaimana kode ini berjalan? 445 00:20:59,390 --> 00:21:03,070 Pertama kali saya sebut sigma dan saya lulus dalam nilai 3, 446 00:21:03,070 --> 00:21:07,960 itu seperti mengatakan pion kertas, inilah nilai 3 447 00:21:07,960 --> 00:21:09,920 dan aku sudah melewati ini sebagai sigma. 448 00:21:09,920 --> 00:21:13,090 3 jelas tidak kurang dari 0 sehingga kondisi IF tidak berlaku. 449 00:21:13,090 --> 00:21:14,020 ELSE tidak. 450 00:21:14,020 --> 00:21:14,990 Jadi apa yang harus saya lakukan? 451 00:21:14,990 --> 00:21:19,902 Saya ingin kembali m, yang 3, ditambah sigma dari m minus 1. 452 00:21:19,902 --> 00:21:21,110 Jadi biarkan aku melacak ini. 453 00:21:21,110 --> 00:21:22,710 Aku akan menempatkan ini selembar kertas ke bawah. 454 00:21:22,710 --> 00:21:24,668 Dan apa nilai, menjadi jelas, aku akan lulus 455 00:21:24,668 --> 00:21:26,540 ke sigma pada saat ini dalam cerita? 456 00:21:26,540 --> 00:21:28,080 Nomor berapa? 457 00:21:28,080 --> 00:21:28,610 2, kan? 458 00:21:28,610 --> 00:21:29,670 3 minus 1 adalah 2. 459 00:21:29,670 --> 00:21:32,000 Jadi saya hanya perlu sedikit secarik kertas di sini. 460 00:21:32,000 --> 00:21:33,931 Jadi sekarang sigma semakin dipanggil lagi. 461 00:21:33,931 --> 00:21:35,930 Dan saya sudah sengaja memasang bawah ini karena itu 462 00:21:35,930 --> 00:21:38,070 jenis seperti berhenti bahwa versi cerita 463 00:21:38,070 --> 00:21:40,720 karena sekarang aku fokus pada sinyal dari m minus 1. 464 00:21:40,720 --> 00:21:42,660 Jadi m adalah 3, m minus 1 adalah 2. 465 00:21:42,660 --> 00:21:45,110 Jadi di sini adalah 2 bahwa saya telah berlalu. 466 00:21:45,110 --> 00:21:48,510 2 jelas tidak kurang dari 0 sehingga kasus itu tidak berlaku. 467 00:21:48,510 --> 00:21:53,445 Lain aku kembali m, yang ini hal, ditambah sigma dari nilai apa? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Jadi jika sigma dari 1-- karena m adalah sekarang 2 jadi 2 minus 1 adalah 1. 470 00:21:59,650 --> 00:22:01,950 Jadi sekarang aku punya hanya nilai 1. 471 00:22:01,950 --> 00:22:04,810 Aku melewati hanya nomor 1 untuk fungsi sigma-- 472 00:22:04,810 --> 00:22:09,120 atau diriku di sini-jadi 1 adalah jelas tidak kurang dari nol, masih tidak berlaku. 473 00:22:09,120 --> 00:22:12,970 >> Lain kembali 1 ditambah sigma apa? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Jadi saya hanya ingat itu. 476 00:22:14,678 --> 00:22:15,920 Aku akan kembali ke nanti. 477 00:22:15,920 --> 00:22:18,060 Sekarang aku akan pergi ke depan dan Iota bawah angka 0 karena itulah 478 00:22:18,060 --> 00:22:19,470 Argumen saya atau parameter. 479 00:22:19,470 --> 00:22:22,400 Aku melewati angka 0 dan akhirnya proses ini 480 00:22:22,400 --> 00:22:25,760 hanya mengulang sendiri iklan nauseum tidak berhenti karena apa 481 00:22:25,760 --> 00:22:28,820 saya segera lakukan setelah saya melihat 0 ini? 482 00:22:28,820 --> 00:22:29,790 Aku kembali nol. 483 00:22:29,790 --> 00:22:31,790 Jadi sekarang Anda harus mundur cerita. 484 00:22:31,790 --> 00:22:34,430 >> Jika saya sekarang pergi mundur dalam waktu, apa adalah hal terbaru 485 00:22:34,430 --> 00:22:36,670 Saya melakukan jika Anda secara harfiah memutar video? 486 00:22:36,670 --> 00:22:41,630 Aku akan mengambil terbaru 1 dan itu memberi saya 1 ditambah 0 adalah 1. 487 00:22:41,630 --> 00:22:44,100 Jika saya terus memutar yang cerita, itu akan memberi saya 488 00:22:44,100 --> 00:22:46,880 2 ditambah nilai ini berjalan, yaitu 1. 489 00:22:46,880 --> 00:22:47,789 Jadi itu 3. 490 00:22:47,789 --> 00:22:49,330 Dan kemudian aku akan terus rewinding. 491 00:22:49,330 --> 00:22:54,220 Ketika saya pertama kali meletakkan nomor 3-- sehingga 3 ditambah 3 memberi saya 6. 492 00:22:54,220 --> 00:22:57,272 >> Dan sekarang, jika Anda telah memutar ulang video sampai titik ini, 493 00:22:57,272 --> 00:22:58,980 ini adalah sangat Pertanyaan pertama saya bertanya. 494 00:22:58,980 --> 00:23:01,450 Ketika melewati 3, apa sigma dari 3? 495 00:23:01,450 --> 00:23:04,204 Ini memang 6, jumlah semua bagian kertas. 496 00:23:04,204 --> 00:23:07,120 Jadi jika yang mengambil sedikit waktu untuk membungkus pikiran Anda sekitar, itu baik-baik saja. 497 00:23:07,120 --> 00:23:10,700 Tapi mempertimbangkan itu little-- itu sangat disengaja yang saya ditumpuk 498 00:23:10,700 --> 00:23:12,990 angka-angka ini di atas satu sama lain. 499 00:23:12,990 --> 00:23:17,440 Ini semacam seperti memiliki memory-- rekor dalam waktu, 500 00:23:17,440 --> 00:23:19,940 seperti scrubber dalam sebuah video, bahwa saya memang bisa mundur di. 501 00:23:19,940 --> 00:23:24,350 Dan kita akan kembali ke yang metafora hanya sedikit. 502 00:23:24,350 --> 00:23:28,240 >> Tapi pertama, ternyata ada banyak Geeks dan orang-orang lucu, 503 00:23:28,240 --> 00:23:29,614 Saya kira, di Google. 504 00:23:29,614 --> 00:23:31,530 Akan seseorang yang sangat baik di Googling pikiran 505 00:23:31,530 --> 00:23:34,270 datang hanya sesaat dan membantu saya mencari sesuatu? 506 00:23:34,270 --> 00:23:35,650 Sangat, sangat rendah kunci. 507 00:23:35,650 --> 00:23:37,870 Seseorang yang tidak pernah datang sebelumnya, mungkin. 508 00:23:37,870 --> 00:23:38,370 OKE. 509 00:23:38,370 --> 00:23:39,030 Ya? 510 00:23:39,030 --> 00:23:39,530 Ayolah. 511 00:23:39,530 --> 00:23:41,410 Ayo turun. 512 00:23:41,410 --> 00:23:42,183 Siapa namamu? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Sam. 514 00:23:42,870 --> 00:23:44,290 >> DAVID J. Malan: Sam, datang di bawah. 515 00:23:44,290 --> 00:23:45,320 Ini adalah sama. 516 00:23:45,320 --> 00:23:46,280 Senang berjumpa dengan mu. 517 00:23:46,280 --> 00:23:46,780 Hey. 518 00:23:46,780 --> 00:23:47,580 Ayo sini. 519 00:23:47,580 --> 00:23:51,290 Jadi semua saya perlu Anda lakukan, jika Anda bisa, Sam, inilah Google. 520 00:23:51,290 --> 00:23:53,240 Anda dapat mencari rekursi jangka? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Jangan merusak. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> Dan sekarang let's-- ya. 525 00:24:00,970 --> 00:24:03,380 OK Klik itu. 526 00:24:03,380 --> 00:24:04,315 Baik klik itu. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ahh, mendapatkannya. 529 00:24:08,020 --> 00:24:08,520 Tidak? 530 00:24:08,520 --> 00:24:09,050 OKE. 531 00:24:09,050 --> 00:24:10,430 Jadi mari kita lakukan beberapa orang lain. 532 00:24:10,430 --> 00:24:12,830 Tidak begitu banyak terkait akademis di sini, tetapi Anda 533 00:24:12,830 --> 00:24:14,520 pernah mencari Google untuk anagram? 534 00:24:14,520 --> 00:24:15,280 >> SAM: No. 535 00:24:15,280 --> 00:24:15,520 >> DAVID J. Malan: OK. 536 00:24:15,520 --> 00:24:17,186 Mencari anagram bukan rekursi. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Bagaimana miring. 539 00:24:23,790 --> 00:24:25,515 Anda pernah mencari miring? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Sekarang, yang satu ini agak sulit untuk lihat tapi mudah-mudahan everything's-- OK. 542 00:24:32,692 --> 00:24:34,150 Ini hanya kau dan aku menikmati ini. 543 00:24:34,150 --> 00:24:34,690 OKE. 544 00:24:34,690 --> 00:24:38,950 >> Jadi akhirnya, one's-- ini itu miring sedikit. 545 00:24:38,950 --> 00:24:40,810 Sekarang lakukan gulungan per barel. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Indah. 548 00:24:45,310 --> 00:24:45,910 Baiklah. 549 00:24:45,910 --> 00:24:47,110 Terima kasih besar untuk Sam. 550 00:24:47,110 --> 00:24:49,416 Di sini Anda pergi. 551 00:24:49,416 --> 00:24:50,400 Terima kasih. 552 00:24:50,400 --> 00:24:52,807 >> Jadi apa yang terjadi di semua dari contoh-contoh konyol? 553 00:24:52,807 --> 00:24:55,640 Jadi benar-benar, di bawah kap Jutaan Google baris kode 554 00:24:55,640 --> 00:24:58,860 tampaknya adalah beberapa konyol IF kondisi yang pada dasarnya 555 00:24:58,860 --> 00:25:01,160 memeriksa jika pengguna memiliki mengetik kalimat ini, 556 00:25:01,160 --> 00:25:03,760 melakukan sesuatu yang mungkin mengambil jumlah trivial waktu 557 00:25:03,760 --> 00:25:06,080 untuk menerapkan hanya untuk menjadi lucu dengan cara ini. 558 00:25:06,080 --> 00:25:08,430 Tapi itu semua itu bermuara ke bawah kap mesin. 559 00:25:08,430 --> 00:25:11,570 Tapi, tentu saja, rekursi lebih dari geekier 560 00:25:11,570 --> 00:25:13,880 Misalnya antara mereka trik khusus. 561 00:25:13,880 --> 00:25:16,880 Dan pasti ada orang lain di luar sana juga bahwa kita mungkin bahkan tidak 562 00:25:16,880 --> 00:25:18,230 ditemukan dulu. 563 00:25:18,230 --> 00:25:22,830 >> Jadi kita lihat, atau mempertimbangkan sekarang program berikut, 564 00:25:22,830 --> 00:25:24,830 dan tentu mengambil salah ini di jalan keluar. 565 00:25:24,830 --> 00:25:28,820 Aku akan pergi ke depan dan membuka program itu 566 00:25:28,820 --> 00:25:30,920 akan mencoba untuk menukar dua nilai. 567 00:25:30,920 --> 00:25:33,210 Tapi sebelum kita pergi ke sana, mari kita lakukan ini. 568 00:25:33,210 --> 00:25:38,500 Bisakah kita mendapatkan satu lagi relawan, saya pikir? 569 00:25:38,500 --> 00:25:40,480 Apakah Anda ingin menjadi relawan? 570 00:25:40,480 --> 00:25:40,980 Tidak? 571 00:25:40,980 --> 00:25:41,890 Ayo up. 572 00:25:41,890 --> 00:25:42,390 Ayo up. 573 00:25:42,390 --> 00:25:42,890 Baiklah. 574 00:25:42,890 --> 00:25:44,136 Jadi nama Anda adalah apa? 575 00:25:44,136 --> 00:25:44,810 >> LAUREN: Lauren. 576 00:25:44,810 --> 00:25:45,768 >> DAVID J. Malan: Lauren. 577 00:25:45,768 --> 00:25:46,890 Ayo up, Lauren. 578 00:25:46,890 --> 00:25:50,140 Jadi Lauren sedang menantang di sini sebagai berikut. 579 00:25:50,140 --> 00:25:52,310 Senang berjumpa dengan mu. 580 00:25:52,310 --> 00:25:55,730 Jadi Lauren sini memiliki di depan dari dua cangkir yang kosong. 581 00:25:55,730 --> 00:25:57,570 Dan kami memiliki beberapa orange jus dan susu 582 00:25:57,570 --> 00:26:00,301 dan kami akan pergi depan dan melakukan hal berikut. 583 00:26:00,301 --> 00:26:01,550 Kami hanya akan mengisi ini. 584 00:26:01,550 --> 00:26:07,840 Beberapa ons susu di sini dan mari kita mengisi jus jeruk sedikit di sini. 585 00:26:07,840 --> 00:26:11,475 >> Dan di depan semua penonton ini, 586 00:26:11,475 --> 00:26:13,550 menukar dua nilai dari cangkir tersebut. 587 00:26:13,550 --> 00:26:16,970 Masukan jus jeruk dalam cangkir susu dan susu dalam cangkir jus jeruk. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Bagaimana Anda akan melakukan hal ini jika Anda berada di rumah dan memiliki akses ke perlengkapan lainnya? 590 00:26:26,150 --> 00:26:27,400 LAUREN: Taruh di secangkir. 591 00:26:27,400 --> 00:26:28,191 DAVID J. Malan: OK. 592 00:26:28,191 --> 00:26:31,940 Jadi mari kita sementara variabel, jika kita mau. 593 00:26:31,940 --> 00:26:35,871 Dan pergi ke depan sekarang dan mengimplementasikan prosedur swapping sama. 594 00:26:35,871 --> 00:26:36,370 Sangat bagus. 595 00:26:36,370 --> 00:26:41,490 Kami telah menempatkan OJ ke dalam sementara variabel, susu ke dalam variabel OJ, 596 00:26:41,490 --> 00:26:44,481 dan sekarang variabel sementara ke dalam variabel susu. 597 00:26:44,481 --> 00:26:44,980 OKE. 598 00:26:44,980 --> 00:26:48,740 Jadi sangat baik dilakukan sejauh ini. 599 00:26:48,740 --> 00:26:50,990 Jadi ternyata out-- berpendapat bahwa berpikir untuk sesaat. 600 00:26:50,990 --> 00:26:54,479 Di sini, hanya geek itu sedikit, ini akan menjadi kode C yang sesuai 601 00:26:54,479 --> 00:26:55,520 bahwa kita hanya dilaksanakan. 602 00:26:55,520 --> 00:26:58,650 Kami memiliki dua input, a dan b, keduanya yang kita hanya akan mengatakan untuk kesederhanaan adalah 603 00:26:58,650 --> 00:26:59,260 int itu. 604 00:26:59,260 --> 00:27:02,780 Dan perhatikan di sini, jika saya ingin menukar nilai-nilai dua variabel, a dan b, 605 00:27:02,780 --> 00:27:06,890 kita memang membutuhkan perantara, sebuah variabel sementara, secangkir sementara, 606 00:27:06,890 --> 00:27:10,830 ke mana tuangkan salah satu nilai sehingga kita memiliki tempat untuk itu. 607 00:27:10,830 --> 00:27:13,480 Tapi kemudian kode ini persis sebagai Lauren sini dilaksanakan. 608 00:27:13,480 --> 00:27:15,500 >> Sekarang, hanya untuk mendapatkan sedikit gila, ternyata 609 00:27:15,500 --> 00:27:20,930 Anda dapat melakukan ini tanpa variabel sementara. 610 00:27:20,930 --> 00:27:24,870 Untuk melakukan ini dengan benar, meskipun, kita akan harus menipu dengan beberapa kimia. 611 00:27:24,870 --> 00:27:26,380 Kami memiliki beberapa cangkir ekstra di sini. 612 00:27:26,380 --> 00:27:29,600 Jadi hal yang paling dekat yang terlihat seperti susu dan air perhaps-- 613 00:27:29,600 --> 00:27:34,090 atau susu dan OJ-- adalah kami memiliki beberapa air, jadi kita akan mengisi satu ini 614 00:27:34,090 --> 00:27:36,486 dengan beberapa ons air jernih. 615 00:27:36,486 --> 00:27:38,332 Itu mungkin terlalu banyak. 616 00:27:38,332 --> 00:27:38,832 Ya. 617 00:27:38,832 --> 00:27:39,934 Itu pasti terlalu banyak. 618 00:27:39,934 --> 00:27:40,600 Tunggu satu detik. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> Dan sekarang kami memiliki minyak, yang, seperti yang saya ingat dari sekolah kelas kimia menengah, 621 00:27:48,420 --> 00:27:49,990 mudah-mudahan itu tidak bercampur dengan air. 622 00:27:49,990 --> 00:27:53,650 Tapi itu semacam semacam terlihat seperti susu dan OJ. 623 00:27:53,650 --> 00:27:55,760 Jadi sekarang, tanpa menggunakan variabel sementara, 624 00:27:55,760 --> 00:27:59,260 Anda dapat menukar dua nilai? 625 00:27:59,260 --> 00:28:03,884 Jadi minyak masuk ke dalam cangkir air, air masuk ke dalam cangkir minyak. 626 00:28:03,884 --> 00:28:04,800 LAUREN: Tidak ada cangkir lain? 627 00:28:04,800 --> 00:28:05,940 DAVID J. Malan: Tidak ada cangkir lain. 628 00:28:05,940 --> 00:28:07,860 Dan aku sudah tidak benar-benar diuji ini sebelum tahun ini 629 00:28:07,860 --> 00:28:10,110 jadi saya tidak tahu apakah ini akan benar-benar bekerja secara kimia. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 Yang tidak seharusnya terjadi. 632 00:28:18,650 --> 00:28:19,761 Apakah bekerja? 633 00:28:19,761 --> 00:28:20,260 Baiklah. 634 00:28:20,260 --> 00:28:20,990 Jadi memisahkan? 635 00:28:20,990 --> 00:28:21,490 Baik. 636 00:28:21,490 --> 00:28:24,714 Sekarang kita harus mendapatkan air ke dalam gelas lainnya. 637 00:28:24,714 --> 00:28:27,630 Konsentrator kimia Smarter bisa mungkin melakukan hal ini lebih baik dari saya. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: Air yang ada di bagian bawah. 639 00:28:28,510 --> 00:28:31,910 >> DAVID J. Malan: The water-- itu apa kuncinya terakhir kali kami melakukan ini. 640 00:28:31,910 --> 00:28:33,950 Anda harus melakukannya dalam urutan yang benar. 641 00:28:33,950 --> 00:28:34,450 Ya. 642 00:28:34,450 --> 00:28:35,270 Tidak apa-apa. 643 00:28:35,270 --> 00:28:37,290 Jadi sekarang kita memiliki dua cangkir minyak. 644 00:28:37,290 --> 00:28:37,790 OKE. 645 00:28:37,790 --> 00:28:38,510 Tidak apa-apa. 646 00:28:38,510 --> 00:28:40,110 Tapi secara kimia jika ini bekerja dari Aku-- 647 00:28:40,110 --> 00:28:41,200 >> LAUREN: ini adalah air. 648 00:28:41,200 --> 00:28:41,930 >> DAVID J. Malan: Itu sebagian besar air. 649 00:28:41,930 --> 00:28:42,430 Baiklah. 650 00:28:42,430 --> 00:28:44,210 Tapi itu masih cangkir yang sama seperti sebelumnya. 651 00:28:44,210 --> 00:28:47,570 Jadi tuangkan itu-- mencobanya di sana. 652 00:28:47,570 --> 00:28:49,300 OKE. 653 00:28:49,300 --> 00:28:51,010 Ini adalah baik penggunaan waktu kelas hari ini. 654 00:28:51,010 --> 00:28:51,510 OKE. 655 00:28:51,510 --> 00:28:53,890 Jadi sekarang we-- bagus. 656 00:28:53,890 --> 00:28:55,460 Semacam. 657 00:28:55,460 --> 00:28:55,960 Baiklah. 658 00:28:55,960 --> 00:28:56,690 Jadi sangat baik. 659 00:28:56,690 --> 00:29:00,006 Terima kasih kepada Lauren. 660 00:29:00,006 --> 00:29:01,950 Bagus sekali. 661 00:29:01,950 --> 00:29:04,570 >> Jadi hanya untuk meniup pikiran Anda, dan ini adalah sesuatu yang mungkin 662 00:29:04,570 --> 00:29:08,660 bermain dengan jika Anda suka di CS50 ID, Anda dapat, pada kenyataannya, swap dua variabel 663 00:29:08,660 --> 00:29:11,470 tanpa menggunakan bilangan bulat sementara. 664 00:29:11,470 --> 00:29:13,060 Dan ini adalah kode C yang sesuai. 665 00:29:13,060 --> 00:29:16,110 Dan jika Anda ingat dari terakhir Rabu, kami memperkenalkan, jika sebentar, 666 00:29:16,110 --> 00:29:19,720 beberapa operator baru dalam C. Dan apakah orang ingat apa wortel kecil 667 00:29:19,720 --> 00:29:23,660 Simbol adalah, bahwa segitiga kecil simbol dari keyboard merupakan? 668 00:29:23,660 --> 00:29:26,003 Apa Operator bitwise? 669 00:29:26,003 --> 00:29:26,770 >> AUDIENCE: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> DAVID J. Malan: EXOR. 671 00:29:27,645 --> 00:29:28,560 Exclusive Or. 672 00:29:28,560 --> 00:29:32,920 Jadi jika Anda ingin, hanya untuk bersenang-senang di rumah, untuk memberikan a dan b dua sewenang-wenang 673 00:29:32,920 --> 00:29:36,072 nilai-nilai seperti eight-- dan saya akan memilih nilai delapan bit. 674 00:29:36,072 --> 00:29:38,530 Jika Anda melakukan ini dengan 32 bit, Anda akan sangat cepat bosan. 675 00:29:38,530 --> 00:29:42,150 Tetapi hanya memberikan delapan bit Nilai itu pun, satu atau dua, 676 00:29:42,150 --> 00:29:43,790 dan memberikan b nilai yang sama. 677 00:29:43,790 --> 00:29:46,810 Dan kemudian menggunakan definisi dari XOR dari Rabu lalu, 678 00:29:46,810 --> 00:29:52,560 menerapkan bit yang demi sedikit, masing-masing delapan bit dalam setiap a dan b, 679 00:29:52,560 --> 00:29:54,980 dan kemudian melakukannya persis per kode ini. 680 00:29:54,980 --> 00:29:58,170 Dan itu tidak salah apa Anda lihat di sini di layar. 681 00:29:58,170 --> 00:30:02,100 Ini memang bermuara untuk tiga operasi XOR 682 00:30:02,100 --> 00:30:05,910 dan entah bagaimana ajaib dan b akan bertukar posisi 683 00:30:05,910 --> 00:30:08,010 tanpa kehilangan informasi apapun. 684 00:30:08,010 --> 00:30:11,580 >> Jadi trik minyak dan air adalah terdekat inkarnasi dunia nyata 685 00:30:11,580 --> 00:30:12,980 Saya bisa memikirkan untuk meniru itu. 686 00:30:12,980 --> 00:30:15,950 Tapi itu pasti lebih mudah untuk menggunakan variabel sementara, 687 00:30:15,950 --> 00:30:16,920 seperti dalam kasus ini di sini. 688 00:30:16,920 --> 00:30:21,190 Dan ini juga merupakan kesempatan mengatakan, juga, jenis optimasi mikro, 689 00:30:21,190 --> 00:30:23,590 sebagai seorang ilmuwan komputer akan mengatakan, sementara jenis menyenangkan 690 00:30:23,590 --> 00:30:27,060 untuk membual tentang bagaimana Anda melakukan ini tanpa seperti swapping dengan variabel tambahan, 691 00:30:27,060 --> 00:30:28,640 itu tidak semua yang menarik. 692 00:30:28,640 --> 00:30:31,619 Karena untuk menyimpan 32 bit, seperti dalam kasus int sebenarnya, 693 00:30:31,619 --> 00:30:33,410 tidak semua yang menarik pada sistem di mana 694 00:30:33,410 --> 00:30:36,722 Anda mungkin menggunakan puluhan megabyte atau bahkan lebih memori seperti hari ini. 695 00:30:36,722 --> 00:30:38,680 Dan pada kenyataannya, ketika kita mendapatkan untuk masalah set kemudian 696 00:30:38,680 --> 00:30:41,010 dan Anda menerapkan mantra checker dan Anda akan 697 00:30:41,010 --> 00:30:43,550 ditantang untuk melakukannya dengan ini RAM sedikit dan sedikit 698 00:30:43,550 --> 00:30:46,820 waktu mungkin pada computer-- Anda masih 699 00:30:46,820 --> 00:30:50,160 memiliki seminggu untuk melaksanakan itu-- Anda akan have-- Anda akan 700 00:30:50,160 --> 00:30:51,799 ditantang untuk meminimalkan sumber daya. 701 00:30:51,799 --> 00:30:53,840 Dan itu benar-benar satu-satunya Acara semester ini 702 00:30:53,840 --> 00:30:57,940 di mana Anda akan didorong untuk mencukur off bahkan kinerja terbaik 703 00:30:57,940 --> 00:30:59,340 biaya sebaliknya. 704 00:30:59,340 --> 00:31:02,200 >> Jadi bagaimana kita bisa-UMPC melihat ini dalam kode yang sebenarnya? 705 00:31:02,200 --> 00:31:04,530 Biarkan aku pergi ke depan sekarang dan membuka sebuah contoh 706 00:31:04,530 --> 00:31:07,700 yang sengaja disebut Tidak ada Swap karena tidak 707 00:31:07,700 --> 00:31:10,670 sebenarnya swap variabel Anda benar-benar harapkan. 708 00:31:10,670 --> 00:31:12,260 Jadi mari kita lihat. 709 00:31:12,260 --> 00:31:17,050 Berikut adalah program yang tidak memiliki CS50 Perpustakaan terjadi, hanya standar I / O. 710 00:31:17,050 --> 00:31:19,560 Sekarang kita memiliki prototipe untuk swap atas yang hanya 711 00:31:19,560 --> 00:31:21,540 berarti itu harus didefinisikan kemudian. 712 00:31:21,540 --> 00:31:22,550 Dan inilah utama. 713 00:31:22,550 --> 00:31:26,000 >> Aku sewenang-wenang ditugaskan x dan y, masing-masing, nilai-nilai satu dan dua 714 00:31:26,000 --> 00:31:28,590 hanya karena mereka kecil dan mudah untuk berpikir tentang. 715 00:31:28,590 --> 00:31:32,280 Dan kemudian aku hanya memiliki banyak printfs di mana saya memiliki cek kewarasan. x adalah 1 716 00:31:32,280 --> 00:31:35,110 dan y adalah 2 diduga apa yang mereka printfs akan mengatakan. 717 00:31:35,110 --> 00:31:36,530 Jadi tidak ada sihir sejauh ini. 718 00:31:36,530 --> 00:31:40,100 >> Lalu aku akan mengklaim dengan mencetak def, bertukar dot dot dot. 719 00:31:40,100 --> 00:31:43,730 Aku akan memanggil swap fungsi, lewat di x dan y. 720 00:31:43,730 --> 00:31:47,350 Dan mari kita asumsikan untuk saat ini yang swap dilaksanakan tepat 721 00:31:47,350 --> 00:31:49,930 seperti itu beberapa saat yang lalu dengan variabel sementara. 722 00:31:49,930 --> 00:31:52,670 Dan jadi saya mengklaim berani, bertukar. 723 00:31:52,670 --> 00:31:55,429 x sekarang ini dan y sekarang itu. 724 00:31:55,429 --> 00:31:57,220 Tapi file, tentu saja, disebut ada Swap. 725 00:31:57,220 --> 00:31:58,678 Jadi mari kita benar-benar melihat apa yang terjadi. 726 00:31:58,678 --> 00:32:04,450 Jika saya mengkompilasi ada swap dan kemudian melakukan ./noswap, x adalah 1, y adalah 2. 727 00:32:04,450 --> 00:32:05,770 Swapping bertukar. 728 00:32:05,770 --> 00:32:07,200 x adalah 1, y adalah 2. 729 00:32:07,200 --> 00:32:11,980 Sehingga benar-benar tampaknya cacat bahkan meskipun swap-- mari gulir ke bawah sekarang-- 730 00:32:11,980 --> 00:32:16,542 diimplementasikan persis per kode saya mengusulkan beberapa saat yang lalu. 731 00:32:16,542 --> 00:32:19,000 Jadi kita tidak akan mendapatkan mewah dengan hal-hal XOR untuk saat ini. 732 00:32:19,000 --> 00:32:21,890 Ini juga, harus bekerja sama seperti dengan susu dan OJ, 733 00:32:21,890 --> 00:32:25,820 tetapi tidak tampaknya akan bekerja. 734 00:32:25,820 --> 00:32:27,180 >> Jadi mari kita lakukan ini lagi. 735 00:32:27,180 --> 00:32:29,310 Mungkin aku hanya tidak berjalan dengan benar. 736 00:32:29,310 --> 00:32:32,010 Jadi mari kita jalankan ada Swap lagi. 737 00:32:32,010 --> 00:32:32,900 Mungkin Aku-- ada. 738 00:32:32,900 --> 00:32:34,400 Jadi itu hanya tidak bekerja. 739 00:32:34,400 --> 00:32:36,060 Jadi mari kita lakukan sebuah pemeriksaan kecil. 740 00:32:36,060 --> 00:32:39,690 Biarkan aku pergi ke depan di sini di Swap dan hanya menambahkan, tunggu sebentar, 741 00:32:39,690 --> 00:32:43,856 adalah% i / n dan mari plug-in nilai dari. 742 00:32:43,856 --> 00:32:45,730 Karena aku benar-benar ingin untuk melihat apa yang terjadi. 743 00:32:45,730 --> 00:32:47,570 Dan memang, ini adalah teknik debugging 744 00:32:47,570 --> 00:32:50,028 Anda mungkin menggunakan di jam kantor atau di rumah sudah, 745 00:32:50,028 --> 00:32:53,560 mirip dengan paruh pertama Dan Video Armendariz di PSET3 746 00:32:53,560 --> 00:32:56,870 dimana kami memperkenalkan cetak def sebagai teknik dianjurkan, setidaknya 747 00:32:56,870 --> 00:32:58,080 untuk kasus sederhana. 748 00:32:58,080 --> 00:33:01,720 Biarkan aku pergi ke depan dan menjalankan make tanpa swap lagi, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Menarik. 751 00:33:05,840 --> 00:33:11,670 Jadi melihat apa yang tampaknya menjadi kenyataan. x adalah 1, y adalah 2, tetapi adalah 2 ketika b adalah 1. 752 00:33:11,670 --> 00:33:16,790 Jadi kedua entah bagaimana bertukar tapi x dan y tidak mendapatkan bertukar. 753 00:33:16,790 --> 00:33:21,090 Jadi harus jelas, apa yang terjadi adalah, di sini saya punya x dan y 754 00:33:21,090 --> 00:33:25,380 dan mereka adalah variabel lokal dalam lingkup utama, saya lewat di x dan y 755 00:33:25,380 --> 00:33:26,170 menukar. 756 00:33:26,170 --> 00:33:29,080 Sekarang, swap, sebagai fungsi yang terpisah, bebas untuk memanggil argumen 757 00:33:29,080 --> 00:33:30,590 atau parameter apa yang diinginkannya. 758 00:33:30,590 --> 00:33:33,280 Foo atau bar atau x atau y atau atau b. 759 00:33:33,280 --> 00:33:36,870 Hanya untuk membuat jelas bahwa mereka tidak identik dengan x dan y per se, 760 00:33:36,870 --> 00:33:38,020 Aku sudah mengatakan a dan b. 761 00:33:38,020 --> 00:33:40,040 Tapi kita bisa menyebut mereka apa pun yang kita inginkan. 762 00:33:40,040 --> 00:33:43,960 >> Dan sehingga terlihat seperti swap disahkan 763 00:33:43,960 --> 00:33:48,980 x-- AKA a-- dan itu disahkan y-- AKA b. 764 00:33:48,980 --> 00:33:51,900 Entah bagaimana tiga garis swapping nilai-nilai persis 765 00:33:51,900 --> 00:33:53,510 seperti Lauren melakukan dengan susu dan OJ. 766 00:33:53,510 --> 00:33:56,010 Tetapi ketika kita mencetak nilai-nilai, a dan b 767 00:33:56,010 --> 00:34:01,340 memang menukar tapi x dan y harus ada perubahan untuk mereka. 768 00:34:01,340 --> 00:34:03,150 Ingat bahwa x dan y adalah di sini. 769 00:34:03,150 --> 00:34:05,320 >> Jadi kita bisa melihat ini melalui teknik lain juga. 770 00:34:05,320 --> 00:34:08,110 Dan ini juga merupakan teknik tertanam dalam masalah menetapkan tiga. 771 00:34:08,110 --> 00:34:10,780 Mari kita pergi ke depan dan melakukan hal ini di CS50 ID jika Anda belum melakukannya. 772 00:34:10,780 --> 00:34:13,730 Di sisi kanan sisi kita memiliki tab Debugger ini. 773 00:34:13,730 --> 00:34:16,159 Dan jika Anda membuka ini sampai, ada beberapa informasi rahasia 774 00:34:16,159 --> 00:34:17,530 yang dilemparkan pada Anda awalnya. 775 00:34:17,530 --> 00:34:19,310 Tapi mari kita menggoda ini selain sangat cepat. 776 00:34:19,310 --> 00:34:21,620 >> Jadi satu, Anda melihat variabel lokal. 777 00:34:21,620 --> 00:34:26,230 Ternyata membangun ke CS50 IDE, dan banyak lingkungan pemrograman lebih 778 00:34:26,230 --> 00:34:28,060 umumnya, adalah debugger. 779 00:34:28,060 --> 00:34:31,340 Sebuah alat yang memungkinkan Anda untuk melihat secara visual apa yang terjadi di dalam program Anda 780 00:34:31,340 --> 00:34:34,380 tanpa harus resor untuk menambahkan printfs dan kompilasi dan menjalankan 781 00:34:34,380 --> 00:34:37,588 dan menambahkan printf dan kompilasi dan berjalan, yang sudah, di jam kantor 782 00:34:37,588 --> 00:34:40,070 atau rumah, mungkin menjadi cukup membosankan. 783 00:34:40,070 --> 00:34:43,090 >> Jadi di sini, hanya dalam beberapa saat, kami akan melihat secara real time 784 00:34:43,090 --> 00:34:44,760 nilai-nilai variabel lokal kami. 785 00:34:44,760 --> 00:34:47,880 Kami juga akan dapat mengatur apa yang disebut breakpoints yang 786 00:34:47,880 --> 00:34:52,570 peluang dalam program saya untuk menghentikan eksekusi pada baris tertentu dari kode 787 00:34:52,570 --> 00:34:53,710 yang saya ingin tahu tentang. 788 00:34:53,710 --> 00:34:54,210 Benar? 789 00:34:54,210 --> 00:34:55,969 Program-program ini dijalankan dalam hitungan detik. 790 00:34:55,969 --> 00:35:00,450 Ini jenis yang baik bagi kita manusia lebih lambat untuk dapat berhenti, luangkan waktu, melihat 791 00:35:00,450 --> 00:35:02,380 apa yang terjadi di sekitar baris kode tertentu 792 00:35:02,380 --> 00:35:05,050 tanpa membajak Program melalui itu dan finishing seluruhnya. 793 00:35:05,050 --> 00:35:08,510 Jadi breakpoints akan memungkinkan kita untuk istirahat dan berhenti pada titik tertentu. 794 00:35:08,510 --> 00:35:12,990 >> Panggilan stack adalah cara mewah mengatakan apa fungsi saat ini 795 00:35:12,990 --> 00:35:14,140 dipanggil pada saat ini. 796 00:35:14,140 --> 00:35:15,370 Main selalu disebut pertama. 797 00:35:15,370 --> 00:35:17,230 Tetapi jika Utama panggilan fungsi yang disebut Swap, 798 00:35:17,230 --> 00:35:20,470 kita benar-benar akan melihat ini menara fungsi yang telah 799 00:35:20,470 --> 00:35:22,400 disebut dalam urutan kronologis terbalik. 800 00:35:22,400 --> 00:35:23,310 Jadi mari kita lihat itu. 801 00:35:23,310 --> 00:35:24,327 >> Aku akan zoom out. 802 00:35:24,327 --> 00:35:25,660 Aku akan kembali ke kode saya. 803 00:35:25,660 --> 00:35:27,540 Dan hanya karena aku ingin menjadi bertele-tele di sini, 804 00:35:27,540 --> 00:35:31,100 Aku akan pergi ke depan dan klik hanya di sebelah kiri garis lima. 805 00:35:31,100 --> 00:35:32,830 Dan yang menciptakan titik merah. 806 00:35:32,830 --> 00:35:36,200 Dan melihat di sisi kanan bahwa debugger tahu, hei, 807 00:35:36,200 --> 00:35:41,020 Saya hanya mengatakan breakpoint di baris noswap.c lima, khusus 808 00:35:41,020 --> 00:35:42,480 di baris kode ini. 809 00:35:42,480 --> 00:35:45,090 Jadi debugger tahu bahwa saya telah meminta bahwa waktu berikutnya 810 00:35:45,090 --> 00:35:48,530 Saya menjalankan saya Program itu jeda eksekusi ada bukan hanya 811 00:35:48,530 --> 00:35:50,390 menjalankan semuanya super cepat. 812 00:35:50,390 --> 00:35:53,889 >> Jadi sekarang aku akan klik Debug yang tombol di bagian paling atas dari IDE 813 00:35:53,889 --> 00:35:55,430 dan itu akan melakukan hal berikut. 814 00:35:55,430 --> 00:36:00,680 Ini akan membuka awalnya agak menakutkan mencari terminal kedua window-- 815 00:36:00,680 --> 00:36:02,679 debugging jauh dari tuan rumah tersebut dan such-- 816 00:36:02,679 --> 00:36:04,970 dan kami akan kembali ke apa semua itu berarti tak lama. 817 00:36:04,970 --> 00:36:09,020 Tapi apa yang penting untuk saat ini adalah bahwa titik merah dipukul, 818 00:36:09,020 --> 00:36:11,735 debugger memiliki sengaja berhenti execution-- 819 00:36:11,735 --> 00:36:15,560 bukan pada garis per se tapi pertama baris kode aktual dalam fungsi itu. 820 00:36:15,560 --> 00:36:18,040 Dan itulah mengapa garis tujuh adalah sekarang ditandai dengan warna kuning. 821 00:36:18,040 --> 00:36:20,550 >> Dan sekarang mari kita lihat di sisi kanan. 822 00:36:20,550 --> 00:36:27,300 Sepertinya, secara default, cukup baik, x memiliki nilai apa? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 Dan y memiliki nilai apa? 825 00:36:29,750 --> 00:36:30,410 Nol. 826 00:36:30,410 --> 00:36:35,540 Dan itulah yang diharapkan dalam arti bahwa x dan y-- yang line-- kuning memiliki 827 00:36:35,540 --> 00:36:36,770 tidak dieksekusi belum. 828 00:36:36,770 --> 00:36:38,510 Jadi x tidak harus memiliki nilai 1. 829 00:36:38,510 --> 00:36:41,470 Ini mungkin memiliki nilai lain, yang disebut nilai sampah. 830 00:36:41,470 --> 00:36:44,320 Dan kami beruntung di bahwa itu nol pada titik ini, pada dasarnya. 831 00:36:44,320 --> 00:36:46,400 >> Jadi sekarang hanya ada beberapa tombol kita perlu peduli 832 00:36:46,400 --> 00:36:48,100 tentang kapan debugging dengan cara ini. 833 00:36:48,100 --> 00:36:49,970 Perhatikan di sini, kami memiliki tombol Play. 834 00:36:49,970 --> 00:36:51,877 Dan jika kami bermain atau memukul melanjutkan, itu hanya 835 00:36:51,877 --> 00:36:53,710 akan dijalankan melalui sisa program 836 00:36:53,710 --> 00:36:55,300 atau sampai hits breakpoint lain. 837 00:36:55,300 --> 00:36:56,910 Tapi aku tidak diatur lain breakpoints sehingga hanya 838 00:36:56,910 --> 00:36:58,118 akan dijalankan melalui akhir. 839 00:36:58,118 --> 00:37:00,280 Semacam itu mengalahkan Tujuan dari mengaduk-aduk. 840 00:37:00,280 --> 00:37:03,290 >> Jadi sebagai gantinya, saya peduli ikon ini ke kanan. 841 00:37:03,290 --> 00:37:05,360 Dan jika saya membawa lebih mereka, karena Anda harus juga, 842 00:37:05,360 --> 00:37:07,450 Anda akan melihat sedikit tips-- tips alat. 843 00:37:07,450 --> 00:37:09,020 Yang satu ini adalah langkah di atas. 844 00:37:09,020 --> 00:37:11,290 Sekarang itu tidak berarti melewatkan baris kode berikut. 845 00:37:11,290 --> 00:37:14,840 Itu hanya berarti melaksanakannya dan pindah ke berikutnya, pindah ke berikutnya, 846 00:37:14,840 --> 00:37:15,580 pindah ke yang berikutnya. 847 00:37:15,580 --> 00:37:17,610 Dengan kata lain, melalui tombol itu, dapat aku berjalan 848 00:37:17,610 --> 00:37:20,390 melalui saya kode satu langkah pada satu waktu. 849 00:37:20,390 --> 00:37:21,914 Baris demi baris, secara harfiah. 850 00:37:21,914 --> 00:37:23,830 Sekarang, di sebelah kanan itu, ada satu lagi 851 00:37:23,830 --> 00:37:25,163 bahwa kita akan melihat hanya dalam beberapa saat. 852 00:37:25,163 --> 00:37:27,820 Ini adalah apa yang disebut Langkah Ke icon itu 853 00:37:27,820 --> 00:37:30,300 akan memungkinkan saya menyelam ke fungsi lain. 854 00:37:30,300 --> 00:37:31,800 Tapi mari kita lihat ini hanya dalam beberapa saat. 855 00:37:31,800 --> 00:37:33,280 Jadi aku akan klik melangkahi. 856 00:37:33,280 --> 00:37:35,820 Dan sekarang perhatikan, karena saya klik tombol ini di kanan atas, 857 00:37:35,820 --> 00:37:41,260 menjaga mata Anda sekitar bawah Lokal Variabel dan melihat apa yang terjadi pada x. 858 00:37:41,260 --> 00:37:44,115 x sekarang 1 karena garis kuning kini telah dieksekusi 859 00:37:44,115 --> 00:37:45,840 dan kita sudah pindah ke jalur 8. 860 00:37:45,840 --> 00:37:49,840 Dan hanya sesaat y mudah-mudahan harus menjadi 2. 861 00:37:49,840 --> 00:37:52,330 >> Sekarang, tidak ada yang menarik terjadi untuk sedikit. 862 00:37:52,330 --> 00:37:53,390 Semua ini adalah printf. 863 00:37:53,390 --> 00:37:58,010 Dan perhatikan, di terminal sekunder saya jendela, saya melihat output dari cetak def. 864 00:37:58,010 --> 00:38:01,080 Dan sekarang saya harus membuat keputusan sebagai programmer. 865 00:38:01,080 --> 00:38:04,360 Aku bisa melangkahi garis ini kode, dijalankan tetapi tidak 866 00:38:04,360 --> 00:38:06,220 mendapatkan penasaran tentang apa yang ada di dalamnya. 867 00:38:06,220 --> 00:38:11,130 Atau aku benar-benar dapat melangkah ke dalamnya dan pergi dalam Swap sendiri. 868 00:38:11,130 --> 00:38:12,340 Jadi mari kita lakukan yang terakhir. 869 00:38:12,340 --> 00:38:15,550 >> Biarkan aku pergi ke depan dan klik tidak Langkah Selama tapi Langkah Ke. 870 00:38:15,550 --> 00:38:17,300 Pemberitahuan, tiba-tiba perubahan jendela 871 00:38:17,300 --> 00:38:19,330 untuk menyorot pertama baris kode di Swap. 872 00:38:19,330 --> 00:38:20,710 Itu line 21. 873 00:38:20,710 --> 00:38:25,220 Dan sekarang, apa jenis funky adalah bahwa, jika Anda melihat di sini, seperti yang diharapkan, 874 00:38:25,220 --> 00:38:29,720 koma b adalah 1 dan 2, masing-masing. 875 00:38:29,720 --> 00:38:33,840 Mengapa suhu 32.767? 876 00:38:33,840 --> 00:38:36,560 Mengingat suhu itu, seperti cangkir kosong beberapa saat yang lalu, 877 00:38:36,560 --> 00:38:38,980 dinyatakan di sini on line 21. 878 00:38:38,980 --> 00:38:43,390 Mengapa 32,000- Maksudku, mengapa itu hanya beberapa nilai aneh? 879 00:38:43,390 --> 00:38:43,890 Ya? 880 00:38:43,890 --> 00:38:45,190 >> AUDIENCE: Ini tidak diinisialisasi. 881 00:38:45,190 --> 00:38:46,940 >> DAVID J. Malan: Ini belum diinisialisasi. 882 00:38:46,940 --> 00:38:49,370 Jadi komputer kita selalu memiliki memori fisik. 883 00:38:49,370 --> 00:38:50,544 Selalu memiliki RAM fisik. 884 00:38:50,544 --> 00:38:52,710 Dan selalu ada nol ini dan satu yang ada di sana, kan? 885 00:38:52,710 --> 00:38:54,626 Karena kita menggunakan kami komputer sepanjang hari, 886 00:38:54,626 --> 00:38:57,210 Anda menggunakan CS50 IDE atau server sepanjang hari. 887 00:38:57,210 --> 00:39:01,159 Jadi RAM yang baik memiliki beberapa angka nol atau seseorang atau beberapa nol dan satu. 888 00:39:01,159 --> 00:39:02,950 Tidak peduli apakah tidak Anda menggunakan mereka. 889 00:39:02,950 --> 00:39:05,270 Anda tidak bisa hanya memiliki kosong ruang di mana Anda ingin bit. 890 00:39:05,270 --> 00:39:06,850 Mereka baik nol dan satu. 891 00:39:06,850 --> 00:39:09,610 >> Jadi ternyata suhu itu, karena kita sudah tidak diinisialisasi itu belum, 892 00:39:09,610 --> 00:39:14,580 kami memiliki orang-orang 32 bit tetapi mereka tidak punya diinisialisasi ke nilai-nilai diketahui. 893 00:39:14,580 --> 00:39:18,110 Jadi apa pun yang mereka paling baru-baru ini digunakan for-- mereka 32 bits-- 894 00:39:18,110 --> 00:39:23,000 kita hanya melihat artefak dari beberapa penggunaan sebelumnya mereka tertentu 32 895 00:39:23,000 --> 00:39:23,500 bit. 896 00:39:23,500 --> 00:39:27,780 Segera setelah saya klik Langkah Selama meskipun, Fiuh, suhu akan mendapatkan nilai 1. 897 00:39:27,780 --> 00:39:31,600 Dan jika saya melakukannya lagi, adalah bakalan untuk diberikan nilai 2 898 00:39:31,600 --> 00:39:33,830 dan kemudian b akan diberi nilai 1. 899 00:39:33,830 --> 00:39:36,390 >> Dan jadi apa yang bagus sekarang di titik ini dalam cerita 900 00:39:36,390 --> 00:39:39,750 adalah bahwa debugger adalah menunjukkan kepada saya, super lambat 901 00:39:39,750 --> 00:39:42,640 kecepatan saya sendiri, apa yang keadaan Swap adalah. 902 00:39:42,640 --> 00:39:47,490 Tapi perhatikan di bagian atas sini, pemberitahuan bahwa panggilan stack sebenarnya 903 00:39:47,490 --> 00:39:49,180 memiliki dua lapisan untuk itu. 904 00:39:49,180 --> 00:39:53,240 Sekarang salah satu yang disorot sebagai Swap, jika saya klik pada Main sebaliknya, 905 00:39:53,240 --> 00:39:57,100 perhatikan bagaimana variabel lokal berubah karena pengembang hanya dapat hop 906 00:39:57,100 --> 00:39:59,740 sekitar dan masuk ke setiap ruang lingkup yang berbeda. 907 00:39:59,740 --> 00:40:04,070 Jadi meskipun kita melakukan semua ini bekerja dan benar swapping a dan b, 908 00:40:04,070 --> 00:40:09,080 jika saya pergi bolak-balik antara Swap di mana a adalah 2 dan b adalah 1 dan Main, 909 00:40:09,080 --> 00:40:11,851 telah Utama terpengaruh sama sekali? 910 00:40:11,851 --> 00:40:12,350 Tidak. 911 00:40:12,350 --> 00:40:13,930 Jadi apa takeaway di sini? 912 00:40:13,930 --> 00:40:18,200 Nah, ternyata bahwa setiap saat Anda memanggil fungsi seperti Swap, 913 00:40:18,200 --> 00:40:21,600 dan Anda lulus argumen itu, apa Anda melewati ke fungsi Swap 914 00:40:21,600 --> 00:40:24,730 dalam hal ini adalah salinan dari argumen-argumen. 915 00:40:24,730 --> 00:40:28,620 Jadi jika x dan y masing-masing masing-masing 32 bit, apa Swap semakin 916 00:40:28,620 --> 00:40:30,760 lokal dua baru variabel, atau argumen, 917 00:40:30,760 --> 00:40:34,380 disebut dan b-- tetapi mereka adalah sewenang-wenang names-- tetapi pola nol 918 00:40:34,380 --> 00:40:39,520 dan orang-orang dalam a dan b didapuk menjadi identik dengan x dan y 919 00:40:39,520 --> 00:40:42,610 tetapi mereka tidak hal yang sama seperti x dan y. 920 00:40:42,610 --> 00:40:46,880 >> Seolah-olah Main pada bagian atas kertas nomor 1 dan 2 untuk x dan y, 921 00:40:46,880 --> 00:40:49,260 dan kemudian ketika itu tangan yang selembar kertas untuk Swap, 922 00:40:49,260 --> 00:40:51,970 Swap sangat cepat mendapat pena sendiri, menuliskan 923 00:40:51,970 --> 00:40:56,240 1 dan 2 pada lembar sendiri kertas, tangan kembali xy asli untuk Main 924 00:40:56,240 --> 00:40:58,790 dan kemudian melakukan sendiri hal dengan a dan b. 925 00:40:58,790 --> 00:41:01,940 Dan sekarang ini adalah super penting karena ini memiliki implikasi nontrivial 926 00:41:01,940 --> 00:41:06,260 untuk benar-benar menulis kode yang benar karena tampaknya kita tidak bisa menukar 927 00:41:06,260 --> 00:41:07,500 dua variabel. 928 00:41:07,500 --> 00:41:09,150 >> Saya telah menulis fungsi Swap yang benar. 929 00:41:09,150 --> 00:41:12,770 Kami telah menerapkan dengan Lauren sebagai fungsi pertukaran yang benar dalam kenyataannya, 930 00:41:12,770 --> 00:41:16,700 tapi rupanya tidak ada yang hal jika Anda tidak dapat benar-benar 931 00:41:16,700 --> 00:41:19,530 swap dua nilai secara permanen. 932 00:41:19,530 --> 00:41:21,970 Jadi kita perlu cara lain untuk benar-benar mendapatkan ini, 933 00:41:21,970 --> 00:41:24,472 dan kita harus mampu untuk benar-benar memecahkan masalah ini. 934 00:41:24,472 --> 00:41:27,180 Dan ternyata out-- dan kami akan datang kembali ke gambar tertentu 935 00:41:27,180 --> 00:41:30,500 sebelum long-- ini adalah salah satu cara yang Anda mungkin menarik memori komputer Anda. 936 00:41:30,500 --> 00:41:31,460 Ini hanya persegi panjang. 937 00:41:31,460 --> 00:41:32,960 Anda bisa menggambar apapun beberapa cara tapi itu 938 00:41:32,960 --> 00:41:35,740 nyaman untuk menarik sebagai persegi panjang karena alasan berikut. 939 00:41:35,740 --> 00:41:40,040 >> Kita akan mulai hari ini dan seterusnya berbicara tentang apa yang disebut stack. 940 00:41:40,040 --> 00:41:43,870 Dan stack hanya sepotong dari RAM-- sepotong memory-- 941 00:41:43,870 --> 00:41:47,100 yang berfungsi memiliki akses ketika mereka disebut. 942 00:41:47,100 --> 00:41:49,800 Dan ternyata di bagian paling bawah tumpukan ini 943 00:41:49,800 --> 00:41:53,590 adalah di mana semua variabel lokal Main dan org C dan V org dan semua itu 944 00:41:53,590 --> 00:41:56,950 akan pergi secara default. Dan jika Utama panggilan beberapa fungsi lain seperti Swap, 945 00:41:56,950 --> 00:42:00,330 baik, Swap akan mendapatkan lain lapisan memori di atas itu. 946 00:42:00,330 --> 00:42:04,490 >> Dan hanya untuk memberikan sepintas cepat gambar ini, jika saya pergi ke sini- 947 00:42:04,490 --> 00:42:09,450 dan biarkan aku cermin ini pada overhead well-- apa yang saya miliki, 948 00:42:09,450 --> 00:42:12,100 jika kita peduli hanya tentang bawah gambar ini untuk saat ini, 949 00:42:12,100 --> 00:42:15,070 adalah bahwa ketika saya menjalankan program dan Main dipanggil, 950 00:42:15,070 --> 00:42:18,330 Main diberikan sepotong RAM di komputer saya yang 951 00:42:18,330 --> 00:42:20,060 di bagian bawah disebut tumpukan ini. 952 00:42:20,060 --> 00:42:22,143 Dan aku akan menggambar sengaja sebagai persegi. 953 00:42:22,143 --> 00:42:24,540 Jadi seperti 32 bit atau empat byte. 954 00:42:24,540 --> 00:42:28,790 Dan jika fungsi utama ini memiliki variabel yang disebut x dengan nilai 1 955 00:42:28,790 --> 00:42:32,626 dan memiliki variabel yang disebut y dengan nilai 2, yang 956 00:42:32,626 --> 00:42:35,750 seperti mengambil sepotong ini memori yang Utama telah diberikan oleh operasi 957 00:42:35,750 --> 00:42:38,850 sistem dan membaginya up sehingga variabel lokal pertama pergi di sini, 958 00:42:38,850 --> 00:42:40,930 yang kedua terjadi di sini, dan hanya itu. 959 00:42:40,930 --> 00:42:45,590 >> Ketika Main panggilan Swap, Swap mendapat sepotong sendiri memori 960 00:42:45,590 --> 00:42:48,280 bahwa kita akan menggambar seperti ini dari sistem operasi, 961 00:42:48,280 --> 00:42:50,820 dan itu akan memiliki nya variabel lokal sendiri berdasarkan 962 00:42:50,820 --> 00:42:53,825 pada implementasi kami sebelumnya dengan variabel lokal 963 00:42:53,825 --> 00:42:58,010 dan b yang awalnya mendapatkan nilai 1 dan 2. 964 00:42:58,010 --> 00:43:00,450 Tapi kemudian, secepat kode Swap mengeksekusi, 965 00:43:00,450 --> 00:43:03,760 dan Lauren benar-benar swap OJ dan susu, apa yang terjadi? 966 00:43:03,760 --> 00:43:09,030 Nah, 2 ini menjadi 1, ini 1 menjadi 2, dan, dengan cara, 967 00:43:09,030 --> 00:43:13,360 ada variabel temp yang menjadi digunakan bahwa sepanjang waktu yang akhirnya 968 00:43:13,360 --> 00:43:14,470 pergi jauh. 969 00:43:14,470 --> 00:43:16,720 Tapi itu tidak masalah berapa banyak pekerjaan yang Anda lakukan 970 00:43:16,720 --> 00:43:22,160 di baris ini of-- di ruang memori ini, x dan y-benar tersentuh. 971 00:43:22,160 --> 00:43:26,320 >> Jadi kita perlu beberapa cara pemberian Swap dan fungsi seperti itu 972 00:43:26,320 --> 00:43:32,640 akses rahasia, jika Anda akan, untuk fungsi like-- ke memori seperti x dan y. 973 00:43:32,640 --> 00:43:35,110 Jadi mari kita lihat contoh yang membantu 974 00:43:35,110 --> 00:43:38,220 kita lihat apa yang sudah terjadi sepanjang waktu ini. 975 00:43:38,220 --> 00:43:40,284 Aku akan pergi ke depan dan membuka Bandingkan Zero. 976 00:43:40,284 --> 00:43:42,200 Dan aku akan menutup debugger kami, aku akan 977 00:43:42,200 --> 00:43:44,360 untuk menutup pesan mencari ini menakutkan hanya mengatakan, tunggu sebentar, 978 00:43:44,360 --> 00:43:45,800 Anda berada di tengah debugging. 979 00:43:45,800 --> 00:43:48,383 Aku akan menyembunyikan tab ini di sini hanya untuk kembali ke kesederhanaan. 980 00:43:48,383 --> 00:43:50,160 Jadi jangan khawatir jika GDB dibunuh. 981 00:43:50,160 --> 00:43:53,910 Itu hanya berarti bahwa program ini memiliki telah berhenti, sengaja dalam hal ini, 982 00:43:53,910 --> 00:43:54,820 oleh saya. 983 00:43:54,820 --> 00:43:57,700 >> Dan sekarang Bandingkan Nol melakukan hal ini. 984 00:43:57,700 --> 00:44:00,110 Saya menggunakan CS50 perpustakaan dalam standar I / O. 985 00:44:00,110 --> 00:44:04,319 Aku punya fungsi utama yang pertama mengatakan, mengatakan sesuatu, dan mendapat string. 986 00:44:04,319 --> 00:44:06,110 Kemudian mengatakan lagi dan mendapat string lain. 987 00:44:06,110 --> 00:44:09,910 Dan perhatikan bahwa kedua string disebut s dan t masing-masing. 988 00:44:09,910 --> 00:44:12,910 Dan sekarang program ini, Bandingkan Nol, tujuannya dalam hidup, 989 00:44:12,910 --> 00:44:15,470 itu seharusnya memberitahu saya, aku ketik hal yang sama? 990 00:44:15,470 --> 00:44:16,910 Dan jadi saya akan kembali ke minggu satu. 991 00:44:16,910 --> 00:44:19,950 Saya menggunakan operator yang sama sama saya yang merupakan operator kualitas. 992 00:44:19,950 --> 00:44:22,220 Tidak operator penugasan, operator kesetaraan. 993 00:44:22,220 --> 00:44:23,890 Aku hanya membandingkan dan t. 994 00:44:23,890 --> 00:44:27,470 >> Jadi mari kita benar-benar pergi ke depan dan melakukan hal ini. 995 00:44:27,470 --> 00:44:32,680 Dan aku akan pergi ke depan dan membuat Bandingkan Zero. 996 00:44:32,680 --> 00:44:35,110 Aku akan melakukan ./comparezero. 997 00:44:35,110 --> 00:44:37,150 Dan aku akan pergi depan dan mengatakan sesuatu 998 00:44:37,150 --> 00:44:43,450 seperti, mari kita lakukan ibu dalam huruf kecil dan bagaimana ibu dalam huruf besar. 999 00:44:43,450 --> 00:44:45,034 Dan tentu saja saya ketik hal yang berbeda. 1000 00:44:45,034 --> 00:44:45,533 Baiklah. 1001 00:44:45,533 --> 00:44:46,570 Itulah yang diharapkan. 1002 00:44:46,570 --> 00:44:47,640 >> Mari kita jalankan lagi. 1003 00:44:47,640 --> 00:44:49,740 Kedua kali melakukan huruf kecil, huruf kecil. 1004 00:44:49,740 --> 00:44:51,490 Itu terlihat super identik dengan saya. 1005 00:44:51,490 --> 00:44:52,930 Masukkan. 1006 00:44:52,930 --> 00:44:53,430 OKE. 1007 00:44:53,430 --> 00:44:55,804 Mungkin itu hanya aneh karena itu tidak menyukai tata bahasa saya. 1008 00:44:55,804 --> 00:44:59,930 Jadi mari kita melakukan MOM modal, modal IBU, identik. 1009 00:44:59,930 --> 00:45:01,490 Hal yang berbeda. 1010 00:45:01,490 --> 00:45:03,907 >> Jadi kenapa begitu? 1011 00:45:03,907 --> 00:45:06,240 Nah, apa yang sebenarnya terjadi di bawah kap di sini? 1012 00:45:06,240 --> 00:45:08,180 Jadi mari kita kembali lebih di sini untuk hanya sesaat 1013 00:45:08,180 --> 00:45:10,910 dan mempertimbangkan apa GetString sebenarnya lakukan. 1014 00:45:10,910 --> 00:45:13,385 Ketika Anda menelepon GetString, itulah fungsi kami 1015 00:45:13,385 --> 00:45:16,510 diri menulis dan entah bagaimana mendapat urutan karakter dari pengguna. 1016 00:45:16,510 --> 00:45:20,280 Dan mari kita asumsikan bahwa pertama Waktu saya sebut GetString, yang memberikan saya 1017 00:45:20,280 --> 00:45:21,930 sepotong memori yang terlihat seperti ini. 1018 00:45:21,930 --> 00:45:26,990 Dan jika saya mengetik di semua huruf kecil m-o-m-- dan apa yang terjadi setelah itu? 1019 00:45:26,990 --> 00:45:28,840 Hanya cek kewarasan cepat. 1020 00:45:28,840 --> 00:45:29,780 >> Nol backslash. 1021 00:45:29,780 --> 00:45:30,510 Kita tahu bahwa. 1022 00:45:30,510 --> 00:45:32,784 Dan ingat bahwa kami bermain sekitar dengan nama Zamila ini 1023 00:45:32,784 --> 00:45:34,950 dan sekelompok nama lain ketika Rob sini mencari 1024 00:45:34,950 --> 00:45:36,280 apa yang terjadi di dalam memori. 1025 00:45:36,280 --> 00:45:37,780 Jadi cerita yang persis sama. 1026 00:45:37,780 --> 00:45:40,160 Ini adalah apa yang GetString adalah kembali kepada saya. 1027 00:45:40,160 --> 00:45:44,780 Sekarang, kode saya beberapa saat yang lalu disimpan nilai pengembalian GetString 1028 00:45:44,780 --> 00:45:47,510 dalam variabel yang disebut s. 1029 00:45:47,510 --> 00:45:51,390 Dan kemudian kedua kalinya aku menyebutnya, itu disimpan dalam sebuah variabel yang disebut t. 1030 00:45:51,390 --> 00:45:55,070 >> Jadi jika saya pergi ke sini, saya perlu menggambar variable-- lokal ini 1031 00:45:55,070 --> 00:45:59,610 dan aku umumnya akan menggambar string sebagai hanya-- kita akan 1032 00:45:59,610 --> 00:46:02,360 menyebutnya s-- sebagai persegi kecil di sini. 1033 00:46:02,360 --> 00:46:09,760 Dan sekarang, somehow-- bagaimana ibu masuk ke dalam variabel s ini? 1034 00:46:09,760 --> 00:46:12,010 Nah, kita perlu kembali prinsip-prinsip pertama di sini. 1035 00:46:12,010 --> 00:46:15,660 Apa yang sebenarnya GetString kembali? 1036 00:46:15,660 --> 00:46:19,030 >> Jadi ternyata bahwa M-O-M backslash nol, dan sejumlah 1037 00:46:19,030 --> 00:46:22,364 string lainnya di memori seperti Zamila dan Rob atau Andy atau orang lain, 1038 00:46:22,364 --> 00:46:24,280 tentu saja di kita RAM komputer atau memori. 1039 00:46:24,280 --> 00:46:27,760 Dan RAM Anda memiliki like-- Anda memiliki sebuah pertunjukan RAM, dua gigs RAM, 1040 00:46:27,760 --> 00:46:30,860 atau miliar atau dua miliar byte, atau mungkin bahkan lebih hari ini. 1041 00:46:30,860 --> 00:46:34,070 Jadi mari kita asumsikan, untuk tujuan hari ini, bahwa tidak peduli bagaimana kita nomor 1042 00:46:34,070 --> 00:46:36,640 mereka, tapi kami dapat nomor masing-masing orang miliar atau dua miliar 1043 00:46:36,640 --> 00:46:37,880 atau empat milyar byte. 1044 00:46:37,880 --> 00:46:42,240 >> Dan mari kita sewenang-wenang mengatakan bahwa ini adalah gigitan pertama, gigitan kedua, 1045 00:46:42,240 --> 00:46:43,380 ketiga, keempat. 1046 00:46:43,380 --> 00:46:46,570 Saya sengaja tidak menggunakan nol untuk hari ini tapi kami akan kembali ke itu. 1047 00:46:46,570 --> 00:46:49,570 Jadi dengan kata lain, jika ini adalah pertama kalinya saya menggunakan program ini, 1048 00:46:49,570 --> 00:46:52,715 Aku hanya mendapatkan beruntung dan yang pertama gigitan di lokasi satu kemudian dua 1049 00:46:52,715 --> 00:46:53,590 kemudian tiga dari empat. 1050 00:46:53,590 --> 00:46:57,430 Dan jika aku terus menggambar, jumlah kotak dua miliar akan menjadi cara di sini. 1051 00:46:57,430 --> 00:47:02,200 >> Jadi apa yang Anda pikirkan, maka, GetString benar-benar kembali? 1052 00:47:02,200 --> 00:47:06,010 Ini tidak kembali M-O-M backslash nol per se karena yang jelas 1053 00:47:06,010 --> 00:47:08,180 tidak akan cocok di kotak yang saya sudah ditarik. 1054 00:47:08,180 --> 00:47:11,210 Jadi apa lagi yang mungkin GetString sebenarnya kembali semua minggu ini? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 Jawabannya adalah pada papan sini. 1057 00:47:16,820 --> 00:47:20,390 Anda tidak dapat memasukkan M-O-M backslash nol, jadi apa mungkin masuk akal bukan? 1058 00:47:20,390 --> 00:47:23,424 Jika Anda harus menjadi super pintar, menempatkan pada apa yang disebut topi rekayasa, 1059 00:47:23,424 --> 00:47:24,340 apa yang bisa Anda kembali? 1060 00:47:24,340 --> 00:47:27,340 Apa sedikitnya jumlah informasi Anda bisa kembali yang akan masih 1061 00:47:27,340 --> 00:47:30,610 biarkan Anda menemukan M-O-M di memori? 1062 00:47:30,610 --> 00:47:31,270 Ya? 1063 00:47:31,270 --> 00:47:31,950 >> AUDIENCE: Satu. 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J. Malan: Satu. 1065 00:47:32,200 --> 00:47:33,021 Dan mengapa satu? 1066 00:47:33,021 --> 00:47:35,520 AUDIENCE: Karena itu akan memberitahu Anda pergi ke mana [tidak terdengar]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J. Malan: Tepat. 1069 00:47:39,390 --> 00:47:44,300 Saya hanya akan kembali alamat dari string yang saya mendapatkan. 1070 00:47:44,300 --> 00:47:46,570 Alamat di ini Kasus adalah lokasi satu. 1071 00:47:46,570 --> 00:47:51,280 Jadi apa yang sebenarnya sedang disimpan di s-- dan setiap variabel string sehingga far-- 1072 00:47:51,280 --> 00:47:53,430 baru saja menjadi alamat string yang. 1073 00:47:53,430 --> 00:47:57,840 >> Sementara itu, jika saya sebut GetString kedua kalinya dan aku 1074 00:47:57,840 --> 00:48:03,300 ketik harfiah thing-- sama M-O-M dengan lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 dan backslash lain nol, dan sekarang mungkin program saya 1076 00:48:06,200 --> 00:48:09,820 telah berjalan selama beberapa waktu jadi mungkin ini adalah 10, ini adalah lokasi 11, ini 12, 1077 00:48:09,820 --> 00:48:10,700 ini adalah 13. 1078 00:48:10,700 --> 00:48:13,590 Komputer menggunakan beberapa lainnya memori untuk alasan apapun. 1079 00:48:13,590 --> 00:48:18,172 Apa yang sekarang berjalan di kedua variabel dalam saya t Program? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Tepat. 1082 00:48:20,050 --> 00:48:23,910 >> Dan jadi ketika kita melihat kode sumber dari program ini 1083 00:48:23,910 --> 00:48:26,550 mana aku hanya berusaha untuk membandingkan dua nilai, 1084 00:48:26,550 --> 00:48:32,180 adalah s sama sama dengan t, apa jawaban manusia yang jelas? 1085 00:48:32,180 --> 00:48:34,890 Hanya ada karena 1 tidak sama 10. 1086 00:48:34,890 --> 00:48:36,861 Dan di sinilah letak sebuah kesempatan bagi kita benar-benar 1087 00:48:36,861 --> 00:48:39,610 hanya kembali ke, lagi, pertama prinsip dan berpikir tentang, baik, 1088 00:48:39,610 --> 00:48:41,110 apa yang terjadi di bawah tenda? 1089 00:48:41,110 --> 00:48:43,240 Kami telah berbicara tentang bit dan byte dan memori, 1090 00:48:43,240 --> 00:48:46,820 tapi itu sebenarnya berguna untuk memahami karena ketika Anda menelepon GetString, 1091 00:48:46,820 --> 00:48:50,280 meskipun kita berpikir itu adalah kembali M-O-M atau tali ibu 1092 00:48:50,280 --> 00:48:53,120 atau Andy atau Zamila atau sejenisnya, secara teknis 1093 00:48:53,120 --> 00:48:55,510 itu hanya kembali alamat dari yang sepotong memori. 1094 00:48:55,510 --> 00:48:56,910 >> Tapi itu OK. 1095 00:48:56,910 --> 00:49:00,570 Karena bagaimana saya tahu di mana string berakhir? 1096 00:49:00,570 --> 00:49:03,840 Jika saya hanya diberikan awal? 1097 00:49:03,840 --> 00:49:05,380 Nah, backslash nol, kan? 1098 00:49:05,380 --> 00:49:08,800 Hanya dalam waktu linier aku bisa mencetak dengan print def M-O-M. 1099 00:49:08,800 --> 00:49:11,820 Dan segera setelah saya melihat backslash nol, saya tidak peduli di mana saya mulai, 1100 00:49:11,820 --> 00:49:14,950 Aku sudah tahu secara implisit di mana saya harus mengakhiri. 1101 00:49:14,950 --> 00:49:18,700 >> Dan hari ini menandai beginning-- dan biarkan aku melakukan ini secara dramatis karena kita 1102 00:49:18,700 --> 00:49:21,800 pergi melalui banyak kesulitan untuk mendapatkan ini di sini melatih wheels-- 1103 00:49:21,800 --> 00:49:29,840 jadi hari ini roda pelatihan mulai datang dari dan kami mengungkapkan di least-- 1104 00:49:29,840 --> 00:49:31,373 >> [Tepuk Tangan] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> Itu layak perjalanan Target pagi ini, ya? 1107 00:49:36,160 --> 00:49:39,600 Jadi sekarang-- ada, ternyata keluar, tidak ada hal seperti string. 1108 00:49:39,600 --> 00:49:41,140 String tidak ada. 1109 00:49:41,140 --> 00:49:43,760 Ini sinonim yang kami punya dalam perpustakaan CS50. 1110 00:49:43,760 --> 00:49:48,660 Selanjutnya, kita akan mulai menelepon s dan t tidak string tapi bintang arang. 1111 00:49:48,660 --> 00:49:51,180 Dan bintang arang kita akan menggoda terpisah sebelum lama. 1112 00:49:51,180 --> 00:49:53,510 Tapi ini mengatakan, bahwa bahkan jika kita terus 1113 00:49:53,510 --> 00:49:56,180 menggunakan GetString untuk saat ini, secara teknis aku harus 1114 00:49:56,180 --> 00:49:59,010 menjadi mengatakan bintang char dan bintang arang. 1115 00:49:59,010 --> 00:50:01,720 >> Dan ternyata apa bintang yang akan menunjukkan sesuatu 1116 00:50:01,720 --> 00:50:04,340 disebut pointer atau alamat. 1117 00:50:04,340 --> 00:50:06,110 Dan pada kenyataannya, teaser untuk apa yang ada di depan 1118 00:50:06,110 --> 00:50:09,760 adalah ini 20 klip kedua dari kami teman Nick Parlante di Stanford 1119 00:50:09,760 --> 00:50:12,927 yang, beberapa waktu lalu, menghabiskan jumlah konyol waktu, 1120 00:50:12,927 --> 00:50:15,010 sebagai terbaik yang bisa saya katakan dalam bukunya dapur atau ruang bawah tanah, 1121 00:50:15,010 --> 00:50:17,140 membuat claymation memperkenalkan kepada dunia 1122 00:50:17,140 --> 00:50:20,010 karakter bernama Binky dengan siapa kita akan 1123 00:50:20,010 --> 00:50:22,010 diperkenalkan kali untuk pointer. 1124 00:50:22,010 --> 00:50:24,588 Jadi di sini adalah preview dari apa yang akan datang. 1125 00:50:24,588 --> 00:50:26,370 >> [VIDEO PLAYBACK] 1126 00:50:26,370 --> 00:50:27,510 >> -Hei, Binky. 1127 00:50:27,510 --> 00:50:28,260 Bangun. 1128 00:50:28,260 --> 00:50:30,672 Sudah waktunya untuk pointer menyenangkan. 1129 00:50:30,672 --> 00:50:31,616 >> -Apa itu? 1130 00:50:31,616 --> 00:50:33,032 Belajar tentang pointer? 1131 00:50:33,032 --> 00:50:34,450 Oh, goody. 1132 00:50:34,450 --> 00:50:35,431 >> [END PLAYBACK] 1133 00:50:35,431 --> 00:50:38,055 DAVID J. Malan: Dan pada catatan itu, kita akan melihat Anda pada hari Rabu. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 Baiklah. 1136 00:50:48,090 --> 00:50:48,740 Siapa menari? 1137 00:50:48,740 --> 00:50:49,240 Ayolah. 1138 00:50:49,240 --> 00:50:50,330 Siapa menari? 1139 00:50:50,330 --> 00:50:51,820 Anda ingin saya untuk mendapatkannya mulai? 1140 00:50:51,820 --> 00:50:53,770 Saya akan memulainya. 1141 00:50:53,770 --> 00:50:54,270 Woooo! 1142 00:50:54,270 --> 00:51:04,070 1143 00:51:04,070 --> 00:51:07,580 >> LAUREN: Manis mewah Musa.