1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [Minggu 4] 2 00:00:03,000 --> 00:00:05,000 [David J. Malan] [Universiti Harvard] 3 00:00:05,000 --> 00:00:08,000 [Ini adalah CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Baiklah, ini adalah CS50, dan ini adalah permulaan 4 minggu, 5 00:00:12,000 --> 00:00:16,000 dan ini adalah salah satu algoritma sorting perlahan mungkin. 6 00:00:16,000 --> 00:00:19,000 Yang mana satu adalah bahawa kita hanya menonton di sana? 7 00:00:19,000 --> 00:00:24,000 Itu adalah jenis gelembung, dalam perintah besar O (n ^ 2) + jumlah, 8 00:00:24,000 --> 00:00:28,000 dan sememangnya kita tidak adalah satu-satunya di dunia ini seolah-olah tahu 9 00:00:28,000 --> 00:00:30,000 apa apapun gelembung atau masa berjalan. 10 00:00:30,000 --> 00:00:33,000 Sesungguhnya, ini adalah satu temu bual dengan Eric Schmidt Google 11 00:00:33,000 --> 00:00:45,000 dan bekas senator Barack Obama hanya beberapa tahun yang lalu. 12 00:00:45,000 --> 00:00:48,000 >> Sekarang, Senator, anda di sini pada Google, 13 00:00:48,000 --> 00:00:54,000 dan saya suka berfikir presiden sebagai temuduga pekerjaan. 14 00:00:54,000 --> 00:00:58,000 Kini, ia adalah sukar untuk mendapatkan pekerjaan sebagai presiden, dan anda akan melalui menggigil sekarang. 15 00:00:58,000 --> 00:01:00,000 Ia juga sukar untuk mendapatkan pekerjaan di Google. 16 00:01:00,000 --> 00:01:05,000 Kami mempunyai soalan, dan kita bertanya soalan calon kami, 17 00:01:05,000 --> 00:01:10,000 dan yang satu ini adalah dari Larry Schwimmer. 18 00:01:10,000 --> 00:01:14,000 Kalian fikir saya bergurau? Ia adalah di sini. 19 00:01:14,000 --> 00:01:18,000 Apakah cara yang paling berkesan untuk menyelesaikan satu juta integer 32-bit? 20 00:01:18,000 --> 00:01:21,000 [Ketawa] 21 00:01:21,000 --> 00:01:24,000 Well- 22 00:01:24,000 --> 00:01:26,000 Saya minta maaf. >> Tidak, tidak, tidak, tidak. 23 00:01:26,000 --> 00:01:34,000 Saya fikir jenis gelembung akan menjadi cara yang salah untuk pergi. 24 00:01:34,000 --> 00:01:39,000 >> Come on, yang memberitahunya ini? 25 00:01:39,000 --> 00:01:43,000 Minggu lepas ingat kita mengambil cuti dari kod, sekurang-kurangnya untuk hari, 26 00:01:43,000 --> 00:01:46,000 dan mula memberi tumpuan kepada beberapa idea tahap yang lebih tinggi dan penyelesaian masalah lebih amnya 27 00:01:46,000 --> 00:01:49,000 dalam konteks mencari dan menyusun, 28 00:01:49,000 --> 00:01:53,000 dan kita memperkenalkan sesuatu yang kita tidak menampar nama ini pada minggu lepas, 29 00:01:53,000 --> 00:01:56,000 tetapi notasi asimptot, Big O, Omega Besar, 30 00:01:56,000 --> 00:02:00,000 dan kadang-kadang notasi Teta Besar, dan ini adalah semata-mata cara 31 00:02:00,000 --> 00:02:02,000 menerangkan masa berjalan algoritma, 32 00:02:02,000 --> 00:02:05,000 berapa banyak masa yang diperlukan untuk algoritma untuk menjalankan. 33 00:02:05,000 --> 00:02:08,000 >> Dan anda mungkin ingat bahawa anda bercakap tentang masa berjalan dari segi saiz 34 00:02:08,000 --> 00:02:11,000 input, yang kita biasanya panggilan n, apa jua masalah yang berkenaan, 35 00:02:11,000 --> 00:02:13,000 di mana n ialah bilangan orang di dalam bilik, 36 00:02:13,000 --> 00:02:17,000 bilangan muka surat dalam buku telefon, dan kita mula untuk menulis perkara yang keluar 37 00:02:17,000 --> 00:02:21,000 seperti O (n ^ 2) atau O (n) atau O (n log n), 38 00:02:21,000 --> 00:02:24,000 dan walaupun matematik tidak cukup bersenam begitu sempurna 39 00:02:24,000 --> 00:02:28,000 dan ia adalah n ² - n / 2 atau sesuatu seperti itu 40 00:02:28,000 --> 00:02:31,000 kita sebaliknya akan hanya buang beberapa terma perintah yang lebih rendah, 41 00:02:31,000 --> 00:02:34,000 dan motivasi di sana adalah bahawa kita benar-benar mahu 42 00:02:34,000 --> 00:02:37,000 jenis cara objektif menilai 43 00:02:37,000 --> 00:02:39,000 prestasi program atau prestasi algoritma 44 00:02:39,000 --> 00:02:42,000 bahawa pada akhir hari tiada kaitan, misalnya, 45 00:02:42,000 --> 00:02:45,000 dengan kelajuan komputer anda hari ini. 46 00:02:45,000 --> 00:02:47,000 >> Sebagai contoh, jika anda melaksanakan isih gelembung, 47 00:02:47,000 --> 00:02:50,000 atau anda melaksanakan bergabung apapun jenis atau pemilihan pada komputer hari ini, 48 00:02:50,000 --> 00:02:53,000 komputer 2 GHz, dan anda menjalankan, 49 00:02:53,000 --> 00:02:56,000 dan ia mengambil masa beberapa beberapa saat, tahun depan ada satu GHz 3 50 00:02:56,000 --> 00:02:59,000 atau komputer 4 GHz, dan kemudian anda mungkin mendakwa bahawa "Wow, algoritma saya 51 00:02:59,000 --> 00:03:03,000 kini dua kali lebih cepat, "apabila dalam realiti yang jelas bukan kes itu. 52 00:03:03,000 --> 00:03:06,000 Ia hanya perkakasan telah mendapat lebih cepat, tetapi komputer anda 53 00:03:06,000 --> 00:03:10,000 tidak, dan sebagainya kita benar-benar mahu buang perkara-perkara seperti 54 00:03:10,000 --> 00:03:13,000 gandaan 2 atau gandaan 3 apabila ia datang untuk menerangkan 55 00:03:13,000 --> 00:03:17,000 berapa cepat atau bagaimana perlahan algoritma dan benar-benar hanya memberi tumpuan 56 00:03:17,000 --> 00:03:20,000 n atau beberapa faktor daripadanya, 57 00:03:20,000 --> 00:03:24,000 sedikit kuasa daripadanya seperti dalam kes macam dari minggu lepas. 58 00:03:24,000 --> 00:03:27,000 Dan ingat bahawa dengan bantuan apapun merge 59 00:03:27,000 --> 00:03:31,000 kita mampu untuk melakukan jauh lebih baik daripada isih gelembung dan apapun pemilihan 60 00:03:31,000 --> 00:03:33,000 dan juga kemasukan apapun. 61 00:03:33,000 --> 00:03:36,000 >> Kami mendapat ke n log n, dan sekali lagi, 62 00:03:36,000 --> 00:03:39,000 ingat bahawa log n umumnya merujuk kepada sesuatu yang tumbuh 63 00:03:39,000 --> 00:03:43,000 lebih perlahan maka n, supaya n log n setakat ini adalah baik 64 00:03:43,000 --> 00:03:45,000 kerana ia adalah kurang daripada ² n. 65 00:03:45,000 --> 00:03:47,000 Tetapi untuk mencapai n log n dengan apapun merge 66 00:03:47,000 --> 00:03:51,000 apa yang kuman asas idea bahawa kita terpaksa untuk memanfaatkan 67 00:03:51,000 --> 00:03:54,000 bahawa kita juga dimanfaatkan kembali di titik 0 minggu? 68 00:03:54,000 --> 00:03:58,000 Bagaimana kita menangani masalah sorting bijak dengan jenis merge? 69 00:03:58,000 --> 00:04:04,000 Apakah wawasan utama, mungkin? 70 00:04:04,000 --> 00:04:07,000 Sesiapa sahaja pada semua. 71 00:04:07,000 --> 00:04:09,000 Baiklah, mari kita mengambil langkah ke belakang. 72 00:04:09,000 --> 00:04:11,000 Terangkan bergabung apapun dalam perkataan anda sendiri. 73 00:04:11,000 --> 00:04:15,000 Bagaimana ia berfungsi? 74 00:04:15,000 --> 00:04:17,000 Baiklah, kita akan berdayung kembali ke 0 minggu. 75 00:04:17,000 --> 00:04:19,000 Okay, yeah. 76 00:04:19,000 --> 00:04:22,000 [Didengar-pelajar] 77 00:04:22,000 --> 00:04:26,000 Okay, baik, jadi kami dibahagikan pelbagai nombor ke 2 keping. 78 00:04:26,000 --> 00:04:29,000 Kami disusun setiap orang-orang keping, dan maka kita digabungkan mereka, 79 00:04:29,000 --> 00:04:33,000 dan kita telah melihat idea ini sebelum mengambil satu masalah yang besar ini 80 00:04:33,000 --> 00:04:36,000 dan mencincang sehingga ia menjadi masalah yang ini besar atau besar ini. 81 00:04:36,000 --> 00:04:38,000 >> Recall contoh buku telefon. 82 00:04:38,000 --> 00:04:42,000 Recall algoritma pengiraan diri dari minggu lalu, 83 00:04:42,000 --> 00:04:45,000 apapun jadi bergabung telah diringkaskan oleh pseudokod ini di sini. 84 00:04:45,000 --> 00:04:48,000 Apabila anda diberi n unsur, pertama ia adalah kewarasan memeriksa. 85 00:04:48,000 --> 00:04:51,000 Jika n <2 kemudian tidak berbuat apa-apa pada semua 86 00:04:51,000 --> 00:04:55,000 kerana jika n <2 maka n jelas 0 atau 1, 87 00:04:55,000 --> 00:04:57,000 dan sebagainya jika ia adalah sama ada 0 atau 1 ada apa-apa untuk menyelesaikan. 88 00:04:57,000 --> 00:04:59,000 Anda selesai. 89 00:04:59,000 --> 00:05:01,000 Senarai anda sudah disusun trivially. 90 00:05:01,000 --> 00:05:04,000 Tetapi sebaliknya jika anda mempunyai 2 atau lebih unsur pergi ke hadapan dan membahagikan mereka 91 00:05:04,000 --> 00:05:06,000 kepada 2 bahagian, kiri dan kanan. 92 00:05:06,000 --> 00:05:09,000 Susun setiap bahagian mereka, dan kemudian menggabungkan bahagian yang disusun. 93 00:05:09,000 --> 00:05:13,000 Tetapi masalah di sini adalah bahawa pada pandangan pertama ini merasakan seperti yang kita sedang punting. 94 00:05:13,000 --> 00:05:17,000 Ini adalah definisi yang bulat dalam bahawa jika saya telah meminta anda untuk menyusun elemen-elemen n 95 00:05:17,000 --> 00:05:22,000 dan anda memberitahu saya "Baiklah, halus, kita akan menyusun unsur-unsur n / 2 dan mereka n / 2," 96 00:05:22,000 --> 00:05:27,000 maka soalan seterusnya saya akan menjadi "Fine, bagaimana anda menyusun n / 2 elemen?" 97 00:05:27,000 --> 00:05:30,000 >> Tetapi kerana struktur program ini, 98 00:05:30,000 --> 00:05:33,000 kerana terdapat kes ini asas, jadi untuk bercakap, 99 00:05:33,000 --> 00:05:39,000 ini kes khas yang mengatakan bahawa jika n 00:05:42,000 Jangan bertindak balas dengan jawapan yang sama bulat. 101 00:05:42,000 --> 00:05:46,000 Proses ini, cyclicity ini akhirnya akan berakhir. 102 00:05:46,000 --> 00:05:50,000 Jika saya meminta anda "Susun unsur-unsur n," dan anda berkata, "Fine, menyusun ini n / 2," 103 00:05:50,000 --> 00:05:53,000 maka anda mengatakan, "Halus, jenis-n / 4, n / 8, n/16," 104 00:05:53,000 --> 00:05:56,000 akhirnya anda akan membahagikan dengan bilangan yang cukup besar 105 00:05:56,000 --> 00:05:59,000 bahawa anda akan mempunyai hanya 1 kiri unsur, di mana titik anda boleh mengatakan, 106 00:05:59,000 --> 00:06:02,000 "Di sini, di sini adalah elemen tunggal yang disusun." 107 00:06:02,000 --> 00:06:06,000 Kemudian kecemerlangan algoritma ini sehingga di sini adalah berasal dari fakta 108 00:06:06,000 --> 00:06:09,000 bahawa apabila anda mempunyai semua ini senarai yang disusun secara individu, 109 00:06:09,000 --> 00:06:12,000 semua yang 1 saiz, yang seolah-olah menjadi sia-sia, 110 00:06:12,000 --> 00:06:15,000 sebaik sahaja anda mula penggabungan mereka dan bergabung mereka 111 00:06:15,000 --> 00:06:19,000 anda membina akhirnya sebagai Rob lakukan dalam video senarai akhirnya diselesaikan. 112 00:06:19,000 --> 00:06:22,000 >> Tetapi idea ini menjangkau lebih jauh daripada sorting. 113 00:06:22,000 --> 00:06:26,000 Terdapat idea ini tertanam dalam program ini dikenali sebagai rekursi, 114 00:06:26,000 --> 00:06:29,000 idea di mana anda program, 115 00:06:29,000 --> 00:06:32,000 dan untuk menyelesaikan beberapa masalah yang anda memanggil diri anda, 116 00:06:32,000 --> 00:06:36,000 atau meletakkan dalam konteks bahasa pengaturcaraan anda adalah fungsi, 117 00:06:36,000 --> 00:06:39,000 dan untuk menyelesaikan masalah, anda fungsi memanggil diri 118 00:06:39,000 --> 00:06:42,000 lagi dan lagi dan lagi, tetapi anda fungsi 119 00:06:42,000 --> 00:06:44,000 tidak boleh memanggil diri anda masa yang tak terhingga banyaknya. 120 00:06:44,000 --> 00:06:47,000 Akhirnya anda perlu ke bawah keluar, jadi untuk bercakap, 121 00:06:47,000 --> 00:06:49,000 dan mempunyai beberapa keadaan yang berkod keras asas yang mengatakan 122 00:06:49,000 --> 00:06:53,000 pada ketika ini berhenti memanggil diri anda supaya bahawa keseluruhan proses 123 00:06:53,000 --> 00:06:56,000 akhirnya tidak sebenarnya berhenti. 124 00:06:56,000 --> 00:06:58,000 Apakah ini benar-benar bermakna, untuk recurse? 125 00:06:58,000 --> 00:07:01,000 >> Mari kita lihat, jika kita boleh melakukan yang mudah, contoh remeh dengan, katakan, 126 00:07:01,000 --> 00:07:03,000 3 orang dengan saya di sini di atas pentas, jika seseorang selesa. 127 00:07:03,000 --> 00:07:06,000 1, datang pada sehingga, 2 dan 3. 128 00:07:06,000 --> 00:07:09,000 Jika anda 3 mahu datang sini. 129 00:07:09,000 --> 00:07:12,000 Jika anda mahu berdiri di sebelah saya di sini dalam satu barisan, andaikan bahawa masalah di tangan 130 00:07:12,000 --> 00:07:15,000 sangat trivially mengira bilangan orang-orang yang berada di sini. 131 00:07:15,000 --> 00:07:18,000 Tetapi terus-terang, saya letih semua contoh-contoh pengiraan. 132 00:07:18,000 --> 00:07:21,000 Ini akan mengambil sedikit masa, 1, 2, dan dot, dot, dot. 133 00:07:21,000 --> 00:07:23,000 Ia akan mengambil masa selama-lamanya. 134 00:07:23,000 --> 00:07:25,000 Saya lebih suka hanya menyepak bola masalah ini sama sekali dengan bantuan-apa nama anda? 135 00:07:25,000 --> 00:07:27,000 Sara. >> Sara, hak semua. 136 00:07:27,000 --> 00:07:29,000 Kelly. >> Kelly dan? 137 00:07:29,000 --> 00:07:31,000 >> Willy >> Willy, Sara, Kelly, dan Willy. 138 00:07:31,000 --> 00:07:34,000 Sekarang saya telah ditanya soalan oleh seseorang 139 00:07:34,000 --> 00:07:37,000 berapa ramai orang yang berada di atas pentas ini, dan aku tidak mempunyai idea. 140 00:07:37,000 --> 00:07:40,000 Ini adalah senarai yang benar-benar panjang, dan begitu juga sebaliknya saya akan melakukan silap mata ini. 141 00:07:40,000 --> 00:07:43,000 Saya akan bertanya kepada orang yang datang kepada saya untuk melakukan kebanyakan kerja, 142 00:07:43,000 --> 00:07:46,000 dan sekali dia dilakukan melakukan kebanyakan kerja 143 00:07:46,000 --> 00:07:49,000 Saya akan melakukan jumlah kurangnya kerja mungkin dan hanya menambah 1 144 00:07:49,000 --> 00:07:51,000 apa jua jawapan itu, jadi di sini kita pergi. 145 00:07:51,000 --> 00:07:54,000 Saya telah ditanya berapa ramai orang yang berada di atas pentas. 146 00:07:54,000 --> 00:07:57,000 Berapa ramai orang yang berada di atas pentas di sebelah kiri anda? 147 00:07:57,000 --> 00:08:00,000 Kiri saya? >> Baiklah, tetapi jangan menipu. 148 00:08:00,000 --> 00:08:04,000 Itu baik, yang betul, tetapi jika kita mahu terus logik ini 149 00:08:04,000 --> 00:08:08,000 mari kita andaikan bahawa anda sama mahu masalah ini menyepak bola ke kiri anda, 150 00:08:08,000 --> 00:08:11,000 jadi bukannya jawapan terus pergi ke hadapan dan hanya lulus tanggungjawab. 151 00:08:11,000 --> 00:08:14,000 Oh, berapa ramai orang yang sebelah kiri saya? 152 00:08:14,000 --> 00:08:16,000 Berapa ramai orang yang ke kiri? 153 00:08:16,000 --> 00:08:18,000 1. 154 00:08:18,000 --> 00:08:27,000 [Ketawa] 155 00:08:27,000 --> 00:08:30,000 Okay, jadi 0, jadi apa sekarang Willy telah dilakukan 156 00:08:30,000 --> 00:08:33,000 anda telah kembali jawapan anda ke arah ini mengatakan 0. 157 00:08:33,000 --> 00:08:36,000 Sekarang, apa yang anda perlu lakukan? >> 1. 158 00:08:36,000 --> 00:08:39,000 Okay, jadi anda 1, jadi anda berkata, "Baiklah, saya akan tambahkan 1 159 00:08:39,000 --> 00:08:41,000 untuk apa jua kiraan Willy, "jadi 1 + 0. 160 00:08:41,000 --> 00:08:43,000 Anda sekarang 1 jadi jawapan anda ke kanan kini- 161 00:08:43,000 --> 00:08:45,000 1. >> Dan saya akan menjadi 2. 162 00:08:45,000 --> 00:08:48,000 Baik, jadi anda mengambil jawapan sebelumnya 1, 163 00:08:48,000 --> 00:08:51,000 menambah jumlah minimum kerja yang anda mahu lakukan, yang merupakan +1. 164 00:08:51,000 --> 00:08:55,000 Anda kini mempunyai 2, dan anda kemudian menyerahkan saya mana nilai? 165 00:08:55,000 --> 00:08:57,000 3, yang saya maksudkan, maaf, 2. 166 00:08:57,000 --> 00:08:59,000 Baik. 167 00:08:59,000 --> 00:09:02,000 >> Nah, kita mempunyai 0 ke kiri. 168 00:09:02,000 --> 00:09:05,000 Kemudian kami mempunyai 1, dan kemudian kita tambahkan 2, 169 00:09:05,000 --> 00:09:07,000 dan sekarang anda menyerahkan saya nombor 2, 170 00:09:07,000 --> 00:09:10,000 dan sebagainya saya berkata, okay, +1, 3. 171 00:09:10,000 --> 00:09:13,000 Sememangnya Terdapat 3 orang yang berdiri di sebelah kepada saya pada peringkat ini, 172 00:09:13,000 --> 00:09:16,000 jadi kita mungkin telah jelas dilakukan ini sangat linear, 173 00:09:16,000 --> 00:09:19,000 sangat banyak dalam fesyen yang jelas, tetapi apa yang kita benar-benar? 174 00:09:19,000 --> 00:09:21,000 Kami mengambil masalah daripada 3 saiz mulanya. 175 00:09:21,000 --> 00:09:24,000 Kami kemudian memecahkan ia ke dalam masalah saiz 2, 176 00:09:24,000 --> 00:09:27,000 maka masalah saiz 1, dan kemudian akhirnya kes asas 177 00:09:27,000 --> 00:09:29,000 adalah benar-benar, oh, tidak ada satu di sana, 178 00:09:29,000 --> 00:09:33,000 di mana titik Willy kembali berkesan jawapan yang berkod keras beberapa kali, 179 00:09:33,000 --> 00:09:36,000 dan yang kedua kemudiannya dipam sehingga, dipam sehingga, dipam sehingga, 180 00:09:36,000 --> 00:09:39,000 dan kemudian dengan menambah tambahan satu ini 1 181 00:09:39,000 --> 00:09:41,000 kami telah melaksanakan idea ini asas rekursi. 182 00:09:41,000 --> 00:09:44,000 >> Sekarang, dalam kes ini ia tidak benar-benar menyelesaikan masalah 183 00:09:44,000 --> 00:09:46,000 mana-mana lebih berkesan, maka kita telah melihat setakat ini. 184 00:09:46,000 --> 00:09:48,000 Tetapi berfikir tentang algoritma yang kita telah dilakukan di atas pentas setakat. 185 00:09:48,000 --> 00:09:51,000 Kami mempunyai 8 keping kertas di papan hitam, 186 00:09:51,000 --> 00:09:55,000 pada video apabila Sean telah mencari untuk bilangan 7, dan apa yang dia benar-benar? 187 00:09:55,000 --> 00:09:58,000 Nah, dia tidak melakukan apa-apa jenis jurang dan menakluk. 188 00:09:58,000 --> 00:10:01,000 Dia tidak melakukan apa-apa jenis rekursi. 189 00:10:01,000 --> 00:10:03,000 Sebaliknya dia hanya melakukan ini algoritma linear. 190 00:10:03,000 --> 00:10:07,000 Tetapi apabila kita memperkenalkan idea nombor yang disusun di atas pentas hidup minggu lepas 191 00:10:07,000 --> 00:10:09,000 maka kita mempunyai naluri ini pergi ke tengah-tengah, 192 00:10:09,000 --> 00:10:13,000 di mana titik kita mempunyai senarai yang lebih kecil daripada 4 saiz atau lain senarai saiz 4, 193 00:10:13,000 --> 00:10:17,000 dan kemudian kita mempunyai masalah yang sama yang tepat, jadi kita berulang, berulang, berulang. 194 00:10:17,000 --> 00:10:19,000 Dalam erti kata lain, kita recursed. 195 00:10:19,000 --> 00:10:24,000 Thank you very much kepada sukarelawan 3 kami di sini untuk menunjukkan rekursi dengan kami. 196 00:10:24,000 --> 00:10:28,000 >> Mari kita lihat jika kita tidak boleh membuat ini kini konkrit lebih sedikit, 197 00:10:28,000 --> 00:10:30,000 menyelesaikan masalah yang sekali lagi kita boleh lakukan cukup mudah, 198 00:10:30,000 --> 00:10:34,000 tetapi kita akan menggunakan ia sebagai batu loncatan untuk melaksanakan idea asas. 199 00:10:34,000 --> 00:10:37,000 Jika saya mahu mengira penjumlahan sekumpulan nombor, 200 00:10:37,000 --> 00:10:39,000 sebagai contoh, jika anda lulus dalam bilangan 3, 201 00:10:39,000 --> 00:10:42,000 Saya ingin memberi anda nilai sigma 3, 202 00:10:42,000 --> 00:10:46,000 jadi jumlah 3 + 2 + 1 + 0. 203 00:10:46,000 --> 00:10:48,000 Saya mahu mendapatkan kembali jawapan 6, 204 00:10:48,000 --> 00:10:51,000 jadi kita akan melaksanakan fungsi ini sigma, fungsi ini penjumlahan 205 00:10:51,000 --> 00:10:54,000 itu, sekali lagi, mengambil input, dan kemudian mengembalikan penjumlahan 206 00:10:54,000 --> 00:10:57,000 daripada jumlah itu sepanjang jalan ke 0. 207 00:10:57,000 --> 00:10:59,000 Yang boleh kita lakukan ini cukup mudah, kan? 208 00:10:59,000 --> 00:11:01,000 Kita boleh melakukan ini dengan beberapa jenis struktur gelung, 209 00:11:01,000 --> 00:11:04,000 jadi biarlah saya pergi ke hadapan dan mendapatkan ini bermula. 210 00:11:04,000 --> 00:11:07,000 >> Termasuk stdio.h. 211 00:11:07,000 --> 00:11:09,000 Biar saya dapatkan sendiri ke utama untuk bekerja di sini. 212 00:11:09,000 --> 00:11:12,000 Mari kita menyimpan ini sebagai sigma.c. 213 00:11:12,000 --> 00:11:14,000 Kemudian saya akan pergi di sini, dan saya akan mengisytiharkan n int, 214 00:11:14,000 --> 00:11:18,000 dan saya akan melakukan perkara-perkara berikut semasa pengguna tidak bekerjasama. 215 00:11:18,000 --> 00:11:22,000 Walaupun pengguna telah tidak memberikan saya nombor positif 216 00:11:22,000 --> 00:11:26,000 membiarkan saya pergi ke hadapan dan meminta mereka untuk GetInt = n, 217 00:11:26,000 --> 00:11:28,000 dan biarlah saya memberikan mereka beberapa arahan untuk apa yang perlu dilakukan, 218 00:11:28,000 --> 00:11:33,000 jadi printf ("integer positif sila"). 219 00:11:33,000 --> 00:11:39,000 Hanya sesuatu yang agak mudah seperti ini supaya pada masa kita mencapai talian 14 220 00:11:39,000 --> 00:11:42,000 kita kini mempunyai satu integer positif mungkin dalam n. 221 00:11:42,000 --> 00:11:44,000 >> Sekarang mari kita melakukan sesuatu dengan ia. 222 00:11:44,000 --> 00:11:50,000 Biar saya pergi ke hadapan dan mengira penjumlahan, jadi jumlah int = sigma (n). 223 00:11:50,000 --> 00:11:54,000 Sigma merupakan hanya penjumlahan, jadi saya hanya menulis dalam cara penjaga. 224 00:11:54,000 --> 00:11:56,000 Kami hanya akan memanggilnya sigma sana. 225 00:11:56,000 --> 00:11:58,000 Itulah jumlah wang itu, dan kini saya akan mencetak hasilnya, 226 00:11:58,000 --> 00:12:08,000 printf ("Jumlah ialah% d \ n", jumlah). 227 00:12:08,000 --> 00:12:11,000 Dan kemudian saya akan kembali 0 untuk mengukur baik. 228 00:12:11,000 --> 00:12:15,000 Kami telah melakukan segala-galanya bahawa program ini memerlukan kecuali bahagian yang menarik, 229 00:12:15,000 --> 00:12:18,000 yang sebenarnya melaksanakan fungsi sigma. 230 00:12:18,000 --> 00:12:22,000 >> Biar saya pergi ke sini ke bawah, dan biarlah saya mengisytiharkan fungsi sigma. 231 00:12:22,000 --> 00:12:26,000 Ia mendapat untuk mengambil pembolehubah yang integer jenis, 232 00:12:26,000 --> 00:12:30,000 dan apa jenis data yang saya mahu kembali dianggap dari sigma? 233 00:12:30,000 --> 00:12:34,000 Int, kerana saya mahu ia sepadan dengan jangkaan saya pada 15 baris. 234 00:12:34,000 --> 00:12:37,000 Di sini biarlah saya pergi ke hadapan dan melaksanakan ini 235 00:12:37,000 --> 00:12:41,000 dalam cara yang agak mudah. 236 00:12:41,000 --> 00:12:45,000 >> Mari kita pergi ke hadapan dan berkata jumlah int = 0, 237 00:12:45,000 --> 00:12:47,000 dan sekarang saya akan pergi ke mempunyai sedikit gelung di sini 238 00:12:47,000 --> 00:12:50,000 yang akan mengatakan sesuatu seperti ini, 239 00:12:50,000 --> 00:13:01,000 (int i = 0; I <= bilangan; i + +) jumlah + = i. 240 00:13:01,000 --> 00:13:05,000 Dan kemudian saya akan kembali jumlah. 241 00:13:05,000 --> 00:13:07,000 Saya boleh dilaksanakan ini di mana-mana nombor cara. 242 00:13:07,000 --> 00:13:09,000 Saya boleh digunakan gelung sementara. 243 00:13:09,000 --> 00:13:11,000 Saya boleh dilangkau menggunakan pembolehubah jumlah jika saya benar-benar mahu, 244 00:13:11,000 --> 00:13:15,000 tetapi dalam jangka pendek, kita hanya mempunyai fungsi bahawa jika saya tidak orang bodoh mengisytiharkan jumlah adalah 0. 245 00:13:15,000 --> 00:13:18,000 Kemudian ia lelaran dari 0 sehingga melalui nombor, 246 00:13:18,000 --> 00:13:23,000 dan pada setiap lelaran ia menambah bahawa nilai semasa kepada jumlah dan kemudian kembali jumlah. 247 00:13:23,000 --> 00:13:25,000 >> Sekarang, terdapat pengoptimuman sedikit di sini. 248 00:13:25,000 --> 00:13:29,000 Ini mungkin satu langkah yang sia-sia, tetapi jadi ia. Itu denda buat masa sekarang. 249 00:13:29,000 --> 00:13:32,000 Kami berada sekurang-kurangnya yang menyeluruh dan akan 0 sepanjang jalan pada sehingga. 250 00:13:32,000 --> 00:13:34,000 Tidak sangat keras dan cukup mudah, 251 00:13:34,000 --> 00:13:37,000 tetapi ternyata bahawa dengan fungsi sigma kita mempunyai peluang yang sama 252 00:13:37,000 --> 00:13:39,000 seperti yang kita lakukan di sini di atas pentas. 253 00:13:39,000 --> 00:13:42,000 Di atas pentas kita hanya dikira berapa ramai orang yang berada di sebelah saya, 254 00:13:42,000 --> 00:13:47,000 tetapi sebaliknya jika kita mahu untuk mengira bilangan 3 + 2 + 1 255 00:13:47,000 --> 00:13:51,000 pada ke 0, kita boleh sama menyepak bola ke fungsi 256 00:13:51,000 --> 00:13:55,000 bahawa saya bukannya akan menggambarkan sebagai rekursi. 257 00:13:55,000 --> 00:13:57,000 Di sini mari kita melakukan kewarasan cepat menyemak dan memastikan saya tidak orang bodoh. 258 00:13:57,000 --> 00:14:00,000 >> Saya tahu terdapat sekurang-kurangnya satu perkara dalam program ini yang saya tidak zalim. 259 00:14:00,000 --> 00:14:04,000 Apabila saya tekan enter saya akan mendapat apa-apa jenis menjerit pada saya? 260 00:14:04,000 --> 00:14:06,000 Apa yang saya akan menjerit pada kira-kira? 261 00:14:06,000 --> 00:14:11,000 Ya, saya terlupa prototaip, jadi saya menggunakan fungsi dipanggil sigma on line 15, 262 00:14:11,000 --> 00:14:16,000 tetapi ia tidak diisytiharkan sehingga garisan 22, jadi saya terbaik proaktif naik sini 263 00:14:16,000 --> 00:14:22,000 dan mengisytiharkan prototaip, dan saya akan mengatakan int sigma (int nombor), dan itulah ia. 264 00:14:22,000 --> 00:14:24,000 Ia dilaksanakan di bawah. 265 00:14:24,000 --> 00:14:27,000 >> Atau cara lain saya boleh menyelesaikan masalah ini, 266 00:14:27,000 --> 00:14:30,000 Saya boleh bergerak fungsi di sana, yang tidak buruk, 267 00:14:30,000 --> 00:14:32,000 tetapi sekurang-kurangnya apabila program anda bermula untuk mendapatkan panjang, terus-terang, 268 00:14:32,000 --> 00:14:35,000 Saya fikir ada beberapa nilai dalam sentiasa mempunyai utama di bahagian atas 269 00:14:35,000 --> 00:14:38,000 supaya anda pembaca boleh membuka fail tersebut dan kemudian segera melihat 270 00:14:38,000 --> 00:14:40,000 apa yang program ini lakukan tanpa perlu mencari melalui 271 00:14:40,000 --> 00:14:42,000 mencari fungsi yang utama. 272 00:14:42,000 --> 00:14:49,000 Mari kita pergi ke tetingkap terminal saya di sini, cuba membuat sigma membuat sigma, 273 00:14:49,000 --> 00:14:51,000 dan saya diskrukan sehingga di sini juga. 274 00:14:51,000 --> 00:14:55,000 Akuan tersirat GetInt fungsi bermakna saya terlupa untuk berbuat apa lagi? 275 00:14:55,000 --> 00:14:57,000 [Didengar-pelajar] 276 00:14:57,000 --> 00:15:00,000 Baik, jadi nampaknya satu kesilapan biasa, jadi mari kita meletakkan ini di sini, 277 00:15:00,000 --> 00:15:04,000 cs50.h, dan sekarang mari kita kembali ke tetingkap terminal saya. 278 00:15:04,000 --> 00:15:08,000 >> Saya akan mengosongkan skrin, dan saya akan memutarkan lagi membuat sigma. 279 00:15:08,000 --> 00:15:11,000 Ia seolah-olah telah disusun. Izinkan saya sekarang menjalankan sigma. 280 00:15:11,000 --> 00:15:15,000 Saya akan menaip dalam bilangan 3, dan saya tidak mendapat 6, jadi tidak cek yang ketat, 281 00:15:15,000 --> 00:15:18,000 tetapi sekurang-kurangnya ia seolah-olah bekerja pada pandangan pertama, tetapi sekarang mari kita merobek ia selain, 282 00:15:18,000 --> 00:15:21,000 dan mari kita sebenarnya memanfaatkan idea rekursi, sekali lagi, 283 00:15:21,000 --> 00:15:24,000 dalam konteks yang sangat mudah supaya dalam masa beberapa minggu ' 284 00:15:24,000 --> 00:15:27,000 apabila kita mula meneroka struktur data yang penjaga daripada array 285 00:15:27,000 --> 00:15:30,000 kita mempunyai satu lagi alat dalam Kit dengan yang 286 00:15:30,000 --> 00:15:33,000 memanipulasi struktur data tersebut seperti yang kita akan lihat. 287 00:15:33,000 --> 00:15:36,000 Ini adalah pendekatan lelaran, pendekatan berasaskan gelung. 288 00:15:36,000 --> 00:15:39,000 >> Biar saya sebaliknya kini melakukan ini. 289 00:15:39,000 --> 00:15:44,000 Biar saya bukan mengatakan bahawa penjumlahan nombor 290 00:15:44,000 --> 00:15:48,000 ke 0 adalah benar-benar perkara yang sama seperti 291 00:15:48,000 --> 00:15:53,000 nombor + sigma (nombor 1). 292 00:15:53,000 --> 00:15:57,000 Dalam erti kata lain, sama seperti di atas pentas saya punted kepada setiap orang akan datang kepada saya, 293 00:15:57,000 --> 00:16:00,000 dan mereka pula disimpan punting sehingga kita akhirnya berdasar keluar pada Willy, 294 00:16:00,000 --> 00:16:03,000 yang terpaksa pulang jawapan keras berkod seperti 0. 295 00:16:03,000 --> 00:16:07,000 Di sini sekarang kita sama punting untuk sigma 296 00:16:07,000 --> 00:16:10,000 fungsi yang sama seperti pada asalnya dipanggil, tetapi wawasan utama di sini 297 00:16:10,000 --> 00:16:12,000 adalah bahawa kita tidak memanggil sigma sepercaman. 298 00:16:12,000 --> 00:16:14,000 Kami tidak lulus di n. 299 00:16:14,000 --> 00:16:17,000 Kami jelas lulus dalam bilangan - 1, 300 00:16:17,000 --> 00:16:20,000 jadi masalah sedikit lebih kecil, masalah kecil sedikit. 301 00:16:20,000 --> 00:16:23,000 >> Malangnya, ini tidak agak penyelesaian lagi, dan sebelum kita menetapkan 302 00:16:23,000 --> 00:16:26,000 apa yang mungkin melompat keluar sebagai jelas di sesetengah daripada anda 303 00:16:26,000 --> 00:16:28,000 izinkan saya pergi ke hadapan dan memutarkan lagi membuat. 304 00:16:28,000 --> 00:16:30,000 Ia seolah-olah untuk menyusun okay. 305 00:16:30,000 --> 00:16:32,000 Izinkan saya jalankan lagi sigma dengan 6. 306 00:16:32,000 --> 00:16:37,000 Oop, biarlah saya jalankan lagi sigma dengan 6. 307 00:16:37,000 --> 00:16:42,000 Kami telah melihat sebelum ini, walaupun masa yang sengaja lepas juga. 308 00:16:42,000 --> 00:16:48,000 Mengapa saya mendapat ini bersalah segmentasi samar? Yeah. 309 00:16:48,000 --> 00:16:50,000 [Didengar-pelajar] 310 00:16:50,000 --> 00:16:53,000 Tiada kes asas, dan lebih khusus, apa yang mungkin berlaku? 311 00:16:53,000 --> 00:16:58,000 Ini adalah gejala apa tingkah laku? 312 00:16:58,000 --> 00:17:00,000 Katakanlah ia sedikit kuat. 313 00:17:00,000 --> 00:17:02,000 [Didengar-pelajar] 314 00:17:02,000 --> 00:17:05,000 Ia gelung tak terhingga dengan berkesan, dan masalah dengan gelung tidak terhingga 315 00:17:05,000 --> 00:17:08,000 apabila mereka melibatkan rekursi dalam kes ini, fungsi memanggil sendiri, 316 00:17:08,000 --> 00:17:10,000 apa yang berlaku setiap kali anda memanggil fungsi? 317 00:17:10,000 --> 00:17:13,000 Nah, berfikir kembali bagaimana kita dibentangkan memori dalam komputer. 318 00:17:13,000 --> 00:17:16,000 Kami berkata bahawa ada ini sebahagian memori dipanggil timbunan yang di bawah, 319 00:17:16,000 --> 00:17:19,000 dan setiap kali anda memanggil fungsi memori yang lebih sedikit mendapat meletakkan 320 00:17:19,000 --> 00:17:24,000 pada timbunan ini kononnya mengandungi pembolehubah tempatan atau parameter yang fungsi, 321 00:17:24,000 --> 00:17:27,000 jadi jika sigma panggilan panggilan sigma sigma panggilan sigma 322 00:17:27,000 --> 00:17:29,000  panggilan sigma manakah ini akhir cerita? 323 00:17:29,000 --> 00:17:31,000 >> Nah, ia akhirnya lebihan jumlah 324 00:17:31,000 --> 00:17:33,000 memori yang anda ada ke komputer anda. 325 00:17:33,000 --> 00:17:37,000 Anda ditakluki segmen bahawa anda sepatutnya berada dalam lingkungan, 326 00:17:37,000 --> 00:17:40,000 dan anda mendapatkan ini kesalahan segmentasi, dibuang teras, 327 00:17:40,000 --> 00:17:43,000 dan apa teras dibuang bermakna bahawa saya kini mempunyai fail yang dipanggil teras 328 00:17:43,000 --> 00:17:46,000 yang merupakan fail yang mengandungi sifar dan orang-orang yang 329 00:17:46,000 --> 00:17:49,000 yang sebenarnya pada masa depan akan menjadi diagnostically berguna. 330 00:17:49,000 --> 00:17:52,000 Jika ia tidak jelas kepada anda di mana pepijat anda ini adalah 331 00:17:52,000 --> 00:17:54,000 anda sebenarnya boleh melakukan sedikit analisis forensik, jadi untuk bercakap, 332 00:17:54,000 --> 00:17:58,000 pada fail dump teras, yang, sekali lagi, hanya sekumpulan keseluruhan sifar dan orang-orang yang 333 00:17:58,000 --> 00:18:02,000 yang pada asasnya mewakili negeri dalam program anda dalam ingatan 334 00:18:02,000 --> 00:18:05,000 masa ini ia terhempas dengan cara ini. 335 00:18:05,000 --> 00:18:11,000 >> Menetapkan di sini adalah bahawa kita tidak boleh hanya membuta tuli kembali sigma, 336 00:18:11,000 --> 00:18:14,000 bilangan + sigma masalah kecil sedikit. 337 00:18:14,000 --> 00:18:16,000 Kita perlu mempunyai beberapa jenis kes asas di sini, 338 00:18:16,000 --> 00:18:19,000 dan apa yang perlu kes asas mungkin? 339 00:18:19,000 --> 00:18:22,000 [Didengar-pelajar] 340 00:18:22,000 --> 00:18:25,000 Okay, selagi nombor adalah positif kita sebenarnya perlu kembali ini, 341 00:18:25,000 --> 00:18:29,000 atau meletakkan cara lain, jika nombor, katakan, <= ke 0 342 00:18:29,000 --> 00:18:32,000 anda tahu apa, saya akan pergi ke hadapan dan kembali 0, 343 00:18:32,000 --> 00:18:36,000 sama seperti Willy lakukan, dan yang lain, saya akan pergi ke hadapan 344 00:18:36,000 --> 00:18:41,000 dan kembali ini, jadi ia tidak yang lebih pendek 345 00:18:41,000 --> 00:18:44,000 daripada versi lelaran yang kita disebat pertama menggunakan untuk gelung, 346 00:18:44,000 --> 00:18:48,000 tetapi notis bahawa terdapat jenis ini keanggunan ke. 347 00:18:48,000 --> 00:18:51,000 Bukannya kembali beberapa nombor dan melaksanakan segala matematik ini 348 00:18:51,000 --> 00:18:54,000 dan menambah perkara dengan pembolehubah tempatan 349 00:18:54,000 --> 00:18:57,000 anda sebaliknya berkata "Baiklah, jika ini adalah masalah mudah super, 350 00:18:57,000 --> 00:19:01,000 seperti nombor <0, izinkan saya dengan serta-merta mengembalikan 0. " 351 00:19:01,000 --> 00:19:03,000 >> Kami tidak akan mengganggu menyokong nombor negatif, 352 00:19:03,000 --> 00:19:05,000 jadi saya akan kod keras nilai 0. 353 00:19:05,000 --> 00:19:08,000 Tetapi sebaliknya, untuk melaksanakan idea ini menjumlahkan 354 00:19:08,000 --> 00:19:11,000 semua nombor-nombor ini bersama-sama anda berkesan boleh mengambil menggigit kecil 355 00:19:11,000 --> 00:19:14,000 daripada masalah, sama seperti yang kita lakukan di sini di atas pentas, 356 00:19:14,000 --> 00:19:18,000 kemudian menyepak bola seluruh masalah kepada orang yang seterusnya, 357 00:19:18,000 --> 00:19:20,000 tetapi dalam kes ini orang yang seterusnya adalah diri sendiri. 358 00:19:20,000 --> 00:19:22,000 Ia adalah fungsi sepercaman dinamakan. 359 00:19:22,000 --> 00:19:25,000 Hanya lulus masalah yang lebih kecil dan lebih kecil dan lebih kecil setiap kali, 360 00:19:25,000 --> 00:19:28,000 dan walaupun kita tidak cukup dirasmikan perkara dalam kod di sini 361 00:19:28,000 --> 00:19:33,000 ini adalah apa yang telah berlaku di dalam 0 minggu dengan buku telefon. 362 00:19:33,000 --> 00:19:36,000 Ini adalah apa yang telah berlaku dalam beberapa minggu lalu dengan Sean 363 00:19:36,000 --> 00:19:39,000 dan dengan demonstrasi kami mencari nombor. 364 00:19:39,000 --> 00:19:42,000 Ia mengambil masalah dan membahagikan lagi dan lagi. 365 00:19:42,000 --> 00:19:44,000 >> Dalam erti kata lain, ada cara sekarang menterjemah 366 00:19:44,000 --> 00:19:47,000 ini dunia sebenar membina, membina tahap yang lebih tinggi 367 00:19:47,000 --> 00:19:51,000 membahagi dan menakluk dan melakukan sesuatu lagi dan lagi 368 00:19:51,000 --> 00:19:56,000 dalam kod, jadi ini adalah sesuatu yang kita akan melihat semula dari masa ke masa. 369 00:19:56,000 --> 00:20:00,000 Kini, sebagai diketepikan, jika anda baru kepada rekursi anda perlu sekurang-kurangnya memahami kini 370 00:20:00,000 --> 00:20:02,000 mengapa ini lucu. 371 00:20:02,000 --> 00:20:05,000 Saya akan pergi ke google.com, 372 00:20:05,000 --> 00:20:17,000 dan saya akan mencari beberapa tips dan trik rekursi, masukkan. 373 00:20:17,000 --> 00:20:21,000 Beritahu orang yang datang kepada anda jika mereka tidak ketawa tadi. 374 00:20:21,000 --> 00:20:23,000 Adakah anda maksudkan rekursi? 375 00:20:23,000 --> 00:20:25,000 Did you mean-ah, ada kita pergi. 376 00:20:25,000 --> 00:20:28,000 Okay, sekarang bahawa seluruh semua orang. 377 00:20:28,000 --> 00:20:30,000 Satu telur Easter sedikit tertanam tempat ada di Google. 378 00:20:30,000 --> 00:20:33,000 Sebagai mengetepikan, salah satu link kita diletakkan di atas laman web kursus 379 00:20:33,000 --> 00:20:36,000 untuk hari ini adalah hanya ini grid pelbagai algoritma isihan, 380 00:20:36,000 --> 00:20:39,000 beberapa yang kita melihat pada minggu lepas, tetapi apa yang baik tentang visualisasi ini 381 00:20:39,000 --> 00:20:43,000 seperti yang anda cuba untuk membalut fikiran anda sekitar pelbagai perkara yang berkaitan dengan algoritma 382 00:20:43,000 --> 00:20:46,000 tahu bahawa anda boleh sangat mudah sekarang bermula dengan pelbagai jenis input. 383 00:20:46,000 --> 00:20:50,000 Input semua diterbalikkan, input kebanyakannya disusun, input rawak dan sebagainya. 384 00:20:50,000 --> 00:20:53,000 Seperti yang anda cuba, sekali lagi, membezakan perkara-perkara ini dalam fikiran anda 385 00:20:53,000 --> 00:20:57,000 menyedari bahawa URL ini di laman web kursus pada halaman Kuliah 386 00:20:57,000 --> 00:21:00,000 mungkin membantu anda sebab melalui beberapa daripada mereka. 387 00:21:00,000 --> 00:21:05,000 >> Hari ini kita akhirnya dapat menyelesaikan masalah ini dari semasa belakang, 388 00:21:05,000 --> 00:21:08,000 yang merupakan bahawa fungsi ini swap hanya tidak bekerja, 389 00:21:08,000 --> 00:21:12,000 dan apakah masalah asas dengan swap fungsi ini, 390 00:21:12,000 --> 00:21:15,000 matlamat yang adalah, sekali lagi, untuk menukar nilai di sini dan di sini 391 00:21:15,000 --> 00:21:17,000 seperti yang perkara ini berlaku? 392 00:21:17,000 --> 00:21:20,000 Ini tidak benar-benar bekerja. Mengapa? 393 00:21:20,000 --> 00:21:22,000 Yeah. 394 00:21:22,000 --> 00:21:28,000 [Didengar-pelajar] 395 00:21:28,000 --> 00:21:31,000 Tepat sekali, penjelasan bagi bugginess ini 396 00:21:31,000 --> 00:21:34,000 hanya kerana apabila anda memanggil fungsi dalam C 397 00:21:34,000 --> 00:21:38,000 dan fungsi-fungsi mengambil hujah, seperti a dan b di sini, 398 00:21:38,000 --> 00:21:42,000 anda lulus dalam salinan apa-apa nilai yang anda menyediakan fungsi itu. 399 00:21:42,000 --> 00:21:46,000 Anda tidak menyediakan nilai asal sendiri, 400 00:21:46,000 --> 00:21:49,000 jadi kita melihat ini dalam konteks buggyc, 401 00:21:49,000 --> 00:21:52,000 buggy3.c, yang memandang sesuatu yang kecil seperti ini. 402 00:21:52,000 --> 00:21:57,000 >> Ingatlah bahawa kita mempunyai x dan y dimulakan 1 dan 2, masing-masing. 403 00:21:57,000 --> 00:21:59,000 Kami kemudian dicetak apa yang mereka. 404 00:21:59,000 --> 00:22:03,000 Saya kemudian mendakwa bahawa saya telah bertukar-tukar mereka dengan memanggil swap x, y. 405 00:22:03,000 --> 00:22:06,000 Tetapi masalahnya ialah bahawa bertukar-tukar bekerja, 406 00:22:06,000 --> 00:22:10,000 tetapi hanya dalam skop swap berfungsi sendiri. 407 00:22:10,000 --> 00:22:13,000 Secepat kita mencapai garis 40 nilai-nilai bertukar 408 00:22:13,000 --> 00:22:16,000 dibuang, dan sebagainya tiada 409 00:22:16,000 --> 00:22:21,000 utama dalam fungsi asal itu sebenarnya telah diubah pada semua, 410 00:22:21,000 --> 00:22:26,000 jadi jika anda berfikir kembali kemudian untuk apa ini kelihatan seperti dari segi ingatan kita 411 00:22:26,000 --> 00:22:29,000 jika ini sebelah kiri lembaga mewakili 412 00:22:29,000 --> 00:22:33,000 dan saya akan melakukan yang terbaik untuk semua orang untuk melihat ini jika ini sebelah kiri lembaga 413 00:22:33,000 --> 00:22:37,000 mewakili, katakan, RAM anda, dan timbunan akan berkembang dengan cara ini, 414 00:22:37,000 --> 00:22:43,000 dan kita panggil fungsi seperti utama, dan utama mempunyai 2 pembolehubah tempatan, x dan y, 415 00:22:43,000 --> 00:22:48,000 mari kita menggambarkan mereka sebagai x di sini, dan mari kita menggambarkan ini sebagai y di sini, 416 00:22:48,000 --> 00:22:55,000 dan mari kita dimasukkan ke dalam nilai 1 dan 2, jadi ini di sini adalah utama, 417 00:22:55,000 --> 00:22:58,000 dan apabila utama panggilan fungsi sistem operasi swap 418 00:22:58,000 --> 00:23:02,000 memberikan fungsi swap petak sendiri memori pada timbunan, 419 00:23:02,000 --> 00:23:04,000 bingkai sendiri pada timbunan, jadi untuk bercakap. 420 00:23:04,000 --> 00:23:08,000 Ia juga memperuntukkan 32 bit bagi ints. 421 00:23:08,000 --> 00:23:11,000 Ia berlaku untuk memanggil mereka a dan b, tetapi yang benar-benar sewenang-wenangnya. 422 00:23:11,000 --> 00:23:13,000 Ia boleh telah memanggil mereka apa sahaja yang ia mahu, tetapi apa yang berlaku apabila utama 423 00:23:13,000 --> 00:23:19,000 swap panggilan adalah ia mengambil masa ini 1, meletakkan satu salinan di sana, meletakkan salinan sana. 424 00:23:19,000 --> 00:23:23,000 >> Terdapat 1 pemboleh ubah tempatan yang lain di swap, walaupun, yang dipanggil apa? Tmp >>. 425 00:23:23,000 --> 00:23:27,000 Tmp, jadi biarlah saya memberikan diri saya 32 bit lagi di sini, 426 00:23:27,000 --> 00:23:29,000 dan apa yang saya lakukan dalam fungsi ini? 427 00:23:29,000 --> 00:23:34,000 Saya berkata tmp int mendapat, jadi mempunyai 1, jadi saya melakukan ini apabila kita terakhir dimainkan dengan contoh ini. 428 00:23:34,000 --> 00:23:39,000 Kemudian mendapat b, jadi b ialah 2, jadi sekarang ini menjadi 2, 429 00:23:39,000 --> 00:23:42,000 dan b kini mendapat menggoda, jadi sementara adalah 1, 430 00:23:42,000 --> 00:23:44,000 jadi sekarang b menjadi ini. 431 00:23:44,000 --> 00:23:46,000 Itu yang besar. Ia bekerja. 432 00:23:46,000 --> 00:23:49,000 Tetapi kemudian secepat pulangan fungsi 433 00:23:49,000 --> 00:23:52,000 memori swap berkesan hilang supaya ia boleh diguna semula 434 00:23:52,000 --> 00:23:58,000 oleh fungsi lain pada masa depan, dan utama adalah jelas sepenuhnya berubah. 435 00:23:58,000 --> 00:24:00,000 Kita memerlukan cara asasnya menyelesaikan masalah ini, 436 00:24:00,000 --> 00:24:03,000 dan hari ini kita akhirnya akan mempunyai cara untuk melakukan ini di mana 437 00:24:03,000 --> 00:24:06,000 kita boleh memperkenalkan sesuatu yang dipanggil penunjuk. 438 00:24:06,000 --> 00:24:09,000 Ia ternyata bahawa kita boleh menyelesaikan masalah ini 439 00:24:09,000 --> 00:24:12,000 bukan dengan lulus dalam salinan x dan y 440 00:24:12,000 --> 00:24:18,000 tetapi bukannya dengan lulus dalam apa, adakah anda berfikir, untuk fungsi swap? 441 00:24:18,000 --> 00:24:20,000 Ya, apa tentang alamat? 442 00:24:20,000 --> 00:24:22,000 Kami telah tidak benar-benar bercakap tentang alamat secara terperinci banyak, 443 00:24:22,000 --> 00:24:25,000 tetapi jika papan hitam ini mewakili memori komputer saya 444 00:24:25,000 --> 00:24:28,000 kita pasti boleh mula penomboran bait dalam RAM saya 445 00:24:28,000 --> 00:24:31,000 dan mengatakan ini adalah bait # 1, ini adalah bait # 2, bait # 3, 446 00:24:31,000 --> 00:24:35,000 bait # 4, bait # ... 2 bilion jika saya mempunyai 2 Gigabyte RAM, 447 00:24:35,000 --> 00:24:38,000 jadi kita pasti boleh datang dengan beberapa skim penomboran sewenang-wenangnya 448 00:24:38,000 --> 00:24:41,000 untuk semua bait individu dalam memori komputer saya. 449 00:24:41,000 --> 00:24:43,000 >> Bagaimana jika sebaliknya apabila saya panggil swap 450 00:24:43,000 --> 00:24:47,000 bukannya pas dalam salinan x dan y 451 00:24:47,000 --> 00:24:51,000 kenapa saya tidak sebaliknya lulus dalam alamat x di sini, 452 00:24:51,000 --> 00:24:55,000 alamat y di sini, pada dasarnya pos alamat 453 00:24:55,000 --> 00:24:59,000 x dan y kerana kemudian tukar, jika dia diberitahu 454 00:24:59,000 --> 00:25:01,000 alamat dalam ingatan x dan y, 455 00:25:01,000 --> 00:25:04,000 kemudian tukar, jika kita melatih dia sedikit, 456 00:25:04,000 --> 00:25:07,000 dia berpotensi memandu ke alamat itu, jadi untuk bercakap, 457 00:25:07,000 --> 00:25:11,000 x, dan menukar nombor di sana, kemudian memandu ke alamat y, 458 00:25:11,000 --> 00:25:16,000 menukar nombor di sana, walaupun ketika tidak sebenarnya mendapat salinan nilai-nilai dirinya, 459 00:25:16,000 --> 00:25:19,000 jadi walaupun kita bercakap tentang perkara ini sebagai ingatan utama 460 00:25:19,000 --> 00:25:23,000 dan ini swap sebagai ingatan yang kuat dan bahagian berbahaya C 461 00:25:23,000 --> 00:25:28,000 adalah bahawa apa-apa fungsi boleh menyentuh ingatan mana-mana sahaja dalam komputer, 462 00:25:28,000 --> 00:25:32,000 dan ini adalah berkuasa dalam bahawa anda boleh melakukan perkara-perkara yang sangat mewah dengan program komputer di C. 463 00:25:32,000 --> 00:25:36,000 Ini adalah berbahaya kerana anda juga boleh skru sehingga sangat mudah. 464 00:25:36,000 --> 00:25:39,000 Malah, salah satu cara yang paling biasa untuk program hari ini akan dieksploitasi 465 00:25:39,000 --> 00:25:42,000 masih adalah untuk programmer tidak menyedari 466 00:25:42,000 --> 00:25:45,000 bahawa dia membenarkan data 467 00:25:45,000 --> 00:25:49,000 hendaklah ditulis dalam lokasi memori yang tidak bertujuan. 468 00:25:49,000 --> 00:25:51,000 >> Sebagai contoh, dia mengisytiharkan pelbagai bersaiz 10 469 00:25:51,000 --> 00:25:56,000 tetapi kemudian sengaja cuba untuk meletakkan 11 bait ke dalam pelbagai bahawa memori, 470 00:25:56,000 --> 00:25:59,000 dan anda mula menyentuh bahagian ingatan yang tidak lagi sah. 471 00:25:59,000 --> 00:26:02,000 Hanya untuk konteks ini, sebahagian daripada anda mungkin tahu bahawa 472 00:26:02,000 --> 00:26:06,000 perisian sering meminta anda untuk nombor siri atau kunci pendaftaran, 473 00:26:06,000 --> 00:26:08,000 Photoshop dan Word dan program-program seperti ini. 474 00:26:08,000 --> 00:26:12,000 Terdapat wujud retak, sebagai sebahagian dari kamu tahu, talian di mana anda boleh menjalankan program kecil, 475 00:26:12,000 --> 00:26:14,000 dan Voilà, tiada permintaan yang lebih untuk nombor siri. 476 00:26:14,000 --> 00:26:16,000 Bagaimana yang bekerja? 477 00:26:16,000 --> 00:26:21,000 Dalam banyak kes, perkara-perkara ini hanya mencari dalam komputer 478 00:26:21,000 --> 00:26:24,000 segmen dalam teks sifar sebenar dan orang-orang yang komputer 479 00:26:24,000 --> 00:26:28,000 mana adalah bahawa fungsi yang mana nombor siri diminta, 480 00:26:28,000 --> 00:26:31,000 dan anda menimpa ruang itu, atau semasa program sedang berjalan 481 00:26:31,000 --> 00:26:33,000 anda boleh mengetahui di mana kunci sebenarnya disimpan 482 00:26:33,000 --> 00:26:37,000 menggunakan sesuatu yang dipanggil penyahpepijat, dan anda boleh retak perisian yang cara. 483 00:26:37,000 --> 00:26:40,000 Ini bukan untuk mengatakan bahawa ini adalah objektif kami untuk beberapa hari akan datang, 484 00:26:40,000 --> 00:26:42,000 tetapi ia mempunyai kesan yang sangat dunia sebenar. 485 00:26:42,000 --> 00:26:45,000 Bahawa salah satu yang berlaku melibatkan kecurian perisian, 486 00:26:45,000 --> 00:26:47,000 tetapi terdapat juga kompromi mesin keseluruhan. 487 00:26:47,000 --> 00:26:50,000 >> Malah, apabila laman web hari ini dieksploitasi 488 00:26:50,000 --> 00:26:53,000 dan dikompromi dan data bocor dan kata laluan yang dicuri 489 00:26:53,000 --> 00:26:58,000 ini sangat sering berkaitan dengan pengurusan yang lemah ingatan seseorang, 490 00:26:58,000 --> 00:27:01,000 atau, dalam kes pangkalan data, kegagalan untuk menjangka 491 00:27:01,000 --> 00:27:03,000 input pertentangan, jadi lebih pada itu pada minggu-minggu akan datang, 492 00:27:03,000 --> 00:27:07,000 tetapi kini hanya preview menyelinap apapun kerosakan yang boleh anda lakukan 493 00:27:07,000 --> 00:27:11,000 dengan tidak cukup memahami bagaimana perkara yang bekerja di bawah hood. 494 00:27:11,000 --> 00:27:14,000 Mari kita pergi tentang memahami mengapa ini dipecahkan 495 00:27:14,000 --> 00:27:17,000 dengan alat yang akan menjadi lebih dan lebih berguna 496 00:27:17,000 --> 00:27:19,000 program kami mendapat lebih kompleks. 497 00:27:19,000 --> 00:27:21,000 Setakat ini apabila anda mempunyai pepijat dalam program anda 498 00:27:21,000 --> 00:27:23,000 bagaimana anda pergi tentang debugging ia? 499 00:27:23,000 --> 00:27:25,000 Apa yang telah teknik anda menjadi setakat ini, sama ada yang diajar oleh TF anda 500 00:27:25,000 --> 00:27:27,000 atau hanya otodidak? 501 00:27:27,000 --> 00:27:29,000 [Pelajar] printf. 502 00:27:29,000 --> 00:27:31,000 Printf, begitu printf mungkin telah menjadi rakan anda dalam bahawa jika anda mahu melihat 503 00:27:31,000 --> 00:27:33,000 apa yang berlaku di dalam program anda 504 00:27:33,000 --> 00:27:36,000 anda hanya meletakkan printf sini, printf sini, printf sini. 505 00:27:36,000 --> 00:27:38,000 Kemudian anda menjalankan, dan anda mendapat sejumlah besar barangan pada skrin 506 00:27:38,000 --> 00:27:43,000 yang boleh anda gunakan kemudian simpulkan apa yang sebenarnya berlaku salah dalam program anda. 507 00:27:43,000 --> 00:27:45,000 >> Printf cenderung untuk menjadi perkara yang sangat berkuasa, 508 00:27:45,000 --> 00:27:47,000 tetapi ia adalah satu proses yang sangat manual. 509 00:27:47,000 --> 00:27:49,000 Anda perlu meletakkan printf sini, printf sini, 510 00:27:49,000 --> 00:27:51,000 dan jika anda meletakkan ia di dalam gelung anda mungkin mendapat 100 baris 511 00:27:51,000 --> 00:27:53,000 output yang anda kemudian perlu untuk menapis melalui. 512 00:27:53,000 --> 00:27:58,000 Ia bukan satu mekanisme sangat user-friendly atau interaktif untuk debugging program, 513 00:27:58,000 --> 00:28:00,000 tetapi bersyukur kerana wujud alternatif. 514 00:28:00,000 --> 00:28:03,000 Ada program, misalnya, yang dipanggil GDB, GNU Debugger, 515 00:28:03,000 --> 00:28:06,000 yang merupakan batin sedikit dalam bagaimana anda menggunakannya. 516 00:28:06,000 --> 00:28:08,000 Ia adalah agak kompleks, tetapi terus-terang, 517 00:28:08,000 --> 00:28:11,000 ini adalah salah satu daripada perkara-perkara di mana jika anda dimasukkan ke dalam minggu ini dan seterusnya 518 00:28:11,000 --> 00:28:14,000 jam tambahan untuk memahami sesuatu seperti GDB 519 00:28:14,000 --> 00:28:18,000 ia akan menjimatkan anda mungkin puluhan jam dalam jangka masa panjang, 520 00:28:18,000 --> 00:28:21,000 demikian dengan itu, izinkan saya memberi anda penggoda bagaimana perkara ini berfungsi. 521 00:28:21,000 --> 00:28:23,000 >> Saya dalam tetingkap terminal saya. 522 00:28:23,000 --> 00:28:26,000 Biar saya pergi ke hadapan dan menyusun program ini, buggy3. 523 00:28:26,000 --> 00:28:28,000 Ia sudah up to date. 524 00:28:28,000 --> 00:28:31,000 Biar saya jalankan ia seperti kita melakukan belakang sementara, dan sesungguhnya, ia pecah. 525 00:28:31,000 --> 00:28:34,000 Tetapi mengapa ini? Mungkin saya diskrukan sehingga fungsi swap. 526 00:28:34,000 --> 00:28:37,000 Mungkin ia adalah a dan b. Saya tidak cukup bergerak mereka di sekitar dengan betul. 527 00:28:37,000 --> 00:28:39,000 Biar saya pergi ke hadapan dan melakukan ini. 528 00:28:39,000 --> 00:28:43,000 Bukannya hanya menjalankan buggy3 izinkan saya bukannya menjalankan program ini GDB, 529 00:28:43,000 --> 00:28:48,000 dan saya akan memberitahu ia berjalan buggy3, 530 00:28:48,000 --> 00:28:52,000 dan saya akan termasuk hujah baris arahan, tui, 531 00:28:52,000 --> 00:28:55,000 dan kita akan meletakkan ini dalam masalah masa depan pada spec untuk mengingatkan. 532 00:28:55,000 --> 00:28:57,000 Dan sekarang ini muka yang hitam dan putih muncul itu, sekali lagi, 533 00:28:57,000 --> 00:28:59,000 adalah sedikit hangat pada mulanya kerana terdapat semua ini 534 00:28:59,000 --> 00:29:02,000 maklumat waranti ke sini, tetapi sekurang-kurangnya ada sesuatu yang biasa. 535 00:29:02,000 --> 00:29:04,000 Di bahagian atas tetingkap adalah kod sebenar saya, 536 00:29:04,000 --> 00:29:08,000 dan jika saya tatal di sini marilah saya tatal ke sangat atas fail saya, 537 00:29:08,000 --> 00:29:11,000 dan sesungguhnya, ada buggy3.c, dan notis di bahagian bawah tetingkap ini 538 00:29:11,000 --> 00:29:13,000 Saya mempunyai ini prompt GDB. 539 00:29:13,000 --> 00:29:16,000 >> Ini tidak sama seperti biasa saya John Harvard prompt. 540 00:29:16,000 --> 00:29:19,000 Ini adalah prompt yang akan membenarkan saya untuk mengawal GDB. 541 00:29:19,000 --> 00:29:21,000 GDB adalah penyahpepijat. 542 00:29:21,000 --> 00:29:24,000 Penyahpepijat adalah satu program yang membolehkan anda berjalan melalui 543 00:29:24,000 --> 00:29:27,000 pelaksanaan garis program anda oleh baris demi baris, 544 00:29:27,000 --> 00:29:30,000 sepanjang jalan melakukan apa sahaja yang anda mahu program, 545 00:29:30,000 --> 00:29:33,000 walaupun memanggil fungsi, atau mencari yang lebih penting, 546 00:29:33,000 --> 00:29:35,000 pada nilai pembolehubah pelbagai. 547 00:29:35,000 --> 00:29:37,000 Mari kita pergi ke hadapan dan melakukan ini. 548 00:29:37,000 --> 00:29:40,000 Saya akan pergi ke hadapan dan taip dalam jangka segera GDB, 549 00:29:40,000 --> 00:29:43,000 jadi notis di bahagian bawah kiri skrin saya menaip berjalan, 550 00:29:43,000 --> 00:29:45,000 dan saya telah melanda memasuki, dan apa yang dilakukan? 551 00:29:45,000 --> 00:29:50,000 Ia benar-benar berlari program saya, tetapi saya tidak benar-benar melihat banyak pergi di sini 552 00:29:50,000 --> 00:29:55,000 kerana saya telah tidak sebenarnya memberitahu penyahpepijat 553 00:29:55,000 --> 00:29:57,000 untuk berhenti pada masa tertentu dalam masa. 554 00:29:57,000 --> 00:29:59,000 Hanya menaip jangka menjalankan program. 555 00:29:59,000 --> 00:30:01,000 Saya sebenarnya tidak melihat apa-apa. Saya tidak boleh memanipulasi. 556 00:30:01,000 --> 00:30:03,000 >> Sebaliknya biarlah saya melakukan ini. 557 00:30:03,000 --> 00:30:08,000 Pada ini prompt GDB izinkan saya bukan menaip rehat, masukkan. 558 00:30:08,000 --> 00:30:10,000 Itu bukan apa yang saya maksudkan untuk menaip. 559 00:30:10,000 --> 00:30:13,000 Mari kita bukannya menaip rehat utama. 560 00:30:13,000 --> 00:30:15,000 Dalam erti kata lain, saya mahu untuk menetapkan sesuatu yang dipanggil titik putus, 561 00:30:15,000 --> 00:30:18,000 yang dinamakan kerana ia akan memecahkan atau menjedakan 562 00:30:18,000 --> 00:30:21,000 pelaksanaan program anda di tempat yang tertentu. 563 00:30:21,000 --> 00:30:23,000 Utama ialah nama fungsi saya. 564 00:30:23,000 --> 00:30:25,000 Perhatikan bahawa GDB cukup bijak. 565 00:30:25,000 --> 00:30:28,000 Ia beranggapan bahawa utama berlaku bermula kira-kira pada 18 baris 566 00:30:28,000 --> 00:30:32,000 buggy3.c, dan kemudian notis di sini di sebelah kiri atas 567 00:30:32,000 --> 00:30:34,000 b + adalah betul-betul bersebelahan dengan line 18. 568 00:30:34,000 --> 00:30:38,000 Itu mengingatkan saya bahawa saya telah menetapkan titik putus di line 18. 569 00:30:38,000 --> 00:30:42,000 Kali ini apabila saya menaip jangka, saya akan menjalankan program saya 570 00:30:42,000 --> 00:30:45,000 sehingga ia mencecah titik putus itu, 571 00:30:45,000 --> 00:30:48,000 supaya program itu akan berhenti untuk saya pada line 18. 572 00:30:48,000 --> 00:30:50,000 Di sini kita pergi, berlari. 573 00:30:50,000 --> 00:30:53,000 Tiada apa-apa jua nampaknya telah berlaku, tetapi notis di bahagian bawah kiri 574 00:30:53,000 --> 00:30:58,000 program bermula, buggy3, titik putus 1 utama di garisan buggy3.c 18. 575 00:30:58,000 --> 00:31:00,000 Apa yang boleh saya lakukan sekarang? 576 00:31:00,000 --> 00:31:03,000 >> Notis saya boleh mula menaip perkara-perkara seperti cetak, 577 00:31:03,000 --> 00:31:08,000 tidak printf, cetak x, dan kini yang aneh. 578 00:31:08,000 --> 00:31:11,000 $ 1 hanya ingin tahu, seperti yang kita akan lihat 579 00:31:11,000 --> 00:31:14,000 setiap kali anda mencetak sesuatu anda mendapat baru $ value. 580 00:31:14,000 --> 00:31:18,000 Itulah supaya anda boleh merujuk kembali kepada nilai-nilai yang sebelumnya hanya dalam kes, 581 00:31:18,000 --> 00:31:21,000 tetapi sekarang apa yang cetak memberitahu saya bahawa nilai x pada titik ini dalam cerita 582 00:31:21,000 --> 00:31:26,000 nampaknya 134514032. 583 00:31:26,000 --> 00:31:29,000 Apa? Di manakah yang walaupun datang dari? 584 00:31:29,000 --> 00:31:31,000 [Didengar-pelajar] 585 00:31:31,000 --> 00:31:34,000 Sesungguhnya, ini adalah apa yang kita akan memanggil nilai sampah, dan kami tidak bercakap tentang perkara ini lagi, 586 00:31:34,000 --> 00:31:37,000 tetapi sebab bahawa anda memulakan pembolehubah 587 00:31:37,000 --> 00:31:40,000 adalah jelas supaya mereka mempunyai beberapa nilai yang anda mahu mereka mempunyai. 588 00:31:40,000 --> 00:31:44,000 Tetapi tangkapan ingat bahawa anda boleh mengisytiharkan pembolehubah 589 00:31:44,000 --> 00:31:46,000 seperti yang saya lakukan masa lalu dalam contoh saya sigma 590 00:31:46,000 --> 00:31:48,000 tanpa sebenarnya memberikan mereka nilai. 591 00:31:48,000 --> 00:31:50,000 Ingat apa yang saya lakukan di sini dalam sigma. 592 00:31:50,000 --> 00:31:52,000 Saya mengisytiharkan n, tetapi apa nilai adakah saya memberi ia? 593 00:31:52,000 --> 00:31:56,000 Tiada, kerana saya tahu bahawa dalam beberapa baris seterusnya 594 00:31:56,000 --> 00:31:59,000 GetInt akan menjaga masalah meletakkan nilai di dalam n. 595 00:31:59,000 --> 00:32:02,000 >> Tetapi pada ketika ini dalam cerita dari 11 baris 596 00:32:02,000 --> 00:32:05,000 dan 12 line dan line 13 dan garis 14 597 00:32:05,000 --> 00:32:08,000 sepanjang mereka beberapa baris apakah nilai n? 598 00:32:08,000 --> 00:32:10,000 Dalam C, anda hanya tidak tahu. 599 00:32:10,000 --> 00:32:14,000 Ia adalah umumnya beberapa nilai sampah, beberapa nombor rawak sepenuhnya 600 00:32:14,000 --> 00:32:17,000 yang ditinggalkan dasarnya daripada beberapa fungsi sebelumnya 601 00:32:17,000 --> 00:32:21,000 telah dijalankan, supaya program anda berjalan 602 00:32:21,000 --> 00:32:24,000 ingat bahawa fungsi mendapat fungsi, fungsi, fungsi. 603 00:32:24,000 --> 00:32:27,000 Semua ini bingkai mendapat diletakkan di ingatan, dan kemudian mereka kembali fungsi, 604 00:32:27,000 --> 00:32:31,000 dan seperti saya mencadangkan dengan pemadam memori mereka akhirnya semula. 605 00:32:31,000 --> 00:32:37,000 Nah, ia hanya kebetulan bahawa ini x ubah dalam program ini 606 00:32:37,000 --> 00:32:41,000 seolah-olah telah terkandung beberapa nilai sampah seperti 134514032 607 00:32:41,000 --> 00:32:44,000 daripada beberapa fungsi sebelumnya, tidak ada seorang pun yang saya tulis. 608 00:32:44,000 --> 00:32:47,000 Ia boleh menjadi sesuatu yang datang secara berkesan dengan sistem operasi, 609 00:32:47,000 --> 00:32:49,000 beberapa fungsi di bawah hood. 610 00:32:49,000 --> 00:32:52,000 >> Okay, itulah denda, tetapi mari kita kini maju ke baris seterusnya. 611 00:32:52,000 --> 00:32:55,000 Jika saya menaip "seterusnya" di GDB saya segera dan saya tekan enter, 612 00:32:55,000 --> 00:32:58,000 notis bahawa menonjolkan bergerak ke bawah hingga 19 baris, 613 00:32:58,000 --> 00:33:01,000 tetapi implikasi logik adalah bahawa line 18 614 00:33:01,000 --> 00:33:06,000 kini telah selesai melaksanakan, jadi jika saya sekali lagi menaip "cetak x" 615 00:33:06,000 --> 00:33:10,000 Saya kini perlu melihat 1, dan sesungguhnya, saya lakukan. 616 00:33:10,000 --> 00:33:14,000 Sekali lagi, barangan $ adalah cara GDB mengingatkan anda 617 00:33:14,000 --> 00:33:17,000 apa sejarah cetakan yang anda lakukan. 618 00:33:17,000 --> 00:33:21,000 Sekarang mari saya pergi ke hadapan dan mencetak keluar y, dan sesungguhnya, y ialah beberapa nilai gila juga, 619 00:33:21,000 --> 00:33:24,000 tetapi ada masalah besar kerana di baris 19 kita berada kira-kira untuk menetapkan 620 00:33:24,000 --> 00:33:27,000 nilai 2, jadi biarlah saya menaip "seterusnya" lagi. 621 00:33:27,000 --> 00:33:29,000 Dan sekarang kita berada di garis printf. 622 00:33:29,000 --> 00:33:31,000 Biar saya buat x cetak. 623 00:33:31,000 --> 00:33:34,000 Biar saya melakukan y cetak. Terus terang, saya mendapat sedikit letih percetakan ini. 624 00:33:34,000 --> 00:33:38,000 Biar saya bukan menaip "paparan x" dan "y paparan," 625 00:33:38,000 --> 00:33:41,000 dan kini setiap kali saya menaip arahan pada masa hadapan 626 00:33:41,000 --> 00:33:45,000 Saya akan mengingatkan apa yang x dan y, apa yang x dan y, apa yang x dan y. 627 00:33:45,000 --> 00:33:48,000 >> Saya boleh juga, sebagai jenis diketepikan, dalam "info penduduk tempatan." 628 00:33:48,000 --> 00:33:50,000 Maklumat adalah arahan khas. 629 00:33:50,000 --> 00:33:52,000 Tempatan bermakna ia menunjukkan saya pembolehubah tempatan. 630 00:33:52,000 --> 00:33:55,000 Hanya dalam kes saya lupa atau ini adalah gila, fungsi rumit 631 00:33:55,000 --> 00:33:57,000 bahawa saya atau orang lain menulis info penduduk tempatan akan memberitahu anda 632 00:33:57,000 --> 00:34:00,000 apakah semua pembolehubah tempatan di dalam fungsi tempatan ini 633 00:34:00,000 --> 00:34:03,000 yang mungkin anda mengambil berat tentang jika anda mahu untuk mencucuk di sekitar. 634 00:34:03,000 --> 00:34:07,000 Sekarang, printf kira-kira untuk melaksanakan, jadi biarlah saya pergi ke hadapan dan hanya menaip "seterusnya." 635 00:34:07,000 --> 00:34:10,000 Kerana kita berada dalam persekitaran ini kita sebenarnya tidak melihat ia 636 00:34:10,000 --> 00:34:14,000 melaksanakan ke sini, tetapi notis itu semakin sedikit remuk di sini. 637 00:34:14,000 --> 00:34:17,000 Tetapi notis ia mengatasi skrin terdapat, 638 00:34:17,000 --> 00:34:21,000 jadi ia bukan satu program yang sempurna di sini, tetapi itulah okay kerana saya sentiasa boleh mencucuk di sekitar 639 00:34:21,000 --> 00:34:23,000 menggunakan cetak jika saya mahu. 640 00:34:23,000 --> 00:34:26,000 >> Biar saya menaip datang lagi, dan sekarang di sini adalah bahagian yang menarik. 641 00:34:26,000 --> 00:34:29,000 Pada ketika ini dalam cerita y ialah 2, dan x ialah 1, 642 00:34:29,000 --> 00:34:32,000 seperti yang dicadangkan di sini, dan sekali lagi, 643 00:34:32,000 --> 00:34:35,000 sebab ini secara automatik memaparkan kini adalah kerana saya menggunakan arahan 644 00:34:35,000 --> 00:34:40,000 paparan x dan y paparan, jadi masa saya menaip seterusnya 645 00:34:40,000 --> 00:34:43,000 dalam teori x dan y harus menjadi ditukar. 646 00:34:43,000 --> 00:34:45,000 Sekarang, kita sudah tahu bahawa tidak akan menjadi kes, 647 00:34:45,000 --> 00:34:49,000 tetapi kita akan melihat dalam seketika bagaimana kita boleh menyelam lebih mendalam untuk memahami mengapa itu benar. 648 00:34:49,000 --> 00:34:54,000 Seterusnya, dan malangnya, y masih 2 dan x masih 1, dan saya boleh mengesahkan banyak. 649 00:34:54,000 --> 00:34:56,000 Cetak x, y cetak. 650 00:34:56,000 --> 00:34:59,000 Sesungguhnya, tiada bertukar-tukar sebenarnya telah berlaku, jadi mari kita mulakan ini lebih. 651 00:34:59,000 --> 00:35:01,000 Jelas swap rosak. 652 00:35:01,000 --> 00:35:04,000 Mari kita bukannya menaip "jangka" lagi. 653 00:35:04,000 --> 00:35:07,000 Biar saya katakan ya, saya ingin memulakan semula dari awal, masukkan. 654 00:35:07,000 --> 00:35:09,000 >> Kini saya kembali pada 18 baris. 655 00:35:09,000 --> 00:35:11,000 Sekarang notis x dan y adalah nilai sampah lagi. 656 00:35:11,000 --> 00:35:15,000 Seterusnya, seterusnya, seterusnya, seterusnya. 657 00:35:15,000 --> 00:35:17,000 Jika saya mendapat bosan saya juga boleh hanya menaip n seterusnya. 658 00:35:17,000 --> 00:35:21,000 Anda boleh menyingkatkan urutan yang sesingkat mungkin aksara. 659 00:35:21,000 --> 00:35:23,000 Swap kini dipecahkan. 660 00:35:23,000 --> 00:35:25,000 Mari kita menyelam dalam, jadi bukannya menaip seterusnya, 661 00:35:25,000 --> 00:35:30,000 sekarang saya akan menaip langkah supaya saya melangkah di dalam fungsi ini 662 00:35:30,000 --> 00:35:33,000 supaya saya boleh berjalan melaluinya, jadi saya mencecah langkah dan kemudian masukkan. 663 00:35:33,000 --> 00:35:37,000 Notis bahawa lompatan menonjolkan turun lebih rendah dalam program saya kepada 36 baris. 664 00:35:37,000 --> 00:35:39,000 Sekarang apakah pembolehubah tempatan? 665 00:35:39,000 --> 00:35:41,000 Maklumat penduduk tempatan. 666 00:35:41,000 --> 00:35:43,000 Tiada apa-apa sahaja lagi kerana kita telah tidak mendapat ke garis itu, 667 00:35:43,000 --> 00:35:47,000 jadi mari kita pergi ke hadapan dan berkata "seterusnya." 668 00:35:47,000 --> 00:35:50,000 Sekarang kita seolah-olah mempunyai tmp, tmp cetak. 669 00:35:50,000 --> 00:35:52,000 Sampah nilai, betul-betul? Saya fikir begitu. 670 00:35:52,000 --> 00:35:55,000 Bagaimana pula mencetak cetak b, 1 dan 2? 671 00:35:55,000 --> 00:35:58,000 Dalam seketika, sebaik sahaja saya menaip seterusnya lagi 672 00:35:58,000 --> 00:36:02,000 tmp akan mengambil nilai 1, mudah-mudahan, 673 00:36:02,000 --> 00:36:05,000 kerana tmp akan diberikan nilai a. 674 00:36:05,000 --> 00:36:08,000 >> Sekarang mari kita tidak mencetak b, cetak, 675 00:36:08,000 --> 00:36:11,000 tetapi kini mencetak tmp, dan ia sememangnya 1. 676 00:36:11,000 --> 00:36:14,000 Biarkan saya lakukan seterusnya. Biarkan saya lakukan seterusnya. 677 00:36:14,000 --> 00:36:16,000 Saya telah selesai fungsi swap. 678 00:36:16,000 --> 00:36:19,000 Saya masih di dalamnya di baris 40, jadi biarlah saya mencetak, 679 00:36:19,000 --> 00:36:22,000 b cetak, dan saya tidak peduli apa tmp. 680 00:36:22,000 --> 00:36:27,000 Ia kelihatan seperti swap adalah betul apabila ia datang untuk bertukar-tukar a dan b. 681 00:36:27,000 --> 00:36:31,000 Tetapi jika saya kini menaip seterusnya, saya melompat kembali kepada 25 baris, 682 00:36:31,000 --> 00:36:34,000 dan tentu saja, jika saya taip x dan y cetak 683 00:36:34,000 --> 00:36:38,000 mereka masih tidak berubah, jadi kita telah tidak tetap masalah. 684 00:36:38,000 --> 00:36:41,000 Tetapi diagnostically kini mungkin dengan program GDB ini 685 00:36:41,000 --> 00:36:44,000 kita telah sekurang-kurangnya mendapat satu langkah lebih dekat untuk memahami 686 00:36:44,000 --> 00:36:47,000 apa yang berlaku salah tanpa perlu untuk sampah kod kami dengan meletakkan printf sini, 687 00:36:47,000 --> 00:36:50,000 printf sini, printf di sini dan kemudian berjalan lagi dan lagi 688 00:36:50,000 --> 00:36:52,000 cuba untuk mengetahui apa yang berlaku salah. 689 00:36:52,000 --> 00:36:55,000 >> Saya akan pergi ke hadapan dan berhenti daripada ini sama sekali dengan berhenti. 690 00:36:55,000 --> 00:36:57,000 Ia akan kemudian berkata, "Berhenti anyway?" Ya. 691 00:36:57,000 --> 00:37:00,000 Kini saya kembali pada prompt biasa saya, dan saya dilakukan dengan menggunakan GDB. 692 00:37:00,000 --> 00:37:03,000 Sebagai mengetepikan, anda tidak perlu untuk menggunakan ini-tui bendera. 693 00:37:03,000 --> 00:37:07,000 Malah, jika anda meninggalkan anda mendapat asasnya separuh bahagian bawah skrin. 694 00:37:07,000 --> 00:37:11,000 Jika saya kemudian taipkan rehat utama dan kemudian berjalan 695 00:37:11,000 --> 00:37:15,000 Saya masih boleh menjalankan program saya, tetapi apa yang ia akan lakukan lebih textually 696 00:37:15,000 --> 00:37:18,000 hanya menunjukkan kepada saya satu baris pada satu masa semasa. 697 00:37:18,000 --> 00:37:21,000 The tui, pengguna teks antara muka, 698 00:37:21,000 --> 00:37:25,000 hanya menunjukkan anda lebih daripada program ini sekali gus, yang mungkin sedikit konsepnya mudah. 699 00:37:25,000 --> 00:37:27,000 Tetapi sesungguhnya, saya hanya boleh lakukan seterusnya, seterusnya, seterusnya, 700 00:37:27,000 --> 00:37:30,000 dan saya akan melihat satu baris pada satu masa, dan jika saya benar-benar mahu melihat apa yang berlaku di 701 00:37:30,000 --> 00:37:35,000 Saya boleh menaip senarai dan melihat sekumpulan keseluruhan garisan jiran. 702 00:37:35,000 --> 00:37:39,000 >> Ada video yang kami telah diminta yang anda menonton untuk masalah menetapkan 3 703 00:37:39,000 --> 00:37:43,000 di mana Nate meliputi beberapa selok-belok GDB, 704 00:37:43,000 --> 00:37:46,000 dan ini adalah salah satu daripada perkara-perkara, jujur, di mana beberapa peratusan yang bukan remeh anda 705 00:37:46,000 --> 00:37:49,000 tidak akan menyentuh GDB, dan yang akan menjadi satu perkara yang buruk 706 00:37:49,000 --> 00:37:53,000 kerana benar-benar anda akan berakhir dengan menghabiskan lebih banyak masa kemudian semester ini 707 00:37:53,000 --> 00:37:56,000 mengejar pepijat maka anda akan jika anda dimasukkan ke dalam setengah jam yang / jam 708 00:37:56,000 --> 00:38:00,000 pembelajaran minggu ini dan seterusnya untuk mendapatkan selesa dengan GDB. 709 00:38:00,000 --> 00:38:02,000 Printf adalah rakan anda. 710 00:38:02,000 --> 00:38:05,000 GDB kini harus menjadi rakan anda. 711 00:38:05,000 --> 00:38:08,000 >> Sebarang pertanyaan pada GDB? 712 00:38:08,000 --> 00:38:12,000 Dan di sini adalah senarai cepat beberapa arahan yang paling berkuasa dan berguna. 713 00:38:12,000 --> 00:38:15,000 Yeah. >> Bolehkah anda mencetak rentetan? 714 00:38:15,000 --> 00:38:17,000 Anda boleh mencetak rentetan? Sudah tentu. 715 00:38:17,000 --> 00:38:19,000 Ia tidak perlu untuk hanya menjadi integer. 716 00:38:19,000 --> 00:38:22,000 Jika s berubah-ubah adalah rentetan hanya taip cetak s. 717 00:38:22,000 --> 00:38:24,000 Ia akan menunjukkan kepada anda apa yang pembolehubah rentetan. 718 00:38:24,000 --> 00:38:26,000 [Didengar-pelajar] 719 00:38:26,000 --> 00:38:28,000 Ia akan memberi anda alamat dan rentetan itu sendiri. 720 00:38:28,000 --> 00:38:32,000 Ia akan menunjukkan kepada anda berdua. 721 00:38:32,000 --> 00:38:34,000 Dan satu perkara yang lepas, hanya kerana ini adalah baik untuk mengetahui terlalu. 722 00:38:34,000 --> 00:38:37,000 Jejakundur dan bingkai, izinkan saya menyelam ke dalam masa ini terakhir, 723 00:38:37,000 --> 00:38:39,000 program yang tepat sama dengan GDB. 724 00:38:39,000 --> 00:38:44,000 Biar saya pergi ke hadapan dan menjalankan versi teks antara muka pengguna, 725 00:38:44,000 --> 00:38:46,000 memecahkan utama. 726 00:38:46,000 --> 00:38:49,000 Biar saya pergi ke hadapan dan berjalan lagi. Di sini saya. 727 00:38:49,000 --> 00:38:55,000 Sekarang mari saya pergi seterusnya, seterusnya, seterusnya, seterusnya, seterusnya, langkah, masukkan. 728 00:38:55,000 --> 00:39:00,000 >> Dan kini andaikan saya kini di swap sengaja, tetapi saya seperti "Damn, apakah nilai x?" 729 00:39:00,000 --> 00:39:02,000 Saya tidak boleh melakukan x lagi. 730 00:39:02,000 --> 00:39:05,000 Saya tidak boleh melakukan y kerana mereka tidak berada dalam skop. 731 00:39:05,000 --> 00:39:07,000 Mereka tidak berada dalam konteks, tetapi tidak ada masalah. 732 00:39:07,000 --> 00:39:09,000 Saya boleh menaip jejakundur. 733 00:39:09,000 --> 00:39:13,000 Itu menunjukkan saya semua fungsi yang telah dilaksanakan sehingga masa ini. 734 00:39:13,000 --> 00:39:16,000 Perhatikan bahawa satu di bahagian bawah, utama, garis-garis dengan utama 735 00:39:16,000 --> 00:39:18,000 berada di bahagian bawah gambar kami di sini. 736 00:39:18,000 --> 00:39:22,000 Hakikat bahawa swap adalah atas ia garisan dengan swap berada di atas dalam ingatan di sini, 737 00:39:22,000 --> 00:39:26,000 dan jika saya mahu mendapatkan kembali utama sementara saya boleh mengatakan "bingkai." 738 00:39:26,000 --> 00:39:30,000 Apakah nombor? Main bingkai # 1. 739 00:39:30,000 --> 00:39:32,000 Saya akan pergi ke hadapan dan berkata "bingkai 1." 740 00:39:32,000 --> 00:39:36,000 >> Kini saya kembali utama, dan saya boleh mencetak x, dan saya boleh mencetak y, 741 00:39:36,000 --> 00:39:40,000 tetapi saya tidak boleh mencetak b atau. 742 00:39:40,000 --> 00:39:43,000 Tetapi saya boleh jika saya katakan, "Baiklah, tunggu satu minit. Mana swap?" 743 00:39:43,000 --> 00:39:46,000 Biar saya pergi ke hadapan dan berkata "0 frame." 744 00:39:46,000 --> 00:39:48,000 Kini saya kembali di mana saya mahu menjadi, dan sebagai mengetepikan, 745 00:39:48,000 --> 00:39:52,000 ada arahan lain juga, seperti jika anda benar-benar mendapat bosan menaip seterusnya, seterusnya, seterusnya, seterusnya, 746 00:39:52,000 --> 00:39:56,000 anda secara amnya boleh mengatakan sesuatu seperti "10 tahun akan datang," dan yang akan melangkah melalui 10 baris berikutnya. 747 00:39:56,000 --> 00:39:59,000 Anda juga boleh menulis "continue" apabila anda benar-benar mendapat bosan dengan melangkah melaluinya. 748 00:39:59,000 --> 00:40:05,000 Teruskan akan menjalankan program anda tanpa gangguan sehingga ia mencecah lain titik putus, 749 00:40:05,000 --> 00:40:07,000 sama ada dalam gelung atau menurunkan dalam program anda. 750 00:40:07,000 --> 00:40:11,000 >> Dalam kes ini kita terus ke akhir, dan program keluar biasanya. 751 00:40:11,000 --> 00:40:13,000 Ini adalah cara yang mewah, proses yang lebih rendah. 752 00:40:13,000 --> 00:40:16,000 Hanya program anda keluar seperti biasa. 753 00:40:16,000 --> 00:40:24,000 Lebih pada itu dalam video dan debugging sesi akan datang. 754 00:40:24,000 --> 00:40:26,000 Itu adalah banyak. 755 00:40:26,000 --> 00:40:35,000 Mari kita rehat 5-minit kami di sini, dan kita akan kembali dengan structs dan fail. 756 00:40:35,000 --> 00:40:38,000 >> Jika anda telah menyelam ke pset minggu ini sudah 757 00:40:38,000 --> 00:40:41,000 anda akan tahu yang kita gunakan dalam kod pengagihan, 758 00:40:41,000 --> 00:40:45,000 sumber kod yang kami sediakan untuk anda sebagai titik permulaan, beberapa teknik-teknik baru. 759 00:40:45,000 --> 00:40:50,000 Secara khususnya, kami memperkenalkan kata kunci ini baru yang dipanggil struct, struktur, 760 00:40:50,000 --> 00:40:53,000 supaya kita boleh mewujudkan pembolehubah khas kejayaannya. 761 00:40:53,000 --> 00:40:57,000 Kami juga memperkenalkan tanggapan fail I / O, fail input dan output, 762 00:40:57,000 --> 00:41:00,000 dan ini adalah supaya kita dapat menyelamatkan negeri 763 00:41:00,000 --> 00:41:03,000 lembaga Kacau anda untuk fail pada cakera 764 00:41:03,000 --> 00:41:06,000 supaya felo pengajaran dan saya boleh memahami 765 00:41:06,000 --> 00:41:09,000 apa yang berlaku di dalam program anda tanpa perlu secara manual bermain 766 00:41:09,000 --> 00:41:11,000 berpuluh-puluh permainan Kacau. 767 00:41:11,000 --> 00:41:13,000 Kita boleh melakukan ini lebih automatedly. 768 00:41:13,000 --> 00:41:18,000 >> Ini idea struct satu menyelesaikan masalah yang agak menarik. 769 00:41:18,000 --> 00:41:21,000 Katalah kita mahu untuk melaksanakan beberapa program 770 00:41:21,000 --> 00:41:25,000 yang entah bagaimana menjejaki maklumat mengenai pelajar, 771 00:41:25,000 --> 00:41:28,000 dan pelajar mungkin mempunyai, misalnya, ID, nama 772 00:41:28,000 --> 00:41:31,000 dan sebuah rumah di tempat seperti Harvard, jadi ini adalah 3 keping maklumat 773 00:41:31,000 --> 00:41:34,000 kita mahu untuk menjaga sekitar, jadi biarlah saya pergi ke hadapan dan mula menulis program kecil di sini, 774 00:41:34,000 --> 00:41:38,000 termasuk stdio.h. 775 00:41:38,000 --> 00:41:42,000 Biar saya lakukan termasuk cs50.h. 776 00:41:42,000 --> 00:41:44,000 Dan kemudian mula Fungsi utama saya. 777 00:41:44,000 --> 00:41:46,000 Saya tidak akan mengganggu dengan apa-apa hujah baris arahan, 778 00:41:46,000 --> 00:41:49,000 dan di sini saya mahu mempunyai pelajar, jadi saya akan katakan 779 00:41:49,000 --> 00:41:54,000 pelajar mempunyai nama, jadi saya akan mengatakan "nama rentetan." 780 00:41:54,000 --> 00:41:59,000 Kemudian saya akan mengatakan pelajar juga mempunyai ID, id jadi int, 781 00:41:59,000 --> 00:42:03,000 dan pelajar mempunyai rumah, jadi saya juga akan berkata "rumah rentetan." 782 00:42:03,000 --> 00:42:06,000 Kemudian saya akan memerintahkan ini sedikit lebih rapi seperti ini. 783 00:42:06,000 --> 00:42:11,000 Okay, sekarang saya mempunyai 3 pembolehubah yang mewakili pelajar, jadi "pelajar." 784 00:42:11,000 --> 00:42:15,000 >> Dan sekarang saya mahu untuk mengisi nilai-nilai ini, jadi biarlah saya pergi ke hadapan dan mengatakan sesuatu seperti 785 00:42:15,000 --> 00:42:18,000 "Id = 123." 786 00:42:18,000 --> 00:42:21,000 Nama akan untuk mendapatkan David. 787 00:42:21,000 --> 00:42:24,000 Katakan rumah akan mendapatkan Mather, 788 00:42:24,000 --> 00:42:31,000 dan kemudian saya akan melakukan sesuatu sewenang-wenangnya seperti printf ("% s, 789 00:42:31,000 --> 00:42:37,000 yang ID adalah% d, tinggal di% s. 790 00:42:37,000 --> 00:42:41,000 Dan kini, apa yang saya mahu untuk palam di sini, salah satu selepas yang lain? 791 00:42:41,000 --> 00:42:47,000 Nama, id, rumah; pulangan 0. 792 00:42:47,000 --> 00:42:50,000 Okay, kecuali saya diskrukan sehingga tempat di sini 793 00:42:50,000 --> 00:42:54,000 Saya fikir kita mempunyai satu program yang cukup baik yang menyimpan seorang pelajar. 794 00:42:54,000 --> 00:42:57,000 Sudah tentu, ini tidak semua yang menarik. Bagaimana jika saya ingin mempunyai 2 pelajar? 795 00:42:57,000 --> 00:42:59,000 Itulah ada masalah besar. Saya boleh menyokong 2 orang. 796 00:42:59,000 --> 00:43:03,000 Biar saya pergi ke hadapan dan menonjolkan ini dan pergi ke sini, 797 00:43:03,000 --> 00:43:09,000 dan saya boleh mengatakan "id = 456" untuk seseorang seperti Rob yang tinggal di Kirkland. 798 00:43:09,000 --> 00:43:12,000 >> Okay, tunggu, tetapi saya tidak boleh memanggil-perkara yang sama, 799 00:43:12,000 --> 00:43:15,000 dan ia kelihatan seperti saya akan perlu untuk menyalin ini, 800 00:43:15,000 --> 00:43:19,000 jadi biarlah saya katakan bahawa ini akan menjadi pembolehubah Daud, 801 00:43:19,000 --> 00:43:23,000 dan biarlah saya mendapatkan beberapa salinan ini untuk Rob. 802 00:43:23,000 --> 00:43:27,000 Kami akan memanggil ini Rob tetapi ini tidak akan bekerja sekarang 803 00:43:27,000 --> 00:43:33,000 kerana saya telah-tunggu, mari kita mengubah saya kepada ID1, NAME1 dan house1. 804 00:43:33,000 --> 00:43:35,000 Rob akan menjadi 2, 2. 805 00:43:35,000 --> 00:43:42,000 Saya telah mendapat untuk menukar ini di sini, sini, sini, sini, sini, sini. 806 00:43:42,000 --> 00:43:45,000 Tunggu, apa mengenai Tommy? Mari kita buat ini lagi. 807 00:43:45,000 --> 00:43:49,000 Jelas sekali jika anda masih berfikir ini adalah cara yang baik untuk berbuat demikian, ia bukan, 808 00:43:49,000 --> 00:43:52,000 jadi copy / paste buruk. 809 00:43:52,000 --> 00:43:55,000 Tetapi kita menyelesaikan ini seminggu yang lalu. 810 00:43:55,000 --> 00:43:59,000 >> Apakah penyelesaian kami apabila kita mahu mempunyai contoh-contoh pelbagai jenis data yang sama? 811 00:43:59,000 --> 00:44:01,000 [Pelajar] Satu pelbagai. 812 00:44:01,000 --> 00:44:03,000 Pelbagai, jadi biarlah saya cuba untuk membersihkan ini. 813 00:44:03,000 --> 00:44:07,000 Izinkan saya membuat beberapa bilik untuk diri sendiri di atas, dan biarlah saya bukannya melakukan ini di sini. 814 00:44:07,000 --> 00:44:12,000 Kami akan memanggil orang-orang ini, dan sebaliknya saya akan mengatakan "id int," 815 00:44:12,000 --> 00:44:14,000 dan saya akan untuk menyokong 3 kita sekarang. 816 00:44:14,000 --> 00:44:18,000 Saya akan untuk mengatakan "nama-nama rentetan," dan saya akan menyokong 3 daripada kita, 817 00:44:18,000 --> 00:44:22,000 dan kemudian saya akan untuk mengatakan "rumah rentetan," dan saya akan menyokong 3 kita. 818 00:44:22,000 --> 00:44:26,000 Sekarang di sini bukannya Daud mendapat pembolehubah tempatan sendiri 819 00:44:26,000 --> 00:44:28,000 kita boleh menyingkirkan mereka. 820 00:44:28,000 --> 00:44:30,000 Itu berasa baik bahawa kita sedang membersihkan ini. 821 00:44:30,000 --> 00:44:35,000 Saya kemudian boleh mengatakan Daud akan menjadi [0] dan nama [0] 822 00:44:35,000 --> 00:44:38,000 dan rumah-rumah [0]. 823 00:44:38,000 --> 00:44:41,000 Dan kemudian Rob kami juga boleh menyimpan mengenai perkara ini. 824 00:44:41,000 --> 00:44:46,000 Mari kita meletakkan ini turun di sini, jadi dia akan sewenang-wenangnya menjadi id [1]. 825 00:44:46,000 --> 00:44:50,000 Dia akan menjadi nama [1], 826 00:44:50,000 --> 00:44:53,000 dan kemudian akhir sekali, rumah [1]. 827 00:44:53,000 --> 00:44:57,000 >> Masih membosankan sedikit, dan kini saya mempunyai untuk memikirkan ini, 828 00:44:57,000 --> 00:45:03,000 jadi mari kita mengatakan "nama [0], id [0], rumah [0], 829 00:45:03,000 --> 00:45:06,000 dan mari kita menjamakkan ini. 830 00:45:06,000 --> 00:45:09,000 Id, id, id. 831 00:45:09,000 --> 00:45:12,000 Dan sekali lagi, saya melakukannya, begitu lagi, saya sudah melawat menyalin / menampal lagi, 832 00:45:12,000 --> 00:45:14,000 jadi kemungkinan ada penyelesaian lain di sini. 833 00:45:14,000 --> 00:45:18,000 Saya mungkin boleh membersihkan ini meningkat lagi dengan gelung atau sesuatu seperti itu, 834 00:45:18,000 --> 00:45:21,000 jadi dalam jangka pendek, ia adalah sedikit lebih baik tetapi masih berasa seperti 835 00:45:21,000 --> 00:45:24,000 Saya mengambil jalan untuk menyalin / menampal, tetapi walaupun ini, saya menuntut, 836 00:45:24,000 --> 00:45:27,000 tidak benar-benar pada dasarnya penyelesaian yang betul kerana 837 00:45:27,000 --> 00:45:29,000 bagaimana jika kadang-kadang kita membuat keputusan anda tahu apa? 838 00:45:29,000 --> 00:45:32,000 Kami benar-benar harus telah menyimpan alamat e-mel untuk Daud dan Rob 839 00:45:32,000 --> 00:45:34,000 dan orang lain dalam program ini. 840 00:45:34,000 --> 00:45:36,000 Kita juga perlu menyimpan nombor telefon. 841 00:45:36,000 --> 00:45:39,000 Kita juga perlu menyimpan nombor telefon kecemasan. 842 00:45:39,000 --> 00:45:41,000 Kami mempunyai semua ini keping data yang kami ingin menyimpan, 843 00:45:41,000 --> 00:45:43,000 jadi bagaimana anda pergi tentang berbuat demikian? 844 00:45:43,000 --> 00:45:46,000 >> Anda mengaku pelbagai lain di bahagian atas, dan kemudian anda secara manual menambah 845 00:45:46,000 --> 00:45:49,000 alamat e-mel [0], alamat e-mel [1] 846 00:45:49,000 --> 00:45:51,000 Daud dan Rob dan sebagainya. 847 00:45:51,000 --> 00:45:56,000 Tetapi ada benar-benar hanya satu andaian yang mendasari reka bentuk ini 848 00:45:56,000 --> 00:45:59,000 bahawa saya menggunakan sistem penghormatan untuk mengetahui bahawa 849 00:45:59,000 --> 00:46:03,000 [I] dalam setiap beberapa tatasusunan 850 00:46:03,000 --> 00:46:06,000 hanya kebetulan untuk merujuk kepada orang yang sama, 851 00:46:06,000 --> 00:46:10,000 jadi [0] id adalah nombor 123, 852 00:46:10,000 --> 00:46:13,000 dan saya akan menganggap bahawa nama [0] 853 00:46:13,000 --> 00:46:16,000 adalah orang yang sama nama dan rumah [0] 854 00:46:16,000 --> 00:46:21,000 adalah rumah orang yang sama dan sebagainya untuk semua pelbagai tatasusunan yang saya buat. 855 00:46:21,000 --> 00:46:24,000 Tetapi notis bahawa tidak ada hubungan asas 856 00:46:24,000 --> 00:46:27,000 kalangan mereka 3 keping maklumat, id, nama, dan rumah, 857 00:46:27,000 --> 00:46:32,000 walaupun entiti yang kita sedang cuba untuk model dalam program ini tidak tatasusunan. 858 00:46:32,000 --> 00:46:35,000 Tatasusunan adalah hanya cara ini perancangan untuk berbuat demikian. 859 00:46:35,000 --> 00:46:38,000 Apa yang kita benar-benar mahu untuk model dalam program kami adalah orang 860 00:46:38,000 --> 00:46:41,000 seperti Daud, orang seperti Rob dalam mana 861 00:46:41,000 --> 00:46:46,000 atau encapsulating adalah nama dan ID dan rumah. 862 00:46:46,000 --> 00:46:49,000 >> Bolehkah kita entah bagaimana meluahkan idea ini pengkapsulan 863 00:46:49,000 --> 00:46:52,000 di mana seseorang mempunyai ID, nama dan rumah 864 00:46:52,000 --> 00:46:55,000 dan tidak mengambil jalan untuk benar-benar hack ini di mana kita hanya 865 00:46:55,000 --> 00:46:58,000 mempercayai bahawa sesuatu kurungan 866 00:46:58,000 --> 00:47:02,000 merujuk kepada entiti yang sama manusia dalam setiap array berbeza? 867 00:47:02,000 --> 00:47:04,000 Kita sebenarnya boleh melakukan ini. 868 00:47:04,000 --> 00:47:08,000 Biar saya pergi utama di atas buat masa ini, dan izinkan saya membuat jenis data saya sendiri 869 00:47:08,000 --> 00:47:10,000 untuk benar-benar kali pertama. 870 00:47:10,000 --> 00:47:14,000 Kami menggunakan teknik ini dalam Kacau, 871 00:47:14,000 --> 00:47:17,000 tetapi di sini saya akan pergi ke hadapan dan mewujudkan satu jenis data, 872 00:47:17,000 --> 00:47:19,000 dan anda tahu apa, saya akan memanggilnya pelajar atau orang, 873 00:47:19,000 --> 00:47:23,000 dan saya akan menggunakan typedef untuk menentukan jenis. 874 00:47:23,000 --> 00:47:25,000 Saya akan mengatakan bahawa ini adalah struktur, 875 00:47:25,000 --> 00:47:29,000 dan kemudian struktur ini akan menjadi pelajar jenis, kita akan berkata, 876 00:47:29,000 --> 00:47:31,000 walaupun ia adalah sedikit bertarikh sekarang bagi saya. 877 00:47:31,000 --> 00:47:33,000 Kami akan mengatakan "int id." 878 00:47:33,000 --> 00:47:35,000 Kami akan mengatakan "nama tali." 879 00:47:35,000 --> 00:47:37,000 Maka kita akan mengatakan "rumah tali," 880 00:47:37,000 --> 00:47:40,000 jadi sekarang menjelang akhir tahun ini beberapa baris kod 881 00:47:40,000 --> 00:47:45,000 Saya baru sahaja diajar dilafaz bahawa wujud 882 00:47:45,000 --> 00:47:49,000 jenis data selain ints, selain rentetan, selain beregu, selain terapung. 883 00:47:49,000 --> 00:47:54,000 >> Sehingga saat ini dalam garis masa 11, kini terdapat satu jenis data baru yang dipanggil pelajar, 884 00:47:54,000 --> 00:47:58,000 dan sekarang saya boleh mengisytiharkan pembolehubah pelajar mana-mana sahaja yang saya mahu, 885 00:47:58,000 --> 00:48:01,000 jadi biarlah saya tatal ke bawah di sini untuk orang-orang. 886 00:48:01,000 --> 00:48:05,000 Sekarang saya boleh menghilangkan ini, dan saya boleh kembali turun kepada Daud di sini, 887 00:48:05,000 --> 00:48:10,000 dan bagi David, saya benar-benar boleh mengatakan bahawa Daud, 888 00:48:10,000 --> 00:48:13,000 kita benar-benar boleh menamakan pembolehubah selepas diri sendiri, 889 00:48:13,000 --> 00:48:16,000 akan menjadi pelajar jenis. 890 00:48:16,000 --> 00:48:18,000 Ini mungkin kelihatan sedikit pelik, tetapi ini tidak semua yang berbeza 891 00:48:18,000 --> 00:48:22,000 daripada mengisytiharkan sesuatu sebagai int atau tali atau apungan. 892 00:48:22,000 --> 00:48:24,000 Ia hanya kebetulan dipanggil pelajar kini, 893 00:48:24,000 --> 00:48:28,000 dan jika saya mahu meletakkan sesuatu di dalam struktur ini 894 00:48:28,000 --> 00:48:31,000 Saya kini perlu menggunakan sekeping baru sintaks, tetapi ia agak mudah, 895 00:48:31,000 --> 00:48:39,000 david.id = 123, david.name = "Daud" dalam modal D, 896 00:48:39,000 --> 00:48:42,000 dan david.house = "Mather," 897 00:48:42,000 --> 00:48:46,000 dan sekarang saya boleh menghilangkan barangan ini di sini. 898 00:48:46,000 --> 00:48:51,000 Notis sekarang kami telah direka semula program kami benar-benar cara yang lebih baik 899 00:48:51,000 --> 00:48:54,000 bahawa sekarang program kami mencerminkan dunia sebenar. 900 00:48:54,000 --> 00:48:57,000 >> Ada tanggapan dunia sebenar seseorang atau pelajar. 901 00:48:57,000 --> 00:49:02,000 Di sini kita mempunyai kini versi C seseorang atau lebih khusus pelajar. 902 00:49:02,000 --> 00:49:05,000 Dalam orang itu adalah ciri-ciri yang berkaitan, 903 00:49:05,000 --> 00:49:10,000 ID, nama dan rumah, jadi Rob dasarnya menjadi perkara yang sama di bawah sini, 904 00:49:10,000 --> 00:49:14,000 jadi pelajar merompak, dan kini rob.id = 456, 905 00:49:14,000 --> 00:49:17,000 rob.name = "Rob." 906 00:49:17,000 --> 00:49:20,000 Hakikat bahawa pembolehubah dipanggil Rob adalah jenis bermakna. 907 00:49:20,000 --> 00:49:22,000 Kami telah dipanggil ia x atau y atau z. 908 00:49:22,000 --> 00:49:25,000 Kami hanya dinamakan Rob menjadi semantik konsisten, 909 00:49:25,000 --> 00:49:28,000 tetapi benar-benar nama adalah di dalam bidang itu sendiri, 910 00:49:28,000 --> 00:49:30,000 jadi sekarang saya ini. 911 00:49:30,000 --> 00:49:33,000 Ini juga tidak berasa seperti reka bentuk yang terbaik bahawa saya telah keras berkod Daud. 912 00:49:33,000 --> 00:49:35,000 Saya telah keras berkod Rob. 913 00:49:35,000 --> 00:49:39,000 Dan saya masih mempunyai untuk menggunakan beberapa salinan dan tampal setiap kali saya mahu pembolehubah baru. 914 00:49:39,000 --> 00:49:43,000 Selain itu, saya mempunyai nampaknya memberi setiap pembolehubah ini nama, 915 00:49:43,000 --> 00:49:46,000 walaupun saya lebih lebih suka menggambarkan pembolehubah ini 916 00:49:46,000 --> 00:49:48,000  lebih generik sebagai pelajar. 917 00:49:48,000 --> 00:49:52,000 >> Sekarang kita boleh menggabungkan idea-idea yang telah bekerja dengan baik bagi kami 918 00:49:52,000 --> 00:49:56,000 dan sebaliknya berkata, "Kamu tahu apa, memberi saya pelajar berubah-ubah dipanggil, 919 00:49:56,000 --> 00:50:01,000 dan mari kita ia telah menjadi daripada 3 saiz, "jadi sekarang saya boleh memperbaiki ini dengan lebih lanjut, 920 00:50:01,000 --> 00:50:04,000 menyingkirkan Daud manual diisytiharkan, 921 00:50:04,000 --> 00:50:08,000 dan saya sebaliknya boleh mengatakan sesuatu seperti pelajar [0] di sini. 922 00:50:08,000 --> 00:50:11,000 Saya kemudian boleh mengatakan pelajar [0] di sini, 923 00:50:11,000 --> 00:50:14,000 pelajar [0] di sini, dan sebagainya, dan saya boleh pergi di sekitar 924 00:50:14,000 --> 00:50:16,000 dan membersihkan bahawa untuk Rob. 925 00:50:16,000 --> 00:50:19,000 Saya juga boleh pergi tentang mungkin menambah gelung 926 00:50:19,000 --> 00:50:23,000 dan menggunakan GetString dan GetInt untuk benar-benar mendapatkan nilai-nilai dari pengguna. 927 00:50:23,000 --> 00:50:27,000 Saya boleh pergi tentang menambah berterusan kerana ini adalah umumnya amalan yang buruk 928 00:50:27,000 --> 00:50:29,000 kod keras beberapa nombor sewenang-wenangnya seperti 3 di sini 929 00:50:29,000 --> 00:50:33,000 dan kemudian hanya ingat bahawa anda perlu meletakkan tidak lebih daripada 3 pelajar di dalamnya. 930 00:50:33,000 --> 00:50:36,000 Ia mungkin akan menjadi lebih baik untuk menggunakan # define di atas fail saya 931 00:50:36,000 --> 00:50:40,000 dan faktor yang keluar, jadi sememangnya, izinkan saya pergi ke hadapan dan umum ini. 932 00:50:40,000 --> 00:50:43,000 >> Izinkan saya membuka satu contoh itulah antara hari ini 933 00:50:43,000 --> 00:50:46,000 contoh terlebih dahulu, structs1. 934 00:50:46,000 --> 00:50:49,000 Ini adalah satu program yang lebih lengkap yang menggunakan # define di sini 935 00:50:49,000 --> 00:50:51,000 dan mengatakan bahawa kita akan mempunyai 3 orang pelajar secara lalai. 936 00:50:51,000 --> 00:50:54,000 Di sini saya mengisytiharkan bernilai kelas pelajar, 937 00:50:54,000 --> 00:50:57,000 jadi kelas pelajar, dan sekarang saya menggunakan gelung 938 00:50:57,000 --> 00:51:00,000 hanya untuk membuat kod sedikit lebih anggun, mengisi kelas 939 00:51:00,000 --> 00:51:05,000 dengan input pengguna, jadi melelar dari i = 0 sehingga kepada pelajar, iaitu 3. 940 00:51:05,000 --> 00:51:07,000 Dan kemudian saya segera turun dalam versi ini 941 00:51:07,000 --> 00:51:10,000  apa ID pelajar, dan saya mendapatkannya dengan GetInt. 942 00:51:10,000 --> 00:51:13,000 Apa nama pelajar, dan kemudian saya mendapatkannya dengan GetString. 943 00:51:13,000 --> 00:51:15,000 Apakah rumah pelajar? Saya mendapat ia dengan GetString. 944 00:51:15,000 --> 00:51:19,000 Dan kemudian di bawah sini saya hanya memutuskan untuk menukar 945 00:51:19,000 --> 00:51:22,000 bagaimana saya mencetak ini keluar dan untuk benar-benar menggunakan gelung, 946 00:51:22,000 --> 00:51:24,000 dan yang saya percetakan? 947 00:51:24,000 --> 00:51:27,000 Menurut komen saya mencetak sesiapa di Mather, 948 00:51:27,000 --> 00:51:30,000 dan itulah ia jadi Rob dan Tommy dan sebagainya sebenarnya Tommy dalam Mather. 949 00:51:30,000 --> 00:51:34,000 Tommy dan David akan dicetak dalam kes ini, tetapi bagaimana ini bekerja? 950 00:51:34,000 --> 00:51:40,000 Kami tidak melihat fungsi ini sebelum ini, tetapi mengambil meneka apakah ini tidak. 951 00:51:40,000 --> 00:51:42,000 Membandingkan tali. 952 00:51:42,000 --> 00:51:45,000 >> Ia sedikit tidak jelas bagaimana ia membandingkan tali kerana ia ternyata 953 00:51:45,000 --> 00:51:49,000 jika ia mengembalikan 0 yang bermaksud tali adalah sama. 954 00:51:49,000 --> 00:51:53,000 Jika ia kembali -1 yang bermakna satu datang abjad sebelum yang lain, 955 00:51:53,000 --> 00:51:57,000 dan jika ia kembali +1 yang bermakna perkataan lain datang abjad 956 00:51:57,000 --> 00:52:00,000 sebelum yang lain, dan anda boleh melihat dalam talian atau di halaman lelaki 957 00:52:00,000 --> 00:52:04,000 untuk melihat tepat yang cara yang, tetapi semua ini kini melakukan ia berkata 958 00:52:04,000 --> 00:52:09,000 jika [i]. rumah adalah sama dengan "Mather" 959 00:52:09,000 --> 00:52:13,000 kemudian pergi ke hadapan dan mencetak begitu dan begitu juga dalam Mather. 960 00:52:13,000 --> 00:52:16,000 Tetapi di sini adalah sesuatu yang kita tidak pernah melihat sebelum ini, dan kita akan kembali kepada ini. 961 00:52:16,000 --> 00:52:21,000 Saya tidak ingat pernah mempunyai untuk melakukan ini dalam mana-mana program saya. 962 00:52:21,000 --> 00:52:24,000 Percuma nampaknya merujuk kepada ingatan, membebaskan memori, 963 00:52:24,000 --> 00:52:31,000 tetapi apa memori saya nampaknya membebaskan dalam gelung ini di bawah program ini? 964 00:52:31,000 --> 00:52:34,000 Ia kelihatan seperti saya membebaskan nama seseorang 965 00:52:34,000 --> 00:52:37,000 dan rumah seseorang, tetapi mengapa? 966 00:52:37,000 --> 00:52:41,000 >> Ia ternyata semua ini minggu yang anda telah menggunakan GetString 967 00:52:41,000 --> 00:52:45,000 kita telah jenis telah memperkenalkan bug ke dalam setiap satu daripada program anda. 968 00:52:45,000 --> 00:52:51,000 GetString oleh reka bentuk memperuntukkan memori supaya ia boleh kembali kepada anda tali, 969 00:52:51,000 --> 00:52:55,000 seperti David, atau Rob, dan anda kemudian boleh melakukan apa sahaja yang anda mahu 970 00:52:55,000 --> 00:52:59,000 dengan tali itu dalam program anda kerana kita telah merizab memori untuk anda. 971 00:52:59,000 --> 00:53:02,000 Masalahnya ialah semua masa ini setiap kali anda memanggil GetString 972 00:53:02,000 --> 00:53:05,000 kita, pengarang GetString, telah meminta sistem operasi 973 00:53:05,000 --> 00:53:07,000 untuk memberi kita sedikit RAM rentetan ini. 974 00:53:07,000 --> 00:53:09,000 Beri kami sedikit RAM rentetan ini akan datang. 975 00:53:09,000 --> 00:53:11,000 Beri kami RAM lebih untuk string ini seterusnya. 976 00:53:11,000 --> 00:53:13,000 Apa yang anda, pengaturcara, tidak pernah telah melakukan 977 00:53:13,000 --> 00:53:15,000 memberi kita yang kembali memori, 978 00:53:15,000 --> 00:53:17,000 jadi untuk beberapa minggu ini semua program yang anda telah ditulis 979 00:53:17,000 --> 00:53:20,000 mempunyai apa yang dipanggil lonjakan memori di mana mereka terus menggunakan 980 00:53:20,000 --> 00:53:24,000 memori lebih dan lebih setiap kali anda memanggil GetString, dan itulah denda. 981 00:53:24,000 --> 00:53:27,000 Kami sengaja berbuat demikian dalam beberapa minggu pertama kerana ia bukan yang menarik 982 00:53:27,000 --> 00:53:29,000 perlu bimbang tentang di mana rentetan itu datang dari. 983 00:53:29,000 --> 00:53:34,000 Apa yang anda mahu adalah perkataan Rob kembali apabila jenis pengguna ia masuk 984 00:53:34,000 --> 00:53:38,000 >> Tetapi bergerak ke hadapan kita kini mempunyai untuk memulakan semakin canggih tentang perkara ini. 985 00:53:38,000 --> 00:53:42,000 Mana-mana masa yang kita memperuntukkan memori kita lebih baik akhirnya menyerahkannya kembali. 986 00:53:42,000 --> 00:53:45,000 Jika tidak di dunia sebenar pada Mac atau PC anda, anda mungkin mempunyai kadang-kadang berpengalaman 987 00:53:45,000 --> 00:53:50,000 gejala di mana komputer anda pengisaran terhenti akhirnya 988 00:53:50,000 --> 00:53:54,000 atau bola pantai berputar bodoh hanya menduduki komputer 989 00:53:54,000 --> 00:53:56,000 perhatian keseluruhan dan anda tidak boleh melakukan perkara-perkara. 990 00:53:56,000 --> 00:54:00,000 Yang boleh dijelaskan oleh apa-apa bilangan pepijat, tetapi di kalangan mereka pepijat yang mungkin 991 00:54:00,000 --> 00:54:03,000 perkara-perkara yang dipanggil kebocoran memori di mana seseorang yang menulis bahawa sekeping perisian 992 00:54:03,000 --> 00:54:07,000 anda menggunakan tidak ingat kepada memori percuma 993 00:54:07,000 --> 00:54:10,000 bahawa dia bertanya kepada sistem operasi untuk, 994 00:54:10,000 --> 00:54:14,000 tidak menggunakan GetString, kerana itulah satu perkara yang CS50, tetapi menggunakan fungsi yang serupa 995 00:54:14,000 --> 00:54:16,000 yang meminta sistem operasi untuk ingatan. 996 00:54:16,000 --> 00:54:19,000 Jika anda atau mereka skru sehingga dan tidak pernah benar-benar kembali memori yang 997 00:54:19,000 --> 00:54:24,000 gejala yang boleh menjadi bahawa program melambatkan dan melambatkan dan melambatkan 998 00:54:24,000 --> 00:54:26,000 melainkan jika anda ingat untuk memanggil percuma. 999 00:54:26,000 --> 00:54:28,000 >> Kita akan kembali kepada bila dan mengapa anda akan memanggil bebas, 1000 00:54:28,000 --> 00:54:32,000 tetapi mari kita pergi ke hadapan hanya untuk mengukur baik dan cuba menjalankan program ini tertentu. 1001 00:54:32,000 --> 00:54:35,000 Ini dipanggil structs1, masukkan. 1002 00:54:35,000 --> 00:54:40,000 Biar saya pergi ke hadapan dan menjalankan structs1, 123, David Mather, 1003 00:54:40,000 --> 00:54:47,000 456, Rob Kirkland, 789, 1004 00:54:47,000 --> 00:54:50,000 Tommy Mather, dan kita lihat Daud dalam Mather, Tommy dalam Mather. 1005 00:54:50,000 --> 00:54:53,000 Ini adalah hanya cek kewarasan sedikit bahawa program ini bekerja. 1006 00:54:53,000 --> 00:54:56,000 Sekarang, malangnya, program ini adalah sedikit mengecewakan dalam 1007 00:54:56,000 --> 00:55:00,000 Saya tidak semua kerja itu, saya menaip dalam 9 rentetan yang berbeza, tekan enter, 1008 00:55:00,000 --> 00:55:04,000 memberitahu yang berada dalam Mather, namun jelas saya tahu yang di Mather sudah kerana saya taip. 1009 00:55:04,000 --> 00:55:07,000 Ia akan menjadi sekurang-kurangnya baik jika program ini adalah lebih seperti pangkalan data 1010 00:55:07,000 --> 00:55:10,000 dan ia sebenarnya ingat apa yang saya telah ditaip dalam 1011 00:55:10,000 --> 00:55:12,000 jadi saya tidak lagi mempunyai untuk input rekod-rekod pelajar. 1012 00:55:12,000 --> 00:55:15,000 Mungkin ia adalah seperti sistem registrarial. 1013 00:55:15,000 --> 00:55:21,000 >> Kita boleh melakukan ini menggunakan teknik ini yang dikenali sebagai fail I / O, fail input dan output, 1014 00:55:21,000 --> 00:55:24,000 cara yang sangat generik mengatakan bila-bila masa anda mahu membaca fail atau menulis fail 1015 00:55:24,000 --> 00:55:26,000 anda boleh melakukan ini dengan satu set fungsi tertentu. 1016 00:55:26,000 --> 00:55:29,000 Biar saya pergi ke hadapan dan membuka structs2.c contoh ini, 1017 00:55:29,000 --> 00:55:33,000 yang hampir sama, tetapi mari kita lihat apa sekarang tidak. 1018 00:55:33,000 --> 00:55:36,000 Pada bahagian atas fail Saya mengaku kelas pelajar. 1019 00:55:36,000 --> 00:55:38,000 Saya kemudian mengisi kelas dengan input pengguna, 1020 00:55:38,000 --> 00:55:41,000 jadi mereka baris kod sama seperti sebelum ini. 1021 00:55:41,000 --> 00:55:45,000 Kemudian jika saya tatal ke bawah di sini saya mencetak semua orang yang berada dalam Mather sewenang-wenangnya seperti sebelum ini, 1022 00:55:45,000 --> 00:55:47,000 tetapi ini adalah satu ciri baru yang menarik. 1023 00:55:47,000 --> 00:55:51,000 Ini baris kod adalah baru, dan mereka memperkenalkan sesuatu di sini, 1024 00:55:51,000 --> 00:55:55,000 FILE, semua topi, dan ia mempunyai * di sini juga. 1025 00:55:55,000 --> 00:55:58,000 Biar saya bergerak ini di sini, * di sini juga. 1026 00:55:58,000 --> 00:56:00,000 >> Fungsi ini kita tidak pernah melihat sebelum ini, fopen, 1027 00:56:00,000 --> 00:56:03,000 tetapi ia bermakna fail terbuka, jadi mari kita agunan melalui ini, 1028 00:56:03,000 --> 00:56:05,000 dan ini adalah sesuatu yang kita akan kembali dalam psets masa depan, 1029 00:56:05,000 --> 00:56:10,000 tetapi ini selaras di sini dasarnya membuka fail yang dipanggil pangkalan data, 1030 00:56:10,000 --> 00:56:13,000 dan ia secara khusus dibuka dalam apa-apa cara yang ia boleh melakukan apa yang ia? 1031 00:56:13,000 --> 00:56:15,000 [Didengar-pelajar] 1032 00:56:15,000 --> 00:56:19,000 Betul, jadi "w" hanya bermakna ia memberitahu sistem operasi 1033 00:56:19,000 --> 00:56:21,000 membuka fail ini dalam apa-apa cara yang saya boleh menulis ia. 1034 00:56:21,000 --> 00:56:23,000 Saya tidak mahu membacanya. Saya tidak mahu hanya melihat ia. 1035 00:56:23,000 --> 00:56:26,000 Saya ingin menukar dan menambah barangan berpotensi untuk ia, 1036 00:56:26,000 --> 00:56:28,000 dan fail akan dipanggil pangkalan data. 1037 00:56:28,000 --> 00:56:30,000 Ini boleh dipanggil apa-apa. 1038 00:56:30,000 --> 00:56:32,000 Ini mungkin database.txt. Ini boleh menjadi db. 1039 00:56:32,000 --> 00:56:37,000 Ini boleh menjadi satu perkataan seperti foo, tetapi saya sewenang-wenangnya memilih untuk menamakan pangkalan data fail. 1040 00:56:37,000 --> 00:56:42,000 Ini adalah cek kewarasan sedikit bahawa kita akan kembali secara terperinci dari masa ke masa, 1041 00:56:42,000 --> 00:56:47,000 jika fp, untuk penunjuk file, tidak NULL sama yang bermakna semuanya berjalan dengan lancar. 1042 00:56:47,000 --> 00:56:51,000 >> Cerita pendek panjang, fungsi seperti fopen kadang-kadang gagal. 1043 00:56:51,000 --> 00:56:53,000 Mungkin fail tidak wujud. Mungkin anda keluar dari ruang cakera. 1044 00:56:53,000 --> 00:56:55,000 Mungkin anda tidak mempunyai kebenaran ke folder itu, 1045 00:56:55,000 --> 00:56:58,000 jadi jika fopen mengembalikan sesuatu batal buruk berlaku. 1046 00:56:58,000 --> 00:57:02,000 Sebaliknya, jika fopen tidak kembali batal semua adalah baik 1047 00:57:02,000 --> 00:57:04,000 dan saya boleh mula menulis ke fail ini. 1048 00:57:04,000 --> 00:57:06,000 Berikut adalah helah baru. 1049 00:57:06,000 --> 00:57:08,000 Ini adalah gelung untuk itu iterating setiap pelajar saya, 1050 00:57:08,000 --> 00:57:10,000 dan ini kelihatan begitu serupa dengan apa yang kita telah dilakukan sebelum, 1051 00:57:10,000 --> 00:57:15,000 tetapi fungsi ini adalah sepupu printf dipanggil fprintf fail printf, 1052 00:57:15,000 --> 00:57:18,000 dan notis ia berbeza hanya dalam 2 cara. 1053 00:57:18,000 --> 00:57:20,000 Satu, ia bermula dengan f bukannya p, 1054 00:57:20,000 --> 00:57:23,000 tetapi kemudian hujah pertama nampaknya apa? 1055 00:57:23,000 --> 00:57:25,000 [Pelajar] File. >> Ia adalah fail. 1056 00:57:25,000 --> 00:57:30,000 Ini perkara yang dipanggil fp, yang akhirnya kita akan mengusik selain apa penunjuk fail, 1057 00:57:30,000 --> 00:57:35,000 tetapi untuk sekarang fp hanya mewakili fail yang saya telah dibuka, 1058 00:57:35,000 --> 00:57:41,000 supaya fprintf sini mengatakan mencetak ID pengguna ini ke fail, bukan ke skrin. 1059 00:57:41,000 --> 00:57:44,000 Cetak nama pengguna ke fail, bukan untuk skrin, 1060 00:57:44,000 --> 00:57:47,000 rumah ke fail, bukan ke skrin, dan kemudian turun di sini, jelas, 1061 00:57:47,000 --> 00:57:50,000 menutup fail, dan kemudian turun di sini percuma memori. 1062 00:57:50,000 --> 00:57:53,000 >> Satu-satunya perbezaan antara ini versi 2 dan versi 1 1063 00:57:53,000 --> 00:57:58,000 adalah pengenalan fopen dan FILE ini dengan * 1064 00:57:58,000 --> 00:58:01,000 dan ini tanggapan fprintf, jadi mari kita lihat apa hasil akhir. 1065 00:58:01,000 --> 00:58:03,000 Biar saya pergi ke tetingkap terminal saya. 1066 00:58:03,000 --> 00:58:06,000 Izinkan saya menjalankan structs2, masukkan. 1067 00:58:06,000 --> 00:58:09,000 Kelihatan seperti semua adalah baik. Mari kita jalankan lagi structs2. 1068 00:58:09,000 --> 00:58:15,000 123, David Mather, 456, Rob Kirkland, 1069 00:58:15,000 --> 00:58:19,000 789, Tommy Mather, masukkan. 1070 00:58:19,000 --> 00:58:23,000 Kelihatan seperti ia berkelakuan yang sama, tetapi jika saya kini melakukan ls 1071 00:58:23,000 --> 00:58:28,000 notis apa fail di sini di kalangan semua kod saya, pangkalan data, 1072 00:58:28,000 --> 00:58:32,000 jadi mari kita membuka, gedit pangkalan data, dan melihat itu. 1073 00:58:32,000 --> 00:58:34,000 Ia bukan seksi format fail. 1074 00:58:34,000 --> 00:58:38,000 Ia benar-benar adalah satu sekeping garis data per baris per baris, 1075 00:58:38,000 --> 00:58:42,000 tetapi mereka yang menggunakan fail Excel atau CSV, Comma Separated Values, 1076 00:58:42,000 --> 00:58:47,000 Saya pasti boleh digunakan fprintf sebaliknya mungkin melakukan sesuatu seperti ini 1077 00:58:47,000 --> 00:58:50,000 supaya saya sebenarnya boleh mewujudkan bersamaan fail Excel 1078 00:58:50,000 --> 00:58:53,000 dengan memisahkan perkara dengan koma, bukan sahaja barisan baru. 1079 00:58:53,000 --> 00:58:56,000 >> Dalam kes ini, jika saya telah sebaliknya digunakan koma bukannya barisan baru 1080 00:58:56,000 --> 00:59:01,000 Saya benar-benar boleh membuka fail pangkalan data dalam Excel jika saya bukannya membuat ia kelihatan seperti ini. 1081 00:59:01,000 --> 00:59:03,000 Secara ringkas, sekarang bahawa kita mempunyai kuasa untuk menulis kepada fail 1082 00:59:03,000 --> 00:59:07,000 kita kini boleh memulakan data yang berterusan, menjaga ia wujud pada cakera 1083 00:59:07,000 --> 00:59:10,000 supaya kita boleh menyimpan maklumat di sekeliling lagi dan lagi. 1084 00:59:10,000 --> 00:59:14,000 Notis beberapa perkara lain yang kini sedikit lebih akrab. 1085 00:59:14,000 --> 00:59:16,000 Pada bahagian atas fail C ini kita mempunyai typedef 1086 00:59:16,000 --> 00:59:21,000 kerana kita mahu mencipta sejenis data yang mewakili perkataan, 1087 00:59:21,000 --> 00:59:25,000 jadi jenis ini dipanggil perkataan, dan dalam struktur ini 1088 00:59:25,000 --> 00:59:27,000 ia sedikit penjaga sekarang. 1089 00:59:27,000 --> 00:59:30,000 Mengapa perkataan terdiri nampaknya pelbagai? 1090 00:59:30,000 --> 00:59:33,000 Apakah perkataan hanya intuitif? 1091 00:59:33,000 --> 00:59:35,000 >> Ia adalah pelbagai watak. 1092 00:59:35,000 --> 00:59:37,000 Ia jujukan aksara kembali ke belakang ke belakang. 1093 00:59:37,000 --> 00:59:41,000 HURUF dalam semua topi yang berlaku untuk kita sewenang-wenangnya mengatakan panjang maksimum 1094 00:59:41,000 --> 00:59:44,000 mana-mana perkataan di dalam kamus yang kita sedang menggunakan untuk Kacau. 1095 00:59:44,000 --> 00:59:46,000 Mengapa saya mempunyai 1? 1096 00:59:46,000 --> 00:59:48,000 Watak batal. 1097 00:59:48,000 --> 00:59:51,000 Ingat apabila kita lakukan contoh Bananagrams kita memerlukan nilai istimewa 1098 00:59:51,000 --> 00:59:55,000 di akhir perkataan untuk menjejaki 1099 00:59:55,000 --> 00:59:59,000 di mana perkataan yang sebenarnya berakhir, dan sebagai spesifikasi set masalah mengatakan 1100 00:59:59,000 --> 01:00:03,000 di sini kita mengaitkan dengan perkataan yang diberikan nilai boolean, 1101 01:00:03,000 --> 01:00:05,000 bendera, jadi untuk bercakap, benar atau palsu. 1102 01:00:05,000 --> 01:00:09,000 Pernahkah anda menemui perkataan ini pun, kerana kita menyedari 1103 01:00:09,000 --> 01:00:13,000 kita benar-benar memerlukan cara mengingat bukan sahaja apa perkataan dalam Kacau 1104 01:00:13,000 --> 01:00:15,000 tetapi sama ada atau tidak anda, manusia, telah mendapati ia 1105 01:00:15,000 --> 01:00:20,000 supaya jika anda mencari perkataan "" anda tidak boleh hanya menaip, masukkan,, masukkan,, masukkan 1106 01:00:20,000 --> 01:00:23,000 dan mendapat 3 mata, 3 mata, 3 mata, 3 mata. 1107 01:00:23,000 --> 01:00:26,000 Kita mahu menjadi mampu untuk menyenaraihitamkan perkataan itu oleh menetapkan bool 1108 01:00:26,000 --> 01:00:29,000 kepada true jika anda telah mendapati ia, dan sebagainya itulah sebabnya kita 1109 01:00:29,000 --> 01:00:31,000 terkandung dalam struktur ini. 1110 01:00:31,000 --> 01:00:35,000 >> Sekarang, turun di sini Kacau ini struct lain yang dipanggil kamus. 1111 01:00:35,000 --> 01:00:39,000 Hadir di sini adalah perkataan typedef kerana dalam kes ini 1112 01:00:39,000 --> 01:00:43,000 kita perlu merangkumi idea kamus, 1113 01:00:43,000 --> 01:00:46,000 dan kamus mengandungi sekumpulan keseluruhan perkataan, 1114 01:00:46,000 --> 01:00:49,000 seperti yang tersirat oleh pelbagai ini, dan berapa banyak kata-kata yang ada? 1115 01:00:49,000 --> 01:00:51,000 Nah, apa sahaja yang ini saiz yang berubah-ubah yang dipanggil mengatakan. 1116 01:00:51,000 --> 01:00:53,000 Tetapi kita hanya perlu satu kamus. 1117 01:00:53,000 --> 01:00:55,000 Kita tidak memerlukan jenis data yang dipanggil kamus. 1118 01:00:55,000 --> 01:00:58,000 Kita hanya perlu salah seorang daripada mereka, jadi ia ternyata dalam C 1119 01:00:58,000 --> 01:01:03,000 bahawa jika anda tidak mengatakan typedef, anda hanya mengatakan struct, maka di dalam pendakap kerinting 1120 01:01:03,000 --> 01:01:05,000 anda meletakkan pembolehubah anda, maka anda meletakkan nama. 1121 01:01:05,000 --> 01:01:09,000 Ini mengisytiharkan satu kamus ubah yang dipanggil 1122 01:01:09,000 --> 01:01:11,000 yang kelihatan seperti ini. 1123 01:01:11,000 --> 01:01:16,000 Sebaliknya, ayat-ayat ini mewujudkan satu struktur data yang boleh diguna semula dipanggil perkataan 1124 01:01:16,000 --> 01:01:19,000 bahawa anda boleh membuat berbilang salinan, sama seperti kami menciptakan 1125 01:01:19,000 --> 01:01:22,000 berbilang salinan pelajar. 1126 01:01:22,000 --> 01:01:24,000 >> Apakah ini akhirnya membolehkan kita lakukan? 1127 01:01:24,000 --> 01:01:30,000 Biar saya pergi kembali ke dalam, katakan, satu contoh mudah dari zaman mudah, 1128 01:01:30,000 --> 01:01:34,000 dan biarlah saya membuka, katakan, compare1.c. 1129 01:01:34,000 --> 01:01:38,000 Masalah di sini di tangan sebenarnya adalah untuk mengupas kembali 1130 01:01:38,000 --> 01:01:41,000 lapisan rentetan dan mula mengambil kira roda latihan 1131 01:01:41,000 --> 01:01:44,000 kerana ia ternyata bahawa rentetan semua masa ini 1132 01:01:44,000 --> 01:01:47,000 adalah seperti yang kita janjikan dalam 1 minggu benar-benar hanya nama samaran, 1133 01:01:47,000 --> 01:01:51,000 sinonim dari perpustakaan CS50 untuk sesuatu yang kelihatan sedikit lebih samar, 1134 01:01:51,000 --> 01:01:53,000 char *, dan kita telah melihat bintang ini sebelum. 1135 01:01:53,000 --> 01:01:55,000 Kita melihat ia dalam konteks fail. 1136 01:01:55,000 --> 01:01:59,000 >> Mari kita lihat sekarang mengapa kita telah menyembunyikan butiran ini untuk beberapa waktu sekarang. 1137 01:01:59,000 --> 01:02:02,000 Berikut adalah fail yang dipanggil compare1.c, 1138 01:02:02,000 --> 01:02:07,000 dan nampaknya ia meminta pengguna untuk 2 tali, s dan t, 1139 01:02:07,000 --> 01:02:11,000 dan kemudian ia cuba untuk membandingkan mereka rentetan untuk kesaksamaan di baris 26, 1140 01:02:11,000 --> 01:02:14,000 dan jika mereka sama ia berkata, "Kamu menaip perkara yang sama," 1141 01:02:14,000 --> 01:02:17,000 dan jika mereka tidak sama, ia berkata, "Anda ditaip perkara yang berbeza." 1142 01:02:17,000 --> 01:02:19,000 Biar saya pergi ke hadapan dan menjalankan program ini. 1143 01:02:19,000 --> 01:02:23,000 Biar saya pergi ke direktori sumber saya, membuat compare1 satu. Ia disusun okay. 1144 01:02:23,000 --> 01:02:25,000 Mari saya menjalankan compare1. 1145 01:02:25,000 --> 01:02:27,000 Saya akan mengezum masuk, masukkan. 1146 01:02:27,000 --> 01:02:29,000 Mengatakan sesuatu. HELLO. 1147 01:02:29,000 --> 01:02:32,000 Saya akan mengatakan sesuatu lagi. HELLO. 1148 01:02:32,000 --> 01:02:34,000 Saya pasti tidak menaip perkara yang berbeza. 1149 01:02:34,000 --> 01:02:37,000 >> Biar saya cuba ini lagi. BYE BYE. 1150 01:02:37,000 --> 01:02:40,000 Pasti tidak berbeza, jadi apa yang berlaku di sini? 1151 01:02:40,000 --> 01:02:44,000 Nah, apa yang benar-benar sedang berbanding dalam 26 baris? 1152 01:02:44,000 --> 01:02:46,000 [Didengar-pelajar] 1153 01:02:46,000 --> 01:02:49,000 Ya, jadi ia ternyata bahawa rentetan, jenis data, adalah jenis dusta putih. 1154 01:02:49,000 --> 01:02:53,000 Rentetan adalah * char, tetapi apakah * char? 1155 01:02:53,000 --> 01:02:56,000 A * char, sebagaimana yang mereka katakan, adalah penunjuk, 1156 01:02:56,000 --> 01:03:00,000 dan penunjuk berkesan alamat, 1157 01:03:00,000 --> 01:03:05,000 lokasi jumlah dalam memori, dan jika anda berlaku telah ditaip dalam perkataan seperti HELLO, 1158 01:03:05,000 --> 01:03:08,000 ingat dari perbincangan lalu rentetan 1159 01:03:08,000 --> 01:03:16,000 ini adalah seperti perkataan HELLO. 1160 01:03:16,000 --> 01:03:19,000 Ingatlah bahawa perkataan seperti HELLO boleh diwakili 1161 01:03:19,000 --> 01:03:22,000 sebagai pelbagai watak seperti ini 1162 01:03:22,000 --> 01:03:25,000 dan kemudian dengan ciri-ciri khas pada akhir dipanggil watak nol, 1163 01:03:25,000 --> 01:03:27,000 sebagai menandakan \. 1164 01:03:27,000 --> 01:03:29,000 Apa sebenarnya adalah rentetan? 1165 01:03:29,000 --> 01:03:32,000 Perhatikan bahawa ini adalah ketulan pelbagai memori, 1166 01:03:32,000 --> 01:03:36,000 dan pada hakikatnya, akhir ia hanya diketahui apabila anda melihat melalui rentetan keseluruhan 1167 01:03:36,000 --> 01:03:38,000 mencari watak null khas. 1168 01:03:38,000 --> 01:03:41,000 Tetapi jika ini adalah sebahagian memori dari memori komputer saya, 1169 01:03:41,000 --> 01:03:44,000 mari kita sewenang-wenangnya mengatakan bahawa rentetan ini hanya mendapat bernasib baik, 1170 01:03:44,000 --> 01:03:47,000 dan ia mendapat diletakkan di awal sangat RAM komputer saya. 1171 01:03:47,000 --> 01:03:54,000 Ini adalah bait 0, 1, 2, 3, 4, 5, 6 ... 1172 01:03:54,000 --> 01:04:02,000 >> Apabila saya mengatakan sesuatu seperti GetString dan saya lakukan rentetan s = GetString 1173 01:04:02,000 --> 01:04:04,000 apa yang benar-benar dipulangkan? 1174 01:04:04,000 --> 01:04:08,000 Untuk beberapa minggu yang lalu, apa yang benar-benar akan disimpan dalam s 1175 01:04:08,000 --> 01:04:13,000 bukan ini rentetan per se, tetapi dalam kes ini apa yang disimpan adalah 1176 01:04:13,000 --> 01:04:18,000 0 nombor kerana apa GetString sebenarnya tidak 1177 01:04:18,000 --> 01:04:20,000 ia tidak fizikal mengembalikan rentetan. 1178 01:04:20,000 --> 01:04:22,000 Itu tidak benar-benar masuk akal konsep. 1179 01:04:22,000 --> 01:04:24,000 Apakah ia tidak pulangan adalah nombor. 1180 01:04:24,000 --> 01:04:28,000 Itu nombor alamat HELLO dalam ingatan, 1181 01:04:28,000 --> 01:04:32,000 dan tali s kemudian, jika kita mengupas kembali lapisan ini, tali tidak benar-benar wujud. 1182 01:04:32,000 --> 01:04:35,000 Ia hanya peringkasan di perpustakaan CS50. 1183 01:04:35,000 --> 01:04:38,000 >> Ini benar-benar adalah sesuatu yang dipanggil * char. 1184 01:04:38,000 --> 01:04:41,000 Char masuk akal kerana apa perkataan, seperti HELLO? 1185 01:04:41,000 --> 01:04:44,000 Nah, ia adalah satu siri aksara, siri aksara. 1186 01:04:44,000 --> 01:04:47,000 * Char bermakna alamat watak, 1187 01:04:47,000 --> 01:04:50,000 jadi apakah maknanya untuk kembali rentetan? 1188 01:04:50,000 --> 01:04:53,000 A nice, cara mudah mengembalikan rentetan 1189 01:04:53,000 --> 01:04:57,000 bukannya cuba untuk memikirkan bagaimana saya kembali ke 5 atau 6 bait yang berbeza 1190 01:04:57,000 --> 01:05:01,000 izinkan saya kembali ke alamat yang bait? 1191 01:05:01,000 --> 01:05:03,000 Yang pertama. 1192 01:05:03,000 --> 01:05:06,000 Dalam erti kata lain, izinkan saya memberi anda alamat watak dalam ingatan. 1193 01:05:06,000 --> 01:05:10,000 Itulah apa * char mewakili, alamat satu watak tunggal dalam ingatan. 1194 01:05:10,000 --> 01:05:12,000 Panggil bahawa s berubah-ubah. 1195 01:05:12,000 --> 01:05:15,000 Kedai dalam s bahawa alamat tertentu, yang saya sewenang-wenangnya berkata adalah 0, 1196 01:05:15,000 --> 01:05:19,000 hanya untuk menjaga perkara-perkara yang mudah, tetapi dalam realiti, ia adalah umumnya beberapa yang lebih besar. 1197 01:05:19,000 --> 01:05:21,000 >> Tunggu satu minit. 1198 01:05:21,000 --> 01:05:23,000 Jika anda hanya memberi saya alamat aksara pertama, bagaimana saya tahu apa alamat 1199 01:05:23,000 --> 01:05:25,000 watak kedua, ketiga, keempat dan kelima? 1200 01:05:25,000 --> 01:05:27,000 [Didengar-pelajar] 1201 01:05:27,000 --> 01:05:31,000 Anda hanya tahu di mana hujung tali adalah dengan cara silap mata ini berguna, 1202 01:05:31,000 --> 01:05:35,000 jadi apabila anda menggunakan sesuatu seperti printf, apa printf benar-benar mengambil sebagai hujah, 1203 01:05:35,000 --> 01:05:39,000 ingat bahawa kita menggunakan placeholder ini% s, dan kemudian anda lulus dalam 1204 01:05:39,000 --> 01:05:41,000 pemboleh ubah yang menyimpan rentetan. 1205 01:05:41,000 --> 01:05:47,000 Apa yang anda benar-benar lulus adalah alamat watak pertama rentetan itu. 1206 01:05:47,000 --> 01:05:50,000 Printf kemudian menggunakan untuk gelung atau gelung sementara apabila menerima alamat itu, 1207 01:05:50,000 --> 01:05:53,000 misalnya, 0, jadi biarlah saya melakukan ini sekarang, 1208 01:05:53,000 --> 01:06:02,000 printf ("% s \ n"); 1209 01:06:02,000 --> 01:06:07,000 Apabila saya panggil printf ("% s \ n"); apa yang saya benar-benar menyediakan printf dengan 1210 01:06:07,000 --> 01:06:13,000 adalah alamat watak pertama di s, yang dalam kes ini sewenang-wenangnya adalah H. 1211 01:06:13,000 --> 01:06:16,000 >> Bagaimanakah printf tahu apa sebenarnya untuk memaparkan pada skrin? 1212 01:06:16,000 --> 01:06:19,000 Orang yang melaksanakan printf melaksanakan gelung sementara atau untuk gelung 1213 01:06:19,000 --> 01:06:23,000 yang mengatakan bahawa tidak watak ini menyamai watak null khas? 1214 01:06:23,000 --> 01:06:25,000 Jika tidak, mencetak. Bagaimana kira-kira satu ini? 1215 01:06:25,000 --> 01:06:28,000 Jika tidak mencetak, mencetak, mencetak, mencetak. 1216 01:06:28,000 --> 01:06:32,000 Oh, yang satu ini adalah istimewa. Hentikan percetakan dan kembali kepada pengguna. 1217 01:06:32,000 --> 01:06:35,000 Dan itulah benar-benar semua yang telah berlaku di bawah hood, 1218 01:06:35,000 --> 01:06:38,000 dan itulah banyak untuk mencerna pada hari pertama kelas, 1219 01:06:38,000 --> 01:06:43,000 tetapi kini ia adalah benar-benar blok bangunan memahami segala-galanya 1220 01:06:43,000 --> 01:06:46,000 yang telah berlaku di dalam memori komputer kita, 1221 01:06:46,000 --> 01:06:49,000 dan akhirnya kita akan mengusik ini selain dengan sedikit bantuan 1222 01:06:49,000 --> 01:06:51,000 daripada salah satu daripada rakan-rakan kami di Stanford. 1223 01:06:51,000 --> 01:06:56,000 >> Profesor Nick Parlante di Stanford telah dilakukan ini turutan video yang indah 1224 01:06:56,000 --> 01:06:58,000 dari pelbagai bahasa yang berbeza yang diperkenalkan 1225 01:06:58,000 --> 01:07:00,000 ini claymation sedikit watak Binky. 1226 01:07:00,000 --> 01:07:03,000 Suara anda kira-kira untuk mendengar dalam hanya pratonton menyelinap kedua beberapa 1227 01:07:03,000 --> 01:07:05,000 adalah seorang profesor Stanford, dan anda mendapat 1228 01:07:05,000 --> 01:07:07,000 hanya 5 atau 6 saat hak ini sekarang, 1229 01:07:07,000 --> 01:07:09,000 tetapi ini adalah nota yang kita akan menyimpulkan hari ini 1230 01:07:09,000 --> 01:07:11,000 dan bermula pada hari Rabu. 1231 01:07:11,000 --> 01:07:15,000 Saya memberikan anda Fun pointer dengan Binky, preview. 1232 01:07:15,000 --> 01:07:18,000 [Muzik ♪ ♪] [Profesor Parlante] Hei, Binky. 1233 01:07:18,000 --> 01:07:21,000 Bangun. Ia adalah masa untuk berseronok penunjuk. 1234 01:07:21,000 --> 01:07:24,000 [Binky] Apa itu? Belajar mengenai petunjuk? 1235 01:07:24,000 --> 01:07:26,000 Oh, gula-gula! 1236 01:07:26,000 --> 01:07:29,000 >> Kami akan melihat anda pada hari Rabu. 1237 01:07:29,000 --> 01:07:32,000 [CS50.TV]