DAVID MALAN: Baiklah.
Jadi ini adalah CS50, dan ini adalah kini awal minggu tiga.
>> Jadi sampai sekarang, kita kena telah menulis program dalam C
yang kelihatan sedikit sesuatu seperti ini di sini.
Jadi kami mempunyai beberapa tajam termasuk di bahagian atas.
Kami ada int, utama, tidak sah, dan maka sesuatu yang boleh dilakukan di tengah-tengah,
beberapa sedikit kod dalam fungsi itu.
Tetapi penting adalah hakikat bahawa kita telah mengatakan tidak sah di sini.
Jadi tidak sah, semua masa ini, dinyatakan oleh bahawa program ini, apabila berjalan,
hanya boleh dijalankan melalui namanya.
Anda tidak boleh menaip apa-apa perkataan lain atau nombor selepas nama program ini apabila
menguruskannya.
Maka, misalnya, jika program tersebut ialah disusun ke dalam fail yang dipanggil hello,
anda boleh melakukan ./hello, tetapi yang ia.
>> Satu-satunya cara yang anda boleh memberi input kepada program ini
adalah dengan memanggil fungsi.
Sebagai contoh, apa fungsi kita telah menggunakan setakat ini
untuk mendapatkan input daripada pengguna?
>> PENONTON: Dapatkan tali.
DAVID MALAN: Untuk mendapatkan tali, atau mendapatkan int, atau anda telah melihat orang lain,
walaupun anda tidak menggunakan mereka lagi, seperti mendapatkan lama, panjang dan sebagainya.
Tetapi katalah kita sebenarnya ingin memulakan
program bertulis yang lebih sedikit serba boleh, dan, terus-terang, lebih sedikit
seperti arahan bahawa anda telah telah mendapatkan, mudah-mudahan,
sedikit biasa dengan.
Seperti ruang cd Dropbox.
Ini, sememangnya, perubahan direktori anda, dengan anggapan
anda berada dalam rumah John Harvard direktori, ke folder Dropbox anda.
Sementara itu, arahan seperti ini mewujudkan direktori baru yang dipanggil pset2,
seperti yang anda mungkin sudah atau tidak lama lagi bagi masalah akan menetapkan dua.
Buat Hello, sudah tentu, adalah perintah yang membina program yang dikenali sebagai hello
dari fail yang dipanggil hello dot c.
Dan di setiap kes, kini, kami telah mempunyai
menyediakan hujah pada apa yang dikenali sebagai baris arahan, cepat berkelip,
jadi make yang tahu apa yang akan dibina, dan sebagainya mkdir yang tahu apa folder untuk mencipta,
dan sebagainya cd yang tahu di mana anda mahu pergi.
Tetapi sehingga kini, kita terus mengatakan itu, fungsi utama lalai anda,
mempunyai ungkapan tidak sah di dalam kurungan mereka,
yang bermakna bahawa ia tidak boleh mengambil apa-apa hujah.
>> Jadi bermula hari ini, apa yang kita akan lakukan
adalah, kita akan memulakan menyokong hal-hal seperti ini walaupun.
Malah, dalam kes ini, yang anda tidak biasanya menaip secara manual,
Membuat telah melakukan ini bagi kami, tidak ada
satu tetapi satu, dua, tiga tambahan tali selepas program itu bernama
dilafaz.
Jadi bagaimana kita mencapainya?
>> Nah, bermula hari ini, dalam kes-kes di mana kita mahu
memberi input melalui yang dikenali sebagai baris arahan,
kita akan mula menambah di sini apa yang ada di yellow--
menggantikan terbatal dengan int argc koma rentetan argv pendakap kurungan terbuka dekat.
Sekarang ini adalah menarik untuk beberapa sebab.
Satu, ia akan membiarkan kita menulis program yang sedikit lebih dinamik.
Tetapi, lebih ia amat, ia akan membuka
kini perbualan untuk apa yang benar-benar boleh tatasusunan
digunakan, tali apa yang benar-benar adalah di bawah hud,
sehingga minggu depan apabila kita mula menyelam dalam walaupun lebih mendalam tentang bagaimana mesin adalah
membuat semua kerja barangan ini.
Tetapi untuk sekarang, mari kita menarik, mungkin, gambar.
>> Apabila anda menulis program dengan mengisytiharkan utama
dengan cara ini, seperti yang utama mengambil dua hujah, int satu
dan- jenis data hujah kedua?
>> PENONTON: Array.
DAVID MALAN: Array.
Jadi ia kelihatan pada pandangan pertama seperti ia adalah satu tali, tetapi notis kurungan persegi.
Ingat masa lalu kami memperkenalkan tanggapan array.
Dan tatasusunan menggunakan kurungan persegi dalam beberapa konteks.
Anda mungkin menggunakan kuasa dua kurungan untuk pergi ke dalam array
dan mendapatkan unsur tertentu, seperti pendakap atau kurungan 0 1 atau kurungan 2.
Tetapi kita lihat, jika secara ringkas, minggu lepas bahawa anda juga
menggunakan kurungan persegi untuk mengisytiharkan saiz array,
jika anda tahu terlebih dahulu berapa banyak ints atau berapa banyak tali atau apa sahaja yang anda
sebenarnya mahu.
Jadi ternyata di luar sana yang konteks ketiga di sini
yang tidak mempunyai bilangan dalam daripada kurungan persegi.
Apabila anda tentukan, kerana saya ada di sini, nama sesuatu seperti argv,
yang hanya satu cara mewah daripada berkata vektor hujah, yang
adalah satu lagi cara yang mewah daripada berkata pelbagai hujah,
kurungan terbuka kurungan rapat hanya bermakna anda tidak semestinya
tahu terlebih dahulu berapa besar array akan menjadi,
tetapi anda tahu ia akan menjadi array.
Jadi, jika anda tidak tahu bilangan tidak meletakkan ia di sana,
untuk pendakap kurungan terbuka rapat bermakna argv tidak rentetan,
tetapi pelbagai tali.
Jadi sintaksis, jika anda berfikir kembali minggu lepas,
ia sangat serupa dengan mengatakan sesuatu seperti int umur kurungan terbuka,
dan kemudian sesuatu selepas itu.
Jadi apakah ini kelihatan seperti?
Mari kita benar-benar menarik gambar.
Oleh itu, apabila anda menjalankan program ini dengan Utama setelah dua hujah yang ditakrifkan dalam
dari orang-orang kurungan, anda dasarnya mempunyai sekurang-kurangnya dua ketulan
memori diserahkan kepada anda di bawah hood.
Satu, kerana saya akan menarik sebagai segi empat tepat ini, akan dipanggil argc.
Dan hanya sebagai recap cepat, apa jenis data daripada argc?
Jadi ia satu int.
Jadi bilangan yang akan pergi dalam giliran argc--
bahawa bermaksud kiraan hujah.
Sementara itu, saya telah disediakan argv sebagai array.
Dan saya tidak tahu berapa lama ia akan menjadi,
jadi untuk tujuan hari ini dot dot dot.
Ia mungkin akan mendapat beberapa panjang.
Tetapi saya digambarkan di sini sekurang-kurangnya empat segi empat tepat.
Jadi argv sebahagian memori yang menyimpan tali tali tali dot dot dot,
dan argc hanya salah satu sebahagian ingatan untuk integer.
>> Jadi sekarang, mari kita menjadi sedikit lebih tepat.
Jika, apabila saya mempunyai tali dalam pelbagai ini, yang dipanggil
argv, saya ingin mendapatkan pada mereka secara individu, sama seperti minggu lepas,
kita akan menggunakan notasi seperti argv kurungan 0
untuk mendapatkan perkara pertama array.
Argv kurungan 1 untuk mendapatkan Perkara kedua, dan sebagainya.
Kunci di sini kerana kami masih 0 indexed-- kami masih mengira dari 0.
Jadi sekarang mari kita sebenarnya meletakkan sesuatu dalam hal ini.
Jika saya untuk menyusun program yang dikenali sebagai hello dari fail yang dipanggil hello dot c,
dan kemudian saya menjalankan program yang dengan titik mengurangkan hello,
apakah komputer, komputer riba saya saya, kelihatan seperti di bawah hood
masa ini saya jalankan dot mengurangkan khabar dan tekan Enter?
Nah, ini mungkin apa yang kita boleh menggambarkan
sebagai kandungan komputer anda memori, atau ingatan RAM-- Random Access.
Dalam erti kata lain, komputer, entah bagaimana ajaib untuk anda,
meletakkan nombor 1 dalam argc, AKA argcount, dan ia meletakkan literal tali
./hello dalam argv kurungan 0.
Saya tidak tahu, terus-terang, apa yang dalam argv kurungan 1 atau 2 atau 3,
kerana jika pengguna tidak mempunyai ditaip apa-apa selain ./hello,
kita akan menganggap bahawa ini nilai-nilai sampah kemungkinan besar,
jadi untuk bercakap.
Mereka ketulan memori wujud, tetapi ia tidak terpulang kepada kita
untuk melihat mereka, kerana argcount hanya satu.
>> Sekarang, sementara itu, jika saya menulis menjalankan program yang lain,
cd, yang lebih baik perintah, dalam ruang cd prompt-- berkelip anda
Dropbox-- apabila saya berjalan itu, dengan berkesan, apabila program cd itu berlari, argc,
di dalam memori komputer saya, adalah untuk briefest yang paling kedua nombor 2.
Dan kemudian argv kurungan o mempunyai cd, argv kurungan 1 mempunyai Dropbox,
dan kemudian tentu arahan selesai, jadi kesemua memori ini
pada dasarnya hilang dan digunakan untuk sesuatu yang lain.
Dan itulah sebabnya saya katakan hanya berpecah kedua.
>> Sementara itu, jika kita melakukan mkdir pset2, gambar kelihatan hampir sama,
tetapi dengan tali yang berbeza di dalam argv.
Jika saya lakukan dilafaz dash hello hello dot c, idea sama.
Lebih banyak barangan diisi untuk argv dan argc, sudah tentu, adalah 4.
Jadi dalam erti kata lain, walaupun pelbagai ini
mungkin dot dot dot, beberapa panjang berubah-ubah, jadi untuk bercakap,
anda sentiasa tahu di mana akhir itu adalah, kerana argc akan memberitahu anda
apa-bila anda perlu berhenti mencari unsur-unsur dalam argv.
Anda hanya boleh melihat empat dalam jumlah dalam kes ini.
>> Jadi mari kita kini kita lihat, mungkin, satu program yang mudah.
Satu yang hanya berkata hello kepada seseorang seperti Zamyla.
Jadi saya menuntut saya akan menulis satu program yang hanya dalam masa yang melalui yang saya boleh lakukan
./hello ruang Zamyla, dan kemudian saya mahu program saya mencetak sesuatu
super mudah seperti "hello, Zamyla."
Sekarang pada masa lalu kita telah menggunakan getstring.
Jadi pada masa lalu, walaupun anda baru kepada pengaturcaraan,
kemungkinan adalah anda boleh menyiapkan satu program yang menggunakan getstring
dan kemudian menggunakan printf untuk mengatakan hi untuk Zamyla.
Tetapi mari kita tidak menggunakan getstring masa ini.
Biar saya bukannya pergi ke Appliant dan boleh dilakukan termasuk standard saya O dot h.
Biar saya juga termasuk CS50 dot h.
Sekarang int utama, dan sekarang saya tidak akan melakukan tidak sah hari ini.
Sebaliknya, saya akan melakukan int argc rentetan argv kurungan terbuka kurungan rapat,
tidak menyatakan nombor.
Dan kini di sini saya dipanggil-lakukan.
Apa yang saya akan lakukan sekarang ialah, saya akan lakukan sedikit lonjakan iman,
Saya akan menganggap bahawa pengguna ini akan menggunakan program ini dengan betul,
dan saya hanya akan melakukan printf hello,% sn.
Jadi perkara baru di sana.
Tetapi saya ingin kini meletakkan apa sahaja perkataan jenis pengguna selepas nama program.
Jadi jika saya lakukan ruang ./hello Zamyla, saya mahu entah bagaimana pengaturcaraan akses
quote unquote "Zamyla." jadi saya boleh pergi ke dalam vektor hujah saya,
array saya tali, dan jika arahan, sekali lagi, adalah ruang ./hello Zamyla,
apa nombor saya mahu untuk dimasukkan ke dalam argv di sini?
PENONTON: 1.
DAVID MALAN: 1, kerana kurungan 0 ternyata
akan menjadi Nama program ini, seperti yang kita lihat.
Jadi kurungan 1 adalah perkataan pertama yang saya, pengguna, sudah menaip.
Saya akan pergi ke depan dan menyelamatkan ini.
Saya akan pergi ke folder saya di mana saya telah diletakkan fail ini.
Saya akan melakukan membuat hello 3.
OK Pert IO ini.
./hello Zamyla Enter.
Apa yang saya lakukan salah?
Saya terkejut diri saya hanya untuk masa di sana.
Apa yang saya lakukan salah?
>> PENONTON: Nama.
>> DAVID MALAN: Fail ini sebenarnya dipanggil hello3.c.
Dan saya melakukannya hanya untuk konsisten, kerana kita sudah
mempunyai hello.c dalam lalu dalam kod dalam talian.
Jadi mari kita menetapkan ./hello ini kurungan dash 3 Zamyla.
Enter.
Dan sekarang kita mempunyai hello, Zamyla.
Sementara itu, saya boleh menukar ini kepada menjadi Rob, atau benar-benar apa-apa perkataan yang lain.
>> Tetapi mari kita mempertimbangkan kes sudut.
Apa yang mungkin anda harapkan akan berlaku jika Saya tidak menaip nama sesiapa pun pada semua?
>> PENONTON: Ralat.
>> DAVID MALAN: Ralat sejenis, mungkin.
Mari kita lihat.
Enter.
Null.
Jadi printf sebenarnya menjadi pelindung sedikit daripada kita
di sini, dan secara literal mencetak Tanda kurung terbuka batal, tetapi perkara yang lebih teruk boleh berlaku.
Dan hanya untuk menunjukkan sesuatu yang anda benar-benar
tidak perlu buat, mari kita pergi dalam di sini dan mula poking sekitar.
Betul?
Jika saya tahu bahawa gambar di dalam ingatan pada asasnya ini,
argv kurungan 1 mempunyai Zamyla, argv kurungan 0 mempunyai ./hello, atau ./hello-3.
Apa yang ada dalam kurungan 2?
Jadi saya boleh menjawab bahawa menyoal diri saya, bukan?
Saya hanya boleh menukar 1 kepada 2.
Saya kini boleh susun semula hello 3, ./hello3 Mari mengezum masuk dan tekan Enter.
Whoops.
Tiada tanda quote.
Menarik.
Jadi itulah jenis sejuk untuk lihat apa lagi yang di sini.
>> Jadi apa lagi yang berada di dalam komputer riba saya?
Mari kita simpannya dengan kurungan 3.
Buat hello3, ./hello-3.
Ingin tahu.
Dan sekarang mari kita benar-benar bold-- 50.
Jadi itu benar-benar menyelam mendalam ke dalam ingatan komputer saya.
50 dalam indeks.
Oleh itu, hello 3 ./hello-3.
Ingin tahu.
Baiklah, sekarang saya hanya akan mendapat melulu.
Mari kita pergi ke 5,000.
Baiklah.
Jadi biarlah saya susun semula.
Buat hello3, ./hello-3.
OK.
Kini sebahagian daripada anda, mungkin terdapat menjadi bola lampu terkeluar.
Berapa ramai daripada anda mempunyai lihat mesej ini?
OK.
Jadi, mengapa?
>> Odds are-- dan ada yang berbeza perkara yang boleh menyebabkan ini,
dan jelas anda berada dalam baik company-- kita perlu jelas
disebabkan apa yang dipanggil suatu kesalahan segmentasi.
Dan cerita panjang pendek untuk hari ini, saya telah menyentuh segmen memori
bahawa saya tidak sepatutnya.
Di mana segmen yang hanya bermakna sebahagian yang ingatan bahawa saya tidak sepatutnya.
Sekarang komputer menjamin bahawa jika saya menjalankan ./helloZamyla yang saya boleh menyentuh argv
menjadi kurungan 0 dan argv kurungan 1.
Tetapi argc adalah nilai 2, itu bererti saya hanya allowed-- ia semacam penghormatan
system-- menyentuh 0 kurungan dan kurungan 1.
Jika saya pergi mana-mana lebih jauh, ada benar-benar akan menjadi memori di sana.
RAM saya wujud secara fizikal dalam komputer.
Tetapi yang mengetahui apa yang ada?
Sesungguhnya, saya menjalankan beberapa program pada satu masa.
Saya mungkin mempunyai seen-- jika saya tidak melakukan ini pada Appliant
tetapi pada Mac atau PC-- saya mungkin mempunyai melihat kandungan e-mel.
Saya mungkin telah dilihat sekelip mesej saya telah dihantar baru-baru ini.
Apa-apa sahaja yang mungkin yang terlintas di dalam ingatan
boleh dilihat melalui ini sewenang-wenangnya notasi braket persegi.
Atau, lebih buruk lagi, anda mungkin mempunyai didapati salah satu kata laluan saya
yang saya baru-baru ini akan ditaip dalam, bahawa program telah disimpan di dalam memori supaya
untuk mengesahkan saya, dan maka hanya jenis meninggalkannya
dalam RAM sehingga saya berhenti program itu.
>> Dan sesungguhnya, ini adalah salah satu bahaya dan satu kuasa yang
menggunakan bahasa seperti C. Anda mempunyai akses penuh
kepada seluruh kandungan memori program ini,
dan apa yang jahat boleh walaupun lakukan di cases--
terutamanya apabila kita mendapatkan untuk pengaturcaraan web
ke arah akhir semester, kita akan semula topic-- ini mencucuk di sekitar,
berpotensi, seseorang dalam komputer memori dan mencari perkara-perkara yang ingin tahu seperti
seperti yang kita lihat di sana.
Atau lebih teruk lagi, kata laluan yang dia atau dia boleh gunakan untuk melakukan perkara-perkara yang tidak baik.
>> Jadi jelas saya tidak sepatutnya melakukan ini, kerana perkara-perkara pelik mula berlaku.
Sesungguhnya, ini adalah program terhempas.
Ini akan menjadi setaraf Mac OS atau Windows
tetingkap program hanya menghilang.
Ralat yang tidak dijangka telah berlaku.
Dalam persekitaran baris arahan yang kita melihat sesuatu seperti ini.
Tetapi itulah sebabnya, adalah saya menyentuh memori yang bukan milik saya.
>> Jadi mari kita mempertahankan terhadap ini sedikit dengan cara yang berbeza
dengan melihat program ini di sini.
Jadi, sekali lagi, rangka yang kita lihat earlier--
dan saya telah menekankan int masa ini.
Dan semua utama masa ini mempunyai sesungguhnya kembali nilai.
Walaupun di kebanyakan kuliah kami contoh kita tidak pernah pernah digunakan
kembali apa-apa dalam utama.
Kami hanya menulis printf rapat pendakap kerinting dan itu sahaja.
Tetapi secara percuma, apa yang penyusun lakukan untuk anda,
berkesan, kembali 0 untuk anda.
Menghidupkan out-- dan ia sedikit counterintuitive-- bahawa 0 adalah baik.
Ia tidak bermakna palsu semata-mata.
0 adalah baik, dan apa-apa yang tidak 0- nilai, dunia telah membuat keputusan,
boleh menandakan ralat.
Jadi jika anda pernah merosakkan sesuatu sehingga pada komputer anda,
atau program yang baru sahaja meninggal dunia pada anda dan anda telah mendapat beberapa tingkap salah
pada skrin anda, kesilapan berkata negatif 49 atau kesilapan 23--
beberapa value-- seolah-olah sewenang-wenangnya itu kerana seorang programmer telah berkod keras
nilai negatif seperti 49 atau positif 23 untuk mewakili mana-mana nombor, berani berkata,
daripada 4 bilion perkara yang mungkin yang mungkin berlaku dalam program.
>> Jadi bagaimana saya mungkin mengambil kesempatan ini sendiri?
Baiklah, biar saya membuka program yang saya tulis terlebih dahulu,
dan mencucuk di sekitar talian yang dipanggil hello 4.
Dan ia hampir sama, kecuali yang mendapat sedikit kesilapan semakan.
Dalam kes ini, saya sekali lagi diisytiharkan utama sebagai mengambil dua hujah,
tetapi kali ini, pada baris 17, notis Saya melakukan sedikit cek kewarasan.
Saya memastikan bahawa argc sama sama 2.
Kerana jika ia adalah, bahawa bermakna saya boleh dengan selamat
menyentuh bukan sahaja kurungan 0, tetapi kurungan 1.
Dan saya pergi ke hadapan dan mencetak, dalam kes ini, Zamyla atau Rob
atau apa sahaja perkataan yang saya menaip.
Dan kini hanya untuk mendapatkan sedikit lebih tepat,
Saya akan kembali dengan jelas 0 untuk menandakan semuanya berjalan dengan lancar.
Tiada apa-apa yang buruk berlaku.
>> Tetapi oleh konvensyen, saya akan kembali 1, atau apa-apa terus terang-0 bukan nilai,
jika sesuatu yang salah.
Kini pengguna tidak akan benar-benar melihat apa yang berlaku.
Malah jika saya pergi ke direktori ini, kita zum dalam dan jangan membuat hello 4,
./hello-4 Zamyla berkelakuan seperti yang saya harapkan.
Tetapi jika saya bukan tidak menaip apa-apa, apa-apa seolah-olah berlaku,
tetapi ia tidak crash.
Dan jika saya bukan melakukan sesuatu seperti Rob adalah proctor yang
dalam perkongsian Thayer-- maklumat sewenang-wenangnya.
Tetapi notis, argv 1, 2, 3, 4, dan 5 kini perlu wujud dalam ingatan.
Itu juga tidak apa yang program saya menjangka,
kerana saya telah diperiksa sama ada argc sama setaraf 2 atau tidak.
Jadi saya kini mempertahankan terhadap ini.
>> Sekarang, sebagai diketepikan, kita yang programmer-- atau sebaliknya kita users-- yang
tidak pernah melihat bahawa 0 atau 1 tetapi menggunakan alat dipanggil Debugger-, atau alat-alat lain,
seperti yang kita akan lihat sebelum panjang, anda pengaturcara
benar-benar dapat melihat apa yang mungkin menjadi yang salah di dalam program anda.
>> Jadi, mana-mana soalan di argc?
Yeah.
>> PENONTON: saya lihat di mana mereka tidak mempunyai watak, [didengar]
hanya berkata rentetan bintang d, seperti watak asterisk koma.
Adakah mereka sama di sini?
>> DAVID MALAN: Mereka.
Jadi persoalannya ialah, anda perlu program kadang-kadang dilihat
seperti ini yang tidak katakan tali argv kurungan
tetapi sebaliknya mengatakan sesuatu seperti char argv bintang kurungan.
Dan ada juga yang lain varian yang mungkin anda lihat.
Mereka memang setara.
Buat masa ini, kita mempunyai jenis roda latihan
di dalam bentuk rentetan dalam CS50 perpustakaan, tetapi dalam hanya lebih seminggu
atau supaya kita akan mengeluarkan yang halangan sama sekali dan benar-benar
melihat apa yang char dan bintang , dan bagaimana mereka berkaitan dengan memori
perwakilan amnya.
Oleh itu, kita akan kembali kepada itu.
>> Soalan-soalan lain di argv atau argc kita?
Yeah.
PENONTON: Mengapa ia kembali ralat [didengar]?
DAVID MALAN: Kenapa ia tidak kembali kesilapan only-- oh!
Dalam kes sebelum ini, apabila kita telah futzing sekitar dengan ingatan,
mengapa ia hanya kembali kesilapan apabila saya benar-benar ditaip satu jumlah yang besar?
Jawapan ringkasnya adalah, kita hanya mendapat bertuah.
Secara umumnya, komputer memperuntukkan ingatan dalam ketulan,
dan ia memberikan saya sebahagian yang cukup besar yang Saya terlepas, tanpa disedari,
pendakap menyentuh 2, kurungan 3, pendakap 50, tetapi sebaik sahaja saya menolak
nasib saya, saya pergi di luar sempadan sebahagian memori
sistem operasi telah memberikan saya.
Dan itu apabila ia diapit ke bawah dan berkata, tidak.
Ralat Segmentasi.
Yeah.
>> PENONTON: Bagaimana komputer tahu nilai argc?
>> DAVID MALAN: Bagaimana komputer tahu nilai argc?
Apabila anda menjalankan program, program itu, dengan sifat yang cepat berkelip,
diserahkan yang pelbagai perkataan yang telah ditaip
di segera, itu adalah ditaip pada segera itu.
Dan jadi ia adalah operasi anda sistem yang pada dasarnya
populates hujah utama untuk anda.
Jadi, salah satu perkhidmatan yang anda dapat, jenis diam-diam
di bawah hud sistem operasi.
Soalan-soalan lain?
Yeah.
>> PENONTON: Apakah dump teras bermakna?
DAVID MALAN: Apakah dump teras bermakna?
Jadi itu adalah satu soalan yang baik.
Dan biarlah saya pergi semula ke direktori ini di sini.
Dan anda akan melihat bahawa Saya mempunyai fail baru di sana.
Ia memang dipanggil teras, dan ia sebenarnya biasanya fail yang baik bersaiz.
Yang pada asasnya gambar kandungan memori program saya
atau RAM apabila ia terhempas.
Dan ini akan menjadi berguna, berpotensi, diagnostically,
sekali kita bercakap dalam syarahan masa depan dan seksyen mengenai debugging,
kerana anda sebenarnya boleh melakukan bersamaan bedah siasat digital
pada fail yang membantu untuk memikirkan apa yang anda lakukan salah dalam program anda.
Yeah.
>> PENONTON: Apakah argc arahan dalam sendiri, atau boleh anda nama itu apa-apa?
>> DAVID MALAN: Soalan yang baik.
Adalah argc perintah itu sendiri, atau anda boleh menamakan ia apa-apa?
Ia pasti tidak perintah.
Ia hanya pembolehubah ini menamakan atau nama hujah ini,
dan sebagainya benar-benar kita boleh memanggil foo ini,
kita boleh memanggil bar ini, yang cenderung menjadi go-kepada kata-kata yang komputer yang
ahli sains pergi ke.
Tetapi oleh konvensyen, kami menggunakan argc dan argv.
Tetapi itu hanya manusia konvensyen, tidak lebih.
Baiklah.
Jadi ternyata, saya telah memberitahu sedikit lie-- putih
dan terus-terang, pada masa akan datang, anda akan melihat kita telah bercakap bohong putih yang lain.
Tetapi untuk sekarang, kita akan untuk mengupas kembali salah satu.
Dalam kes ini di sini apabila saya sebelum ini berlari program seperti ./hello atau ./hello-3
Zamyla, kami mempunyai kandungan saya memori komputer mencari secara kasar seperti
ini.
Tetapi ingat apa rentetan adalah.
Apa yang kita katakan seminggu yang lalu apa yang rentetan sebenarnya adalah di bawah hud?
PENONTON: Array daripada aksara.
DAVID MALAN: Ia merupakan satu pelbagai aksara, bukan?
Oleh itu, kita mungkin mempunyai pelbagai tali, tetapi, sebaliknya, rentetan
adalah pelbagai watak.
Jadi jika saya benar-benar mahu menjadi dubur apabila saya menarik gambar ini,
Saya benar-benar perlu melukis ia sedikit lebih seperti ini,
di mana di setiap indeks array argv saya,
ada sendiri rentetan keseluruhan yang itu sendiri adalah dalam array.
Dan sekarang yang dusta putih kami memberitahu hari ini
adalah bahawa gambar yang tidak kelihatan agak seperti ini.
Malah, kuasa dua adalah sedikit biasanya di luar segi empat tepat besar
di sana.
Tetapi kita akan kembali kepada yang lama lagi.
Tetapi ini adalah ./hello garis sendeng terbalik 0, bahawa menjadi watak khas yang
demarcates akhir rentetan, dan kami mempunyai satu sama lain selepas
Nama Zamyla ini.
Jadi apa maknanya?
>> Baiklah, biar saya pergi ke depan dan membuka dua contoh lain
yang boleh didapati dalam talian.
Satu dipanggil argv1.c dan yang lain adalah argv2.
Ia adalah satu program super mudah yang adalah berbeza daripada program terdahulu
kerana kini saya menggunakan argc dan argv di sini.
Dan sekarang saya mengintegrasikan dengan gelung selaras 18, dari i = 0 pada sehingga argc.
Dan apa yang saya akan lakukan dengan baris kod ini di sini?
Dalam bahasa Inggeris.
Ini jelas menunjukkan penggunaan argc.
Tetapi dalam bahasa Inggeris, apakah ia lakukan sekiranya saya menjalankan program ini?
Yeah?
>> PENONTON: Ia akan mencetak anda skrin seberapa banyak kali yang anda mahu.
DAVID MALAN: Tepat sekali.
Jadi apa sahaja kata-kata saya taip pada segera, ia
akan muntah mereka pada saya satu bagi setiap baris.
Jadi mari kita pergi ke depan dan melakukan ini.
Biar saya pergi ke direktori saya dan melakukan membuat ./argv1 argv1.
Dan sekarang, marilah kita memastikan ia mudah.
Mari kita berbuat apa-apa pada mulanya.
Ia melakukan mencetak satu perkara, dan itu memang nama program ini,
kerana itulah dalam kurungan 0.
Jika saya kini mengatakan foo, ia akan berbuat kedua-dua, dan jika saya katakan bar foo,
ia akan mengatakan tiga perkara.
Sekarang ini agak menarik, mungkin.
Tetapi ingat bahawa argv adalah pelbagai tali,
tetapi rentetan adalah pelbagai aksara, supaya kita boleh mengambil perkara sehingga takuk
dan memohon supaya asas logik dan membuat kod yang
kelihatan sedikit lebih samar, diakui.
Tetapi dengan mempunyai bersarang gelung, sesuatu yang serupa
dengan apa yang anda mungkin ingat dari Mario, contohnya, jika anda melakukannya dengan cara ini.
>> Jadi sekarang perhatikan pada baris 19, saya lagi iterating lebih hujah-hujah saya,
dari 0 ke atas sehingga argc.
Dan kini dalam talian 21-- Saya pinjaman helah dari week-- lalu
Saya memeriksa apakah panjang argv kurungan i.
Saya menyimpan jawapan yang di n.
Dan kemudian saya mengintegrasikan dari j pada sehingga n, di mana j adalah dimulakan 0.
Jadi, konvensyen untuk pengiraan.
Sebaik sahaja anda telah menggunakan i, jika anda mempunyai gelung bersarang, anda tidak boleh menggunakan i lagi,
jika tidak, anda akan memukul berkali-kali, berpotensi, nilai di luar gelung dalam.
Jadi saya menggunakan j oleh konvensyen.
Kami mungkin menggunakan k.
Jika anda mempunyai lebih daripada k, anda mungkin mempunyai terlalu banyak sarang, biasanya.
Tetapi sekarang, saya perasan printf garis sedikit berbeza.
Saya tidak mencetak% s, saya mencetak% c, yang, sememangnya,
adalah pemegang tempat untuk char a.
>> Dan kini melihat sintaks ini.
Baru.
Kami tidak dilihat sebelum ini.
Tetapi secara logik, ini hanya bermaksud mendapatkan tali-i dalam argv
dan mendapatkan ke-j yang apa?
PENONTON: Watak.
DAVID MALAN: Watak dalam rentetan itu.
Jadi dengan menggunakan kurungan persegi diikuti dengan kurungan persegi,
ini adalah menyelam pertama ke dalam tali argv ini,
dan kemudian yang kedua kurungan persegi dengan j
adalah terjun ke dalam watak-watak bahawa rentetan tertentu dalam argv.
Dan kemudian, hanya untuk langkah yang baik, Saya mencetak garis baru di sini.
Jadi sekarang biarlah saya pergi ke hadapan dan membuka tetingkap yang lebih besar sedikit
supaya kita boleh melihat ini dalam tindakan.
Biar saya pergi ke dalam folder itu.
Dan kini melakukan membuat argv-2-- whoops-- membuat argv-2, ./argv 2.
Enter.
Dan ia adalah sukar sedikit untuk membaca secara menegak,
tetapi itu memang nama program, diikuti oleh garis kosong.
Sekarang, saya akan pergi ke hadapan dan melakukan foo.
Begitu sukar untuk dibaca, tetapi ia sesungguhnya mencetak satu aksara setiap baris.
Dan jika saya lakukan bar, kini ia mencetak talian mereka demi baris.
Jadi bisa dibesarkan di sini tidak begitu banyak bahawa, wow, melihat silap mata ini baru kemas
di mana anda boleh mendapatkan di kandungan aksara tertentu pelbagai ini,
tetapi bagaimana kita mengambil asas ini idea-idea seperti pengindeksan ke dalam array,
dan kemudian mengindeks ke dalam array yang berada di pelbagai itu,
dan hanya menggunakan idea-idea yang sama kepada contoh sedikit lebih canggih.
Tetapi asas-asas benar-benar tidak mempunyai berubah, bahkan sejak minggu lepas.
>> Ini adalah jenis yang tepat pada masanya, dalam itu, masih ingat, pada minggu sifar
kami bermain dengan buku telefon seperti ini.
Dan walaupun ini jelas keping fizikal kertas,
anda boleh jenis memikirkan buku telefon sebagai array.
Sudah tentu, jika anda adalah untuk reimplement ini keping keping kertas
dalam suatu komputer, mungkin anda akan menggunakan sesuatu
seperti array untuk menyimpan semua orang-orang nama dan nombor dari A sepanjang jalan
melalui Z. Jadi ini adalah bagus, kerana ia membolehkan kita peluang,
mungkin, untuk mempertimbangkan bagaimana anda mungkin sebenarnya melaksanakan sesuatu seperti itu.
Seperti siri pintu di sini.
Jadi jika saya could-- kita perlu satu sukarelawan untuk datang sehingga.
Mari kita lihat.
Satu wajah yang tidak dikenali mungkin, muka yang tidak dikenali mungkin.
Bagaimana pula dalam oren?
Di sini.
Baju oren, datang ke atas.
>> Mari kita pergi ke hadapan sekarang dan langkah pintu-pintu ini ke yang sebelah,
bergerak ini daripada cara untuk seketika.
Apa nama anda?
>> Ajay:
>> DAVID MALAN: Ajay.
Daud.
Nice untuk bertemu dengan kamu.
Baiklah.
Jadi kita mempunyai belakang enam pintu digital pada screen-- yang
atau, sebaliknya, tujuh pintu di screen-- sejumlah besar nombor.
Dan saya memberitahu anda apa-apa dalam advance-- bersetuju?
Ajay: Tiada apa-apa terlebih dahulu.
DAVID MALAN: Apa yang saya mahu anda lakukan sekarang ialah untuk mencari bagi saya, dan bagi kami,
benar-benar, bilangan 50, satu langkah pada satu masa.
>> Ajay: Nombor 50?
>> DAVID MALAN: Bilangan 50.
Dan anda boleh mendedahkan apa yang di belakang setiap pintu-pintu ini
hanya dengan menyentuhnya dengan jari.
Celaka. [Ketawa]
>> [Tepuk tangan]
>> Sangat baik dilakukan.
OK.
Kami mempunyai hadiah yang indah hadiah untuk anda di sini.
Pick anda filem kita dibincangkan minggu lepas.
>> Ajay: Oh, manusia.
Oh, saya tidak pernah melihat Spaceballs.
>> DAVID MALAN: Spaceballs.
Baiklah.
Jadi berpegang hanya satu masa.
How-- mari kita membuat ini yang moment-- boleh diajar
bagaimana anda pergi tentang mencari bilangan 50?
Ajay: Saya memilih secara rawak.
DAVID MALAN: Jadi anda memilih secara rawak dan mendapat bertuah.
Ajay: Ya.
DAVID MALAN: OK.
Cemerlang.
Jadi sekarang, anda tidak mempunyai mendapat bernasib baik, apa lagi
yang mungkin telah berlaku di sebalik pintu-pintu ini?
Jadi, jika saya pergi ke depan dan mendedahkan nombor-nombor ini di sini,
mereka benar-benar berada dalam susunan rawak.
Dan yang terbaik anda boleh mempunyai dilakukan, terus-terang, adalah dengan, akhirnya,
dalam kes paling teruk, memeriksa mereka semua.
Jadi, anda mendapat super-bertuah, yang tidak apa yang kita akan memanggil algoritma.
Ya, mengucapkan tahniah kepada.
Tetapi sekarang let's-- humor saya, jika anda boleh.
Mari kita pergi ke tab ini di sini.
Dan di sini adalah nombor dalam jelas apa yang seolah-olah susunan rawak,
dan mereka.
Tetapi sekarang jika saya bukan tuntutan bahawa di sebalik pintu-pintu ini
adalah nombor yang disusun.
Matlamatnya sekarang ialah juga mencari kami bilangan 50.
Tetapi melakukannya algorithmically, dan memberitahu kami bagaimana anda akan mengenainya.
Dan jika anda merasa, anda menyimpan filem.
Anda tidak menemuinya, anda memberikan kembali.
Ajay: Jadi saya akan menyemak hujung pertama, untuk menentukan jika there's--
[Ketawa dan tepukan]
DAVID MALAN: Di sini anda pergi.
Mari kita lihat satu terdahulu Ajay ini,
Sean, yang tidak cukup sebagai bertuah.
OK, jadi tugas anda di sini, Sean, adalah yang berikut.
Saya telah tersembunyi di balik ini pintu nombor tujuh,
tetapi terletak jauh di beberapa pintu-pintu ini dan juga adalah nombor bukan negatif lain.
Dan matlamat anda adalah untuk memikirkan ini baris atas nombor sebagai hanya array.
Kami mudah dihubungi urutan keping kertas dengan nombor di belakang mereka.
Dan matlamat anda adalah, hanya menggunakan bahagian atas array di sini, saya mendapati nombor tujuh.
Dan kami kemudian akan mengkritik bagaimana anda pergi tentang melakukannya.
Cari kami nombor tujuh, sila.
No.
5, 19, 13.
Ia bukan satu soalan helah.
1.
Pada ketika ini skor anda tidak begitu baik, jadi anda juga mungkin menyimpan berterusan.
3.
Teruskan.
Terus terang, saya tidak boleh membantu tetapi tertanya-tanya apa yang anda bahkan berfikir tentang.
>> SEAN: boleh saya ambil dari hanya baris atas.
DAVID MALAN: Hanya baris atas.
Jadi, anda telah mendapat tiga kiri.
Jadi saya mencari 7.
>> [PENONTON menjerit CADANGAN]
Jadi kedua-dua mereka yang sungguh hebat atas sebab-sebab yang sangat berbeza.
Jadi ini adalah di mana kita berhenti seketika lalu,
dan wawasan yang utama di sini pintu-pintu ini telah mempunyai nombor
di belakang mereka yang telah disusun, yang sesuai Fleet yang mana adalah bahawa anda boleh lakukan
asasnya yang lebih baik dalam example-- kedua ini
dan, sememangnya, itu adalah Sean percubaan pertama dengan nombor rawak
seperti before-- tetapi sebaik sebagai nombor-nombor ini disusun,
sama seperti buku telefon, apa yang boleh anda jelas lakukan?
Atau bagaimana anda boleh memanfaatkan pengetahuan itu?
Yeah.
>> PENONTON: Anda pergi separuh jalan [didengar].
DAVID MALAN: Yeah.
Tepat sekali.
Jadi naluri awal Ajay adalah untuk memeriksa hujung, seperti yang saya ingat,
dan kemudian kita semacam siap contoh dengan cepat.
Tetapi jika kita mula melakukan ini lebih teratur sepanjang garis,
tetapi bermula mungkin dalam pertengahan, kerana mereka disusun,
selepas kami mendedahkan nombor 16, oleh itu kita know--
dan mari kita buat betul-betul bahawa- kami oleh itu tahu bahawa 50, dalam kes hari ini,
telah mendapat untuk menjadi ke kanan.
Jadi, seperti pada minggu sifar apabila kita mengoyakkan buku telefon pada separuh
dan melemparkan separuh daripada masalah diri, idea yang sama di sini.
Kita boleh membuang separuh ini masalah dari sini.
Dan mungkin apa yang anda mungkin melakukan algorithmically,
apabila anda tahu bahawa 50 mesti ke kanan, jika ia di mana-mana,
adalah cuba di sana, di tengah-tengah pintu yang tinggal.
Sudah tentu, 50 adalah lebih tinggi daripada 42, jadi kita boleh
membuang baki ini perempat daripada masalah yang jauh,
dan, akhirnya, mengenal pasti sesuatu seperti 50.
Tetapi sama seperti dengan buku telefon, nombor-nombor
telah diberikan kepada kita sudah perintah disusun, yang meninggalkan kita
dengan soalan, bagaimana anda mendapatkan benda-benda ke dalam perintah disusun?
Dan, terus terang, pada apa kos?
Ia satu perkara untuk menjadi diserahkan buku telefon
dan kemudian menarik perhatian rakan-rakan anda dengan mencari nombor telefon benar-benar cepat, betul?
Mengoyak 32 muka surat keluar untuk mencari orang daripada 4 bilion laman,
yang kami katakan adalah satu contoh yang melampau.
Tetapi berapa banyak masa ia mengambil Verizon untuk menyusun buku telefon?
Berapakah masa yang diambil kami untuk menyusun tujuh nombor?
Itu satu soalan yang kita perlu setakat ini benar-benar diabaikan.
>> Jadi mari kita menjawab soalan ini sekarang.
Dan kita semua daripada filem sekarang, tetapi kita mempunyai beberapa bola tekanan.
Jika, berkata, lapan sukarelawan tidak keberatan menyertai kami di sini?
Mari kita pergi ke hadapan dan melakukan, bagaimana pula empat di antara kamu, tiga daripada anda di sini?
Dapatkan beberapa muka-muka baru.
Dan empat daripada anda di sana?
Dan now-- jangan berat sebelah here-- dan nombor lapan di sini pada akhir.
Marilah naik.
Baiklah.
Jadi apa yang kita ada di sini untuk setiap kamu adalah nombor.
Jika anda ingin pergi ke hadapan, mengambil nombor ini.
Apa nama anda?
>> Artie: Artie.
>> DAVID MALAN: Artie, okay.
Anda nombor 1.
>> AMIN: Amin.
DAVID MALAN: Amin.
Daud.
Anda nombor 2.
Dan pergi ke depan, kerana saya menyerahkan anda lembaran kertas,
beratur diri kamu di hadapan muzik berdiri dalam perintah itu sama seperti di sana.
>> ANDY: Hi, Andy.
>> DAVID MALAN: Andy, ia adalah baik untuk melihat anda.
Nombor 3.
>> JACOB: Yakub.
>> DAVID MALAN: Yakub, nombor 4.
Selamat Datang.
GERAN: Grant.
DAVID MALAN: Grant.
Nombor 5.
>> Alanna: Alanna.
>> DAVID MALAN: Alanna, nombor 6.
>> Frances: Frances.
DAVID MALAN: Frances, nombor 7.
Dan?
>> Gosip: Rachel.
>> DAVID MALAN: Rachel, nombor 8.
Baiklah.
Teruskan dan mendapatkan diri anda dalam usaha ini.
Biar saya meletakkan satu baki muzik berdiri di tempat.
Di mana anda perlu berdiri?
OK.
Teruskan dan hanya meletakkan nombor anda di mana penonton boleh melihat mereka pada,
muzik berdiri menghadap ke luar.
Dan mudah-mudahan, kita yang pertama kewarasan cek here-- 4, 2, 6.
Oh-oh.
Tunggu satu minit.
Kami tidak mempunyai 8.
Saya perlu untuk mengusir kamu dari contoh yang entah bagaimana.
No.
Tidak, itu OK.
Mari kita lihat.
Kita boleh melakukan ini.
Berdirilah.
Di sana kami pergi.
Betul.
Baiklah.
Jadi, kita mempunyai 8, 1, 3 7, 5.
OK.
Cemerlang.
>> Jadi soalan yang di tangan adalah, pada apa kos, dan melalui apa kaedah,
boleh kita sebenarnya menyusun nombor-nombor ini di sini supaya kita jenis boleh bekerja ke belakang,
akhirnya, dan decide-- ia benar-benar mengagumkan, ia benar-benar cekap,
yang saya boleh membahagi dan menakluk sebuah buku telefon?
Adakah ia benar-benar berkesan yang Saya boleh membahagi dan menakluk
mereka keping digital kertas di papan,
jika mungkin ia akan kos kita kekayaan dalam masa atau tenaga atau CPU kitaran
untuk benar-benar mendapatkan data kami ke dalam beberapa perintah disusun?
Jadi mari kita bertanya soalan itu.
>> Off oleh itu, nombor-nombor ini adalah cukup banyak dalam susunan rawak,
dan saya akan mencadangkan satu algoritma, atau proses
yang kita boleh menyusun orang-orang ini.
Saya akan menghampiri ini cukup naif.
Dan saya akan mengiktiraf bahawa itu jenis yang banyak bagi saya
untuk membalut fikiran saya sekitar data keseluruhan set sekaligus.
Tetapi anda tahu apa?
Saya akan membuat beberapa pembaikan kecil amat mudah.
4 dan 2 berada di luar perintah, jika matlamat adalah untuk pergi dari 1 pada sehingga 8.
Jadi, anda tahu apa?
Saya akan mempunyai anda guys swap, jika anda menghidupkan
fizikal kedudukan dan kepingan anda kertas.
Kini 4 dan 6, ini adalah teratur.
Saya akan biarkan orang-orang yang berkenaan.
6 dan 8, mereka adalah teratur.
Akan meninggalkan mereka menjadi.
8 and1, keluar perintah.
Jika kamu berdua tidak keberatan pertukaran.
Sekarang 8 dan 3, jika anda semua boleh menukar.
8 dan 7, jika anda semua boleh menukar.
Dan 8 dan 5, jika anda semua boleh menukar.
>> Sekarang, saya dilakukan?
Tidak, jelas tidak.
Tetapi saya telah membuat keadaan yang lebih baik, bukan?
Apakah nama anda sekali lagi, nombor 8?
>> Gosip: Rachel.
DAVID MALAN: Jadi Rachel mempunyai berkesan dipam sehingga cukup jauh,
sehingga ke akhir array saya nombor di sini.
Dan masalah yang jenis diselesaikan.
Kini, jelas, 2 masih perlu bergerak sedikit, dan 4 dan 6 dan 1.
Tetapi saya seolah-olah telah mendapat sedikit lebih dekat dengan penyelesaian.
Jadi mari kita memohon yang sama heuristik naif lagi.
2 dan 4, OK.
4 dan 6, OK.
6 dan 1, mm mm.
Mari kita swap.
6 dan 3, mm mm.
Mari kita swap.
6 dan 7 adalah OK.
7 dan 5, nope.
Mari kita swap.
Dan kini 7 dan 8.
Dan apa nama anda lagi?
Frances: Frances.
DAVID MALAN: Frances.
Jadi sekarang Frances adalah dalam walaupun yang lebih baik kedudukan, kerana sekarang 7 dan 8
dengan betul dipam sehingga bahagian atas.
Jadi 2 dan 4, OK.
4 dan 1, swap mari ini.
4 dan 3, swap mari ini.
4 dan 6, anda OK.
6 dan 5, swap mari ini.
Dan kini orang-orang lelaki yang baik.
Kita sudah hampir.
2 dan 1, rosak, jadi menukar.
Dan sekarang mari saya melakukan pemeriksaan kewarasan.
2 dan 3, 3 dan 4, 4 dan 5, 5 dan 6, 6 dan 7, 8.
OK, jadi kita selesai.
>> Tetapi pada apa kos yang saya lakukan menyusun nombor-nombor ini di sini?
Nah, berapa banyak langkah-langkah yang saya lakukan berpotensi mengambil apabila sorting orang ini?
Nah, kita akan kembali kepada soalan itu.
Tetapi, terus terang, jika anda mendapat yang bosan sedikit, itu
jenis mendedahkan bahawa ini tidak mungkin algoritma yang paling berkesan.
Dan sesungguhnya, terus-terang, saya berpeluh semua lebih berjalan belakang dan sebagainya.
Yang tidak berasa terutamanya cekap.
Jadi mari kita cuba sesuatu yang lain.
Jika anda semua boleh menetapkan semula dirimu kepada lapan nilai.
Kerja yang baik.
>> Mari kita lihat secara digital, hanya seketika sebelum kita mencuba sesuatu yang lain,
apa yang hanya berlaku.
Di sini, anda akan melihat visualisasi daripada lapan manusia
mana biru dan merah bar mewakili nombor.
Yang lebih tinggi bar, yang lebih besar nombor.
Pendek bar, yang lebih kecil nombor.
Dan apa yang anda akan melihat di dalam susunan rawak lebih lapan daripada mereka.
Anda akan melihat bar ini mendapat disusun mengikut algoritma yang sama,
atau set arahan, yang kami akan memanggil seterusnya semacam gelembung.
Jadi notis, setiap saat atau lebih, dua bar yang menyalakan merah,
sedang berbanding dengan komputer.
Kemudian jika bar dan besar bar kecil berada di luar perintah,
mereka sedang ditukar untuk saya.
>> Sekarang ini adalah sangat membosankan menonton ini, sudah tentu,
buat masa yang lama, tetapi notis yang takeaway-- bar besar bergerak ke kanan,
bar bergerak sedikit ke kiri.
Mari kita membatalkan proses ini dan mempercepatkan ini sehingga
menjadi lebih cepat, jadi kami boleh mendapatkan rasa peringkat tinggi apa,
memang, jenis gelembung lakukan.
Malah, ia menggelegak sehingga sebelah kanan senarai,
atau array, bar yang lebih besar.
Dan sebaliknya, bar kecil adalah menggelegak cara mereka ke sebelah kiri,
walaupun pada kadar yang lebih cepat daripada kita sebelum ini lakukan.
Jadi, sukar untuk melihat dengan manusia, tetapi visual itulah sesungguhnya apa
sedang berlaku.
>> Tetapi mari kita cuba satu asas pendekatan yang berbeza sekarang.
Mari kita cuba yang berbeza algoritma mana kami mempunyai anda
lelaki ini bermula pada asal jawatan, yang perintah ini di sini.
Dan mari kita pergi ke depan sekarang.
Dan saya akan melakukan sesuatu walaupun mudah, betul?
Apabila ditinjau kembali, pertukaran dari segi pasangan lagi dan sekali lagi, hampir sedikit pandai.
Mari kita melakukan perkara-perkara yang lebih naif, di mana sekiranya saya ingin menyusun orang ini,
biar saya terus mencari untuk elemen yang paling kecil.
Jadi sekarang, 4 adalah jumlah paling kecil yang saya lihat.
Saya akan ingat bahawa.
Tidak, 2 adalah lebih baik, dan ingat bahawa.
1 adalah lebih kecil.
3, 7, 5.
OK.
One-- apa nama anda lagi?
>> Artie: Artie.
>> DAVID MALAN: Artie.
Jadi, Artie, teruskan.
Saya akan menarik anda keluar dari barisan itu.
Jika anda boleh datang ke sini.
Dan saya perlu memberi ruang untuk beliau.
Kami mempunyai titik keputusan di sini.
Bagaimana kita boleh membuat ruang untuk Artie sini pada awal di mana nombor 1 milik?
>> PENONTON: Shift.
>> DAVID MALAN: OK, kita boleh mengalihkan semua orang.
Tetapi mencadangkan pengoptimuman.
Yang terasa sedikit menjengkelkan bagi saya untuk meminta empat orang
untuk bergerak sepanjang jalan ke bawah.
Apa lagi yang saya boleh buat?
>> PENONTON: Matikan mereka.
>> DAVID MALAN: Matikan mereka.
Dan apa nama anda lagi?
>> JACOB: Yakub.
DAVID MALAN: Yakub, bergerak.
Jauh lebih efisien hanya untuk Lokasi swap Yakub dengan Artie,
yang bertentangan dengan memaksa keempat-empat orang ini,
terima kasih banyak, untuk kedudukan yang betul.
Apa yang baik tentang Artie sekarang, dia dalam kedudukan yang betul beliau.
Mari kita buat ini lagi.
2, itu jumlah yang paling kecil yang saya lihat.
3, 7, 5.
OK.
2 adalah pasti yang paling kecil.
Tidak perlu melakukan apa-apa kerja.
Mari kita buat sekali lagi.
6.
Kecil?
8.
Nope.
4?
Ooh.
Biar saya ingat 4.
3.
Biar saya ingat 3.
7, 5.
Bilangan paling kecil saya telah dilihat pada pas ini ialah 3.
Jika anda ingin datang pada keluar.
Di mana kita akan meletakkan anda?
Dan apa nama anda?
>> Alanna: Alanna.
>> DAVID MALAN: Alanna, kami akan mempunyai untuk mengusir kamu.
Tetapi yang lebih cekap, hanya menukar dua orang,
daripada memiliki beberapa orang sebenarnya meminggir lebih.
Sekarang mari kita buat ini lagi.
Saya akan memilih 4, jadi datang pada keluar.
Dan siapa yang akan bergerak?
Nombor 8, sudah tentu.
Jika saya kini mencari nombor 5, datang pada keluar.
Nombor 8 yang akan dapat diusir lagi.
Saya kini akan mendapatkan nombor 6 di tempat.
7 di tempat.
8 di tempat.
>> Apa yang kita lakukan hanya sekarang ialah sesuatu yang dinamakan jenis pemilihan,
dan jika kita menggambarkan ini, ia akan berasa sedikit berbeza.
Mari kita pergi ke depan dan dari ini Menu di sini, visualization-- ini
mari menukar ini supaya- datang, Firefox.
Mari kita menukar ini kepada jenis pemilihan.
Dan mari kita mempercepatkan proses seperti sebelum ini, dan mula visualisasi sekarang.
Dan algoritma ini mempunyai rasa yang berbeza dengannya.
Pada setiap lelaran, terus-terang, ia lebih mudah.
Saya hanya memilih elemen yang paling kecil.
Sekarang, terus-terang, saya mendapat bertuah kecil yang masa, kerana ia disusun pantas.
Unsur-unsur tidak rawak.
Ia bukan seperti yang kita akan akhirnya lihat, pada asasnya lebih cepat.
Tetapi mari kita melihat ketiga dan terakhir mendekati di sini tentang apa yang sedang berlaku.
Jadi mari kita pergi ke depan dan menetapkan semula kalian satu masa akhir berada dalam perintah ini di sini.
>> Dan sekarang, saya akan menjadi sedikit lebih pandai,
hanya untuk mengisi algoritma kami.
Saya akan melakukan ini.
Saya akan tidak pergi belakang dan sebagainya begitu banyak.
Terus terang, saya bosan semua menyeberangi ini.
Saya hanya akan mengambil apa yang saya diberikan pada awal senarai,
dan saya akan menyusun yang ketika itu dan di sana.
Jadi di sini kita.
Nombor 4.
Saya akan memasukkan nombor 4 dalam senarai yang disusun.
Selesai.
Saya menuntut sekarang, dan hanya untuk membuat ini lebih jelas, ini sebahagian daripada senarai saya disusun.
Ia adalah jenis tuntutan bodoh, tetapi sesungguhnya 4 disusun dalam senarai saiz satu.
Sekarang, saya akan mengambil nombor 2.
Nombor 2 saya kini akan memasukkan ke dalam tempat yang betul.
Oleh itu, bagaimana 2 milik?
Jelas sekali, di sini.
Oleh itu, pergilah ke hadapan dan bergerak ke belakang, jika anda boleh.
Dan mengapa tidak kalian hanya mengambil muzik anda berdiri dengan anda kali ini.
Dan mari kita secara paksa memasukkan anda hingga awal senarai.
Kerja lebih-lebih lagi sedikit.
Saya terpaksa berpindah Yakub sekitar, dan apa yang nama anda?
>> AMIN: Amin.
>> DAVID MALAN: Amin.
Tetapi sekurang-kurangnya saya tidak kembali dan sebagainya.
Saya hanya mengambil perkara-perkara seperti yang saya pergi.
Saya hanya memasukkan mereka di tempat yang betul.
6, ini sebenarnya cukup mudah.
Mari kita memasukkan anda di sana, jika anda hanya mahu bergerak lebih sedikit.
Nombor 8, juga cukup mudah.
Di sana.
Celaka.
Nombor 1 kita tidak boleh hanya swap dengan Amin di sini,
kerana perkara yang berlaku kepada keadaan kucar-kacir sehingga perintah itu.
Oleh itu, kita perlu menjadi sedikit lebih bijak.
Jadi, Artie, jika anda boleh menyandarkan seketika.
Mari kita pergi ke depan dan beralih sekarang, tidak seperti algoritma kami sebelum ini,
untuk memberi ruang kepada Artie di sini pada awal.
Jadi, pada akhir hari, saya jenis melakukan apa yang saya mahu mengelak sebelum.
Dan algoritma saya adalah jenis daripada diubah, dari segi intelek,
dari apa yang asalnya adalah.
Saya hanya melakukan peralihan pada masa yang berbeza.
Kini saya di 3.
Oh, celaka.
Kita perlu melakukan lebih banyak kerja lagi.
Jadi mari kita menolak anda keluar.
Mari kita beralih 8, 6, 4-- oh oh-- dan 3 akan pergi di sana.
Jadi pada simpanan sedikit-kurangnya kali ini.
7, tidak terlalu banyak kerja yang perlu dilakukan.
Jadi, jika anda mahu pop kembali, mari kita memasukkan anda.
Dan akhir sekali, 5, jika anda mahu pop kembali, kami
perlu beralih anda, anda, anda, sehingga lima adalah di tempat.
>> Jadi sekarang untuk melihat ini pada peringkat tinggi secara grafik,
mari kita buat algoritma ini visualisasi satu masa tambahan.
Oleh itu, kita ini hendaklah memanggil jenis sisipan.
Kami akan berjalan seperti cepat, dan mula di sini.
Dan ia juga mempunyai rasa yang berbeza.
Ia semacam mendapat yang lebih baik dan yang lebih baik, tetapi ia tidak pernah sempurna
sehingga saya masuk dan lancar dalam jurang.
Kerana, sekali lagi, saya hanya mengambil apa yang Saya diberikan dari kiri ke kanan.
Jadi saya tidak mendapat bernasib baik segala sesuatu yang sempurna.
Itulah sebabnya kita mempunyai ini sedikit mispositions bahawa kami tetap dari masa ke masa.
>> Jadi semua algoritma ini seolah-olah berjalan pada paces sedikit berbeza.
Malah, yang anda akan katakan adalah yang terbaik atau yang paling cepat setakat ini?
Semacam gelembung, yang pertama?
Pemilihan jenis, yang kedua?
Semacam Insertion, ketiga?
Saya mendengar beberapa macam pilihan.
Pemikiran yang lain?
>> Jadi ternyata bahawa semua algoritma ini
pada dasarnya hanya secekap setiap other-- atau sebaliknya, sama seperti
cekap kerana satu sama lain, kerana kita boleh melakukannya pada dasarnya
lebih baik daripada ketiga-tiga algoritma ini.
Dan itu sedikit kebohongan putih juga.
apabila saya menyatakan seperti yang cekap atau sebagai tidak cekap,
itu sekurang-kurangnya untuk nilai super-besar n.
Apabila kita mempunyai lapan orang di sini, atau mungkin 50 atau lebih bar pada skrin,
anda benar-benar akan melihat perbezaan di kalangan tiga algoritma.
Tetapi n, bilangan orang, atau bilangan nombor,
atau jumlah orang di dalam telefon buku, atau jumlah halaman web
dalam pangkalan data Google mendapat lebih besar dan lebih besar,
kita akan melihat bahawa ketiga-tiga algoritma sebenarnya cukup miskin.
Dan yang boleh kita lakukan pada dasarnya yang lebih baik daripada itu.
>> Mari kita lihat, akhirnya, apa algoritma ini mungkin
bunyi seperti dalam konteks beberapa yang lain
dan juga dengan cara ini visualisasi sini
yang akan memperkenalkan kami kepada beberapa algoritma.
Mari kita pergi ke depan dan mengucapkan tahniah kepada peserta kami di sini, yang semuanya
disusun diri mereka dengan baik.
Jika anda ingin mengambil hadiah perpisahan.
Anda boleh menyimpan nombor anda juga.
Dan apa yang anda akan lihat, atau sebaliknya dengar, sekarang,
ialah seperti yang kita meletakkan bunyi kepada setiap bar ini
dan mengaitkannya dengan perisian, frekuensi yang berbeza bunyi,
anda boleh membalut fikiran lebih audioly anda seluruh apa yang setiap perkara-perkara ini
kelihatan seperti.
Di mana yang pertama adalah jenis sisipan
>> [Nada]
>> Ini adalah jenis gelembung.
>> [Nada]
>> Pemilihan jenis.
>> [Nada]
>> Sesuatu yang dinamakan jenis merge.
>> [Nada]
>> Jenis Gnome.
>> [Nada]
>> Itu sahaja untuk CS50.
Kami akan melihat anda pada hari Rabu.
>> Pencerita: Dan sekarang, "Deep Fikiran, "oleh Daven Farnham.
Mengapa untuk gelung?
Mengapa tidak membuat ia lebih baik?
Saya membuat gelung lima.
>> [Ketawa]