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 permulaan minggu tujuh. 5 00:00:15,130 --> 00:00:18,890 Jadi ia telah seketika, jadi saya fikir kita akan mengambil lawatan badai di mana kita 6 00:00:18,890 --> 00:00:20,760 berhenti dan di mana kita sedang kini berterusan. 7 00:00:20,760 --> 00:00:23,310 >> Jadi perkara ini di sini mungkin mempunyai menyebabkan beberapa angst pada mulanya. 8 00:00:23,310 --> 00:00:27,680 Tetapi diharapkan, anda mula acclimate kepada apa ini menandakan di sini - 9 00:00:27,680 --> 00:00:32,670 bintang yang mewakili penunjuk, yang merupakan apa, dari segi orang biasa lebih ini? 10 00:00:32,670 --> 00:00:33,400 Jadi ia adalah alamat. 11 00:00:33,400 --> 00:00:35,490 >> Jadi ia adalah alamat sesuatu dalam ingatan. 12 00:00:35,490 --> 00:00:38,260 Dan kita mula mengupas kembali lapisan a Beberapa minggu yang lalu, perkara-perkara seperti 13 00:00:38,260 --> 00:00:41,800 GetString dan lain-lain apa-apa fungsi sepanjang masa ini telah kembali 14 00:00:41,800 --> 00:00:46,010 alamat perkara dalam ingatan, seperti alamat watak pertama dalam 15 00:00:46,010 --> 00:00:46,990 urutan tertentu. 16 00:00:46,990 --> 00:00:50,360 >> Oleh itu, kita juga telah memperkenalkan valgrind, yang anda akan mula digunakan untuk masalah ini 17 00:00:50,360 --> 00:00:53,380 ditetapkan, terutamanya bagi yang akan datang masalah yang ditetapkan juga. 18 00:00:53,380 --> 00:00:54,980 Dan valgrind melakukan apa untuk kita? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Ia memeriksa kebocoran memori, dan ia juga memeriksa penyalahgunaan ingatan. 21 00:01:01,020 --> 00:01:05,890 >> Ia boleh, dengan beberapa kebarangkalian, mengesan jika kod anda akan menyentuh memori 22 00:01:05,890 --> 00:01:07,100 bahawa ia hanya tidak sepatutnya. 23 00:01:07,100 --> 00:01:10,410 Jadi tidak semestinya kebocoran, tetapi jika anda melampaui sempadan beberapa 24 00:01:10,410 --> 00:01:14,730 pelbagai, dan anda sebenarnya menjalankan valgrind dan mendorong tingkah laku yang sementara 25 00:01:14,730 --> 00:01:17,870 valgrind sedang berjalan dalam program anda adalah berjalan di dalam itu, anda akan mendapat 26 00:01:17,870 --> 00:01:21,460 mesej seperti ini - "tidak sah menulis saiz 4, "yang, ingat beberapa 27 00:01:21,460 --> 00:01:25,880 minggu lalu bermakna bahawa saya telah tidak sengaja suka pada satu int terlalu jauh 28 00:01:25,880 --> 00:01:27,250 melangkaui sempadan array. 29 00:01:27,250 --> 00:01:30,790 Dan sebagainya saiz 4 bermakna di sini saiz daripada int yang tertentu. 30 00:01:30,790 --> 00:01:35,260 >> Jadi mengambil jaminan dalam fakta bahawa output valgrind itu, format itu, 31 00:01:35,260 --> 00:01:36,170 hanya kejam. 32 00:01:36,170 --> 00:01:40,180 Ia benar-benar sukar untuk melihat melalui keadaan huru-hara maklumat yang menarik. 33 00:01:40,180 --> 00:01:42,910 Jadi apa yang kita lakukan di sini adalah hanya petikan beberapa pasangan yang lebih 34 00:01:42,910 --> 00:01:43,850 garis yang menarik. 35 00:01:43,850 --> 00:01:46,760 Tetapi sedar bahawa 80% daripada valgrind output akan menjadi sedikit 36 00:01:46,760 --> 00:01:47,650 gangguan. 37 00:01:47,650 --> 00:01:52,820 >> Hanya melihat untuk corak seperti ini - sah betul, tidak sah membaca, 40 bytes 38 00:01:52,820 --> 00:01:56,690 dan ada beberapa blok pasti hilang, kata kunci seperti itu. 39 00:01:56,690 --> 00:02:01,920 Dan apa yang anda diharapkan akan melihat beberapa jenis kesan apa yang berfungsi 40 00:02:01,920 --> 00:02:03,340 kesilapan sebenarnya masuk 41 00:02:03,340 --> 00:02:07,195 Dalam kes ini di sini, dalam apa garis kod saya ralat nampaknya? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 dalam fail yang dipanggil memory.c, yang merupakan contoh kita telah bermain dengan 44 00:02:14,130 --> 00:02:14,890 pada masa itu. 45 00:02:14,890 --> 00:02:16,460 Jadi, ia mungkin tidak dalam malloc. 46 00:02:16,460 --> 00:02:18,630 Ia mungkin dalam kod saya sebaliknya. 47 00:02:18,630 --> 00:02:20,910 Oleh itu, kita akan melihat ini lagi dan sekali lagi tidak lama lagi. 48 00:02:20,910 --> 00:02:24,080 >> Jadi scanf, ini datang dalam beberapa bentuk setakat ini. 49 00:02:24,080 --> 00:02:26,410 Kami melihat sscanf ringkas. 50 00:02:26,410 --> 00:02:28,330 Ia adalah sesuatu yang beberapa anda menyelam ke dalam anda 51 00:02:28,330 --> 00:02:29,535 persediaan untuk kuiz. 52 00:02:29,535 --> 00:02:33,130 Dan scanf sebenarnya apa yang CS50 perpustakaan telah menggunakan di bawah 53 00:02:33,130 --> 00:02:36,560 hud sekian lama dalam usaha untuk mendapatkan input daripada pengguna. 54 00:02:36,560 --> 00:02:40,420 >> Sebagai contoh, jika saya bergerak ke atas ke CS50 perkakas sini, izinkan saya membuka satu 55 00:02:40,420 --> 00:02:45,315 contoh hari ini yang dinamakan scanf-0.c Dan ia mudah super. 56 00:02:45,315 --> 00:02:46,590 Ia hanya beberapa baris kod. 57 00:02:46,590 --> 00:02:50,880 Tetapi ia benar-benar menunjukkan bagaimana getInt telah bekerja sepanjang masa ini. 58 00:02:50,880 --> 00:02:54,710 >> Dalam program ini di sini, di talian 16 , Notis bahawa saya mengaku int an. 59 00:02:54,710 --> 00:02:57,270 Jadi tiada petunjuk, tiada apa yang ajaib di sana, hanya int. 60 00:02:57,270 --> 00:03:00,330 Kemudian pada line 17, saya mendorong pengguna untuk nombor, sila. 61 00:03:00,330 --> 00:03:02,930 Kemudian pada lewat 18, saya menggunakan scanf sini. 62 00:03:02,930 --> 00:03:06,910 Dan saya dinyatakan, jenis seperti printf, bahawa saya menjangkakan quote 63 00:03:06,910 --> 00:03:08,110 unquote peratus i. 64 00:03:08,110 --> 00:03:10,920 >> Jadi peratus i, sudah tentu, menandakan int an. 65 00:03:10,920 --> 00:03:14,580 Tetapi notis apa yang kedua hujah untuk scanf adalah. 66 00:03:14,580 --> 00:03:17,350 Bagaimana anda menggambarkan kedua Hujah selepas koma? 67 00:03:17,350 --> 00:03:19,450 Apakah itu? 68 00:03:19,450 --> 00:03:20,670 >> Ia adalah alamat x. 69 00:03:20,670 --> 00:03:25,490 Jadi ini adalah berguna kerana dengan menyediakan scanf dengan alamat x, apakah 70 00:03:25,490 --> 00:03:29,560 yang memberi kuasa kepada fungsi yang perlu dilakukan? 71 00:03:29,560 --> 00:03:33,010 Bukan hanya pergi ke sana, tetapi juga buat apa? 72 00:03:33,010 --> 00:03:34,060 >> Membuat perubahan kepadanya. 73 00:03:34,060 --> 00:03:38,080 Kerana anda boleh pergi ke sana, ia adalah jenis seperti peta ke lokasi dalam ingatan. 74 00:03:38,080 --> 00:03:41,900 Dan selagi anda berikan scanf, atau apa-apa fungsi dengan apa-apa peta, yang 75 00:03:41,900 --> 00:03:45,840 fungsi boleh pergi ke sana, dan bukan sahaja melihat nilai, tetapi ia juga boleh 76 00:03:45,840 --> 00:03:49,670 menukar nilai itu, yang berguna jika tujuan dalam kehidupan scanf adalah untuk 77 00:03:49,670 --> 00:03:53,060 mengimbas input dari pengguna, khususnya dari papan kekunci. 78 00:03:53,060 --> 00:03:57,830 Dan f menandakan diformat, seperti printf, f yang menandakan diformat 79 00:03:57,830 --> 00:03:58,930 rentetan yang anda ingin cetak. 80 00:03:58,930 --> 00:04:04,430 >> Jadi dalam jangka pendek, 18 baris ini hanya berkata, cuba untuk membaca int dari pengguna ini 81 00:04:04,430 --> 00:04:10,420 keyboard dan menyimpan ia di dalam x, pada apa alamat x berlaku untuk hidup di. 82 00:04:10,420 --> 00:04:14,860 Dan kemudian akhirnya, barisan 19 hanya berkata, terima kasih kerana int, dalam kes ini. 83 00:04:14,860 --> 00:04:15,940 >> Jadi biarlah saya pergi ke hadapan dan membuat ini. 84 00:04:15,940 --> 00:04:18,570 Oleh itu, scanf 0. 85 00:04:18,570 --> 00:04:20,130 Biar saya pergi ke hadapan dan zum masuk 86 00:04:20,130 --> 00:04:22,960 Saya akan pergi dan menjalankan ini dengan titik mengurangkan scanf 0. 87 00:04:22,960 --> 00:04:24,020 Nombor, 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 ia agak mudah. 91 00:04:27,270 --> 00:04:28,160 >> Sekarang apa yang ia tidak lakukan? 92 00:04:28,160 --> 00:04:29,940 Ia tidak melakukan sejumlah daripada memeriksa kesilapan. 93 00:04:29,940 --> 00:04:33,000 Sebagai contoh, jika saya tidak bekerjasama, dan saya tidak menaip nombor, tetapi 94 00:04:33,000 --> 00:04:37,860 sebaliknya saya menulis sesuatu seperti "Hello," itu hanya jenis yang pelik. 95 00:04:37,860 --> 00:04:41,130 Dan sebagainya salah satu perkara yang CS50 perpustakaan telah lakukan untuk kita untuk beberapa 96 00:04:41,130 --> 00:04:43,440 masa adalah reprompting bahawa dan reprompting. 97 00:04:43,440 --> 00:04:49,320 >> The cuba lagi ingat frasa berada di cs50.c, dan itulah sebab yang getInt dalam 98 00:04:49,320 --> 00:04:51,670 perpustakaan CS50 sebenarnya keseluruhan sekumpulan garis-garis panjang, kerana kami 99 00:04:51,670 --> 00:04:53,190 memeriksa barangan bodoh seperti ini. 100 00:04:53,190 --> 00:04:55,730 Adakah pengguna tidak memberi kita, pada hakikatnya, int an? 101 00:04:55,730 --> 00:04:57,910 Adakah dia memberi kita sesuatu seperti surat mengikut abjad? 102 00:04:57,910 --> 00:05:01,410 Jika ya, kami mahu mengesan itu dan menjerit pada mereka. 103 00:05:01,410 --> 00:05:03,915 >> Tetapi perkara yang mendapat lebih menarik dalam contoh ini akan datang. 104 00:05:03,915 --> 00:05:09,840 Jika saya pergi ke scanf-1.c, apakah satu perkara yang pada asasnya berubah dalam 105 00:05:09,840 --> 00:05:11,135 Contoh seterusnya ini? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Saya menggunakan char *, sudah tentu, bukannya int. 108 00:05:16,010 --> 00:05:19,210 >> Jadi ini adalah menarik, kerana char *, ingat, adalah benar-benar hanya 109 00:05:19,210 --> 00:05:20,190 perkara yang sama seperti tali. 110 00:05:20,190 --> 00:05:23,840 Jadi rasanya mungkin ini adalah super pelaksanaan mudah GetString. 111 00:05:23,840 --> 00:05:26,010 Tetapi saya telah dikupas kembali lapisan perpustakaan CS50, jadi saya 112 00:05:26,010 --> 00:05:27,550 memanggil char ini * sekarang. 113 00:05:27,550 --> 00:05:30,070 Jadi mari kita melihat di mana, jika mana-mana, kita pergi salah. 114 00:05:30,070 --> 00:05:30,840 >> Line 17 - 115 00:05:30,840 --> 00:05:33,950 Saya sekali lagi mengatakan, sila berikan saya sesuatu, dalam kes ini, rentetan. 116 00:05:33,950 --> 00:05:37,940 Dan kemudian dalam baris seterusnya, saya menyeru scanf, sekali lagi, memberikan kod format, 117 00:05:37,940 --> 00:05:39,310 tetapi ini peratus masa s. 118 00:05:39,310 --> 00:05:41,900 Dan kemudian masa ini, saya memberikan penampan. 119 00:05:41,900 --> 00:05:43,550 >> Sekarang notis, saya tidak menggunakan Ampersand itu. 120 00:05:43,550 --> 00:05:47,120 Tetapi mengapa yang mungkin OK di sini? 121 00:05:47,120 --> 00:05:49,760 Kerana apa yang penampan sudah? 122 00:05:49,760 --> 00:05:50,770 Ia sudah penunjuk. 123 00:05:50,770 --> 00:05:51,650 Ia sudah alamat. 124 00:05:51,650 --> 00:05:54,510 >> Dan mari adalah perkataan ini "mengelirukan," biarlah saya hanya memanggilnya s, misalnya, untuk 125 00:05:54,510 --> 00:05:55,050 kesederhanaan. 126 00:05:55,050 --> 00:05:58,250 Tetapi saya telah dipanggil ia penampan kerana dalam umum, dalam pengaturcaraan, jika anda mempunyai 127 00:05:58,250 --> 00:06:02,130 sebahagian memori, yang tali yang benar-benar hanya ini, anda mungkin memanggil ia penampan. 128 00:06:02,130 --> 00:06:04,460 Ia adalah tempat untuk menyimpan maklumat. 129 00:06:04,460 --> 00:06:07,400 >> Similar kepada perkara-perkara seperti YouTube, apabila mereka buffering, jadi untuk bercakap, bahawa 130 00:06:07,400 --> 00:06:10,270 hanya bermakna ia turun bit dari internet dan menyimpan mereka dalam 131 00:06:10,270 --> 00:06:14,160 pelbagai tempatan, sebahagian tempatan memori supaya bahawa anda boleh menonton kemudian tanpa 132 00:06:14,160 --> 00:06:16,830 ia ponteng atau tergantung di anda semasa bermain kembali. 133 00:06:16,830 --> 00:06:20,930 >> Jadi ada masalah di sini walaupun, kerana saya memberitahu scanf, menjangkakan 134 00:06:20,930 --> 00:06:22,320 rentetan daripada pengguna. 135 00:06:22,320 --> 00:06:24,410 Berikut adalah alamat sebahagian memori. 136 00:06:24,410 --> 00:06:26,180 Meletakkan tali yang di sana. 137 00:06:26,180 --> 00:06:31,230 Mengapa yang terikat memberi masalah kita, walaupun? 138 00:06:31,230 --> 00:06:33,490 >> Apa itu? 139 00:06:33,490 --> 00:06:35,510 Adakah saya dibenarkan untuk mengakses bahawa sebahagian daripada memori? 140 00:06:35,510 --> 00:06:36,250 Anda tahu, saya tidak tahu. 141 00:06:36,250 --> 00:06:39,210 Kerana telah penampan telah dimulakan untuk apa-apa? 142 00:06:39,210 --> 00:06:39,820 Tidak benar-benar. 143 00:06:39,820 --> 00:06:43,090 Dan sebagainya ia adalah apa yang kita telah memanggil nilai sampah, yang 144 00:06:43,090 --> 00:06:44,040 bukanlah satu perkataan yang formal. 145 00:06:44,040 --> 00:06:49,200 Ia hanya bermakna kita tidak tahu apa yang bit berada di dalam satu daripada empat bait yang 146 00:06:49,200 --> 00:06:51,240 Saya telah memperuntukkan sebagai penampan. 147 00:06:51,240 --> 00:06:52,450 >> Saya tidak dipanggil malloc. 148 00:06:52,450 --> 00:06:53,940 Saya pasti tidak dipanggil 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 Dan lagi memberitahu scanf membuta tuli, pergi ke sana dan meletakkan apa sahaja pengguna ditaip. 151 00:07:00,550 --> 00:07:04,460 >> Jadi apa yang mungkin menyebabkan dalam kod kita jika kita berjalan? 152 00:07:04,460 --> 00:07:05,700 Mungkin segfault. 153 00:07:05,700 --> 00:07:07,970 Mungkin tidak, tetapi mungkin segfault. 154 00:07:07,970 --> 00:07:10,620 Dan saya katakan mungkin tidak kerana kadang-kadang anda lakukan, kadang-kadang 155 00:07:10,620 --> 00:07:11,380 anda tidak mendapat segfault. 156 00:07:11,380 --> 00:07:14,280 Kadang-kadang anda hanya mendapat bernasib baik, tetapi ia tetap akan menjadi 157 00:07:14,280 --> 00:07:15,340 bug dalam program kami. 158 00:07:15,340 --> 00:07:17,060 >> Jadi biarlah saya pergi ke hadapan dan menyusun ini. 159 00:07:17,060 --> 00:07:18,280 Saya akan melakukannya dengan cara sekolah lama. 160 00:07:18,280 --> 00:07:23,825 Jadi dilafaz melontarkan 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Oops, sekolah terlalu lama. 162 00:07:24,720 --> 00:07:26,550 Mari kita lihat. 163 00:07:26,550 --> 00:07:28,440 Di mana saya pergi? 164 00:07:28,440 --> 00:07:29,700 Oh, char * penampan. 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 yang sangat lama. 169 00:07:37,690 --> 00:07:38,900 Baiklah, ia telah seketika. 170 00:07:38,900 --> 00:07:41,720 >> Jadi saya hanya menyimpan fail selepas membuat yang sementara 171 00:07:41,720 --> 00:07:42,700 mengubah masa yang lalu. 172 00:07:42,700 --> 00:07:46,090 Dan sekarang saya telah kumpulkan ia manual dengan dilafaz. 173 00:07:46,090 --> 00:07:49,500 Dan sekarang saya akan pergi ke hadapan dan menjalankan scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 Rentetan sila. 175 00:07:50,290 --> 00:07:51,600 Saya akan menaip "hello." 176 00:07:51,600 --> 00:07:54,070 >> Dan kini, di sini adalah di mana, terus-terang, printf boleh sedikit menjengkelkan. 177 00:07:54,070 --> 00:07:56,020 Ia tidak benar-benar akan segfault dalam kes ini. 178 00:07:56,020 --> 00:07:59,860 Printf adalah sedikit istimewa kerana ia begitu super yang biasa digunakan 179 00:07:59,860 --> 00:08:03,570 printf dasarnya melakukan kita nikmat dan menyedari, 180 00:08:03,570 --> 00:08:04,830 itu bukan penunjuk yang sah. 181 00:08:04,830 --> 00:08:09,080 Izinkan saya mengambil ia atas diri saya untuk hanya mencetak dalam kurungan batal, walaupun 182 00:08:09,080 --> 00:08:13,340 walaupun ia tidak semestinya apa kita sendiri yang diharapkan. 183 00:08:13,340 --> 00:08:16,940 >> Jadi kita tidak boleh benar-benar mudah mendorong segfault dengan ini, tetapi jelas ini 184 00:08:16,940 --> 00:08:18,600 bukan tingkah laku yang saya mahu. 185 00:08:18,600 --> 00:08:19,800 Jadi apa penyelesaian yang mudah? 186 00:08:19,800 --> 00:08:25,650 Nah, dalam scanf-2, izinkan saya mencadangkan supaya bukan sebenarnya hanya memperuntukkan 187 00:08:25,650 --> 00:08:30,100 char *, biarlah saya menjadi sedikit lebih bijak mengenai ini, dan biarlah saya menyediakan peruntukan penampan 188 00:08:30,100 --> 00:08:32,940 sebagai urutan 16 aksara. 189 00:08:32,940 --> 00:08:34,200 >> Jadi saya boleh melakukan ini dalam beberapa cara. 190 00:08:34,200 --> 00:08:35,610 Saya benar-benar boleh menggunakan malloc. 191 00:08:35,610 --> 00:08:38,980 Tetapi saya boleh kembali ke dua minggu apabila Saya hanya memerlukan sejumlah besar 192 00:08:38,980 --> 00:08:39,620 watak-watak. 193 00:08:39,620 --> 00:08:40,860 Itu hanya array. 194 00:08:40,860 --> 00:08:44,870 Jadi biarlah saya sebaliknya mentakrifkan semula penampan menjadi pelbagai 16 aksara. 195 00:08:44,870 --> 00:08:47,340 >> Dan sekarang, apabila saya meninggal penampan di - 196 00:08:47,340 --> 00:08:49,940 dan ini adalah sesuatu yang kita tidak bercakap mengenai dalam dua minggu - 197 00:08:49,940 --> 00:08:53,730 tetapi anda boleh merawat pelbagai seperti walaupun ia alamat. 198 00:08:53,730 --> 00:08:56,390 Secara teknikal, seperti yang kita telah melihat, mereka sedikit berbeza. 199 00:08:56,390 --> 00:09:01,290 Tetapi scanf tidak akan fikiran jika anda lulus nama array, kerana apa yang 200 00:09:01,290 --> 00:09:05,030 Dilafaz akan lakukan untuk kita adalah asasnya merawat nama array yang sebagai 201 00:09:05,030 --> 00:09:08,280 alamat sebahagian daripada 16 bait. 202 00:09:08,280 --> 00:09:09,550 >> Jadi ini adalah lebih baik. 203 00:09:09,550 --> 00:09:12,110 Ini bermakna kini bahawa saya boleh diharapkan melakukan yang berikut. 204 00:09:12,110 --> 00:09:16,800 Biar saya zum keluar seketika dan tidak membuat scanf-2, yang disusun OK. 205 00:09:16,800 --> 00:09:19,390 Sekarang saya tidak mendapat palang scanf-2. 206 00:09:19,390 --> 00:09:22,430 Rentetan sila. "Hello." Dan ia seolah-olah untuk bekerja masa ini. 207 00:09:22,430 --> 00:09:26,020 >> Tetapi boleh seseorang mencadangkan senario di mana ia tidak mungkin masih berfungsi? 208 00:09:26,020 --> 00:09:28,550 Ya? 209 00:09:28,550 --> 00:09:30,640 Sesuatu yang lebih panjang daripada 16 aksara. 210 00:09:30,640 --> 00:09:32,020 Dan sebenarnya, kita boleh sedikit lebih tepat. 211 00:09:32,020 --> 00:09:36,540 Sesuatu yang lebih panjang daripada 15 aksara, kerana benar-benar kita perlu ingat 212 00:09:36,540 --> 00:09:39,920 bahawa kita perlu bahawa backslash sifar tersirat di hujung tali, 213 00:09:39,920 --> 00:09:42,950 yang mengetepikan scanf akan biasanya menjaga untuk kita. 214 00:09:42,950 --> 00:09:46,210 >> Jadi biarlah saya melakukan sesuatu seperti - 215 00:09:46,210 --> 00:09:48,040 kadang-kadang kita boleh hanya meninggalkan ia seperti itu. 216 00:09:48,040 --> 00:09:50,630 OK, jadi kami kini disebabkan kesalahan segmentasi kami. 217 00:09:50,630 --> 00:09:51,000 Mengapa? 218 00:09:51,000 --> 00:09:54,940 Kerana saya ditaip kepada lebih daripada 15 watak-watak, dan dengan itu kita telah benar-benar 219 00:09:54,940 --> 00:09:58,280 memori menyentuh bahawa saya sebenarnya tidak sepatutnya. 220 00:09:58,280 --> 00:10:00,180 >> Jadi apa yang benar-benar penyelesaian di sini? 221 00:10:00,180 --> 00:10:02,210 Nah, bagaimana jika kita perlu rentetan yang lebih panjang? 222 00:10:02,210 --> 00:10:03,960 Nah, kita mungkin membuat ia 32 bait. 223 00:10:03,960 --> 00:10:05,160 Nah, bagaimana jika itu tidak cukup panjang? 224 00:10:05,160 --> 00:10:06,040 Bagaimana kira-kira 64 bait? 225 00:10:06,040 --> 00:10:07,080 Bagaimana jika itu tidak cukup panjang? 226 00:10:07,080 --> 00:10:09,640 Bagaimana kira-kira 128 atau 200 bait? 227 00:10:09,640 --> 00:10:12,660 Apa yang benar-benar adalah satu penyelesaian di sini di kes umum, jika kita tidak tahu 228 00:10:12,660 --> 00:10:14,460 memajukan apa yang pengguna akan menaip? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Ia hanya jenis sakit besar dalam keldai, menjadi jujur, yang adalah mengapa 231 00:10:23,050 --> 00:10:29,050 CS50 perpustakaan mempunyai garis sedozen beberapa kod yang secara kolektif melaksanakan 232 00:10:29,050 --> 00:10:32,390 GetString tali dengan cara yang kita tidak perlu mengetahui terlebih dahulu apa yang 233 00:10:32,390 --> 00:10:33,430 pengguna akan menaip. 234 00:10:33,430 --> 00:10:37,370 Khususnya, jika anda melihat kembali cs50.c daripada dua minggu yang lalu, anda akan melihat 235 00:10:37,370 --> 00:10:40,480 GetString yang sebenarnya tidak tidak menggunakan scanf dengan cara ini. 236 00:10:40,480 --> 00:10:43,720 Sebaliknya, ia membaca satu watak pada satu masa. 237 00:10:43,720 --> 00:10:46,010 >> Oleh kerana satu perkara yang baik tentang membaca salah satu watak adalah kita boleh 238 00:10:46,010 --> 00:10:48,490 menjamin diri kita untuk sentiasa mempunyai sekurang-kurangnya satu char. 239 00:10:48,490 --> 00:10:51,740 Saya hanya boleh mengisytiharkan char, dan kemudian mengambil langkah-langkah yang benar-benar hanya bayi 240 00:10:51,740 --> 00:10:54,380 membaca satu watak dalam pada masa dari papan kekunci. 241 00:10:54,380 --> 00:10:58,240 Dan kemudian, apa yang anda akan melihat GetString tidak adalah setiap kali ia kehabisan, 242 00:10:58,240 --> 00:11:02,280 berkata, 16 bait ingatan, ia menggunakan malloc, atau sepupu itu, untuk 243 00:11:02,280 --> 00:11:06,810 memperuntukkan memori yang lebih, menyalin lama ingatan ke dalam yang baru, dan kemudian merangkak 244 00:11:06,810 --> 00:11:09,900 bersama-sama, mendapat satu watak pada satu masa, dan ketika ia berjalan keluar dari yang 245 00:11:09,900 --> 00:11:13,370 sebahagian memori, melemparkan ia jauh, dimenangi sebahagian yang besar ingatan, salinan lama 246 00:11:13,370 --> 00:11:14,750 ke baru, dan mengulangi. 247 00:11:14,750 --> 00:11:18,480 Dan ia benar-benar sakit untuk benar-benar melaksanakan sesuatu yang mudah seperti 248 00:11:18,480 --> 00:11:19,710 mendapatkan input daripada pengguna. 249 00:11:19,710 --> 00:11:21,090 >> Jadi, anda boleh menggunakan scanf. 250 00:11:21,090 --> 00:11:22,430 Anda boleh menggunakan fungsi-fungsi lain yang serupa. 251 00:11:22,430 --> 00:11:25,420 Dan banyak buku-buku teks dan dalam talian contoh lakukan, tetapi mereka semua 252 00:11:25,420 --> 00:11:27,210 terdedah kepada masalah seperti ini. 253 00:11:27,210 --> 00:11:29,550 Dan akhirnya, mendapat satu segfault adalah jenis menjengkelkan. 254 00:11:29,550 --> 00:11:30,680 Ia tidak baik untuk pengguna. 255 00:11:30,680 --> 00:11:33,560 >> Tetapi dalam kes paling teruk, apakah ia asasnya meletakkan anda 256 00:11:33,560 --> 00:11:37,160 kod berisiko? 257 00:11:37,160 --> 00:11:39,250 Beberapa jenis serangan, berpotensi. 258 00:11:39,250 --> 00:11:41,680 Kita bercakap tentang satu serangan itu - melimpah timbunan. 259 00:11:41,680 --> 00:11:44,660 Tetapi secara umum, jika anda dibenarkan untuk buffer overflow, seperti kita melakukan 260 00:11:44,660 --> 00:11:48,070 Beberapa minggu lalu, dengan hanya menulis lebih daripada "hello" pada timbunan, anda 261 00:11:48,070 --> 00:11:52,330 sememangnya boleh mengambil alih, berpotensi, yang komputer, atau sekurang-kurangnya mendapat sekurang-data yang 262 00:11:52,330 --> 00:11:53,510 bukan milik anda. 263 00:11:53,510 --> 00:11:55,970 >> Jadi dalam jangka pendek, ini adalah mengapa kita mempunyai mereka roda latihan. 264 00:11:55,970 --> 00:11:59,090 Tetapi sekarang, kita mula mengambil mereka di luar, program-program kita tidak perlu lagi, 265 00:11:59,090 --> 00:12:00,610 semestinya, input daripada pengguna. 266 00:12:00,610 --> 00:12:03,960 Tetapi dalam kes masalah yang ditetapkan enam, input anda akan datang dari yang besar 267 00:12:03,960 --> 00:12:07,520 fail kamus dengan 150 beberapa ganjil seribu perkataan. 268 00:12:07,520 --> 00:12:10,330 >> Jadi anda tidak perlu bimbang tentang sewenang-wenangnya input pengguna. 269 00:12:10,330 --> 00:12:13,720 Kita akan memberikan anda beberapa andaian mengenai fail itu. 270 00:12:13,720 --> 00:12:20,340 Sebarang pertanyaan mengenai petunjuk atau scanf atau input pengguna secara umum? 271 00:12:20,340 --> 00:12:24,450 >> Baiklah, jadi melihat cepat kemudian pada satu-satu ketinggalan topik daripada dua minggu lalu. 272 00:12:24,450 --> 00:12:28,590 Dan itu adalah tanggapan ini struct a. 273 00:12:28,590 --> 00:12:34,180 Tidak bahawa - ini tanggapan struct, iaitu apa? 274 00:12:34,180 --> 00:12:35,430 Apa struct lakukan untuk kami? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Menentukan - 277 00:12:39,860 --> 00:12:41,710 maaf? 278 00:12:41,710 --> 00:12:42,820 Menentukan jenis berubah-ubah. 279 00:12:42,820 --> 00:12:44,410 Jadi semacam. 280 00:12:44,410 --> 00:12:46,180 Kami sebenarnya menggabungkan dua topik. 281 00:12:46,180 --> 00:12:49,510 Jadi dengan typedef, ingat bahawa kita boleh mengisytiharkan jenis kita sendiri, seperti 282 00:12:49,510 --> 00:12:51,500 sinonim, seperti tali untuk char *. 283 00:12:51,500 --> 00:12:56,200 Tetapi menggunakan typedef dan struct, kita boleh benar-benar mewujudkan struktur data kita sendiri. 284 00:12:56,200 --> 00:12:59,600 >> Sebagai contoh, jika saya pergi ke dalam gedit di sini untuk seketika, dan saya pergi ke hadapan 285 00:12:59,600 --> 00:13:08,230 dan melakukan sesuatu seperti, biarlah saya simpan ini kerana, katakan, structs.c 286 00:13:08,230 --> 00:13:10,840 buat sementara waktu, saya hanya akan untuk pergi ke hadapan dan termasuk 287 00:13:10,840 --> 00:13:14,360 standardio.h, int sah utama. 288 00:13:14,360 --> 00:13:18,960 Dan kemudian di sini, rasa yang saya mahu untuk menulis program yang menyimpan 289 00:13:18,960 --> 00:13:21,840 berbilang pelajar dari pelbagai rumah, misalnya. 290 00:13:21,840 --> 00:13:24,430 Jadi ia seperti registrarial pangkalan data sejenis. 291 00:13:24,430 --> 00:13:29,550 >> Jadi jika saya memerlukan pelajar nama satu, 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 menggunakan perpustakaan CS50 hanya masa untuk membuat ini 294 00:13:34,410 --> 00:13:38,380 mudah sedikit, jadi kita boleh meminjam mereka berpuluh-puluh baris kod. 295 00:13:38,380 --> 00:13:39,340 Dan mari kita hanya menyimpan ia mudah. 296 00:13:39,340 --> 00:13:42,610 Kami akan memastikan ia tali, dan kini GetString. 297 00:13:42,610 --> 00:13:47,420 >> Jadi saya menuntut sekarang bahawa saya telah disimpan nama beberapa pelajar, dan rumah 298 00:13:47,420 --> 00:13:50,240 beberapa pelajar, hanya menggunakan pembolehubah seperti yang kami lakukan dan dalam satu minggu. 299 00:13:50,240 --> 00:13:52,370 Tetapi rasa saya kini mahu menyokong beberapa pelajar. 300 00:13:52,370 --> 00:13:58,460 Baiklah, jadi naluri saya untuk melakukan rentetan 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 maka pelajar kita yang ketiga, mari kita buat NAME3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Baiklah, jadi ini adalah diharapkan menarik anda sebagai jenis bodoh, 304 00:14:09,170 --> 00:14:11,580 kerana proses ini adalah benar-benar tidak pernah akan berakhir, dan ia hanya akan 305 00:14:11,580 --> 00:14:13,130 membuat kod saya kelihatan buruk dan teruk dan teruk. 306 00:14:13,130 --> 00:14:14,810 Tetapi kita menyelesaikan ini juga dalam seminggu dua. 307 00:14:14,810 --> 00:14:19,450 Apakah penyelesaian yang agak bersih kami apabila kita mempunyai beberapa pembolehubah yang 308 00:14:19,450 --> 00:14:23,580 jenis data yang sama yang semua berkaitan, tetapi kita tidak mahu keadaan kucar-kacir ini kejam 309 00:14:23,580 --> 00:14:26,870 pembolehubah nama yang 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 fikir saya mendengar tempat sahaja. 312 00:14:31,260 --> 00:14:32,590 Kami mempunyai array. 313 00:14:32,590 --> 00:14:37,110 Jika anda ingin beberapa contoh sesuatu, mengapa tidak kita membersihkan ini semua 314 00:14:37,110 --> 00:14:39,540 dan hanya berkata, memberi saya pelbagai dipanggil nama? 315 00:14:39,540 --> 00:14:41,640 >> Dan sekarang, mari kita kod 3 keras. 316 00:14:41,640 --> 00:14:44,450 Dan kemudian memberikan saya pelbagai lagi dipanggil rumah, dan izinkan saya untuk 317 00:14:44,450 --> 00:14:45,800 kini kod keras 3. 318 00:14:45,800 --> 00:14:49,220 Dan saya telah secara besar-besaran dibersihkan sehingga kucar-kacir yang saya buat. 319 00:14:49,220 --> 00:14:52,400 Kini, saya masih lagi keras berkod 3, tetapi juga 3 yang dinamik boleh datang dari 320 00:14:52,400 --> 00:14:54,350 pengguna, atau argv, atau sebagainya. 321 00:14:54,350 --> 00:14:55,720 Jadi ini sudah bersih. 322 00:14:55,720 --> 00:15:00,100 >> Tetapi apa yang menjengkelkan tentang ini adalah bahawa kini, nama walaupun entah bagaimana 323 00:15:00,100 --> 00:15:02,280 asasnya dikaitkan dengan rumah pelajar - 324 00:15:02,280 --> 00:15:04,720 ia adalah seorang pelajar yang amat saya ingin mewakili - 325 00:15:04,720 --> 00:15:08,080 Saya kini mempunyai dua barisan yang selari dalam erti kata bahawa mereka yang 326 00:15:08,080 --> 00:15:13,930 saiz yang sama, dan nama-nama kurungan 0 mungkin peta ke rumah kurungan 0, 327 00:15:13,930 --> 00:15:16,600 dan nama-nama kurungan 1 peta ke rumah kurungan 1. 328 00:15:16,600 --> 00:15:19,280 Dalam erti kata lain, kehidupan pelajar bahawa dalam rumah itu, dan pelajar lain 329 00:15:19,280 --> 00:15:20,530 tinggal di rumah yang lain. 330 00:15:20,530 --> 00:15:23,720 Tetapi sudah tentu ini boleh menjadi dilakukan lebih bersih. 331 00:15:23,720 --> 00:15:24,990 >> Nah, ia boleh, sebenarnya. 332 00:15:24,990 --> 00:15:28,730 Dan biarlah saya pergi ke hadapan dan membuka sehingga structs.h, dan anda akan 333 00:15:28,730 --> 00:15:31,130 melihat idea ini di sini. 334 00:15:31,130 --> 00:15:34,905 Perhatikan bahawa saya telah menggunakan typedef, seperti yang anda dirujuk kepada masa yang lalu untuk mengisytiharkan kami 335 00:15:34,905 --> 00:15:35,570 jenis data sendiri. 336 00:15:35,570 --> 00:15:39,660 Tetapi saya juga menggunakan kata kunci ini lain dipanggil struct yang memberikan saya yang baru 337 00:15:39,660 --> 00:15:40,790 struktur data. 338 00:15:40,790 --> 00:15:43,980 >> Dan struktur data ini saya menuntut akan mempunyai dua perkara di dalam 339 00:15:43,980 --> 00:15:47,060 ia - tali yang dipanggil nama, dan tali yang dipanggil rumah. 340 00:15:47,060 --> 00:15:49,820 Dan nama saya akan memberi struktur data ini akan 341 00:15:49,820 --> 00:15:51,005 akan dipanggil pelajar. 342 00:15:51,005 --> 00:15:54,030 Saya boleh memanggilnya apa-apa yang saya mahu, tetapi ini semantik membuat 343 00:15:54,030 --> 00:15:55,810 rasa kepada saya dalam fikiran saya. 344 00:15:55,810 --> 00:15:59,160 >> Jadi sekarang, jika saya membuka versi yang lebih baik program yang saya mula menulis 345 00:15:59,160 --> 00:16:00,390 di sana, biarlah saya tatal ke atas. 346 00:16:00,390 --> 00:16:03,190 Dan tidak ada yang lebih baris kod di sini, tetapi biarlah saya memberi tumpuan untuk 347 00:16:03,190 --> 00:16:04,160 masa ini pada satu. 348 00:16:04,160 --> 00:16:07,790 Saya telah diisytiharkan tetap pelajar yang dipanggil dan keras berkod 3 untuk sekarang. 349 00:16:07,790 --> 00:16:11,110 Tetapi sekarang, melihat bagaimana bersih kod saya bermula untuk mendapatkan. 350 00:16:11,110 --> 00:16:15,030 >> Selaras 22, saya mengisytiharkan pelbagai pelajar. 351 00:16:15,030 --> 00:16:18,760 Dan melihat bahawa pelajar nampaknya kini merupakan jenis data. 352 00:16:18,760 --> 00:16:23,360 Kerana di atas fail ini, notis Saya telah menyertakan fail header 353 00:16:23,360 --> 00:16:24,820 yang saya ditarik ke atas hanya sebentar tadi. 354 00:16:24,820 --> 00:16:28,820 Dan bahawa fail header cukup sekadar mempunyai definisi ini pelajar. 355 00:16:28,820 --> 00:16:32,470 >> Jadi sekarang, saya telah membuat data adat sendiri jenis yang pengarang C tahun 356 00:16:32,470 --> 00:16:33,890 lalu tidak berfikir terlebih dahulu. 357 00:16:33,890 --> 00:16:34,570 Tetapi tidak ada masalah. 358 00:16:34,570 --> 00:16:35,870 Saya boleh membuat sendiri. 359 00:16:35,870 --> 00:16:39,050 Jadi ini adalah pelbagai yang dikenali sebagai pelajar, setiap ahli yang 360 00:16:39,050 --> 00:16:41,100 adalah struktur pelajar. 361 00:16:41,100 --> 00:16:44,270 Dan saya mahu tiga daripada mereka yang dalam array. 362 00:16:44,270 --> 00:16:46,030 >> Dan sekarang, apakah yang lain program ini lakukan? 363 00:16:46,030 --> 00:16:47,550 Saya memerlukan sesuatu yang sewenang-wenangnya. 364 00:16:47,550 --> 00:16:51,450 Jadi dari 24 seterusnya dalam talian, Saya melelar dari 0 ke 3. 365 00:16:51,450 --> 00:16:54,000 Saya kemudian meminta pengguna untuk nama pelajar. 366 00:16:54,000 --> 00:16:56,110 Dan kemudian saya menggunakan GetString seperti sebelum ini. 367 00:16:56,110 --> 00:16:59,410 Kemudian saya meminta rumah pelajar, dan saya menggunakan GetString seperti sebelum ini. 368 00:16:59,410 --> 00:17:01,780 >> Tetapi notis - sedikit baru sekeping sintaks - 369 00:17:01,780 --> 00:17:07,010 Saya masih boleh indeks kepada pelajar i-th, tetapi bagaimana saya boleh mendapatkan di data tertentu 370 00:17:07,010 --> 00:17:08,354 di dalam bidang struct itu? 371 00:17:08,354 --> 00:17:11,770 Nah, apa yang nampaknya sekeping baru sintaks? 372 00:17:11,770 --> 00:17:13,339 Ia hanya operator titik. 373 00:17:13,339 --> 00:17:14,510 >> Kami telah tidak benar-benar melihat ini sebelum ini. 374 00:17:14,510 --> 00:17:17,819 Anda telah melihat dalam pset lima jika anda telah menyelam di sudah dengan fail bitmap. 375 00:17:17,819 --> 00:17:22,372 Tetapi titik hanya bermakna dalam ini struct atau pelbagai bidang, memberikan 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 Ini bermakna pergi dalam struct itu dan mendapatkan bidang-bidang tertentu. 378 00:17:28,690 --> 00:17:30,200 >> Apakah seluruh program ini lakukan? 379 00:17:30,200 --> 00:17:31,190 Ia bukan semua yang seksi. 380 00:17:31,190 --> 00:17:34,640 Perhatikan bahawa saya melelar dari 0 ke 3 lagi, dan saya hanya mewujudkan Inggeris 381 00:17:34,640 --> 00:17:40,500 frasa seperti begitu dan begitu juga dalam apa-apa dan seperti rumah, lulus dalam nama dot dari 382 00:17:40,500 --> 00:17:43,320 pelajar i-th dan mereka rumah juga. 383 00:17:43,320 --> 00:17:47,560 >> Kemudian akhir sekali, sekarang kita akan mula mendapat dubur tentang perkara ini, sekarang bahawa kami 384 00:17:47,560 --> 00:17:49,580 biasa dengan apa yang malloc dan fungsi lain yang telah 385 00:17:49,580 --> 00:17:50,570 melakukan semua masa ini. 386 00:17:50,570 --> 00:17:54,220 Kenapa saya perlu untuk membebaskan kedua-dua nama dan rumah, walaupun saya 387 00:17:54,220 --> 00:17:56,960 tidak memanggil malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString lakukan. 389 00:17:58,020 --> 00:18:00,930 Dan itu adalah rahsia kotor sedikit untuk beberapa minggu, tetapi GetString mempunyai 390 00:18:00,930 --> 00:18:03,530 telah bocor memori seluruh meletakkan semua semester setakat ini. 391 00:18:03,530 --> 00:18:05,990 Dan valgrand akan akhirnya mendedahkan ini kepada kami. 392 00:18:05,990 --> 00:18:10,730 >> Tetapi ia bukan satu masalah besar, kerana saya tahu bahawa saya hanya boleh membebaskan nama 393 00:18:10,730 --> 00:18:15,750 dan rumah itu, walaupun secara teknikal, untuk menjadi super, super selamat, saya perlu 394 00:18:15,750 --> 00:18:17,890 melakukan beberapa kesilapan menyemak 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 Apakah yang perlu saya akan memeriksa sebelum saya melepaskan apa yang 397 00:18:22,480 --> 00:18:25,470 tali, aka mana * char? 398 00:18:25,470 --> 00:18:33,460 >> Saya benar-benar perlu menyemak jika pelajar golongan i nama dot tidak 399 00:18:33,460 --> 00:18:34,840 batal sama. 400 00:18:34,840 --> 00:18:40,400 Kemudian ia akan menjadi OK untuk meneruskan dan percuma penunjuk itu, dan sama atau lain-lain 401 00:18:40,400 --> 00:18:41,160 salah satu juga. 402 00:18:41,160 --> 00:18:46,860 Jika pelajar kurungan i dot rumah tidak sama dengan nol, sekarang ini akan melindungi 403 00:18:46,860 --> 00:18:52,520 terhadap kes sudut di mana GetString mengembalikan sesuatu seperti null. 404 00:18:52,520 --> 00:18:57,310 Dan kita melihat masa lalu, printf akan melindungi kita di sini dengan hanya berkata 405 00:18:57,310 --> 00:18:58,990 batal, yang akan kelihatan pelik. 406 00:18:58,990 --> 00:19:02,340 Tetapi sekurang-kurangnya ia tidak akan segfault, seperti yang kita lihat. 407 00:19:02,340 --> 00:19:05,990 >> Baiklah, biar saya melakukan satu perkara lain di sini. structs-0 adalah jenis program bodoh 408 00:19:05,990 --> 00:19:09,700 kerana saya memasukkan semua data ini, dan kemudian ia hilang apabila program berakhir. 409 00:19:09,700 --> 00:19:10,940 Tetapi biarlah saya pergi ke hadapan dan melakukan ini. 410 00:19:10,940 --> 00:19:12,830 Izinkan saya membuat terminal tingkap sedikit lebih besar. 411 00:19:12,830 --> 00:19:17,000 Izinkan saya membuat structs-1, yang adalah versi baru ini. 412 00:19:17,000 --> 00:19:18,520 >> Saya akan zoom sedikit. 413 00:19:18,520 --> 00:19:21,620 Dan sekarang mari saya menjalankan dot mengurangkan structs-1. 414 00:19:21,620 --> 00:19:22,590 Nama Pelajar - 415 00:19:22,590 --> 00:19:31,500 David Mather, mari kita buat Rob Kirkland, mari kita buat Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Apa yang menarik sekarang adalah notis - 417 00:19:33,650 --> 00:19:35,540 dan saya hanya tahu ini kerana Saya menulis program - 418 00:19:35,540 --> 00:19:38,930 ada fail sekarang semasa saya direktori dipanggil students.csv. 419 00:19:38,930 --> 00:19:40,420 Sebahagian daripada anda mungkin telah melihat ini dalam dunia sebenar. 420 00:19:40,420 --> 00:19:42,980 >> Apakah yang dimaksudkan dengan fail CSV? 421 00:19:42,980 --> 00:19:44,170 Nilai koma. 422 00:19:44,170 --> 00:19:46,670 Ia adalah jenis seperti orang miskin versi fail Excel. 423 00:19:46,670 --> 00:19:50,580 Ia adalah satu jadual baris dan lajur yang anda boleh membuka dalam program seperti Excel, 424 00:19:50,580 --> 00:19:51,800 atau Nombor pada Mac. 425 00:19:51,800 --> 00:19:55,180 >> Dan jika saya membuka fail ini di sini gedit, notis - dan nombor-nombor tidak ada. 426 00:19:55,180 --> 00:19:57,360 Itu hanya gedit memberitahu nombor talian saya. 427 00:19:57,360 --> 00:19:59,740 Perhatikan pada baris pertama ini fail adalah Daud dan Mather. 428 00:19:59,740 --> 00:20:01,450 Garis seterusnya adalah Rob koma Kirkland. 429 00:20:01,450 --> 00:20:04,170 Dan barisan ketiga ialah 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 satu program C yang berkesan boleh menjana spreadsheet 432 00:20:09,580 --> 00:20:11,840 yang boleh dibuka di program seperti Excel. 433 00:20:11,840 --> 00:20:15,520 Bukan semua yang menarik set data, tetapi jika anda mempunyai ketulan yang lebih besar daripada 434 00:20:15,520 --> 00:20:18,440 data yang anda benar-benar mahu memanipulasi dan membuat graf dan 435 00:20:18,440 --> 00:20:21,260 suka, ini mungkin merupakan salah satu cara untuk mewujudkan data tersebut. 436 00:20:21,260 --> 00:20:25,370 Selain itu, CSVs sebenarnya super biasa hanya untuk menyimpan data mudah - 437 00:20:25,370 --> 00:20:28,940 Yahoo Kewangan, sebagai contoh, jika anda mendapat harga saham melalui apa yang dipanggil mereka 438 00:20:28,940 --> 00:20:33,180 API, perkhidmatan percuma yang membolehkan anda mendapatkan saham up-to-the-tarikh semasa 439 00:20:33,180 --> 00:20:35,650 sebut harga untuk syarikat, mereka memberikan data kembali dalam 440 00:20:35,650 --> 00:20:37,800 super format CSV mudah. 441 00:20:37,800 --> 00:20:39,380 >> Jadi bagaimana kita berbuat demikian? 442 00:20:39,380 --> 00:20:42,530 Well notis, sebahagian besar daripada program ini yang hampir sama. 443 00:20:42,530 --> 00:20:46,870 Tetapi notis ke sini, dan bukannya cetak pelajar keluar, on line 35 444 00:20:46,870 --> 00:20:51,040 seterusnya, saya menuntut bahawa saya menyelamatkan pelajar ke cakera, jadi menyimpan fail. 445 00:20:51,040 --> 00:20:53,630 >> Jadi notis saya mengisytiharkan FILE a * - 446 00:20:53,630 --> 00:20:57,260 sekarang, ini adalah jenis anomali C. Untuk apa-apa sebab, FILE adalah topi, 447 00:20:57,260 --> 00:21:00,690 yang tidak seperti kebanyakan jenis data lain di C. Tetapi ini adalah terbina dalam 448 00:21:00,690 --> 00:21:02,320 jenis data, fail *. 449 00:21:02,320 --> 00:21:05,900 Dan saya mengisytiharkan penunjuk kepada fail, adalah bagaimana anda boleh berfikir itu. 450 00:21:05,900 --> 00:21:08,070 >> fopen bermakna fail terbuka. 451 00:21:08,070 --> 00:21:09,470 Apakah fail yang anda mahu terbuka? 452 00:21:09,470 --> 00:21:12,620 Saya ingin membuka fail yang saya akan sewenang-wenangnya memanggil students.csv. 453 00:21:12,620 --> 00:21:14,480 Saya boleh memanggil bahawa apa-apa yang saya mahu. 454 00:21:14,480 --> 00:21:15,200 >> Dan kemudian mengambil tekaan. 455 00:21:15,200 --> 00:21:18,960 Apakah hujah kedua untuk fopen mungkin bermakna? 456 00:21:18,960 --> 00:21:21,480 Betul, w untuk menulis, boleh menjadi r untuk dibaca. 457 00:21:21,480 --> 00:21:24,120 Ada untuk lampiran jika anda mahu menambah baris dan tidak 458 00:21:24,120 --> 00:21:25,200 menimpa segala-galanya. 459 00:21:25,200 --> 00:21:28,005 >> Tetapi saya hanya mahu mencipta fail ini sekali, jadi saya akan menggunakan quote unquote w. 460 00:21:28,005 --> 00:21:31,880 Dan saya tahu bahawa hanya dari setelah membaca dokumentasi, atau halaman lelaki itu. 461 00:21:31,880 --> 00:21:35,100 Jika fail tidak sah - dalam erti kata lain, jika apa-apa yang telah salah di sana - 462 00:21:35,100 --> 00:21:37,820 biarlah saya melelar atas pelajar dari 0 ke 3. 463 00:21:37,820 --> 00:21:40,410 >> Dan kini melihat ada sesuatu pernah jadi sedikit berbeza 464 00:21:40,410 --> 00:21:42,110 mengenai garis 41 di sini. 465 00:21:42,110 --> 00:21:42,960 Ia bukan printf. 466 00:21:42,960 --> 00:21:46,530 Ia fprintf untuk fail printf. 467 00:21:46,530 --> 00:21:47,790 Jadi ia akan menulis ke fail. 468 00:21:47,790 --> 00:21:48,860 Yang file? 469 00:21:48,860 --> 00:21:53,630 Satu penunjuk yang anda tentukan sebagai hujah yang pertama. 470 00:21:53,630 --> 00:21:55,940 >> Kemudian kami nyatakan rentetan format. 471 00:21:55,940 --> 00:21:59,660 Kemudian kita menentukan apa tali yang kita mahu pasangkan untuk peratus yang pertama, dan 472 00:21:59,660 --> 00:22:04,320 maka pemboleh ubah lain atau peratus yang kedua. 473 00:22:04,320 --> 00:22:06,760 Kemudian kita menutup fail dengan fclose. 474 00:22:06,760 --> 00:22:09,380 Daripada saya membebaskan memori seperti sebelum ini, walaupun Saya perlu kembali dalam dan menambah 475 00:22:09,380 --> 00:22:10,540 beberapa cek null. 476 00:22:10,540 --> 00:22:12,090 >> Dan itu sahaja. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose memberikan saya keupayaan untuk mewujudkan fail teks. 478 00:22:16,960 --> 00:22:19,640 Sekarang anda akan melihat dalam masalah set lima, yang melibatkan imej, anda akan menggunakan 479 00:22:19,640 --> 00:22:20,990 fail binari sebaliknya. 480 00:22:20,990 --> 00:22:24,200 Tetapi asasnya, idea adalah sama, walaupun fungsi-fungsi yang anda akan 481 00:22:24,200 --> 00:22:28,710 melihat adalah sedikit berbeza. 482 00:22:28,710 --> 00:22:32,580 >> Jadi lawatan badai, tetapi anda akan mendapat semua terlalu biasa dengan fail 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 mana-mana soalan-soalan mengenai asas-asas 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 cuba untuk membebaskan nilai null? 488 00:22:43,710 --> 00:22:48,880 Saya percaya, melainkan percuma telah mendapat lebih mesra pengguna sedikit, anda boleh 489 00:22:48,880 --> 00:22:49,890 berpotensi segfault. 490 00:22:49,890 --> 00:22:54,160 Lulus menyeimbangkan adalah buruk kerana saya tidak percaya percuma mengganggu untuk memeriksa untuk anda, 491 00:22:54,160 --> 00:22:57,330 kerana ia mungkin akan menjadi satu pembaziran masa untuk ia lakukan sendiri untuk 492 00:22:57,330 --> 00:22:59,022 semua orang di dunia. 493 00:22:59,022 --> 00:23:00,590 Soalan yang baik, walaupun. 494 00:23:00,590 --> 00:23:04,300 >> Baiklah, jadi seperti ini mendapat kita satu topik yang menarik. 495 00:23:04,300 --> 00:23:07,010 Tema set masalah lima adalah forensik. 496 00:23:07,010 --> 00:23:08,420 Sekurang-kurangnya itulah sebahagian set masalah. 497 00:23:08,420 --> 00:23:12,030 Forensik secara amnya merujuk kepada pemulihan maklumat yang mungkin atau 498 00:23:12,030 --> 00:23:14,110 tidak mungkin telah dipadam sengaja. 499 00:23:14,110 --> 00:23:18,680 Oleh itu, saya fikir saya akan memberikan anda cepat rasa apa yang benar-benar berlaku ke atas semua 500 00:23:18,680 --> 00:23:21,230 kali ini di bawah bonet komputer anda. 501 00:23:21,230 --> 00:23:23,960 >> Sebagai contoh, jika anda mempunyai dalam anda komputer riba atau komputer meja anda 502 00:23:23,960 --> 00:23:28,040 cakera keras, ia adalah sama ada mekanikal peranti yang sebenarnya berputar - 503 00:23:28,040 --> 00:23:31,650 ada perkara yang bulat dipanggil pinggan yang kelihatan agak suka apa yang saya 504 00:23:31,650 --> 00:23:34,540 hanya mempunyai di skrin di sini, walaupun ini adalah sekolah yang semakin tua. 505 00:23:34,540 --> 00:23:37,370 Ini adalah tiga dan setengah inci cakera keras. 506 00:23:37,370 --> 00:23:40,070 Dan tiga setengah inci merujuk daripada dengan perkara apabila anda memasang 507 00:23:40,070 --> 00:23:40,890 dalam komputer. 508 00:23:40,890 --> 00:23:44,890 >> Ramai daripada anda semua dalam komputer riba anda sekarang mempunyai cakera keadaan pepejal, atau SSDs, 509 00:23:44,890 --> 00:23:46,260 yang tidak mempunyai bahagian yang bergerak. 510 00:23:46,260 --> 00:23:49,170 Mereka lebih seperti RAM dan kurang seperti alat-alat mekanikal. 511 00:23:49,170 --> 00:23:51,450 Tetapi idea-idea yang masih yang sama, sudah tentu kerana ia berkaitan 512 00:23:51,450 --> 00:23:52,790 kepada masalah yang ditetapkan lima. 513 00:23:52,790 --> 00:23:57,400 >> Dan jika anda berfikir tentang sekarang cakera keras mewakili menjadi bulatan, yang 514 00:23:57,400 --> 00:23:58,930 Saya akan menarik seperti ini di sini. 515 00:23:58,930 --> 00:24:02,290 Apabila anda membuat fail pada komputer anda, sama ada ia adalah SSD, atau dalam 516 00:24:02,290 --> 00:24:06,610 kes ini, sekolah memandu lebih tua keras, fail yang terdiri daripada pelbagai bit. 517 00:24:06,610 --> 00:24:10,510 Mari kita mengatakan bahawa ia adalah ini 0 dan 1, sejumlah 0 dan 1s. 518 00:24:10,510 --> 00:24:11,660 Jadi ini adalah memandu seluruh keras saya. 519 00:24:11,660 --> 00:24:13,225 Ini adalah jelas fail agak besar. 520 00:24:13,225 --> 00:24:18,080 Dan ia menggunakan sehingga 0 dan 1s pada itu bahagian pinggan fizikal. 521 00:24:18,080 --> 00:24:19,750 >> Nah, apa yang adalah bahawa bahagian fizikal? 522 00:24:19,750 --> 00:24:25,310 Nah, ternyata bahawa pada cakera keras, sekurang-kurangnya jenis ini, terdapat 523 00:24:25,310 --> 00:24:27,340 zarah magnet sedikit kecil. 524 00:24:27,340 --> 00:24:32,630 Dan mereka mempunyai asasnya utara dan kutub selatan kepada mereka, supaya jika anda 525 00:24:32,630 --> 00:24:35,710 menjadikan salah satu zarah magnet cara ini, mungkin anda mengatakan bahawa ia adalah 526 00:24:35,710 --> 00:24:36,720 mewakili 1. 527 00:24:36,720 --> 00:24:39,340 Dan jika ia terbalik ke selatan utara, anda mungkin berkata bahawa ia adalah 528 00:24:39,340 --> 00:24:40,390 mewakili 0. 529 00:24:40,390 --> 00:24:43,660 >> Jadi dalam dunia fizikal yang sebenar, itu bagaimana anda boleh mewakili sesuatu 530 00:24:43,660 --> 00:24:45,670 negeri binari 0 dan 1. 531 00:24:45,670 --> 00:24:46,720 Jadi, itu semua fail adalah. 532 00:24:46,720 --> 00:24:49,300 Terdapat sejumlah besar magnet zarah yang mereka dengan cara ini atau 533 00:24:49,300 --> 00:24:51,920 cara ini, mewujudkan corak 0 dan 1s. 534 00:24:51,920 --> 00:24:56,760 >> Tetapi ternyata apabila anda menyimpan fail, beberapa maklumat yang disimpan secara berasingan. 535 00:24:56,760 --> 00:25:00,000 Jadi ini adalah sebuah meja kecil, direktori, jadi untuk bercakap. 536 00:25:00,000 --> 00:25:05,810 Dan saya akan memanggil ini nama kolum, dan Saya akan panggil lokasi ruangan ini. 537 00:25:05,810 --> 00:25:08,850 >> Dan saya akan berkata, rasa ini adalah resume saya. 538 00:25:08,850 --> 00:25:14,050 Resume.doc saya disimpan di lokasi, katakan 123. 539 00:25:14,050 --> 00:25:15,390 Saya selalu pergi untuk nombor tersebut. 540 00:25:15,390 --> 00:25:18,810 Tetapi memadai untuk mengatakan bahawa sama seperti dalam RAM, anda boleh mengambil pemacu keras 541 00:25:18,810 --> 00:25:22,350 itu adalah satu gigabit atau 200 gigabait atau terabyte, dan anda boleh 542 00:25:22,350 --> 00:25:23,750 bilangan semua bait. 543 00:25:23,750 --> 00:25:26,480 Anda boleh bilangannya semua ketulan 8 bit. 544 00:25:26,480 --> 00:25:29,030 >> Oleh itu, kita akan mengatakan bahawa ini adalah 123 lokasi. 545 00:25:29,030 --> 00:25:32,070 Jadi ini di dalam direktori operasi saya sistem ingat bahawa saya 546 00:25:32,070 --> 00:25:34,250 resume adalah di lokasi 123. 547 00:25:34,250 --> 00:25:36,850 Tetapi ia menjadi menarik apabila anda memadam fail. 548 00:25:36,850 --> 00:25:37,820 >> Jadi misalnya - 549 00:25:37,820 --> 00:25:40,790 dan bersyukur kerana, sebahagian besar dunia mempunyai terperangkap ke ini - apa yang berlaku apabila 550 00:25:40,790 --> 00:25:45,040 yang anda heret fail untuk anda Mac OS Sampah atau anda Recycle Bin Windows? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Apakah tujuan untuk melakukan itu? 553 00:25:50,510 --> 00:25:53,860 Ia adalah jelas untuk menghilangkan fail, tetapi apakah tindakan menarik dan 554 00:25:53,860 --> 00:25:57,550 jatuh ke dalam Sampah atau anda anda Recycle Bin lakukan pada komputer? 555 00:25:57,550 --> 00:25:59,230 >> Benar-benar apa-apa, benar-benar. 556 00:25:59,230 --> 00:26:00,320 Ia adalah sama seperti folder. 557 00:26:00,320 --> 00:26:01,800 Ia adalah satu folder khas, untuk memastikan. 558 00:26:01,800 --> 00:26:04,460 Tetapi adakah ia sebenarnya memadam fail? 559 00:26:04,460 --> 00:26:06,780 >> Nah, tidak, kerana sesetengah daripada anda mungkin telah seperti, oh damn, anda tidak 560 00:26:06,780 --> 00:26:07,420 bermaksud untuk berbuat demikian. 561 00:26:07,420 --> 00:26:09,130 Jadi anda klik dua kali ganda Sampah atau Recycle Bin. 562 00:26:09,130 --> 00:26:11,630 Anda telah mencucuk di sekitar dan anda semula fail hanya dengan mengheret 563 00:26:11,630 --> 00:26:12,110 keluar dari sana. 564 00:26:12,110 --> 00:26:14,420 Jadi jelas, ia tidak semestinya memotong ia. 565 00:26:14,420 --> 00:26:15,990 >> OK, anda lebih bijak daripada itu. 566 00:26:15,990 --> 00:26:18,860 Anda tahu bahawa hanya menarik ia ke dalam Sampah atau Recycle Bin tidak bermakna 567 00:26:18,860 --> 00:26:19,930 anda mengosongkan tong sampah. 568 00:26:19,930 --> 00:26:24,110 Jadi anda pergi ke menu, dan anda berkata Sampah kosong atau kosong Recycle Bin. 569 00:26:24,110 --> 00:26:25,360 Kemudian apa yang berlaku? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Ya, jadi ia dipadam lebih lagi. 572 00:26:32,530 --> 00:26:37,660 Tetapi semua yang berlaku 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 >> Tetapi apa yang tidak berubah nampaknya di dalam gambar? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Bit, 0 dan 1s bahawa saya menuntut adalah di laman web beberapa aspek fizikal 577 00:26:55,570 --> 00:26:56,280 perkakasan. 578 00:26:56,280 --> 00:26:57,110 Mereka masih ada. 579 00:26:57,110 --> 00:26:58,930 Ia hanya komputer mempunyai lupa apa yang mereka. 580 00:26:58,930 --> 00:27:03,160 >> Jadi ia dasarnya dibebaskan fail ini bit supaya mereka boleh digunakan semula. 581 00:27:03,160 --> 00:27:06,940 Tetapi tidak sehingga anda membuat lebih fail, dan banyak fail, dan banyak fail akan 582 00:27:06,940 --> 00:27:12,150 probabilistically, mereka 0 dan 1s, mereka zarah magnet, mendapatkan semula, 583 00:27:12,150 --> 00:27:16,220 sebelah terbalik atau sehingga, untuk fail lain, 0 dan 1s. 584 00:27:16,220 --> 00:27:17,980 >> Jadi, anda mempunyai tingkap masa ini. 585 00:27:17,980 --> 00:27:19,860 Dan ia bukan satu diramal panjang, benar-benar. 586 00:27:19,860 --> 00:27:22,240 Ia bergantung kepada saiz keras anda memandu dan berapa banyak fail yang anda mempunyai dan 587 00:27:22,240 --> 00:27:23,490 berapa cepat anda membuat yang baru. 588 00:27:23,490 --> 00:27:27,050 Tetapi ada tingkap masa ini semasa mana fail yang masih sempurna 589 00:27:27,050 --> 00:27:27,770 semula. 590 00:27:27,770 --> 00:27:31,050 >> Jadi jika anda pernah menggunakan program seperti McAfee Norton atau cuba untuk memulihkan 591 00:27:31,050 --> 00:27:35,680 data, semua yang mereka lakukan adalah cuba untuk pulih ini direktori yang dipanggil untuk 592 00:27:35,680 --> 00:27:37,340 memikirkan di mana fail anda berada. 593 00:27:37,340 --> 00:27:40,605 Dan kadang-kadang Norton dan akan berkata, fail adalah 93% pulih. 594 00:27:40,605 --> 00:27:42,020 Nah, apa maksudnya? 595 00:27:42,020 --> 00:27:45,690 Itu hanya bermaksud bahawa sesetengah fail lain kebetulan akhirnya menggunakan, berkata, 596 00:27:45,690 --> 00:27:48,920 bit-bit daripada fail asal anda. 597 00:27:48,920 --> 00:27:51,950 >> Jadi apa sebenarnya yang terlibat dalam memulihkan data? 598 00:27:51,950 --> 00:27:55,720 Nah, jika anda tidak mempunyai sesuatu seperti Norton pra-dipasang pada komputer anda, 599 00:27:55,720 --> 00:27:59,510 yang terbaik kadang-kadang anda boleh lakukan ialah melihat pada pemacu keras mencari 600 00:27:59,510 --> 00:28:00,510 corak bit. 601 00:28:00,510 --> 00:28:05,350 Dan salah satu daripada tema set masalah lima adalah bahawa anda akan mencari 602 00:28:05,350 --> 00:28:09,570 bersamaan cakera keras, forensik imej kad kilat padat 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 kebarangkalian, mewakili mula imej JPEG. 605 00:28:16,720 --> 00:28:21,120 >> Dan anda semua boleh memulihkan imej itu oleh andaian, jika saya melihat corak 606 00:28:21,120 --> 00:28:24,380 bit pada gambar forensik, dengan kebarangkalian yang tinggi, yang menandakan 607 00:28:24,380 --> 00:28:25,650 permulaan JPEG. 608 00:28:25,650 --> 00:28:29,520 Dan jika saya melihat corak yang sama sekali lagi, yang mungkin menandakan permulaan 609 00:28:29,520 --> 00:28:32,440 lain JPEG, dan satu lagi JPEG, dan satu lagi JPEG. 610 00:28:32,440 --> 00:28:34,970 Dan ini biasanya bagaimana pemulihan data akan berfungsi. 611 00:28:34,970 --> 00:28:37,870 Apa yang baik tentang JPEG adalah walaupun format fail itu sendiri adalah agak 612 00:28:37,870 --> 00:28:44,400 kompleks, permulaan setiap apa-apa fail adalah sebenarnya agak pasti 613 00:28:44,400 --> 00:28:47,370 dan mudah, kerana anda akan melihat, jika anda tidak telah sudah. 614 00:28:47,370 --> 00:28:50,270 >> Jadi mari kita melihat dengan lebih dekat di bawah hud untuk betul-betul apa yang telah 615 00:28:50,270 --> 00:28:53,360 berlaku, dan apa yang 0 dan 1s adalah, untuk memberi anda sedikit lebih daripada satu 616 00:28:53,360 --> 00:28:55,330 konteks cabaran ini tertentu. 617 00:28:55,330 --> 00:28:55,510 >> [MAIN SEMULA VIDEO] 618 00:28:55,510 --> 00:28:58,700 >> -Jika PC anda menyimpan paling data tetapnya. 619 00:28:58,700 --> 00:29:03,390 Untuk berbuat demikian, data bergerak dari RAM bersama-sama dengan perisian isyarat yang memberitahu 620 00:29:03,390 --> 00:29:06,110 cakera keras bagaimana untuk menyimpan data tersebut. 621 00:29:06,110 --> 00:29:09,410 Litar pemacu keras menterjemahkan orang-orang isyarat kepada voltan 622 00:29:09,410 --> 00:29:10,870 turun naik. 623 00:29:10,870 --> 00:29:14,970 Ini, seterusnya, mengawal cakera keras ini bahagian yang bergerak, sebahagian daripada beberapa 624 00:29:14,970 --> 00:29:17,910 bahagian yang bergerak kiri dalam komputer moden. 625 00:29:17,910 --> 00:29:22,130 >> Sebahagian daripada isyarat kawalan motor yang berputar pinggan-pinggan logam bersalut. 626 00:29:22,130 --> 00:29:25,470 Data anda sebenarnya disimpan atas pinggan. 627 00:29:25,470 --> 00:29:28,610 Isyarat lain menggerakkan baca / tulis kepala untuk membaca atau 628 00:29:28,610 --> 00:29:30,710 menulis data pada pinggan-pinggan. 629 00:29:30,710 --> 00:29:35,450 Jentera ini begitu tepat bahawa manusia rambut tidak dapat lulus antara 630 00:29:35,450 --> 00:29:37,280 kepala dan berputar pinggan-pinggan. 631 00:29:37,280 --> 00:29:40,316 Namun, ia semua kerja-kerja pada kelajuan yang hebat. 632 00:29:40,316 --> 00:29:40,660 >> [AKHIR VIDEO MAIN SEMULA] 633 00:29:40,660 --> 00:29:42,190 >> DAVID MALAN: Zoom dalam sedikit mendalam di apa 634 00:29:42,190 --> 00:29:44,360 sebenarnya kepada mereka pinggan-pinggan. 635 00:29:44,360 --> 00:29:44,720 >> [MAIN SEMULA VIDEO] 636 00:29:44,720 --> 00:29:47,660 >> -Mari kita lihat apa yang kita hanya lihat dalam gerakan perlahan. 637 00:29:47,660 --> 00:29:51,710 Apabila nadi ringkas elektrik dihantar kepada baca / tulis kepala, jika lambungan 638 00:29:51,710 --> 00:29:54,650 pada elektromagnet kecil bagi sebahagian kecil daripada kedua. 639 00:29:54,650 --> 00:29:58,970 Magnet mewujudkan satu bidang yang perubahan kekutuban kecil, kecil 640 00:29:58,970 --> 00:30:02,850 Sebahagian daripada zarah logam yang kot setiap permukaan pinggan. 641 00:30:02,850 --> 00:30:05,940 >> Satu siri corak ini kecil, bayaran-up kawasan pada cakera 642 00:30:05,940 --> 00:30:08,470 mewakili satu bit tunggal data dalam bilangan binari 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 semasa dihantar satu cara melalui membaca yang / tulis kepala, kawasan 645 00:30:13,775 --> 00:30:15,970 adalah polarisasi dalam satu arah. 646 00:30:15,970 --> 00:30:17,950 Jika semasa dihantar dalam arah bertentangan, 647 00:30:17,950 --> 00:30:19,930 polarisasi bertukar. 648 00:30:19,930 --> 00:30:22,370 >> Bagaimana anda mendapat data dari cakera keras? 649 00:30:22,370 --> 00:30:24,090 Hanya membalikkan proses. 650 00:30:24,090 --> 00:30:26,550 Jadi ia adalah zarah pada cakera yang mendapat semasa di dalam 651 00:30:26,550 --> 00:30:27,960 Kepala baca / tulis bergerak. 652 00:30:27,960 --> 00:30:30,700 Meletakkan bersama-sama berjuta-juta ini segmen bermagnet, dan 653 00:30:30,700 --> 00:30:32,160 anda mempunyai fail. 654 00:30:32,160 --> 00:30:36,060 >> Kini, keping fail tunggal boleh yang berselerak di seluruh memandu itu 655 00:30:36,060 --> 00:30:39,970 pinggan-pinggan, jenis seperti keadaan kucar-kacir kertas-kertas di meja anda. 656 00:30:39,970 --> 00:30:43,500 Jadi fail istimewa menjejaki di mana segala-galanya. 657 00:30:43,500 --> 00:30:45,985 Tidakkah anda ingin anda mempunyai sesuatu seperti itu? 658 00:30:45,985 --> 00:30:46,470 >> [AKHIR VIDEO MAIN SEMULA] 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 daripada anda semua membesar dengan ini? 661 00:30:52,070 --> 00:30:53,970 OK, jadi ia adalah sedikit dan kurang tangan setiap tahun. 662 00:30:53,970 --> 00:30:56,550 Tetapi saya gembira anda sekurang-kurangnya biasa dengan mereka, kerana ini dan kita sendiri 663 00:30:56,550 --> 00:31:00,520 buku demo, sedih, mati yang sangat melambatkan kematian sini kebiasaan. 664 00:31:00,520 --> 00:31:04,010 >> Tetapi ini adalah apa yang saya, sekurang-kurangnya, pada tahun sekolah tinggi, penggunaan digunakan untuk sandaran. 665 00:31:04,010 --> 00:31:08,110 Dan ia adalah menakjubkan, kerana anda boleh menyimpan 1.4 megabait pada 666 00:31:08,110 --> 00:31:08,930 ini cakera tertentu. 667 00:31:08,930 --> 00:31:12,260 Dan ini adalah versi ketumpatan tinggi, seperti yang ditunjukkan oleh HD, yang mempunyai 668 00:31:12,260 --> 00:31:14,240 bermakna sebelum HD video hari ini. 669 00:31:14,240 --> 00:31:16,400 >> Kepadatan Standard adalah 800 kilobytes. 670 00:31:16,400 --> 00:31:18,640 Dan sebelum itu, terdapat Cakera 400 kilobait. 671 00:31:18,640 --> 00:31:23,120 Dan sebelum itu, terdapat 5 dan 1/4 cakera inci, yang tidak benar-benar liut, 672 00:31:23,120 --> 00:31:25,680 dan sedikit lebih luas dan lebih tinggi daripada perkara-perkara ini di sini. 673 00:31:25,680 --> 00:31:29,150 Tetapi anda sebenarnya boleh melihat yang dipanggil aspek liut cakera ini. 674 00:31:29,150 --> 00:31:32,630 >> Dan berfungsi, mereka sebenarnya agak sama dengan cakera keras sekurang- 675 00:31:32,630 --> 00:31:33,570 kurangnya jenis ini. 676 00:31:33,570 --> 00:31:37,270 Sekali lagi, SSDs dalam komputer baru bekerja sedikit berbeza. 677 00:31:37,270 --> 00:31:41,530 Tetapi jika anda memindahkan bahawa tab logam sedikit, anda sebenarnya boleh melihat cookies sedikit, 678 00:31:41,530 --> 00:31:42,560 atau piring. 679 00:31:42,560 --> 00:31:43,830 >> Ia bukan logam seperti yang satu ini. 680 00:31:43,830 --> 00:31:46,000 Yang ini sebenarnya beberapa murah bahan plastik. 681 00:31:46,000 --> 00:31:46,750 Dan anda boleh jenis hal bergoyang itu. 682 00:31:46,750 --> 00:31:50,310 Dan anda telah trully hanya dihilangkan dari beberapa bilangan bit atau zarah magnet 683 00:31:50,310 --> 00:31:51,220 dari cakera ini. 684 00:31:51,220 --> 00:31:52,710 >> Jadi bersyukur, tiada apa-apa di atasnya. 685 00:31:52,710 --> 00:31:55,790 Jika perkara itu dengan cara - dan merangkumi mata anda dan orang-orang yang jiran anda - 686 00:31:55,790 --> 00:31:58,865 anda boleh hanya jenis tarik ini keseluruhan off sarung seperti itu. 687 00:31:58,865 --> 00:32:01,900 Tetapi ada spring sedikit, jadi sedar bahawa dengan mata anda. 688 00:32:01,900 --> 00:32:03,620 Jadi sekarang anda mempunyai benar-benar cakera liut. 689 00:32:03,620 --> 00:32:07,090 >> Dan apa yang luar biasa tentang perkara ini adalah bahawa dalam seberapa banyak kerana ini adalah 690 00:32:07,090 --> 00:32:10,830 perwakilan kecil-kecilan yang lebih besar cakera keras, perkara-perkara ini super, 691 00:32:10,830 --> 00:32:11,590 mudah super. 692 00:32:11,590 --> 00:32:15,170 Jika anda picit bahagian bawah ia, sekarang perkara yang logam adalah di luar, dan kulit 693 00:32:15,170 --> 00:32:20,990 mereka membuka, semua ada adalah dua keping dirasai dan cakera liut yang dipanggil 694 00:32:20,990 --> 00:32:22,930 dengan sekeping logam di bahagian dalam. 695 00:32:22,930 --> 00:32:25,990 >> Dan ada pergi separuh daripada kandungan Cakera saya. 696 00:32:25,990 --> 00:32:27,540 Terdapat pergi satu lagi separuh daripada mereka. 697 00:32:27,540 --> 00:32:31,375 Tetapi itu semua yang berputar di dalam 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 meletakkan ini ke dalam perspektif, berapa besar ialah kebanyakan anda 700 00:32:38,310 --> 00:32:39,560 keras memandu hari ini? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabait, terabyte, mungkin dalam komputer meja, 2 terabytes, 3 703 00:32:46,230 --> 00:32:47,630 terabytes, 4 terabytes, bukan? 704 00:32:47,630 --> 00:32:52,480 Ini adalah salah satu megabait, memberi atau mengambil, yang tidak dapat menyesuaikan MP3 biasa 705 00:32:52,480 --> 00:32:55,310 lagi hari ini, atau fail muzik yang sama. 706 00:32:55,310 --> 00:32:59,500 >> Jadi cenderamata sedikit untuk anda hari ini, dan juga untuk membantu contextualize apa 707 00:32:59,500 --> 00:33:03,570 kita akan mengambil untuk diberikan kini dalam masalah menetapkan lima. 708 00:33:03,570 --> 00:33:04,820 Jadi mereka adalah milik anda untuk menjaga. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Jadi biarlah saya peralihan kepada mana akan menghabiskan pset seterusnya juga. 711 00:33:13,370 --> 00:33:18,470 Jadi, sekarang kita telah menetapkan halaman ini untuk - oh, beberapa pengumuman dengan cepat. 712 00:33:18,470 --> 00:33:21,730 >> Jumaat ini, jika anda ingin menyertai CS50 untuk makan tengah hari, pergi ke tempat yang biasa, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 Dan projek akhir - 715 00:33:25,100 --> 00:33:28,520 jadi satu sukatan pelajaran, kita telah mencatatkan spesifikasi projek akhir sudah. 716 00:33:28,520 --> 00:33:31,410 Menyedari bahawa itu tidak bermakna ia disebabkan terutamanya tidak lama lagi. 717 00:33:31,410 --> 00:33:33,990 Ia disiarkan, benar-benar, hanya untuk mendapatkan kamu memikirkan ia. 718 00:33:33,990 --> 00:33:37,620 Dan sesungguhnya, yang ketara super peratusan anda akan menangani 719 00:33:37,620 --> 00:33:40,780 projek akhir pada bahan yang kita tidak walaupun telah mendapat ke dalam kelas, 720 00:33:40,780 --> 00:33:42,730 tetapi akan seawal minggu depan. 721 00:33:42,730 --> 00:33:45,530 >> Notis, walaupun, bahawa spesifikasi memerlukan beberapa komponen yang berbeza daripada 722 00:33:45,530 --> 00:33:46,190 projek akhir. 723 00:33:46,190 --> 00:33:49,590 Yang pertama, dalam beberapa minggu, adalah pra-cadangan, e-mel yang agak kasual untuk 724 00:33:49,590 --> 00:33:52,760 TF anda untuk memberitahu dia atau apa yang anda memikirkan untuk projek anda, dengan 725 00:33:52,760 --> 00:33:53,650 Tiada Komitmen. 726 00:33:53,650 --> 00:33:56,710 Cadangan akan menjadi tertentu anda komitmen, berkata, di sini, ini adalah apa 727 00:33:56,710 --> 00:33:57,770 Saya ingin lakukan untuk projek saya. 728 00:33:57,770 --> 00:33:58,250 Apa yang anda fikir? 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 Adakah ia terkawal? 732 00:34:00,330 --> 00:34:02,230 Dan anda melihat spesifikasi untuk maklumat lanjut. 733 00:34:02,230 --> 00:34:05,060 >> Beberapa minggu selepas itu status laporan, yang adalah sama 734 00:34:05,060 --> 00:34:08,260 e-mel biasa untuk TF anda untuk mengatakan betapa jauh di belakang anda berada di akhir anda 735 00:34:08,260 --> 00:34:12,360 pelaksanaan projek, diikuti oleh Hackathon yang CS50 yang semua orang 736 00:34:12,360 --> 00:34:17,520 adalah dijemput, yang akan menjadi acara dari Pukul 8:00 PM pada satu petang hingga 7:00 737 00:34:17,520 --> 00:34:19,150 AM keesokan harinya. 738 00:34:19,150 --> 00:34:22,560 Pizza, kerana saya mungkin telah disebut dalam seminggu sifar, Wil disampaikan pada 9:00 PM, 739 00:34:22,560 --> 00:34:24,120 Makanan Cina pada jam 1:00 PM. 740 00:34:24,120 --> 00:34:27,929 Dan jika anda masih berjaga pada 5:00 AM kami akan membawa anda ke Ruangan untuk sarapan pagi. 741 00:34:27,929 --> 00:34:31,310 >> Jadi Hackathon adalah salah satu yang lebih pengalaman tidak dapat dilupakan di dalam kelas. 742 00:34:31,310 --> 00:34:35,290 Kemudian pelaksanaan adalah kerana, dan maka CS50 Pesta klimaks. 743 00:34:35,290 --> 00:34:38,070 Maklumat lanjut mengenai semua ini pada minggu-minggu akan datang. 744 00:34:38,070 --> 00:34:40,739 >> Tetapi biarlah kita kembali kepada sesuatu sekolah lama - 745 00:34:40,739 --> 00:34:41,920 lagi, array. 746 00:34:41,920 --> 00:34:45,040 Jadi array adalah bagus, kerana ia menyelesaikan masalah seperti yang kita lihat hanya 747 00:34:45,040 --> 00:34:49,290 masa lalu dengan struktur pelajar mendapat keluar sedikit kawalan jika kita 748 00:34:49,290 --> 00:34:52,405 mahu mempunyai pelajar satu, pelajar dua, tiga pelajar, pelajar dot dot dot, 749 00:34:52,405 --> 00:34:54,400 beberapa nombor sewenang-wenangnya pelajar. 750 00:34:54,400 --> 00:34:58,850 >> Jadi array, beberapa minggu lalu, menukik dalam dan menyelesaikan semua masalah kita tidak 751 00:34:58,850 --> 00:35:03,340 mengetahui terlebih dahulu berapa banyak perkara jenis sesetengah kita mungkin mahu. 752 00:35:03,340 --> 00:35:07,390 Dan kita telah melihat bahawa structs boleh membantu kita terus menganjurkan kod kita dan menyimpan 753 00:35:07,390 --> 00:35:11,660 pembolehubah konsep yang sama, seperti nama dan rumah, bersama-sama, supaya kita 754 00:35:11,660 --> 00:35:15,570 boleh merawat mereka sebagai satu entiti, di dalam di mana terdapat bahagian yang lebih kecil. 755 00:35:15,570 --> 00:35:17,810 >> Tetapi array mempunyai beberapa kelemahan. 756 00:35:17,810 --> 00:35:19,780 Apakah beberapa kelemahan kami telah menemui 757 00:35:19,780 --> 00:35:22,320 dengan pameran setakat ini? 758 00:35:22,320 --> 00:35:23,450 Apa itu? 759 00:35:23,450 --> 00:35:28,130 Saiz tetap - jadi walaupun anda mungkin dapat memperuntukkan memori untuk 760 00:35:28,130 --> 00:35:32,310 pelbagai, sebaik sahaja anda tahu berapa ramai pelajar anda mempunyai, berapa banyak aksara yang anda mempunyai 761 00:35:32,310 --> 00:35:35,460 daripada pengguna, apabila anda telah diperuntukkan pelbagai, anda telah jenis dicat 762 00:35:35,460 --> 00:35:36,740 diri anda ke satu sudut. 763 00:35:36,740 --> 00:35:40,600 >> Kerana anda tidak boleh memasukkan elemen-elemen baru ke tengah-tengah array. 764 00:35:40,600 --> 00:35:43,660 Anda tidak boleh memasukkan lebih elemen pada akhir array. 765 00:35:43,660 --> 00:35:47,750 Betul, anda perlu mengambil jalan untuk mewujudkan pelbagai baru, seperti yang kita telah dibincangkan, 766 00:35:47,750 --> 00:35:49,320 meniru lama ke yang baru. 767 00:35:49,320 --> 00:35:52,610 Dan sekali lagi, yang sakit kepala yang GetString memperkatakan untuk anda. 768 00:35:52,610 --> 00:35:56,170 >> Tetapi sekali lagi, anda bahkan tidak boleh memasukkan sesuatu ke tengah-tengah pelbagai 769 00:35:56,170 --> 00:35:58,200 jika kadar tidak sepenuhnya diisi. 770 00:35:58,200 --> 00:36:03,010 Sebagai contoh, jika ini di sini pelbagai saiz enam hanya mempunyai lima perkara di dalamnya, 771 00:36:03,010 --> 00:36:06,080 baik, hanya anda boleh jelujur sesuatu ke akhir. 772 00:36:06,080 --> 00:36:08,200 Tetapi bagaimana jika anda mahu untuk memasukkan sesuatu ke tengah-tengah 773 00:36:08,200 --> 00:36:11,280 pelbagai, walaupun ia mungkin mempunyai lima daripada enam perkara di dalamnya? 774 00:36:11,280 --> 00:36:14,250 >> Nah, apa yang kita lakukan apabila kita mempunyai segala sukarelawan manusia di atas pentas dalam 775 00:36:14,250 --> 00:36:15,110 minggu lalu? 776 00:36:15,110 --> 00:36:18,710 Jika kita mahu meletakkan seseorang di sini, sama ada orang-orang bagaimana untuk menggerakkan ini 777 00:36:18,710 --> 00:36:22,540 cara atau orang-orang bagaimana untuk menggerakkan ini cara, dan yang menjadi murah. 778 00:36:22,540 --> 00:36:26,950 Peralihan orang di dalam sesuatu pelbagai akhirnya menambah sehingga dan berharga 779 00:36:26,950 --> 00:36:31,240 kami masa, oleh itu banyak n kuasa dua kami berjalan masa-masa seperti jenis kemasukan, untuk 780 00:36:31,240 --> 00:36:32,550 contoh, dalam kes yang paling teruk. 781 00:36:32,550 --> 00:36:36,520 Jadi array yang besar, tetapi anda perlu tahu terlebih dahulu bagaimana besar anda mahu mereka. 782 00:36:36,520 --> 00:36:38,030 >> Jadi OK, di sini adalah penyelesaian. 783 00:36:38,030 --> 00:36:43,860 Jika saya tidak mengetahui terlebih dahulu berapa banyak pelajar saya mungkin mempunyai, dan saya tahu sekali 784 00:36:43,860 --> 00:36:47,870 Saya membuat keputusan, walaupun, saya terperangkap dengan ramai pelajar, mengapa tidak saya sentiasa 785 00:36:47,870 --> 00:36:51,740 memperuntukkan ruang dua kali ganda seperti yang saya sangka saya perlukan? 786 00:36:51,740 --> 00:36:54,450 Bukankah itu penyelesaian yang berpatutan? 787 00:36:54,450 --> 00:36:58,240 >> Realistik, saya tidak fikir bahawa kita akan memerlukan lebih daripada 50 slot 788 00:36:58,240 --> 00:37:02,190 dalam pelbagai untuk kelas bersaiz sederhana, jadi mari kita hanya pusingan up. 789 00:37:02,190 --> 00:37:07,040 Saya akan membuat 100 slot dalam pelbagai saya, hanya supaya kita pasti boleh mendapatkan 790 00:37:07,040 --> 00:37:10,330 Bilangan pelajar saya berharap untuk berada di dalam beberapa kelas saiz sederhana. 791 00:37:10,330 --> 00:37:14,320 Jadi mengapa tidak hanya pusingan dan memperuntukkan memori yang lebih, biasanya, untuk array 792 00:37:14,320 --> 00:37:16,290 dari yang anda fikir anda mungkin perlukan? 793 00:37:16,290 --> 00:37:20,190 Apa pushback ini mudah kepada idea itu? 794 00:37:20,190 --> 00:37:21,440 >> Anda hanya membuang ingatan. 795 00:37:21,440 --> 00:37:25,350 Harfiah setiap program yang anda menulis kemudian ini mungkin menggunakan memori dua kali ganda 796 00:37:25,350 --> 00:37:26,680 anda benar-benar perlukan. 797 00:37:26,680 --> 00:37:28,990 Dan yang hanya tidak berasa seperti terutamanya penyelesaian elegan. 798 00:37:28,990 --> 00:37:31,990 Selain itu, ia hanya mengurangkan kebarangkalian masalah. 799 00:37:31,990 --> 00:37:35,300 Jika anda mempunyai kursus popular satu semester dan anda mempunyai 101 800 00:37:35,300 --> 00:37:39,610 pelajar, program anda masih asasnya menghadapi isu yang sama. 801 00:37:39,610 --> 00:37:44,280 >> Jadi bersyukur, ada penyelesaian untuk iklan ini semua masalah kita dalam bentuk 802 00:37:44,280 --> 00:37:46,790 struktur data yang lebih kompleks daripada orang-orang yang 803 00:37:46,790 --> 00:37:47,970 kita telah melihat setakat ini. 804 00:37:47,970 --> 00:37:50,530 Ini, saya menuntut, adalah senarai berkaitan. 805 00:37:50,530 --> 00:37:51,920 Ini adalah senarai nombor - 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 dikaitkan bersama-sama dengan cara apa yang saya telah dilukis sebagai anak panah. 808 00:38:00,120 --> 00:38:03,580 >> Dalam erti kata lain, jika saya mahu untuk mewakili array, saya boleh melakukan 809 00:38:03,580 --> 00:38:04,910 sesuatu seperti ini. 810 00:38:04,910 --> 00:38:07,310 Dan saya akan meletakkan di atas ini yang dalam hanya seketika. 811 00:38:07,310 --> 00:38:09,970 Boleh saya lakukan - 812 00:38:09,970 --> 00:38:12,520 hello, hak semua. 813 00:38:12,520 --> 00:38:14,470 Berdiri. 814 00:38:14,470 --> 00:38:17,360 Komputer baru di sini, yang jelas - 815 00:38:17,360 --> 00:38:18,090 hak semua. 816 00:38:18,090 --> 00:38:21,730 >> Jadi jika saya mempunyai nombor-nombor dalam pelbagai - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 tidak semestinya mengikut skala. 819 00:38:30,530 --> 00:38:33,730 Baiklah, jadi di sini adalah pelbagai saya - 820 00:38:33,730 --> 00:38:34,980 oh tuhan. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Baiklah, jadi di sini adalah pelbagai saya. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh tuhan. 825 00:38:45,050 --> 00:38:48,820 >> [Ketawa] 826 00:38:48,820 --> 00:38:49,440 >> DAVID MALAN: berpura-pura. 827 00:38:49,440 --> 00:38:52,330 Ia terlalu banyak usaha untuk kembali dan menetapkan itu, jadi di sana - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Jadi kita mempunyai pelbagai ini 9, 17, 22, 26, dan 34. 830 00:38:57,650 --> 00:39:00,260 Bagi anda boleh lihat kesilapan memalukan saya hanya dibuat, 831 00:39:00,260 --> 00:39:00,830 ada ia. 832 00:39:00,830 --> 00:39:04,490 >> Jadi, saya mengatakan bahawa ini adalah satu penyelesaian yang sangat cekap. 833 00:39:04,490 --> 00:39:07,310 Saya telah diperuntukkan sebagai banyak sebagai Ints Saya perlu - satu, kedua-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 saya kemudian disimpan nombor dalam pelbagai ini. 836 00:39:11,660 --> 00:39:15,220 Tetapi rasa, maka, saya ingin memasukkan satu nilai seperti nombor 8? 837 00:39:15,220 --> 00:39:16,100 Nah, di mana ia pergi? 838 00:39:16,100 --> 00:39:18,530 Katakan saya mahu memasukkan beberapa seperti 20. 839 00:39:18,530 --> 00:39:19,790 Nah, di mana ia pergi? 840 00:39:19,790 --> 00:39:23,160 Suatu tempat di sana di tengah-tengah, atau nombor 35 telah pergi 841 00:39:23,160 --> 00:39:24,010 tempat pada akhir. 842 00:39:24,010 --> 00:39:25,320 Tetapi saya keluar semua ruang. 843 00:39:25,320 --> 00:39:29,120 >> Dan jadi ini adalah satu cabaran asas array yang tidak adalah penyelesaian. 844 00:39:29,120 --> 00:39:32,280 Saya mendakwa masa yang lalu, GetString menyelesaikan masalah ini. 845 00:39:32,280 --> 00:39:37,380 Jika anda ingin memasukkan nombor keenam ke dalam pelbagai ini, apa yang sekurang-kurangnya satu 846 00:39:37,380 --> 00:39:40,090 penyelesaian anda boleh kembali kepada yang pasti, 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, menjadikan ia lebih besar lebih mudah berkata daripada dilakukan. 850 00:39:48,190 --> 00:39:52,810 Kita tidak boleh semestinya membuat pelbagai lebih besar, tetapi apa yang kita boleh buat? 851 00:39:52,810 --> 00:39:56,570 Buat pelbagai baru yang lebih besar, saiz 6, atau mungkin saiz 10, jika kita mahu 852 00:39:56,570 --> 00:40:00,490 untuk mendapatkan lebih awal daripada perkara-perkara, dan kemudian salin pelbagai lama ke baru, dan kemudian 853 00:40:00,490 --> 00:40:01,680 membebaskan pelbagai lama. 854 00:40:01,680 --> 00:40:05,770 >> Tetapi apa yang masa berjalan kini dalam proses itu? 855 00:40:05,770 --> 00:40:09,870 Ia adalah besar O n, kerana menyalin akan kos anda beberapa unit 856 00:40:09,870 --> 00:40:13,480 masa, jadi tidak begitu sesuai jika kita perlu memperuntukkan pelbagai baru, yang akan 857 00:40:13,480 --> 00:40:15,610 untuk mengambil dua kali ganda ingatan sementara. 858 00:40:15,610 --> 00:40:16,660 Salinan lama ke baru - 859 00:40:16,660 --> 00:40:18,800 Maksud aku, ia 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 kita boleh lakukan, bukan? 862 00:40:21,380 --> 00:40:25,000 Nah, bagaimana jika struktur data kami sebenarnya mempunyai jurang di dalamnya? 863 00:40:25,000 --> 00:40:30,790 Katakan bahawa saya berehat matlamat saya mempunyai ketulan berdampingan ingatan, di mana 9 864 00:40:30,790 --> 00:40:34,500 betul-betul bersebelahan dengan 17, yang merupakan betul bersebelahan dengan 22, dan sebagainya. 865 00:40:34,500 --> 00:40:39,570 >> Dan andaikan bahawa 9 boleh lebih di sini di RAM, dan 17 boleh terlebih di sini dalam RAM, 866 00:40:39,570 --> 00:40:40,990 dan 22 boleh terlebih di sini dalam RAM. 867 00:40:40,990 --> 00:40:43,610 Dalam erti kata lain, saya tidak memerlukan mereka walaupun kembali ke belakang lagi. 868 00:40:43,610 --> 00:40:47,850 Saya hanya perlu entah bagaimana benang jarum melalui setiap nombor-nombor ini, atau setiap 869 00:40:47,850 --> 00:40:51,010 nod ini, seperti yang kita akan memanggil segi empat tepat seperti yang telah saya diambil mereka, 870 00:40:51,010 --> 00:40:55,670 ingat bagaimana untuk sampai ke lepas nod itu daripada yang pertama. 871 00:40:55,670 --> 00:40:59,940 >> Jadi, apakah program yang membina kita telah melihat baru-baru ini yang aku 872 00:40:59,940 --> 00:41:03,030 boleh melaksanakan benang itu, atau disediakan di sini, dengan yang saya boleh 873 00:41:03,030 --> 00:41:05,430 melaksanakan mereka anak panah? 874 00:41:05,430 --> 00:41:06,500 Petunjuk Jadi, bukan? 875 00:41:06,500 --> 00:41:09,560 Jika saya tidak memperuntukkan hanya int, tetapi nod - dan oleh 876 00:41:09,560 --> 00:41:10,810 nod, saya hanya bermakna bekas. 877 00:41:10,810 --> 00:41:12,900 Dan visual, saya maksudkan segi empat tepat. 878 00:41:12,900 --> 00:41:16,420 Jadi nod nampaknya memerlukan mengandungi dua nilai - 879 00:41:16,420 --> 00:41:21,490 int itu sendiri, dan kemudian, seperti yang dibayangkan oleh separuh bahagian bawah segi empat tepat, 880 00:41:21,490 --> 00:41:23,010 ruang yang mencukupi untuk int an. 881 00:41:23,010 --> 00:41:26,130 >> Jadi hanya berfikir ke hadapan di sini, bagaimana besar adalah nod ini, ini 882 00:41:26,130 --> 00:41:27,170 bekas dalam soalan? 883 00:41:27,170 --> 00:41:29,250 Berapa banyak bait untuk int? 884 00:41:29,250 --> 00:41:31,310 Mungkin 4, jika ia yang sama seperti biasa. 885 00:41:31,310 --> 00:41:33,270 Dan kemudian berapa banyak bait bagi penunjuk? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Jadi ini bekas, atau nod ini, adalah akan menjadi satu struktur 8-bait. 888 00:41:37,940 --> 00:41:41,760 Oh, dan itu adalah satu kebetulan gembira kita hanya memperkenalkan konsep ini 889 00:41:41,760 --> 00:41:44,400 a struct, atau struktur C a. 890 00:41:44,400 --> 00:41:48,890 >> Jadi saya mendakwa bahawa saya ingin mengambil langkah ke arah yang lebih canggih 891 00:41:48,890 --> 00:41:52,560 pelaksanaan senarai nombor, satu Senarai berkaitan nombor, saya perlu melakukan 892 00:41:52,560 --> 00:41:56,920 berfikir lebih sedikit di depan dan mengaku bukan hanya int, tetapi struct a 893 00:41:56,920 --> 00:41:58,620 bahawa saya akan memanggil, konvensional di sini, nod. 894 00:41:58,620 --> 00:42:01,630 Kita boleh memanggilnya apa yang kita mahu, tetapi nod akan menjadi tema dalam banyak 895 00:42:01,630 --> 00:42:03,560 satu perkara yang kita mula melihat sekarang. 896 00:42:03,560 --> 00:42:06,480 >> Di dalam nod yang merupakan n int. 897 00:42:06,480 --> 00:42:09,350 Dan kemudian sintaks ini, sedikit pelik pada pandangan pertama - 898 00:42:09,350 --> 00:42:12,960 struct nod * seterusnya. 899 00:42:12,960 --> 00:42:16,900 Well bergambar, apakah itu? 900 00:42:16,900 --> 00:42:21,000 Itu adalah separuh bahagian bawah segi empat tepat yang kita lihat 901 00:42:21,000 --> 00:42:22,730 hanya masa yang lalu. 902 00:42:22,730 --> 00:42:27,600 >> Tetapi mengapa saya mengatakan struct nod * berbanding hanya nod *? 903 00:42:27,600 --> 00:42:31,370 Kerana jika penunjuk yang menunjuk pada nod yang lain, ia hanya 904 00:42:31,370 --> 00:42:32,760 alamat nod. 905 00:42:32,760 --> 00:42:35,630 Itulah yang konsisten dengan apa yang kita telah membincangkan mengenai petunjuk setakat ini. 906 00:42:35,630 --> 00:42:39,690 Tetapi mengapa, jika saya menuntut struktur ini adalah dipanggil nod, adakah saya perlu mengatakan struct 907 00:42:39,690 --> 00:42:42,660 nod dalam sini? 908 00:42:42,660 --> 00:42:43,190 >> Tepat sekali. 909 00:42:43,190 --> 00:42:46,490 Ia adalah jenis kenyataan bodoh C. The typedef, jadi untuk bercakap, tidak mempunyai 910 00:42:46,490 --> 00:42:47,220 berlaku lagi. 911 00:42:47,220 --> 00:42:48,510 C super literal. 912 00:42:48,510 --> 00:42:51,050 Ia berbunyi atas kod anda untuk bawah, kiri ke kanan. 913 00:42:51,050 --> 00:42:54,930 Dan sehingga ia mencecah koma bertitik bahawa pada Dasarnya, meneka apa yang tidak 914 00:42:54,930 --> 00:42:57,590 wujud sebagai jenis data? 915 00:42:57,590 --> 00:42:59,060 Node, quote unquote nod. 916 00:42:59,060 --> 00:43:03,050 >> Tetapi oleh kerana lebih lantung akuan saya lakukan pada baris pertama - 917 00:43:03,050 --> 00:43:05,340 typedef nod struct - 918 00:43:05,340 --> 00:43:08,790 kerana mendapat tempat pertama, sebelum pendakap kerinting, itulah jenis seperti 919 00:43:08,790 --> 00:43:11,800 pra-mendidik dilafaz itu, anda tahu apa, memberi saya satu struct 920 00:43:11,800 --> 00:43:13,570 dipanggil nod struct. 921 00:43:13,570 --> 00:43:16,270 Terus terang, saya tidak suka memanggil perkara struct nod, struct nod semua 922 00:43:16,270 --> 00:43:17,090 sepanjang kod saya. 923 00:43:17,090 --> 00:43:20,660 Tetapi saya hanya akan menggunakannya sekali, hanya di dalam, supaya saya boleh berkesan 924 00:43:20,660 --> 00:43:25,010 mencipta sejenis rujukan pekeliling, tidak penunjuk kepada diri saya sendiri per se, tetapi 925 00:43:25,010 --> 00:43:29,400 penunjuk kepada satu lagi jenis yang sama. 926 00:43:29,400 --> 00:43:32,330 >> Jadi ternyata bahawa pada struktur data seperti ini, terdapat beberapa 927 00:43:32,330 --> 00:43:34,470 operasi yang mungkin kepentingan kepada kami. 928 00:43:34,470 --> 00:43:37,460 Kita mungkin mahu memasukkan ke dalam senarai seperti ini. 929 00:43:37,460 --> 00:43:39,850 Kita mungkin mahu memadam daripada senarai seperti ini. 930 00:43:39,850 --> 00:43:43,490 Kita mungkin ingin mencari senarai untuk nilai, atau lebih amnya, gerakan pantas. 931 00:43:43,490 --> 00:43:46,410 Dan traverse adalah hanya satu cara mewah berkata permulaan di sebelah 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 notis, walaupun dengan ini lebih sedikit struktur data yang canggih, marilah 934 00:43:52,640 --> 00:43:56,510 saya mencadangkan supaya kita boleh meminjam beberapa idea-idea dua minggu lalu dan 935 00:43:56,510 --> 00:43:58,410 melaksanakan fungsi yang dipanggil mencari seperti ini. 936 00:43:58,410 --> 00:44:01,360 Ia akan kembali benar atau palsu, menunjukkan, ya atau 937 00:44:01,360 --> 00:44:03,390 ada, n adalah dalam senarai. 938 00:44:03,390 --> 00:44:05,960 Hujah kedua adalah penunjuk ke dalam senarai itu sendiri, jadi 939 00:44:05,960 --> 00:44:07,920 penunjuk kepada nod. 940 00:44:07,920 --> 00:44:10,350 >> Semua saya akan lakukan adalah kemudian mengisytiharkan berubah-ubah sementara. 941 00:44:10,350 --> 00:44:12,730 Kita akan memanggilnya ptr dengan konvensyen, untuk penunjuk. 942 00:44:12,730 --> 00:44:15,220 Dan saya sediakan sama dengan awal senarai. 943 00:44:15,220 --> 00:44:16,680 >> Dan kini melihat gelung sementara. 944 00:44:16,680 --> 00:44:20,640 Selagi penunjuk tidak sama untuk menyeimbangkan, saya akan menyemak. 945 00:44:20,640 --> 00:44:24,520 Adalah penunjuk arrow n sama dengan n yang telah diluluskan dalam? 946 00:44:24,520 --> 00:44:26,410 Dan tunggu satu minit - new sekeping sintaksis. 947 00:44:26,410 --> 00:44:29,324 Apakah arrow 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 sekali. 951 00:44:34,810 --> 00:44:38,860 Jadi manakala beberapa minit lalu, kami menggunakan notasi titik untuk mengakses sesuatu 952 00:44:38,860 --> 00:44:43,080 dalam sebuah struct, jika berubah-ubah anda tidak adalah struct itu 953 00:44:43,080 --> 00:44:47,420 sendiri, tetapi penunjuk kepada struct itu, bersyukur, sekeping sintaks yang 954 00:44:47,420 --> 00:44:48,620 akhirnya masuk akal intuitif. 955 00:44:48,620 --> 00:44:52,360 Arrow bermakna mengikuti penunjuk, seperti anak panah kita biasanya bermakna 956 00:44:52,360 --> 00:44:56,570 bergambar, dan pergi bidang data dalam. 957 00:44:56,570 --> 00:44:59,700 Jadi arrow adalah perkara yang sama sebagai titik, tetapi anda gunakan apabila anda mempunyai penunjuk. 958 00:44:59,700 --> 00:45:05,270 >> Jadi untuk menggulung itu, jika bidang n dalam struct yang dipanggil penunjuk 959 00:45:05,270 --> 00:45:07,760 sama sama n, kembali benar. 960 00:45:07,760 --> 00:45:11,970 Sebaliknya, baris ini di sini - pointer sama penunjuk akan datang. 961 00:45:11,970 --> 00:45:17,540 Jadi apa ini dilakukan, notis, jika saya saya sedang menghala ke arah yang struct 962 00:45:17,540 --> 00:45:21,430 mengandungi 9, dan 9 tidak adalah bilangan Saya cari - katakan saya mencari 963 00:45:21,430 --> 00:45:22,830 n bersamaan 50 - 964 00:45:22,830 --> 00:45:25,930 Saya akan mengemas kini penunjuk sementara saya untuk tidak menunjukkan pada nod ini 965 00:45:25,930 --> 00:45:31,190 lagi, tetapi penunjuk arrow depan, yang akan meletakkan saya di sini. 966 00:45:31,190 --> 00:45:34,270 >> Sekarang, saya sedar adalah badai pengenalan. 967 00:45:34,270 --> 00:45:37,380 Pada hari Rabu, kami benar-benar akan melakukan ini dengan beberapa manusia dan dengan ada yang lebih 968 00:45:37,380 --> 00:45:38,900 kod pada kadar yang lebih perlahan. 969 00:45:38,900 --> 00:45:42,990 Tetapi sedar, kami sedang membuat data kami struktur yang lebih kompleks supaya kita 970 00:45:42,990 --> 00:45:45,780 algoritma boleh mendapatkan lebih cekap, yang akan menjadi perlu untuk 971 00:45:45,780 --> 00:45:50,500 pset enam, apabila kita memuatkan, sekali lagi, orang-orang 150,000 perkataan, tetapi perlu untuk berbuat demikian 972 00:45:50,500 --> 00:45:55,650 cekap, dan ideal, buat program yang berjalan untuk pengguna kami tidak 973 00:45:55,650 --> 00:46:00,460 linear, tidak n kuasa dua, tetapi dalam masa yang berterusan, di ideal. 974 00:46:00,460 --> 00:46:02,300 >> Kami akan melihat anda pada hari Rabu. 975 00:46:02,300 --> 00:46:07,240 >> SPEAKER: Pada CS50 seterusnya, David lupa kes asas beliau. 976 00:46:07,240 --> 00:46:12,770 >> DAVID MALAN: Dan itulah bagaimana anda menghantar mesej teks dengan C. Apa - 977 00:46:12,770 --> 00:46:14,020 >> [MESSAGE TEXT PELBAGAI PEMBERITAHUAN Bunyi] 978 00:46:14,020 --> 00:46:19,734