1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: Baiklah, selamat datang kembali. 3 00:00:12,580 --> 00:00:13,290 Ini adalah CS50. 4 00:00:13,290 --> 00:00:15,130 Ini adalah awal minggu ketujuh. 5 00:00:15,130 --> 00:00:18,890 Jadi sudah lama, jadi saya pikir kami akan mengambil tur angin puyuh di mana kita 6 00:00:18,890 --> 00:00:20,760 tinggalkan dan di mana kita sekarang pergi. 7 00:00:20,760 --> 00:00:23,310 >> Jadi hal ini di sini mungkin menyebabkan beberapa kecemasan pada awalnya. 8 00:00:23,310 --> 00:00:27,680 Tapi mudah-mudahan, Anda mulai menyesuaikan diri dengan apa menunjukkan di sini - 9 00:00:27,680 --> 00:00:32,670 star mewakili pointer, yang apa, dalam istilah yang lebih awam? 10 00:00:32,670 --> 00:00:33,400 Jadi alamat. 11 00:00:33,400 --> 00:00:35,490 >> Jadi alamat sesuatu dalam memori. 12 00:00:35,490 --> 00:00:38,260 Dan kami mulai mengupas lapisan-lapisan beberapa minggu yang lalu, hal-hal seperti 13 00:00:38,260 --> 00:00:41,800 GetString dan fungsi lainnya seperti selama ini telah kembali 14 00:00:41,800 --> 00:00:46,010 alamat hal dalam memori, seperti alamat dari karakter pertama dalam 15 00:00:46,010 --> 00:00:46,990 beberapa urutan. 16 00:00:46,990 --> 00:00:50,360 >> Jadi kami juga memperkenalkan Valgrind, yang Anda akan mulai digunakan untuk masalah ini 17 00:00:50,360 --> 00:00:53,380 ditetapkan, terutama untuk selanjutnya Masalah ditetapkan juga. 18 00:00:53,380 --> 00:00:54,980 Dan Valgrind melakukan apa bagi kita? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Ia memeriksa kebocoran memori, dan juga memeriksa penyalahgunaan memori. 21 00:01:01,020 --> 00:01:05,890 >> Hal ini dapat, dengan beberapa probabilitas, mendeteksi jika kode Anda akan menyentuh memori 22 00:01:05,890 --> 00:01:07,100 bahwa itu hanya tidak seharusnya. 23 00:01:07,100 --> 00:01:10,410 Jadi belum tentu kebocoran, tetapi jika Anda melampaui batas-batas beberapa 24 00:01:10,410 --> 00:01:14,730 array, dan Anda benar-benar menjalankan valgrind dan mendorong perilaku bahwa sementara 25 00:01:14,730 --> 00:01:17,870 Valgrind berjalan dalam program anda adalah berjalan di dalamnya, Anda akan mendapatkan 26 00:01:17,870 --> 00:01:21,460 pesan seperti ini - "tidak valid menulis dari ukuran 4, "yang, mengingat beberapa 27 00:01:21,460 --> 00:01:25,880 minggu lalu berarti bahwa aku sengaja seperti pada satu int terlalu jauh 28 00:01:25,880 --> 00:01:27,250 melampaui batas-batas array. 29 00:01:27,250 --> 00:01:30,790 Dan sehingga ukuran 4 berarti di sini ukuran itu int tertentu. 30 00:01:30,790 --> 00:01:35,260 >> Jadi mengambil kepastian dalam kenyataan bahwa Output Valgrind, format itu, 31 00:01:35,260 --> 00:01:36,170 hanya mengerikan. 32 00:01:36,170 --> 00:01:40,180 Ini benar-benar sulit untuk melihat melalui kekacauan untuk informasi menarik. 33 00:01:40,180 --> 00:01:42,910 Jadi apa yang kami lakukan di sini hanya kutipan beberapa beberapa lebih 34 00:01:42,910 --> 00:01:43,850 garis menarik. 35 00:01:43,850 --> 00:01:46,760 Tapi menyadari bahwa 80% dari Valgrind ini output akan menjadi sedikit 36 00:01:46,760 --> 00:01:47,650 gangguan. 37 00:01:47,650 --> 00:01:52,820 >> Hanya mencari pola seperti ini - valid benar, valid baca, 40 byte 38 00:01:52,820 --> 00:01:56,690 dan beberapa jumlah blok yang pasti hilang, kata kunci seperti itu. 39 00:01:56,690 --> 00:02:01,920 Dan apa yang Anda mudah-mudahan akan melihat beberapa jenis jejak apa fungsi yang 40 00:02:01,920 --> 00:02:03,340 kesalahan sebenarnya masuk 41 00:02:03,340 --> 00:02:07,195 Dalam hal ini di sini, dalam apa garis kode saya adalah kesalahan rupanya? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 dalam sebuah file bernama memory.c, yang contoh kami bermain dengan 44 00:02:14,130 --> 00:02:14,890 pada saat itu. 45 00:02:14,890 --> 00:02:16,460 Jadi mungkin tidak dalam malloc. 46 00:02:16,460 --> 00:02:18,630 Itu mungkin dalam kode saya sebaliknya. 47 00:02:18,630 --> 00:02:20,910 Jadi kita akan melihat ini lagi dan sekali lagi sebelum lama. 48 00:02:20,910 --> 00:02:24,080 >> Jadi scanf, ini datang dalam beberapa bentuk sejauh ini. 49 00:02:24,080 --> 00:02:26,410 Kami melihat sscanf sebentar. 50 00:02:26,410 --> 00:02:28,330 Itu adalah sesuatu yang sejumlah Anda menyelam ke dalam Anda 51 00:02:28,330 --> 00:02:29,535 persiapan untuk kuis. 52 00:02:29,535 --> 00:02:33,130 Dan scanf sebenarnya apa CS50 perpustakaan telah menggunakan bawah 53 00:02:33,130 --> 00:02:36,560 hood untuk beberapa waktu dalam rangka untuk mendapatkan input dari user. 54 00:02:36,560 --> 00:02:40,420 >> Misalnya, jika saya pindah ke CS50 alat di sini, biarkan aku membuka sebuah 55 00:02:40,420 --> 00:02:45,315 Misalnya hari ini yang disebut-scanf 0.c Dan itu super sederhana. 56 00:02:45,315 --> 00:02:46,590 Ini hanya beberapa baris kode. 57 00:02:46,590 --> 00:02:50,880 Tapi itu menunjukkan benar-benar bagaimana getInt telah bekerja sepanjang waktu ini. 58 00:02:50,880 --> 00:02:54,710 >> Dalam program ini di sini, di baris 16 , Perhatikan bahwa saya menyatakan int. 59 00:02:54,710 --> 00:02:57,270 Jadi tidak ada pointer, tidak ada yang ajaib di sana, hanya sebuah int. 60 00:02:57,270 --> 00:03:00,330 Kemudian pada baris 17, saya meminta pengguna untuk nomor, silakan. 61 00:03:00,330 --> 00:03:02,930 Kemudian pada akhir 18, saya menggunakan scanf sini. 62 00:03:02,930 --> 00:03:06,910 Dan saya ditentukan, jenis seperti printf, bahwa aku mengharapkan kutipan 63 00:03:06,910 --> 00:03:08,110 tanda kutip persen i. 64 00:03:08,110 --> 00:03:10,920 >> Jadi persen i, tentu saja, menunjukkan sebuah int. 65 00:03:10,920 --> 00:03:14,580 Tapi perhatikan apa yang kedua argumen ke scanf adalah. 66 00:03:14,580 --> 00:03:17,350 Bagaimana Anda menggambarkan kedua Argumen setelah koma? 67 00:03:17,350 --> 00:03:19,450 Apa itu? 68 00:03:19,450 --> 00:03:20,670 >> Ini alamat x. 69 00:03:20,670 --> 00:03:25,490 Jadi ini adalah berguna karena dengan memberikan scanf dengan alamat x, apa 70 00:03:25,490 --> 00:03:29,560 yang memberdayakan fungsi yang harus dilakukan? 71 00:03:29,560 --> 00:03:33,010 Tidak hanya pergi ke sana, tetapi juga melakukan apa? 72 00:03:33,010 --> 00:03:34,060 >> Membuat perubahan untuk itu. 73 00:03:34,060 --> 00:03:38,080 Karena Anda dapat pergi ke sana, itu semacam seperti peta ke lokasi dalam memori. 74 00:03:38,080 --> 00:03:41,900 Dan selama Anda memberikan scanf, atau fungsi apapun dengan peta tersebut, bahwa 75 00:03:41,900 --> 00:03:45,840 Fungsi bisa pergi ke sana, dan tidak hanya melihat nilai, tetapi juga dapat 76 00:03:45,840 --> 00:03:49,670 mengubah nilai yang, yang berguna jika tujuan dalam hidup adalah untuk scanf 77 00:03:49,670 --> 00:03:53,060 memindai masukan dari pengguna, khususnya dari keyboard. 78 00:03:53,060 --> 00:03:57,830 Dan f menunjukkan diformat, seperti printf, f menunjukan suatu diformat 79 00:03:57,830 --> 00:03:58,930 string yang akan dicetak. 80 00:03:58,930 --> 00:04:04,430 >> Jadi singkatnya, baris ini 18 hanya mengatakan, mencoba untuk membaca int dari pengguna 81 00:04:04,430 --> 00:04:10,420 keyboard dan menyimpannya dalam x, pada alamat apapun x kebetulan tinggal di. 82 00:04:10,420 --> 00:04:14,860 Dan kemudian terakhir, baris 19 hanya mengatakan, terima kasih untuk int, dalam kasus ini. 83 00:04:14,860 --> 00:04:15,940 >> Jadi biarkan aku pergi ke depan dan membuat ini. 84 00:04:15,940 --> 00:04:18,570 Jadi membuat scanf 0. 85 00:04:18,570 --> 00:04:20,130 Biarkan aku pergi ke depan dan zoom in 86 00:04:20,130 --> 00:04:22,960 Aku akan pergi dan menjalankan ini dengan titik memangkas scanf 0. 87 00:04:22,960 --> 00:04:24,020 Nomor, please? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Terima kasih untuk 50. 90 00:04:25,730 --> 00:04:27,270 Jadi itu cukup sederhana. 91 00:04:27,270 --> 00:04:28,160 >> Sekarang apa yang tidak lakukan? 92 00:04:28,160 --> 00:04:29,940 Ini tidak melakukan seluruh bunch dari pengecekan error. 93 00:04:29,940 --> 00:04:33,000 Misalnya, jika saya tidak bekerja sama, dan saya tidak mengetikkan nomor, tetapi 94 00:04:33,000 --> 00:04:37,860 bukannya saya menulis sesuatu seperti "halo," itu hanya semacam aneh. 95 00:04:37,860 --> 00:04:41,130 Dan salah satu hal yang CS50 perpustakaan telah melakukan bagi kita untuk beberapa 96 00:04:41,130 --> 00:04:43,440 adalah reprompting yang dan reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Coba lagi ingat frase berada di cs50.c, dan itulah alasan bahwa getInt di 98 00:04:49,320 --> 00:04:51,670 perpustakaan CS50 sebenarnya keseluruhan sekelompok garis panjang, karena kita 99 00:04:51,670 --> 00:04:53,190 memeriksa hal-hal bodoh seperti ini. 100 00:04:53,190 --> 00:04:55,730 Apakah pengguna tidak memberikan kita, pada kenyataannya, int? 101 00:04:55,730 --> 00:04:57,910 Apakah dia memberi kita sesuatu seperti surat abjad? 102 00:04:57,910 --> 00:05:01,410 Jika demikian, kita ingin mendeteksi itu dan berteriak pada mereka. 103 00:05:01,410 --> 00:05:03,915 >> Tapi hal-hal mendapatkan lebih menarik dalam contoh berikut ini. 104 00:05:03,915 --> 00:05:09,840 Jika saya pergi ke scanf-1.c, apa yang hal yang berubah secara fundamental dalam 105 00:05:09,840 --> 00:05:11,135 ini contoh berikut ini? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Saya menggunakan char *, tentu saja, bukannya int. 108 00:05:16,010 --> 00:05:19,210 >> Jadi ini menarik, karena char *, ingat, benar-benar hanya 109 00:05:19,210 --> 00:05:20,190 Hal yang sama sebagai string. 110 00:05:20,190 --> 00:05:23,840 Jadi rasanya mungkin ini adalah super implementasi sederhana dari GetString. 111 00:05:23,840 --> 00:05:26,010 Tapi aku sudah dikupas kembali layer dari CS50 perpustakaan, jadi saya 112 00:05:26,010 --> 00:05:27,550 menyebutnya char * sekarang. 113 00:05:27,550 --> 00:05:30,070 Jadi mari kita lihat di mana, jika di mana saja, kami salah. 114 00:05:30,070 --> 00:05:30,840 >> Baris 17 - 115 00:05:30,840 --> 00:05:33,950 Lagi saya katakan, tolong beri saya sesuatu, dalam hal ini, string. 116 00:05:33,950 --> 00:05:37,940 Dan kemudian di baris berikutnya, saya sebut scanf, lagi, memberikan kode format, 117 00:05:37,940 --> 00:05:39,310 tapi ini persen waktu s. 118 00:05:39,310 --> 00:05:41,900 Dan kemudian saat ini, aku memberikan penyangga. 119 00:05:41,900 --> 00:05:43,550 >> Sekarang perhatikan, aku tidak menggunakan ampersand. 120 00:05:43,550 --> 00:05:47,120 Tapi kenapa begitu mungkin OK di sini? 121 00:05:47,120 --> 00:05:49,760 Karena apa yang sudah penyangga? 122 00:05:49,760 --> 00:05:50,770 Ini sudah pointer. 123 00:05:50,770 --> 00:05:51,650 Ini sudah alamat. 124 00:05:51,650 --> 00:05:54,510 >> Dan mari kita kata ini "membingungkan," biarkan aku sebut saja s, misalnya, untuk 125 00:05:54,510 --> 00:05:55,050 kesederhanaan. 126 00:05:55,050 --> 00:05:58,250 Tapi aku menyebutnya penyangga karena dalam umum, dalam pemrograman, jika Anda memiliki 127 00:05:58,250 --> 00:06:02,130 sepotong memori, yang string benar hanya itu, Anda mungkin menyebutnya buffer. 128 00:06:02,130 --> 00:06:04,460 Ini adalah tempat untuk menyimpan informasi. 129 00:06:04,460 --> 00:06:07,400 >> Serupa dengan hal-hal seperti YouTube, ketika mereka buffering, sehingga untuk berbicara, bahwa 130 00:06:07,400 --> 00:06:10,270 hanya berarti itu men-download bit dari internet dan menyimpannya dalam 131 00:06:10,270 --> 00:06:14,160 array yang lokal, sepotong lokal memori sehingga bahwa Anda dapat melihatnya kemudian tanpa 132 00:06:14,160 --> 00:06:16,830 itu melompat-lompat atau tergantung di Anda saat bermain kembali. 133 00:06:16,830 --> 00:06:20,930 >> Jadi ada masalah di sini meskipun, karena aku mengatakan scanf, mengharapkan 134 00:06:20,930 --> 00:06:22,320 string dari pengguna. 135 00:06:22,320 --> 00:06:24,410 Berikut alamat sepotong memori. 136 00:06:24,410 --> 00:06:26,180 Masukan string di sana. 137 00:06:26,180 --> 00:06:31,230 Kenapa begitu terikat memberikan kami kesulitan, meskipun? 138 00:06:31,230 --> 00:06:33,490 >> Apa itu? 139 00:06:33,490 --> 00:06:35,510 Apakah saya diizinkan untuk mengakses bagian dari memori? 140 00:06:35,510 --> 00:06:36,250 Kau tahu, aku tidak tahu. 141 00:06:36,250 --> 00:06:39,210 Karena telah penyangga diinisialisasi apa-apa? 142 00:06:39,210 --> 00:06:39,820 Tidak benar-benar. 143 00:06:39,820 --> 00:06:43,090 Dan jadi apa yang kita telah memanggil nilai sampah, yang 144 00:06:43,090 --> 00:06:44,040 bukan kata formal. 145 00:06:44,040 --> 00:06:49,200 Itu hanya berarti kita tidak tahu apa bit yang dalam empat byte yang 146 00:06:49,200 --> 00:06:51,240 Saya telah dialokasikan sebagai penyangga. 147 00:06:51,240 --> 00:06:52,450 >> Saya tidak menelepon malloc. 148 00:06:52,450 --> 00:06:53,940 Aku sudah pasti tidak disebut GetString. 149 00:06:53,940 --> 00:06:56,380 Jadi siapa yang tahu apa yang sebenarnya dalam buffer? 150 00:06:56,380 --> 00:07:00,550 Namun mengatakan scanf membabi buta, pergi ke sana dan menempatkan apa pun pengguna mengetik. 151 00:07:00,550 --> 00:07:04,460 >> Jadi apa yang mungkin menyebabkan dalam kode kita jika kita menjalankannya? 152 00:07:04,460 --> 00:07:05,700 Mungkin segfault. 153 00:07:05,700 --> 00:07:07,970 Mungkin tidak, tapi mungkin segfault. 154 00:07:07,970 --> 00:07:10,620 Dan saya mengatakan mungkin bukan karena kadang-kadang Anda lakukan, kadang-kadang 155 00:07:10,620 --> 00:07:11,380 Anda tidak mendapatkan segfault. 156 00:07:11,380 --> 00:07:14,280 Kadang-kadang Anda hanya beruntung, tapi itu tetap akan menjadi 157 00:07:14,280 --> 00:07:15,340 bug di program kami. 158 00:07:15,340 --> 00:07:17,060 >> Jadi biarkan aku pergi ke depan dan kompilasi ini. 159 00:07:17,060 --> 00:07:18,280 Aku akan melakukannya dengan cara lama sekolah. 160 00:07:18,280 --> 00:07:23,825 Jadi dentang dasbor 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Ups, sekolah terlalu tua. 162 00:07:24,720 --> 00:07:26,550 Mari kita lihat. 163 00:07:26,550 --> 00:07:28,440 Mana aku pergi? 164 00:07:28,440 --> 00:07:29,700 Oh, char * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, terima kasih - 167 00:07:35,130 --> 00:07:36,930 Simpan, OK - 168 00:07:36,930 --> 00:07:37,690 sekolah sangat tua. 169 00:07:37,690 --> 00:07:38,900 Baiklah, itu sudah lama. 170 00:07:38,900 --> 00:07:41,720 >> Jadi saya baru saja menyimpan file setelah keputusan yang sementara 171 00:07:41,720 --> 00:07:42,700 mengubah beberapa saat yang lalu. 172 00:07:42,700 --> 00:07:46,090 Dan sekarang aku telah dikompilasi manual dengan dentang. 173 00:07:46,090 --> 00:07:49,500 Dan sekarang aku akan pergi ke depan dan menjalankan scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 String silakan. 175 00:07:50,290 --> 00:07:51,600 Aku akan mengetik "halo." 176 00:07:51,600 --> 00:07:54,070 >> Dan sekarang, di sinilah, terus terang, printf dapat sedikit mengganggu. 177 00:07:54,070 --> 00:07:56,020 Ini tidak benar-benar akan segfault dalam kasus ini. 178 00:07:56,020 --> 00:07:59,860 Printf sedikit istimewa karena itu begitu super yang biasa digunakan 179 00:07:59,860 --> 00:08:03,570 printf dasarnya adalah melakukan kami mendukung dan menyadari, 180 00:08:03,570 --> 00:08:04,830 itu bukan pointer yang valid. 181 00:08:04,830 --> 00:08:09,080 Biarkan aku mengambil itu atas diri untuk hanya mencetak dalam kurung nol, bahkan 182 00:08:09,080 --> 00:08:13,340 meskipun tidak selalu apa kita sendiri diharapkan. 183 00:08:13,340 --> 00:08:16,940 >> Jadi kita tidak bisa benar-benar mudah menginduksi segfault dengan ini, tapi jelas ini 184 00:08:16,940 --> 00:08:18,600 bukanlah perilaku yang saya inginkan. 185 00:08:18,600 --> 00:08:19,800 Jadi apa solusi sederhana? 186 00:08:19,800 --> 00:08:25,650 Nah, dalam scanf-2, saya mengusulkan bahwa bukan benar-benar hanya mengalokasikan 187 00:08:25,650 --> 00:08:30,100 char *, biarkan aku menjadi sedikit lebih cerdas tentang ini, dan biarkan aku mengalokasikan buffer 188 00:08:30,100 --> 00:08:32,940 sebagai urutan 16 karakter. 189 00:08:32,940 --> 00:08:34,200 >> Jadi saya bisa melakukan ini dalam beberapa cara. 190 00:08:34,200 --> 00:08:35,610 Aku benar-benar bisa menggunakan malloc. 191 00:08:35,610 --> 00:08:38,980 Tapi aku bisa kembali ke dua minggu ketika Aku hanya perlu sejumlah besar 192 00:08:38,980 --> 00:08:39,620 karakter. 193 00:08:39,620 --> 00:08:40,860 Itu hanya sebuah array. 194 00:08:40,860 --> 00:08:44,870 Jadi biarkan saya bukan mendefinisikan penyangga menjadi sebuah array dari 16 karakter. 195 00:08:44,870 --> 00:08:47,340 >> Dan sekarang, ketika saya melewati buffer - 196 00:08:47,340 --> 00:08:49,940 dan ini adalah sesuatu yang kita tidak berbicara tentang dalam dua minggu - 197 00:08:49,940 --> 00:08:53,730 tetapi Anda dapat memperlakukan sebuah array sebagai meskipun itu alamat. 198 00:08:53,730 --> 00:08:56,390 Secara teknis, seperti yang kita lihat, mereka sedikit berbeda. 199 00:08:56,390 --> 00:09:01,290 Tapi scanf tidak akan keberatan jika Anda lulus nama array, karena apa yang 200 00:09:01,290 --> 00:09:05,030 Dentang akan lakukan untuk kita pada dasarnya memperlakukan nama array sebagai 201 00:09:05,030 --> 00:09:08,280 alamat sepotong 16 byte. 202 00:09:08,280 --> 00:09:09,550 >> Jadi ini lebih baik. 203 00:09:09,550 --> 00:09:12,110 Ini berarti sekarang aku bisa diharapkan lakukan hal berikut. 204 00:09:12,110 --> 00:09:16,800 Mari saya zoom out sejenak dan melakukan make scanf-2, dikompilasi OK. 205 00:09:16,800 --> 00:09:19,390 Sekarang mari saya lakukan mendapat slash scanf-2. 206 00:09:19,390 --> 00:09:22,430 String silakan. "Halo." Dan tampaknya bekerja saat ini. 207 00:09:22,430 --> 00:09:26,020 >> Tapi bisa seseorang mengusulkan skenario di mana tidak mungkin masih bekerja? 208 00:09:26,020 --> 00:09:28,550 Ya? 209 00:09:28,550 --> 00:09:30,640 Sesuatu lebih panjang dari 16 karakter. 210 00:09:30,640 --> 00:09:32,020 Dan sebenarnya, kita bisa sedikit lebih tepat. 211 00:09:32,020 --> 00:09:36,540 Sesuatu lagi maka 15 karakter, karena memang kita perlu diingat 212 00:09:36,540 --> 00:09:39,920 bahwa kita membutuhkan backslash nol implisit pada akhir string, 213 00:09:39,920 --> 00:09:42,950 yang merupakan samping scanf biasanya akan mengurus bagi kita. 214 00:09:42,950 --> 00:09:46,210 >> Jadi biarkan aku melakukan sesuatu seperti - 215 00:09:46,210 --> 00:09:48,040 kadang-kadang kita bisa hanya biarkan seperti itu. 216 00:09:48,040 --> 00:09:50,630 OK, jadi sekarang kami telah diinduksi segmentasi kesalahan kita. 217 00:09:50,630 --> 00:09:51,000 Kenapa? 218 00:09:51,000 --> 00:09:54,940 Karena aku mengetik lebih dari 15 karakter, dan jadi kita sudah benar-benar 219 00:09:54,940 --> 00:09:58,280 menyentuh memori yang saya benar-benar tidak seharusnya. 220 00:09:58,280 --> 00:10:00,180 >> Jadi apa yang benar-benar solusi di sini? 221 00:10:00,180 --> 00:10:02,210 Nah, bagaimana jika kita membutuhkan string lagi? 222 00:10:02,210 --> 00:10:03,960 Yah, mungkin kita membuat 32 byte. 223 00:10:03,960 --> 00:10:05,160 Nah, bagaimana jika itu tidak cukup lama? 224 00:10:05,160 --> 00:10:06,040 Bagaimana sekitar 64 byte? 225 00:10:06,040 --> 00:10:07,080 Bagaimana jika itu tidak cukup lama? 226 00:10:07,080 --> 00:10:09,640 Bagaimana sekitar 128 atau 200 byte? 227 00:10:09,640 --> 00:10:12,660 Yang benar-benar adalah solusi di sini di kasus umum, jika kita tidak tahu 228 00:10:12,660 --> 00:10:14,460 memajukan apa pengguna akan mengetik? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Ini hanya semacam sakit besar di pantat, harus jujur, itulah sebabnya mengapa 231 00:10:23,050 --> 00:10:29,050 CS50 perpustakaan memiliki beberapa lusin baris dari kode yang secara kolektif menerapkan 232 00:10:29,050 --> 00:10:32,390 GetString string dalam cara yang kita tidak harus tahu terlebih dahulu apa yang 233 00:10:32,390 --> 00:10:33,430 pengguna akan mengetik. 234 00:10:33,430 --> 00:10:37,370 Secara khusus, jika Anda melihat kembali cs50.c dari dua minggu lalu, Anda akan melihat 235 00:10:37,370 --> 00:10:40,480 GetString yang sebenarnya tidak menggunakan scanf dengan cara ini. 236 00:10:40,480 --> 00:10:43,720 Sebaliknya, ia membaca satu karakter pada suatu waktu. 237 00:10:43,720 --> 00:10:46,010 >> Karena satu hal yang menyenangkan tentang membaca satu karakter adalah kita bisa 238 00:10:46,010 --> 00:10:48,490 menjamin diri kita untuk selalu memiliki setidaknya satu char. 239 00:10:48,490 --> 00:10:51,740 Aku hanya bisa mendeklarasikan char, dan kemudian mengambil langkah-langkah yang benar-benar bayi hanya 240 00:10:51,740 --> 00:10:54,380 membaca satu karakter di di waktu dari keyboard. 241 00:10:54,380 --> 00:10:58,240 Dan kemudian, apa yang Anda akan melihat GetString dilakukan adalah setiap kali kehabisan, 242 00:10:58,240 --> 00:11:02,280 mengatakan, 16 byte memori, menggunakan malloc, atau sepupu daripadanya, untuk 243 00:11:02,280 --> 00:11:06,810 mengalokasikan lebih banyak memori, menyalin tua memori ke yang baru, dan kemudian merangkak 244 00:11:06,810 --> 00:11:09,900 bersama, mendapatkan satu karakter pada satu waktu, dan ketika berjalan keluar dari itu 245 00:11:09,900 --> 00:11:13,370 sepotong memori, membuangnya, diperebutkan sepotong besar memori, salinan tua 246 00:11:13,370 --> 00:11:14,750 ke yang baru, dan mengulangi. 247 00:11:14,750 --> 00:11:18,480 Dan itu benar-benar sakit untuk benar-benar menerapkan sesuatu yang sederhana seperti 248 00:11:18,480 --> 00:11:19,710 mendapatkan masukan dari pengguna. 249 00:11:19,710 --> 00:11:21,090 >> Sehingga Anda dapat menggunakan scanf. 250 00:11:21,090 --> 00:11:22,430 Anda dapat menggunakan fungsi serupa lainnya. 251 00:11:22,430 --> 00:11:25,420 Dan banyak buku dan online contoh lakukan, tapi mereka semua 252 00:11:25,420 --> 00:11:27,210 rentan terhadap masalah seperti ini. 253 00:11:27,210 --> 00:11:29,550 Dan akhirnya, mendapatkan segfault adalah jenis menjengkelkan. 254 00:11:29,550 --> 00:11:30,680 Ini tidak baik bagi pengguna. 255 00:11:30,680 --> 00:11:33,560 >> Tapi dalam kasus terburuk, apa itu dasarnya menempatkan Anda 256 00:11:33,560 --> 00:11:37,160 Kode beresiko? 257 00:11:37,160 --> 00:11:39,250 Beberapa jenis serangan, berpotensi. 258 00:11:39,250 --> 00:11:41,680 Kami berbicara tentang satu serangan tersebut - meluap stack. 259 00:11:41,680 --> 00:11:44,660 Tapi secara umum, jika Anda diperbolehkan untuk buffer overflow, seperti yang kita melakukan 260 00:11:44,660 --> 00:11:48,070 beberapa minggu yang lalu, dengan hanya menulis lebih dari "halo" di stack, Anda 261 00:11:48,070 --> 00:11:52,330 memang bisa mengambil alih, berpotensi, komputer, atau setidaknya mendapatkan data yang 262 00:11:52,330 --> 00:11:53,510 bukan milik Anda. 263 00:11:53,510 --> 00:11:55,970 >> Jadi singkatnya, ini adalah mengapa kita memiliki mereka roda pelatihan. 264 00:11:55,970 --> 00:11:59,090 Tapi sekarang, kita mulai mengambil mereka pergi, sebagai program kami tidak perlu lagi, 265 00:11:59,090 --> 00:12:00,610 tentu, masukan dari pengguna. 266 00:12:00,610 --> 00:12:03,960 Tapi dalam kasus masalah menetapkan enam, masukan Anda akan datang dari besar 267 00:12:03,960 --> 00:12:07,520 kamus berkas dengan 150 beberapa aneh seribu kata. 268 00:12:07,520 --> 00:12:10,330 >> Jadi Anda tidak perlu khawatir tentang sewenang-wenang input pengguna. 269 00:12:10,330 --> 00:12:13,720 Kami akan memberikan beberapa asumsi tentang file itu. 270 00:12:13,720 --> 00:12:20,340 Setiap pertanyaan tentang pointer atau scanf atau input pengguna pada umumnya? 271 00:12:20,340 --> 00:12:24,450 >> Baiklah, jadi sekilas kemudian pada satu mengikuti topik dari dua minggu lalu. 272 00:12:24,450 --> 00:12:28,590 Dan itu gagasan ini struct. 273 00:12:28,590 --> 00:12:34,180 Bukan berarti - ini gagasan struct, yang adalah apa? 274 00:12:34,180 --> 00:12:35,430 Apa struct lakukan untuk kita? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Tentukan - 277 00:12:39,860 --> 00:12:41,710 maaf? 278 00:12:41,710 --> 00:12:42,820 Tentukan jenis variabel. 279 00:12:42,820 --> 00:12:44,410 Jadi semacam. 280 00:12:44,410 --> 00:12:46,180 Kami benar-benar menggabungkan dua topik. 281 00:12:46,180 --> 00:12:49,510 Jadi dengan typedef, ingat bahwa kita bisa menyatakan jenis kita sendiri, seperti 282 00:12:49,510 --> 00:12:51,500 sinonim, seperti string char *. 283 00:12:51,500 --> 00:12:56,200 Tetapi menggunakan typedef struct dan, kita bisa membuat struktur data yang benar-benar kita sendiri. 284 00:12:56,200 --> 00:12:59,600 >> Misalnya, jika saya kembali ke gedit di sini untuk sesaat, dan aku pergi ke depan 285 00:12:59,600 --> 00:13:08,230 dan melakukan sesuatu seperti, membiarkan saya menyimpan ini sebagai, katakanlah, structs.c 286 00:13:08,230 --> 00:13:10,840 sementara, aku hanya akan untuk terus maju dan termasuk 287 00:13:10,840 --> 00:13:14,360 standardio.h, void main int. 288 00:13:14,360 --> 00:13:18,960 Dan kemudian di sini, anggaplah bahwa saya ingin untuk menulis sebuah program yang menyimpan 289 00:13:18,960 --> 00:13:21,840 beberapa mahasiswa dari beberapa rumah, misalnya. 290 00:13:21,840 --> 00:13:24,430 Jadi seperti registrarial Database dari beberapa macam. 291 00:13:24,430 --> 00:13:29,550 >> Jadi jika saya membutuhkan satu siswa nama, saya mungkin melakukan sesuatu seperti nama * char, 292 00:13:29,550 --> 00:13:31,570 dan saya akan melakukan sesuatu seperti - 293 00:13:31,570 --> 00:13:34,410 sebenarnya, mari kita gunakan CS50 perpustakaan untuk sesaat untuk membuat ini 294 00:13:34,410 --> 00:13:38,380 sedikit lebih sederhana, sehingga kami dapat meminjam mereka puluhan baris kode. 295 00:13:38,380 --> 00:13:39,340 Dan mari saja tetap sederhana. 296 00:13:39,340 --> 00:13:42,610 Kami akan tetap tali, dan sekarang getString. 297 00:13:42,610 --> 00:13:47,420 >> Jadi saya mengklaim sekarang bahwa saya telah disimpan nama beberapa mahasiswa, dan rumah 298 00:13:47,420 --> 00:13:50,240 beberapa siswa, hanya menggunakan variabel seperti yang kita lakukan dan dalam satu minggu. 299 00:13:50,240 --> 00:13:52,370 Tapi bagaimana kalau sekarang saya ingin mendukung beberapa siswa. 300 00:13:52,370 --> 00:13:58,460 Baiklah, jadi naluri saya lakukan String name2, mendapat GetString, tali 301 00:13:58,460 --> 00:14:01,370 house2 mendapat GetString. 302 00:14:01,370 --> 00:14:05,850 Dan kemudian mahasiswa ketiga kami, mari kita lakukan name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Baiklah, jadi ini mudah-mudahan mencolok Anda sebagai agak bodoh, 304 00:14:09,170 --> 00:14:11,580 karena proses ini benar-benar tidak pernah akan berakhir, dan itu hanya akan 305 00:14:11,580 --> 00:14:13,130 membuat kode saya terlihat buruk dan lebih buruk dan lebih buruk. 306 00:14:13,130 --> 00:14:14,810 Tapi kita memecahkan ini juga dalam dua minggu. 307 00:14:14,810 --> 00:14:19,450 Apa solusi kami relatif bersih ketika kami memiliki beberapa variabel dari 308 00:14:19,450 --> 00:14:23,580 sama tipe data yang semuanya berhubungan, tetapi kami tidak ingin kekacauan ini mengerikan 309 00:14:23,580 --> 00:14:26,870 variabel bernama sama? 310 00:14:26,870 --> 00:14:30,060 Apa yang kita lakukan, bukan? 311 00:14:30,060 --> 00:14:31,260 >> Jadi saya pikir saya mendengar beberapa tempat. 312 00:14:31,260 --> 00:14:32,590 Kami memiliki sebuah array. 313 00:14:32,590 --> 00:14:37,110 Jika Anda ingin beberapa contoh sesuatu, kenapa tidak kita membersihkan semua ini 314 00:14:37,110 --> 00:14:39,540 dan hanya mengatakan, beri saya array disebut nama? 315 00:14:39,540 --> 00:14:41,640 >> Dan untuk saat ini, mari kita 3 kode keras. 316 00:14:41,640 --> 00:14:44,450 Dan kemudian memberikan array lain disebut rumah, dan biarkan aku untuk 317 00:14:44,450 --> 00:14:45,800 sekarang kode keras 3. 318 00:14:45,800 --> 00:14:49,220 Dan aku besar-besaran merapikan mengacaukan yang saya buat. 319 00:14:49,220 --> 00:14:52,400 Sekarang, aku masih sulit kode 3, tapi bahkan 3 secara dinamis bisa datang dari 320 00:14:52,400 --> 00:14:54,350 pengguna, atau argv, atau sejenisnya. 321 00:14:54,350 --> 00:14:55,720 Jadi ini sudah bersih. 322 00:14:55,720 --> 00:15:00,100 >> Tapi apa yang menjengkelkan tentang ini adalah bahwa sekarang, nama meskipun entah bagaimana 323 00:15:00,100 --> 00:15:02,280 fundamental terkait dengan rumah siswa - 324 00:15:02,280 --> 00:15:04,720 itu adalah mahasiswa yang benar-benar ingin mewakili - 325 00:15:04,720 --> 00:15:08,080 Saya sekarang memiliki dua array yang sejajar dalam arti bahwa mereka adalah 326 00:15:08,080 --> 00:15:13,930 ukuran yang sama, dan nama braket 0 mungkin peta ke rumah braket 0, 327 00:15:13,930 --> 00:15:16,600 dan nama braket 1 peta ke rumah braket 1. 328 00:15:16,600 --> 00:15:19,280 Dengan kata lain, hidup mahasiswa bahwa dalam rumah itu, dan bahwa siswa lainnya 329 00:15:19,280 --> 00:15:20,530 hidup dalam rumah yang lain. 330 00:15:20,530 --> 00:15:23,720 Tapi tentunya ini bisa menjadi dilakukan bahkan lebih bersih. 331 00:15:23,720 --> 00:15:24,990 >> Yah, itu bisa, pada kenyataannya. 332 00:15:24,990 --> 00:15:28,730 Dan biarkan aku pergi ke depan dan membuka up structs.h, dan Anda akan 333 00:15:28,730 --> 00:15:31,130 melihat ide ini di sini. 334 00:15:31,130 --> 00:15:34,905 Perhatikan bahwa saya telah menggunakan typedef, karena Anda menyinggung beberapa saat yang lalu untuk menyatakan kami 335 00:15:34,905 --> 00:15:35,570 sendiri tipe data. 336 00:15:35,570 --> 00:15:39,660 Tapi aku juga menggunakan kata kunci ini lain disebut struct yang memberikan saya baru 337 00:15:39,660 --> 00:15:40,790 struktur data. 338 00:15:40,790 --> 00:15:43,980 >> Dan ini struktur data saya mengklaim akan memiliki dua hal dalam 339 00:15:43,980 --> 00:15:47,060 itu - string disebut nama, dan string disebut rumah. 340 00:15:47,060 --> 00:15:49,820 Dan nama saya akan memberikan kepada ini struktur data akan 341 00:15:49,820 --> 00:15:51,005 untuk disebut mahasiswa. 342 00:15:51,005 --> 00:15:54,030 Saya bisa menyebutnya apa pun yang saya inginkan, tapi ini membuat semantik 343 00:15:54,030 --> 00:15:55,810 akal untuk saya dalam pikiran saya. 344 00:15:55,810 --> 00:15:59,160 >> Jadi sekarang, jika saya membuka versi yang lebih baik dari program saya mulai menulis 345 00:15:59,160 --> 00:16:00,390 ada, biarkan aku gulir ke atas. 346 00:16:00,390 --> 00:16:03,190 Dan ada baris lagi kode di sini, tapi biarkan aku fokus untuk 347 00:16:03,190 --> 00:16:04,160 saat pada satu. 348 00:16:04,160 --> 00:16:07,790 Saya telah menyatakan apa yang disebut siswa konstan dan sulit kode 3 untuk saat ini. 349 00:16:07,790 --> 00:16:11,110 Tapi sekarang, perhatikan bagaimana bersih kode saya mulai mendapatkan. 350 00:16:11,110 --> 00:16:15,030 >> Sejalan 22, saya menyatakan array siswa. 351 00:16:15,030 --> 00:16:18,760 Dan melihat bahwa siswa ternyata sekarang tipe data. 352 00:16:18,760 --> 00:16:23,360 Karena pada bagian atas file ini, perhatikan Saya telah menyertakan file header 353 00:16:23,360 --> 00:16:24,820 bahwa saya berhenti beberapa saat yang lalu. 354 00:16:24,820 --> 00:16:28,820 Dan bahwa file header cukup hanya memiliki definisi mahasiswa. 355 00:16:28,820 --> 00:16:32,470 >> Jadi sekarang, saya telah membuat data kustom saya sendiri jenis yang penulis C tahun 356 00:16:32,470 --> 00:16:33,890 lalu tidak memikirkan di muka. 357 00:16:33,890 --> 00:16:34,570 Tapi tidak ada masalah. 358 00:16:34,570 --> 00:16:35,870 Aku bisa membuat sendiri. 359 00:16:35,870 --> 00:16:39,050 Jadi ini adalah sebuah array disebut siswa, masing-masing anggota yang 360 00:16:39,050 --> 00:16:41,100 adalah struktur siswa. 361 00:16:41,100 --> 00:16:44,270 Dan saya ingin tiga dari mereka dalam array. 362 00:16:44,270 --> 00:16:46,030 >> Dan sekarang, apa sisanya program ini lakukan? 363 00:16:46,030 --> 00:16:47,550 Aku butuh sesuatu yang sedikit sewenang-wenang. 364 00:16:47,550 --> 00:16:51,450 Jadi dari online 24 dan seterusnya, Aku iterate 0-3. 365 00:16:51,450 --> 00:16:54,000 Saya kemudian meminta pengguna untuk nama siswa. 366 00:16:54,000 --> 00:16:56,110 Dan kemudian saya menggunakan getString seperti sebelumnya. 367 00:16:56,110 --> 00:16:59,410 Kemudian saya meminta rumah siswa, dan saya menggunakan getString seperti sebelumnya. 368 00:16:59,410 --> 00:17:01,780 >> Tetapi perhatikan - sedikit baru sepotong sintaks - 369 00:17:01,780 --> 00:17:07,010 Aku masih bisa indeks kepada siswa-i, tapi bagaimana saya mendapatkan data spesifik 370 00:17:07,010 --> 00:17:08,354 dalam bidang struct? 371 00:17:08,354 --> 00:17:11,770 Nah, apa yang tampaknya bagian baru dari sintaks? 372 00:17:11,770 --> 00:17:13,339 Ini hanya dot operator. 373 00:17:13,339 --> 00:17:14,510 >> Kami telah benar-benar melihat ini sebelumnya. 374 00:17:14,510 --> 00:17:17,819 Anda sudah melihatnya di pset lima jika Anda sudah menyelam di sudah dengan file bitmap. 375 00:17:17,819 --> 00:17:22,372 Tapi titik hanya berarti dalam hal ini struct atau beberapa bidang, berikan dot 376 00:17:22,372 --> 00:17:24,510 nama, atau memberi saya dot rumah. 377 00:17:24,510 --> 00:17:28,690 Itu berarti masuk ke dalam struct dan bidang-bidang tertentu. 378 00:17:28,690 --> 00:17:30,200 >> Apa sisa program ini lakukan? 379 00:17:30,200 --> 00:17:31,190 Ini tidak semua yang seksi. 380 00:17:31,190 --> 00:17:34,640 Perhatikan bahwa saya iterate 0-3 lagi, dan aku hanya membuat Inggris 381 00:17:34,640 --> 00:17:40,500 frase seperti begitu dan begitu juga sedemikian dan rumah tersebut, lewat di nama dot dari 382 00:17:40,500 --> 00:17:43,320 mahasiswa-i dan mereka rumah juga. 383 00:17:43,320 --> 00:17:47,560 >> Dan kemudian terakhir, sekarang kita akan mulai untuk mendapatkan anal tentang ini, sekarang kita 384 00:17:47,560 --> 00:17:49,580 akrab dengan apa malloc dan fungsi lainnya telah 385 00:17:49,580 --> 00:17:50,570 lakukan selama ini. 386 00:17:50,570 --> 00:17:54,220 Mengapa saya harus membebaskan kedua nama dan rumah, meskipun saya 387 00:17:54,220 --> 00:17:56,960 tidak menelepon malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString lakukan. 389 00:17:58,020 --> 00:18:00,930 Dan itu adalah rahasia kecil yang kotor untuk beberapa minggu, tapi GetString memiliki 390 00:18:00,930 --> 00:18:03,530 telah bocor memori seluruh menempatkan semua semester sejauh ini. 391 00:18:03,530 --> 00:18:05,990 Dan Valgrand akan akhirnya mengungkapkan hal ini kepada kami. 392 00:18:05,990 --> 00:18:10,730 >> Tapi itu bukan masalah besar, karena saya tahu bahwa saya hanya bisa membebaskan nama 393 00:18:10,730 --> 00:18:15,750 dan rumah, meskipun secara teknis, untuk menjadi super, super aman, saya harus 394 00:18:15,750 --> 00:18:17,890 melakukan beberapa pengecekan error di sini. 395 00:18:17,890 --> 00:18:19,040 Apa yang naluri Anda memberitahu Anda? 396 00:18:19,040 --> 00:18:22,480 Apa yang harus saya memeriksa sebelum saya membebaskan apa itu 397 00:18:22,480 --> 00:18:25,470 String, alias yang char *? 398 00:18:25,470 --> 00:18:33,460 >> Aku benar-benar harus memeriksa apakah siswa braket i dot nama tidak 399 00:18:33,460 --> 00:18:34,840 nol sama. 400 00:18:34,840 --> 00:18:40,400 Kemudian akan OK untuk terus maju dan bebas pointer itu, dan yang sama atau yang lain 401 00:18:40,400 --> 00:18:41,160 satu juga. 402 00:18:41,160 --> 00:18:46,860 Jika siswa braket i dot rumah tidak sama dengan nol, sekarang ini akan melindungi 403 00:18:46,860 --> 00:18:52,520 terhadap kasus sudut di mana GetString mengembalikan sesuatu seperti null. 404 00:18:52,520 --> 00:18:57,310 Dan kami melihat beberapa saat yang lalu, printf akan melindungi kita di sini dengan hanya mengatakan 405 00:18:57,310 --> 00:18:58,990 null, yang akan terlihat aneh. 406 00:18:58,990 --> 00:19:02,340 Tapi setidaknya itu tidak akan segfault, sebagaimana telah kita lihat. 407 00:19:02,340 --> 00:19:05,990 >> Nah, biarkan aku melakukan satu hal lain di sini. structs-0 adalah jenis program yang bodoh 408 00:19:05,990 --> 00:19:09,700 karena saya memasukkan semua data ini, dan kemudian itu hilang setelah program berakhir. 409 00:19:09,700 --> 00:19:10,940 Tapi biarkan aku pergi ke depan dan melakukan hal ini. 410 00:19:10,940 --> 00:19:12,830 Mari saya membuat terminal jendela sedikit lebih besar. 411 00:19:12,830 --> 00:19:17,000 Mari saya membuat structs-1, yang adalah versi baru ini. 412 00:19:17,000 --> 00:19:18,520 >> Aku akan memperbesar sedikit. 413 00:19:18,520 --> 00:19:21,620 Dan sekarang biarkan aku menjalankan dot slash structs-1. 414 00:19:21,620 --> 00:19:22,590 Nama siswa - 415 00:19:22,590 --> 00:19:31,500 David Mather, mari kita lakukan Rob Kirkland, mari kita lakukan Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Yang menarik sekarang adalah pemberitahuan - 417 00:19:33,650 --> 00:19:35,540 dan aku hanya tahu ini karena Aku menulis program - 418 00:19:35,540 --> 00:19:38,930 ada file sekarang saat saya direktori bernama students.csv. 419 00:19:38,930 --> 00:19:40,420 Beberapa dari Anda mungkin telah melihat ini di dunia nyata. 420 00:19:40,420 --> 00:19:42,980 >> Apa file CSV? 421 00:19:42,980 --> 00:19:44,170 Comma-separated values. 422 00:19:44,170 --> 00:19:46,670 Ini semacam seperti orang miskin versi dari file Excel. 423 00:19:46,670 --> 00:19:50,580 Ini adalah tabel baris dan kolom yang Anda dapat membuka dalam program seperti Excel, 424 00:19:50,580 --> 00:19:51,800 atau Nomor pada Mac. 425 00:19:51,800 --> 00:19:55,180 >> Dan jika saya membuka file ini di sini di gedit, pemberitahuan - dan nomor tidak ada. 426 00:19:55,180 --> 00:19:57,360 Itu hanya gedit memberitahu saya nomor baris. 427 00:19:57,360 --> 00:19:59,740 Perhatikan pada baris pertama dari file David dan Mather. 428 00:19:59,740 --> 00:20:01,450 Baris berikutnya adalah Rob koma Kirkland. 429 00:20:01,450 --> 00:20:04,170 Dan baris ketiga adalah Lauren koma Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Jadi apa yang telah saya buat? 431 00:20:05,480 --> 00:20:09,580 Sekarang saya telah menulis sebuah program C yang efektif dapat menghasilkan spreadsheet 432 00:20:09,580 --> 00:20:11,840 yang dapat dibuka di program seperti Excel. 433 00:20:11,840 --> 00:20:15,520 Tidak semua yang menarik satu set data, tetapi jika Anda memiliki potongan yang jauh lebih besar 434 00:20:15,520 --> 00:20:18,440 data yang Anda benar-benar ingin memanipulasi dan membuat grafik dan 435 00:20:18,440 --> 00:20:21,260 suka, ini mungkin salah satu cara untuk membuat data. 436 00:20:21,260 --> 00:20:25,370 Selain itu, CSVs sebenarnya super umum hanya untuk menyimpan data sederhana - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, misalnya, jika Anda mendapatkan harga saham melalui disebut-mereka 438 00:20:28,940 --> 00:20:33,180 API, layanan gratis yang memungkinkan Anda mendapatkan arus saham up-to-the-date 439 00:20:33,180 --> 00:20:35,650 penawaran untuk perusahaan, mereka memberikan data kembali di 440 00:20:35,650 --> 00:20:37,800 Super format CSV sederhana. 441 00:20:37,800 --> 00:20:39,380 >> Jadi bagaimana kita melakukannya? 442 00:20:39,380 --> 00:20:42,530 Nah perhatikan, sebagian besar program ini hampir sama. 443 00:20:42,530 --> 00:20:46,870 Tapi perhatikan di sini, daripada cetak siswa keluar, on line 35 444 00:20:46,870 --> 00:20:51,040 selanjutnya, saya menyatakan bahwa saya menyimpan siswa ke disk, sehingga menyimpan file. 445 00:20:51,040 --> 00:20:53,630 >> Jadi perhatikan aku mendeklarasikan FILE * - 446 00:20:53,630 --> 00:20:57,260 sekarang, ini adalah jenis anomali dalam C. Untuk alasan apapun, FILE adalah semua topi, 447 00:20:57,260 --> 00:21:00,690 yang tidak seperti kebanyakan tipe data lain dalam C. Tapi ini adalah built-in 448 00:21:00,690 --> 00:21:02,320 tipe data, FILE *. 449 00:21:02,320 --> 00:21:05,900 Dan aku menyatakan pointer ke file, adalah bagaimana Anda bisa memikirkan itu. 450 00:21:05,900 --> 00:21:08,070 >> fopen berarti file yang terbuka. 451 00:21:08,070 --> 00:21:09,470 File apa yang Anda ingin buka? 452 00:21:09,470 --> 00:21:12,620 Saya ingin membuka file yang saya akan sewenang-wenang memanggil students.csv. 453 00:21:12,620 --> 00:21:14,480 Aku bisa menelepon bahwa apapun yang saya inginkan. 454 00:21:14,480 --> 00:21:15,200 >> Dan kemudian mengambil menebak. 455 00:21:15,200 --> 00:21:18,960 Apa argumen kedua untuk fopen mungkin berarti? 456 00:21:18,960 --> 00:21:21,480 Benar, w untuk write, bisa menjadi r untuk read. 457 00:21:21,480 --> 00:21:24,120 Ada untuk append jika Anda ingin menambahkan baris dan tidak 458 00:21:24,120 --> 00:21:25,200 menimpa semuanya. 459 00:21:25,200 --> 00:21:28,005 >> Tapi aku hanya ingin membuat file ini sekali, jadi saya akan menggunakan kutipan tanda kutip w. 460 00:21:28,005 --> 00:21:31,880 Dan aku tahu bahwa hanya dari setelah membaca dokumentasi, atau halaman manual. 461 00:21:31,880 --> 00:21:35,100 Jika file tidak nol - dengan kata lain, jika ada yang tidak beres di sana - 462 00:21:35,100 --> 00:21:37,820 biarkan aku iterate atas siswa berumur 0 sampai 3. 463 00:21:37,820 --> 00:21:40,410 >> Dan sekarang melihat ada sesuatu pernah jadi sedikit berbeda 464 00:21:40,410 --> 00:21:42,110 tentang line 41 di sini. 465 00:21:42,110 --> 00:21:42,960 Ini tidak printf. 466 00:21:42,960 --> 00:21:46,530 Ini fprintf file printf. 467 00:21:46,530 --> 00:21:47,790 Jadi itu akan menulis ke file. 468 00:21:47,790 --> 00:21:48,860 Mana file? 469 00:21:48,860 --> 00:21:53,630 Satu yang pointer Anda tentukan sebagai argumen pertama. 470 00:21:53,630 --> 00:21:55,940 >> Kemudian kita tentukan format string. 471 00:21:55,940 --> 00:21:59,660 Kemudian kita menentukan apa string yang kita ingin plug in untuk pertama persen s, dan 472 00:21:59,660 --> 00:22:04,320 maka variabel lain atau persen kedua s. 473 00:22:04,320 --> 00:22:06,760 Kemudian kita menutup file dengan fclose. 474 00:22:06,760 --> 00:22:09,380 Daripada aku membebaskan memori seperti sebelumnya, meskipun Aku harus kembali dan menambahkan 475 00:22:09,380 --> 00:22:10,540 beberapa pemeriksaan untuk null. 476 00:22:10,540 --> 00:22:12,090 >> Dan itu saja. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose memberi saya kemampuan untuk membuat file teks. 478 00:22:16,960 --> 00:22:19,640 Sekarang, Anda akan melihat dalam masalah set lima, yang melibatkan gambar, Anda akan menggunakan 479 00:22:19,640 --> 00:22:20,990 file biner sebagai gantinya. 480 00:22:20,990 --> 00:22:24,200 Tapi pada dasarnya, idenya adalah sama, meskipun fungsi Anda akan 481 00:22:24,200 --> 00:22:28,710 lihat adalah sedikit berbeda. 482 00:22:28,710 --> 00:22:32,580 >> Jadi tur angin puyuh, tetapi Anda akan mendapatkan semua terlalu akrab dengan berkas I/O-- 483 00:22:32,580 --> 00:22:34,960 input dan output - dengan pset lima. 484 00:22:34,960 --> 00:22:38,607 Dan pertanyaan tentang dasar-dasar awal di sini? 485 00:22:38,607 --> 00:22:39,857 Ya? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Bagaimana jika Anda mencoba untuk membebaskan nilai null? 488 00:22:43,710 --> 00:22:48,880 Saya percaya, kecuali gratis telah mendapat sedikit lebih user-friendly, Anda dapat 489 00:22:48,880 --> 00:22:49,890 berpotensi segfault. 490 00:22:49,890 --> 00:22:54,160 Lewat nol buruk karena saya tidak percaya bebas mengganggu untuk memeriksa Anda, 491 00:22:54,160 --> 00:22:57,330 karena berpotensi akan sia-sia waktu untuk itu untuk melakukan itu sendiri untuk 492 00:22:57,330 --> 00:22:59,022 semua orang di dunia. 493 00:22:59,022 --> 00:23:00,590 Pertanyaan bagus, meskipun. 494 00:23:00,590 --> 00:23:04,300 >> Baiklah, jadi ini semacam mendapat kita untuk topik yang menarik. 495 00:23:04,300 --> 00:23:07,010 Tema masalah set lima adalah forensik. 496 00:23:07,010 --> 00:23:08,420 Setidaknya itulah porsi dari sejumlah masalah. 497 00:23:08,420 --> 00:23:12,030 Forensik umumnya mengacu pada pemulihan informasi yang mungkin atau 498 00:23:12,030 --> 00:23:14,110 mungkin belum dihapus sengaja. 499 00:23:14,110 --> 00:23:18,680 Dan jadi saya pikir saya akan memberi Anda cepat rasa apa yang sebenarnya terjadi pada semua 500 00:23:18,680 --> 00:23:21,230 kali ini di bawah kap komputer Anda. 501 00:23:21,230 --> 00:23:23,960 >> Misalnya, jika Anda memiliki dalam Anda laptop atau komputer desktop Anda 502 00:23:23,960 --> 00:23:28,040 hard drive, itu baik mekanik perangkat yang benar-benar berputar - 503 00:23:28,040 --> 00:23:31,650 ada hal-hal melingkar yang disebut platter yang terlihat cukup seperti apa yang saya 504 00:23:31,650 --> 00:23:34,540 baru saja di layar di sini, meskipun ini sekolah semakin tua. 505 00:23:34,540 --> 00:23:37,370 Ini adalah tiga-dan-a-setengah inci hard drive. 506 00:23:37,370 --> 00:23:40,070 Dan tiga setengah inci mengacu dari dengan satu hal ketika Anda menginstalnya 507 00:23:40,070 --> 00:23:40,890 dalam komputer. 508 00:23:40,890 --> 00:23:44,890 >> Banyak dari kalian di laptop Anda sekarang memiliki solid-state drive, atau SSD, 509 00:23:44,890 --> 00:23:46,260 yang memiliki bagian yang bergerak. 510 00:23:46,260 --> 00:23:49,170 Mereka lebih seperti RAM dan kurang seperti perangkat ini mekanik. 511 00:23:49,170 --> 00:23:51,450 Tapi ide masih sama, tentu karena terkait 512 00:23:51,450 --> 00:23:52,790 masalah set lima. 513 00:23:52,790 --> 00:23:57,400 >> Dan jika Anda berpikir tentang sekarang hard drive merupakan menjadi sebuah lingkaran, yang 514 00:23:57,400 --> 00:23:58,930 Aku akan menggambar seperti ini di sini. 515 00:23:58,930 --> 00:24:02,290 Bila Anda membuat file di komputer Anda, apakah itu sebuah SSD, atau 516 00:24:02,290 --> 00:24:06,610 kasus ini, sebuah sekolah hard drive yang lebih tua, file itu terdiri dari beberapa bit. 517 00:24:06,610 --> 00:24:10,510 Mari kita mengatakan bahwa itu ini 0 dan 1, sejumlah besar 0s dan 1s. 518 00:24:10,510 --> 00:24:11,660 Jadi ini adalah seluruh hard drive saya. 519 00:24:11,660 --> 00:24:13,225 Hal ini tampaknya merupakan file yang cukup besar. 520 00:24:13,225 --> 00:24:18,080 Dan itu adalah menggunakan up 0s dan 1s pada saat itu bagian dari piring fisik. 521 00:24:18,080 --> 00:24:19,750 >> Nah, apa itu bagian fisik? 522 00:24:19,750 --> 00:24:25,310 Nah, ternyata pada hard drive, setidaknya jenis ini, ada 523 00:24:25,310 --> 00:24:27,340 kecil partikel-partikel magnetik kecil. 524 00:24:27,340 --> 00:24:32,630 Dan mereka pada dasarnya memiliki utara dan kutub selatan mereka, sehingga jika Anda 525 00:24:32,630 --> 00:24:35,710 mengubah salah satu partikel magnetik cara ini, Anda mungkin mengatakan bahwa itu 526 00:24:35,710 --> 00:24:36,720 mewakili 1. 527 00:24:36,720 --> 00:24:39,340 Dan jika itu terbalik selatan ke utara, Anda mungkin mengatakan bahwa itu 528 00:24:39,340 --> 00:24:40,390 mewakili 0. 529 00:24:40,390 --> 00:24:43,660 >> Jadi dalam dunia fisik yang nyata, itu bagaimana Anda bisa mewakili sesuatu dalam 530 00:24:43,660 --> 00:24:45,670 biner keadaan 0 dan 1. 531 00:24:45,670 --> 00:24:46,720 Jadi itu semua file adalah. 532 00:24:46,720 --> 00:24:49,300 Ada sejumlah besar magnetik partikel yang mereka dengan cara ini atau 533 00:24:49,300 --> 00:24:51,920 cara ini, menciptakan pola 0s dan 1s. 534 00:24:51,920 --> 00:24:56,760 >> Tapi ternyata ketika Anda menyimpan file, beberapa informasi disimpan secara terpisah. 535 00:24:56,760 --> 00:25:00,000 Jadi ini adalah meja kecil, direktori, sehingga untuk berbicara. 536 00:25:00,000 --> 00:25:05,810 Dan saya akan menyebutnya nama kolom, dan Aku akan menelepon kolom ini lokasi. 537 00:25:05,810 --> 00:25:08,850 >> Dan aku akan mengatakan, misalkan ini adalah resume saya. 538 00:25:08,850 --> 00:25:14,050 Resume.doc saya disimpan pada lokasi, katakanlah 123. 539 00:25:14,050 --> 00:25:15,390 Aku selalu pergi untuk nomor itu. 540 00:25:15,390 --> 00:25:18,810 Tapi cukup untuk mengatakan bahwa sama seperti dalam RAM, Anda dapat mengambil hard drive 541 00:25:18,810 --> 00:25:22,350 itu adalah gigabyte atau 200 gigabyte atau terabyte, dan Anda dapat 542 00:25:22,350 --> 00:25:23,750 jumlah semua byte. 543 00:25:23,750 --> 00:25:26,480 Anda dapat nomor semua potongan 8 bit. 544 00:25:26,480 --> 00:25:29,030 >> Jadi kita akan mengatakan bahwa ini adalah lokasi 123. 545 00:25:29,030 --> 00:25:32,070 Jadi direktori ini dalam operasi saya sistem ingat bahwa saya 546 00:25:32,070 --> 00:25:34,250 Resume adalah di lokasi 123. 547 00:25:34,250 --> 00:25:36,850 Tapi akan menarik ketika Anda menghapus file. 548 00:25:36,850 --> 00:25:37,820 >> Jadi misalnya - 549 00:25:37,820 --> 00:25:40,790 dan untungnya, sebagian besar dunia memiliki tertangkap ke ini - apa yang terjadi ketika 550 00:25:40,790 --> 00:25:45,040 Anda menyeret file ke Mac OS Sampah atau Anda Windows Recycle Bin? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Apa tujuan melakukan hal itu? 553 00:25:50,510 --> 00:25:53,860 Ini jelas untuk menyingkirkan file, tapi apa tindakan menyeret dan 554 00:25:53,860 --> 00:25:57,550 menjatuhkan ke Sampah atau Anda Recycle Bin lakukan pada komputer? 555 00:25:57,550 --> 00:25:59,230 >> Benar-benar tidak, benar-benar. 556 00:25:59,230 --> 00:26:00,320 Ini seperti folder. 557 00:26:00,320 --> 00:26:01,800 Ini adalah folder khusus, untuk memastikan. 558 00:26:01,800 --> 00:26:04,460 Tapi apakah itu benar-benar menghapus file? 559 00:26:04,460 --> 00:26:06,780 >> Yah, tidak, karena beberapa dari Anda mungkin telah seperti, oh sialan, Anda tidak 560 00:26:06,780 --> 00:26:07,420 bermaksud melakukan itu. 561 00:26:07,420 --> 00:26:09,130 Jadi Anda klik dua kali Sampah atau Recycle Bin. 562 00:26:09,130 --> 00:26:11,630 Anda sudah menjulurkan sekitar dan Anda telah pulih file hanya dengan menyeretnya 563 00:26:11,630 --> 00:26:12,110 keluar dari sana. 564 00:26:12,110 --> 00:26:14,420 Jadi jelas, hal itu belum tentu menghapusnya. 565 00:26:14,420 --> 00:26:15,990 >> OK, Anda lebih cerdas dari itu. 566 00:26:15,990 --> 00:26:18,860 Anda tahu bahwa hanya menyeret ke dalam Sampah atau Recycle Bin tidak berarti 567 00:26:18,860 --> 00:26:19,930 Anda mengosongkan tempat sampah. 568 00:26:19,930 --> 00:26:24,110 Jadi Anda pergi ke menu, dan Anda katakan Sampah Kosong atau Empty Recycle Bin. 569 00:26:24,110 --> 00:26:25,360 Lalu apa yang terjadi? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Ya, jadi dihapus lebih. 572 00:26:32,530 --> 00:26:37,660 Tapi semua yang terjadi adalah ini. 573 00:26:37,660 --> 00:26:45,350 Komputer lupa di mana resume.doc itu. 574 00:26:45,350 --> 00:26:47,400 >> Tapi apa yang tidak berubah rupanya dalam gambar? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Bit, 0s dan 1s yang saya klaim yang di situs dari beberapa aspek fisik 577 00:26:55,570 --> 00:26:56,280 perangkat keras. 578 00:26:56,280 --> 00:26:57,110 Mereka masih ada. 579 00:26:57,110 --> 00:26:58,930 Ini hanya komputer memiliki lupa apa yang mereka. 580 00:26:58,930 --> 00:27:03,160 >> Jadi itu dasarnya membebaskan file bit sehingga mereka dapat digunakan kembali. 581 00:27:03,160 --> 00:27:06,940 Tapi tidak sampai Anda menciptakan lebih banyak file, dan lebih file, dan lebih banyak file akan 582 00:27:06,940 --> 00:27:12,150 probabilistically, mereka 0s dan 1s, partikel-partikel magnetik, digunakan kembali, 583 00:27:12,150 --> 00:27:16,220 terbalik atau kanan sisi atas, untuk file lainnya, 0s dan 1s. 584 00:27:16,220 --> 00:27:17,980 >> Jadi Anda memiliki jendela waktu ini. 585 00:27:17,980 --> 00:27:19,860 Dan itu bukan dari diprediksi panjang, benar-benar. 586 00:27:19,860 --> 00:27:22,240 Hal ini tergantung pada ukuran hard drive dan berapa banyak file yang Anda miliki dan 587 00:27:22,240 --> 00:27:23,490 seberapa cepat Anda membuat yang baru. 588 00:27:23,490 --> 00:27:27,050 Tapi ada jendela ini waktu selama mana file yang masih sempurna 589 00:27:27,050 --> 00:27:27,770 dipulihkan. 590 00:27:27,770 --> 00:27:31,050 >> Jadi, jika Anda pernah menggunakan program seperti McAfee atau Norton untuk mencoba untuk memulihkan 591 00:27:31,050 --> 00:27:35,680 data, semua yang mereka lakukan adalah mencoba untuk memulihkan ini disebut direktori 592 00:27:35,680 --> 00:27:37,340 mencari tahu di mana file Anda itu. 593 00:27:37,340 --> 00:27:40,605 Dan kadang-kadang Norton dan akan berkata, file 93% dapat dipulihkan. 594 00:27:40,605 --> 00:27:42,020 Nah, apa artinya? 595 00:27:42,020 --> 00:27:45,690 Itu hanya berarti bahwa beberapa file lain kebetulan akhirnya menggunakan, katakanlah, 596 00:27:45,690 --> 00:27:48,920 mereka bit dari file asli Anda. 597 00:27:48,920 --> 00:27:51,950 >> Jadi apa yang sebenarnya terlibat dalam memulihkan data? 598 00:27:51,950 --> 00:27:55,720 Nah, jika Anda tidak memiliki sesuatu seperti Norton pra-instal pada komputer Anda, 599 00:27:55,720 --> 00:27:59,510 yang terbaik Anda kadang-kadang bisa lakukan adalah melihat di seluruh hard drive mencari 600 00:27:59,510 --> 00:28:00,510 pola bit. 601 00:28:00,510 --> 00:28:05,350 Dan salah satu tema masalah set lima adalah bahwa Anda akan mencari 602 00:28:05,350 --> 00:28:09,570 setara dengan hard drive, forensik gambar kartu compact flash dari 603 00:28:09,570 --> 00:28:13,660 kamera digital, mencari 0s dan 1s yang biasanya, dengan tinggi 604 00:28:13,660 --> 00:28:16,720 probabilitas, mewakili mulai dari gambar JPEG. 605 00:28:16,720 --> 00:28:21,120 >> Dan kalian bisa memulihkan gambar dengan dengan asumsi, jika saya melihat pola 606 00:28:21,120 --> 00:28:24,380 bit pada gambar forensik, dengan probabilitas tinggi, yang menandai 607 00:28:24,380 --> 00:28:25,650 awal dari JPEG. 608 00:28:25,650 --> 00:28:29,520 Dan jika saya melihat pola yang sama lagi, yang mungkin menandai dimulainya 609 00:28:29,520 --> 00:28:32,440 lain JPEG, dan lain JPEG, JPEG dan lain. 610 00:28:32,440 --> 00:28:34,970 Dan ini biasanya bagaimana data recovery akan bekerja. 611 00:28:34,970 --> 00:28:37,870 Apa yang baik tentang JPEG adalah meskipun format file itu sendiri agak 612 00:28:37,870 --> 00:28:44,400 kompleks, setiap awal seperti File sebenarnya cukup diidentifikasi 613 00:28:44,400 --> 00:28:47,370 dan sederhana, karena Anda akan melihat, kalau udah belum. 614 00:28:47,370 --> 00:28:50,270 >> Jadi mari kita lihat lebih dekat di bawahnya kap untuk apa sudah 615 00:28:50,270 --> 00:28:53,360 terjadi, dan apa ini 0s dan 1s adalah, untuk memberikan sedikit lebih dari 616 00:28:53,360 --> 00:28:55,330 konteks untuk tantangan ini. 617 00:28:55,330 --> 00:28:55,510 >> [VIDEO PEMUTARAN] 618 00:28:55,510 --> 00:28:58,700 >> Dimana-PC menyimpan sebagian data tetapnya. 619 00:28:58,700 --> 00:29:03,390 Untuk melakukan itu, data perjalanan dari RAM bersama dengan sinyal perangkat lunak yang memberitahu 620 00:29:03,390 --> 00:29:06,110 hard drive bagaimana untuk menyimpan data. 621 00:29:06,110 --> 00:29:09,410 Rangkaian hard drive menerjemahkan sinyal tersebut menjadi tegangan 622 00:29:09,410 --> 00:29:10,870 fluktuasi. 623 00:29:10,870 --> 00:29:14,970 Ini, pada gilirannya, mengontrol hard drive bagian yang bergerak, beberapa beberapa 624 00:29:14,970 --> 00:29:17,910 bagian yang bergerak tersisa di komputer modern. 625 00:29:17,910 --> 00:29:22,130 >> Beberapa sinyal kontrol motor yang berputar piring-piring berlapis logam. 626 00:29:22,130 --> 00:29:25,470 Data Anda sebenarnya disimpan pada piring-piring ini. 627 00:29:25,470 --> 00:29:28,610 Sinyal lain memindahkan membaca / menulis kepala untuk membaca atau 628 00:29:28,610 --> 00:29:30,710 menulis data pada piring-piring. 629 00:29:30,710 --> 00:29:35,450 Mesin ini sangat tepat bahwa manusia rambut bahkan tidak bisa melewati antara 630 00:29:35,450 --> 00:29:37,280 kepala dan berputar piring. 631 00:29:37,280 --> 00:29:40,316 Namun, semuanya bekerja pada kecepatan yang hebat. 632 00:29:40,316 --> 00:29:40,660 >> [END VIDEO PEMUTARAN] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: Zoom in sedikit lebih sekarang di apa 634 00:29:42,190 --> 00:29:44,360 benar-benar pada piring-piring. 635 00:29:44,360 --> 00:29:44,720 >> [VIDEO PEMUTARAN] 636 00:29:44,720 --> 00:29:47,660 >> -Mari kita lihat apa yang kita hanya melihat dalam gerakan lambat. 637 00:29:47,660 --> 00:29:51,710 Ketika pulsa singkat listrik dikirim ke membaca / menulis kepala, jika membalik 638 00:29:51,710 --> 00:29:54,650 pada elektromagnetik kecil untuk sepersekian detik. 639 00:29:54,650 --> 00:29:58,970 Magnet menciptakan medan, yang perubahan polaritas kecil, kecil 640 00:29:58,970 --> 00:30:02,850 bagian dari partikel logam yang melapisi setiap permukaan platter. 641 00:30:02,850 --> 00:30:05,940 >> Serangkaian pola kecil ini, dibebankan-up area pada disk 642 00:30:05,940 --> 00:30:08,470 mewakili satu bit data dalam bilangan biner 643 00:30:08,470 --> 00:30:10,530 sistem yang digunakan oleh komputer. 644 00:30:10,530 --> 00:30:13,775 Sekarang, jika saat ini dikirim satu arah melalui membaca / menulis kepala, daerah 645 00:30:13,775 --> 00:30:15,970 terpolarisasi dalam satu arah. 646 00:30:15,970 --> 00:30:17,950 Jika saat ini dikirim dalam arah sebaliknya, 647 00:30:17,950 --> 00:30:19,930 polarisasi terbalik. 648 00:30:19,930 --> 00:30:22,370 >> Bagaimana Anda mendapatkan data dari hard disk? 649 00:30:22,370 --> 00:30:24,090 Hanya membalik proses tersebut. 650 00:30:24,090 --> 00:30:26,550 Jadi partikel pada disk yang mendapatkan arus di 651 00:30:26,550 --> 00:30:27,960 membaca / menulis kepala bergerak. 652 00:30:27,960 --> 00:30:30,700 Mengumpulkan jutaan ini segmen magnet, dan 653 00:30:30,700 --> 00:30:32,160 Anda punya file. 654 00:30:32,160 --> 00:30:36,060 >> Sekarang, potongan-potongan dari file tunggal mungkin tersebar di seluruh drive yang 655 00:30:36,060 --> 00:30:39,970 piring-piring, jenis seperti kekacauan kertas di meja Anda. 656 00:30:39,970 --> 00:30:43,500 Jadi file tambahan khusus melacak di mana semuanya. 657 00:30:43,500 --> 00:30:45,985 Jangan Anda berharap Anda memiliki sesuatu seperti itu? 658 00:30:45,985 --> 00:30:46,470 >> [END VIDEO PEMUTARAN] 659 00:30:46,470 --> 00:30:47,820 >> DAVID Malan: OK, mungkin tidak. 660 00:30:47,820 --> 00:30:52,070 Jadi berapa banyak dari kalian dibesarkan dengan ini? 661 00:30:52,070 --> 00:30:53,970 OK, jadi semakin sedikit tangan setiap tahun. 662 00:30:53,970 --> 00:30:56,550 Tapi aku senang kau setidaknya akrab dengan mereka, karena ini dan kita sendiri 663 00:30:56,550 --> 00:31:00,520 Buku demo, sayangnya, sekarat sangat memperlambat kematian sini keakraban. 664 00:31:00,520 --> 00:31:04,010 >> Tapi ini adalah apa yang saya, setidaknya, kembali SMA, penggunaan digunakan untuk backup. 665 00:31:04,010 --> 00:31:08,110 Dan itu sangat mengagumkan, karena Anda bisa menyimpan 1,4 megabyte pada 666 00:31:08,110 --> 00:31:08,930 khusus ini disk yang. 667 00:31:08,930 --> 00:31:12,260 Dan ini adalah versi kepadatan tinggi, seperti yang ditunjukkan oleh HD, yang memiliki 668 00:31:12,260 --> 00:31:14,240 artinya sebelum video HD saat ini. 669 00:31:14,240 --> 00:31:16,400 >> Kepadatan standar adalah 800 kilobyte. 670 00:31:16,400 --> 00:31:18,640 Dan sebelum itu, ada Disk 400-kilobyte. 671 00:31:18,640 --> 00:31:23,120 Dan sebelum itu, ada 5 dan 1/4 inch disk, yang benar-benar floppy, 672 00:31:23,120 --> 00:31:25,680 dan sedikit lebih lebar dan lebih tinggi dari hal-hal di sini. 673 00:31:25,680 --> 00:31:29,150 Tapi Anda benar-benar dapat melihat apa yang disebut Aspek floppy disk ini. 674 00:31:29,150 --> 00:31:32,630 >> Dan fungsional, mereka benar-benar sangat mirip dengan hard drive di 675 00:31:32,630 --> 00:31:33,570 Setidaknya jenis ini. 676 00:31:33,570 --> 00:31:37,270 Sekali lagi, SSD dalam komputer baru bekerja sedikit berbeda. 677 00:31:37,270 --> 00:31:41,530 Tetapi jika Anda memindahkan bahwa tab logam kecil, Anda benar-benar dapat melihat kue kecil, 678 00:31:41,530 --> 00:31:42,560 atau piring. 679 00:31:42,560 --> 00:31:43,830 >> Ini bukan logam seperti ini. 680 00:31:43,830 --> 00:31:46,000 Yang satu ini benar-benar beberapa murah bahan plastik. 681 00:31:46,000 --> 00:31:46,750 Dan Anda dapat jenis menggoyangkan itu. 682 00:31:46,750 --> 00:31:50,310 Dan kau trully hanya dihapus beberapa jumlah bit atau partikel magnetik 683 00:31:50,310 --> 00:31:51,220 dari disk ini. 684 00:31:51,220 --> 00:31:52,710 >> Jadi untungnya, tidak ada di atasnya. 685 00:31:52,710 --> 00:31:55,790 Jika hal itu dalam cara - dan mencakup mata Anda dan orang-orang dari tetangga Anda - 686 00:31:55,790 --> 00:31:58,865 Anda dapat hanya semacam tarik ini selubung seluruh off seperti itu. 687 00:31:58,865 --> 00:32:01,900 Tapi ada sedikit air, jadi menyadari bahwa dengan mata Anda. 688 00:32:01,900 --> 00:32:03,620 Jadi sekarang Anda telah benar-benar floppy disk. 689 00:32:03,620 --> 00:32:07,090 >> Dan apa yang luar biasa tentang hal ini adalah bahwa dalam sebanyak ini adalah 690 00:32:07,090 --> 00:32:10,830 representasi skala kecil dari yang lebih besar hard drive, hal-hal yang super, 691 00:32:10,830 --> 00:32:11,590 super sederhana. 692 00:32:11,590 --> 00:32:15,170 Jika Anda mencubit bagian bawah itu, sekarang hal logam batal, dan kupas 693 00:32:15,170 --> 00:32:20,990 mereka terbuka, semua yang ada adalah dua potong dirasakan dan yang disebut disket 694 00:32:20,990 --> 00:32:22,930 dengan sepotong logam di dalam. 695 00:32:22,930 --> 00:32:25,990 >> Dan ada pergi setengah dari isi disk saya itu. 696 00:32:25,990 --> 00:32:27,540 Ada pergi setengah lagi dari mereka. 697 00:32:27,540 --> 00:32:31,375 Tapi itu semua yang berputar di dalam dari komputer Anda dalam tadi. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> Dan sekali lagi, untuk menempatkan ini dalam perspektif, seberapa besar adalah sebagian besar dari Anda 700 00:32:38,310 --> 00:32:39,560 hard drive hari ini? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabyte, terabyte, mungkin dalam sebuah komputer desktop, 2 terabyte, 3 703 00:32:46,230 --> 00:32:47,630 terabyte, 4 terabyte, kan? 704 00:32:47,630 --> 00:32:52,480 Ini adalah salah satu megabyte, memberi atau mengambil, yang bahkan tidak bisa cocok dengan MP3 khas 705 00:32:52,480 --> 00:32:55,310 lagi hari ini, atau beberapa File musik yang serupa. 706 00:32:55,310 --> 00:32:59,500 >> Jadi suvenir kecil untuk Anda hari ini, dan juga untuk membantu mengontekstualisasikan apa 707 00:32:59,500 --> 00:33:03,570 kita akan mengambil untuk diberikan sekarang dalam masalah set lima. 708 00:33:03,570 --> 00:33:04,820 Jadi mereka adalah milik Anda. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Jadi biar transisi ke mana akan menghabiskan pset berikutnya juga. 711 00:33:13,370 --> 00:33:18,470 Jadi sekarang kita telah menetapkan halaman ini untuk - oh, beberapa pengumuman cepat. 712 00:33:18,470 --> 00:33:21,730 >> Jumat ini, jika Anda ingin bergabung CS50 untuk makan siang, pergi ke tempat biasa, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 Dan tugas akhir - 715 00:33:25,100 --> 00:33:28,520 sehingga per silabus, kami telah diposting spesifikasi tugas akhir sudah. 716 00:33:28,520 --> 00:33:31,410 Sadarilah bahwa itu tidak berarti itu karena sangat segera. 717 00:33:31,410 --> 00:33:33,990 Ini diposting, benar-benar, hanya untuk mendapatkan kalian berpikir tentang hal itu. 718 00:33:33,990 --> 00:33:37,620 Dan memang, yang signifikan Super persentase Anda akan menangani 719 00:33:37,620 --> 00:33:40,780 proyek akhir tentang materi yang kita bahkan belum mendapatkan dalam kelas, 720 00:33:40,780 --> 00:33:42,730 tapi akan sebagai awal minggu depan. 721 00:33:42,730 --> 00:33:45,530 >> Perhatikan, meskipun, bahwa spec panggilan untuk beberapa komponen yang berbeda dari 722 00:33:45,530 --> 00:33:46,190 tugas akhir. 723 00:33:46,190 --> 00:33:49,590 Yang pertama, dalam beberapa minggu, adalah pra-proposal, email cukup santai untuk 724 00:33:49,590 --> 00:33:52,760 TF Anda untuk memberitahu dia atau apa yang Anda memikirkan untuk proyek Anda, dengan 725 00:33:52,760 --> 00:33:53,650 ada komitmen. 726 00:33:53,650 --> 00:33:56,710 Proposal akan khusus Anda komitmen, mengatakan, di sini, ini adalah apa yang 727 00:33:56,710 --> 00:33:57,770 Saya ingin lakukan untuk proyek saya. 728 00:33:57,770 --> 00:33:58,250 Bagaimana menurut Anda? 729 00:33:58,250 --> 00:33:58,650 Terlalu besar? 730 00:33:58,650 --> 00:33:59,145 Terlalu kecil? 731 00:33:59,145 --> 00:34:00,330 Apakah itu dikelola? 732 00:34:00,330 --> 00:34:02,230 Dan Anda lihat spec untuk lebih jelasnya. 733 00:34:02,230 --> 00:34:05,060 >> Beberapa minggu setelah itu adalah status Laporan, yang merupakan sama 734 00:34:05,060 --> 00:34:08,260 email kasual untuk TF Anda untuk mengatakan betapa jauh di belakang Anda berada di akhir Anda 735 00:34:08,260 --> 00:34:12,360 pelaksanaan proyek, diikuti oleh yang CS50 Hackathon yang semua orang 736 00:34:12,360 --> 00:34:17,520 adalah diundang, yang akan menjadi acara dari 20:00 pada satu malam sampai 7:00 737 00:34:17,520 --> 00:34:19,150 Pagi berikutnya. 738 00:34:19,150 --> 00:34:22,560 Pizza, seperti yang saya mungkin telah disebutkan dalam seminggu nol, wil disajikan di 9:00, 739 00:34:22,560 --> 00:34:24,120 Makanan Cina at 1:00 AM. 740 00:34:24,120 --> 00:34:27,929 Dan jika Anda masih terjaga di 05:00, kami akan mengarahkan Anda ke IHOP untuk sarapan. 741 00:34:27,929 --> 00:34:31,310 >> Jadi Hackathon adalah salah satu yang lebih pengalaman mengesankan di kelas. 742 00:34:31,310 --> 00:34:35,290 Kemudian pelaksanaannya jatuh tempo, dan maka klimaks CS50 Fair. 743 00:34:35,290 --> 00:34:38,070 Rincian lebih lanjut tentang semua ini dalam minggu-minggu yang akan datang. 744 00:34:38,070 --> 00:34:40,739 >> Tapi mari kita kembali ke sesuatu sekolah tua - 745 00:34:40,739 --> 00:34:41,920 lagi, array. 746 00:34:41,920 --> 00:34:45,040 Jadi array itu bagus, karena memecahkan masalah seperti yang kita lihat hanya 747 00:34:45,040 --> 00:34:49,290 saat yang lalu dengan struktur siswa mendapatkan sedikit keluar dari kontrol jika kita 748 00:34:49,290 --> 00:34:52,405 ingin memiliki siswa satu, dua mahasiswa, mahasiswa tiga, mahasiswa dot dot dot, 749 00:34:52,405 --> 00:34:54,400 beberapa nomor sewenang-wenang siswa. 750 00:34:54,400 --> 00:34:58,850 >> Jadi array, beberapa minggu yang lalu, menukik dan memecahkan semua masalah kami tidak 751 00:34:58,850 --> 00:35:03,340 mengetahui lebih dulu berapa banyak hal dari beberapa jenis mungkin kita inginkan. 752 00:35:03,340 --> 00:35:07,390 Dan kami telah melihat bahwa structs dapat membantu kita lebih mengatur kode kita dan menjaga 753 00:35:07,390 --> 00:35:11,660 variabel konseptual mirip, seperti nama dan rumah, bersama-sama, sehingga kita 754 00:35:11,660 --> 00:35:15,570 dapat memperlakukan mereka sebagai satu kesatuan, di dalam yang ada potongan-potongan kecil. 755 00:35:15,570 --> 00:35:17,810 >> Tapi array memiliki beberapa kelemahan. 756 00:35:17,810 --> 00:35:19,780 Apa adalah beberapa kelemahan kami temui 757 00:35:19,780 --> 00:35:22,320 dengan array sejauh ini? 758 00:35:22,320 --> 00:35:23,450 Apa itu? 759 00:35:23,450 --> 00:35:28,130 Ukuran tetap - jadi meskipun Anda mungkin dapat mengalokasikan memori untuk 760 00:35:28,130 --> 00:35:32,310 array, setelah Anda tahu berapa banyak siswa Anda miliki, berapa banyak karakter yang Anda miliki 761 00:35:32,310 --> 00:35:35,460 dari pengguna, setelah Anda dialokasikan array, Anda jenis dicat 762 00:35:35,460 --> 00:35:36,740 diri ke sudut. 763 00:35:36,740 --> 00:35:40,600 >> Karena Anda tidak bisa memasukkan unsur-unsur baru ke tengah-tengah array. 764 00:35:40,600 --> 00:35:43,660 Anda tidak dapat memasukkan lebih elemen pada akhir array. 765 00:35:43,660 --> 00:35:47,750 Sungguh, Anda harus resor untuk menciptakan array baru keseluruhan, seperti yang telah kita bahas, 766 00:35:47,750 --> 00:35:49,320 menyalin lama ke yang baru. 767 00:35:49,320 --> 00:35:52,610 Dan lagi, yaitu sakit kepala yang GetString berurusan dengan untuk Anda. 768 00:35:52,610 --> 00:35:56,170 >> Tapi sekali lagi, Anda bahkan tidak bisa memasukkan sesuatu ke tengah array 769 00:35:56,170 --> 00:35:58,200 jika angka ini tidak sepenuhnya diisi. 770 00:35:58,200 --> 00:36:03,010 Misalnya, jika array ini di sini ukuran enam hanya memiliki lima hal di dalamnya, 771 00:36:03,010 --> 00:36:06,080 baik, Anda bisa saja taktik sesuatu ke akhir. 772 00:36:06,080 --> 00:36:08,200 Tetapi bagaimana jika Anda ingin memasukkan sesuatu ke tengah 773 00:36:08,200 --> 00:36:11,280 array, meskipun mungkin memiliki lima dari enam hal di dalamnya? 774 00:36:11,280 --> 00:36:14,250 >> Nah, apa yang kita lakukan ketika kita memiliki semua sukarelawan manusia panggung di 775 00:36:14,250 --> 00:36:15,110 minggu terakhir? 776 00:36:15,110 --> 00:36:18,710 Jika kita ingin menempatkan seseorang di sini, baik orang-orang bagaimana untuk memindahkan 777 00:36:18,710 --> 00:36:22,540 cara, atau orang-orang bagaimana untuk memindahkan cara, dan yang menjadi mahal. 778 00:36:22,540 --> 00:36:26,950 Pergeseran orang di dalam suatu Array akhirnya menambahkan dan biaya 779 00:36:26,950 --> 00:36:31,240 kami waktu, maka banyak n kuadrat kami berjalan saat seperti insertion sort, untuk 780 00:36:31,240 --> 00:36:32,550 Misalnya, dalam kasus terburuk. 781 00:36:32,550 --> 00:36:36,520 Jadi array yang besar, tetapi Anda harus mengetahui terlebih dahulu seberapa besar Anda ingin mereka. 782 00:36:36,520 --> 00:36:38,030 >> Jadi OK, inilah solusi. 783 00:36:38,030 --> 00:36:43,860 Jika saya tidak tahu sebelumnya berapa banyak siswa saya mungkin memiliki, dan aku tahu sekali 784 00:36:43,860 --> 00:36:47,870 Saya memutuskan, meskipun, aku terjebak dengan itu banyak siswa, kenapa tidak aku hanya selalu 785 00:36:47,870 --> 00:36:51,740 mengalokasikan dua kali lebih banyak ruang karena saya mungkin berpikir saya butuhkan? 786 00:36:51,740 --> 00:36:54,450 Apakah itu bukan solusi yang masuk akal? 787 00:36:54,450 --> 00:36:58,240 >> Realistis, saya tidak berpikir bahwa kita akan membutuhkan lebih dari 50 slot 788 00:36:58,240 --> 00:37:02,190 dalam sebuah array untuk kelas menengah, jadi mari kita mengumpulkan. 789 00:37:02,190 --> 00:37:07,040 Aku akan membuat 100 slot di array saya, hanya sehingga kita pasti bisa mendapatkan 790 00:37:07,040 --> 00:37:10,330 jumlah siswa saya berharap untuk dalam beberapa kelas menengah. 791 00:37:10,330 --> 00:37:14,320 Jadi, mengapa tidak mengumpulkan dan mengalokasikan lebih banyak memori, biasanya, untuk array 792 00:37:14,320 --> 00:37:16,290 dari yang Anda pikir Anda mungkin bahkan perlu? 793 00:37:16,290 --> 00:37:20,190 Apa ini pushback sederhana ide itu? 794 00:37:20,190 --> 00:37:21,440 >> Kau hanya membuang-buang memori. 795 00:37:21,440 --> 00:37:25,350 Secara harfiah setiap program yang Anda tulis kemudian ini mungkin menggunakan dua kali lebih banyak memori 796 00:37:25,350 --> 00:37:26,680 Anda benar-benar perlu. 797 00:37:26,680 --> 00:37:28,990 Dan itu hanya tidak merasa seperti khususnya solusi elegan. 798 00:37:28,990 --> 00:37:31,990 Selain itu, itu hanya menurunkan kemungkinan masalah. 799 00:37:31,990 --> 00:37:35,300 Jika Anda kebetulan memiliki program populer satu semester dan Anda memiliki 101 800 00:37:35,300 --> 00:37:39,610 siswa, program Anda masih fundamental menghadapi masalah yang sama. 801 00:37:39,610 --> 00:37:44,280 >> Jadi untungnya, ada solusi untuk Iklan ini semua masalah kita dalam bentuk 802 00:37:44,280 --> 00:37:46,790 struktur data yang lebih kompleks daripada yang 803 00:37:46,790 --> 00:37:47,970 kita lihat sejauh ini. 804 00:37:47,970 --> 00:37:50,530 Ini, saya menyatakan, adalah linked list. 805 00:37:50,530 --> 00:37:51,920 Ini adalah daftar nomor - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, dan 34 - 807 00:37:54,970 --> 00:38:00,120 yang telah terhubung bersama-sama dengan cara dari apa yang saya sudah ditarik sebagai panah. 808 00:38:00,120 --> 00:38:03,580 >> Dengan kata lain, jika saya ingin untuk mewakili array, aku bisa melakukan 809 00:38:03,580 --> 00:38:04,910 sesuatu seperti ini. 810 00:38:04,910 --> 00:38:07,310 Dan aku akan menempatkan ini di biaya overhead hanya dalam beberapa saat. 811 00:38:07,310 --> 00:38:09,970 Aku bisa melakukan - 812 00:38:09,970 --> 00:38:12,520 halo, baiklah. 813 00:38:12,520 --> 00:38:14,470 Stand by. 814 00:38:14,470 --> 00:38:17,360 Komputer baru di sini, jelas - 815 00:38:17,360 --> 00:38:18,090 baik-baik saja. 816 00:38:18,090 --> 00:38:21,730 >> Jadi jika saya memiliki angka-angka ini dalam array - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 belum tentu untuk skala. 819 00:38:30,530 --> 00:38:33,730 Baiklah, jadi di sini adalah array saya - 820 00:38:33,730 --> 00:38:34,980 oh my god. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Baiklah, jadi di sini adalah array saya. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh my god. 825 00:38:45,050 --> 00:38:48,820 >> [Tertawa] 826 00:38:48,820 --> 00:38:49,440 >> DAVID Malan: Berpura-pura. 827 00:38:49,440 --> 00:38:52,330 Ini terlalu banyak usaha untuk kembali dan memperbaikinya, sehingga ada - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Jadi kita memiliki ini array 9, 17, 22, 26, dan 34. 830 00:38:57,650 --> 00:39:00,260 Bagi Anda bisa melihat kesalahan yang memalukan Aku hanya membuat, 831 00:39:00,260 --> 00:39:00,830 ada itu. 832 00:39:00,830 --> 00:39:04,490 >> Jadi saya mengklaim bahwa ini adalah solusi yang sangat efisien. 833 00:39:04,490 --> 00:39:07,310 Aku sudah dialokasikan sebanyak ints sebagai Saya perlu - satu, dua, tiga, 834 00:39:07,310 --> 00:39:09,100 empat, lima, atau enam - 835 00:39:09,100 --> 00:39:11,660 dan aku kemudian disimpan nomor dalam array ini. 836 00:39:11,660 --> 00:39:15,220 Tapi bagaimana, kemudian, saya ingin memasukkan nilai seperti angka 8? 837 00:39:15,220 --> 00:39:16,100 Nah, mana pergi? 838 00:39:16,100 --> 00:39:18,530 Misalkan saya ingin menyisipkan nomor seperti 20. 839 00:39:18,530 --> 00:39:19,790 Nah, mana pergi? 840 00:39:19,790 --> 00:39:23,160 Di suatu tempat ada di tengah, atau nomor 35 harus pergi 841 00:39:23,160 --> 00:39:24,010 di suatu tempat di akhir. 842 00:39:24,010 --> 00:39:25,320 Tapi aku semua keluar dari ruang. 843 00:39:25,320 --> 00:39:29,120 >> Dan jadi ini adalah tantangan mendasar array yang tidak adalah solusinya. 844 00:39:29,120 --> 00:39:32,280 Saya mengklaim beberapa saat yang lalu, getString memecahkan masalah ini. 845 00:39:32,280 --> 00:39:37,380 Jika Anda ingin memasukkan nomor keenam ke dalam array ini, apa setidaknya satu 846 00:39:37,380 --> 00:39:40,090 solusi yang Anda dapat jatuh kembali untuk yakin, seperti yang kita lakukan dengan GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Apa itu? 849 00:39:46,030 --> 00:39:48,190 >> Nah, membuatnya lebih besar adalah mudah diucapkan daripada dilakukan. 850 00:39:48,190 --> 00:39:52,810 Kita tidak bisa selalu membuat array lebih besar, tapi apa yang bisa kita lakukan? 851 00:39:52,810 --> 00:39:56,570 Membuat array baru yang lebih besar, ukuran 6, atau mungkin ukuran 10, jika kita ingin 852 00:39:56,570 --> 00:40:00,490 untuk maju hal, dan kemudian salin array yang lama ke yang baru, dan kemudian 853 00:40:00,490 --> 00:40:01,680 membebaskan array yang lama. 854 00:40:01,680 --> 00:40:05,770 >> Tapi apa waktu berjalan sekarang proses itu? 855 00:40:05,770 --> 00:40:09,870 Ini O besar n, karena penyalinan akan dikenakan biaya beberapa unit 856 00:40:09,870 --> 00:40:13,480 waktu, jadi tidak begitu ideal jika kita harus mengalokasikan sebuah array baru, yang akan 857 00:40:13,480 --> 00:40:15,610 mengkonsumsi dua kali lebih banyak memori sementara. 858 00:40:15,610 --> 00:40:16,660 Kopi lama ke yang baru - 859 00:40:16,660 --> 00:40:18,800 Maksudku, itu hanya sakit kepala, yang adalah, sekali lagi, mengapa kita menulis 860 00:40:18,800 --> 00:40:19,920 GetString untuk Anda. 861 00:40:19,920 --> 00:40:21,380 >> Jadi apa yang bisa kita lakukan? 862 00:40:21,380 --> 00:40:25,000 Nah, bagaimana jika struktur data kami sebenarnya memiliki kesenjangan di dalamnya? 863 00:40:25,000 --> 00:40:30,790 Misalkan saya rileks tujuan saya memiliki potongan memori yang berdekatan di mana 9 864 00:40:30,790 --> 00:40:34,500 tepat di sebelah 17, yang tepat di sebelah 22, dan seterusnya. 865 00:40:34,500 --> 00:40:39,570 >> Dan anggaplah bahwa 9 bisa di sini di RAM, dan 17 dapat over sini dalam RAM, 866 00:40:39,570 --> 00:40:40,990 dan 22 dapat over sini dalam RAM. 867 00:40:40,990 --> 00:40:43,610 Dengan kata lain, saya tidak membutuhkan mereka bahkan kembali ke belakang lagi. 868 00:40:43,610 --> 00:40:47,850 Aku hanya harus entah bagaimana benang jarum melalui masing-masing nomor, atau masing-masing 869 00:40:47,850 --> 00:40:51,010 node ini, karena kami akan memanggil persegi panjang seperti yang telah saya ditarik mereka, 870 00:40:51,010 --> 00:40:55,670 ingat bagaimana untuk sampai ke terakhir simpul tersebut dari yang pertama. 871 00:40:55,670 --> 00:40:59,940 >> Jadi apa pemrograman membangun kami telah melihat cukup baru-baru ini yang saya 872 00:40:59,940 --> 00:41:03,030 dapat menerapkan thread itu, atau ditarik di sini, yang saya bisa 873 00:41:03,030 --> 00:41:05,430 mengimplementasikan panah? 874 00:41:05,430 --> 00:41:06,500 Pointer Jadi, kan? 875 00:41:06,500 --> 00:41:09,560 Jika saya mengalokasikan bukan hanya int, tapi simpul - dan dengan 876 00:41:09,560 --> 00:41:10,810 node, saya hanya berarti wadah. 877 00:41:10,810 --> 00:41:12,900 Dan visual, maksudku persegi panjang. 878 00:41:12,900 --> 00:41:16,420 Jadi node tampaknya perlu mengandung dua nilai - 879 00:41:16,420 --> 00:41:21,490 int sendiri, dan kemudian, seperti yang tersirat oleh bagian bawah persegi panjang, 880 00:41:21,490 --> 00:41:23,010 cukup ruang untuk int. 881 00:41:23,010 --> 00:41:26,130 >> Jadi hanya berpikir ke depan di sini, seberapa besar node ini, ini 882 00:41:26,130 --> 00:41:27,170 kontainer tersebut? 883 00:41:27,170 --> 00:41:29,250 Berapa banyak byte untuk int? 884 00:41:29,250 --> 00:41:31,310 Agaknya 4, jika sama seperti biasa. 885 00:41:31,310 --> 00:41:33,270 Dan kemudian berapa banyak byte untuk pointer? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Jadi wadah ini, atau node ini, adalah akan menjadi struktur 8-byte. 888 00:41:37,940 --> 00:41:41,760 Oh, dan itu suatu kebetulan senang bahwa kami hanya memperkenalkan gagasan ini 889 00:41:41,760 --> 00:41:44,400 struct, atau struktur C. 890 00:41:44,400 --> 00:41:48,890 >> Jadi saya menyatakan bahwa saya ingin mengambil langkah arah ini lebih canggih 891 00:41:48,890 --> 00:41:52,560 pelaksanaan daftar nomor, a linked list nomor, saya perlu melakukan 892 00:41:52,560 --> 00:41:56,920 sedikit lebih berpikir ke depan dan menyatakan bukan hanya sebuah int tetapi struct 893 00:41:56,920 --> 00:41:58,620 bahwa saya akan menelepon, konvensional sini, simpul. 894 00:41:58,620 --> 00:42:01,630 Kita bisa menyebutnya apa pun yang kita inginkan, tetapi node akan tematik dalam banyak 895 00:42:01,630 --> 00:42:03,560 satu hal yang kita mulai melihat sekarang. 896 00:42:03,560 --> 00:42:06,480 >> Di dalam simpul yang merupakan n int. 897 00:42:06,480 --> 00:42:09,350 Dan kemudian sintaks ini, sedikit aneh pada pandangan pertama - 898 00:42:09,350 --> 00:42:12,960 struct simpul * berikutnya. 899 00:42:12,960 --> 00:42:16,900 Nah pictorially, apa itu? 900 00:42:16,900 --> 00:42:21,000 Itulah bagian bawah persegi panjang yang kami lihat 901 00:42:21,000 --> 00:42:22,730 beberapa saat yang lalu. 902 00:42:22,730 --> 00:42:27,600 >> Tapi mengapa saya katakan struct simpul * sebagai lawan hanya simpul *? 903 00:42:27,600 --> 00:42:31,370 Karena jika pointer yang menunjuk di node lain, itu hanya 904 00:42:31,370 --> 00:42:32,760 alamat node. 905 00:42:32,760 --> 00:42:35,630 Itu konsisten dengan apa yang kita sudah dibahas tentang pointer sejauh ini. 906 00:42:35,630 --> 00:42:39,690 Tapi mengapa, jika saya mengklaim struktur ini disebut node, saya harus mengatakan struct 907 00:42:39,690 --> 00:42:42,660 simpul dalam sini? 908 00:42:42,660 --> 00:42:43,190 >> Tepat. 909 00:42:43,190 --> 00:42:46,490 Ini semacam realitas bodoh C. Typedef, sehingga untuk berbicara, belum 910 00:42:46,490 --> 00:42:47,220 belum terjadi. 911 00:42:47,220 --> 00:42:48,510 C adalah SUPER literal. 912 00:42:48,510 --> 00:42:51,050 Bunyinya atas kode Anda bawah, kiri ke kanan. 913 00:42:51,050 --> 00:42:54,930 Dan sampai hits koma yang pada Intinya, tebak apa yang tidak 914 00:42:54,930 --> 00:42:57,590 ada sebagai tipe data? 915 00:42:57,590 --> 00:42:59,060 Node, kutipan tanda kutip simpul. 916 00:42:59,060 --> 00:43:03,050 >> Tetapi karena lebih verbose deklarasi saya lakukan pada baris pertama - 917 00:43:03,050 --> 00:43:05,340 typedef struct simpul - 918 00:43:05,340 --> 00:43:08,790 karena yang datang terlebih dahulu, sebelum kurung kurawal, itu semacam 919 00:43:08,790 --> 00:43:11,800 pra-mendidik dentang itu, Anda tahu apa, beri saya struct 920 00:43:11,800 --> 00:43:13,570 disebut struct simpul. 921 00:43:13,570 --> 00:43:16,270 Terus terang, saya tidak suka hal-hal yang menelepon struct node, struct simpul semua 922 00:43:16,270 --> 00:43:17,090 seluruh kode saya. 923 00:43:17,090 --> 00:43:20,660 Tapi saya hanya akan menggunakannya sekali, hanya di dalam, sehingga saya dapat secara efektif 924 00:43:20,660 --> 00:43:25,010 membuat semacam referensi melingkar, tidak pointer untuk diriku sendiri per se, tetapi 925 00:43:25,010 --> 00:43:29,400 pointer ke lain jenis identik. 926 00:43:29,400 --> 00:43:32,330 >> Jadi ternyata bahwa pada struktur data seperti ini, ada beberapa 927 00:43:32,330 --> 00:43:34,470 operasi yang mungkin menarik bagi kami. 928 00:43:34,470 --> 00:43:37,460 Kita mungkin ingin memasukkan ke dalam daftar seperti ini. 929 00:43:37,460 --> 00:43:39,850 Kita mungkin ingin menghapus dari daftar seperti ini. 930 00:43:39,850 --> 00:43:43,490 Kita mungkin ingin mencari daftar untuk nilai, atau lebih umum, melintasi. 931 00:43:43,490 --> 00:43:46,410 Dan melintasi adalah cara mewah mengatakan mulai kiri dan memindahkan semua 932 00:43:46,410 --> 00:43:47,650 jalan ke kanan. 933 00:43:47,650 --> 00:43:52,640 >> Dan perhatikan, bahkan dengan sedikit lebih struktur data yang canggih, biarkan 934 00:43:52,640 --> 00:43:56,510 saya mengusulkan agar kita bisa meminjam beberapa ide-ide dari dua minggu terakhir dan 935 00:43:56,510 --> 00:43:58,410 melaksanakan fungsi yang disebut pencarian seperti ini. 936 00:43:58,410 --> 00:44:01,360 Ini akan kembali benar atau palsu, menunjukkan, ya atau 937 00:44:01,360 --> 00:44:03,390 tidak, n dalam daftar. 938 00:44:03,390 --> 00:44:05,960 Argumen kedua adalah pointer ke daftar itu sendiri, sehingga 939 00:44:05,960 --> 00:44:07,920 pointer ke node. 940 00:44:07,920 --> 00:44:10,350 >> Semua aku akan kemudian lakukan adalah menyatakan variabel sementara. 941 00:44:10,350 --> 00:44:12,730 Kita akan menyebutnya ptr oleh konvensi, untuk pointer. 942 00:44:12,730 --> 00:44:15,220 Dan saya menetapkan sama dengan awal daftar. 943 00:44:15,220 --> 00:44:16,680 >> Dan sekarang melihat loop sementara. 944 00:44:16,680 --> 00:44:20,640 Selama pointer tidak sama null, aku akan memeriksa. 945 00:44:20,640 --> 00:44:24,520 Apakah pointer panah n sama dengan n yang disahkan pada? 946 00:44:24,520 --> 00:44:26,410 Dan tunggu dulu - baru sepotong sintaks. 947 00:44:26,410 --> 00:44:29,324 Apa panah tiba-tiba? 948 00:44:29,324 --> 00:44:30,574 Ya? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Tepat. 951 00:44:34,810 --> 00:44:38,860 Jadi sedangkan beberapa menit yang lalu, kami menggunakan dot notasi untuk mengakses sesuatu 952 00:44:38,860 --> 00:44:43,080 dalam sebuah struct, jika variabel Anda tidak struct 953 00:44:43,080 --> 00:44:47,420 sendiri, tetapi pointer ke struct, Untungnya, sepotong sintaks yang 954 00:44:47,420 --> 00:44:48,620 akhirnya masuk akal intuitif. 955 00:44:48,620 --> 00:44:52,360 Panah berarti mengikuti pointer, seperti panah kami biasanya berarti 956 00:44:52,360 --> 00:44:56,570 pictorially, dan pergi data di dalam lapangan. 957 00:44:56,570 --> 00:44:59,700 Jadi panah adalah hal yang sama seperti titik, tapi Anda menggunakannya ketika Anda memiliki pointer. 958 00:44:59,700 --> 00:45:05,270 >> Jadi hanya untuk rekap kemudian, jika bidang n dalam struct disebut pointer 959 00:45:05,270 --> 00:45:07,760 sama sama n, kembali benar. 960 00:45:07,760 --> 00:45:11,970 Jika tidak, baris ini di sini - pointer sama dengan pointer berikutnya. 961 00:45:11,970 --> 00:45:17,540 Jadi apa ini yang dilakukan, pemberitahuan, jika saya saya sedang menunjuk pada struct 962 00:45:17,540 --> 00:45:21,430 mengandung 9, dan 9 tidak nomor Saya mencari - kira saya sedang mencari 963 00:45:21,430 --> 00:45:22,830 untuk n sama dengan 50 - 964 00:45:22,830 --> 00:45:25,930 Aku akan memperbarui pointer sementara saya untuk tidak menunjuk pada simpul ini 965 00:45:25,930 --> 00:45:31,190 lagi, tapi pointer panah di sebelah, yang akan menempatkan saya di sini. 966 00:45:31,190 --> 00:45:34,270 >> Sekarang, saya menyadari adalah angin puyuh pengantar. 967 00:45:34,270 --> 00:45:37,380 Pada hari Rabu, kita benar-benar akan melakukan ini dengan beberapa manusia dan dengan beberapa lebih 968 00:45:37,380 --> 00:45:38,900 kode lebih lambat. 969 00:45:38,900 --> 00:45:42,990 Tetapi menyadari, kita sekarang membuat data kami struktur yang lebih kompleks sehingga kami 970 00:45:42,990 --> 00:45:45,780 algoritma bisa lebih efisien, yang akan menjadi prasyarat bagi 971 00:45:45,780 --> 00:45:50,500 pset enam, ketika kita memuat dalam, sekali lagi, mereka 150.000 kata, tapi harus melakukannya 972 00:45:50,500 --> 00:45:55,650 efisien, dan idealnya, membuat Program yang berjalan selama pengguna kami tidak 973 00:45:55,650 --> 00:46:00,460 linear, tidak n kuadrat, tetapi dalam waktu yang konstan, dalam ideal. 974 00:46:00,460 --> 00:46:02,300 >> Kita akan melihat Anda pada hari Rabu. 975 00:46:02,300 --> 00:46:07,240 >> SPEAKER: Pada CS50 berikutnya, David lupa kasus basisnya. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: Dan itulah bagaimana Anda mengirim pesan teks dengan C. Apa yang - 977 00:46:12,770 --> 00:46:14,020 >> [BERBAGAI PESAN TEKS PEMBERITAHUAN SOUNDS] 978 00:46:14,020 --> 00:46:19,734