1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> DAVID J. Malan: Baiklah. 3 00:00:12,900 --> 00:00:16,790 Jadi selamat datang untuk pertama kalinya CS50 postmortem untuk kuis. 4 00:00:16,790 --> 00:00:18,340 Kami pikir kami akan meresmikan tradisi ini tahun ini. 5 00:00:18,340 --> 00:00:20,960 Dan ini akan menjadi kesempatan berjalan melalui 6 00:00:20,960 --> 00:00:22,220 solusi untuk kuis. 7 00:00:22,220 --> 00:00:26,160 Dan kami akan mempercepat atau memperlambat berbasis pada kepentingan orang-orang di sini. 8 00:00:26,160 --> 00:00:29,730 >> Jadi Anda mungkin di sini karena kau tertarik pada bagaimana Anda bisa memiliki atau 9 00:00:29,730 --> 00:00:31,170 harus menjawab beberapa masalah ini. 10 00:00:31,170 --> 00:00:33,300 Jadi kenapa tidak kita lihat pada bagian ini terlebih dahulu? 11 00:00:33,300 --> 00:00:34,450 Sehingga mendapatkan string. 12 00:00:34,450 --> 00:00:37,600 Ini memberi Anda tiga versi yang berbeda dari program itu, pada akhirnya, 13 00:00:37,600 --> 00:00:39,650 dimaksudkan untuk mendapatkan string dari pengguna. 14 00:00:39,650 --> 00:00:42,530 Apakah atau tidak itu yang diserahkan kepada Anda untuk menentukan. 15 00:00:42,530 --> 00:00:45,150 >> Dan kami bertanya Pertanyaan 0, anggaplah bahwa versi 1 adalah 16 00:00:45,150 --> 00:00:46,400 dikompilasi dan dijalankan. 17 00:00:46,400 --> 00:00:48,860 Mengapa mungkin program segfault? 18 00:00:48,860 --> 00:00:51,150 Pada pandangan pertama, ada saran mengapa? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 Ya. 21 00:00:54,489 --> 00:00:59,260 >> AUDIENCE: Jadi saya ingat melihat ini dalam contoh sebelumnya melihat 22 00:00:59,260 --> 00:01:05,506 char * s dan melihat scan dari s dan melihat karena pointer, bagaimana 23 00:01:05,506 --> 00:01:07,971 apakah itu mempengaruhi apa yang Anda discan dalam? 24 00:01:07,971 --> 00:01:10,940 Apakah itu s atau alamat s? 25 00:01:10,940 --> 00:01:11,180 >> DAVID J. Malan: OK. 26 00:01:11,180 --> 00:01:11,480 Baik. 27 00:01:11,480 --> 00:01:14,830 Jadi akhirnya, sumber masalah ini mungkin akan mengurangi 28 00:01:14,830 --> 00:01:16,210 dengan variabel s. 29 00:01:16,210 --> 00:01:17,280 Dan itu memang variabel. 30 00:01:17,280 --> 00:01:19,900 Tipe data dari variabel yang char *, yang berarti itu akan 31 00:01:19,900 --> 00:01:22,570 berisi alamat dari karakter. 32 00:01:22,570 --> 00:01:23,850 Dan di situlah letak wawasan. 33 00:01:23,850 --> 00:01:28,330 Ini akan berisi alamat dari karakter atau, lebih umum, 34 00:01:28,330 --> 00:01:32,110 alamat karakter pertama di seluruh blok karakter. 35 00:01:32,110 --> 00:01:36,680 >> Tapi menangkap adalah bahwa pemindaian s, tujuan dalam hidup, diberi alamat dan diberikan 36 00:01:36,680 --> 00:01:40,960 kode format, seperti% s, baca string ke dalam sepotong 37 00:01:40,960 --> 00:01:42,330 memori di alamat itu. 38 00:01:42,330 --> 00:01:46,040 Tapi karena tidak ada tanda sama sebelum bahwa titik koma pada pertama 39 00:01:46,040 --> 00:01:49,310 baris kode, karena kita tidak benar-benar mengalokasikan memori dengan 40 00:01:49,310 --> 00:01:53,020 malloc, karena tidak benar-benar mengalokasikan sebuah array dari beberapa ukuran, semua 41 00:01:53,020 --> 00:01:57,620 Anda lakukan adalah membaca pengguna input keyboard ke dalam beberapa lengkap 42 00:01:57,620 --> 00:02:00,490 nilai sampah, yang adalah default. 43 00:02:00,490 --> 00:02:04,480 Jadi kemungkinan yang Anda akan segfault jika alamat yang tidak hanya begitu terjadi 44 00:02:04,480 --> 00:02:08,009 menjadi nilai yang Anda bisa, pada kenyataannya, menulis. 45 00:02:08,009 --> 00:02:10,889 Begitu buruk tidak mengalokasikan memori Anda di sana. 46 00:02:10,889 --> 00:02:13,150 >> Jadi dalam pertanyaan 1, kita bertanya, anggaplah bahwa versi 2 47 00:02:13,150 --> 00:02:14,230 dikompilasi dan dijalankan. 48 00:02:14,230 --> 00:02:15,900 Mengapa mungkin program ini segfault? 49 00:02:15,900 --> 00:02:17,990 Jadi yang satu ini kurang buggy. 50 00:02:17,990 --> 00:02:21,470 Dan benar-benar hanya satu cara yang jelas di mana Anda dapat 51 00:02:21,470 --> 00:02:22,810 memicu segfault di sini. 52 00:02:22,810 --> 00:02:23,730 Dan ini adalah tematik. 53 00:02:23,730 --> 00:02:28,180 Setiap kali kita menggunakan c dalam memori, apa Anda bisa lakukan untuk menginduksi segfault 54 00:02:28,180 --> 00:02:30,718 dengan versi 2? 55 00:02:30,718 --> 00:02:35,560 >> AUDIENCE: Jika Anda menggunakan masukan bahwa dalam string yang lebih panjang dari 49 56 00:02:35,560 --> 00:02:35,975 karakter. 57 00:02:35,975 --> 00:02:37,260 >> DAVID J. Malan: Tepat. 58 00:02:37,260 --> 00:02:41,420 Setiap kali Anda melihat sesuatu yang tetap panjang ketika datang ke array, Anda 59 00:02:41,420 --> 00:02:44,650 radar harus pergi bahwa ini bisa menjadi bermasalah jika Anda tidak memeriksa 60 00:02:44,650 --> 00:02:45,810 batas-batas array. 61 00:02:45,810 --> 00:02:46,650 Dan itulah masalahnya di sini. 62 00:02:46,650 --> 00:02:47,910 Kami masih menggunakan scanf. 63 00:02:47,910 --> 00:02:52,200 Kami masih menggunakan% s, yang berarti mencoba untuk membaca string dari pengguna. 64 00:02:52,200 --> 00:02:56,300 Itu akan dibaca ke s, yang, pada saat ini, secara efektif 65 00:02:56,300 --> 00:02:58,570 alamat sepotong memori atau setara. 66 00:02:58,570 --> 00:03:02,080 Ini adalah nama dari array karakter dari memori. 67 00:03:02,080 --> 00:03:07,610 >> Tapi hal itu, jika Anda membaca string yang lebih panjang dari 49 karakter, 49 68 00:03:07,610 --> 00:03:10,440 karena Anda membutuhkan ruang untuk backslash 0, Anda akan meluap 69 00:03:10,440 --> 00:03:11,390 buffer. 70 00:03:11,390 --> 00:03:16,410 Dan Anda mungkin beruntung dan dapat menulis karakter ke-51, ke-52, ke-53. 71 00:03:16,410 --> 00:03:18,560 Namun di beberapa titik, OS akan mengatakan, tidak ada. 72 00:03:18,560 --> 00:03:21,270 Ini jelas bukan memori Anda diperbolehkan untuk menyentuh. 73 00:03:21,270 --> 00:03:23,380 Dan program ini akan segfault. 74 00:03:23,380 --> 00:03:26,650 >> Jadi ada, heuristik boleh ada Anda punya waktu panjang tetap, Anda memiliki 75 00:03:26,650 --> 00:03:30,150 untuk memastikan Anda memeriksa panjang dari apa pun yang Anda mencoba 76 00:03:30,150 --> 00:03:31,090 untuk membaca ke dalamnya. 77 00:03:31,090 --> 00:03:35,110 >> AUDIENCE: Jadi untuk mengatasi itu, Anda bisa memiliki pernyataan memeriksa sebenarnya 78 00:03:35,110 --> 00:03:37,140 adalah panjang yang lebih besar dari atau kurang dari? 79 00:03:37,140 --> 00:03:37,730 >> DAVID J. Malan: Tentu saja. 80 00:03:37,730 --> 00:03:41,706 Anda hanya memiliki kondisi yang mengatakan, jika - 81 00:03:41,706 --> 00:03:46,080 atau lebih tepatnya Anda tidak perlu tahu di muka berapa banyak karakter yang 82 00:03:46,080 --> 00:03:49,060 pengguna akan mengetik, karena Anda memiliki ayam dan telur. 83 00:03:49,060 --> 00:03:51,860 Tidak sampai Anda sudah membacanya dengan scanf Anda dapat mengetahui berapa lama itu. 84 00:03:51,860 --> 00:03:54,500 Tapi pada saat itu, sudah terlambat, karena Anda sudah membaca ke 85 00:03:54,500 --> 00:03:55,710 beberapa blok memori. 86 00:03:55,710 --> 00:03:59,590 Jadi sebagai samping, hindari perpustakaan CS50 masalah ini sama sekali, mengingat 87 00:03:59,590 --> 00:04:01,060 dengan menggunakan fgetc. 88 00:04:01,060 --> 00:04:05,390 Dan membaca satu karakter pada satu waktu, tip-toeing bersama, mengetahui bahwa Anda 89 00:04:05,390 --> 00:04:08,060 tidak bisa meluap karakter jika Anda membaca satu per satu. 90 00:04:08,060 --> 00:04:11,580 >> Menangkap adalah dengan GetString recall adalah bahwa kita harus terus-menerus kembali ukuran 91 00:04:11,580 --> 00:04:13,590 bahwa sepotong memori, yang hanya sakit. 92 00:04:13,590 --> 00:04:15,310 Ini banyak baris kode untuk melakukan itu. 93 00:04:15,310 --> 00:04:18,779 Jadi pendekatan lain akan benar-benar menggunakan sepupu, sehingga 94 00:04:18,779 --> 00:04:19,790 untuk berbicara, dari scanf. 95 00:04:19,790 --> 00:04:22,820 Ada varian banyak ini fungsi yang benar-benar memeriksa 96 00:04:22,820 --> 00:04:25,870 panjang berapa banyak karakter Anda mungkin membaca secara maksimal. 97 00:04:25,870 --> 00:04:29,430 Dan Anda bisa menentukan, tidak membaca lebih dari 50 karakter. 98 00:04:29,430 --> 00:04:34,110 Sehingga akan menjadi pendekatan lain tetapi kurang akomodatif input yang lebih besar. 99 00:04:34,110 --> 00:04:37,040 >> Jadi pertanyaan 2 bertanya, misalkan versi yang 3 dikompilasi dan dieksekusi. 100 00:04:37,040 --> 00:04:39,960 Mengapa mungkin program yang segfault? 101 00:04:39,960 --> 00:04:42,650 Jadi yang satu ini sebenarnya sama menjawab, meskipun 102 00:04:42,650 --> 00:04:43,590 terlihat sedikit lebih menarik. 103 00:04:43,590 --> 00:04:46,440 Kami menggunakan malloc, yang terasa seperti kita memberikan diri kita lebih banyak pilihan. 104 00:04:46,440 --> 00:04:48,030 Dan kemudian kita membebaskan bahwa memori di akhir. 105 00:04:48,030 --> 00:04:49,580 Ini masih hanya 50 byte memori. 106 00:04:49,580 --> 00:04:53,620 Jadi kita mungkin masih mencoba untuk membaca di 51, 52, 1.000 bytes. 107 00:04:53,620 --> 00:04:55,830 Itu akan segfault untuk alasan yang sama persis. 108 00:04:55,830 --> 00:04:57,530 >> Tapi ada alasan lain juga. 109 00:04:57,530 --> 00:05:03,890 Apa lagi yang bisa malloc kembali selain alamat sepotong memori? 110 00:05:03,890 --> 00:05:04,920 Ini bisa kembali null. 111 00:05:04,920 --> 00:05:07,560 Dan karena kita tidak memeriksa itu, kita mungkin akan melakukan sesuatu 112 00:05:07,560 --> 00:05:11,350 bodoh karena alasan lain, yaitu bahwa kita mungkin akan mengatakan scanf, baca 113 00:05:11,350 --> 00:05:16,050 input pengguna dari keyboard menjadi 0 lokasi, AKA null. 114 00:05:16,050 --> 00:05:18,890 Dan itu juga, pasti akan memicu segfault. 115 00:05:18,890 --> 00:05:21,590 Jadi untuk tujuan kuis, kita akan telah menerima salah satu dari mereka sebagai 116 00:05:21,590 --> 00:05:22,740 alasan yang sah. 117 00:05:22,740 --> 00:05:23,420 Salah satunya adalah identik. 118 00:05:23,420 --> 00:05:25,720 Salah satunya adalah sedikit lebih bernuansa. 119 00:05:25,720 --> 00:05:28,975 >> Terakhir, sehubungan dengan program penggunaan memori, bagaimana versi 2 dan 120 00:05:28,975 --> 00:05:30,350 versi 3 berbeda? 121 00:05:30,350 --> 00:05:35,070 Jadi untuk apa itu layak, kita melihat pasokan tampaknya tak berujung mungkin 122 00:05:35,070 --> 00:05:35,770 jawaban ini. 123 00:05:35,770 --> 00:05:39,300 Dan di antara jawaban orang, apa yang kami harapkan, tapi kami menerima lain 124 00:05:39,300 --> 00:05:42,250 hal, beberapa menyebutkan Fakta bahwa versi 2 menggunakan 125 00:05:42,250 --> 00:05:44,560 yang disebut stack. 126 00:05:44,560 --> 00:05:46,710 Versi 3 menggunakan heap. 127 00:05:46,710 --> 00:05:50,060 Dan secara fungsional, ini tidak benar-benar membuat semua yang banyak perbedaan. 128 00:05:50,060 --> 00:05:54,040 Pada akhir hari, kita masih hanya mendapatkan 50 byte memori. 129 00:05:54,040 --> 00:05:56,640 >> Tapi itu salah satu kemungkinan jawaban bahwa kita sedang melihat. 130 00:05:56,640 --> 00:05:59,730 Tapi Anda akan melihat, karena Anda mendapatkan kuis Anda kembali dari TF, yang kami lakukan 131 00:05:59,730 --> 00:06:04,330 menerima diskusi lain mereka penggunaan yang berbeda dari memori juga. 132 00:06:04,330 --> 00:06:08,600 Tapi stack dan heap akan jawaban yang mudah untuk pergi bersama. 133 00:06:08,600 --> 00:06:11,150 Ada pertanyaan? 134 00:06:11,150 --> 00:06:12,400 Saya memberikan Rob. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB Bowden: Jadi masalah 4. 137 00:06:20,210 --> 00:06:21,985 Ini adalah salah satu di mana Anda harus mengisi dalam jumlah byte dari semua 138 00:06:21,985 --> 00:06:23,460 jenis yang berbeda digunakan. 139 00:06:23,460 --> 00:06:24,830 Jadi hal pertama yang kita lihat. 140 00:06:24,830 --> 00:06:27,930 Asumsikan arsitektur 32-bit, seperti alat CS50 ini. 141 00:06:27,930 --> 00:06:33,530 Jadi salah satu hal mendasar tentang Arsitektur 32-bit, yang memberitahu kita 142 00:06:33,530 --> 00:06:37,490 persis seberapa besar pointer akan berada di arsitektur. 143 00:06:37,490 --> 00:06:43,020 >> Jadi segera, kita tahu bahwa setiap pointer Jenis adalah 32-bit atau 4 byte. 144 00:06:43,020 --> 00:06:46,010 Jadi melihat tabel ini, simpul * adalah jenis pointer. 145 00:06:46,010 --> 00:06:47,250 Itu akan menjadi 4 byte. 146 00:06:47,250 --> 00:06:51,640 Struct simpul *, yang secara harfiah identik dengan bintang simpul. 147 00:06:51,640 --> 00:06:53,590 Dan sehingga akan menjadi 4 byte. 148 00:06:53,590 --> 00:06:58,270 String, sehingga tidak terlihat seperti pointer, tapi typedef, a 149 00:06:58,270 --> 00:07:01,590 string hanya char *, yang adalah jenis pointer. 150 00:07:01,590 --> 00:07:03,550 Sehingga akan menjadi 4 byte. 151 00:07:03,550 --> 00:07:06,150 >> Jadi ketiganya adalah semua 4 byte. 152 00:07:06,150 --> 00:07:09,350 Sekarang, node dan mahasiswa yang sedikit lebih rumit. 153 00:07:09,350 --> 00:07:15,160 Jadi melihat simpul dan mahasiswa, kita melihat node sebagai integer dan pointer. 154 00:07:15,160 --> 00:07:18,050 Dan mahasiswa adalah dua pointer di dalamnya. 155 00:07:18,050 --> 00:07:23,340 Jadi setidaknya untuk kasus kami di sini, jalan bahwa kita akhirnya menghitung ukuran 156 00:07:23,340 --> 00:07:27,020 struct ini hanya menambahkan semuanya yang ada di dalam struct. 157 00:07:27,020 --> 00:07:30,690 >> Jadi untuk node, kita memiliki sebuah integer, yang 4 byte. 158 00:07:30,690 --> 00:07:32,830 Kami memiliki pointer, yang adalah 4 byte. 159 00:07:32,830 --> 00:07:35,820 Dan satu node akan untuk mengambil 8 byte. 160 00:07:35,820 --> 00:07:39,490 Dan juga untuk mahasiswa, kita memiliki pointer yang 4 byte dan lain 161 00:07:39,490 --> 00:07:40,770 pointer yang 4 byte. 162 00:07:40,770 --> 00:07:43,180 Sehingga akan berakhir up menjadi 8 byte. 163 00:07:43,180 --> 00:07:45,480 Jadi simpul dan mahasiswa adalah 8 byte. 164 00:07:45,480 --> 00:07:48,950 Dan tiga ini semua 4 byte. 165 00:07:48,950 --> 00:07:50,240 Pertanyaan itu? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Ya. 168 00:07:54,990 --> 00:07:58,413 >> AUDIENCE: Apakah itu adalah 64-bit arsitektur, alangkah baiknya 169 00:07:58,413 --> 00:07:59,880 menggandakan semua dari mereka? 170 00:07:59,880 --> 00:08:01,790 >> ROB Bowden: Ini tidak akan dua kali lipat mereka semua. 171 00:08:01,790 --> 00:08:05,830 Jadi arsitektur 64-bit, itu, sekali lagi, perubahan yang hal mendasar bahwa 172 00:08:05,830 --> 00:08:08,910 pointer sekarang 64 bit. 173 00:08:08,910 --> 00:08:09,290 Ya. 174 00:08:09,290 --> 00:08:10,930 Jadi pointer adalah 8 byte. 175 00:08:10,930 --> 00:08:15,420 Jadi ini yang 4 byte akan menjadi 8 byte. 176 00:08:15,420 --> 00:08:18,617 Seorang mahasiswa, yang dua pointer, baik, sekarang akan 177 00:08:18,617 --> 00:08:19,800 menjadi 8 byte, 8 byte. 178 00:08:19,800 --> 00:08:21,980 Ini akan membuat 16 byte. 179 00:08:21,980 --> 00:08:25,710 >> Tapi simpul masih 4 byte. 180 00:08:25,710 --> 00:08:27,800 Jadi pointer ini akan menjadi 8 byte. 181 00:08:27,800 --> 00:08:28,930 Ini adalah 4 byte. 182 00:08:28,930 --> 00:08:30,870 Jadi node hanya akan menjadi 12 byte. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 Ada pertanyaan lain yang satu itu? 185 00:08:39,280 --> 00:08:44,500 Jadi yang berikutnya, ini adalah kode status HTTP. 186 00:08:44,500 --> 00:08:48,000 Dan Anda harus menggambarkan keadaan di mana kekuatan ini 187 00:08:48,000 --> 00:08:49,810 dikembalikan kepada Anda. 188 00:08:49,810 --> 00:08:56,730 satu masalah yang saya dengar beberapa siswa adalah bahwa mereka mencoba untuk membuat 189 00:08:56,730 --> 00:08:58,950 kesalahan berada di ujung klien. 190 00:08:58,950 --> 00:09:02,320 Jadi ketika kita mencoba untuk membuat permintaan ke server, sesuatu yang 191 00:09:02,320 --> 00:09:03,820 salah pada akhir kami. 192 00:09:03,820 --> 00:09:07,660 Tapi pada umumnya, kode-kode ini dikembalikan oleh server. 193 00:09:07,660 --> 00:09:11,720 Jadi kami ingin mencari tahu apa yang terjadi salah atau benar pada server yang 194 00:09:11,720 --> 00:09:14,280 menyebabkan hal-hal ini harus dikembalikan. 195 00:09:14,280 --> 00:09:18,670 Jadi mengapa mungkin sebuah server mengembalikan kode status 200? 196 00:09:18,670 --> 00:09:19,920 Setiap pikiran? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> Ya. 199 00:09:23,730 --> 00:09:27,850 Jadi sesuatu tentang sukses permintaan pergi melalui. 200 00:09:27,850 --> 00:09:30,260 Dan mereka dapat kembali apa pun yang Anda minta. 201 00:09:30,260 --> 00:09:32,240 Jadi semuanya baik-baik saja. 202 00:09:32,240 --> 00:09:35,662 Bagaimana dengan 302 ditemukan? 203 00:09:35,662 --> 00:09:36,618 Ya. 204 00:09:36,618 --> 00:09:39,008 >> AUDIENCE: Server sedang mencari untuk apa yang Anda minta. 205 00:09:39,008 --> 00:09:40,442 Tapi itu tidak bisa menemukannya. 206 00:09:40,442 --> 00:09:42,850 Jadi ada kesalahan. 207 00:09:42,850 --> 00:09:47,720 >> ROB Bowden: Jadi server adalah mencari apa yang Anda inginkan. 208 00:09:47,720 --> 00:09:51,682 Jadi hanya mencari di sini, 302 ditemukan, itu dapat menemukannya. 209 00:09:51,682 --> 00:09:53,035 >> AUDIENCE: Maafkan aku. 210 00:09:53,035 --> 00:09:54,388 Ditemukan berarti bahwa mereka tidak menemukan itu. 211 00:09:54,388 --> 00:09:55,638 Maaf. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB Bowden: Jadi 302 ditemukan. 214 00:10:00,160 --> 00:10:02,350 Server dapat menemukan apa yang Anda inginkan. 215 00:10:02,350 --> 00:10:04,640 >> AUDIENCE: Tapi itu tidak menampilkan itu? 216 00:10:04,640 --> 00:10:08,180 >> ROB Bowden: Perbedaan antara ini 302 dan 200 adalah bahwa hal itu 217 00:10:08,180 --> 00:10:09,280 tahu apa yang Anda inginkan. 218 00:10:09,280 --> 00:10:12,000 Tapi itu tidak persis di mana Anda ingin bertanya. 219 00:10:12,000 --> 00:10:14,580 Jadi 302 adalah redirect khas. 220 00:10:14,580 --> 00:10:16,510 Jadi Anda meminta halaman. 221 00:10:16,510 --> 00:10:19,590 Ia tahu, oh, aku ingin untuk kembali padamu. 222 00:10:19,590 --> 00:10:21,070 Tapi ini di URL yang berbeda. 223 00:10:21,070 --> 00:10:23,534 Jadi hey, Anda benar-benar ingin ini. 224 00:10:23,534 --> 00:10:26,950 >> DAVID J. Malan: Ini adalah bagian yang mengatakan bahwa kami memberi kalian redirect 225 00:10:26,950 --> 00:10:30,830 fungsi yang menggunakan fungsi kepala yang, pada gilirannya, dicetak lokasi, 226 00:10:30,830 --> 00:10:34,110 usus besar, dan kemudian URL yang Anda ingin menolak pengguna. 227 00:10:34,110 --> 00:10:37,480 Meskipun Anda tidak melihat 302 eksplisit ada, itulah yang PHP 228 00:10:37,480 --> 00:10:41,550 akan ajaib masukkan sebagai header mengatakan apa yang Rob mengatakan ada - 229 00:10:41,550 --> 00:10:41,930 ditemukan. 230 00:10:41,930 --> 00:10:43,180 Tapi pergi di sini sebagai gantinya. 231 00:10:43,180 --> 00:10:45,960 232 00:10:45,960 --> 00:10:46,160 >> ROB Bowden: OK. 233 00:10:46,160 --> 00:10:47,630 Jadi bagaimana dengan 403 dilarang? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> AUDIENCE: Saya pikir itu bahwa server pada dasarnya mengatakan bahwa klien 236 00:10:57,120 --> 00:10:59,970 tidak dapat mengakses halaman rumah. 237 00:10:59,970 --> 00:11:03,260 >> ROB Bowden: Jadi ya. 238 00:11:03,260 --> 00:11:07,670 Nah, jawaban khas kami mengharapkan sesuatu seperti, file 239 00:11:07,670 --> 00:11:08,920 tidak chmodded tepat. 240 00:11:08,920 --> 00:11:11,590 Itu mungkin dalam keadaan apa Anda melihat mereka. 241 00:11:11,590 --> 00:11:18,920 Tapi ada alasan bahwa klien bisa salah di sini. 242 00:11:18,920 --> 00:11:20,440 Sebenarnya ada kode status lain - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Jadi ini sangat mirip. 245 00:11:22,820 --> 00:11:24,590 >> 401 adalah tidak sah. 246 00:11:24,590 --> 00:11:26,130 Dan 403 dilarang. 247 00:11:26,130 --> 00:11:31,890 Dan tidak sah Anda secara eksklusif dapatkan jika Anda tidak login 248 00:11:31,890 --> 00:11:34,520 Tapi log in mungkin berarti bahwa Anda berwenang. 249 00:11:34,520 --> 00:11:37,930 Tapi jika Anda sudah login dan Anda masih tidak memiliki izin, maka 250 00:11:37,930 --> 00:11:40,140 Anda juga bisa mendapatkan terlarang. 251 00:11:40,140 --> 00:11:45,320 Jadi jika Anda login dan tidak memiliki izin, dilarang juga 252 00:11:45,320 --> 00:11:47,164 sesuatu yang bisa Anda dapatkan. 253 00:11:47,164 --> 00:11:48,900 >> DAVID J. Malan: Dan mekanisme yang masalah ini biasanya 254 00:11:48,900 --> 00:11:53,100 dipecahkan pada server adalah melalui perintah apa? 255 00:11:53,100 --> 00:11:57,700 Chmod, jika itu, memang, izin masalah pada file atau direktori. 256 00:11:57,700 --> 00:11:59,220 >> ROB Bowden: Lalu 404 tidak ditemukan. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 Ya. 259 00:12:03,470 --> 00:12:10,150 Jadi tidak seperti 302 di mana itu tidak persis di mana Anda bertanya tapi ia tahu apa 260 00:12:10,150 --> 00:12:12,710 Anda inginkan, ini, itu hanya memiliki tidak tahu apa yang Anda inginkan. 261 00:12:12,710 --> 00:12:15,648 Dan Anda tidak meminta sesuatu yang valid. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Aku teko dan kemudian 500 internal server. 264 00:12:22,310 --> 00:12:24,870 Jadi mengapa Anda mungkin mendapatkan itu? 265 00:12:24,870 --> 00:12:26,120 >> Jadi segfault - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 Aku benar-benar tidak tahu grading standar untuk ini. 268 00:12:30,640 --> 00:12:34,850 Tetapi jika kode PHP Anda memiliki sesuatu salah di dalamnya, secara teori, hal itu bisa 269 00:12:34,850 --> 00:12:39,650 sebenarnya segfault, dalam hal ini, ini 500 internal server error, sesuatu 270 00:12:39,650 --> 00:12:41,400 yang salah dengan server Anda konfigurasi. 271 00:12:41,400 --> 00:12:44,320 Atau ada kesalahan sintaks dalam kode PHP Anda. 272 00:12:44,320 --> 00:12:46,095 Atau sesuatu yang buruk sedang terjadi. 273 00:12:46,095 --> 00:12:48,320 >> DAVID J. Malan: Kita memang melihat segfault antara jawaban beberapa orang. 274 00:12:48,320 --> 00:12:49,490 Dan secara teknis, itu bisa terjadi. 275 00:12:49,490 --> 00:12:53,820 Tapi itu akan menjadi PHP, program ditulis oleh orang lain, sebenarnya 276 00:12:53,820 --> 00:12:57,790 segfaulted, yang hanya jika orang-orang mengacaukan dan menulis kode buggy di 277 00:12:57,790 --> 00:13:00,680 penerjemah mereka akan PHP sendiri segfault. 278 00:13:00,680 --> 00:13:06,460 Jadi meskipun 500 adalah seperti segfault dalam roh, itu hampir selalu 279 00:13:06,460 --> 00:13:10,490 hasil dari masalah file konfigurasi dengan web server atau, seperti kata Rob, 280 00:13:10,490 --> 00:13:13,200 kesalahan sintaks, seperti Anda tidak menutup penawaran. 281 00:13:13,200 --> 00:13:16,180 Atau Anda kehilangan titik koma di suatu tempat. 282 00:13:16,180 --> 00:13:23,677 >> AUDIENCE: Jadi untuk pset Shuttle, saya pikir ketika saya melakukannya sekali saya mengklik 283 00:13:23,677 --> 00:13:26,300 Browser, tapi tidak ada yang datang, apa yang mereka sebut halaman putih. 284 00:13:26,300 --> 00:13:28,056 Tapi itu karena kode. 285 00:13:28,056 --> 00:13:29,440 Saya pikir itu JavaScript, kan? 286 00:13:29,440 --> 00:13:29,770 >> ROB Bowden: Ya. 287 00:13:29,770 --> 00:13:31,180 >> AUDIENCE: Akankah kesalahan yang masih muncul? 288 00:13:31,180 --> 00:13:34,290 >> ROB Bowden: Jadi, Anda tidak akan mendapatkan kesalahan ini karena semuanya 289 00:13:34,290 --> 00:13:36,930 dari perspektif web server benar-benar baik-baik saja. 290 00:13:36,930 --> 00:13:39,090 Tapi Anda minta index.html. 291 00:13:39,090 --> 00:13:42,000 Anda meminta shuttle.js dan service.js. 292 00:13:42,000 --> 00:13:44,580 Dan itu berhasil kembali untuk semua hal-hal - 293 00:13:44,580 --> 00:13:44,980 200. 294 00:13:44,980 --> 00:13:45,680 OK. 295 00:13:45,680 --> 00:13:49,330 Hanya ketika browser Anda mencoba menginterpretasikan kode JavaScript yang 296 00:13:49,330 --> 00:13:51,370 itu seperti, tunggu, ini bukan error JavaScript valid. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 Ada pertanyaan lain? 299 00:13:58,210 --> 00:14:00,750 Baik. 300 00:14:00,750 --> 00:14:04,120 >> DAVID J. Malan: Jadi berikutnya up adalah nomor 11. 301 00:14:04,120 --> 00:14:07,610 Dan 11 adalah paling menakutkan untuk banyak orang. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 Jadi hal yang paling penting untuk dicatat di sini adalah bahwa ini adalah, memang, sekitar 304 00:14:18,570 --> 00:14:19,840 daftar ganda terkait. 305 00:14:19,840 --> 00:14:23,160 Tapi ini tidak sama dengan tahun lalu ganda terkait masalah daftar, 306 00:14:23,160 --> 00:14:27,170 yang tidak memberikan peringatan bahwa daftar bisa, pada kenyataannya, menjadi unsorted. 307 00:14:27,170 --> 00:14:29,640 >> Jadi fakta bahwa daftar itu unsorted dan fakta bahwa kata itu 308 00:14:29,640 --> 00:14:32,930 digarisbawahi ada dimaksudkan untuk menyampaikan bahwa ini sebenarnya penyederhanaan 309 00:14:32,930 --> 00:14:35,430 apa kalau tidak pasti masalah yang lebih menantang 310 00:14:35,430 --> 00:14:36,600 dan satu lagi. 311 00:14:36,600 --> 00:14:40,760 Jadi kesalahan umum di sini adalah telah menempatkan solusi tahun lalu pada satu Anda 312 00:14:40,760 --> 00:14:45,580 pager dan kemudian hanya membabi buta menyalin bahwa turun sebagai jawaban, yang merupakan hak 313 00:14:45,580 --> 00:14:48,520 menjawab pertanyaan yang berbeda serupa semangatnya. 314 00:14:48,520 --> 00:14:51,340 Tapi kehalusan sini adalah sebagai berikut. 315 00:14:51,340 --> 00:14:55,200 >> Jadi satu, kami telah menyatakan node dan didefinisikan dalam cara yang biasa di sini. 316 00:14:55,200 --> 00:14:59,230 Kemudian kita mendefinisikan daftar menjadi global pointer diinisialisasi ke null. 317 00:14:59,230 --> 00:15:02,150 Kemudian ternyata, ada dua fungsi kita memiliki prototipe untuk di sini, insert 318 00:15:02,150 --> 00:15:03,240 dan menghapus. 319 00:15:03,240 --> 00:15:06,600 Dan kemudian kita memiliki beberapa contoh kode di sini melakukan banyak sisipan. 320 00:15:06,600 --> 00:15:09,930 Dan kemudian kami meminta Anda untuk menyelesaikan pelaksanaan insert bawah sedemikian 321 00:15:09,930 --> 00:15:14,380 dengan cara yang memasukkan n ke dalam daftar dalam waktu yang konstan, juga menggarisbawahi, 322 00:15:14,380 --> 00:15:15,730 bahkan jika sudah ada. 323 00:15:15,730 --> 00:15:20,600 >> Jadi keindahan mampu menyisipkan dalam waktu yang konstan adalah bahwa ia menyiratkan 324 00:15:20,600 --> 00:15:23,060 bahwa Anda harus memasukkan node baru di mana? 325 00:15:23,060 --> 00:15:23,690 Ke depan. 326 00:15:23,690 --> 00:15:27,760 Jadi menghilangkan, untungnya, setidaknya salah satu kasus yang digunakan untuk meminta 327 00:15:27,760 --> 00:15:30,520 baris bahkan lebih kode, seperti itu tahun lalu dan bahkan di kelas ketika kita 328 00:15:30,520 --> 00:15:34,040 berbicara melalui hal semacam ini dengan manusia dan dengan beberapa 329 00:15:34,040 --> 00:15:35,250 pseudo kode verbal. 330 00:15:35,250 --> 00:15:39,190 Jadi dalam larutan sini, mari kita melewatkan itu hanya untuk memiliki visual yang pada 331 00:15:39,190 --> 00:15:40,480 layar. 332 00:15:40,480 --> 00:15:42,230 >> Perhatikan bahwa kita sedang melakukan hal berikut. 333 00:15:42,230 --> 00:15:45,140 Dan juga perhatikan penyederhanaan lain adalah bahwa bahkan jika itu 334 00:15:45,140 --> 00:15:48,280 sudah ada, jadi ini berarti bahkan jika nomor sudah ada, Anda dapat 335 00:15:48,280 --> 00:15:50,280 hanya membabi buta memasukkan lain salinannya. 336 00:15:50,280 --> 00:15:52,560 Dan itu juga, dimaksudkan untuk menjadi penyederhanaan, sehingga Anda bisa 337 00:15:52,560 --> 00:15:54,940 fokus pada, benar-benar, beberapa lebih Bagian yang menarik secara intelektual dan 338 00:15:54,940 --> 00:15:58,090 bukan hanya beberapa pengecekan error tambahan mengingat waktu yang terbatas. 339 00:15:58,090 --> 00:16:02,880 >> Jadi dalam larutan sampel ini, kami mengalokasikan pointer di kiri 340 00:16:02,880 --> 00:16:04,510 sisi sini untuk node. 341 00:16:04,510 --> 00:16:07,190 Sekarang, menyadari bahwa pointer, seperti Rob mengatakan, hanya 32 bit. 342 00:16:07,190 --> 00:16:09,060 Dan itu tidak benar-benar mengandung alamat sampai Anda 343 00:16:09,060 --> 00:16:09,970 menetapkan alamat. 344 00:16:09,970 --> 00:16:13,220 Dan kami melakukannya di kanan side via malloc. 345 00:16:13,220 --> 00:16:16,550 Seperti warga negara yang baik, kami memeriksa bahwa malloc tidak, pada kenyataannya, null, sehingga 346 00:16:16,550 --> 00:16:18,690 kita tidak sengaja membuat sebuah segfault sini. 347 00:16:18,690 --> 00:16:22,840 Dan setiap kali Anda menggunakan malloc dalam hidup, Anda harus memeriksa null, jangan 348 00:16:22,840 --> 00:16:24,090 Anda memiliki bug halus. 349 00:16:24,090 --> 00:16:28,460 >> Kemudian kita menginisialisasi nol bahwa dengan menugaskan n dan sebelumnya dan berikutnya. 350 00:16:28,460 --> 00:16:32,450 Dan dalam hal ini di sini, saya diinisialisasi sebelumnya untuk null, karena ini baru 351 00:16:32,450 --> 00:16:34,780 node akan menjadi baru mulai dari daftar saya. 352 00:16:34,780 --> 00:16:37,050 Jadi ada akan menjadi apa-apa sebelumnya. 353 00:16:37,050 --> 00:16:42,010 Dan saya ingin dasarnya menambahkan daftar yang ada ke node baru 354 00:16:42,010 --> 00:16:44,700 pengaturan berikutnya sama dengan daftar sendiri. 355 00:16:44,700 --> 00:16:47,120 Tapi aku tidak dilakukan dulu. 356 00:16:47,120 --> 00:16:51,780 Jadi jika daftar itu sendiri sudah ada, dan ada setidaknya satu simpul 357 00:16:51,780 --> 00:16:57,070 sudah di tempat, jika ini adalah daftar di sini dan saya menyisipkan node baru di sini, saya 358 00:16:57,070 --> 00:17:01,840 perlu memastikan bahwa mantan simpul saya menunjuk ke belakang untuk node baru saya, 359 00:17:01,840 --> 00:17:04,260 karena ini adalah, sekali lagi, daftar ganda terkait. 360 00:17:04,260 --> 00:17:05,460 >> Jadi kita melakukan pemeriksaan kewarasan. 361 00:17:05,460 --> 00:17:10,109 Jika daftar tidak null, jika sudah ada satu atau lebih node di sana, kemudian 362 00:17:10,109 --> 00:17:12,470 menambahkan bahwa kembali referensi sehingga untuk berbicara. 363 00:17:12,470 --> 00:17:15,420 Dan kemudian hal terakhir yang kita butuhkan lakukan adalah benar-benar memperbarui global 364 00:17:15,420 --> 00:17:20,329 daftar variabel itu sendiri ke titik dengan node baru. 365 00:17:20,329 --> 00:17:21,790 Ya. 366 00:17:21,790 --> 00:17:26,579 >> AUDIENCE: Dalam pointer panah [Tak terdengar] sama dengan nol, apakah itu 367 00:17:26,579 --> 00:17:30,420 berurusan dengan daftar karena daftar adalah null? 368 00:17:30,420 --> 00:17:30,596 >> DAVID J. Malan: Tidak. 369 00:17:30,596 --> 00:17:34,500 Itu hanya saya menjadi proaktif hati-hati, karena jika ini adalah saya 370 00:17:34,500 --> 00:17:38,730 daftar asli dengan mungkin beberapa node lebih di sini dan aku memasukkan saya 371 00:17:38,730 --> 00:17:42,380 node baru di sini, ada akan menjadi apa-apa di sini. 372 00:17:42,380 --> 00:17:44,720 Dan aku ingin menangkap gagasan bahwa dengan menetapkan sebelumnya untuk 373 00:17:44,720 --> 00:17:47,740 null pada node baru. 374 00:17:47,740 --> 00:17:51,410 Dan mungkin, jika kode saya benar dan tidak ada cara lain untuk memasukkan 375 00:17:51,410 --> 00:17:54,970 node selain fungsi ini, mungkin, bahkan jika daftar telah memiliki 376 00:17:54,970 --> 00:18:00,090 satu atau lebih node di dalamnya, agaknya list, simpul pertama, akan memiliki 377 00:18:00,090 --> 00:18:02,750 pointer sebelumnya nol itu sendiri. 378 00:18:02,750 --> 00:18:03,550 >> AUDIENCE: Dan hanya tindak lanjut. 379 00:18:03,550 --> 00:18:08,139 Alasan Anda meletakkan pointer equals berikutnya list Anda membuat pointer 380 00:18:08,139 --> 00:18:13,579 sebelum daftar dalam bahwa itu menunjuk ke depan, saya kira - 381 00:18:13,579 --> 00:18:14,980 Aku tidak - 382 00:18:14,980 --> 00:18:15,450 hanya daftar? 383 00:18:15,450 --> 00:18:16,400 >> DAVID J. Malan: Tepat. 384 00:18:16,400 --> 00:18:19,400 Dan jadi mari kita benar-benar mempertimbangkan dua kasus sini benar-benar, meskipun 385 00:18:19,400 --> 00:18:22,070 Agar kami akan menganggap mereka tidak persis sama seperti kode. 386 00:18:22,070 --> 00:18:26,250 Tetapi pada tingkat tinggi, apakah ini merupakan daftar dan ini adalah 32-bit 387 00:18:26,250 --> 00:18:29,560 pointer, skenario yang paling sederhana adalah bahwa ini adalah nol secara default. 388 00:18:29,560 --> 00:18:33,010 Dan misalkan saya ingin memasukkan nomor 50 adalah nomor pertama. 389 00:18:33,010 --> 00:18:37,640 Jadi aku akan pergi ke depan dan mengalokasikan node, yang akan berisi 390 00:18:37,640 --> 00:18:38,770 tiga bidang - 391 00:18:38,770 --> 00:18:42,070 n, sebelumnya, dan berikutnya. 392 00:18:42,070 --> 00:18:44,580 >> Aku akan menempatkan nomor 50 di sini, karena ini akan menjadi n. 393 00:18:44,580 --> 00:18:46,130 Ini akan berikutnya. 394 00:18:46,130 --> 00:18:48,530 Dan ini akan menjadi sebelumnya. 395 00:18:48,530 --> 00:18:50,910 Jadi apa yang harus saya lakukan dalam kasus ini? 396 00:18:50,910 --> 00:18:53,900 Yah, aku baru saja dilakukan baris 1 di sini. 397 00:18:53,900 --> 00:18:55,400 Pointer n mendapat n. 398 00:18:55,400 --> 00:18:57,740 Saya kemudian mengatakan, sebelumnya harus mendapatkan null. 399 00:18:57,740 --> 00:18:59,470 Jadi ini akan menjadi nol. 400 00:18:59,470 --> 00:19:01,365 Kemudian aku akan katakan selanjutnya akan mendapatkan daftar. 401 00:19:01,365 --> 00:19:05,150 >> Dan ini hanya bekerja dengan baik. 402 00:19:05,150 --> 00:19:06,500 Ini adalah null. 403 00:19:06,500 --> 00:19:10,620 Dan saya katakan, node baru berikutnya lapangan harus mendapatkan apa pun ini. 404 00:19:10,620 --> 00:19:12,570 Sehingga menempatkan nol lain di sana. 405 00:19:12,570 --> 00:19:14,510 Dan kemudian hal terakhir Saya adalah memeriksa di sini. 406 00:19:14,510 --> 00:19:17,870 Jika daftar tidak sama dengan nol, tetapi sama dengan nol, jadi kami melewatkan itu 407 00:19:17,870 --> 00:19:18,470 sama sekali. 408 00:19:18,470 --> 00:19:23,520 Jadi semua saya lakukan selanjutnya adalah daftar mendapat pointer, yang pictorially menghasilkan 409 00:19:23,520 --> 00:19:25,570 gambar seperti itu. 410 00:19:25,570 --> 00:19:26,620 Jadi itu satu skenario. 411 00:19:26,620 --> 00:19:30,490 >> Dan salah satu yang Anda bertanya tentang khusus adalah situasi seperti ini, 412 00:19:30,490 --> 00:19:33,190 di mana kita sudah memiliki daftar satu-node. 413 00:19:33,190 --> 00:19:36,240 Dan jika aku kembali di aslinya pernyataan masalah, berikutnya kita akan 414 00:19:36,240 --> 00:19:39,320 masukkan mengatakan adalah 34, hanya untuk kepentingan diskusi. 415 00:19:39,320 --> 00:19:46,210 Jadi aku akan hanya nyaman menarik bahwa di sini. 416 00:19:46,210 --> 00:19:47,540 Saya baru saja malloced. 417 00:19:47,540 --> 00:19:49,310 Mari kita berasumsi aku memeriksa null. 418 00:19:49,310 --> 00:19:51,870 >> Sekarang, aku akan menginisialisasi n menjadi 34. 419 00:19:51,870 --> 00:19:53,040 Dan ini akan menjadi n. 420 00:19:53,040 --> 00:19:54,670 Ini akan berikutnya. 421 00:19:54,670 --> 00:19:57,100 Dan ini akan menjadi sebelumnya. 422 00:19:57,100 --> 00:19:59,370 Mari kita pastikan saya tidak mendapatkan ini mundur. 423 00:19:59,370 --> 00:20:01,110 Sebelumnya datang pertama dalam definisi. 424 00:20:01,110 --> 00:20:03,070 Biarkan saya memperbaiki ini. 425 00:20:03,070 --> 00:20:04,410 Hal ini sebelumnya. 426 00:20:04,410 --> 00:20:05,780 Ini berikutnya. 427 00:20:05,780 --> 00:20:08,620 Meskipun ini adalah identik, mari kita tetap konsisten. 428 00:20:08,620 --> 00:20:09,450 >> Sebelumnya. 429 00:20:09,450 --> 00:20:11,030 Ini berikutnya. 430 00:20:11,030 --> 00:20:16,310 Jadi saya baru saja malloced catatan saya, diperiksa for null, ditugaskan ke 34 node. 431 00:20:16,310 --> 00:20:17,570 Sebelumnya mendapat null. 432 00:20:17,570 --> 00:20:19,480 Sehingga memberi saya itu. 433 00:20:19,480 --> 00:20:21,010 Berikutnya mendapatkan daftar. 434 00:20:21,010 --> 00:20:22,370 Jadi daftar yang ini. 435 00:20:22,370 --> 00:20:26,520 Jadi ini adalah sama sekarang seperti gambar ini panah, sehingga mereka menunjuk ke satu 436 00:20:26,520 --> 00:20:27,940 dalam hal yang sama. 437 00:20:27,940 --> 00:20:30,400 Dan kemudian aku memeriksa jika daftar tidak sama dengan nol. 438 00:20:30,400 --> 00:20:31,740 Dan itu bukan kali ini. 439 00:20:31,740 --> 00:20:35,580 Lalu aku akan melakukan daftar sebelumnya mendapat pointer. 440 00:20:35,580 --> 00:20:39,700 >> Jadi daftar sebelumnya mendapat PTR. 441 00:20:39,700 --> 00:20:44,300 Jadi ini memiliki efek menempatkan panah grafis di sini. 442 00:20:44,300 --> 00:20:46,930 Dan itu semakin sedikit yang bergelombang, garis-garis. 443 00:20:46,930 --> 00:20:50,780 Dan kemudian, akhirnya, saya memperbarui daftar untuk menunjuk ke pointer. 444 00:20:50,780 --> 00:20:55,560 Jadi sekarang ini menunjuk ke orang ini. 445 00:20:55,560 --> 00:20:57,170 Dan sekarang, mari kita lakukan cepat kewarasan cek. 446 00:20:57,170 --> 00:20:59,470 >> Berikut ini daftar, yang variabel global. 447 00:20:59,470 --> 00:21:02,850 Simpul pertama adalah, memang, 34, karena Aku mengikuti panah itu. 448 00:21:02,850 --> 00:21:05,210 Dan itu benar karena saya ingin masukkan pada awal daftar 449 00:21:05,210 --> 00:21:06,070 semua node baru. 450 00:21:06,070 --> 00:21:08,860 Bidangnya berikutnya membuat saya orang ini. 451 00:21:08,860 --> 00:21:10,710 Jika aku terus, aku memukul selanjutnya adalah null. 452 00:21:10,710 --> 00:21:11,760 Jadi tidak ada lagi daftar. 453 00:21:11,760 --> 00:21:14,460 Jika aku memukul sebelumnya, saya mendapatkan kembali di mana saya harapkan. 454 00:21:14,460 --> 00:21:16,435 >> Jadi masih ada beberapa petunjuk, jelas, untuk memanipulasi. 455 00:21:16,435 --> 00:21:19,870 Tapi fakta bahwa Anda diberitahu untuk melakukan ini dalam waktu yang konstan berarti Anda hanya 456 00:21:19,870 --> 00:21:22,910 memiliki jumlah terbatas hal-hal Anda diperbolehkan untuk dilakukan. 457 00:21:22,910 --> 00:21:24,290 Dan apa nomor itu? 458 00:21:24,290 --> 00:21:25,185 Mungkin satu langkah. 459 00:21:25,185 --> 00:21:25,700 Mungkin dua. 460 00:21:25,700 --> 00:21:26,820 Mungkin 1.000 langkah. 461 00:21:26,820 --> 00:21:30,500 Tapi itu terbatas, yang berarti Anda tidak bisa telah segala jenis looping terjadi 462 00:21:30,500 --> 00:21:32,010 sini, tidak ada rekursi, tidak ada loop. 463 00:21:32,010 --> 00:21:37,390 Hanya saja harus menjadi garis keras-kode kode seperti yang kita miliki dalam sampel ini. 464 00:21:37,390 --> 00:21:42,330 >> Jadi masalah berikutnya 12 meminta kami untuk menyelesaikan implementasi remove 465 00:21:42,330 --> 00:21:46,740 bawah sedemikian rupa sehingga menghilangkan n dari daftar dalam waktu linier. 466 00:21:46,740 --> 00:21:48,740 Jadi, Anda harus sedikit lebih ruang gerak sekarang. 467 00:21:48,740 --> 00:21:52,380 Anda mungkin menganggap bahwa n, jika ada dalam daftar, akan hadir 468 00:21:52,380 --> 00:21:53,340 tidak lebih dari sekali. 469 00:21:53,340 --> 00:21:56,770 Dan itu juga dimaksudkan untuk menjadi berbasis kuis asumsi menyederhanakan, sehingga 470 00:21:56,770 --> 00:21:59,780 bahwa jika Anda menemukan nomor 50 di suatu tempat dalam daftar, Anda tidak juga 471 00:21:59,780 --> 00:22:02,890 perlu khawatir tentang terus iterate, mencari setiap kemungkinan 472 00:22:02,890 --> 00:22:06,990 salinan 50, yang hanya akan menyerahkan ke beberapa minutia dalam waktu yang terbatas. 473 00:22:06,990 --> 00:22:10,460 >> Jadi dengan menghapus, satu ini pasti lebih menantang dan lebih 474 00:22:10,460 --> 00:22:11,640 kode untuk menulis. 475 00:22:11,640 --> 00:22:14,990 Tapi pada pandangan pertama, terus terang, itu mungkin terlihat luar biasa dan seperti 476 00:22:14,990 --> 00:22:17,060 tidak ada cara Anda bisa memiliki datang dengan pada kuis. 477 00:22:17,060 --> 00:22:22,450 Tetapi jika kita fokus pada langkah-langkah individu, mudah-mudahan, itu akan tiba-tiba 478 00:22:22,450 --> 00:22:26,060 menyerang Anda bahwa masing-masing individu tersebut langkah masuk akal yang jelas 479 00:22:26,060 --> 00:22:27,080 dalam retrospeksi. 480 00:22:27,080 --> 00:22:28,200 Jadi mari kita lihat. 481 00:22:28,200 --> 00:22:32,570 >> Jadi pertama, kita menginisialisasi pointer menjadi daftar sendiri. 482 00:22:32,570 --> 00:22:36,040 Karena aku ingin waktu linier, artinya Aku akan memiliki beberapa lingkaran. 483 00:22:36,040 --> 00:22:39,730 Dan cara yang umum untuk beralih di atas node dalam struktur daftar atau apapun 484 00:22:39,730 --> 00:22:43,860 struktur iteratif adalah untuk mengambil pointer ke depan data 485 00:22:43,860 --> 00:22:46,990 struktur dan kemudian hanya mulai memperbarui dan berjalan jalan 486 00:22:46,990 --> 00:22:48,650 melalui struktur data. 487 00:22:48,650 --> 00:22:50,040 Jadi aku akan melakukan hal itu. 488 00:22:50,040 --> 00:22:54,260 >> Sementara pointer, variabel sementara saya, tidak sama dengan nol, mari kita 489 00:22:54,260 --> 00:22:55,660 pergi ke depan dan memeriksa. 490 00:22:55,660 --> 00:22:56,910 Apakah saya beruntung? 491 00:22:56,910 --> 00:23:01,740 Adalah bidang n di node Saat ini saya melihat sama dengan 492 00:23:01,740 --> 00:23:03,380 Nomor Saya mencari? 493 00:23:03,380 --> 00:23:05,410 Dan jika demikian, mari kita lakukan sesuatu. 494 00:23:05,410 --> 00:23:10,020 Sekarang, melihat ini jika kondisi mengelilingi seluruh yang 495 00:23:10,020 --> 00:23:11,520 berikut baris kode. 496 00:23:11,520 --> 00:23:14,610 Ini adalah satu-satunya hal yang saya pedulikan - menemukan nomor tersebut. 497 00:23:14,610 --> 00:23:18,010 Jadi tidak ada yang lain, yang menyederhanakan hal-hal konseptual sedikit. 498 00:23:18,010 --> 00:23:22,040 >> Tapi sekarang, aku sadar, dan Anda mungkin memiliki hanya menyadari hal ini setelah berpikir 499 00:23:22,040 --> 00:23:24,720 melalui sedikit, ada sebenarnya dua kasus di sini. 500 00:23:24,720 --> 00:23:28,060 Salah satunya adalah di mana node adalah di mulai dari daftar, yang merupakan 501 00:23:28,060 --> 00:23:31,040 sedikit mengganggu, karena itu adalah kasus khusus, karena Anda harus berurusan 502 00:23:31,040 --> 00:23:33,340 dengan hal ini, yang adalah satu-satunya anomali. 503 00:23:33,340 --> 00:23:35,720 Di tempat lain dalam daftar, itu hal yang sama. 504 00:23:35,720 --> 00:23:38,050 Ada simpul sebelumnya dan berikutnya node, simpul sebelumnya, node berikutnya. 505 00:23:38,050 --> 00:23:40,940 Tapi orang ini adalah sedikit khusus jika dia di awal. 506 00:23:40,940 --> 00:23:48,710 >> Jadi jika pointer sama dengan daftar sendiri, jadi jika saya di awal 507 00:23:48,710 --> 00:23:53,960 daftar dan saya telah menemukan n, saya perlu untuk melakukan beberapa hal. 508 00:23:53,960 --> 00:23:59,230 Satu, saya perlu mengubah daftar ke menunjuk ke kolom berikutnya, 50. 509 00:23:59,230 --> 00:24:01,270 Jadi anggaplah bahwa saya sedang mencoba untuk menghapus 34. 510 00:24:01,270 --> 00:24:03,560 Jadi orang ini harus pergi pergi hanya dalam beberapa saat. 511 00:24:03,560 --> 00:24:07,210 >> Jadi aku akan mengatakan, daftar mendapat pointer berikutnya. 512 00:24:07,210 --> 00:24:08,570 Nah, ini adalah pointer. 513 00:24:08,570 --> 00:24:10,360 Selanjutnya menunjuk di sini. 514 00:24:10,360 --> 00:24:17,470 Jadi ini adalah mengubah panah kanan ini sekarang untuk menunjuk ke orang ini di sini. 515 00:24:17,470 --> 00:24:19,580 Sekarang, ingat, kita memiliki variabel sementara. 516 00:24:19,580 --> 00:24:23,520 Jadi kami belum yatim setiap node, karena saya juga memiliki orang ini di saya 517 00:24:23,520 --> 00:24:25,010 pelaksanaan remove. 518 00:24:25,010 --> 00:24:29,600 Jadi sekarang, jika daftar itu sendiri tidak null, Aku harus memperbaiki sesuatu yang kecil. 519 00:24:29,600 --> 00:24:32,690 >> Saya perlu sekarang pastikan bahwa panah ini, yang sebelumnya menunjuk 520 00:24:32,690 --> 00:24:36,830 50-34, ini harus pergi, karena jika saya sedang mencoba untuk menyingkirkan 521 00:24:36,830 --> 00:24:41,910 dari 34, 50 sebaiknya tidak memelihara jenis kembali referensi untuk itu sebagai 522 00:24:41,910 --> 00:24:42,820 panah disarankan. 523 00:24:42,820 --> 00:24:44,820 Jadi saya hanya melakukan baris ini. 524 00:24:44,820 --> 00:24:46,520 Jadi aku sudah selesai. 525 00:24:46,520 --> 00:24:48,040 Kasus itu sebenarnya cukup mudah. 526 00:24:48,040 --> 00:24:51,010 Memenggal kepala daftar relatif mudah. 527 00:24:51,010 --> 00:24:52,980 >> Sayangnya, ada ini menjengkelkan lain blok. 528 00:24:52,980 --> 00:24:56,170 Jadi sekarang, saya harus mempertimbangkan kasus di mana ada sesuatu di tengah. 529 00:24:56,170 --> 00:24:59,880 Tapi itu tidak terlalu mengerikan, kecuali untuk sintaks seperti ini. 530 00:24:59,880 --> 00:25:03,080 Jadi jika aku tidak di awal daftar, aku di suatu tempat di tengah. 531 00:25:03,080 --> 00:25:08,160 Dan baris ini di sini mengatakan, mulai pada node apa pun yang Anda berada di. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Pergi ke kolom berikutnya node sebelumnya dan menunjukkan bahwa pada pointer. 534 00:25:18,550 --> 00:25:20,390 >> Mari kita lakukan ini pictorially. 535 00:25:20,390 --> 00:25:21,640 Yang semakin rumit. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 Jadi jika saya memiliki bidang sebelumnya di sini - mari kita lakukan ini - bidang berikutnya di sini. 538 00:25:37,990 --> 00:25:41,200 Aku akan menyederhanakan pointer saya agak daripada menarik sejumlah besar 539 00:25:41,200 --> 00:25:45,710 hal bolak-balik malang-melintang satu sama lain. 540 00:25:45,710 --> 00:25:50,870 Dan sekarang, mari kita mengatakan ini adalah 1, 2, 3 untuk kepentingan diskusi, bahkan 541 00:25:50,870 --> 00:25:53,410 meskipun itu tidak sejalan dengan masalah yang bersangkutan. 542 00:25:53,410 --> 00:25:55,900 >> Jadi, inilah daftar link saya. 543 00:25:55,900 --> 00:25:59,300 Saya mencoba untuk menghapus dua dalam hal ini versi tertentu dari cerita. 544 00:25:59,300 --> 00:26:01,960 Jadi saya telah memperbarui pointer ke menunjuk ke orang ini. 545 00:26:01,960 --> 00:26:03,315 Jadi ini adalah PTR. 546 00:26:03,315 --> 00:26:04,530 Dia menunjuk di sini. 547 00:26:04,530 --> 00:26:07,170 Ini adalah daftar yang ada global seperti sebelumnya. 548 00:26:07,170 --> 00:26:09,200 Dan dia menunjuk di sini tidak peduli apa. 549 00:26:09,200 --> 00:26:10,800 Dan sekarang, saya sedang mencoba untuk menghapus dua. 550 00:26:10,800 --> 00:26:13,850 >> Jadi jika pointer menunjuk sini, aku akan mengikuti, tampaknya, 551 00:26:13,850 --> 00:26:17,110 pointer sebelumnya, yang menempatkan saya pada 1. 552 00:26:17,110 --> 00:26:22,290 Saya kemudian akan mengatakan bahwa ke depan lapangan, yang membawa saya ke ini 553 00:26:22,290 --> 00:26:25,410 kotak di sini, akan pointer yang sama berikutnya. 554 00:26:25,410 --> 00:26:28,400 Jadi jika pointer ini, ini berikutnya. 555 00:26:28,400 --> 00:26:31,840 Itu berarti bahwa ini panah kebutuhan untuk menunjuk ke orang ini. 556 00:26:31,840 --> 00:26:35,140 >> Jadi apa yang baris kode baru saja dilakukan adalah sedikit ini. 557 00:26:35,140 --> 00:26:37,500 Dan sekarang, ini tampak seperti langkah ke arah yang benar. 558 00:26:37,500 --> 00:26:41,390 Kami pada dasarnya ingin snip 2 keluar dari tengah 1 dan 3. 559 00:26:41,390 --> 00:26:44,400 Jadi masuk akal bahwa kita ingin rute pointer ini di sekitarnya. 560 00:26:44,400 --> 00:26:50,400 Jadi baris berikutnya ini memeriksa apakah pointer selanjutnya tidak null, ada 561 00:26:50,400 --> 00:26:54,200 memang seseorang di sebelah kanan 2, itu berarti kita juga harus melakukan 562 00:26:54,200 --> 00:26:55,850 sedikit snip sini. 563 00:26:55,850 --> 00:27:00,590 >> Jadi sekarang saya harus mengikuti pointer ini dan memperbarui pointer sebelumnya pada 564 00:27:00,590 --> 00:27:05,410 orang ini untuk melakukan sedikit dari Workaround sini titik di sini. 565 00:27:05,410 --> 00:27:07,100 Dan sekarang, secara visual ini bagus. 566 00:27:07,100 --> 00:27:11,930 Ini sedikit berantakan di bahwa ada tidak ada yang menunjuk pada 2 lagi. 567 00:27:11,930 --> 00:27:13,600 2 menunjuk ke kiri. 568 00:27:13,600 --> 00:27:14,980 Dan 2 menunjuk ke kanan. 569 00:27:14,980 --> 00:27:17,480 Tapi dia bisa melakukan apapun yang dia inginkan, karena dia akan mendapatkan dibebaskan. 570 00:27:17,480 --> 00:27:19,480 Dan tidak peduli apa nilai-nilai tersebut lagi. 571 00:27:19,480 --> 00:27:23,040 >> Yang penting adalah bahwa sisa orang routing atas 572 00:27:23,040 --> 00:27:24,280 dan di bawahnya sekarang. 573 00:27:24,280 --> 00:27:25,810 Dan memang, itulah yang kita lakukan selanjutnya. 574 00:27:25,810 --> 00:27:29,360 Kami pointer gratis, yang berarti kita memberitahu sistem operasi, Anda dipersilakan 575 00:27:29,360 --> 00:27:30,906 untuk merebut kembali ini. 576 00:27:30,906 --> 00:27:34,900 Dan kemudian terakhir, kita kembali. 577 00:27:34,900 --> 00:27:37,220 Lain implisit, jika kita tidak kembali lagi, 578 00:27:37,220 --> 00:27:38,290 kita harus terus mencari. 579 00:27:38,290 --> 00:27:41,485 Jadi pointer sama dengan pointer berikutnya hanya berarti memindahkan orang ini di sini. 580 00:27:41,485 --> 00:27:42,600 Pindahkan orang ini di sini. 581 00:27:42,600 --> 00:27:45,400 Pindahkan orang ini di sini jika, pada kenyataannya, kami tidak menemukan nomor 582 00:27:45,400 --> 00:27:46,960 kita cari belum. 583 00:27:46,960 --> 00:27:49,630 >> Jadi terus terang, itu terlihat benar-benar luar biasa, saya pikir, pada awalnya 584 00:27:49,630 --> 00:27:52,180 sekilas, terutama jika Anda berjuang dengan ini selama kuis kemudian melihat 585 00:27:52,180 --> 00:27:52,850 sesuatu seperti ini. 586 00:27:52,850 --> 00:27:55,050 Dan Anda menepuk diri di bagian belakang. 587 00:27:55,050 --> 00:27:57,080 Nah, tidak ada cara saya bisa datang dengan bahwa pada kuis. 588 00:27:57,080 --> 00:28:00,470 Tapi saya berpendapat, Anda dapat jika Anda istirahat itu ke dalam individu tersebut 589 00:28:00,470 --> 00:28:04,400 kasus dan hanya berjalan melalui itu hati-hati, meskipun, diakui, di bawah 590 00:28:04,400 --> 00:28:06,300 keadaan stres. 591 00:28:06,300 --> 00:28:09,470 >> Untungnya, gambar dibuat semuanya bahagia. 592 00:28:09,470 --> 00:28:11,050 Anda bisa menarik ini berbagai cara. 593 00:28:11,050 --> 00:28:12,760 Anda tidak perlu melakukan saling silang yang hal di sini. 594 00:28:12,760 --> 00:28:14,520 Anda bisa melakukannya dengan lurus baris seperti ini. 595 00:28:14,520 --> 00:28:18,790 Tapi inti dari masalah ini, di umum, adalah untuk menyadari bahwa 596 00:28:18,790 --> 00:28:22,060 gambar pada akhirnya akan terlihat sedikit sesuatu seperti ini, karena 597 00:28:22,060 --> 00:28:25,030 waktu konstan tersirat bahwa Anda tetap kemacetan dan kemacetan dan kemacetan 598 00:28:25,030 --> 00:28:29,900 node baru di awal daftar. 599 00:28:29,900 --> 00:28:31,960 Ada pertanyaan? 600 00:28:31,960 --> 00:28:34,565 Mungkin yang paling menantang tentu pertanyaan coding. 601 00:28:34,565 --> 00:28:37,690 >> AUDIENCE: Jadi ini adalah daftar serupa dengan kepala dalam contoh sebelumnya. 602 00:28:37,690 --> 00:28:39,640 >> DAVID J. Malan: Tepat, persis. 603 00:28:39,640 --> 00:28:43,130 Hanya nama yang berbeda untuk variabel global. 604 00:28:43,130 --> 00:28:44,380 World wide apa? 605 00:28:44,380 --> 00:28:48,880 606 00:28:48,880 --> 00:28:49,730 >> ROB Bowden: OK. 607 00:28:49,730 --> 00:28:52,020 Jadi ini adalah satu di mana Anda harus menulis paragraf. 608 00:28:52,020 --> 00:28:56,060 Beberapa orang menulis esai untuk pertanyaan ini. 609 00:28:56,060 --> 00:29:00,230 Tapi Anda hanya perlu menggunakan enam istilah ini untuk menggambarkan apa yang terjadi ketika 610 00:29:00,230 --> 00:29:02,440 Anda mencoba untuk menghubungi facebook.com. 611 00:29:02,440 --> 00:29:07,930 Jadi saya hanya akan berbicara melalui proses menggunakan semua istilah-istilah ini. 612 00:29:07,930 --> 00:29:11,290 Jadi di browser kita, kita ketik facebook.com dan tekan Enter. 613 00:29:11,290 --> 00:29:17,280 Jadi browser kita akan membangun sebuah HTTP meminta bahwa itu akan mengirim 614 00:29:17,280 --> 00:29:22,220 melalui beberapa proses untuk Facebook untuk Facebook untuk menanggapi kami dengan 615 00:29:22,220 --> 00:29:24,450 HTML halaman. 616 00:29:24,450 --> 00:29:28,800 >> Jadi apa adalah proses yang permintaan HTTP 617 00:29:28,800 --> 00:29:30,730 benar-benar sampai ke Facebook? 618 00:29:30,730 --> 00:29:32,790 Jadi pertama, kita perlu menerjemahkan Facebook.com. 619 00:29:32,790 --> 00:29:38,780 Jadi hanya diberi nama Facebook.com, di mana sebenarnya permintaan HTTP 620 00:29:38,780 --> 00:29:39,940 harus pergi? 621 00:29:39,940 --> 00:29:44,120 Jadi kita perlu menerjemahkan Facebook.com ke alamat IP, yang unik 622 00:29:44,120 --> 00:29:47,620 mengidentifikasi mesin apa kita benar-benar ingin mengirim permintaan ini. 623 00:29:47,620 --> 00:29:49,310 Laptop Anda memiliki alamat IP. 624 00:29:49,310 --> 00:29:52,240 Apa pun yang terhubung ke internet memiliki alamat IP. 625 00:29:52,240 --> 00:29:59,030 >> Jadi DNS, Domain Name System, yaitu apa yang akan menangani terjemahan 626 00:29:59,030 --> 00:30:03,750 dari facebook.com ke alamat IP yang Anda benar-benar ingin menghubungi. 627 00:30:03,750 --> 00:30:08,075 Jadi kami menghubungi server DNS dan mengatakan, apa facebook.com? 628 00:30:08,075 --> 00:30:16,560 Ia mengatakan, oh, itu alamat IP 190,212 sesuatu, sesuatu, sesuatu. 629 00:30:16,560 --> 00:30:16,900 Baik. 630 00:30:16,900 --> 00:30:18,850 Sekarang, aku tahu apa mesin Saya hanya mau menghubungi. 631 00:30:18,850 --> 00:30:22,360 >> Jadi Anda mengirim permintaan HTTP Anda ke mesin itu. 632 00:30:22,360 --> 00:30:24,140 Jadi bagaimana cara mendapatkan mesin itu? 633 00:30:24,140 --> 00:30:27,200 Nah, permintaan pergi dari router ke router memantul. 634 00:30:27,200 --> 00:30:32,630 Ingat contoh di kelas, di mana kita benar-benar melihat rute bahwa 635 00:30:32,630 --> 00:30:35,340 paket mengambil ketika kami mencoba untuk berkomunikasi. 636 00:30:35,340 --> 00:30:38,460 Kami melihatnya melompati Atlantik Laut pada satu titik atau apa pun. 637 00:30:38,460 --> 00:30:42,820 >> Jadi port musim lalu. 638 00:30:42,820 --> 00:30:46,520 Jadi sekarang ini adalah pada komputer Anda. 639 00:30:46,520 --> 00:30:49,970 Anda dapat memiliki beberapa hal yang saat ini berkomunikasi dengan internet. 640 00:30:49,970 --> 00:30:53,730 Jadi saya bisa berjalan, katakanlah, Skype. 641 00:30:53,730 --> 00:30:55,670 Saya mungkin memiliki web browser open. 642 00:30:55,670 --> 00:30:59,010 Saya mungkin memiliki sesuatu yang torrenting file. 643 00:30:59,010 --> 00:31:00,880 Jadi semua hal-hal ini berkomunikasi dengan 644 00:31:00,880 --> 00:31:02,600 internet dalam beberapa cara. 645 00:31:02,600 --> 00:31:08,070 >> Jadi, ketika komputer Anda menerima beberapa data dari internet, bagaimana melakukannya 646 00:31:08,070 --> 00:31:10,130 tahu aplikasi apa yang sebenarnya menginginkan data? 647 00:31:10,130 --> 00:31:12,610 Bagaimana cara mengetahui apakah ini khusus Data dimaksudkan untuk 648 00:31:12,610 --> 00:31:16,070 torrenting aplikasi sebagai lawan ke web browser? 649 00:31:16,070 --> 00:31:20,980 Jadi ini adalah tujuan dari pelabuhan dalam semua aplikasi ini memiliki 650 00:31:20,980 --> 00:31:22,720 mengklaim sebuah port pada komputer Anda. 651 00:31:22,720 --> 00:31:27,580 Jadi web browser Anda berkata, hey, Aku mendengarkan pada port 1000. 652 00:31:27,580 --> 00:31:32,240 Dan Program torrenting Anda katakan, Aku mendengarkan pada port 3000. 653 00:31:32,240 --> 00:31:34,770 Dan Skype mengatakan, saya menggunakan port 4000. 654 00:31:34,770 --> 00:31:41,950 >> Jadi, ketika Anda mendapatkan beberapa data yang dimiliki ke salah satu aplikasi, data 655 00:31:41,950 --> 00:31:45,510 ditandai dengan port yang sebenarnya harus dikirim bersama untuk. 656 00:31:45,510 --> 00:31:47,950 Jadi ini mengatakan, oh, saya milik ke port 1000. 657 00:31:47,950 --> 00:31:50,950 Aku tahu maka saya harus meneruskan ini bersama untuk browser web saya. 658 00:31:50,950 --> 00:31:56,440 Jadi alasan itu relevan di sini adalah bahwa server web cenderung 659 00:31:56,440 --> 00:31:58,240 mendengarkan pada port 80. 660 00:31:58,240 --> 00:32:02,420 Jadi ketika saya menghubungi Facebook.com, aku berkomunikasi dengan beberapa mesin. 661 00:32:02,420 --> 00:32:06,390 Tapi aku harus mengatakan yang port yang mesin saya ingin berkomunikasi dengan. 662 00:32:06,390 --> 00:32:09,160 Dan server web cenderung mendengarkan pada port 80. 663 00:32:09,160 --> 00:32:14,010 >> Jika mereka ingin, mereka bisa mengaturnya up sehingga daftar sebagai pada port 7000. 664 00:32:14,010 --> 00:32:19,090 Dan kemudian di browser web, aku bisa manual ketik Facebook.com: 7000 untuk 665 00:32:19,090 --> 00:32:24,600 mengirim permintaan ke port 7000 dari server web Facebook. 666 00:32:24,600 --> 00:32:26,820 >> DAVID J. Malan: Dan dalam hal ini, bahkan meskipun kami tidak mengharuskan orang 667 00:32:26,820 --> 00:32:30,000 menyebutkan hal ini, dalam hal ini, apa port akan permintaan benar-benar pergi ke? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Coba lagi. 670 00:32:37,880 --> 00:32:42,810 671 00:32:42,810 --> 00:32:44,300 Tepat. 672 00:32:44,300 --> 00:32:47,960 Tidak mencari itu, tapi kehalusan sebuah yang ada tidak ada yang terakhir. 673 00:32:47,960 --> 00:32:51,770 >> ROB Bowden: Jadi HTTPS, karena itu mendengarkan khusus untuk 674 00:32:51,770 --> 00:32:55,180 dienkripsi, itu pada port 4430. 675 00:32:55,180 --> 00:32:57,680 >> AUDIENCE: Dan email adalah 25, kan? 676 00:32:57,680 --> 00:33:00,670 >> DAVID J. Malan: Outbound email, 25, yep. 677 00:33:00,670 --> 00:33:03,760 >> ROB Bowden: Aku bahkan tidak tahu sebagian besar - semua yang lebih rendah cenderung 678 00:33:03,760 --> 00:33:06,310 disediakan untuk hal-hal. 679 00:33:06,310 --> 00:33:09,260 Saya pikir segala sesuatu di bawah 1024 dicadangkan. 680 00:33:09,260 --> 00:33:13,450 >> AUDIENCE: Mengapa Anda mengatakan 3 adalah nomor yang salah? 681 00:33:13,450 --> 00:33:18,820 >> ROB Bowden: Karena dalam sebuah alamat IP, ada empat kelompok angka. 682 00:33:18,820 --> 00:33:21,090 Dan mereka dari 0 sampai 255. 683 00:33:21,090 --> 00:33:28,060 Jadi 192.168.2.1 adalah umum alamat IP jaringan lokal. 684 00:33:28,060 --> 00:33:30,840 Perhatikan semua dari mereka adalah kurang dari 255. 685 00:33:30,840 --> 00:33:33,570 Jadi ketika saya mulai dengan 300, yang tidak mungkin memiliki 686 00:33:33,570 --> 00:33:35,210 menjadi salah satu nomor. 687 00:33:35,210 --> 00:33:38,170 >> DAVID J. Malan: Tapi itu klip konyol dari - apakah itu CSI, di mana mereka memiliki 688 00:33:38,170 --> 00:33:39,970 jumlah yang terlalu besar untuk alamat IP. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB Bowden: Setiap pertanyaan tentang ini? 691 00:33:46,110 --> 00:33:51,710 Yang berikutnya, perubahan begitu lengkap dalam topic, tapi kami memiliki array yang ini PHP untuk 692 00:33:51,710 --> 00:33:53,270 rumah-rumah di quad. 693 00:33:53,270 --> 00:33:56,360 Dan kami memiliki daftar unordered. 694 00:33:56,360 --> 00:33:59,550 Dan kita ingin mencetak setiap item daftar hanya berisi nama rumah. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Jadi kita memiliki loop foreach. 697 00:34:11,870 --> 00:34:17,540 Jadi ingat, sintaks foreach array sebagai item dalam array. 698 00:34:17,540 --> 00:34:22,360 Jadi melalui setiap iterasi dari loop, rumah akan mengambil salah satu 699 00:34:22,360 --> 00:34:24,060 nilai-nilai dalam array. 700 00:34:24,060 --> 00:34:26,530 >> Pada iterasi pertama, rumah akan Cabot House. 701 00:34:26,530 --> 00:34:30,370 Pada iterasi kedua, rumah akan menjadi Courier rumah dan sebagainya. 702 00:34:30,370 --> 00:34:34,370 Jadi untuk setiap quad sebagai rumah, kami hanya akan mencetak - 703 00:34:34,370 --> 00:34:37,250 Anda juga bisa bergema - 704 00:34:37,250 --> 00:34:42,199 item daftar dan kemudian nama rumah itu dan kemudian tutup item daftar. 705 00:34:42,199 --> 00:34:45,210 Kurung kurawal adalah opsional di sini. 706 00:34:45,210 --> 00:34:49,480 >> Dan kemudian kita juga mengatakan dalam pertanyaan sendiri, ingatlah untuk menutup 707 00:34:49,480 --> 00:34:50,770 unordered tag daftar. 708 00:34:50,770 --> 00:34:53,949 Jadi kita perlu untuk keluar dari mode PHP dalam rangka untuk melakukan hal ini. 709 00:34:53,949 --> 00:35:00,280 Atau kita bisa menggemakan menutup unordered daftar tag. 710 00:35:00,280 --> 00:35:02,380 >> DAVID J. Malan: Juga baik saja di sini akan telah menggunakan sekolah tua untuk 711 00:35:02,380 --> 00:35:07,340 loop dengan $ i = 0 0 dan menggunakan jumlah untuk mengetahui panjang dari sinar. 712 00:35:07,340 --> 00:35:09,240 Benar-benar baik juga, hanya a wordier sedikit. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> AUDIENCE: Jadi, jika Anda akan [Tak terdengar], yang akan Anda lakukan - 715 00:35:14,742 --> 00:35:16,734 Aku lupa apa loop [Tak terdengar] adalah. 716 00:35:16,734 --> 00:35:21,380 Apakah Anda $ quad braket i? 717 00:35:21,380 --> 00:35:21,850 >> DAVID J. Malan: Tepat. 718 00:35:21,850 --> 00:35:23,100 Ya, persis. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB Bowden: Ada lagi? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> DAVID J. Malan: Baiklah. 723 00:35:32,010 --> 00:35:32,300 Trade-offs. 724 00:35:32,300 --> 00:35:38,290 Jadi ada tandan jawaban mungkin bagi masing-masing. 725 00:35:38,290 --> 00:35:40,510 Kami benar-benar hanya mencari sesuatu yang menarik untuk terbalik dan 726 00:35:40,510 --> 00:35:41,100 kerugian. 727 00:35:41,100 --> 00:35:44,830 Dan nomor 16 bertanya, memvalidasi pengguna ' masukan client-side, seperti JavaScript, 728 00:35:44,830 --> 00:35:47,280 bukan server-side, seperti PHP. 729 00:35:47,280 --> 00:35:49,450 Jadi apa terbalik dari melakukan client-side? 730 00:35:49,450 --> 00:35:53,780 >> Nah, salah satu hal yang kami usulkan adalah bahwa Anda mengurangi latency, karena Anda 731 00:35:53,780 --> 00:35:56,750 tidak perlu repot menghubungi server, yang mungkin memakan waktu beberapa 732 00:35:56,750 --> 00:36:00,390 milidetik atau bahkan beberapa detik dengan menghindari itu dan hanya 733 00:36:00,390 --> 00:36:04,670 memvalidasi pengguna masukan client-side oleh memicu handler on-mengirimkan dan 734 00:36:04,670 --> 00:36:06,650 hanya memeriksa, apakah mereka ketik sesuatu dalam nama? 735 00:36:06,650 --> 00:36:08,080 Apakah mereka mengetik sesuatu di alamat email? 736 00:36:08,080 --> 00:36:10,950 Apakah mereka memilih asrama dari menu drop-down? 737 00:36:10,950 --> 00:36:14,360 >> Anda dapat memberi mereka umpan balik seketika menggunakan komputer gigahertz 738 00:36:14,360 --> 00:36:16,770 atau apapun yang mereka miliki itu benar-benar di meja mereka. 739 00:36:16,770 --> 00:36:19,310 Jadi itu hanya pengguna yang lebih baik mengalami biasanya. 740 00:36:19,310 --> 00:36:24,460 Tapi downside melakukan client-side validasi, jika Anda melakukannya tanpa juga 741 00:36:24,460 --> 00:36:29,860 melakukan validasi server-side adalah bahwa kebanyakan orang keluar dari CS50 tahu 742 00:36:29,860 --> 00:36:33,980 bahwa Anda hanya dapat mengirim data apapun yang Anda inginkan ke server berbagai cara. 743 00:36:33,980 --> 00:36:37,030 Terus terang, di sebagian besar browser apapun, Anda dapat klik di dalam pengaturan dan hanya 744 00:36:37,030 --> 00:36:40,110 mematikan JavaScript, yang akan, Oleh karena itu, menonaktifkan segala bentuk 745 00:36:40,110 --> 00:36:41,080 validasi. 746 00:36:41,080 --> 00:36:44,460 >> Tapi Anda juga mungkin ingat bahwa bahkan aku melakukan beberapa hal misterius di kelas menggunakan 747 00:36:44,460 --> 00:36:47,790 telnet dan benar-benar berpura-pura menjadi browser dengan mengirimkan get 748 00:36:47,790 --> 00:36:49,240 permintaan ke server. 749 00:36:49,240 --> 00:36:51,030 Dan itu tentu tidak menggunakan JavaScript. 750 00:36:51,030 --> 00:36:53,290 Itu hanya saya mengetik perintah pada keyboard. 751 00:36:53,290 --> 00:36:57,410 Jadi benar-benar, setiap programmer dalam cukup kenyamanan dengan web dan HTTP 752 00:36:57,410 --> 00:37:01,690 bisa mengirim data apa pun yang dia inginkan ke server tanpa validasi. 753 00:37:01,690 --> 00:37:05,470 Dan jika server Anda tidak juga memeriksa, mereka memberi saya sebuah nama, adalah 754 00:37:05,470 --> 00:37:08,930 ini benar-benar alamat email yang valid, melakukan mereka memilih asrama, Anda mungkin berakhir 755 00:37:08,930 --> 00:37:12,800 up memasukkan palsu atau hanya data yang kosong ke dalam database Anda, yang mungkin 756 00:37:12,800 --> 00:37:15,450 tidak akan menjadi hal yang baik jika Anda asumsi itu ada di sana. 757 00:37:15,450 --> 00:37:16,770 >> Jadi ini merupakan realitas menjengkelkan. 758 00:37:16,770 --> 00:37:19,890 Tapi secara umum, client-side validasi besar. 759 00:37:19,890 --> 00:37:21,810 Tapi itu berarti dua kali lebih banyak pekerjaan. 760 00:37:21,810 --> 00:37:25,970 Meskipun ada memang ada berbagai perpustakaan, perpustakaan JavaScript untuk 761 00:37:25,970 --> 00:37:28,830 Misalnya, yang membuat ini banyak, apalagi sakit kepala. 762 00:37:28,830 --> 00:37:31,940 Dan Anda dapat menggunakan kembali beberapa kode server-side, client-side. 763 00:37:31,940 --> 00:37:35,980 Tapi jangan menyadari bahwa itu biasanya pekerjaan tambahan. 764 00:37:35,980 --> 00:37:36,415 Ya. 765 00:37:36,415 --> 00:37:37,792 >> AUDIENCE: Jadi jika kita hanya mengatakan kurang aman - 766 00:37:37,792 --> 00:37:39,205 >> DAVID J. Malan: [TERTAWA] 767 00:37:39,205 --> 00:37:39,680 Ugh. 768 00:37:39,680 --> 00:37:43,105 Mereka adalah selalu sulit yang mengadili. 769 00:37:43,105 --> 00:37:44,480 >> ROB Bowden: Itu akan telah diterima. 770 00:37:44,480 --> 00:37:44,810 >> DAVID J. Malan: Apa? 771 00:37:44,810 --> 00:37:45,810 >> ROB Bowden: saya buat masalah ini. 772 00:37:45,810 --> 00:37:46,735 Itu akan telah diterima. 773 00:37:46,735 --> 00:37:47,220 >> DAVID J. Malan: Ya. 774 00:37:47,220 --> 00:37:47,830 >> AUDIENCE: Cool. 775 00:37:47,830 --> 00:37:51,770 >> ROB Bowden: Tapi kita tidak menerima untuk pertama - 776 00:37:51,770 --> 00:37:53,630 baik, apa yang kita cari adalah sesuatu seperti Anda tidak perlu 777 00:37:53,630 --> 00:37:55,270 berkomunikasi dengan server. 778 00:37:55,270 --> 00:37:58,355 Kami tidak menerima hanya lebih cepat. 779 00:37:58,355 --> 00:38:00,080 >> AUDIENCE: Bagaimana tidak kembali halaman? 780 00:38:00,080 --> 00:38:00,430 >> ROB Bowden: Ya. 781 00:38:00,430 --> 00:38:03,000 Itu adalah jawaban yang diterima. 782 00:38:03,000 --> 00:38:06,300 >> DAVID J. Malan: Apa pun di mana kami merasa itu lebih mungkin daripada tidak mungkin 783 00:38:06,300 --> 00:38:09,780 bahwa Anda tahu apa yang Anda mengatakan, yang sulit 784 00:38:09,780 --> 00:38:13,500 line untuk menarik kadang-kadang. 785 00:38:13,500 --> 00:38:16,000 Menggunakan linked list sebagai gantinya array untuk mempertahankan 786 00:38:16,000 --> 00:38:17,590 diurutkan daftar bilangan bulat. 787 00:38:17,590 --> 00:38:21,000 Jadi terbalik kita sering mengutip dengan dihubungkan daftar yang memotivasi seluruh mereka 788 00:38:21,000 --> 00:38:22,370 pengantar adalah Anda mendapatkan dinamisme. 789 00:38:22,370 --> 00:38:23,030 Mereka bisa tumbuh. 790 00:38:23,030 --> 00:38:23,950 Mereka dapat menyusut. 791 00:38:23,950 --> 00:38:27,370 Jadi Anda tidak harus melompat melalui lingkaran untuk benar-benar membuat lebih banyak memori 792 00:38:27,370 --> 00:38:28,140 dengan array. 793 00:38:28,140 --> 00:38:30,310 Atau Anda tidak perlu hanya mengatakan, maaf, pengguna. 794 00:38:30,310 --> 00:38:31,410 Array diisi. 795 00:38:31,410 --> 00:38:35,850 Pertumbuhan sangat dinamis dari daftar. 796 00:38:35,850 --> 00:38:37,210 Sebuah Kelemahan meskipun dari daftar terkait? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> AUDIENCE: Ini linear. 799 00:38:43,356 --> 00:38:45,800 Pencarian di linked list adalah linier bukan apa yang Anda log in 800 00:38:45,800 --> 00:38:46,360 >> DAVID J. Malan: Tepat. 801 00:38:46,360 --> 00:38:50,160 Mencari pada linked list adalah linier, bahkan jika itu diurutkan, karena Anda dapat 802 00:38:50,160 --> 00:38:53,170 hanya mengikuti remah roti ini, ini pointer, dari awal daftar 803 00:38:53,170 --> 00:38:53,570 sampai akhir. 804 00:38:53,570 --> 00:38:57,970 Anda tidak dapat memanfaatkan akses acak dan, dengan demikian, pencarian biner, bahkan jika itu 805 00:38:57,970 --> 00:39:00,740 diurutkan, bahwa Anda bisa lakukan dengan array. 806 00:39:00,740 --> 00:39:02,390 Dan ada juga biaya lain. 807 00:39:02,390 --> 00:39:02,966 Ya. 808 00:39:02,966 --> 00:39:03,800 >> AUDIENCE: Memory tidak efisien? 809 00:39:03,800 --> 00:39:04,130 >> DAVID J. Malan: Ya. 810 00:39:04,130 --> 00:39:06,940 Yah, aku tidak akan selalu mengatakan tidak efisien. 811 00:39:06,940 --> 00:39:10,110 Tapi itu biaya lebih banyak memori, karena Anda perlu 32 bit untuk setiap 812 00:39:10,110 --> 00:39:13,400 node untuk pointer tambahan, di setidaknya untuk daftar tunggal linked. 813 00:39:13,400 --> 00:39:16,660 Sekarang, jika Anda hanya menyimpan bilangan bulat dan Anda menambahkan pointer, itu 814 00:39:16,660 --> 00:39:17,830 sebenarnya jenis non-sepele. 815 00:39:17,830 --> 00:39:19,340 Ini dua kali lipat jumlah memori. 816 00:39:19,340 --> 00:39:22,330 Namun pada kenyataannya, jika Anda menyimpan linked list dari structs yang mungkin memiliki 817 00:39:22,330 --> 00:39:25,540 8 byte, 16 byte, bahkan lebih Selain itu, mungkin itu kurang 818 00:39:25,540 --> 00:39:26,500 dari biaya marjinal. 819 00:39:26,500 --> 00:39:28,320 Tapi itu biaya tetap. 820 00:39:28,320 --> 00:39:31,880 Jadi salah satu dari mereka akan sudah baik-baik saja sebagai kerugian. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 Menggunakan PHP bukannya C untuk menulis program baris perintah. 823 00:39:36,100 --> 00:39:41,890 Jadi di sini, sering lebih cepat untuk menggunakan bahasa seperti PHP atau Ruby atau Python. 824 00:39:41,890 --> 00:39:43,700 Anda hanya cepat membuka up editor teks. 825 00:39:43,700 --> 00:39:45,900 Anda memiliki lebih banyak fungsi tersedia untuk Anda. 826 00:39:45,900 --> 00:39:49,325 PHP memiliki wastafel dapur fungsi, sedangkan di C, Anda 827 00:39:49,325 --> 00:39:50,420 memiliki sangat, sangat sedikit. 828 00:39:50,420 --> 00:39:53,820 Bahkan, orang-orang yang tahu cara yang keras bahwa Anda tidak memiliki tabel hash. 829 00:39:53,820 --> 00:39:55,000 Anda tidak mengaitkan daftar. 830 00:39:55,000 --> 00:39:57,470 Jika Anda ingin orang-orang, Anda harus menerapkannya sendiri. 831 00:39:57,470 --> 00:40:00,950 >> Jadi salah satu terbalik PHP atau benar-benar ada bahasa ditafsirkan adalah kecepatan yang 832 00:40:00,950 --> 00:40:02,920 dengan mana Anda dapat menulis kode. 833 00:40:02,920 --> 00:40:06,660 Tapi sisi negatifnya, kami melihat ini ketika saya cepat melecut misspeller a 834 00:40:06,660 --> 00:40:11,780 implementasi dalam kuliah menggunakan PHP, adalah bahwa menggunakan bahasa ditafsirkan 835 00:40:11,780 --> 00:40:13,570 biasanya lebih lambat. 836 00:40:13,570 --> 00:40:18,420 Dan kita melihat bahwa terbukti dengan peningkatan waktu dari 0,3 detik sampai 3 837 00:40:18,420 --> 00:40:24,440 detik, karena penafsiran yang benar-benar terjadi. 838 00:40:24,440 --> 00:40:27,060 >> Terbalik lain adalah bahwa Anda tidak perlu melakukan kompilasi. 839 00:40:27,060 --> 00:40:30,130 Jadi juga mempercepat pembangunan kebetulan, karena Anda tidak memiliki 840 00:40:30,130 --> 00:40:31,360 dua langkah untuk menjalankan program. 841 00:40:31,360 --> 00:40:32,140 Anda hanya memiliki satu. 842 00:40:32,140 --> 00:40:35,260 Dan itu cukup menarik juga. 843 00:40:35,260 --> 00:40:38,450 Menggunakan database SQL bukan file CSV untuk menyimpan data. 844 00:40:38,450 --> 00:40:40,230 Database Jadi SQL digunakan untuk pset7. 845 00:40:40,230 --> 00:40:42,060 File CSV Anda tidak menggunakan banyak. 846 00:40:42,060 --> 00:40:45,960 Tapi Anda menggunakannya secara tidak langsung dalam pset7 sebagai baik dengan berbicara dengan Yahoo Finance. 847 00:40:45,960 --> 00:40:49,330 >> Tapi CSV adalah seperti file Excel namun super sederhana, di mana kolom yang 848 00:40:49,330 --> 00:40:54,010 hanya ditandai saja dengan koma dalam dari file text sebaliknya. 849 00:40:54,010 --> 00:40:56,740 Dan menggunakan database SQL sedikit lebih menarik. 850 00:40:56,740 --> 00:41:00,060 Ini terbalik, karena Anda mendapatkan sesuatu seperti memilih dan menyisipkan dan menghapus. 851 00:41:00,060 --> 00:41:03,790 Dan Anda mendapatkan, mungkin, indeks yang MySQL dan database lainnya, seperti 852 00:41:03,790 --> 00:41:07,510 Oracle, membangun untuk Anda dalam memori, yang berarti pilih Anda mungkin tidak 853 00:41:07,510 --> 00:41:09,000 akan linear atas ke bawah. 854 00:41:09,000 --> 00:41:11,300 Ini benar-benar akan menjadi sesuatu seperti pencarian biner atau sesuatu 855 00:41:11,300 --> 00:41:12,520 serupa semangatnya. 856 00:41:12,520 --> 00:41:13,930 Jadi mereka biasanya lebih cepat. 857 00:41:13,930 --> 00:41:16,040 >> Tapi sisi negatifnya adalah bahwa itu hanya lebih banyak pekerjaan. 858 00:41:16,040 --> 00:41:16,730 Ini lebih banyak usaha. 859 00:41:16,730 --> 00:41:18,140 Anda harus memahami database. 860 00:41:18,140 --> 00:41:18,940 Anda harus mengaturnya. 861 00:41:18,940 --> 00:41:20,840 Anda memerlukan server untuk menjalankan bahwa database on. 862 00:41:20,840 --> 00:41:22,750 Anda perlu memahami cara mengkonfigurasinya. 863 00:41:22,750 --> 00:41:24,930 Jadi ini hanya ini macam trade-offs. 864 00:41:24,930 --> 00:41:27,860 Sedangkan file CSV, Anda dapat menciptakannya dengan gedit. 865 00:41:27,860 --> 00:41:28,770 Dan Anda baik untuk pergi. 866 00:41:28,770 --> 00:41:31,550 Tidak ada kompleksitas di luar itu. 867 00:41:31,550 --> 00:41:34,870 >> Menggunakan trie bukan tabel hash dengan chaining terpisah untuk menyimpan 868 00:41:34,870 --> 00:41:37,490 kamus kata-kata mengingatkan dari pset5. 869 00:41:37,490 --> 00:41:42,480 Jadi mencoba terbalik, dalam teori setidaknya, adalah apa? 870 00:41:42,480 --> 00:41:46,380 Waktu yang konstan, setidaknya jika Anda hashing pada masing-masing individu 871 00:41:46,380 --> 00:41:48,990 huruf dalam kata, seperti Anda mungkin untuk pset5. 872 00:41:48,990 --> 00:41:52,720 Yang mungkin lima hash, enam hash jika ada lima atau enam 873 00:41:52,720 --> 00:41:53,900 huruf dalam kata. 874 00:41:53,900 --> 00:41:54,580 Dan itu cukup bagus. 875 00:41:54,580 --> 00:41:56,910 Dan jika ada batas atas bagaimana panjang kata-kata Anda mungkin, itu 876 00:41:56,910 --> 00:41:59,320 waktu memang asimtotik konstan. 877 00:41:59,320 --> 00:42:05,180 >> Sedangkan tabel hash dengan terpisah chaining, masalahnya di sana dengan yang 878 00:42:05,180 --> 00:42:09,070 jenis struktur data adalah bahwa kinerja algoritma Anda biasanya 879 00:42:09,070 --> 00:42:12,700 tergantung pada beberapa hal sudah dalam struktur data. 880 00:42:12,700 --> 00:42:15,660 Dan itu pasti terjadi dengan rantai, dimana lebih banyak barang yang Anda masukkan 881 00:42:15,660 --> 00:42:18,800 ke dalam tabel hash, semakin lama mereka rantai pergi, yang berarti di terburuk 882 00:42:18,800 --> 00:42:21,960 kasus, hal yang Anda mungkin akan mencari adalah sepanjang jalan di ujung salah satu 883 00:42:21,960 --> 00:42:26,000 dari orang-orang rantai, yang secara efektif devolves menjadi sesuatu yang linear. 884 00:42:26,000 --> 00:42:29,450 >> Sekarang, dalam prakteknya, itu bisa benar-benar menjadi kasus bahwa tabel hash dengan 885 00:42:29,450 --> 00:42:32,820 rantai lebih cepat dari yang sesuai implementasi trie. 886 00:42:32,820 --> 00:42:35,570 Tapi itu karena berbagai alasan, antara yang mencoba menggunakan seluruh banyak 887 00:42:35,570 --> 00:42:39,240 memori yang dapat, pada kenyataannya, hal-hal yang lambat down, karena Anda tidak mendapatkan bagus 888 00:42:39,240 --> 00:42:42,410 manfaat sesuatu yang disebut caching, di mana hal-hal yang berdekatan 889 00:42:42,410 --> 00:42:45,420 dalam memori dapat diakses sering lebih cepat. 890 00:42:45,420 --> 00:42:48,180 Dan kadang-kadang Anda bisa datang dengan fungsi hash yang benar-benar baik. 891 00:42:48,180 --> 00:42:51,060 Bahkan jika Anda perlu membuang sedikit memori, Anda mungkin, memang, dapat 892 00:42:51,060 --> 00:42:54,430 menemukan hal-hal yang cepat dan tidak seburuk linear. 893 00:42:54,430 --> 00:42:58,410 >> Jadi singkatnya, tidak ada tentu dengan salah satu satu atau bahkan dua 894 00:42:58,410 --> 00:43:00,050 hal-hal tertentu yang kita cari. 895 00:43:00,050 --> 00:43:03,080 Benar-benar sesuatu yang persuasif sebagai terbalik dan downside 896 00:43:03,080 --> 00:43:04,800 umumnya tertangkap mata kita. 897 00:43:04,800 --> 00:43:11,840 >> ROB Bowden: Jadi untuk terbalik, kita lakukan tidak menerima sendiri "lebih cepat." Anda 898 00:43:11,840 --> 00:43:14,540 harus mengatakan sesuatu tentang hal itu. 899 00:43:14,540 --> 00:43:17,910 Bahkan jika Anda mengatakan secara teoritis lebih cepat, kami tahu bahwa Anda jenis dipahami 900 00:43:17,910 --> 00:43:19,470 bahwa itu 0 dari 1. 901 00:43:19,470 --> 00:43:22,820 Dan tabel hash, dalam teori, tidak 0 dari 1. 902 00:43:22,820 --> 00:43:26,550 Menyebutkan apa-apa tentang runtime umumnya punya Anda poin. 903 00:43:26,550 --> 00:43:32,640 Tapi "lebih cepat," sebagian besar solusi pada papan besar yang mencoba yang 904 00:43:32,640 --> 00:43:34,990 obyektif lambat dari solusi yang tabel hash. 905 00:43:34,990 --> 00:43:37,250 Jadi lebih cepat dalam dan dari dirinya sendiri tidak sepenuhnya benar. 906 00:43:37,250 --> 00:43:41,550 907 00:43:41,550 --> 00:43:44,380 >> DAVID J. Malan: Dom dom dom de. 908 00:43:44,380 --> 00:43:46,686 Saya mungkin satu-satunya yang menyadari itulah cara yang seharusnya 909 00:43:46,686 --> 00:43:47,500 diucapkan, kan? 910 00:43:47,500 --> 00:43:50,400 >> ROB Bowden: aku benar-benar tidak tahu. 911 00:43:50,400 --> 00:43:51,650 >> DAVID J. Malan: Itu membuat akal di kepala saya. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB Bowden: Aku melakukan yang satu ini. 914 00:43:57,580 --> 00:43:58,020 OK. 915 00:43:58,020 --> 00:44:04,243 Jadi ini adalah satu di mana Anda harus menarik diagram yang mirip dengan Anda mungkin 916 00:44:04,243 --> 00:44:06,040 telah melihat di masa lalu ujian. 917 00:44:06,040 --> 00:44:12,200 Jadi mari kita lihat ini. 918 00:44:12,200 --> 00:44:18,170 Jadi dari node HTML, kita memiliki dua anak-anak, kepala dan tubuh. 919 00:44:18,170 --> 00:44:20,570 Jadi kita cabang - kepala dan tubuh. 920 00:44:20,570 --> 00:44:22,280 Kepala memiliki tag judul. 921 00:44:22,280 --> 00:44:23,710 Jadi kita memiliki judul. 922 00:44:23,710 --> 00:44:28,450 >> Sekarang, satu hal yang banyak orang lupa adalah bahwa node teks ini 923 00:44:28,450 --> 00:44:30,430 elemen-elemen dalam pohon ini. 924 00:44:30,430 --> 00:44:36,260 Jadi di sini kita terjadi untuk menarik mereka sebagai oval untuk membedakan mereka dari ini 925 00:44:36,260 --> 00:44:37,380 jenis node. 926 00:44:37,380 --> 00:44:41,450 Tapi perhatikan juga di sini kita memiliki top, tengah, dan bawah akan berakhir menjadi 927 00:44:41,450 --> 00:44:42,560 node teks. 928 00:44:42,560 --> 00:44:46,250 Jadi lupa mereka agak dari kesalahan umum. 929 00:44:46,250 --> 00:44:48,770 >> Tubuh memiliki tiga anak - tiga divs. 930 00:44:48,770 --> 00:44:53,340 Jadi div, div, div dan kemudian teks anak simpul tersebut divs. 931 00:44:53,340 --> 00:44:55,900 Itu cukup banyak itu untuk itu pertanyaan. 932 00:44:55,900 --> 00:44:57,860 >> DAVID J. Malan: Dan perlu dicatat, meskipun kita tidak memikirkan ini 933 00:44:57,860 --> 00:45:01,040 rincian dalam waktu yang kita habiskan untuk JavaScript, bahwa perintah tersebut tidak, dalam 934 00:45:01,040 --> 00:45:02,290 Bahkan, masalah teknis. 935 00:45:02,290 --> 00:45:06,330 Jadi jika kepala datang sebelum tubuh dalam HTML, maka akan muncul ke 936 00:45:06,330 --> 00:45:08,860 meninggalkan tubuh dalam DOM yang sebenarnya. 937 00:45:08,860 --> 00:45:12,265 Bahwa itu adalah, pada umumnya, hanya FYI, sesuatu yang disebut urutan dokumen, di mana 938 00:45:12,265 --> 00:45:13,260 itu penting. 939 00:45:13,260 --> 00:45:17,470 Dan jika Anda menerapkan parser, sebuah program yang membaca HTML di gedung 940 00:45:17,470 --> 00:45:20,960 atas pohon dalam memori, jujur, yang intuitif mungkin apa yang Anda 941 00:45:20,960 --> 00:45:24,720 melakukan pula - atas ke bawah, kiri ke kanan. 942 00:45:24,720 --> 00:45:26,116 >> ROB Bowden: Pertanyaan itu? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 Yang harus saya lakukan berikutnya? 945 00:45:30,000 --> 00:45:32,380 >> DAVID J. Malan: Tentu. 946 00:45:32,380 --> 00:45:33,810 >> ROB Bowden: OK. 947 00:45:33,810 --> 00:45:39,320 Jadi ini adalah buffer overrun Pertanyaan serangan. 948 00:45:39,320 --> 00:45:43,740 Hal utama untuk mengenali sini adalah, baik, bagaimana mungkin trik musuh 949 00:45:43,740 --> 00:45:46,170 program ini ke dalam mengeksekusi kode sewenang-wenang? 950 00:45:46,170 --> 00:45:51,860 Jadi argv1, baris perintah pertama argumen untuk program ini, yang dapat 951 00:45:51,860 --> 00:45:53,920 sewenang-wenang panjang. 952 00:45:53,920 --> 00:45:59,160 Tapi di sini kita menggunakan memcpy untuk menyalin argv1, yang di sini adalah bar. 953 00:45:59,160 --> 00:46:00,165 Kami melewati sebagai argumen. 954 00:46:00,165 --> 00:46:02,050 Dan itu berlangsung pada nama bar. 955 00:46:02,050 --> 00:46:08,040 >> Jadi kita memcpying bar ke dalam buffer ini c. 956 00:46:08,040 --> 00:46:09,400 Berapa banyak byte yang kita menyalin? 957 00:46:09,400 --> 00:46:14,040 Nah namun banyak byte bar terjadi menggunakan, panjang argumen itu. 958 00:46:14,040 --> 00:46:17,930 Tapi c hanya 12 byte lebar. 959 00:46:17,930 --> 00:46:22,280 Jadi jika kita ketik argumen baris perintah itu lebih dari 12 byte, kita 960 00:46:22,280 --> 00:46:25,470 akan meluap ini penyangga tertentu. 961 00:46:25,470 --> 00:46:31,000 Sekarang, bagaimana mungkin musuh mengelabui program ke mengeksekusi kode sewenang-wenang? 962 00:46:31,000 --> 00:46:34,910 >> Jadi ingat bahwa di sini utama memanggil foo. 963 00:46:34,910 --> 00:46:37,340 Dan kemudian panggilan utama foo. 964 00:46:37,340 --> 00:46:40,408 Mari kita menggambar ini. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Jadi kita memiliki tumpukan kami. 967 00:46:46,990 --> 00:46:49,090 Dan utama memiliki stack frame di bagian bawah. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 Pada titik tertentu, panggilan utama foo. 970 00:46:53,250 --> 00:46:55,390 Nah, segera, panggilan utama foo. 971 00:46:55,390 --> 00:46:57,130 Dan foo mendapat stack frame sendiri. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Sekarang, di beberapa titik, foo akan kembali. 974 00:47:02,220 --> 00:47:06,810 Dan pergi kembali foo, kita perlu tahu di apa baris kode dalam kita utama 975 00:47:06,810 --> 00:47:10,610 adalah untuk mengetahui di mana kita harus melanjutkan dalam utama. 976 00:47:10,610 --> 00:47:13,100 Kita bisa memanggil foo dari keseluruhan banyak tempat yang berbeda. 977 00:47:13,100 --> 00:47:14,620 Bagaimana kita tahu di mana untuk kembali? 978 00:47:14,620 --> 00:47:16,460 Nah, kita perlu menyimpan tempat itu. 979 00:47:16,460 --> 00:47:23,010 >> Jadi suatu tempat yang benar di sini, kami menyimpan di mana kita harus kembali untuk sekali 980 00:47:23,010 --> 00:47:24,070 kembali foo. 981 00:47:24,070 --> 00:47:26,350 Dan ini adalah alamat pengirim. 982 00:47:26,350 --> 00:47:30,490 Jadi bagaimana musuh mungkin mengambil keuntungan ini adalah kenyataan bahwa 983 00:47:30,490 --> 00:47:37,550 penyangga ini c disimpan, mari kita mengatakan, di sini adalah c. 984 00:47:37,550 --> 00:47:39,690 Jadi kita punya 12 byte untuk c. 985 00:47:39,690 --> 00:47:40,540 Ini adalah c. 986 00:47:40,540 --> 00:47:43,030 Dan ini adalah tumpukan cincin foo itu. 987 00:47:43,030 --> 00:47:49,970 Jadi, jika pengguna jahat masuk lebih byte dari 12 atau mereka memasukkan perintah 988 00:47:49,970 --> 00:47:54,570 argumen baris yang lebih dari 12 karakter, maka kita akan 989 00:47:54,570 --> 00:47:57,540 meluap penyangga ini. 990 00:47:57,540 --> 00:47:59,910 >> Kita bisa terus berjalan. 991 00:47:59,910 --> 00:48:02,220 Dan di beberapa titik, kita pergi jauh cukup bahwa kita mulai 992 00:48:02,220 --> 00:48:05,120 Timpa alamat pengirim ini. 993 00:48:05,120 --> 00:48:08,310 Jadi sekali kita menimpa alamat pengirim, ini berarti bahwa ketika foo 994 00:48:08,310 --> 00:48:14,220 kembali, kita kembali ke mana pun pengguna berbahaya memberitahu untuk oleh 995 00:48:14,220 --> 00:48:19,490 nilai apa pun itu masuk, dengan cara apa pun karakter pengguna masuk. 996 00:48:19,490 --> 00:48:24,320 Dan jadi jika pengguna jahat sedang sangat cerdas, ia dapat memiliki ini 997 00:48:24,320 --> 00:48:29,255 kembali ke suatu tempat di printDef fungsi atau suatu tempat di malloc 998 00:48:29,255 --> 00:48:31,830 fungsi, hanya di mana saja sewenang-wenang. 999 00:48:31,830 --> 00:48:38,420 >> Tetapi bahkan lebih pintar adalah bagaimana jika ia memiliki pengguna kembali ke sini. 1000 00:48:38,420 --> 00:48:41,920 Dan kemudian Anda mulai menjalankan ini sebagai baris kode. 1001 00:48:41,920 --> 00:48:46,610 Jadi pada saat itu, pengguna dapat memasukkan apapun yang dia inginkan ke wilayah ini. 1002 00:48:46,610 --> 00:48:52,210 Dan ia memiliki kontrol penuh atas program Anda. 1003 00:48:52,210 --> 00:48:53,460 Pertanyaan itu? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 Jadi pertanyaan berikutnya adalah lengkap implementasi ulang dari foo sedemikian rupa 1006 00:49:00,970 --> 00:49:02,620 bahwa itu tidak lagi rentan. 1007 00:49:02,620 --> 00:49:03,870 >> Jadi ada beberapa cara Anda bisa melakukan ini. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 Kami masih memiliki c hanya menjadi panjang 12. 1010 00:49:13,330 --> 00:49:16,480 Anda bisa mengubah ini sebagai bagian dari solusi Anda. 1011 00:49:16,480 --> 00:49:18,930 Kami juga menambahkan cek untuk membuat yakin bar tidak null. 1012 00:49:18,930 --> 00:49:24,460 Meskipun Anda tidak perlu bahwa untuk kredit penuh. 1013 00:49:24,460 --> 00:49:27,690 Jadi kita memeriksa pertama panjang string dari bar. 1014 00:49:27,690 --> 00:49:31,650 Jika itu lebih besar dari 12, maka tidak benar-benar melakukan salin. 1015 00:49:31,650 --> 00:49:33,010 Jadi itulah salah satu cara untuk memperbaikinya. 1016 00:49:33,010 --> 00:49:36,750 >> Cara lain untuk memperbaiki itu bukan memiliki c hanya menjadi panjang 12, memilikinya 1017 00:49:36,750 --> 00:49:39,310 menjadi panjang strlen (bar). 1018 00:49:39,310 --> 00:49:43,370 Cara lain untuk memperbaiki itu untuk benar-benar hanya kembali. 1019 00:49:43,370 --> 00:49:46,690 Jadi jika Anda baru saja sudah menyingkirkan semua ini, jika Anda baru saja menghapus semua 1020 00:49:46,690 --> 00:49:51,830 baris kode, Anda akan mendapatkan kredit penuh, karena fungsi ini 1021 00:49:51,830 --> 00:49:54,150 tidak benar-benar mencapai apa-apa. 1022 00:49:54,150 --> 00:49:57,650 Ini menyalin baris perintah Argumen ke dalam beberapa array dalam 1023 00:49:57,650 --> 00:49:59,960 stack frame lokalnya. 1024 00:49:59,960 --> 00:50:01,310 Dan kemudian hal itu kembali. 1025 00:50:01,310 --> 00:50:04,020 Dan apa pun yang dicapai hilang. 1026 00:50:04,020 --> 00:50:09,740 Jadi kembali juga cukup cara mendapatkan kredit penuh. 1027 00:50:09,740 --> 00:50:13,425 >> DAVID J. Malan: Tidak cukup semangat dari pertanyaan tetapi dapat diterima per 1028 00:50:13,425 --> 00:50:15,580 spek tetap. 1029 00:50:15,580 --> 00:50:18,260 >> ROB Bowden: Pertanyaan tentang semua itu? 1030 00:50:18,260 --> 00:50:22,270 Satu hal yang Anda setidaknya diperlukan untuk memiliki kode kompilasi. 1031 00:50:22,270 --> 00:50:24,810 Jadi meskipun secara teknis Anda tidak rentan jika kode Anda tidak 1032 00:50:24,810 --> 00:50:29,130 kompilasi, kami tidak menerima itu. 1033 00:50:29,130 --> 00:50:31,350 Tidak ada pertanyaan? 1034 00:50:31,350 --> 00:50:33,320 OK. 1035 00:50:33,320 --> 00:50:34,580 >> DAVID J. Malan: Apakah Anda ingin mengatakan judul ini? 1036 00:50:34,580 --> 00:50:37,230 >> ROB Bowden: No 1037 00:50:37,230 --> 00:50:40,470 >> DAVID J. Malan: Jadi dalam satu ini, ini entah kabar baik atau kabar buruk. 1038 00:50:40,470 --> 00:50:43,870 Ini adalah benar-benar masalah yang sama sebagai kuis pertama. 1039 00:50:43,870 --> 00:50:46,140 Dan itu hampir sama masalah seperti pset1. 1040 00:50:46,140 --> 00:50:49,980 Tapi itu memang sengaja disederhanakan menjadi piramida sederhana, salah satu yang dapat 1041 00:50:49,980 --> 00:50:52,330 dipecahkan dengan sedikit iterasi sederhana. 1042 00:50:52,330 --> 00:50:55,680 Dan sungguh, apa yang kita mendapatkan di di sini tidak begitu banyak logika, 1043 00:50:55,680 --> 00:50:58,100 karena mungkin, pada titik ini, Anda lebih nyaman daripada Anda 1044 00:50:58,100 --> 00:51:01,850 dalam satu minggu dengan untuk loop atau mengapa loop, tapi benar-benar untuk menggoda selain yang 1045 00:51:01,850 --> 00:51:04,790 Anda sedikit nyaman dengan gagasan bahwa PHP tidak hanya tentang apa yang 1046 00:51:04,790 --> 00:51:05,290 pemrograman. 1047 00:51:05,290 --> 00:51:07,820 Hal ini sebenarnya dapat digunakan sebagai bahasa untuk menulis program baris perintah. 1048 00:51:07,820 --> 00:51:10,060 >> Dan memang, itulah yang kita mencoba untuk menarik perhatian Anda untuk. 1049 00:51:10,060 --> 00:51:12,060 Ini adalah program baris perintah PHP. 1050 00:51:12,060 --> 00:51:16,690 Jadi kode C di sini, sementara yang benar di C, tidak benar untuk PHP. 1051 00:51:16,690 --> 00:51:17,940 Tapi kode yang benar-benar sama. 1052 00:51:17,940 --> 00:51:21,720 Jika Anda membandingkan solusi untuk Quiz 0 melawan Quiz 1, Anda akan menemukan bahwa 1053 00:51:21,720 --> 00:51:25,630 itu hampir sama, kecuali untuk beberapa tanda-tanda dolar dan untuk 1054 00:51:25,630 --> 00:51:27,250 tidak adanya tipe data. 1055 00:51:27,250 --> 00:51:31,720 Secara khusus, jika kita lihat di sini, Anda akan melihat bahwa kita iterate, dalam hal ini 1056 00:51:31,720 --> 00:51:33,730 kasus, dari 1 sampai sampai 7. 1057 00:51:33,730 --> 00:51:34,910 >> Kita bisa melakukannya 0 indeks. 1058 00:51:34,910 --> 00:51:37,320 Tapi kadang-kadang, saya pikir itu hanya mental lebih mudah untuk berpikir tentang hal-hal 1059 00:51:37,320 --> 00:51:38,200 dari 1 sampai 7. 1060 00:51:38,200 --> 00:51:40,300 Jika Anda ingin satu blok, kemudian dua blok, lalu tiga, lalu 1061 00:51:40,300 --> 00:51:41,770 dot, dot, dot tujuh. 1062 00:51:41,770 --> 00:51:45,960 Kami telah j diinisialisasi ke 1 dan kemudian mengandalkan hingga i. 1063 00:51:45,960 --> 00:51:48,150 Dan semuanya di sini dinyatakan identik. 1064 00:51:48,150 --> 00:51:49,790 Tapi patut dicatat adalah beberapa hal. 1065 00:51:49,790 --> 00:51:53,230 Kami memberikan dua baris, ini pertama satu, tolol disebut sebagai peristiwa yang 1066 00:51:53,230 --> 00:51:54,560 untuk tajam Bang. 1067 00:51:54,560 --> 00:51:58,770 Dan itu hanya menentukan jalan, yang folder, di mana sebuah program dapat 1068 00:51:58,770 --> 00:52:02,160 menemukan bahwa Anda ingin menggunakan untuk menafsirkan file ini. 1069 00:52:02,160 --> 00:52:04,710 >> Dan kemudian garis setelah itu, dari Tentu saja, berarti masuk ke mode PHP. 1070 00:52:04,710 --> 00:52:07,740 Dan garis di bagian paling bawah berarti modus exit PHP. 1071 00:52:07,740 --> 00:52:09,740 Dan ini bekerja, secara umum, dengan menafsirkan bahasa. 1072 00:52:09,740 --> 00:52:14,370 Ini semacam menjengkelkan jika Anda menulis Program dalam sebuah file bernama foo.php. 1073 00:52:14,370 --> 00:52:17,320 Dan kemudian pengguna harus hanya ingat, OK, untuk menjalankan program ini, saya 1074 00:52:17,320 --> 00:52:22,320 harus mengetik "ruang php foo.php." Jenis menjengkelkan jika tidak ada lagi. 1075 00:52:22,320 --> 00:52:25,270 Dan itu juga mengungkapkan bahwa program anda ditulis dalam PHP, yang tidak semua 1076 00:52:25,270 --> 00:52:27,060 yang menerangi bagi pengguna. 1077 00:52:27,060 --> 00:52:30,100 >> Jadi, Anda dapat menghapus php. Sama sekali ingat dari kuliah. 1078 00:52:30,100 --> 00:52:35,690 Dan Anda benar-benar bisa melakukannya. / Foo jika Anda telah chmodded itu dengan membuat 1079 00:52:35,690 --> 00:52:36,500 executable. 1080 00:52:36,500 --> 00:52:39,630 Jadi chmod a + x foo akan melakukan itu. 1081 00:52:39,630 --> 00:52:41,460 Dan jika Anda juga menambahkan peristiwa di sini. 1082 00:52:41,460 --> 00:52:45,320 Tapi sungguh, masalah mulai di mencetak sesuatu seperti ini. 1083 00:52:45,320 --> 00:52:51,100 Tidak ada HTML, tidak ada C-kode tentu, hanya beberapa PHP. 1084 00:52:51,100 --> 00:52:54,100 Jadi Milo kemudian dikembalikan dalam masalah 25. 1085 00:52:54,100 --> 00:52:58,050 Dan pada 25, Anda diberi berikut kode kerangka, yang merupakan 1086 00:52:58,050 --> 00:52:59,730 Halaman web cukup sederhana. 1087 00:52:59,730 --> 00:53:04,230 Dan bagian berair HTML-bijaksana turun di sini, di mana kita memiliki di dalam tubuh 1088 00:53:04,230 --> 00:53:09,160 bentuk yang memiliki ID unik input dalam yang dua input, satu 1089 00:53:09,160 --> 00:53:11,950 dengan ide nama, salah satu dengan ide tombol. 1090 00:53:11,950 --> 00:53:14,240 >> Yang pertama adalah jenis teks, kedua tipe kirimkan. 1091 00:53:14,240 --> 00:53:16,930 Dan jadi kami memberi Anda, sebenarnya, lebih bahan dari yang Anda butuhkan, hanya begitu 1092 00:53:16,930 --> 00:53:19,230 kalian punya pilihan dengan yang untuk memecahkan masalah ini. 1093 00:53:19,230 --> 00:53:21,130 Anda tidak benar-benar perlu semua ID ini. 1094 00:53:21,130 --> 00:53:23,580 Tetapi memungkinkan Anda untuk memecahkan dengan cara yang berbeda. 1095 00:53:23,580 --> 00:53:27,050 Dan di atas, perhatikan bahwa tujuannya adalah untuk memicu 1096 00:53:27,050 --> 00:53:27,960 jendela seperti ini - 1097 00:53:27,960 --> 00:53:28,780 Halo, Milo - 1098 00:53:28,780 --> 00:53:31,270 untuk pop up di browser menggunakan super sederhana, jika 1099 00:53:31,270 --> 00:53:33,190 tidak jelek, fungsi alert. 1100 00:53:33,190 --> 00:53:37,480 Jadi, pada akhirnya, ini bermuara konseptual entah bagaimana mendengarkan 1101 00:53:37,480 --> 00:53:41,290 pengiriman dari client-side bentuk , Bukan server-side, entah bagaimana 1102 00:53:41,290 --> 00:53:45,640 menanggapi pengajuan tersebut dengan meraih nilai bahwa pengguna mengetik 1103 00:53:45,640 --> 00:53:50,120 di ke kolom nama, dan kemudian menampilkannya dalam tubuh peringatan. 1104 00:53:50,120 --> 00:53:53,460 >> Jadi salah satu cara yang dapat Anda lakukan adalah dengan jQuery, yang terlihat sedikit 1105 00:53:53,460 --> 00:53:56,880 sintaksis membingungkan pada awalnya. 1106 00:53:56,880 --> 00:54:00,760 Anda dapat melakukan ini dengan kode DOM murni - document.getelement oleh ID. 1107 00:54:00,760 --> 00:54:02,530 Tapi mari kita lihat versi ini. 1108 00:54:02,530 --> 00:54:05,110 Saya memiliki beberapa penting baris pertama. 1109 00:54:05,110 --> 00:54:09,460 Jadi salah satu, kita memiliki baris ini, yang merupakan identik dengan apa yang Anda mungkin telah melihat 1110 00:54:09,460 --> 00:54:13,830 dalam, saya percaya, form2.html dari kelas di minggu 9. 1111 00:54:13,830 --> 00:54:16,960 Dan ini hanya mengatakan, jalankan kode berikut ketika 1112 00:54:16,960 --> 00:54:18,430 dokumen siap. 1113 00:54:18,430 --> 00:54:21,770 Hal ini menjadi penting hanya karena Halaman HTML dibaca atas ke 1114 00:54:21,770 --> 00:54:23,280 bawah, kiri ke kanan. 1115 00:54:23,280 --> 00:54:27,910 >> Dan karena itu, jika Anda mencoba untuk melakukan sesuatu dalam kode di sini beberapa DOM 1116 00:54:27,910 --> 00:54:31,560 elemen, beberapa tag HTML, itu turun di sini, Anda melakukannya terlalu cepat, 1117 00:54:31,560 --> 00:54:34,220 karena ini bahkan tidak memiliki telah dibaca ke dalam memori. 1118 00:54:34,220 --> 00:54:37,740 Jadi dengan mengatakan document.ready ini line, kami katakan, 1119 00:54:37,740 --> 00:54:39,040 inilah beberapa kode, peramban. 1120 00:54:39,040 --> 00:54:42,440 Tapi jangan mengeksekusi ini sampai keseluruhan dokumen sudah siap, yaitu DOM 1121 00:54:42,440 --> 00:54:44,320 pohon ada dalam memori. 1122 00:54:44,320 --> 00:54:47,110 Yang satu ini sedikit lebih sederhana, jika sebuah sintaksis 1123 00:54:47,110 --> 00:54:51,890 sedikit berbeda, di mana saya katakan, ambil elemen HTML yang unik 1124 00:54:51,890 --> 00:54:53,560 identifier adalah input. 1125 00:54:53,560 --> 00:54:56,220 Itulah yang tag hash menunjukkan, ID unik. 1126 00:54:56,220 --> 00:54:58,070 Dan kemudian aku menelepon. Kirimkan. 1127 00:54:58,070 --> 00:55:01,660 >> Jadi. Mengirimkannya disini adalah fungsi, jika tidak dikenal sebagai sebuah metode, yang 1128 00:55:01,660 --> 00:55:05,850 dalam obyek di kiri sisi ada yang saya tidak menyorot. 1129 00:55:05,850 --> 00:55:08,990 Jadi jika Anda berpikir input sebagai obyek dalam memori - dan memang itu. 1130 00:55:08,990 --> 00:55:10,440 Ini adalah simpul di pohon - 1131 00:55:10,440 --> 00:55:16,580 . Menyerahkan berarti ketika formulir ini dengan ID ini disampaikan, jalankan 1132 00:55:16,580 --> 00:55:17,700 kode berikut. 1133 00:55:17,700 --> 00:55:20,290 Saya tidak peduli apa nama Fungsi adalah aku mengeksekusi. 1134 00:55:20,290 --> 00:55:23,760 Jadi di sini saya menggunakan, seperti sebelumnya, apa disebut fungsi lambda atau 1135 00:55:23,760 --> 00:55:24,720 fungsi anonim. 1136 00:55:24,720 --> 00:55:27,640 Ini sama sekali tidak intelektual menarik selain tidak memiliki nama, 1137 00:55:27,640 --> 00:55:30,220 yang baik-baik saja jika Anda hanya pernah akan menyebutnya sekali. 1138 00:55:30,220 --> 00:55:34,490 Dan di dalam sana saya benar-benar menangani penyerahan formulir. 1139 00:55:34,490 --> 00:55:36,810 Saya pertama kali mendeklarasikan variabel disebut nilai. 1140 00:55:36,810 --> 00:55:40,610 Dan kemudian apa efek ini disorot porsi di sini sekarang? 1141 00:55:40,610 --> 00:55:44,755 Apa yang melakukan pada tingkat tinggi untuk saya? 1142 00:55:44,755 --> 00:55:48,539 >> AUDIENCE: Ia mendapat nilai yang pengguna tidak dalam HTML di bawah ini. 1143 00:55:48,539 --> 00:55:50,920 Ia mendapat ID itu dan kemudian menemukan nilai itu. 1144 00:55:50,920 --> 00:55:51,590 >> DAVID J. Malan: Tepat. 1145 00:55:51,590 --> 00:55:54,300 Ini meraih node, yang unik identifier adalah nama. 1146 00:55:54,300 --> 00:55:56,900 Ia mendapat nilai di dalamnya, yang adalah, mungkin, apa yang user 1147 00:55:56,900 --> 00:55:58,190 diketik dirinya sendiri. 1148 00:55:58,190 --> 00:56:01,020 Dan kemudian menyimpan bahwa dalam variabel yang disebut nilai. 1149 00:56:01,020 --> 00:56:03,720 Sebagai samping, Anda bisa memiliki juga melakukan ini sedikit berbeda. 1150 00:56:03,720 --> 00:56:09,250 Benar-benar dapat diterima dengan melakukan sesuatu Nilai kebohongan var mendapat 1151 00:56:09,250 --> 00:56:10,500 document.getElementById. 1152 00:56:10,500 --> 00:56:12,860 1153 00:56:12,860 --> 00:56:15,460 Dan inilah mengapa itu sedikit membosankan untuk tidak menggunakan jQuery. 1154 00:56:15,460 --> 00:56:16,710 "Nama" value.. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Jadi benar-benar diterima. 1157 00:56:19,620 --> 00:56:22,770 Berbagai cara untuk melakukan hal ini. jQuery hanya cenderung menjadi sedikit lebih ringkas dan 1158 00:56:22,770 --> 00:56:25,230 pasti lebih populer antara programmer. 1159 00:56:25,230 --> 00:56:27,590 >> Sekarang, aku melakukan sedikit kewarasan cek, karena dalam masalah 1160 00:56:27,590 --> 00:56:30,820 Pernyataan kita secara eksplisit mengatakan, jika pengguna belum mengetik nya 1161 00:56:30,820 --> 00:56:32,580 nama, tidak menunjukkan tanda. 1162 00:56:32,580 --> 00:56:35,390 Tapi Anda dapat memeriksa untuk itu, dengan hanya memeriksa string kosong untuk 1163 00:56:35,390 --> 00:56:37,850 kutipan-tanda kutip jika ada tidak benar-benar ada. 1164 00:56:37,850 --> 00:56:40,880 Tapi kalau itu tidak sama dengan kutipan-tanda kutip, Saya ingin menelepon alert. 1165 00:56:40,880 --> 00:56:45,610 Dan bagian yang menarik di sini adalah bahwa kita sedang menggunakan operator plus, yang 1166 00:56:45,610 --> 00:56:48,130 melakukan apa di JavaScript? 1167 00:56:48,130 --> 00:56:48,740 Menggabungkan. 1168 00:56:48,740 --> 00:56:50,690 Jadi seperti PHPs dot operator. 1169 00:56:50,690 --> 00:56:52,820 Ide yang sama, sintaks yang sedikit berbeda. 1170 00:56:52,820 --> 00:56:55,280 Dan aku hanya membuat string yang Anda lihat di screen shot - 1171 00:56:55,280 --> 00:56:57,750 Halo, begitu dan begitu. 1172 00:56:57,750 --> 00:56:59,200 >> Dan kemudian detail terakhir adalah ini. 1173 00:56:59,200 --> 00:57:04,970 Mengapa saya kembali dalam palsu fungsi anonim ini? 1174 00:57:04,970 --> 00:57:07,420 >> AUDIENCE: Tidak ada nilai. 1175 00:57:07,420 --> 00:57:09,380 Anda memasukkannya ke dalam form. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 Ini hanya mengatakan, jika nilai tidak sama dengan kosong, maka lakukanlah. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Ada kosong dalam pengajuan itu. 1180 00:57:20,940 --> 00:57:21,170 >> DAVID J. Malan: OK. 1181 00:57:21,170 --> 00:57:21,640 Hati-hati sekalipun. 1182 00:57:21,640 --> 00:57:22,830 Tidak ada orang lain di sini. 1183 00:57:22,830 --> 00:57:25,510 Dan bahwa return false luar dari jika kondisi. 1184 00:57:25,510 --> 00:57:29,470 Jadi ini menyoroti jalur, kembali palsu, mengeksekusi apa pun ketika 1185 00:57:29,470 --> 00:57:32,310 formulir tersebut diajukan. 1186 00:57:32,310 --> 00:57:36,810 Apa kembali dalam palsu ini event handler, seperti disebut, 1187 00:57:36,810 --> 00:57:38,450 acara tersebut menjadi penyerahan? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> AUDIENCE: Karena hanya terjadi sekali. 1190 00:57:44,470 --> 00:57:45,320 >> DAVID J. Malan: Hanya terjadi sekali. 1191 00:57:45,320 --> 00:57:46,821 Tidak cukup. 1192 00:57:46,821 --> 00:57:47,292 Ya? 1193 00:57:47,292 --> 00:57:50,589 >> AUDIENCE: Ini mencegah bentuk dari mengirimkan ke perilaku default, 1194 00:57:50,589 --> 00:57:52,480 yang akan membuat halaman reload. 1195 00:57:52,480 --> 00:57:53,110 >> DAVID J. Malan: Tepat. 1196 00:57:53,110 --> 00:57:56,490 Jadi aku overloading istilah mengirimkannya disini, karena saya katakan, bentuknya adalah 1197 00:57:56,490 --> 00:57:57,670 yang diajukan. 1198 00:57:57,670 --> 00:58:02,240 Tapi seperti yang Anda sarankan, itu sebenarnya tidak telah disampaikan dengan cara yang benar HTTP. 1199 00:58:02,240 --> 00:58:06,870 Ketika Anda klik Submit, karena kami handler onSubmit, kami mencegat 1200 00:58:06,870 --> 00:58:09,040 bahwa pengiriman formulir sehingga untuk berbicara. 1201 00:58:09,040 --> 00:58:11,290 Kami kemudian melakukan hal yang kita dengan kode JavaScript. 1202 00:58:11,290 --> 00:58:14,070 Tapi aku sengaja kembali palsu, karena apa yang saya tidak ingin terjadi suatu 1203 00:58:14,070 --> 00:58:18,430 Sepersekian detik kemudian adalah untuk bentuk keseluruhan sendiri untuk diserahkan ke web 1204 00:58:18,430 --> 00:58:22,800 Server dengan pasangan nilai kunci dengan mengubah URL menjadi sesuatu seperti 1205 00:58:22,800 --> 00:58:26,180 q = kucing atau apa pun yang kita lakukan, misalnya, di kelas. 1206 00:58:26,180 --> 00:58:29,640 Saya tidak ingin hal itu terjadi, karena tidak ada server yang mendengarkan untuk ini 1207 00:58:29,640 --> 00:58:30,690 membentuk pengajuan. 1208 00:58:30,690 --> 00:58:32,320 Ini murni dilakukan dalam kode JavaScript. 1209 00:58:32,320 --> 00:58:35,760 Dan itulah mengapa saya bahkan tidak memiliki tindakan atribut pada formulir saya, karena saya 1210 00:58:35,760 --> 00:58:38,870 tidak berniat untuk ini pernah pergi ke server. 1211 00:58:38,870 --> 00:58:40,780 >> Jadi itu sedang diajukan. 1212 00:58:40,780 --> 00:58:44,340 Tapi kami mencegat bentuk yang pengajuan dan mencegah default 1213 00:58:44,340 --> 00:58:47,477 perilaku, yang sebenarnya adalah untuk pergi semua jalan ke server. 1214 00:58:47,477 --> 00:58:48,730 >> AUDIENCE: Jadi menjaga sisi klien. 1215 00:58:48,730 --> 00:58:49,780 >> DAVID J. Malan: Menjaga itu client-side. 1216 00:58:49,780 --> 00:58:51,030 Tepat. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 Berikutnya adalah saya oh MySQL. 1219 00:58:55,757 --> 00:59:00,000 1220 00:59:00,000 --> 00:59:00,430 >> ROB Bowden: OK. 1221 00:59:00,430 --> 00:59:04,990 Jadi pertanyaan pertama ini umumnya kasar bagi orang-orang. 1222 00:59:04,990 --> 00:59:07,270 Meskipun yang kemudian pergi lebih baik. 1223 00:59:07,270 --> 00:59:12,260 Jadi Anda harus memilih data yang benar jenis untuk kedua kolom ini. 1224 00:59:12,260 --> 00:59:17,750 Dan kedua hal ini memiliki beberapa hal-hal tentang mereka yang 1225 00:59:17,750 --> 00:59:20,620 membuat pilihan sulit. 1226 00:59:20,620 --> 00:59:24,430 Jadi int tidak valid ketik nomor. 1227 00:59:24,430 --> 00:59:29,410 Alasannya karena rekening 12 digit jumlah, int tidak cukup besar untuk 1228 00:59:29,410 --> 00:59:31,070 menyimpan jumlah digit. 1229 00:59:31,070 --> 00:59:36,570 Jadi pilihan yang valid akan menjadi besar int jika Anda kebetulan tahu itu. 1230 00:59:36,570 --> 00:59:42,090 Pilihan lain bisa saja bidang char panjang 12. 1231 00:59:42,090 --> 00:59:44,560 Jadi salah satu dari mereka akan bekerja. 1232 00:59:44,560 --> 00:59:46,100 Int tidak. 1233 00:59:46,100 --> 00:59:50,170 >> Sekarang, keseimbangan, pikirkan kembali pset7. 1234 00:59:50,170 --> 00:59:59,540 Jadi kami secara khusus digunakan untuk desimal menyimpan nilai saham atau - 1235 00:59:59,540 --> 01:00:00,550 >> DAVID J. Malan: Cash. 1236 01:00:00,550 --> 01:00:01,060 >> ROB Bowden: Cash. 1237 01:00:01,060 --> 01:00:05,710 Kami menggunakan desimal untuk menyimpan jumlah kas bahwa pengguna saat ini memiliki. 1238 01:00:05,710 --> 01:00:10,950 Jadi alasan kita melakukan itu adalah karena, ingat, mengapung. 1239 01:00:10,950 --> 01:00:12,480 Ada floating point dalam presisi. 1240 01:00:12,480 --> 01:00:18,200 Hal ini tidak bisa tepat menyimpan uang tunai nilai-nilai seperti yang kita inginkan di sini. 1241 01:00:18,200 --> 01:00:23,630 Jadi desimal mampu tepatnya toko sesuatu untuk, katakanlah, dua tempat desimal. 1242 01:00:23,630 --> 01:00:27,630 Itu sebabnya keseimbangan, kita inginkan menjadi desimal dan tidak mengambang. 1243 01:00:27,630 --> 01:00:30,230 >> DAVID J. Malan: Dan juga, juga, meskipun mungkin telah pintar dalam lainnya 1244 01:00:30,230 --> 01:00:32,760 konteks untuk berpikir, mungkin ini adalah kesempatan untuk int. 1245 01:00:32,760 --> 01:00:34,420 Aku hanya akan melacak hal dalam uang. 1246 01:00:34,420 --> 01:00:38,670 Karena kita secara eksplisit menunjukkan default nilai menjadi 100,00, yang 1247 01:00:38,670 --> 01:00:40,380 berarti itu hanya bisa menjadi int. 1248 01:00:40,380 --> 01:00:45,310 Dan kehalusan lain juga dengan nomor adalah bahwa hal itu tidak dimaksudkan 1249 01:00:45,310 --> 01:00:46,180 menjadi pertanyaan jebakan. 1250 01:00:46,180 --> 01:00:49,860 Tapi ingat bahwa int di MySQL, seperti di C, setidaknya dalam 1251 01:00:49,860 --> 01:00:51,440 alat, adalah 32-bit. 1252 01:00:51,440 --> 01:00:53,960 Dan meskipun kami tidak mengharapkan Anda untuk tahu persis berapa banyak digit yang 1253 01:00:53,960 --> 01:00:56,910 berarti, ingat bahwa jumlah terbesar Anda dapat mewakili berpotensi 1254 01:00:56,910 --> 01:01:00,710 dengan nomor 32-bit kira-kira apa? 1255 01:01:00,710 --> 01:01:02,760 >> Nomor berapa yang kita selalu katakan? 1256 01:01:02,760 --> 01:01:04,530 2 ke 32, yang adalah apa kira-kira? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 Anda tidak perlu tahu persis. 1259 01:01:08,780 --> 01:01:10,580 Tapi kira-kira sangat membantu dalam kehidupan. 1260 01:01:10,580 --> 01:01:12,200 Ini kira-kira 4 miliar. 1261 01:01:12,200 --> 01:01:14,430 Jadi kami mengatakan bahwa beberapa kali. 1262 01:01:14,430 --> 01:01:16,360 Aku tahu aku telah mengatakan bahwa beberapa kali. 1263 01:01:16,360 --> 01:01:17,670 Dan itu adalah sekitar 4 miliar. 1264 01:01:17,670 --> 01:01:19,710 Dan itu adalah aturan yang baik praktis untuk mengetahui. 1265 01:01:19,710 --> 01:01:21,880 Jika Anda memiliki 8 bit, 256 adalah angka ajaib. 1266 01:01:21,880 --> 01:01:24,160 Jika Anda memiliki 32 bit, 4 miliar memberi atau mengambil. 1267 01:01:24,160 --> 01:01:27,140 Jadi jika Anda hanya menuliskan 4 miliar, Anda akan melihat bahwa itu lebih sedikit dibandingkan angka 1268 01:01:27,140 --> 01:01:30,970 12, yang berarti itu jelas tidak cukup ekspresif untuk menangkap 1269 01:01:30,970 --> 01:01:34,220 Nomor rekening 12 digit. 1270 01:01:34,220 --> 01:01:34,940 >> ROB Bowden: OK. 1271 01:01:34,940 --> 01:01:38,520 Jadi yang lain pergi lebih baik. 1272 01:01:38,520 --> 01:01:40,900 Jadi misalkan bahwa bank membebankan $ 20 per bulan 1273 01:01:40,900 --> 01:01:42,400 Biaya pemeliharaan pada semua account. 1274 01:01:42,400 --> 01:01:45,506 Dengan apa SQL query bisa bank memotong $ 20 dari setiap hitungan, bahkan jika 1275 01:01:45,506 --> 01:01:47,520 itu menghasilkan beberapa saldo negatif? 1276 01:01:47,520 --> 01:01:50,380 Jadi pada dasarnya, ada empat jenis utama dari pertanyaan - 1277 01:01:50,380 --> 01:01:52,840 menyisipkan, pilih, update, dan menghapus. 1278 01:01:52,840 --> 01:01:56,080 Jadi apa yang kita pikir kita akan menggunakan di sini? 1279 01:01:56,080 --> 01:01:57,000 Perbarui. 1280 01:01:57,000 --> 01:01:58,260 >> Jadi mari kita lihat. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Jadi di sini kita update. 1283 01:02:05,870 --> 01:02:09,900 Apa tabel kita memperbarui account? 1284 01:02:09,900 --> 01:02:11,670 Jadi memperbarui account. 1285 01:02:11,670 --> 01:02:15,390 Dan kemudian sintaks mengatakan, apa yang dalam rekening kita memperbarui? 1286 01:02:15,390 --> 01:02:19,520 Nah, kita sedang menyiapkan keseimbangan sama dengan nilai saat ini keseimbangan minus 20. 1287 01:02:19,520 --> 01:02:22,860 Jadi ini akan memperbarui semua baris account, mengurangkan 1288 01:02:22,860 --> 01:02:26,250 $ 20 dari keseimbangan. 1289 01:02:26,250 --> 01:02:29,260 >> DAVID J. Malan: Sebuah kesalahan umum di sini, meskipun kadang-kadang kita memaafkan itu, 1290 01:02:29,260 --> 01:02:32,990 adalah untuk benar-benar memiliki kode PHP di sini memanggil fungsi permintaan atau menempatkan 1291 01:02:32,990 --> 01:02:35,460 tanda kutip segala sesuatu yang tidak perlu berada di sana. 1292 01:02:35,460 --> 01:02:39,780 >> ROB Bowden: Ingat bahwa MySQL adalah bahasa terpisah dari PHP. 1293 01:02:39,780 --> 01:02:42,410 Kami kebetulan menulis MySQL di PHP. 1294 01:02:42,410 --> 01:02:46,180 Dan PHP kemudian mengirimkannya ke server MySQL. 1295 01:02:46,180 --> 01:02:51,120 Tapi Anda tidak perlu PHP untuk berkomunikasi dengan server MySQL. 1296 01:02:51,120 --> 01:02:51,730 >> DAVID J. Malan: Tepat. 1297 01:02:51,730 --> 01:02:54,240 Jadi tidak ada variabel dengan tanda dolar harus dalam konteks ini. 1298 01:02:54,240 --> 01:02:59,550 Itu hanya dapat melakukan semua matematika dalam database itu sendiri. 1299 01:02:59,550 --> 01:03:00,080 >> ROB Bowden: OK. 1300 01:03:00,080 --> 01:03:01,300 Jadi yang berikutnya. 1301 01:03:01,300 --> 01:03:02,731 Apakah ini yang berikutnya? 1302 01:03:02,731 --> 01:03:03,210 Ya. 1303 01:03:03,210 --> 01:03:06,570 Jadi dengan apa SQL query bisa bank mengambil nomor rekening nya 1304 01:03:06,570 --> 01:03:09,300 pelanggan terkaya, orang-orang dengan saldo lebih dari 1.000? 1305 01:03:09,300 --> 01:03:13,280 Jadi yang dari empat jenis utama kita akan inginkan di sini? 1306 01:03:13,280 --> 01:03:14,430 Pilih. 1307 01:03:14,430 --> 01:03:16,650 Jadi kita ingin memilih. 1308 01:03:16,650 --> 01:03:17,610 Apa yang kita ingin memilih? 1309 01:03:17,610 --> 01:03:19,380 Apa kolom yang ingin kita pilih? 1310 01:03:19,380 --> 01:03:20,970 Kami akan secara khusus ingin untuk memilih nomor. 1311 01:03:20,970 --> 01:03:23,910 Tetapi jika Anda berkata star, kita juga menerima. 1312 01:03:23,910 --> 01:03:25,820 >> Jadi memilih nomor dari apa meja? 1313 01:03:25,820 --> 01:03:26,640 Account. 1314 01:03:26,640 --> 01:03:28,370 Dan kemudian kondisi yang kita inginkan? 1315 01:03:28,370 --> 01:03:30,140 Dimana keseimbangan yang lebih besar dari 1.000. 1316 01:03:30,140 --> 01:03:31,720 Kami juga diterima lebih besar dari atau sama. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Yang terakhir. 1319 01:03:36,190 --> 01:03:42,940 Dengan apa SQL query bisa bank dekat, yaitu, menghapus setiap account yang 1320 01:03:42,940 --> 01:03:44,480 memiliki saldo $ 0? 1321 01:03:44,480 --> 01:03:47,620 Jadi yang dari empat kita akan ingin untuk digunakan? 1322 01:03:47,620 --> 01:03:48,320 Hapus. 1323 01:03:48,320 --> 01:03:50,180 Jadi sintaks untuk itu? 1324 01:03:50,180 --> 01:03:51,890 Hapus dari apa meja? 1325 01:03:51,890 --> 01:03:53,550 Account. 1326 01:03:53,550 --> 01:03:55,790 Dan kemudian kondisi yang kita ingin menghapus - 1327 01:03:55,790 --> 01:03:57,280 di mana keseimbangan sama dengan nol. 1328 01:03:57,280 --> 01:04:03,050 Jadi menghapus semua baris dari rekening di mana keseimbangan adalah nol. 1329 01:04:03,050 --> 01:04:04,300 Pertanyaan pada salah satu? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 Ingin antrian? 1332 01:04:10,260 --> 01:04:11,200 >> DAVID J. Malan: panduan Queue. 1333 01:04:11,200 --> 01:04:17,110 Jadi dalam satu ini, kami memberikan Anda agak Struktur akrab yang kami menjelajahi 1334 01:04:17,110 --> 01:04:20,450 bit di kelas bersama structs, yang data 1335 01:04:20,450 --> 01:04:21,910 struktur terkait dalam roh. 1336 01:04:21,910 --> 01:04:24,670 Perbedaan meskipun dengan antrian adalah bahwa kita harus entah bagaimana mengingat siapa 1337 01:04:24,670 --> 01:04:27,900 berada di depan antrian, dalam jumlah besar bagian sehingga kita bisa membuat lebih 1338 01:04:27,900 --> 01:04:30,530 efisiensi penggunaan memori, setidaknya jika kita menggunakan array. 1339 01:04:30,530 --> 01:04:35,460 >> Karena ingat, jika kita memiliki sebuah array, jika, misalnya, ini adalah bagian depan 1340 01:04:35,460 --> 01:04:38,470 antrian, jika saya masuk ke antrian di sini, dan kemudian seseorang akan sejalan 1341 01:04:38,470 --> 01:04:42,710 di belakang saya, di belakang saya, di belakang saya, dan satu orang melangkah keluar dari garis, Anda 1342 01:04:42,710 --> 01:04:45,930 bisa, seperti yang kita lihat beberapa manusia relawan di kelas, memiliki semua orang 1343 01:04:45,930 --> 01:04:47,100 pergeseran cara ini. 1344 01:04:47,100 --> 01:04:50,880 Tapi secara umum, setelah semua orang melakukannya sesuatu yang tidak penggunaan terbaik dari waktu 1345 01:04:50,880 --> 01:04:54,600 dalam sebuah program, karena itu berarti Anda algoritma berjalan dalam apa 1346 01:04:54,600 --> 01:04:56,520 waktu berjalan asimtotik? 1347 01:04:56,520 --> 01:04:57,420 Ini linear. 1348 01:04:57,420 --> 01:04:59,600 >> Dan aku merasa seperti itu agak bodoh. 1349 01:04:59,600 --> 01:05:02,890 Jika orang berikutnya sejalan adalah berikutnya orang yang seharusnya masuk ke 1350 01:05:02,890 --> 01:05:04,660 toko, mereka tidak semua memiliki untuk bergerak bersama-sama. 1351 01:05:04,660 --> 01:05:08,200 Biarkan orang itu dicabut off ketika saatnya tiba, misalnya. 1352 01:05:08,200 --> 01:05:09,870 Jadi kita bisa menghemat sedikit waktu di sana. 1353 01:05:09,870 --> 01:05:14,840 Dan untuk melakukan itu meskipun, berarti bahwa bahwa kepala antrian atau 1354 01:05:14,840 --> 01:05:18,060 depan antrian akan semakin bergerak lebih dalam dan lebih 1355 01:05:18,060 --> 01:05:23,340 ke dalam array dan akhirnya mungkin benar-benar membungkus jika kita menggunakan 1356 01:05:23,340 --> 01:05:25,790 array untuk menyimpan orang-orang dalam antrian ini. 1357 01:05:25,790 --> 01:05:28,390 Jadi Anda hampir dapat memikirkan array sebagai data melingkar 1358 01:05:28,390 --> 01:05:29,880 struktur dalam arti itu. 1359 01:05:29,880 --> 01:05:33,970 >> Jadi Anda entah bagaimana harus melacak ukuran itu atau benar-benar akhir itu 1360 01:05:33,970 --> 01:05:36,250 dan kemudian di mana awal itu. 1361 01:05:36,250 --> 01:05:39,490 Jadi kami mengusulkan bahwa Anda mendeklarasikan satu antrian tersebut, panggilan 1362 01:05:39,490 --> 01:05:41,330 q itu, hanya satu huruf. 1363 01:05:41,330 --> 01:05:44,570 Kemudian kami mengusulkan bahwa depan menjadi diinisialisasi ke nol dan bahwa ukuran 1364 01:05:44,570 --> 01:05:45,470 diinisialisasi ke nol. 1365 01:05:45,470 --> 01:05:47,770 >> Jadi sekarang, tidak ada dalam antrian itu. 1366 01:05:47,770 --> 01:05:50,910 Dan kami meminta Anda untuk menyelesaikan pelaksanaan enqueue di bawah ini dalam 1367 01:05:50,910 --> 01:05:55,250 sedemikian rupa sehingga fungsi menambahkan n untuk akhir q dan kemudian kembali benar. 1368 01:05:55,250 --> 01:05:58,690 Tetapi jika q penuh atau negatif, Fungsi malah harus kembali palsu. 1369 01:05:58,690 --> 01:06:01,060 Dan kami memberikan Anda beberapa asumsi. 1370 01:06:01,060 --> 01:06:04,320 Tapi mereka tidak benar-benar fungsional relevan, hanya bool yang ada, 1371 01:06:04,320 --> 01:06:06,690 karena, secara teknis, bool tidak ada di C kecuali jika Anda menyertakan 1372 01:06:06,690 --> 01:06:07,310 file header tertentu. 1373 01:06:07,310 --> 01:06:09,350 Sehingga hanya pastikan ada yang ada apakah ini trik 1374 01:06:09,350 --> 01:06:10,940 pertanyaan semacam itu. 1375 01:06:10,940 --> 01:06:16,280 >> Jadi enqueue, kami mengusulkan dalam sampel solusi untuk mengimplementasikan sebagai berikut. 1376 01:06:16,280 --> 01:06:20,420 Satu, kita periksa dulu kemudahan, buah tergantung rendah. 1377 01:06:20,420 --> 01:06:23,820 Jika antrian penuh atau nomor yang Anda mencoba untuk memasukkan kurang 1378 01:06:23,820 --> 01:06:26,380 dari nol, yang kami katakan dalam spesifikasi masalah harus 1379 01:06:26,380 --> 01:06:30,320 tidak diperbolehkan, karena kami hanya ingin nilai-nilai non-negatif, maka Anda harus 1380 01:06:30,320 --> 01:06:31,640 hanya return false segera. 1381 01:06:31,640 --> 01:06:33,820 Jadi beberapa relatif mudah kesalahan memeriksa. 1382 01:06:33,820 --> 01:06:38,720 Jika meskipun Anda ingin menambahkan bahwa sebenarnya nomor, Anda harus melakukan sedikit 1383 01:06:38,720 --> 01:06:39,440 berpikir di sini. 1384 01:06:39,440 --> 01:06:41,330 Dan ini adalah di mana itu sedikit mengganggu mental, karena Anda harus 1385 01:06:41,330 --> 01:06:43,000 mencari cara untuk menangani sampul. 1386 01:06:43,000 --> 01:06:46,870 >> Tapi kuman gagasan di sini itu dari menarik bagi kami adalah sampul yang 1387 01:06:46,870 --> 01:06:51,480 sering menyiratkan aritmatika modular dan operator mod, sisi persen, 1388 01:06:51,480 --> 01:06:55,140 di mana Anda dapat pergi dari nilai yang lebih besar kembali ke nol dan kemudian satu dan dua dan 1389 01:06:55,140 --> 01:06:58,650 tiga dan kemudian kembali sekitar ke nol, satu dan dua dan tiga dan sebagainya 1390 01:06:58,650 --> 01:06:59,380 lagi dan lagi. 1391 01:06:59,380 --> 01:07:02,880 Jadi cara kita mengusulkan melakukan hal ini adalah bahwa kita ingin indeks ke dalam 1392 01:07:02,880 --> 01:07:05,850 array disebut nomor mana bilangan bulat kita berbohong. 1393 01:07:05,850 --> 01:07:10,740 Tapi untuk sampai ke sana, pertama kita ingin lakukan apapun ukuran antrian tapi 1394 01:07:10,740 --> 01:07:14,080 kemudian menambahkan bahwa apapun depan daftar adalah. 1395 01:07:14,080 --> 01:07:17,880 Dan efek dari itu adalah untuk menempatkan kita di posisi yang tepat dalam antrian dan 1396 01:07:17,880 --> 01:07:20,970 tidak berasumsi bahwa orang pertama di baris adalah di awal, yang ia atau 1397 01:07:20,970 --> 01:07:24,130 dia benar-benar bisa jika kita juga menggeser semua orang. 1398 01:07:24,130 --> 01:07:26,710 Tapi kami hanya menciptakan pekerjaan untuk diri kita sendiri jika kita mengambil 1399 01:07:26,710 --> 01:07:27,800 bahwa jalan tertentu. 1400 01:07:27,800 --> 01:07:29,330 >> Jadi kita bisa tetap relatif sederhana. 1401 01:07:29,330 --> 01:07:32,180 Kami harus ingat bahwa kita hanya menambahkan int ke antrian. 1402 01:07:32,180 --> 01:07:35,850 Dan kemudian kita hanya kembali benar. 1403 01:07:35,850 --> 01:07:38,560 Sementara itu, dalam dequeue, kami bertanya Anda melakukan hal berikut. 1404 01:07:38,560 --> 01:07:42,260 Menerapkannya sedemikian rupa sehingga dequeues, yaitu menghapus dan kembali, 1405 01:07:42,260 --> 01:07:44,190 int di bagian depan antrian. 1406 01:07:44,190 --> 01:07:46,410 Untuk menghapus int, itu sudah cukup melupakannya. 1407 01:07:46,410 --> 01:07:47,650 Anda tidak perlu untuk menimpa bit nya. 1408 01:07:47,650 --> 01:07:48,820 Jadi itu masih benar-benar ada. 1409 01:07:48,820 --> 01:07:51,930 Sama seperti data pada hard drive, kami hanya mengabaikan fakta 1410 01:07:51,930 --> 01:07:52,970 bahwa itu sekarang ada. 1411 01:07:52,970 --> 01:07:55,520 Dan jika q kosong, kita harus bukannya kembali negatif 1. 1412 01:07:55,520 --> 01:07:56,750 Jadi ini terasa sewenang-wenang. 1413 01:07:56,750 --> 01:08:01,640 Mengapa kembali negatif 1 bukannya palsu? 1414 01:08:01,640 --> 01:08:02,620 Ya. 1415 01:08:02,620 --> 01:08:05,070 >> AUDIENCE: Q adalah menyimpan nilai-nilai positif. 1416 01:08:05,070 --> 01:08:10,950 Karena Anda hanya menyimpan nilai-nilai positif di q, negatif adalah kesalahan. 1417 01:08:10,950 --> 01:08:11,510 >> DAVID J. Malan: OK, benar. 1418 01:08:11,510 --> 01:08:14,850 Jadi karena kita hanya menyimpan positif nilai-nilai atau nol, maka tidak apa-apa untuk 1419 01:08:14,850 --> 01:08:18,050 mengembalikan nilai negatif sebagai sentinel a nilai, simbol khusus. 1420 01:08:18,050 --> 01:08:21,630 Tapi kau menulis ulang sejarah di sana, karena alasan kita hanya 1421 01:08:21,630 --> 01:08:25,890 kembali nilai-nilai non-negatif karena kita ingin 1422 01:08:25,890 --> 01:08:27,670 memiliki nilai sentinel. 1423 01:08:27,670 --> 01:08:32,617 Jadi lebih khusus, mengapa tidak hanya return false dalam kasus kesalahan? 1424 01:08:32,617 --> 01:08:33,099 Ya. 1425 01:08:33,099 --> 01:08:35,510 >> AUDIENCE: Anda telah gagal untuk kembali integer. 1426 01:08:35,510 --> 01:08:36,630 >> DAVID J. Malan: Tepat. 1427 01:08:36,630 --> 01:08:38,569 Dan ini adalah di mana C mendapat cukup menghambat. 1428 01:08:38,569 --> 01:08:40,590 Jika Anda mengatakan Anda akan untuk mengembalikan int, Anda punya 1429 01:08:40,590 --> 01:08:41,279 untuk mengembalikan int. 1430 01:08:41,279 --> 01:08:43,689 Anda tidak bisa mendapatkan mewah dan mulai kembali bool atau float atau 1431 01:08:43,689 --> 01:08:45,040 string atau sesuatu seperti itu. 1432 01:08:45,040 --> 01:08:49,370 Sekarang, sementara itu, JavaScript dan PHP dan beberapa bahasa lain bisa, pada kenyataannya, 1433 01:08:49,370 --> 01:08:51,310 Anda telah kembali berbeda jenis nilai. 1434 01:08:51,310 --> 01:08:54,819 Dan yang benar-benar dapat berguna, di mana Anda bisa kembali ints positif, nol, 1435 01:08:54,819 --> 01:08:59,439 ints negatif, atau salah atau null bahkan untuk menandakan kesalahan. 1436 01:08:59,439 --> 01:09:01,890 Tapi kita tidak memiliki fleksibilitas dalam C. 1437 01:09:01,890 --> 01:09:04,569 >> Jadi dengan dequeue, apa yang kita mengusulkan untuk lakukan adalah - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB Bowden: Anda dapat kembali palsu. 1440 01:09:09,830 --> 01:09:13,189 Hanya saja yang palsu adalah hash mendefinisikan palsu ke nol. 1441 01:09:13,189 --> 01:09:16,000 Jadi jika Anda kembali palsu, Anda kembali nol. 1442 01:09:16,000 --> 01:09:25,470 Dan nol adalah hal yang sah dalam antrian kami, sedangkan negatif 1 tidak jika 1443 01:09:25,470 --> 01:09:27,000 palsu kebetulan negatif 1. 1444 01:09:27,000 --> 01:09:29,972 Tapi Anda tidak harus bahkan perlu tahu itu. 1445 01:09:29,972 --> 01:09:32,399 >> DAVID J. Malan: Itu mengapa aku tidak mengatakannya. 1446 01:09:32,399 --> 01:09:36,450 >> ROB Bowden: Tapi itu tidak benar bahwa Anda tidak dapat kembali palsu. 1447 01:09:36,450 --> 01:09:37,700 >> DAVID J. Malan: Tentu. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 Jadi dequeue, perhatikan kita menerima membatalkan sebagai argumen. 1450 01:09:44,240 --> 01:09:45,479 Dan itu karena kita tidak melewati sesuatu masuk 1451 01:09:45,479 --> 01:09:48,359 Kami hanya ingin menghapus elemen di bagian depan antrian. 1452 01:09:48,359 --> 01:09:49,819 Jadi bagaimana mungkin kita pergi untuk melakukan ini? 1453 01:09:49,819 --> 01:09:51,290 Yah, pertama, mari kita lakukan ini cek kewarasan cepat. 1454 01:09:51,290 --> 01:09:53,350 Jika ukuran antrian adalah 0, ada tidak ada pekerjaan yang harus dilakukan. 1455 01:09:53,350 --> 01:09:54,210 Kembali negatif 1. 1456 01:09:54,210 --> 01:09:54,800 Selesai. 1457 01:09:54,800 --> 01:09:56,340 Jadi itulah beberapa baris program saya. 1458 01:09:56,340 --> 01:09:58,180 Jadi hanya empat baris tetap. 1459 01:09:58,180 --> 01:10:01,310 >> Jadi di sini saya memutuskan untuk pengurangan ukuran. 1460 01:10:01,310 --> 01:10:04,620 Dan decrementing ukuran efektif berarti bahwa aku lupa 1461 01:10:04,620 --> 01:10:06,010 sesuatu di sana. 1462 01:10:06,010 --> 01:10:09,910 Tapi saya juga harus memperbarui mana depan nomor tersebut. 1463 01:10:09,910 --> 01:10:11,620 Jadi untuk melakukan itu, saya perlu untuk melakukan dua hal. 1464 01:10:11,620 --> 01:10:16,390 Saya pertama kali perlu mengingat apa nomor berada di depan antrian, 1465 01:10:16,390 --> 01:10:17,860 karena saya perlu kembali hal itu. 1466 01:10:17,860 --> 01:10:20,910 Jadi saya tidak ingin sengaja lupa tentang hal itu dan kemudian menimpa itu. 1467 01:10:20,910 --> 01:10:22,840 Aku hanya akan mengingat dalam int. 1468 01:10:22,840 --> 01:10:27,310 >> Dan sekarang, saya ingin memperbarui q.front untuk q.front +1. 1469 01:10:27,310 --> 01:10:30,070 Jadi jika ini adalah orang pertama di line, sekarang, saya ingin melakukan ditambah 1 1470 01:10:30,070 --> 01:10:31,930 menunjuk pada orang di baris berikutnya. 1471 01:10:31,930 --> 01:10:33,420 Tapi aku harus menangani sampul itu. 1472 01:10:33,420 --> 01:10:37,270 Dan jika kapasitas adalah konstanta global, yang akan memungkinkan saya untuk memastikan 1473 01:10:37,270 --> 01:10:41,140 seperti yang saya menunjuk ke orang yang sangat terakhir di line, operasi modulo akan membawa 1474 01:10:41,140 --> 01:10:43,840 saya kembali ke nol pada depan antrian. 1475 01:10:43,840 --> 01:10:46,050 Dan yang menangani sampul di sini. 1476 01:10:46,050 --> 01:10:48,950 Dan kemudian saya lanjutkan kembali n. 1477 01:10:48,950 --> 01:10:51,530 >> Sekarang, tegasnya, saya tidak harus menyatakan n. 1478 01:10:51,530 --> 01:10:53,880 Saya tidak harus mengambil dan menyimpannya sementara, karena nilai adalah 1479 01:10:53,880 --> 01:10:54,740 masih ada. 1480 01:10:54,740 --> 01:10:57,490 Jadi saya hanya bisa melakukan aritmatika yang tepat untuk mengembalikan mantan kepala 1481 01:10:57,490 --> 01:10:58,450 antrian. 1482 01:10:58,450 --> 01:11:01,850 Tapi aku hanya merasa bahwa ini adalah lebih jelas untuk benar-benar mengambil int, taruh 1483 01:11:01,850 --> 01:11:04,320 n, dan kemudian kembali bahwa demi kejelasan, tetapi 1484 01:11:04,320 --> 01:11:05,735 tidak benar-benar diperlukan. 1485 01:11:05,735 --> 01:11:09,313 1486 01:11:09,313 --> 01:11:12,130 Psst. 1487 01:11:12,130 --> 01:11:13,410 Mereka semua diucapkan di kepala saya. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB Bowden: Pertanyaan Jadi pertama adalah masalah pohon biner. 1490 01:11:19,110 --> 01:11:22,140 Jadi pertanyaan pertama adalah, kita diberikan angka-angka ini. 1491 01:11:22,140 --> 01:11:27,160 Dan kami ingin entah bagaimana memasukkan mereka ke dalam node ini sedemikian rupa sehingga merupakan 1492 01:11:27,160 --> 01:11:30,110 valid pohon pencarian biner. 1493 01:11:30,110 --> 01:11:36,260 Jadi satu hal yang perlu diingat tentang pohon pencarian biner adalah bahwa hal itu tidak 1494 01:11:36,260 --> 01:11:39,800 Hanya saja hal ke kiri kurang dan hal untuk 1495 01:11:39,800 --> 01:11:41,120 kanan lebih besar. 1496 01:11:41,120 --> 01:11:44,580 Perlu bahwa seluruh pohon ke kiri kurang, dan seluruh pohon 1497 01:11:44,580 --> 01:11:45,740 ke kanan lebih besar. 1498 01:11:45,740 --> 01:11:55,260 >> Jadi jika saya menempatkan 34 di sini di bagian atas, dan kemudian Aku meletakkan 20 di sini, jadi itu valid sehingga 1499 01:11:55,260 --> 01:11:56,970 jauh, karena 34 sampai di sini. 1500 01:11:56,970 --> 01:11:57,920 20 akan ke kiri. 1501 01:11:57,920 --> 01:11:58,950 Jadi yang kurang. 1502 01:11:58,950 --> 01:12:03,640 Tapi aku tidak bisa kemudian dimasukkan 59 di sini, karena meskipun 59 adalah di sebelah kanan 20, 1503 01:12:03,640 --> 01:12:06,140 itu masih di sebelah kiri 34. 1504 01:12:06,140 --> 01:12:10,760 Jadi dengan itu kendala dalam pikiran, cara termudah mungkin memecahkan ini 1505 01:12:10,760 --> 01:12:14,330 Masalahnya adalah hanya semacam dari angka-angka ini - 1506 01:12:14,330 --> 01:12:18,720 jadi 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 Dan kemudian memasukkan mereka dari kiri ke kanan. 1508 01:12:21,640 --> 01:12:23,390 >> Jadi 20 terjadi di sini. 1509 01:12:23,390 --> 01:12:24,630 34 terjadi di sini. 1510 01:12:24,630 --> 01:12:25,830 36 terjadi di sini. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 Dan Anda juga bisa tahu dengan beberapa mencolokkan dan menyadari, 1513 01:12:34,730 --> 01:12:38,830 oh, tunggu, saya tidak memiliki jumlah yang cukup untuk mengisi ini di sini. 1514 01:12:38,830 --> 01:12:42,170 Jadi saya harus reshift apa saya rute catatan akan menjadi. 1515 01:12:42,170 --> 01:12:47,490 Tetapi perhatikan bahwa di final tiga, jika Anda membaca dari kiri ke kanan, itu adalah dalam 1516 01:12:47,490 --> 01:12:48,740 urutan yang meningkat. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> Jadi sekarang, kami ingin menyatakan apa yang struct akan menjadi untuk 1519 01:12:56,540 --> 01:12:58,300 node dalam pohon ini. 1520 01:12:58,300 --> 01:13:02,720 Jadi apa yang kita butuhkan dalam sebuah pohon biner? 1521 01:13:02,720 --> 01:13:05,830 Jadi kita memiliki nilai tipe int, sehingga beberapa nilai int. 1522 01:13:05,830 --> 01:13:07,220 Aku tidak tahu apa yang kami sebut dalam larutan - 1523 01:13:07,220 --> 01:13:08,500 int n. 1524 01:13:08,500 --> 01:13:13,570 Kita perlu pointer ke anak kiri dan pointer ke anak kanan. 1525 01:13:13,570 --> 01:13:17,540 Jadi itu akan terlihat seperti ini. 1526 01:13:17,540 --> 01:13:20,510 Dan itu benar-benar akan melihat sebelum kapankah-linked ganda 1527 01:13:20,510 --> 01:13:25,090 Daftar barang-barang, sehingga pemberitahuan - 1528 01:13:25,090 --> 01:13:27,860 Aku akan harus gulir semua cara kembali ke masalah 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> Jadi melihat hal itu terlihat identik dengan ini, kecuali kami hanya terjadi untuk menyebutnya 1531 01:13:36,390 --> 01:13:38,590 nama yang berbeda. 1532 01:13:38,590 --> 01:13:41,440 Kami masih memiliki integer nilai dan dua pointer. 1533 01:13:41,440 --> 01:13:44,850 Hanya saja bahwa alih-alih mengobati pointer sebagai menunjuk ke hal berikutnya 1534 01:13:44,850 --> 01:13:47,955 dan hal sebelumnya, kita memperlakukan pointer untuk menunjuk ke anak kiri 1535 01:13:47,955 --> 01:13:49,205 dan anak kanan. 1536 01:13:49,205 --> 01:13:57,372 1537 01:13:57,372 --> 01:13:57,860 OK. 1538 01:13:57,860 --> 01:13:59,650 Jadi itulah struct simpul kami. 1539 01:13:59,650 --> 01:14:03,920 Dan sekarang, satu-satunya fungsi kita perlu menerapkan untuk ini adalah melintasi, yang 1540 01:14:03,920 --> 01:14:08,320 kami ingin pergi ke pohon, pencetakan keluar nilai pohon dalam rangka. 1541 01:14:08,320 --> 01:14:15,241 >> Jadi mencari di sini, kita ingin mencetak keluar 20, 34, 36, 52, 59, dan 106. 1542 01:14:15,241 --> 01:14:17,970 Bagaimana kita mencapai itu? 1543 01:14:17,970 --> 01:14:18,890 Jadi itu sangat mirip. 1544 01:14:18,890 --> 01:14:22,910 Jika Anda melihat di ujian terakhir masalah bahwa Anda ingin mencetak 1545 01:14:22,910 --> 01:14:25,940 seluruh pohon dengan koma di antara segala sesuatu, itu benar-benar bahkan 1546 01:14:25,940 --> 01:14:27,320 lebih mudah dari itu. 1547 01:14:27,320 --> 01:14:30,950 Jadi di sini adalah solusinya. 1548 01:14:30,950 --> 01:14:33,110 Ini secara signifikan lebih mudah jika Anda melakukannya secara rekursif. 1549 01:14:33,110 --> 01:14:36,650 Saya tidak tahu apakah ada yang mencoba untuk melakukannya iteratif. 1550 01:14:36,650 --> 01:14:38,340 >> Tapi pertama-tama, kita memiliki kasus dasar kami. 1551 01:14:38,340 --> 01:14:39,660 Bagaimana jika akar adalah nol? 1552 01:14:39,660 --> 01:14:40,610 Kemudian kita hanya akan kembali. 1553 01:14:40,610 --> 01:14:42,300 Kami tidak ingin mencetak apa pun. 1554 01:14:42,300 --> 01:14:45,940 Lain kita akan melintasi rekursif bawah. 1555 01:14:45,940 --> 01:14:48,140 Cetak seluruh subtree kiri. 1556 01:14:48,140 --> 01:14:51,440 Jadi mencetak segala sesuatu yang kurang dari nilai saya saat ini. 1557 01:14:51,440 --> 01:14:53,930 Dan kemudian aku akan mencetak sendiri. 1558 01:14:53,930 --> 01:14:57,310 Dan kemudian aku akan recurse turun saya seluruh subtree kanan, jadi semuanya 1559 01:14:57,310 --> 01:14:58,810 lebih besar dari nilai saya. 1560 01:14:58,810 --> 01:15:03,870 Dan ini akan mencetak segala sesuatu dalam rangka. 1561 01:15:03,870 --> 01:15:05,860 Pertanyaan tentang bagaimana hal ini benar-benar menyelesaikan itu? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> AUDIENCE: Saya punya pertanyaan pada [Tak terdengar]. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB Bowden: Jadi salah satu cara untuk mendekati masalah rekursif adalah untuk hanya berpikir 1566 01:15:23,550 --> 01:15:26,275 tentang hal itu seperti Anda harus berpikir tentang semua kasus sudut. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Jadi menganggap bahwa kita ingin mencetak seluruh pohon ini. 1569 01:15:38,110 --> 01:15:42,030 Jadi semua kita akan fokus pada adalah simpul tertentu - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 Panggilan rekursif, kita berpura-pura mereka hanya bekerja. 1572 01:15:47,420 --> 01:15:54,000 Jadi di sini, panggilan ini rekursif untuk traverse, kita bahkan tanpa berpikir 1573 01:15:54,000 --> 01:15:58,640 tentang hal itu, hanya melintasi kiri tiga, bayangkan yang sudah mencetak 20 1574 01:15:58,640 --> 01:16:00,730 dan 34 bagi kita. 1575 01:16:00,730 --> 01:16:03,350 Dan kemudian ketika kita akhirnya rekursif memanggil melintasi pada 1576 01:16:03,350 --> 01:16:07,890 benar, yang benar akan mencetak 52, 59, dan 106 bagi kita. 1577 01:16:07,890 --> 01:16:13,620 >> Jadi mengingat bahwa ini dapat mencetak 20, 34, dan yang lain dapat mencetak 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 semua yang kita butuhkan untuk dapat lakukan adalah mencetak diri di tengah-tengah itu. 1579 01:16:17,180 --> 01:16:21,250 Jadi mencetak segala sesuatu sebelum kita. 1580 01:16:21,250 --> 01:16:27,710 Cetak diri mereka sendiri, sehingga node cetak saat ini 36, printf biasa, dan kemudian 1581 01:16:27,710 --> 01:16:31,170 mencetak semuanya setelah kita. 1582 01:16:31,170 --> 01:16:32,730 >> DAVID J. Malan: Ini adalah di mana rekursi akan benar-benar indah. 1583 01:16:32,730 --> 01:16:36,270 Ini lompatan luar biasa ini iman mana Anda melakukan sedikit terkecil pekerjaan. 1584 01:16:36,270 --> 01:16:38,460 Dan kemudian Anda membiarkan orang lain melakukan sisanya. 1585 01:16:38,460 --> 01:16:40,180 Dan bahwa orang lain adalah, ironisnya, Anda. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 Jadi untuk poin brownies serius, jika Anda gulir ke atas pada pertanyaan - 1588 01:16:48,360 --> 01:16:50,530 >> ROB Bowden: Pada pertanyaan? 1589 01:16:50,530 --> 01:16:53,490 >> DAVID J. Malan: Dan turun sedikit untuk angka, tidak ada yang tahu di mana 1590 01:16:53,490 --> 01:16:55,190 angka-angka ini berasal? 1591 01:16:55,190 --> 01:16:56,610 >> ROB Bowden: Saya telah benar-benar tidak tahu. 1592 01:16:56,610 --> 01:16:59,794 >> DAVID J. Malan: Mereka muncul seluruh kuis. 1593 01:16:59,794 --> 01:17:01,150 >> AUDIENCE: Apakah mereka nomor yang sama? 1594 01:17:01,150 --> 01:17:01,910 >> DAVID J. Malan: Angka-angka. 1595 01:17:01,910 --> 01:17:03,260 Sebuah telur Paskah kecil. 1596 01:17:03,260 --> 01:17:08,100 Jadi bagi anda menonton online di rumah, jika Anda dapat memberitahu kami melalui email ke 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net apa signifikansi dari enam nomor yang berulang 1598 01:17:12,680 --> 01:17:18,560 seluruh Quiz 1, kami akan mandi Anda dengan perhatian yang luar biasa di final 1599 01:17:18,560 --> 01:17:21,610 kuliah dan bola stres. 1600 01:17:21,610 --> 01:17:25,460 1601 01:17:25,460 --> 01:17:27,790 Nice, halus. 1602 01:17:27,790 --> 01:17:29,570 >> ROB Bowden: Pertanyaan terakhir tentang apa pun pada kuis? 1603 01:17:29,570 --> 01:17:32,608