>> 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?