DAVID J. MALAN: Baiklah. Jadi selamat datang ke pertama Bedah siasat CS50 untuk kuiz. Kami terfikir merasmikan tradisi ini tahun ini. Dan ini akan menjadi peluang untuk berjalan melalui penyelesaian kepada kuiz. Dan kami akan mempercepatkan atau melambatkan berasaskan ke atas faedah dari orang-orang di sini. Jadi anda mungkin di sini kerana anda berminat bagaimana anda boleh mempunyai atau mungkin menjawab beberapa masalah-masalah ini. Jadi mengapa tidak kita lihat bahagian ini pertama? Jadi mendapatkan tali. Ini memberi anda tiga versi yang berbeza daripada program yang, akhirnya, bertujuan untuk mendapatkan rentetan daripada pengguna. Sama ada atau tidak ia lakukan itu adalah meninggalkan kepada anda untuk menentukan. Dan kita ditanya dalam Soalan 0, andaikan bahawa versi 1 adalah disusun dan dilaksanakan. Mengapa mungkin program ini segfault? Pada pandangan pertama, apa-apa cadangan mengapa? Yeah. PENONTON: Jadi saya ingat melihat ini dalam contoh yang sebelum ini melihat char * s dan melihat imbasan satu s dan melihat kerana ia penunjuk, bagaimana adakah ia memberi kesan kepada apa yang anda diimbas dalam? Adakah ia s atau alamat s? DAVID J. MALAN: OK. Baik. Jadi akhirnya, sumber bagi sebarang masalah adalah mungkin akan mengurangkan dengan pembolehubah s. Dan ia sememangnya pembolehubah. Jenis data pembolehubah yang char *, yang bermakna ia akan mengandungi alamat bersifat. Dan di dalamnya terletak wawasan. Ia akan mengandungi alamat watak atau, lebih umum, alamat aksara pertama dalam blok keseluruhan aksara. Tetapi tangkapan adalah bahawa imbasan s, tujuan dalam kehidupan, diberikan alamat dan diberikan kod format, seperti% s, membaca rentetan ke dalam sebahagian daripada memori di alamat itu. Tetapi kerana tidak ada tanda yang sama sebelum yang koma bertitik ke atas yang pertama baris kod, kerana kita tidak benar-benar memperuntukkan apa-apa memori dengan malloc, kerana ia tidak benar-benar memperuntukkan pelbagai saiz beberapa, semua yang anda lakukan adalah membaca pengguna ini input papan kekunci ke dalam beberapa lengkap nilai sampah, yang adalah dalam s secara lalai. Jadi kemungkinan yang anda akan segfault jika Alamat yang tidak hanya begitu berlaku sebagai nilai yang anda boleh, sebenarnya, menulis kepada. Begitu buruk tidak memperuntukkan memori anda di sana. Jadi dalam soalan 1, kita bertanya, andaikan bahawa versi 2 adalah disusun dan dilaksanakan. Mengapa mungkin program ini segfault? Jadi satu ini kurang kereta. Dan ada benar-benar hanya satu cara yang jelas di mana anda boleh mencetuskan segfault di sini. Dan ini adalah bertema. Bila-bila masa kita menggunakan c dalam ingatan, apa yang anda boleh lakukan untuk mendorong segfault yang dengan versi 2? PENONTON: Jika anda menggunakan input yang di rentetan itu lebih lama daripada 49 aksara. DAVID J. MALAN: Tepat sekali. Setiap kali anda melihat sesuatu yang tetap panjang ketika datang ke array, anda radar perlu pergi bahawa ini boleh menjadi bermasalah jika anda tidak memeriksa sempadan array. Dan itulah masalah di sini. Kami masih menggunakan scanf. Kami masih menggunakan% s, yang bermaksud cuba untuk membaca rentetan daripada pengguna. Itu akan dibaca ke dalam s, yang, pada ketika ini, adalah berkesan alamat sebahagian memori atau ia setara. Ia adalah nama array watak ingatan. Tetapi tepat bahawa, jika anda membaca rentetan itulah yang lebih panjang daripada 49 aksara, 49 kerana anda perlu ruang untuk garis sendeng terbalik di 0, anda akan melimpah penampan itu. Dan anda mungkin akan bernasib baik dan dapat menulis watak ke-51, ke-52, ke-53. Tetapi pada satu ketika, OS akan mengatakan, tidak. Ini pasti memori tidak anda dibenarkan untuk menyentuh. Dan program ini akan segfault. Jadi di sana, heuristik perlu apa-apa masa anda mempunyai panjang tetap, anda mempunyai memastikan anda memeriksa panjang daripada apa sahaja yang anda cuba untuk membaca ke dalamnya. PENONTON: Jadi untuk menyelesaikan itu, anda boleh mempunyai satu kenyataan memeriksa sebenarnya lebih besar panjang daripada atau kurang daripada? DAVID J. MALAN: Sudah tentu. Anda hanya perlu satu keadaan yang mengatakan, jika - atau sebaliknya anda tidak semestinya tahu terlebih dahulu berapa banyak aksara yang pengguna akan menaip, kerana anda mempunyai ayam dan telur. Tidak sehingga anda membacanya dengan scanf anda boleh mengetahui berapa lama ia adalah. Tetapi pada ketika itu, ia terlalu lewat, kerana anda telah membaca ke dalam beberapa blok ingatan. Supaya mengetepikan, bertindak tidak perpustakaan CS50 isu ini sama sekali, ingat dengan menggunakan fgetc. Dan ia membaca satu aksara pada satu masa, tip-kepatuhan kepada dasar bersama, mengetahui bahawa anda tidak boleh melimpah watak jika anda membaca satu demi satu. Menangkap ialah dengan ingat getstring adalah bahawa kita perlu sentiasa saiz semula bahawa sebahagian daripada ingatan, yang hanya sakit. Ia banyak baris kod untuk melakukannya. Jadi satu lagi pendekatan adalah untuk sebenarnya menggunakan sepupu, jadi untuk bercakap, daripada scanf. Terdapat varian banyak ini fungsi yang benar-benar memeriksa panjang berapa banyak aksara anda mungkin membaca maksima. Dan anda boleh menentukan, tidak membaca lebih daripada 50 aksara. Jadi yang akan menjadi pendekatan yang lain tetapi akomodatif kurang input yang lebih besar. Jadi soalan 2 meminta, andaikan versi yang 3 disusun dan dilaksanakan. Mengapa mungkin program yang segfault? Jadi satu ini sebenarnya yang sama menjawab, walaupun ia kelihatan sedikit pelamun. Kami menggunakan malloc, yang berasa seperti kami memberikan diri kita lebih banyak pilihan. Dan maka kita membebaskan yang ingatan pada akhir. Ia masih hanya 50 bait ingatan. Oleh itu, kita mungkin masih cuba untuk membaca di 51, 52, 1000 bait. Ia akan segfault untuk betul-betul sebab sama. Tetapi ada satu lagi sebab juga. Apa lagi yang boleh malloc pulangan selain alamat sebahagian memori? Ia dapat kembali null. Dan kerana kita tidak memeriksa itu, kami mungkin melakukan sesuatu bodoh untuk satu lagi sebab, iaitu bahawa kita boleh memberitahu scanf, membaca input pengguna daripada papan kekunci ke 0 lokasi, AKA null. Dan itu, juga, pasti akan mencetuskan segfault a. Jadi untuk tujuan kuiz, kami akan telah diterima sama ada dari orang-orang sebagai sebab yang sah. Satu adalah serupa. Satu adalah sedikit lebih nuanced. Akhir sekali, berkenaan dengan program ini penggunaan memori, bagaimana versi 2 dan versi 3 berbeza? Jadi untuk apa yang bernilai, kami melihat bekalan yang seolah-olah tidak berkesudahan mungkin jawapan untuk ini. Dan di antara jawapan rakyat, apa yang kami berharap untuk, tetapi kita diterima lain perkara, adalah menyebut beberapa hakikat bahawa versi 2 menggunakan tindanan kononnya. Versi 3 menggunakan timbunan itu. Dan fungsi, ini tidak benar-benar membuat semua yang banyak perbezaan. Pada akhir hari, kita masih hanya mendapat 50 bait ingatan. Tetapi itu adalah salah satu jawapan mungkin yang kami cari di. Tetapi anda akan melihat, sebagai anda mendapatkan kuiz anda kembali dari TFS, yang kita lakukan menerima perbincangan lain mereka kegunaan berbeza memori juga. Tetapi stack dan timbunan akan menjadi jawapan yang mudah untuk pergi dengan. Apa-apa soalan? Saya memberi anda Rob. ROB Bowden: Jadi masalah 4. Ini adalah salah satu di mana anda perlu mengisi dalam bilangan bait daripada semua jenis yang berbeza digunakan. Perkara itu kita lihat. Andaikan seni bina 32-bit, seperti perkakas CS50 ini. Jadi salah satu perkara asas tentang 32-bit seni bina, yang memberitahu kita bagaimana besar penunjuk akan berada dalam seni bina. Dengan segera, kita tahu bahawa apa-apa penunjuk jenis adalah 32-bit atau 4 bait. Jadi mencari di meja ini, nod * adalah sejenis penunjuk. Itu akan menjadi 4 bait. Nod struct *, itu betul-betul sama dengan nod bintang. Dan supaya akan menjadi 4 bait. String, supaya ia tidak kelihatan seperti Penunjuk lagi, tetapi typedef, yang rentetan hanya * char, yang adalah sejenis penunjuk. Supaya akan menjadi 4 bait. Jadi ketiga-tiga semua 4 bait. Sekarang, nod dan pelajar adalah sedikit lebih rumit. Jadi mencari pada nod dan pelajar, kita lihat nod sebagai integer dan penunjuk. Dan pelajar adalah dua petunjuk di dalamnya. Jadi sekurang-kurangnya untuk kes kami di sini, cara bahawa kita berakhir mengira saiz struct ini hanya menambah sehingga semua itulah di dalam struct itu. Jadi untuk nod, kita mempunyai integer, yang 4 bait. Kami mempunyai penunjuk, yang 4 bait. Dan sebagainya satu nod akan untuk mengambil 8 bait. Begitu juga bagi pelajar, kita mempunyai penunjuk itulah 4 bait dan satu lagi penunjuk itulah 4 bait. Jadi itu akan berakhir sehingga menjadi 8 bait. Jadi nod dan pelajar adalah 8 bait. Dan ketiga-tiga ini semua 4 bait. Soalan pada itu? Ya. PENONTON: Adakah ia adalah 64-bit seni bina, kalau dua kali ganda mereka semua? ROB Bowden: Ia tidak akan dua kali ganda mereka semua. Jadi 64-bit seni bina, ia, sekali lagi, perubahan yang perkara asas yang satu penunjuk kini 64 bit. Yeah. Jadi penunjuk adalah 8 bait. Jadi ini yang berada 4 bait akan menjadi 8 bait. Seorang pelajar, yang merupakan dua petunjuk, dengan baik, kini ia akan menjadi 8 bait, 8 bait. Ia akan membuat 16 bait. Tetapi nod masih 4 bait. Jadi penunjuk ini akan menjadi 8 bait. Ini adalah 4 bait. Jadi nod hanya akan menjadi 12 bait. Lain-lain soalan pada satu itu? Jadi yang akan datang, ini adalah kod status HTTP. Dan anda mempunyai untuk menggambarkan keadaan di mana kekuatan ini dikembalikan kepada anda. satu masalah yang saya dengar ada pelajar ada adalah bahawa mereka cuba untuk membuat ralat berada di akhir pelanggan. Oleh itu, apabila kita cuba untuk membuat permintaan itu kepada pelayan, sesuatu yang tidak salah di pihak kami. Tetapi secara amnya, Kod ini adalah dipulangkan oleh pelayan. Oleh itu, kita mahu memikirkan apa yang berlaku salah atau betul pada pelayan yang menyebabkan perkara-perkara ini untuk dikembalikan. Jadi mengapa mungkin pulangan server kod status 200? Mana-mana pemikiran? Yeah. Jadi sesuatu tentang berjaya permintaan itu telah melalui. Dan mereka dapat kembali apa sahaja yang anda meminta. Jadi semuanya baik. Apa kira-kira 302 ditemui? Yeah. PENONTON: Pelayan sedang untuk apa yang anda minta. Tetapi ia tidak dapat menemuinya. Jadi ada ralat. ROB Bowden: Jadi pelayan itu mencari apa yang anda mahu. Jadi hanya mencari di sini, 302 ditemui, ia dapat menemuinya. PENONTON: Saya minta maaf. Found bermakna mereka lakukan menemuinya. Maaf. ROB Bowden: Jadi 302 dijumpai. Pelayan adalah dapat mencari apa yang anda mahu. PENONTON: Tetapi ia tidak memaparkan ia? ROB Bowden: Perbezaan antara ini 302 dan 200 ialah ia mengetahui apa yang kamu mahu. Tetapi ia tidak betul-betul di mana anda mahu bertanya. Jadi 302 adalah redirect biasa. Jadi, anda diminta halaman. Ia tahu, oh, saya mahu untuk kembali anda ini. Tetapi ini di URL yang berbeza. Jadi hey, anda benar-benar mahu ini. DAVID J. MALAN: Ini sekeping yang berkata bahawa kami memberikan anda semua ubah hala yang fungsi yang menggunakan fungsi header yang seterusnya, dicetak lokasi, kolon, dan kemudian URL yang anda mahu menolak pengguna. Walaupun anda tidak melihat 302 dengan jelas di sana, itulah yang PHP ajaib akan memasukkan sebagai pengepala berkata apa yang Rob berkata - dijumpai. Tetapi pergi sini sebaliknya. ROB Bowden: OK. Jadi apa yang kira-kira 403 dilarang? PENONTON: Saya rasa ia adalah bahawa pelayan pada dasarnya mengatakan bahawa pelanggan tidak boleh mengakses halaman rumah. ROB Bowden: Jadi ya. Nah, jawapannya biasa kami mengharapkan sesuatu seperti, fail-fail tidak chmodded sewajarnya. Itu mungkin dalam keadaan tertentu anda melihat mereka. Tetapi ada sebab yang pelanggan boleh bersalah di sini. Ada sebenarnya kod status lain - 401. Jadi ini adalah sama. 401 adalah tidak dibenarkan. Dan 403 adalah dilarang. Dan sebagainya yang tidak dibenarkan anda semata-mata mendapatkan jika anda tidak log masuk Tetapi log masuk mungkin bermakna yang anda dibenarkan. Tetapi jika anda sudah login dan anda masih tidak mempunyai kebenaran, maka anda juga boleh mendapatkan dilarang. Jadi, jika anda log masuk dan tidak mempunyai kebenaran, dilarang juga sesuatu yang anda boleh mendapatkan. DAVID J. MALAN: Dan mekanisme dengan yang masalah-masalah ini biasanya diselesaikan pada pelayan adalah melalui apa arahan? Chmod, jika ia, sesungguhnya, yang kebenaran mengeluarkan kepada fail atau direktori. ROB Bowden: Kemudian 404 tidak dijumpai. Yeah. Jadi tidak seperti 302 di mana ia tidak betul-betul di mana anda meminta tetapi ia tahu apa yang anda mahu, ini, ia hanya mempunyai tidak tahu apa yang anda mahu. Dan anda tidak meminta sesuatu yang sah. 418 Saya teko dan kemudian 500 pelayan dalaman. Jadi mengapa anda mungkin mendapatkan itu? Jadi segfault - Saya sebenarnya tidak tahu penggredan standard untuk ini. Tetapi jika kod PHP anda mempunyai sesuatu salah ke dalamnya, dalam teori, ia boleh sebenarnya segfault, di mana, ini 500 Ralat pelayan dalaman, sesuatu yang salah dengan pelayan anda tatarajah. Atau ada ralat sintaks dalam kod PHP anda. Atau sesuatu yang buruk sedang berlaku. DAVID J. MALAN: Kami tidak melihat segfault antara jawapan beberapa orang itu. Dan dari segi teknikal, ia boleh berlaku. Tetapi itu akan menjadi PHP, program ini yang ditulis oleh orang lain, sebenarnya segfaulted, yang hanya jika orang-orang diskru dan menulis kod buggy di jurubahasa mereka akan PHP sendiri segfault. Jadi, walaupun 500 adalah seperti yang segfault dalam roh, ia selalunya hasil daripada isu fail konfigurasi dengan pelayan web anda atau, Rob berkata, ralat sintaks, seperti anda tidak menutup sebut harga. Atau anda hilang dengan koma bernoktah di suatu tempat. PENONTON: Jadi bagi Serangga Shuttle, saya berfikir apabila saya sekali saya klik yang penyemak imbas, tetapi tiada apa yang datang, apa yang mereka namakan halaman putih. Tetapi ia adalah kerana kod. Saya berfikir bahawa adalah JavaScript, bukan? ROB Bowden: Yeah. PENONTON: Adakah ralat yang masih naik? ROB Bowden: Jadi anda tidak akan mendapat kesilapan ini kerana segala-galanya dari perspektif pelayan web benar-benar halus. Tetapi anda diminta index.html. Anda diminta shuttle.js dan service.js. Dan ia mampu berjaya kembali kepada anda semua perkara-perkara - 200. OK. Ia hanya apabila penyemak imbas anda cuba mentafsir kod JavaScript yang ia seperti, tunggu, ini tidak ralat JavaScript sah. Apa-apa soalan lain? Baiklah. DAVID J. MALAN: Jadi seterusnya up adalah nombor 11. Dan 11 adalah yang paling menakutkan untuk ramai orang. Jadi perkara yang paling penting untuk diperhatikan di sini adalah ini, sesungguhnya, kira-kira senarai duanya adalah terpakai dikaitkan. Tetapi ini tidak sama seperti tahun lepas masalah senarai duanya adalah terpakai dikaitkan, yang tidak memberi anda kaveat bahawa senarai itu boleh, sebenarnya, menjadi Unsorted. Jadi hakikat bahawa senarai itu Unsorted dan hakikat bahawa perkataan yang digariskan ada bertujuan untuk menyampaikan bahawa ini adalah sebenarnya satu pemudahan apa yang jika tidak, akan masalah yang lebih mencabar dan yang lebih panjang satu. Jadi satu kesilapan yang sama di sini adalah untuk telah meletakkan penyelesaian tahun lepas pada salah satu anda alat kelui dan kemudian hanya membuta tuli salinan yang turun sebagai jawapan, yang merupakan hak menjawab kepada soalan yang berbeza sama dalam semangat. Tetapi perihal tersirat di sini adalah seperti berikut. Jadi, satu, kami telah nod diisytiharkan dan ditakrifkan dalam cara yang biasa di sini. Maka kita ditakrifkan senarai menjadi global penunjuk dimulakan untuk nol. Kemudian nampaknya, ada dua fungsi kita mempunyai prototaip untuk di sini, masukkan dan keluarkan. Dan kemudian kita mempunyai beberapa contoh kod di sini menjalankan sekumpulan sisipan. Dan kemudian kami meminta anda untuk melengkapkan pelaksanaan insert bawah dalam apa-apa cara yang ia memasukkan n ke dalam senarai dalam masa yang tetap, juga menggariskan, walaupun sudah ada. Jadi keindahan dapat memasukkan dalam masa yang tetap ialah ia membayangkan bahawa anda perlu memasukkan nod baru di mana? Ke hadapan. Jadi ia menghapuskan, bersyukur, sekurang-kurangnya salah satu kes yang digunakan untuk memerlukan lebih baris kod, seperti yang berlaku tahun lepas dan juga di dalam kelas apabila kita bercakap melalui perkara seperti ini dengan manusia dan dengan beberapa kod pseudo lisan. Jadi dalam penyelesaian di sini, mari kita melangkau lebih itu hanya untuk mempunyai pada visual skrin. Perhatikan bahawa yang kami lakukan yang berikut. Dan juga notis pemudahan yang lain adalah bahawa walaupun ia sudah ada, jadi ini bermakna walaupun bilangan sudah ada, anda boleh hanya membuta tuli memasukkan satu lagi salinan pernyataan itu. Dan itu juga bertujuan untuk menjadi pemudahan, supaya anda boleh memberi tumpuan kepada, benar-benar, ada satu yang lebih sebahagian intelektual yang menarik dan bukan hanya beberapa ralat tambahan memeriksa diberi masa yang terhad. Jadi dalam larutan sampel ini, kita memperuntukkan penunjuk di tangan meninggalkan sisi di sini untuk nod. Sekarang, menyedari penunjuk bahawa, sebagai Rob berkata, hanya 32 bit. Dan ia tidak benar-benar mengandungi alamat sehingga anda sediakan alamat. Dan kita melakukan itu di tangan kanan sebelah melalui malloc. Seperti golongan yang baik, kita pastikan malloc tidak, sebenarnya, batal, supaya kita tidak sengaja membuat segfault di sini. Dan bila-bila masa anda menggunakan malloc dalam kehidupan, anda perlu memeriksa null, supaya anda mempunyai pepijat halus. Kemudian kami memulakan null bahawa dengan memberikan n dan sebelumnya dan seterusnya. Dan dalam kes ini di sini, saya dimulakan sebelumnya kepada batal, kerana ini baru nod yang akan menjadi baru permulaan senarai saya. Jadi ada akan menjadi apa-apa di hadapannya. Dan saya ingin menambah dasarnya yang senarai yang sedia ada untuk nod baru dengan menetapkan seterusnya sama dengan menyenaraikan sendiri. Tetapi saya tidak dilakukan hanya lagi. Jadi, jika senarai itu sendiri sudah wujud, dan terdapat sekurang-kurangnya satu nod sedia ada, jika ini adalah senarai di sini dan saya memasukkan nod baru di sini, saya perlu memastikan bahawa bekas nod saya mata ke belakang untuk nod baru saya, kerana ini adalah, sekali lagi, senarai duanya adalah terpakai dikaitkan. Oleh itu, kita melakukan pemeriksaan kewarasan. Jika senarai tidak batal, jika ada sudah satu atau lebih nod di sana, maka menambah bahawa kembali rujukan jadi untuk bercakap. Dan maka perkara yang terakhir yang kita perlukan lakukan adalah sebenarnya mengemaskini global senarai pembolehubah sendiri untuk menunjukkan untuk nod baru. Yeah. PENONTON: Dalam penunjuk anak panah [Didengar] sama batal, tidak yang menangani senarai kerana senarai itu adalah batal? DAVID J. MALAN: Nope. Yang semata-mata saya menjadi proaktif berhati-hati, kerana jika ini adalah saya Senarai asal dengan mungkin beberapa lebih nod di sini dan saya memasukkan saya nod baru di sini, ada akan untuk menjadi apa-apa di sini. Dan saya mahu menangkap idea yang dengan menetapkan sebelumnya kepada null pada nod baru. Dan mungkin, jika kod saya adalah betul dan tidak ada cara lain untuk memasukkan nod selain daripada fungsi ini, mungkin, walaupun senarai sudah mempunyai satu atau lebih nod di dalamnya, mungkin senarai, nod yang pertama, akan mempunyai penunjuk sebelumnya null sendiri. PENONTON: Dan hanya susulan. Sebab anda meletakkan penunjuk setaraf seterusnya senarai adalah anda membuat penunjuk sebelum senarai di bahawa ia menunjuk ke depan, saya rasa - Saya tidakkah ibu - hanya menyenaraikan? DAVID J. MALAN: Tepat sekali. Dan jadi mari kita sebenarnya mengambil kira dua kes di sini benar-benar, walaupun perintah kami akan menganggap mereka tidak agak yang sama seperti kod. Tetapi pada tahap yang tinggi, jika ini mewakili senarai dan ini adalah 32-bit penunjuk, senario yang paling mudah adalah bahawa ini adalah batal secara lalai. Dan rasa saya mahu untuk memasukkan bilangan 50 adalah nombor yang pertama. Jadi saya akan teruskan dan memperuntukkan nod, yang akan mengandungi tiga bidang - n, sebelum ini, dan seterusnya. Saya akan meletakkan jumlah 50 di sini, kerana ini akan menjadi n. Ini akan datang. Dan ini akan menjadi sebelumnya. Dan jadi apa yang saya lakukan dalam kes ini? Nah, saya baru sahaja dilakukan baris 1 di sini. Pointer n mendapat n. Saya kemudian berkata, sebelum ini perlu mendapatkan null. Jadi ini akan menjadi batal. Kemudian saya akan berkata seterusnya akan mendapatkan senarai. Dan ini hanya berfungsi dengan baik. Ini adalah batal. Dan jadi saya berkata, nod baru seterusnya bidang harus mendapatkan apa sahaja ini. Jadi yang meletakkan null lain di sana. Dan kemudian perkara terakhir Saya adalah memeriksa di sini. Jika senarai tidak sama dengan nol, tetapi ia adalah sama dengan nol, jadi kita skip yang sama sekali. Dan sebagainya semua saya lakukan seterusnya adalah senarai mendapat penunjuk, yang bergambar menyebabkan gambar seperti itu. Jadi itu satu senario. Dan satu yang anda telah bertanya tentang khusus adalah keadaan seperti ini, di mana kita sudah mempunyai senarai satu nod. Dan jika saya naik semula dalam asal pernyataan masalah, seterusnya kita akan memasukkan katakan adalah 34, hanya untuk demi perbincangan. Jadi saya akan hanya mudah menarik bahawa di sini. Saya baru sahaja malloced. Mari kita andaikan saya memeriksa null. Sekarang, saya akan memulakan n menjadi 34. Dan ini akan menjadi n. Ini akan datang. Dan ini akan menjadi sebelumnya. Mari kita pastikan saya tidak mendapatkan ini ke belakang. Previous diutamakan dalam takrif. Biar saya menetapkan ini. Ini adalah sebelum ini. Ini seterusnya. Walaupun mereka adalah sama, mari kita menyimpannya konsisten. Sebelumnya. Ini seterusnya. Jadi saya baru sahaja malloced nota saya, diperiksa for null, diberikan 34 ke nod. Sebelum mendapat null. Jadi yang memberikan saya itu. Seterusnya mendapat senarai. Jadi senarai adalah ini. Jadi ini adalah sekarang sama seperti melukis ini arrow, supaya mereka menunjuk kepada satu dalam yang sama. Dan kemudian saya memeriksa jika senarai tidak sama dengan nol. Dan ia bukan masa ini. Kemudian saya akan berbuat senarai sebelum mendapat pointer. Jadi senaraikan sebelumnya mendapat PTR. Jadi ini mempunyai kesan meletakkan arrow grafik di sini. Dan itu semakin sedikit yang ikal, garis. Dan kemudian, akhir sekali, saya mengemas kini menyenaraikan untuk menunjukkan penunjuk. Jadi sekarang ini mata kepada lelaki ini. Dan kini, mari kita buat yang cepat cek kewarasan. Berikut adalah senarai, yang merupakan pembolehubah global. Nod pertama adalah, sememangnya, 34, kerana Saya mengikuti anak panah yang. Dan itu betul kerana saya ingin memasukkan pada awal senarai semua nod baru. Bidang seterusnya beliau membawa saya kepada lelaki ini. Jika aku berterusan, saya melanda seterusnya adalah null. Jadi tidak ada senarai lagi. Jika saya melanda sebelum ini, saya mendapatkan menyokong di mana saya harapkan. Jadi masih terdapat beberapa petunjuk, jelas, untuk memanipulasi. Tetapi hakikat bahawa anda diberitahu untuk melakukan ini dalam masa yang tetap bermakna anda hanya mempunyai beberapa terhingga perkara anda dibenarkan untuk dilakukan. Dan apa yang jumlah itu? Ia mungkin menjadi salah satu langkah. Ia mungkin dua. Ia mungkin 1,000 langkah. Tetapi ia terbatas, yang bermakna anda tidak boleh telah apa-apa jenis gelung berlaku di sini, tidak rekursi, tiada gelung. Ia hanya mendapat menjadi garis berkod keras kod yang kita ada dalam sampel ini. Jadi masalah yang akan datang 12 meminta kami menyiapkan pelaksanaan mengeluarkan bawah dalam apa-apa cara yang ia membuang n dari senarai dalam masa linear. Jadi anda mempunyai lebih sedikit bilik hal bergoyang sekarang. Anda mungkin menganggap bahawa n, jika ada dalam senarai, akan hadir tidak lebih daripada sekali. Dan itu juga bertujuan untuk menjadi berasaskan kuiz memudahkan andaian, jadi bahawa jika anda mendapati nombor 50 tempat dalam senarai, anda tidak juga perlu bimbang tentang yang berterusan untuk melelar, mencari setiap mungkin salinan 50, yang hanya akan diserahkan ke beberapa minutia dalam masa yang terhad. Jadi dengan mengeluarkan, yang satu ini pasti lebih mencabar dan lebih kod untuk menulis. Tetapi pada pandangan pertama, terus-terang, ia mungkin kelihatan hangat dan seperti tidak ada cara anda boleh mempunyai datang dengan pada kuiz. Tetapi jika kita memberi tumpuan kepada langkah-langkah individu, mudah-mudahan, ia akan tiba-tiba menyerang anda bahawa setiap individu ini langkah-langkah yang jelas masuk akal ditinjau kembali. Jadi mari kita membaca. Jadi pertama, kami memulakan penunjuk menjadi senaraikan sendiri. Kerana saya mahu masa linear, yang cara Saya akan mempunyai beberapa gelung. Dan cara yang biasa untuk melelar atas nod dalam struktur senarai atau apa-apa jenis struktur iterative adalah untuk mengambil penunjuk ke hadapan data struktur dan kemudian hanya mula mengemas kini dan berjalan jalan melalui struktur data. Jadi saya akan melakukan perkara tersebut. Walaupun penunjuk, pembolehubah sementara saya, tidak sama dengan nol, mari kita teruskan dan cek. Adakah saya mendapatkan bertuah? Adalah bidang n dalam nod saya kini melihat sama dengan bilangan saya cari? Dan jika demikian, mari kita buat sesuatu. Sekarang, notis ini jika keadaan mengelilingi keseluruhan baris berikut kod. Ini adalah satu-satunya perkara yang saya mengambil berat tentang - mencari nombor dalam soalan. Jadi tidak ada lagi, yang memudahkan perkara konsep sedikit. Tetapi sekarang, saya sedar, dan anda mungkin mempunyai hanya menyedari ini selepas berfikir melalui sedikit, ada sebenarnya dua kes di sini. Satu adalah di mana nod adalah di permulaan senarai, yang merupakan sedikit menjengkelkan, kerana itulah yang kes khas, kerana anda perlu berurusan dengan perkara ini, yang adalah satu-satunya anomali. Mana-mana sahaja dalam senarai, ia adalah perkara yang sama. Ada nod sebelumnya dan seterusnya nod, nod sebelumnya, nod akan datang. Tetapi lelaki ini adalah khas sedikit jika dia pada permulaan. Jadi, jika penunjuk sama senarai sendiri, jadi jika saya pada awal senarai dan saya telah mendapati n, saya perlu untuk melakukan beberapa perkara. Satu, saya perlu menukar senarai menunjukkan ke medan seterusnya, 50. Jadi andaikan yang saya cuba untuk menghapuskan 34. Jadi lelaki ini ini mendapat untuk pergi jauh dalam seketika. Jadi, saya akan berkata, senarai mendapat penunjuk akan datang. Nah, ini adalah penunjuk. Seterusnya menghala di sini. Jadi ini berubah ini anak panah kanan sekarang untuk menunjuk kepada lelaki ini di sini. Sekarang, ingat, kita ada pembolehubah sementara. Oleh itu, kita tidak yatim sebarang nod, kerana saya juga mempunyai lelaki ini dalam saya pelaksanaan keluarkan. Jadi sekarang, jika senarai itu sendiri tidak batal, Saya perlu menetapkan sesuatu yang kecil. Saya perlu kini memastikan bahawa anak panah ini, yang sebelum ini menunjuk 50-34, ini telah mendapat untuk pergi jauh, kerana jika saya cuba untuk menghapuskan 34, 50 mempunyai yang lebih baik tidak mengambil apa-apa jenis kembali merujuk kepada ia sebagai arrow yang disyorkan. Jadi saya hanya melakukan baris ini. Demikian maka aku selesai. Kes yang sebenarnya cukup mudah. Mencincang off ketua senarai adalah agak mudah. Malangnya, ada ini blok menjengkelkan yang lain. Jadi sekarang, saya perlu mengambil kira kes di mana ada sesuatu di tengah-tengah. Tetapi ia tidak terlalu teruk, kecuali untuk sintaks seperti ini. Jadi, jika saya tiada di permulaan senarai, saya di suatu tempat di tengah-tengah. Dan garis ini di sini mengatakan, permulaan pada apa jua nod anda berada di. Pergi ke bidang seterusnya nod sebelumnya dan menunjukkan bahawa pada penunjuk. Mari kita buat ini bergambar. Yang semakin rumit. Jadi, jika saya mempunyai bidang sebelumnya di sini - mari kita buat ini - bidang seterusnya di sini. Saya akan memudahkan petunjuk saya agak daripada menarik sejumlah besar perkara berulang-alik crisscrossing antara satu sama lain. Dan kini, mari kita hanya mengatakan ini adalah 1, 2, 3 demi perbincangan, walaupun walaupun yang tidak beratur dengan masalah yang berkenaan. Jadi di sini adalah senarai dikaitkan saya. Saya cuba untuk mengeluarkan dua di ini versi tertentu cerita. Jadi saya telah dikemaskini penunjuk kepada akan menunjuk ke lelaki ini. Jadi ini adalah PTR. Dia menunjuk sini. Ini adalah senarai, yang wujud di peringkat global seperti sebelum ini. Dan dia menunjuk sini tidak kira apa. Dan sekarang, saya cuba untuk membuang dua. Jadi, jika penunjuk menghala sini, saya akan mengikuti, nampaknya, penunjuk sebelumnya, yang meletakkan saya di 1. Saya kemudian akan mengatakan bahawa yang akan datang bidang, yang membawa saya ke ini kotak di sini, akan penunjuk sama akan datang. Jadi, jika penunjuk ini, ini adalah yang akan datang. Ini bermakna bahawa ini arrow keperluan untuk menunjuk kepada lelaki ini. Jadi apa yang baris kod mempunyai hanya dilakukan adalah sedikit ini. Dan sekarang, ini kelihatan seperti langkah ke arah yang betul. Kami pada dasarnya mahu Guntingan 2 daripada daripada tengah-tengah 1 dan 3. Jadi masuk akal bahawa kita mahu laluan penunjuk ini di sekelilingnya. Jadi baris ini akan datang memeriksa jika penunjuk seterusnya tidak batal, ada sesungguhnya seseorang di sebelah kanan 2, ini bermakna kita juga perlu lakukan sedikit Guntingan di sini. Jadi saya kini perlu mengikuti penunjuk ini dan mengemaskini penunjuk sebelumnya pada lelaki ini untuk melakukan sedikit daripada Workaround sini titik di sini. Dan kini, visual ini adalah baik. Ia sedikit tidak kemas dalam bahawa ada tidak ada menunjuk pada 2 lagi. 2 menghala ke kiri. Dan 2 menghala ke kanan. Tetapi dia boleh buat apa yang dia mahu, kerana dia kira-kira untuk mendapatkan dibebaskan. Dan ia tidak kira apa nilai-nilai adalah lagi. Apa yang penting ialah bahawa baki lelaki adalah laluan di atas dan di bawah beliau sekarang. Dan sesungguhnya, itulah yang kita lakukan seterusnya. Kami penunjuk percuma, yang bererti kita memberitahu sistem operasi, anda adalah dialu-alukan untuk menuntut semula ini. Dan kemudian akhir sekali, kita kembali. Yang lain secara tersirat, jika kita tidak kembali lagi, kami ada untuk terus mencari. Jadi penunjuk sama penunjuk seterusnya hanya bermakna bergerak lelaki ini di sini. Pindah lelaki ini di sini. Pindah lelaki ini di sini jika, sebenarnya, kami tidak menjumpai bilangan kita cari yet. Jadi terus-terang, ia kelihatan benar-benar menggalakkan, saya fikir, pada mulanya pandangan, terutamanya jika anda berjuang dengan ini semasa kuiz kemudian melihat sesuatu seperti ini. Dan anda tepuk diri anda di belakang. Well, tidak ada cara saya boleh datang dengan kuiz. Tetapi saya akan berhujah, anda boleh jika anda memecahkan ke bawah ke dalam individu kes dan hanya berjalan melaluinya berhati-hati, walaupun, diakui, di bawah keadaan tekanan. Syukurlah, gambar yang dibuat semua bahagia. Anda boleh menarik ini dalam apa-apa cara. Anda tidak perlu melakukan crisscrossing yang perkara di sini. Anda boleh melakukannya dengan lurus ungkapan seperti ini. Tetapi intipati masalah ini, di umum, adalah untuk menyedari bahawa gambar pada akhirnya harus melihat sedikit sesuatu seperti ini, kerana pemalar masa tersirat bahawa anda menyimpan jamming dan jamming dan jamming yang nod baru pada awal senarai. Apa-apa soalan? Mungkin yang paling mencabar pasti soalan-soalan pengkodan. PENONTON: Jadi adalah senarai sama dengan mengetuai dalam contoh-contoh sebelumnya. DAVID J. MALAN: Tepat sekali, betul-betul. Hanya nama yang berlainan bagi pembolehubah global. Di seluruh dunia apa? ROB Bowden: OK. Jadi ini adalah satu di mana anda terpaksa menulis perenggan. Sesetengah orang menulis esei untuk soalan ini. Tetapi anda hanya perlu menggunakan enam penggal untuk menggambarkan apa yang berlaku apabila anda cuba untuk menghubungi facebook.com. Jadi saya hanya akan bercakap melalui proses menggunakan semua syarat-syarat ini. Jadi dalam pelayar kita, kita menaip facebook.com dan tekan Enter. Jadi pelayar kami akan membina sebuah HTTP meminta ia akan menghantar melalui beberapa proses ke Facebook untuk Facebook untuk bertindak balas kepada kita dengan HTML halaman itu. Jadi apa adalah proses di yang permintaan HTTP sebenarnya mendapat untuk Facebook? Oleh itu, kita perlu untuk menterjemahkan Facebook.com. Jadi hanya diberi nama Facebook.com itu, di mana sebenarnya tidak permintaan HTTP perlu pergi? Oleh itu, kita perlu menterjemah Facebook.com ke alamat IP, yang unik mengenal pasti apa yang mesin kita sebenarnya ingin menghantar permintaan ini kepada. Komputer riba anda mempunyai alamat IP. Apa-apa yang berkaitan dengan internet mempunyai alamat IP. Jadi DNS, Sistem Nama Domain, iaitu apa yang akan mengendalikan terjemahan dari facebook.com kepada alamat IP yang anda benar-benar ingin hubungi. Oleh itu, kita menghubungi pelayan DNS dan katakan, apa yang facebook.com? Ia berkata, oh, itu alamat IP 190,212 sesuatu, sesuatu, sesuatu. Baiklah. Sekarang, saya tahu apa yang mesin Saya mahu kenalan. Jadi maka anda menghantar permintaan HTTP anda kepada mesin itu. Jadi bagaimana ia mendapatkan ke mesin itu? Nah, permintaan itu pergi dari router untuk melantun router. Ingat contoh di dalam kelas, di mana tersebut sebenarnya laluan bahawa paket mengambil apabila kami cuba untuk berkomunikasi. Kami melihat ia melompat lebih Atlantik Ocean pada satu titik atau apa sahaja. Jadi pelabuhan jangka lepas. Jadi ini kini pada komputer anda. Anda boleh mempunyai pelbagai perkara yang sedang berkomunikasi dengan internet. Jadi saya boleh berjalan, berkata, Skype. Saya mungkin pelayar web terbuka. Saya mungkin mempunyai sesuatu yang torrenting fail. Jadi semua perkara ini adalah berkomunikasi dengan internet dalam beberapa cara. Oleh itu, apabila komputer anda menerima beberapa data dari internet, bagaimana ia tahu apa yang sebenarnya permohonan mahu data? Bagaimana ia tahu sama ada ini tertentu data yang dimaksudkan untuk torrenting permohonan berbanding untuk pelayar web? Jadi ini adalah tujuan pelabuhan di yang semua aplikasi ini mempunyai mendakwa port pada komputer anda. Jadi pelayar web anda berkata, hey, Saya mendengar pada port 1000. Dan program torrenting anda mengatakan, Saya mendengar pada port 3000. Dan Skype berkata, saya menggunakan port 4000. Oleh itu, apabila anda mendapat beberapa data yang dimiliki kepada salah satu daripada aplikasi ini, data yang ditandakan dengan yang pelabuhan ia sebenarnya hendaklah dihantar bersama-sama dengan. Jadi ini berkata, oh, I kepunyaan ke pelabuhan 1000. Saya tahu maka saya perlu hantar bersama-sama dengan pelayar web saya. Jadi sebab itu berkaitan di sini adalah bahawa pelayan web cenderung untuk mendengar pada port 80. Oleh itu, apabila saya hubungi Facebook.com, saya berkomunikasi dengan beberapa mesin. Tetapi saya perlu mengatakan yang mana pelabuhan yang mesin saya mahu berkomunikasi dengan. Dan pelayan web cenderung untuk menjadi mendengar pada port 80. Jika mereka mahu, mereka boleh menetapkan sehingga jadi ia menyenaraikan sebagai pada port 7000. Dan kemudian dalam pelayar web, saya boleh secara manual menaip Facebook.com: 7000 untuk menghantar permintaan ke port 7000 web server Facebook. DAVID J. MALAN: Dan dalam kes ini, walaupun walaupun kami tidak memerlukan orang sebut ini, dalam kes ini, apa pelabuhan akan permintaan itu sebenarnya pergi ke? Cuba lagi. Tepat sekali. Tidak mencari, tetapi kehalusan yang yang terdapat di sana tidak ada yang lepas. ROB Bowden: Jadi HTTPS, kerana ia mendengar khusus untuk disulitkan, ia pada port 4430. PENONTON: Dan e-mel adalah 25, bukan? DAVID J. MALAN: Outbound e-mel, 25, yep. ROB Bowden: Saya tidak tahu kebanyakan - semua orang-orang yang lebih rendah cenderung untuk menjadi dikhaskan untuk sesuatu. Saya fikir segala-galanya di bawah 1024 dikhaskan. PENONTON: Mengapa kamu katakan 3 adalah nombor yang salah? ROB Bowden: Kerana dalam alamat IP, ada empat kumpulan digit. Dan mereka 0-255. Jadi 192.168.2.1 adalah biasa rangkaian tempatan alamat IP. Notis semua daripada mereka adalah kurang daripada 255. Oleh itu, apabila saya bermula dengan 300, yang tidak mungkin mempunyai menjadi salah satu nombor. DAVID J. MALAN: Tetapi itu klip bodoh dari - adalah ia CSI, di mana mereka mempunyai nombor yang terlalu besar untuk alamat IP. ROB Bowden: Sebarang pertanyaan mengenai perkara ini? Yang akan datang, perubahan begitu lengkap dalam topik, tetapi kita mempunyai pelbagai PHP untuk rumah-rumah di quad. Dan kita mempunyai senarai tidak tertib. Dan kita mahu mencetak setiap item senarai hanya mengandungi nama rumah. Oleh itu, kita mempunyai gelung foreach. Jadi ingat, sintaksis adalah foreach pelbagai item dalam array. Jadi melalui setiap lelaran gelung, rumah akan mengambil salah satu daripada nilai-nilai di dalam array. Pada yang pertama lelaran, rumah akan Cabot House. Pada lelaran, rumah kedua akan menjadi Kurier House dan sebagainya. Jadi bagi setiap quad sebagai rumah, kami hanya akan mencetak - anda juga boleh bergema - item senarai dan nama rumah itu dan kemudian tutup item senarai. Pendakap kerinting adalah pilihan di sini. Dan kemudian kita berkata dalam soalan sendiri, ingat untuk menutup senarai tidak tertib tag. Oleh itu, kita perlu untuk keluar daripada mod PHP untuk melakukan ini. Atau kita boleh bergema menutup senarai tidak tertib tag. DAVID J. MALAN: Juga denda di sini akan telah menggunakan sekolah lama untuk gelung dengan $ i = 0 0 dan menggunakan tuduhan kepada memikirkan panjang sinar. Totally halus juga, hanya yang wordier sedikit. PENONTON: Jadi jika anda telah akan [Didengar], yang akan anda lakukan - Saya terlupa apa gelung [didengar] adalah. Anda akan $ quad kurungan i? DAVID J. MALAN: Tepat sekali. Ya, betul-betul. ROB Bowden: Apa-apa lagi? DAVID J. MALAN: Baiklah. Keseimbangan. Jadi terdapat tandan jawapan mungkin bagi setiap satu. Kami benar-benar hanya mencari sesuatu yang mendesak kepada satu terbalik dan satu kekurangan. Dan nombor 16 bertanya, mengesahkan pengguna input pelanggan-sampingan, seperti JavaScript, bukan pelayan, seperti dengan PHP. Jadi apa yang merupakan satu peningkatan sebanyak melakukan pelanggan-sampingan? Nah, salah satu perkara yang kita dicadangkan adalah yang anda mengurangkan kependaman, kerana anda tidak perlu bersusah payah menghubungi pelayan, yang mungkin mengambil masa beberapa milisaat atau beberapa saat dengan mengelakkan itu dan hanya mengesahkan pengguna input pelanggan-sebelah mencetuskan satu pengendali di submit dan hanya menyemak, adakah mereka jenis sesuatu dalam nama? Adakah mereka menaip sesuatu di alamat e-mel? Adakah mereka memilih asrama dari menu drop-down? Anda boleh memberi mereka maklum balas serta-merta menggunakan komputer gigahertz yang atau apa sahaja yang mereka mempunyai itulah sebenarnya di atas meja mereka. Jadi ia hanya pengguna yang lebih baik mengalami biasanya. Tetapi satu kekurangan yang menjalankan pelanggan-sampingan pengesahan, jika anda melakukannya tanpa juga melakukan pengesahan pelayan-sampingan ialah sesiapa yang paling keluar dari CS50 tahu bahawa anda hanya boleh menghantar sebarang data yang ingin kepada pelayan apa-apa cara. Terus terang, dalam kebanyakan pelayar apa-apa, anda boleh klik di dalam tetapan dan hanya mematikan JavaScript, yang akan, oleh itu, melumpuhkan sebarang bentuk pengesahan. Tetapi anda juga mungkin ingat bahawa walaupun saya lakukan beberapa perkara batin dalam kelas menggunakan telnet dan sebenarnya berpura-pura menjadi pelayar dengan menghantar mendapatkan permintaan kepada pelayan. Dan itu pasti tidak menggunakan mana-mana JavaScript. Itu hanya saya menaip arahan pada keyboard. Jadi benar-benar, mana-mana pengaturcara dalam cukup keselesaan dengan web dan HTTP boleh menghantar apa sahaja data dia mahu ke pelayan tanpa pengesahan. Dan jika pelayan anda tidak juga memeriksa, Adakah mereka yang memberi saya nama, adalah sebenarnya alamat e-mel yang sah yang ini, adakah mereka memilih asrama, anda mungkin berakhir sehingga memasukkan palsu atau hanya data kosong ke dalam pangkalan data anda, yang mungkin tidak akan menjadi satu perkara yang baik jika anda menganggap ia adalah di sana. Jadi ini adalah satu realiti yang menyakitkan hati. Tetapi secara umum, pelanggan-sampingan pengesahan adalah besar. Tetapi ia bermakna dua kali ganda kerja. Walaupun terdapat memang wujud pelbagai perpustakaan, JavaScript perpustakaan untuk contoh, yang membuat sebanyak ini, lebih kurang sakit kepala. Dan anda boleh menggunakan semula beberapa kod pelayan, klien-sampingan. Tetapi menyedari bahawa ia biasanya kerja-kerja tambahan. Yeah. PENONTON: Jadi, jika kita hanya kata kurang selamat - DAVID J. MALAN: [KETAWA] Ugh. Mereka sentiasa lebih keras orang-orang yang mengadili. ROB Bowden: Itu akan telah diterima. DAVID J. MALAN: Apa? ROB Bowden: Saya telah mencipta masalah ini. Yang akan diterima. DAVID J. MALAN: Yeah. PENONTON: Percuma. ROB Bowden: Tetapi kita tidak menerima untuk yang pertama - baik, apa yang kami cari adalah sesuatu seperti anda tidak perlu berkomunikasi dengan pelayan. Kami tidak menerima hanya lebih cepat. PENONTON: Bagaimana tidak memuat semula halaman? ROB Bowden: Ya. Itu adalah jawapan yang diterima. DAVID J. MALAN: Apa-apa di mana kami merasakan ia adalah lebih mungkin daripada tidak mungkin bahawa anda tahu apa yang anda berkata, yang merupakan yang sukar talian untuk menarik kadang-kadang. Dengan menggunakan senarai berpaut dan bukan daripada pelbagai untuk mengekalkan senarai integer disusun. Jadi terbalik satu kita sering memetik dengan dikaitkan senarai yang bermotivasi keseluruhan mereka pengenalan adalah anda mendapatkan dinamisme. Mereka boleh berkembang. Mereka boleh mengecut. Jadi anda tidak perlu melompat melalui gelung untuk benar-benar mencipta memori lebih dengan array. Atau anda tidak perlu hanya mengatakan, maaf, pengguna. Array itu diisi. Pertumbuhan begitu dinamik senarai. Satu keburukan walaupun senarai dikaitkan? PENONTON: Ia linear. Mencari di senarai bersambung adalah linear bukan apa yang anda log masuk DAVID J. MALAN: Tepat sekali. Mencari di senarai berpaut linear, walaupun ia disusun, kerana anda boleh hanya ikuti serbuk roti, ini petunjuk, dari permulaan senarai ke akhir. Anda tidak boleh memanfaatkan akses rawak dan, dengan itu, carian binari, walaupun ia disusun, yang anda boleh lakukan dengan array. Dan juga ada kos lain. Yeah. PENONTON: Memori yang tidak cekap? DAVID J. MALAN: Yeah. Well, saya tidak akan semestinya mengatakan tidak cekap. Tetapi ia menelan belanja lebih banyak memori, kerana anda memerlukan 32 bit untuk setiap nod bagi penunjuk tambahan pada kurangnya untuk senarai secara tunggal dikaitkan. Sekarang, jika anda hanya menyimpan integer dan anda menambah penunjuk, itu sebenarnya jenis bukan remeh. Ia dua kali ganda jumlah memori. Tetapi dalam realiti, jika anda menyimpan satu Senarai berkait structs yang mungkin 8 bait, 16 bait, lebih-lebih daripada itu, mungkin ia kurang kos marginal. Tetapi ia kos yang tetap. Jadi, sama ada dari orang-orang akan tunggu menjadi halus sebagai kelemahan. 18. Menggunakan PHP dan bukannya C untuk menulis program baris arahan. Jadi di sini, ia sering lebih cepat untuk menggunakan bahasa seperti PHP atau Ruby atau Python. Anda hanya cepat membuka sebuah editor teks. Anda mempunyai banyak lagi fungsi-fungsi disediakan untuk anda. PHP mempunyai sinki dapur fungsi, manakala dalam C, anda mempunyai sangat, sangat sedikit. Malah, lelaki yang tahu dengan cara yang sukar bahawa anda tidak mempunyai jadual hash. Anda tidak mempunyai dikaitkan senarai. Jika anda mahu mereka, anda perlu melaksanakannya sendiri. Jadi, satu terbalik PHP atau benar-benar apa-apa bahasa ditafsirkan adalah kepantasan yang anda boleh menulis kod. Tetapi keburukan, kita melihat ini apabila saya cepat disebat sehingga misspeller yang pelaksanaan dalam berceramah dengan menggunakan PHP, adalah yang menggunakan bahasa yang ditafsirkan biasanya lebih perlahan. Dan kita melihat bahawa boleh ditunjukkan dengan meningkat dalam masa daripada 0.3 saat untuk 3 saat, kerana tafsiran yang benar-benar berlaku. Satu lagi terbalik adalah bahawa anda tidak perlu menyusun. Jadi ia juga mempercepatkan pembangunan secara kebetulan, kerana anda tidak perlu dua langkah untuk menjalankan program. Anda hanya perlu satu. Dan supaya cukup menarik juga. Menggunakan pangkalan data SQL dan bukannya fail CSV untuk menyimpan data. Pangkalan data SQL Jadi digunakan untuk pset7. Fail CSV anda tidak menggunakan banyak. Tetapi anda digunakan ia secara tidak langsung dalam pset7 sebagai baik dengan bercakap dengan Yahoo Kewangan. Tetapi CSV adalah seperti fail Excel tetapi super mudah, di mana ruangan adalah hanya demarked dengan koma dalam daripada fail sebaliknya teks. Dan menggunakan pangkalan data SQL adalah yang lebih menarik. Ia terbalik, kerana anda mendapat perkara yang seperti memilih dan memasukkan dan memadam. Dan anda mendapat, mungkin, indeks yang MySQL dan pangkalan data yang lain, seperti Oracle, membina untuk anda dalam ingatan, yang bermakna pilih anda mungkin tidak akan menjadi atas linear ke bawah. Ini sebenarnya akan menjadi sesuatu seperti carian binari atau sesuatu sama dalam semangat. Jadi mereka biasanya lebih cepat. Tetapi keburukan adalah bahawa ia hanya lebih banyak kerja. Ia usaha yang lebih. Anda perlu memahami pangkalan data. Anda perlu membinanya. Anda memerlukan pelayan untuk menjalankan pangkalan data atas. Anda perlu memahami bagaimana untuk menatarajah. Jadi ini hanya ini jenis keseimbangan. Satu fail CSV, anda boleh menciptakannya dengan gedit. Dan anda baik untuk pergi. Tidak ada kerumitan lebih dari itu. Menggunakan indone bukannya jadual hash dengan chaining berasingan untuk menyimpan kamus perkataan mengingatkan daripada pset5. Jadi cuba terbalik, dalam teori sekurang-kurangnya, adalah apa? Masa tetap, sekurang-kurangnya jika anda sambil berbincang pada setiap individu surat dalam perkataan, seperti anda mungkin ada untuk pset5. Yang mungkin menjadi lima Hash, enam Hash jika ada lima atau enam huruf dalam perkataan. Dan itu cukup baik. Dan jika ada had atas bagaimana panjang kata-kata anda mungkin, itu masa memang berasimptot berterusan. Manakala jadual hash dengan berasingan chaining, masalah di sana dengan yang jenis struktur data ialah Prestasi algoritma anda biasanya bergantung kepada beberapa perkara sudah dalam struktur data. Dan yang pasti kes dengan rantai, di mana barangan lebih banyak anda meletakkan ke dalam jadual hash, lebih lama mereka rantaian pergi, yang bermaksud dalam yang paling teruk kes, perkara yang anda mungkin mencari adalah semua jalan di hujung satu dari orang-orang rantai, yang berkesan anaknya itu adalah turun ke dalam sesuatu yang linear. Sekarang, dalam amalan, ia boleh benar-benar kes yang jadual hash dengan rantai adalah lebih cepat daripada yang sepadan pelaksanaan indone. Tetapi itu atas pelbagai sebab, antara yang cuba menggunakan banyak keseluruhan memori yang boleh, sebenarnya, perkara yang perlahan ke bawah, kerana anda tidak mendapatkan yang bagus manfaat sesuatu yang dinamakan caching, mana perkara-perkara yang dekat bersama-sama dalam ingatan boleh diakses sering lebih cepat. Dan kadang-kadang anda boleh datang dengan fungsi hash benar-benar baik. Walaupun anda perlu membuang sedikit memori, anda mungkin, sesungguhnya, dapat mencari sesuatu yang cepat dan tidak seburuk linear. Jadi ringkasnya, tidak semestinya dengan mana-mana satu atau dua perkara-perkara tertentu yang kita cari. Benar-benar apa-apa meyakinkan sebagai terbalik dan Kelemahan biasanya menarik perhatian kami. ROB Bowden: Jadi bagi yang terbalik, kita lakukan tidak menerima dengan sendiri "lebih pantas." Anda terpaksa mengatakan sesuatu mengenainya. Walaupun anda berkata secara teori lebih cepat, kami tahu yang anda jenis difahami bahawa itu 0 of 1. Dan jadual hash, dalam teori, bukan 0 daripada 1. Menyebut apa-apa mengenai runtime secara amnya mendapat anda mata. Tetapi "lebih cepat," kebanyakan penyelesaian yang pada lembaga besar yang telah cuba adalah objektif perlahan daripada penyelesaian yang berada jadual hash. Jadi lebih cepat dalam dan dengan sendirinya tidak benar-benar benar. DAVID J. MALAN: Dom de dom dom. Saya mungkin saya satu-satunya yang menyedari itu bagaimana yang sepatutnya dilafazkan, bukan? ROB Bowden: Saya sebenarnya tidak tahu. DAVID J. MALAN: Ia dibuat rasa dalam kepala saya. ROB Bowden: Saya melakukan satu ini. OK. Jadi ini adalah salah satu di mana anda terpaksa menarik gambar rajah yang sama dengan anda mungkin telah melihat dalam peperiksaan yang lepas. Jadi mari kita hanya melihat ini. Jadi dari nod HTML, kita mempunyai dua kanak-kanak, kepala dan badan. Oleh itu, kita cawangan - kepala dan badan. Kepala mempunyai tag tajuk. Jadi kita mempunyai tajuk. Sekarang, satu perkara yang ramai orang terlupa adalah bahawa nod teks adalah elemen dalam pokok ini. Jadi di sini kita berlaku untuk menarik mereka sebagai oval untuk membezakan mereka daripada semua jenis nod. Tetapi notis juga di sini kami mempunyai, tengah dan bawah akan berakhir menjadi nod teks. Jadi melupakan mereka adalah agak daripada satu kesilapan yang sama. Badan itu mempunyai tiga orang anak - ketiga-tiga divs. Jadi div, div, div dan kemudian teks yang kanak-kanak nod dari orang-orang divs. Yang cukup banyak ia bagi soalan. DAVID J. MALAN: Dan ia diperhatikan, walaupun kita tidak kekal di atas ini maklumat di dalam masa yang kita belanjakan JavaScript, bahawa perintah itu tidak, dalam Malah, perkara dari segi teknikal. Jadi, jika kepala datang sebelum badan dalam HTML, maka ia akan muncul kepada meninggalkan badan dalam DOM sebenar. Bahawa beliau adalah, secara umum, hanya FYI, sesuatu yang dinamakan perintah dokumen, di mana ia perkara. Dan jika anda telah melaksanakan penghurai yang, satu program yang membaca HTML dalam bangunan naik ke atas pokok dalam ingatan, untuk menjadi jujur, itulah gerak hati mungkin apa yang anda melakukan anyway - atas ke bawah, kiri ke kanan. ROB Bowden: Soalan pada itu? Yang perlu saya lakukan yang akan datang? DAVID J. MALAN: Pasti. ROB Bowden: OK. Jadi ini adalah penampan ditakluki soalan serangan. Perkara utama untuk mengenali di sini adalah, dengan baik, bagaimana mungkin helah musuh program ini dalam melaksanakan kod sewenang-wenangnya? Jadi argv1, baris arahan pertama hujah untuk program ini, yang boleh sewenang-wenangnya panjang. Tetapi di sini kita menggunakan memcpy untuk menyalin argv1, yang di sini adalah bar. Kami lulus ia sebagai hujah. Dan jadi ia mengambil bar nama. Jadi kita memcpying bar ke dalam buffer ini c. Berapa banyak bait kita menyalin? Nah bytes bar bagaimanapun banyak berlaku kepada menggunakan, panjang hujah itu. Tetapi c hanya 12 bytes luas. Jadi, jika kita menaip hujah baris arahan itulah lebih lama daripada 12 bait, kami akan melimpah ini penampan tertentu. Sekarang, bagaimana musuh mungkin menipu program ke dalam melaksanakan kod sewenang-wenangnya? Jadi ingat bahawa di sini utama memanggil foo. Dan demikian maka panggilan utama foo. Mari kita menarik ini. Jadi kita mempunyai timbunan kami. Dan utama mempunyai bingkai tindanan di bahagian bawah. Pada satu ketika, panggilan utama foo. Nah, dengan serta-merta, panggilan utama foo. Dan sebagainya foo mendapat bingkai tindanan sendiri. Sekarang, pada satu ketika, foo akan kembali. Dan pergi pulangan foo, kita perlu tahu sekurang- apa baris kod dalam kita utama adalah untuk tahu di mana kita harus menyambung semula di utama. Kita boleh memanggil foo dari keseluruhan sekumpulan tempat yang berbeza. Bagaimana kita tahu di mana untuk kembali? Nah, kita perlu menyimpan di tempat itu. Jadi tempat yang betul di sini, kami menyimpan di mana kita harus kembali untuk sekali pulangan foo. Dan ini adalah alamat kembali. Jadi bagaimana musuh mungkin mengambil kesempatan ini adalah hakikat bahawa penampan ini c disimpan, mari kita berkata, di sini adalah c. Oleh itu, kita mempunyai 12 bait untuk c. Ini adalah c. Dan ini adalah cincin timbunan foo ini. Jadi jika pengguna berniat jahat memasuki lebih bait daripada 12 atau mereka memasukkan arahan yang hujah baris itu melebihi 12 watak-watak, maka kita akan melimpah penampan ini. Kita boleh terus berterusan. Dan pada satu ketika, kita pergi jauh cukup bahawa kita mula penggantian alamat kembali ini. Jadi sebaik sahaja kami menulis ganti alamat kembali, ini bermakna bahawa apabila foo pulangan, kami kembali ke mana sahaja yang pengguna berniat jahat memberitahu kepada oleh apa nilai ia memasuki, dengan apa jua watak-watak pengguna yang dimasukkan. Dan jadi jika pengguna berniat jahat sedang terutamanya bijak, dia boleh mempunyai ini kembali ke suatu tempat di printDef fungsi atau di suatu tempat di malloc yang fungsi, hanya di mana sahaja sewenang-wenangnya. Tetapi lebih bijak adalah apa yang jika dia mempunyai pengguna kembali ke sini. Dan kemudian anda mula melaksanakan ini sebagai baris kod. Jadi pada ketika itu, pengguna boleh memasukkan apa yang dia mahu ke rantau ini. Dan dia mempunyai kawalan sepenuhnya program anda. Soalan pada itu? Jadi soalan berikutnya adalah lengkap reimplementation daripada foo dalam apa-apa cara yang bahawa ia tidak lagi terdedah. Jadi ada beberapa cara anda boleh melakukan ini. Kami masih mempunyai c hanya menjadi panjang 12. Anda boleh menukar ini sebagai sebahagian daripada penyelesaian anda. Kami juga menambah cek untuk membuat bar pasti tidak null. Walaupun anda tidak perlu yang bagi kredit penuh. Oleh itu, kita sedang menyemak yang pertama di panjang rentetan bar. Jika ia lebih besar daripada 12, maka sebenarnya tidak melakukan salinan. Jadi, itu salah satu cara untuk memperbaikinya. Satu lagi cara menetapkan ia bukan mempunyai c hanya menjadi panjang 12, mempunyai ia menjadi panjang strlen (bar). Satu lagi cara menetapkan ia adalah untuk benar-benar hanya kembali. Jadi, jika anda baru sahaja mendapat menghapuskan semua ini, jika anda baru sahaja dipadam semua baris kod, anda akan mendapat kredit penuh, kerana fungsi ini tidak adakah sebenarnya mencapai apa-apa. Ia menyalin baris arahan hujah ke dalam beberapa pelbagai dalam bingkai tindanan tempatan. Dan maka perkara itu kembali. Dan apa sahaja yang berjaya hilang. Jadi pulangan juga yang mencukupi cara untuk mendapatkan kredit penuh. DAVID J. MALAN: Tidak cukup semangat daripada soalan tetapi boleh diterima satu spec tetap. ROB Bowden: Soalan di mana-mana itu? Satu perkara yang anda sekurang-kurangnya diperlukan telah menyusun kod. Jadi, walaupun secara teknikal anda tidak terdedah jika kod anda tidak menyusun, kita tidak menerima bahawa. Ada soalan? OK. DAVID J. MALAN: Adakah anda mahu untuk mengatakan gelaran ini? ROB Bowden: No DAVID J. MALAN: Jadi dalam satu ini, ini adalah sama ada berita baik atau berita buruk. Ini betul-betul masalah yang sama sebagai kuiz yang pertama. Dan ia hampir sama masalah kerana pset1. Tetapi ia telah sengaja dipermudahkan menjadi piramid yang lebih mudah, yang dapat menjadi diselesaikan dengan sedikit lelaran mudah. Dan benar-benar, apa yang kita telah mendapat sekurang- di sini tidak begitu banyak logik, kerana mungkin, pada tahap ini, anda lebih selesa daripada anda pada minggu satu dengan untuk gelung atau mengapa gelung, tetapi benar-benar untuk mengusik selain yang anda sedikit selesa dengan tanggapan bahawa PHP bukan sahaja tentang apa yang pengaturcaraan. Ia sebenarnya boleh digunakan sebagai bahasa untuk menulis program baris arahan. Dan sesungguhnya, itulah yang kita cuba untuk menarik perhatian anda kepada. Ini adalah program PHP baris arahan. Jadi kod C di sini, manakala betul dalam C, tidak betul untuk PHP. Tetapi kod benar-benar adalah yang sama. Jika anda membandingkan penyelesaian untuk Kuiz 0 terhadap Kuiz 1, anda akan mendapati bahawa ia hampir serupa, kecuali beberapa tanda-tanda dolar dan bagi ketiadaan sejenis data. Khususnya, jika kita lihat di sini, anda akan melihat bahawa kita melelar, dalam ini kes, dari 1 hingga 7. Kami boleh melakukannya 0 indeks. Tetapi kadang-kadang, saya fikir ia hanya mental lebih mudah untuk berfikir tentang perkara-perkara 1-7. Jika anda mahu satu blok, kemudian dua blok, kemudian tiga, maka dot, dot, dot tujuh. Kami telah j yang dimulakan 1 dan kemudian mengharapkan sehingga i. Dan segala-galanya di sini ialah jika tidak sama. Tetapi wajar diperhatikan ialah beberapa perkara. Kami memberi anda kedua-dua baris, ini pertama satu, goofily dinamakan sebagai shebang yang untuk bang tajam. Dan yang hanya menyatakan jalan yang benar, yang folder, di mana program yang boleh mendapati bahawa anda mahu menggunakan untuk mentafsir fail ini. Dan kemudian baris selepas itu, satu Sudah tentu, bermakna memasuki mod PHP. Dan garis di bahagian paling bawah bermakna keluar mod PHP. Dan ini kerja-kerja, secara amnya, dengan ditafsirkan bahasa. Ia adalah jenis menjengkelkan jika anda menulis program dalam satu fail dipanggil foo.php. Dan kemudian pengguna anda hanya perlu ingat, OK, untuk menjalankan program ini, saya perlu menaip "ruang php foo.php." Jenis menjengkelkan jika apa-apa lagi. Dan ia juga mendedahkan bahawa program anda ditulis dalam PHP, yang tidak semua yang jelas bagi para pengguna. Jadi, anda boleh keluarkan. Php sama sekali ingat dari kuliah. Dan anda sebenarnya boleh lakukan. / Foo jika anda chmodded ia dengan menjadikannya boleh laku. Jadi chmod a + x foo akan berbuat begitu. Dan jika anda juga menambah shebang di sini. Tetapi benar-benar, masalah itu telah mendapat sekurang- mencetak sesuatu seperti ini. Tiada HTML, tiada C-kod pasti, hanya beberapa PHP. Jadi Milo kemudian kembali dalam masalah 25. Dan dalam 25, anda telah diberi berikut kod rangka, yang merupakan satu Laman web agak mudah. Dan yang berair HTML-bijak turun di sini, di mana kita mempunyai dalam badan bentuk yang mempunyai ID yang unik input dalam yang merupakan dua input, satu dengan idea nama, satu dengan idea butang. Yang pertama adalah jenis teks, kedua jenis hantar. Dan jadi kami memberikan anda, sebenarnya, lebih bahan-bahan daripada yang anda diperlukan, hanya supaya anda semua mempunyai pilihan dengan yang untuk menyelesaikan masalah ini. Anda tidak tegas perlu semua ID ini. Tetapi ia membolehkan anda untuk menyelesaikan dalam cara yang berbeza. Dan sehingga di bahagian atas, notis yang Objektif ini adalah untuk mencetuskan Windows seperti ini - Hello, Milo! - muncul dalam pelayar menggunakan super mudah, jika tidak hodoh, fungsi amaran. Dan sebagainya, akhirnya, ini bisul konsep entah bagaimana mendengar untuk penghujahan bentuk pelanggan-sampingan , Bukan pelayan, entah bagaimana bertindak balas kepada penyerahan bahawa dengan meraih nilai pengguna yang ditaip masuk ke bidang nama, dan kemudian memaparkan ia dalam badan amaran. Jadi salah satu cara anda boleh melakukan ini adalah dengan jQuery, yang kelihatan sedikit sintaksis membingungkan pada mulanya. Anda boleh melakukan ini dengan kod DOM tulen - document.getelement oleh ID. Tetapi mari kita lihat versi ini. Saya mempunyai beberapa penting baris pertama. Jadi satu, kita mempunyai barisan ini, yang sama dengan apa yang anda mungkin telah melihat dalam, saya percaya, form2.html dari kelas pada minggu 9. Dan ini adalah hanya mengatakan, melaksanakan kod berikut apabila dokumen itu bersedia. Ini menjadi penting hanya kerana Laman HTML dibaca atas ke bawah, kiri ke kanan. Oleh itu, jika anda cuba untuk melakukannya sesuatu dalam kod di sini untuk beberapa DOM unsur, beberapa tag HTML, itu turun di sini, anda melakukannya terlalu lama lagi, kerana ini telah tidak dibacakan ke dalam ingatan. Jadi dengan mengatakan document.ready ini line, kita katakan, inilah beberapa kod, pelayar. Tetapi tidak melaksanakan ini sehingga keseluruhan dokumen bersedia, iaitu DOM yang pokok wujud dalam ingatan. Yang ini adalah sedikit lebih terus-terang, jika sintaksis yang sedikit berbeza, di mana yang saya katakan, merebut elemen HTML yang unik pengecam adalah input. Itulah yang tag hash menandakan, ID yang unik. Dan kemudian saya memanggil. Hantar. Jadi. Mengemukakan di sini adalah fungsi yang, jika tidak, dikenali sebagai kaedah, itu bahagian dalam objek itu di tangan meninggalkan sebelah sana yang saya tidak menyerlahkan. Jadi, jika anda berfikir input sebagai objek dalam ingatan - dan sememangnya ia. Ia adalah satu nod dalam pokok - . Mengemukakan cara apabila borang ini dengan ID ini dikemukakan, melaksanakan kod berikut. Saya tidak peduli apa nama fungsi adalah saya melaksanakan. Jadi di sini saya menggunakan, seperti sebelum ini, apa yang dipanggil fungsi lambda itu atau seorang fungsi tanpa nama. Ia tidak di semua intelektual lain yang menarik daripada yang tidak mempunyai nama, yang adalah baik jika anda hanya pernah akan memanggil sekali. Dan di dalam sana saya sebenarnya mengendalikan pengemukaan borang. Saya mula-mula mengisytiharkan pembolehubah dipanggil nilai. Dan kemudian apa yang kesan ini menekankan bahagian di sini sekarang? Apakah yang dilakukan di sebuah yang tinggi untuk saya? PENONTON: Ia mendapat nilai bahawa pengguna tidak dalam HTML di bawah. Ia mendapat ID itu dan kemudian mendapati nilai itu. DAVID J. MALAN: Tepat sekali. Ia dimenangi nod, yang unik pengecam adalah nama. Ia mendapat nilai di dalamnya, yang adalah, mungkin, apa yang pengguna ditaip dirinya sendiri. Dan kemudian ia menyimpan bahawa dalam ubah dipanggil nilai. Sebagai mengetepikan, anda boleh mempunyai juga melakukan ini sedikit berbeza. Totally diterima dengan melakukan sesuatu yang nilai dusta var mendapat document.getElementById. Dan ini adalah mengapa ia sedikit membosankan untuk tidak menggunakan jQuery. "Nama". Nilai. Jadi benar-benar boleh diterima. Cara yang berbeza untuk melakukan ini. jQuery hanya cenderung untuk menjadi sedikit lebih ringkas dan pasti lebih popular kalangan pengaturcara. Sekarang, saya melakukan sedikit kewarasan yang cek, kerana dalam masalah ini Penyataan kita dengan jelas berkata, jika pengguna belum lagi ditaip beliau menamakan, tidak menunjukkan isyarat satu. Tetapi anda boleh menyemak untuk itu, dengan hanya memeriksa string kosong untuk quote-unquote jika ada apa-apa sebenarnya di sana. Tetapi jika ia tidak sama dengan quote-unquote, Saya mahu panggil amaran. Dan yang menarik di sini ialah kita menggunakan operator campur, yang melakukan apa yang di hidupkan? Concatenate. Jadi rasanya PHPs operator dot. Idea yang sama, sintaksis yang sedikit berbeza. Dan saya hanya mewujudkan rentetan yang anda melihat pada pukulan skrin - Hello, jadi dan sebagainya. Dan kemudian butiran yang terakhir adalah ini. Mengapa saya kembali di dalam palsu fungsi tanpa nama ini? PENONTON: Tidak ada nilai. Memasukkannya ke dalam bentuk. Ia hanya berkata, jika nilai tidak sama dengan kosong, maka melakukannya. Terdapat kosong di dalam penyerahan itu. DAVID J. MALAN: OK. Berhati-hati walaupun. Tidak ada seorang pun di sini. Dan bahawa penyata palsu di luar daripada jika keadaan. Jadi baris ini diserlahkan, pulangan palsu, melaksanakan tidak kira apa apabila borang yang dikemukakan. Apa yang kembali di dalam palsu ini acara pengendali, kerana ia dipanggil, acara yang berkenaan menjadi penyerahan? PENONTON: Kerana ia hanya berlaku sekali. DAVID J. MALAN: Hanya berlaku sekali. Tidak cukup. Yeah? PENONTON: Ia menghalang borang daripada mengemukakan kepada kelakuan lalai, yang akan menjadikan reload halaman. DAVID J. MALAN: Tepat sekali. Jadi saya lebih muatan jangka mengemukakan di sini, kerana saya cakapkan, bentuk adalah dikemukakan. Tetapi seperti yang anda cadangkan, ia sebenarnya tidak telah dikemukakan dengan cara HTTP sebenar. Apabila anda klik Hantar, kerana kita Pengendali onSubmit, kami memintas bahawa penghantaran borang jadi untuk bercakap. Kami kemudian melakukan perkara kami dengan kod JavaScript. Tetapi saya sengaja pulang palsu, kerana apa yang saya tidak mahu berlaku yang sesaat kemudian adalah untuk keseluruhan borang yang sendiri yang perlu dikemukakan ke web pelayan dengan pasangan nilai utama dengan menukar URL untuk sesuatu seperti q = kucing atau apa sahaja yang kita lakukan, misalnya, di dalam kelas. Saya tidak mahu itu berlaku, kerana tidak ada mendengar pelayan untuk ini membentuk penyerahan. Ia semata-mata dilakukan dalam kod JavaScript. Dan sebab itu saya tidak pun mempunyai tindakan menyifatkan borang saya, kerana saya tidak berniat untuk ini pernah pergi ke pelayan. Jadi ia dikemukakan. Tetapi kita memintas bentuk yang penyerahan dan mencegah lalai tingkah laku, yang sebenarnya adalah untuk pergi semua perjalanan ke pelayan. PENONTON: Jadi memeliharanya pelanggan-sampingan. DAVID J. MALAN: Penyimpanan ia pelanggan-sampingan. Tepat betul. Sehingga seterusnya ialah saya oh MySQL. ROB Bowden: OK. Jadi soalan pertama ini pada umumnya kasar bagi orang-orang. Walaupun orang-orang yang kemudian pergi lebih baik. Jadi, anda mempunyai untuk memilih data yang betul jenis bagi kedua-dua ruangan ini. Dan kedua-dua ini mempunyai beberapa perkara tentang mereka yang membuat pilihan yang sukar. Jadi int tidak yang sah menaip untuk nombor. Ini kerana akaun 12 digit nombor, int yang tidak cukup besar untuk menyimpan jumlah digit. Jadi pilihan yang sah akan menjadi besar int jika anda berlaku untuk mengetahui bahawa. Satu lagi pilihan boleh menjadi medan char yang panjangnya 12. Jadi, sama ada dari orang-orang akan bekerja. Int tidak. Kini, kira-kira, berfikir kembali ke pset7. Jadi kita khusus digunakan perpuluhan untuk menyimpan nilai saham atau - DAVID J. MALAN: Tunai. ROB Bowden: Tunai. Kami menggunakan perpuluhan untuk menyimpan jumlah tunai yang pengguna masa ini mempunyai. Jadi sebab kita melakukan yang kerana, ingat, terapung. Ada titik terapung di tepat. Ia tidak boleh tepat menyimpan tunai nilai-nilai seperti kita mahu di sini. Jadi perpuluhan mampu tepat kedai sesuatu untuk, katakan, dua tempat perpuluhan. Itulah sebabnya kira-kira, kita mahu ia sebagai perpuluhan dan tidak terapung. DAVID J. MALAN: Dan juga, juga, walaupun ia mungkin telah pandai dalam lain konteks untuk berfikir, mungkin ini adalah peluang untuk int an. Saya hanya akan mengesan perkara dalam beberapa sen. Kerana kita jelas menunjukkan lalai nilai menjadi 100.00, yang bermakna ia hanya boleh menjadi satu int. Dan kehalusan lain juga dengan bilangan ialah ia tidak bermaksud menjadi soalan helah. Tetapi ingat bahawa int dalam MySQL, seperti dalam C, sekurang-kurangnya dalam perkakas, adalah 32-bit. Dan walaupun kita tidak mengharapkan anda untuk tahu berapa banyak angka yang cara, jangan ingat bahawa bilangan terbesar anda boleh mewakili berpotensi dengan beberapa 32-bit adalah lebih kurang apa? Apakah nombor yang kita selalu berkata? 2 kepada 32, iaitu apa yang kurang? Anda tidak perlu tahu dengan tepat. Tetapi secara kasar adalah membantu dalam kehidupan. Ia kira-kira 4 bilion. Oleh itu, kita berkata bahawa beberapa kali. Saya tahu saya telah berkata beberapa kali. Dan ia adalah lebih kurang 4 bilion. Dan itu satu peraturan yang baik ibu jari tahu. Jika anda mempunyai 8 bit, 256 adalah nombor ajaib. Jika anda mempunyai 32 bit, 4 bilion memberi atau mengambil. Jadi jika anda hanya menulis 4 bilion, anda akan melihat bahawa itu lebih sedikit daripada angka 12, yang bermaksud bahawa adalah jelas tidak ekspresi cukup untuk menguasai Nombor akaun 12 digit. ROB Bowden: OK. Jadi orang-orang yang lain pergi lebih baik. Jadi andaikan bahawa bank mengenakan bulanan $ 20 yuran penyelenggaraan ke atas semua akaun. Dengan apa pertanyaan SQL boleh bank memotong $ 20 dari setiap kiraan, walaupun ia menyebabkan beberapa baki negatif? Jadi, pada asasnya, terdapat empat jenis utama pertanyaan - memasukkan, pilih, mengemaskini, dan memadam. Jadi apa yang kita fikir kita akan menggunakan di sini? Kemaskini. Jadi mari kita membaca. Jadi di sini kita sedang mengemaskini. Apa jadual kita mengemaskini akaun? Jadi mengemaskini akaun. Dan kemudian sintaks berkata, apa yang dalam akaun kita mengemas kini? Nah, kita menetapkan keseimbangan yang sama kepada nilai semasa imbangan tolak 20. Jadi ini akan mengemas kini semua baris akaun, menolak $ 20 daripada kira-kira. DAVID J. MALAN: Satu kesilapan biasa di sini, walaupun kita kadang-kadang ia memaafkan, adalah untuk benar-benar mempunyai kod PHP di sini memanggil fungsi pertanyaan atau meletakkan sebut harga sekitar semua yang tidak perlu berada di sana. ROB Bowden: Ingat bahawa MySQL adalah bahasa yang berasingan daripada PHP. Kami berada menulis MySQL dalam PHP. Dan PHP kemudiannya menghantarnya kepada pelayan MySQL. Tetapi anda tidak perlu PHP untuk berkomunikasi dengan pelayan MySQL. DAVID J. MALAN: Tepat sekali. Jadi tidak pembolehubah dengan tanda-tanda dolar seharusnya berada di dalam konteks ini. Ia hanya boleh melakukan semua matematik dalam pangkalan data itu sendiri. ROB Bowden: OK. Jadi yang akan datang. Adakah ini yang akan datang? Yeah. Jadi dengan apa pertanyaan SQL boleh bank mendapatkan nombor akaun yang pelanggan kaya, mereka yang baki yang lebih daripada 1,000? Jadi yang mana satu di empat jenis utama kita akan mahu di sini? Pilih. Oleh itu, kita mahu untuk memilih. Apa yang kita mahu pilih? Apa ruangan yang kita mahu untuk memilih? Kami secara khusus akan mahu untuk memilih nombor. Tetapi jika anda berkata bintang, kita juga diterima itu. Jadi pilih nombor dari apa jadual? Akaun. Dan maka keadaan yang kita mahu? Di mana keseimbangan yang lebih besar daripada 1,000. Kami juga diterima lebih besar daripada atau sama. Terkini. Dengan apa pertanyaan SQL boleh bank rapat, iaitu, memotong setiap akaun yang mempunyai baki sebanyak $ 0? Jadi yang mana satu di empat kita akan mahu untuk digunakan? Padam. Jadi sintaks untuk itu? Memotong daripada apa jadual? Akaun. Dan maka keadaan di mana kami mahu memadam - di mana kira-kira sama dengan sifar. Jadi memadam semua baris dari akaun mana baki adalah sifar. Soalan pada mana-mana? Ingin beratur? DAVID J. MALAN: Panduan Queue. Jadi dalam satu ini, kami memberikan anda yang agak struktur biasa yang kita sedang mengkaji sedikit di dalam kelas bersama daripada structs, iaitu data yang struktur yang berkaitan dalam roh. Perbezaan walaupun dengan barisan adalah yang kami terpaksa entah bagaimana ingat yang berada di hadapan barisan, dalam besar sebahagian supaya kita boleh membuat lebih banyak kecekapan penggunaan memori, sekurang-kurangnya jika kita menggunakan array. Kerana ingat, jika kita mempunyai satu pameran, jika, misalnya, ini adalah hadapan giliran, jika saya mendapat ke dalam barisan itu di sini, dan kemudian seseorang mendapat selaras di belakang saya, belakang saya, belakang saya, dan seorang langkah keluar dari barisan, anda boleh, seperti yang kita lihat beberapa manusia sukarelawan di dalam kelas, semua orang mempunyai beralih cara ini. Tetapi secara umum, setelah semua orang melakukan sesuatu yang tidak penggunaan terbaik masa dalam program, kerana ia bermakna anda algoritma sedang berjalan dalam apa masa berjalan asimptot? Ia linear. Dan saya rasa seperti itu jenis bodoh. Jika orang yang seterusnya dalam talian adalah seterusnya orang yang sepatutnya pergi ke dalam kedai, mereka tidak semua mempunyai untuk bergerak bersama-sama. Hanya membiarkan orang itu dipetik off apabila tiba masanya, misalnya. Oleh itu, kita boleh menjimatkan sedikit masa di sana. Dan untuk berbuat demikian walaupun, cara yang bahawa kepala barisan atau hadapan giliran akan secara beransur-ansur bergerak lebih mendalam dan lebih mendalam ke dalam array dan akhirnya mungkin sebenarnya membalut di sekitar jika kita menggunakan pelbagai untuk menyimpan orang dalam barisan ini. Jadi, anda hampir boleh memikirkan pelbagai sebagai data pekeliling struktur dalam erti kata itu. Jadi, anda entah bagaimana perlu mengesan Saiz atau benar-benar akhir itu dan kemudian di mana permulaan ia. Oleh itu, kita mencadangkan supaya anda mengisytiharkan satu giliran itu, panggilan ia q, hanya satu huruf. Kemudian kami mencadangkan hadapan menjadi dimulakan dengan sifar dan bahawa saiz akan dimulakan dengan sifar. Jadi sekarang, tiada apa-apa dalam barisan itu. Dan kami meminta anda untuk melengkapkan pelaksanaan enqueue di bawah dalam apa-apa cara bahawa fungsi menambah n untuk akhir q dan kemudian kembali benar. Tetapi jika q penuh atau negatif, fungsi dan bukannya perlu kembali palsu. Dan kami memberikan anda pasangan andaian. Tetapi mereka tidak benar-benar berfungsi relevan, hanya bool yang wujud, kerana, dari segi teknikal, bool tidak wujud dalam C melainkan jika anda termasuk file header tertentu. Supaya hanya pastikan ada telah tidak adalah ini helah jenis soalan benda. Jadi enqueue, kita dicadangkan dalam sampel penyelesaian untuk melaksanakan seperti berikut. Satu, kita periksa memudahkan, buah-buahan rendah gantung. Jika barisan penuh atau nombor yang anda cuba untuk memasukkan kurang daripada sifar, yang kita kata dalam spesifikasi masalah ini perlu tidak dibenarkan, kerana kami hanya mahu nilai-nilai bukan negatif, maka anda perlu hanya pulangan palsu serta-merta. Jadi beberapa agak mudah kesilapan memeriksa. Jika walaupun anda ingin menambah bahawa sebenar nombor, anda terpaksa melakukan sedikit berfikir di sini. Dan ini adalah di mana ia sedikit menjengkelkan mental, kerana anda perlu memikirkan bagaimana untuk mengendalikan Sampul. Tetapi kuman idea di sini itu daripada kepentingan kepada kita adalah Sampul yang sering membayangkan aritmetik modular dan pengendali arena, bahagian peratus, di mana anda boleh pergi dari nilai yang lebih besar kembali ke sifar dan kemudian satu dan dua dan tiga dan kemudian kembali sekitar kepada sifar, satu dan dua dan tiga dan sebagainya lagi dan lagi. Jadi cara kita mencadangkan berbuat demikian adalah bahawa kita mahu index ke dalam pelbagai nombor yang mana integer kami berdusta. Tetapi untuk sampai ke sana, kita mahu melakukan apa sahaja saiz baris gilir ini hanyalah kemudian menambah bahawa apa sahaja yang hadapan senarai adalah. Dan kesan iaitu untuk meletakkan kami di kedudukan yang betul dalam barisan dan tidak menganggap bahawa orang yang pertama dalam baris adalah pada permulaan, yang dia atau dia benar-benar boleh jika kita juga beralih semua orang. Tetapi kami hanya mewujudkan kerja untuk diri kita sendiri jika kita mengambil jalan yang tertentu. Oleh itu, kita boleh menyimpannya agak mudah. Kami perlu ingat bahawa kita hanya ditambah int untuk barisan. Dan kemudian kita kembali benar. Sementara itu, dalam dequeue, kami bertanya anda untuk melakukan yang berikut. Melaksanakannya dalam apa-apa cara yang dequeues, iaitu kali jauhnya dan pulangan, int di hadapan baris gilir. Untuk mengeluarkan int, ia mencukupi untuk melupakannya. Anda tidak perlu untuk mengatasi sedikit itu. Jadi ia masih sebenarnya di sana. Sama seperti data pada cakera keras, kami hanya mengabaikan hakikat yang kini ia di sana. Dan jika q kosong, kita harus sebaliknya kembali negatif 1. Jadi ini berasa sewenang-wenangnya. Mengapa kembali negatif 1 bukan palsu? Yeah. PENONTON: Q menyimpan nilai-nilai positif. Kerana anda hanya menyimpan nilai-nilai positif dalam q, negatif adalah ralat. DAVID J. MALAN: OK, benar. Jadi kerana kita hanya menyimpan positif nilai-nilai atau sifar, maka ia adalah baik untuk kembali nilai negatif sebagai sentinel yang nilai, simbol khas. Tetapi anda menulis semula sejarah di sana, kerana sebab kami hanya kembali nilai-nilai bukan negatif adalah kerana kita mahu mempunyai nilai sentinel. Jadi lebih khusus, mengapa tidak hanya pulangan palsu dalam kes-kes kesilapan? Yeah. PENONTON: Anda telah gagal untuk kembali integer. DAVID J. MALAN: Tepat sekali. Dan ini adalah di mana C mendapat mengekang cantik. Jika anda mengatakan anda akan untuk kembali int, anda mempunyai untuk kembali int satu. Anda tidak boleh mendapatkan mewah dan mula kembali yang bool atau apungan atau tali atau sesuatu seperti itu. Sekarang, sementara itu, JavaScript dan PHP dan beberapa bahasa lain boleh, pada hakikatnya, telah anda kembali yang berbeza jenis nilai-nilai. Dan yang benar-benar boleh menjadi berguna, di mana anda dapat kembali Ints positif, sifar, Ints negatif, atau palsu atau batal walaupun untuk menandakan kesilapan. Tetapi kita tidak mempunyai serba boleh dalam C. Jadi dengan dequeue, apa yang kita sarankan untuk dilakukan adalah - ROB Bowden: Anda boleh kembali palsu. Ia hanya yang palsu adalah hash menentukan palsu kepada sifar. Jadi, jika anda pulangan palsu, anda kembali sifar. Dan sifar adalah satu perkara yang sah di dalam giliran kita, manakala negatif 1 tidak jika palsu kebetulan berada negatif 1. Tetapi anda tidak perlu juga perlu tahu bahawa. DAVID J. MALAN: Itu mengapa saya tidak mengatakan ia. ROB Bowden: Tetapi ia adalah tidak benar bahawa anda tidak boleh kembali palsu. DAVID J. MALAN: Pasti. Jadi dequeue, notis kita menerima tidak sah sebagai hujahnya. Dan itu kerana kita tidak lulus apa-apa masuk Kami hanya mahu mengeluarkan elemen di hadapan barisan. Jadi bagaimana kita boleh tidak melakukan ini? Well, pertama, mari kita buat ini cek kewarasan cepat. Jika saiz baris gilir adalah 0, ada tiada kerja yang perlu dilakukan. Kembali negatif 1. Selesai. Jadi itulah beberapa baris program saya. Jadi hanya empat baris kekal. Jadi di sini saya membuat keputusan untuk SUSUTAN saiz. Dan decrementing saiz berkesan bermakna saya melupakan sesuatu yang di sana. Tetapi saya juga perlu mengemaskini di mana hadapan nombor-nombor. Jadi untuk berbuat demikian, saya perlu untuk melakukan dua perkara. Saya mula-mula perlu ingat apa bilangan adalah di hadapan giliran, kerana saya perlu kembali perkara itu. Jadi, saya tidak mahu sengaja lupa mengenainya dan kemudian menulis ganti ia. Saya hanya akan ingat dalam int satu. Dan sekarang, saya ingin mengemaskini q.front untuk q.front +1. Jadi, jika ini adalah orang yang pertama di line, sekarang, saya mahu lakukan ditambah 1 untuk menunjukkan pada orang yang datang dalam talian. Tetapi saya perlu mengendalikan Sampul itu. Dan jika kapasiti adalah pemalar global, yang akan membolehkan saya untuk memastikan kerana saya menunjukkan kepada orang yang terakhir dalam talian, operasi modulo akan membawa saya kembali ke sifar pada hadapan barisan. Dan yang mengendalikan Sampul di sini. Dan kemudian saya meneruskan untuk kembali n. Sekarang, tegasnya, saya tidak perlu mengisytiharkan n. Saya tidak perlu merebutnya dan menyimpannya buat sementara waktu, kerana nilai adalah masih ada. Jadi saya hanya boleh melakukan aritmetik yang betul untuk kembali bekas ketua barisan. Tetapi saya hanya merasakan bahawa ini adalah lebih jelas untuk benar-benar merebut int, meletakkannya dalam n, dan kemudian kembali yang demi kejelasan tetapi tidak ketat perlu. Psst. Mereka semua dpt diucapkan dalam kepala saya. ROB Bowden: Soalan Jadi pertama adalah masalah pokok binari. Soalan oleh itu adalah, kita diberi nombor-nombor ini. Dan kita mahu entah bagaimana memasukkan mereka ke dalam nod ini seperti bahawa ia adalah satu sah pokok carian binari. Jadi perkara yang perlu diingat tentang pokok carian binari adalah bahawa ia bukan Cuma perkara yang ke kiri adalah kurang dan perkara yang hak adalah lebih besar. Ia perlu bahawa seluruh pokok itu untuk sebelah kiri adalah kurang, dan keseluruhan pokok itu ke kanan adalah lebih besar. Jadi, jika saya meletakkan 34 di sini di bahagian atas, dan kemudian Saya meletakkan 20 di sini, jadi itu sah jadi ini, kerana 34 di sini. 20 akan ke kiri. Jadi, itu kurang. Tetapi saya tidak boleh kemudian meletakkan 59 di sini, kerana walaupun 59 adalah di sebelah kanan 20, ia masih di sebelah kiri 34. Maka dengan itu kekangan dalam fikiran, cara paling mudah mungkin menyelesaikan ini masalah adalah untuk hanya jenis daripada nombor-nombor - jadi 20, 34, 36, 52, 59, 106. Dan kemudian memasukkan mereka dari kiri ke kanan. Jadi 20 pergi di sini. 34 pergi di sini. 36 pergi di sini. 52, 59, 106. Dan anda juga boleh digambarkan dengan beberapa memasang di dalam dan menyedari, oh, tunggu, saya tidak mempunyai nombor yang cukup untuk mengisi ini di sini. Jadi saya perlu reshift apa saya nota laluan akan menjadi. Tetapi melihat bahawa dalam tiga perlawanan akhir, jika anda membaca dari kiri ke kanan, ia adalah di tertib menaik. Jadi sekarang, kita mahu mengaku apa yang struct akan menjadi bagi nod dalam pokok ini. Jadi apa yang kita perlukan dalam pokok binari? Oleh itu, kita mempunyai nilai jenis int, jadi beberapa nilai int. Saya tidak tahu apa yang kita dipanggil dalam penyelesaian - int n. Kita memerlukan penunjuk kepada anak kiri dan penunjuk kepada anak yang betul. Jadi ia akan kelihatan seperti ini. Dan ia benar-benar akan melihat sebelum bilakah yang berkaitan duanya adalah terpakai barangan senarai, jadi notis - Saya akan perlu untuk skrol semua perjalanan pulang ke masalah 11. Jadi menyedarinya kelihatan sama dengan ini, kecuali kita hanya berlaku untuk memanggil ini nama yang berbeza. Kami masih mempunyai integer nilai dan dua petunjuk. Cuma bukan merawat petunjuk sebagai menunjuk kepada perkara yang akan datang dan perkara yang lepas, kita melayan petunjuk untuk menunjuk kepada seorang kanak-kanak kiri dan kanak-kanak yang betul. OK. Jadi, itu nod struct kami. Dan kini, satu-satunya fungsi kita perlu melaksanakan untuk ini adalah traverse, yang kami mahu pergi ke atas pokok, percetakan keluar nilai-nilai pokok yang teratur. Jadi mencari di sini, kita mahu untuk mencetak keluar 20, 34, 36, 52, 59, dan 106. Bagaimana kita mencapai itu? Jadi ia agak sama. Jika anda melihat dalam peperiksaan yang lalu masalah ini yang anda mahu untuk mencetak keseluruhan pokok dengan koma di antara segala-galanya, ia sebenarnya juga lebih mudah daripada itu. Jadi di sini adalah penyelesaian. Ini adalah jauh lebih mudah jika anda melakukannya secara rekursif. Saya tidak tahu sesiapa yang cuba untuk melakukannya secara berulang. Tetapi pertama, kami mempunyai kes asas kami. Bagaimana jika akar itu adalah batal? Maka kita hanya akan kembali. Kita tidak mahu untuk mencetak apa-apa. Yang lain kita akan merentasi secara rekursif ke bawah. Cetak anak pohon yang kiri keseluruhan. Jadi mencetak semua kurang daripada nilai semasa saya. Dan kemudian saya akan mencetak sendiri. Dan kemudian saya akan recurse turun saya keseluruhan anak pohon betul, jadi segala-galanya lebih besar daripada nilai saya. Dan ini akan mencetak segala-galanya teratur. Soalan tentang bagaimana ini sebenarnya Kuasa melakukan itu? PENONTON: Saya mempunyai satu soalan pada [didengar]. ROB Bowden: Jadi salah satu cara untuk mendekati sebarang masalah rekursi adalah untuk hanya berfikir mengenainya suka anda perlu berfikir tentang semua kes sudut. Jadi menganggap bahawa kita mahu mencetak keseluruhan pokok ini. Jadi kita semua akan memberi tumpuan kepada adalah nod tertentu ini - 36. Panggilan rekursif, kita berpura-pura mereka yang baru bekerja. Jadi di sini, panggilan ini rekursif untuk traverse, kita tanpa berfikir mengenainya, hanya menyeberangi kiri tiga, bayangkan yang sudah mencetak 20 dan 34 untuk kita. Dan kemudian apabila kita akhirnya secara rekursif memanggil traverse di betul, yang betul akan mencetak 52, 59, dan 106 untuk kita. Jadi memandangkan ini boleh mencetak 20, 34, dan yang lain boleh mencetak 52, 59, 108, semua kita perlu berupaya lakukan adalah cetak diri kita di tengah-tengah itu. Jadi mencetak semua di hadapan kita. Cetak diri kita, maka cetak nod semasa 36, printf biasa, dan kemudian mencetak semua selepas kita. DAVID J. MALAN: Ini adalah di mana rekursi akan benar-benar cantik. Ia lompat ini hebat iman di mana anda melakukan sedikit sedikit saja dalam kerja. Dan kemudian anda membiarkan seseorang lagi yang lain. Dan sesiapa yang adalah, ironinya, anda. Jadi bagi mata brownies yang serius, jika anda tatal ke atas kepada soalan-soalan - ROB Bowden: Pada soalan? DAVID J. MALAN: Dan ke bawah sedikit untuk nombor, adakah sesiapa yang tahu di mana nombor-nombor ini datang? ROB Bowden: Saya betul-betul tidak tahu. DAVID J. MALAN: Mereka muncul sepanjang kuiz. PENONTON: Adakah mereka nombor yang sama? DAVID J. MALAN: Nombor-nombor tersebut. Satu telur Paskah sedikit. Jadi bagi anda menonton talian di rumah, jika anda boleh memberitahu kami melalui e-mel kepada heads@CS50.net implikasinya ini berulang enam nombor-nombor sepanjang Kuiz 1, kita akan mandi anda dengan perhatian yang luar biasa di akhir kuliah dan bola tekanan. Nice, halus. ROB Bowden: Mana-mana soalan terakhir apa sahaja kuiz?