DAVID Malan: Baiklah.
Jadi ini adalah CS50, dan ini adalah sekarang awal minggu ketiga.
>> Jadi sampai sekarang, kami telah telah menulis program di C
yang terlihat sedikit sesuatu seperti ini di sini.
Jadi kita punya beberapa tajam termasuk di bagian atas.
Kami punya int, utama, batal, dan maka sesuatu untuk dilakukan di tengah,
beberapa sedikit kode di dalam fungsi tersebut.
Tapi kunci telah menjadi fakta bahwa kami telah mengatakan kekosongan di sini.
Jadi batal, sepanjang waktu ini, menspesifikasikan bahwa program ini, ketika dijalankan,
hanya bisa dijalankan melalui namanya.
Anda tidak dapat mengetikkan kata-kata atau angka setelah nama program ketika
menjalankannya.
Jadi, misalnya, jika program yang dikompilasi ke sebuah file yang bernama halo,
Anda bisa melakukan ./hello, tapi hanya itu.
>> Satu-satunya cara yang Anda bisa memberikan masukan kepada program ini
adalah dengan memanggil fungsi.
Misalnya, fungsi apa kita telah menggunakan sejauh ini
untuk mendapatkan input dari user?
>> AUDIENCE: Dapatkan tali.
DAVID Malan: Untuk mendapatkan tali, atau mendapatkan int, atau Anda pernah melihat orang lain,
bahkan jika Anda belum pernah menggunakan mereka belum, seperti mendapatkan panjang, panjang dan sejenisnya.
Tapi misalkan kita benar-benar ingin memulai
menulis program yang sedikit lebih serbaguna, dan, terus terang, sedikit lebih
seperti perintah yang Anda sudah telah mendapatkan, mudah-mudahan,
sedikit terbiasa.
Seperti cd ruang Dropbox.
Ini, tentu saja, perubahan direktori Anda, dengan asumsi
Anda berada di rumah John Harvard direktori, ke folder Dropbox Anda.
Sementara itu, perintah seperti ini menciptakan direktori baru bernama pset2,
Anda mungkin sudah atau akan segera untuk masalah mengatur dua.
Membuat Hello, tentu saja, adalah perintah yang membangun sebuah program yang disebut halo
dari sebuah file yang bernama halo dot c.
Dan di masing-masing kasus, sekarang, kami sudah
memberikan argumen pada apa yang disebut baris perintah, prompt berkedip,
sehingga membuat yang tahu apa yang harus membangun, dan sebagainya mkdir yang tahu apa folder untuk membuat,
dan begitu cd yang tahu di mana Anda ingin pergi.
Tapi sampai sekarang, kami selalu mengatakan yang utama, fungsi default Anda,
memiliki ekspresi kosong dalam kurung tersebut,
yang berarti bahwa tidak bisa mengambil argumen.
>> Jadi mulai hari ini, apa yang kita lakukan
adalah, kita akan mulai hal pendukung seperti ini bahkan.
Bahkan, dalam hal ini, yang Anda tidak biasanya mengetik secara manual,
Membuat telah melakukan hal ini bagi kita, tidak ada
satu tapi satu, dua, tiga tambahan string setelah program bernama
dentang.
Jadi bagaimana kita mencapai hal ini?
>> Nah, mulai hari ini, dalam kasus di mana kita ingin
untuk memberikan masukan melalui disebut baris perintah,
kita akan mulai menambahkan di sini apa yang ada di yellow--
menggantikan kekosongan dengan int argc koma String argv braket terbuka braket dekat.
Sekarang ini adalah menarik untuk beberapa alasan.
Satu, itu akan membiarkan kita menulis program yang sedikit lebih dinamis.
Tapi, lebih compellingly, itu akan membuka
sekarang percakapan untuk array apa yang bisa benar-benar
digunakan, tali apa benar-benar di bawah tenda,
sampai minggu depan ketika kita mulai menyelam bahkan lebih dalam bagaimana mesin adalah
membuat semua pekerjaan hal ini.
Tapi untuk saat ini, mari kita menggambar, mungkin, gambar.
>> Ketika Anda menulis sebuah program dengan main dinyatakan
dengan cara ini, seperti yang utama membutuhkan dua argumen, int
dan-- apa tipe data adalah argumen kedua?
>> AUDIENCE: Array.
DAVID Malan: Array.
Sehingga terlihat sekilas seperti itu string, tapi perhatikan tanda kurung siku.
Ingat terakhir kali kami memperkenalkan gagasan array.
Dan array menggunakan tanda kurung siku dalam beberapa konteks.
Anda mungkin menggunakan alun-alun kurung untuk pergi ke array
dan mendapatkan elemen tertentu, seperti braket 0 atau 1 atau bracket bracket 2.
Tapi kami melihat, jika sebentar, pekan lalu bahwa Anda juga
menggunakan ini tanda kurung siku untuk menyatakan ukuran dari array,
jika Anda tahu sebelumnya berapa banyak int atau berapa banyak string atau apa pun yang Anda
benar-benar ingin.
Jadi ternyata ada dunia konteks ketiga di sini
yang tidak memiliki nomor di dalam dari tanda kurung.
Bila Anda menetapkan, seperti yang saya miliki di sini, nama sesuatu seperti argv,
yang hanya cara mewah mengatakan argumen vektor, yang
adalah cara mewah lain mengatakan berbagai argumen,
braket terbuka braket dekat hanya berarti bahwa Anda tidak selalu
tahu sebelumnya seberapa besar array akan menjadi,
tapi kau tahu itu akan menjadi sebuah array.
Jadi, jika Anda tidak tahu nomor tidak meletakkannya di sana,
untuk braket terbuka braket dekat berarti bahwa argv bukan string,
tapi sebuah array dari string.
Jadi sintaksis, jika Anda berpikir kembali minggu lalu,
itu sangat mirip dengan mengatakan sesuatu seperti int usia braket terbuka,
dan kemudian sesuatu setelahnya.
Jadi, apa ini terlihat seperti?
Mari kita benar-benar menggambar.
Jadi, ketika Anda menjalankan program ini dengan Main setelah dua argumen didefinisikan di dalam
mereka kurung, Anda dasarnya memiliki minimal dua potongan
memori diberikan kepada Anda di bawah tenda.
Satu, karena aku akan menarik sebagai persegi panjang ini, akan disebut argc.
Dan hanya sebagai rekap cepat, apa jenis data argc?
Jadi itu adalah int.
Jadi nomor akan untuk pergi secara bergiliran argc--
bahwa singkatan hitungan argumen.
Sementara itu, saya sudah ditarik argv sebagai array.
Dan aku tidak benar-benar tahu berapa lama itu akan menjadi,
jadi untuk keperluan hari ini dot dot dot.
Mungkin mendapatkan beberapa panjang.
Tapi aku sudah digambarkan di sini setidaknya empat persegi panjang.
Jadi argv sepotong memori yang menyimpan String string string dot dot dot,
dan argc adalah salah satu potongan memori untuk integer.
>> Jadi sekarang, mari kita menjadi sedikit lebih tepat.
Jika, ketika saya memiliki string dalam array ini, disebut
argv, saya ingin mendapatkan mereka individual, seperti minggu lalu,
kita akan menggunakan notasi seperti argv braket 0
untuk mendapatkan hal pertama array.
Argv braket 1 untuk mendapatkan Hal kedua, dan sebagainya.
Kuncinya di sini adalah kita masih 0 indexed-- kami masih menghitung dari 0.
Jadi sekarang mari kita benar-benar memasukkan sesuatu ke dalam ini.
Jika saya harus mengkompilasi sebuah program yang disebut Halo dari sebuah file yang bernama halo dot c,
dan kemudian saya menjalankan program yang dengan dot slash halo,
apa komputer saya, laptop saya, terlihat seperti di bawah tenda
saat saya menjalankan dot slash Halo dan tekan Enter?
Nah, ini mungkin apa yang bisa kita jelaskan
sebagai isi komputer Anda memori, atau Memory RAM-- Random Access.
Dengan kata lain, komputer, entah bagaimana untuk Anda ajaib,
menempatkan nomor 1 di argc, AKA argcount, dan menempatkan harfiah string
./hello di argv braket 0.
Aku tidak tahu, terus terang, apa yang di argv braket 1 atau 2 atau 3,
karena jika pengguna belum mengetik apa-apa selain ./hello,
kita akan berasumsi bahwa ini adalah nilai-nilai sampah yang paling mungkin,
sehingga untuk berbicara.
Mereka potongan memori ada, tapi itu tidak sampai kepada kami
untuk melihat mereka, karena argcount hanya satu.
>> Sekarang, sementara itu, jika saya menulis menjalankan program lain,
cd, yang lebih tepat perintah, dalam berkedip ruang cd prompt-- Anda
Dropbox-- ketika saya menjalankan itu, efektif, ketika program cd dijalankan, argc,
dalam memori komputer saya, adalah untuk paling singkat kedua nomor 2.
Dan kemudian argv braket o memiliki cd, argv braket 1 memiliki Dropbox,
dan kemudian tentu saja perintah selesai, sehingga semua memori ini
dasarnya hilang dan digunakan untuk sesuatu yang lain.
Dan itulah mengapa saya mengatakan hanya sepersekian detik.
>> Sementara itu, jika kita melakukan mkdir pset2, gambar terlihat hampir sama,
tapi dengan string yang berbeda di dalam argv.
Jika saya melakukan dentang dasbor halo halo dot c, ide yang sama.
Barang lebih banyak diisi untuk argv, dan argc, tentu saja, adalah 4.
Jadi dengan kata lain, meskipun array ini
mungkin dot dot dot, beberapa panjang variabel, sehingga untuk berbicara,
Anda selalu tahu di mana akhir itu adalah, karena argc akan memberitahu Anda
pada titik apa Anda harus berhenti melihat unsur-unsur dalam argv.
Anda hanya dapat melihat empat total dalam hal ini.
>> Jadi mari kita sekarang kita lihat, mungkin, sebuah program sederhana.
Salah satu yang baru saja menyapa untuk seseorang seperti Zamyla.
Jadi saya mengklaim saya akan menulis sebuah program hanya dalam beberapa saat melalui yang saya bisa lakukan
./hello ruang Zamyla, dan kemudian saya ingin program saya untuk mencetak sesuatu
super sederhana seperti "halo, Zamyla."
Sekarang di masa lalu kami telah digunakan GetString.
Jadi di masa lalu, bahkan jika Anda baru untuk pemrograman,
kemungkinan besar Anda bisa menyiapkan program yang menggunakan GetString
dan kemudian menggunakan printf untuk menyapa Zamyla.
Tapi mari kita tidak menggunakan getString saat ini.
Biarkan aku malah pergi ke Appliant dan sertakan standar I O dot h.
Biarkan aku juga mencakup CS50 dot h.
Sekarang int utama, dan sekarang aku tidak akan melakukan batal hari ini.
Sebaliknya, aku akan melakukan int argc String argv braket terbuka braket dekat,
tidak menentukan nomor.
Dan disebut sekarang di sini adalah saya dapat dilakukan.
Apa yang akan saya lakukan sekarang adalah, aku akan melakukan sedikit lompatan iman,
Aku akan menganggap bahwa pengguna akan menggunakan program ini dengan benar,
dan aku hanya akan melakukan printf halo,% sn.
Jadi tidak ada yang baru di sana.
Tapi aku ingin sekarang menempatkan kata apapun jenis pengguna setelah nama program.
Jadi jika saya melakukan ruang ./hello Zamyla, saya ingin entah bagaimana pemrograman akses
mengutip tanda kutip "Zamyla." jadi saya bisa masuk ke vektor argumen saya,
array saya string, dan jika perintah, lagi, adalah ruang ./hello Zamyla,
nomor berapa yang saya inginkan untuk dimasukkan ke dalam argv sini?
AUDIENCE: 1.
DAVID Malan: 1, karena braket 0 ternyata
akan menjadi nama program, seperti yang kita lihat.
Jadi bracket 1 adalah kata pertama bahwa saya, pengguna, telah mengetik.
Aku akan pergi ke depan dan menyimpan ini.
Aku akan pergi ke folder saya di mana saya telah menempatkan file ini.
Aku akan lakukan membuat halo 3.
Comp IO OK.
./hello Zamyla Enter.
Apa yang saya lakukan salah?
Aku terperanjat diriku hanya sesaat di sana.
Apa yang saya lakukan salah?
>> AUDIENCE: Nama.
>> DAVID Malan: File ini sebenarnya disebut hello3.c.
Dan saya melakukan itu hanya untuk konsistensi, karena kita sudah
memiliki hello.c dalam masa lalu dalam kode online.
Jadi mari kita memperbaiki ./hello ini braket dasbor 3 Zamyla.
Enter.
Dan sekarang kita memiliki halo, Zamyla.
Sementara itu, saya dapat mengubahnya ke menjadi Rob, atau benar-benar ada kata lain.
>> Tapi mari kita mempertimbangkan kasus sudut.
Apa yang Anda harapkan akan terjadi jika Saya tidak ketik nama siapa pun sama sekali?
>> AUDIENCE: Error.
>> DAVID Malan: Kesalahan dari beberapa macam, mungkin.
Mari kita lihat.
Enter.
Null.
Jadi printf sebenarnya menjadi sedikit pelindung dari kita
di sini, dan benar-benar mencetak paren terbuka null, tetapi hal-hal yang lebih buruk bisa terjadi.
Dan hanya untuk menunjukkan sesuatu yang Anda benar-benar
tidak harus melakukan, mari kita pergi di di sini dan mulai mengaduk-aduk.
Benar?
Jika saya tahu bahwa gambar dalam memori pada dasarnya ini,
argv braket 1 memiliki Zamyla, argv braket 0 memiliki ./hello, atau ./hello-3.
Apa yang ada di braket 2?
Jadi saya bisa menjawabnya pertanyaan sendiri, kan?
Aku hanya dapat mengubah 1 ke 2.
Saya sekarang bisa mengkompilasi ulang halo 3, ./hello3 Mari kita memperbesar dan tekan Enter.
Whoops.
Tidak ada tanda kutip.
Menarik.
Jadi itu agak dingin untuk lihat apa lagi yang di sini.
>> Jadi apa lagi yang di dalam laptop saya?
Mari kita simpan dengan braket 3.
Membuat hello3, ./hello-3.
Penasaran.
Dan sekarang mari kita benar-benar bold-- 50.
Jadi itu benar-benar menyelam dalam ke dalam memori komputer saya.
50 indeks dalam.
Jadi membuat halo 3 ./hello-3.
Penasaran.
Baiklah, sekarang aku hanya akan mendapatkan sembrono.
Mari kita pergi ke 5.000.
Baiklah.
Jadi biarkan aku ulang.
Membuat hello3, ./hello-3.
OK.
Sekarang beberapa dari Anda, mungkin ada seperti bola lampu pergi.
Berapa banyak dari Anda memiliki melihat pesan ini sebelumnya?
OK.
Jadi, mengapa?
>> Odds are-- dan ada yang berbeda hal-hal yang dapat menyebabkan hal ini,
dan jelas Anda berada di baik company-- kami jelas
menyebabkan apa yang disebut kesalahan segmentasi.
Dan cerita panjang pendek untuk hari ini, saya telah menyentuh segmen memori
bahwa saya tidak seharusnya.
Dimana segmen hanya berarti sepotong memori yang saya tidak seharusnya.
Sekarang komputer menjamin bahwa jika saya menjalankan ./helloZamyla bahwa saya bisa menyentuh argv
menjadi braket 0 dan argv braket 1.
Tapi argc adalah nilai 2, yang berarti saya hanya allowed-- itu semacam kehormatan
system-- menyentuh braket 0 dan braket 1.
Jika saya pergi lebih jauh, ada benar-benar akan menjadi memori di sana.
RAM saya ada secara fisik di komputer.
Tapi siapa yang tahu apa yang ada?
Memang, aku menjalankan beberapa program pada satu waktu.
Saya mungkin memiliki seen-- jika saya tidak melakukan hal ini pada Appliant
tetapi pada Mac saya atau PC-- saya mungkin memiliki melihat isi dari email.
Aku mungkin telah melihat sekejap Pesan Saya baru saja dikirim.
Apa pun yang mungkin berlama-lama di dalam memori
bisa saja diakses dengan cara notasi braket ini sewenang-wenang persegi.
Atau, lebih buruk lagi, Anda mungkin memiliki menemukan salah satu password saya
bahwa saya baru-baru akan mengetik, bahwa Program telah disimpan dalam memori sehingga
untuk mengotentikasi saya, dan maka hanya jenis meninggalkannya
di RAM sampai aku keluar dari program itu.
>> Dan memang, ini adalah salah satu bahaya dan satu kekuatan
menggunakan bahasa seperti C. Anda memiliki akses tak terkekang
untuk seluruh isi memori program,
dan apa orang jahat bisa bahkan melakukan pada mereka cases--
terutama ketika kita sampai ke pemrograman web
menjelang akhir semester, kita akan kembali topic-- ini menyodok sekitar,
berpotensi, seseorang yang komputer memori dan menemukan hal-hal aneh seperti
seperti yang kita lihat di sana.
Atau bahkan lebih buruk lagi, password yang ia atau dia kemudian dapat digunakan untuk melakukan hal-hal buruk.
>> Jadi jelas saya tidak seharusnya melakukan ini, karena hal-hal aneh mulai terjadi.
Memang, ini adalah program yang menerjang.
Ini akan menjadi setara Mac OS atau Windows
sebuah jendela program hanya menghilang.
Galat tak terduga terjadi.
Dalam lingkungan baris perintah kita melihat sesuatu seperti ini.
Tapi itulah sebabnya, yang aku hanya menyentuh memori yang bukan milik saya.
>> Jadi mari kita membela melawan ini sedikit dengan cara yang berbeda
dengan melihat program ini di sini.
Jadi, sekali lagi, kerangka bahwa kita melihat earlier--
dan saya sudah disorot saat ini int.
Dan selama ini utama memiliki memang kembali nilai.
Meskipun di sebagian besar kuliah kami contoh kita tidak pernah digunakan
kembali apa-apa di utama.
Kami hanya menulis printf dekat penjepit keriting dan hanya itu.
Tapi gratis, apa compiler telah melakukan untuk Anda,
efektif, adalah kembali 0 untuk Anda.
Ternyata out-- dan itu sedikit counterintuitive-- bahwa 0 adalah baik.
Ini tidak berarti palsu per se.
0 baik, dan setiap non-0 nilai, dunia telah memutuskan,
dapat menandakan kesalahan.
Jadi jika Anda pernah mengacaukan sesuatu pada komputer Anda,
atau program baru saja meninggal pada Anda dan Anda sudah mendapatkan beberapa jendela yang keliru
pada layar Anda, mengatakan kesalahan negatif 49 atau kesalahan 23--
beberapa value-- tampak sewenang-wenang yang karena programmer telah keras-kode
nilai seperti negatif 49 atau positif 23 untuk mewakili sejumlah, berani mengatakan,
dari 4 miliar hal yang mungkin yang mungkin salah dalam sebuah program.
>> Jadi bagaimana mungkin saya mengambil keuntungan dari ini sendiri?
Nah, biarkan aku membuka program yang saya tulis di muka,
dan menyodok sekitar online yang disebut halo 4.
Dan itu hampir identik, kecuali bahwa yang punya sedikit pengecekan error.
Dalam hal ini, saya sudah kembali menyatakan utama sebagai mengambil dua argumen,
tapi kali ini, on line 17, pemberitahuan Saya melakukan sedikit cek kewarasan.
Saya memastikan bahwa argc sama sama 2.
Karena jika demikian, itu berarti saya dapat dengan aman
menyentuh tidak hanya braket 0, tapi braket 1.
Dan aku pergi ke depan dan mencetak, dalam hal ini, Zamyla atau Rob
atau kata apa pun yang saya mengetik.
Dan sekarang hanya untuk mendapatkan sedikit lebih tepat,
Aku akan kembali secara eksplisit 0 untuk menandakan semuanya baik-baik.
Tidak ada hal buruk yang terjadi.
>> Tapi dengan konvensi, saya akan kembali 1, atau terus terang non-0 nilai,
jika ada yang tidak beres.
Sekarang pengguna tidak akan benar-benar melihat apa yang terjadi.
Memang jika saya pergi ke direktori ini, kita memperbesar dan jangan membuat halo 4,
./hello-4 Zamyla berperilaku seperti yang saya harapkan.
Tapi kalau aku malah tidak mengetik apa-apa, sepertinya tidak ada yang terjadi,
tetapi tidak crash.
Dan jika saya bukan melakukan sesuatu seperti Rob adalah pengawas yang
dalam berbagi Thayer-- Informasi sewenang-wenang.
Tapi perhatikan, argv 1, 2, 3, 4, dan 5 sekarang harus ada dalam memori.
Itu pun, tidak apa program saya mengharapkan,
karena saya sudah memeriksa apakah argc sama sama dengan 2 atau tidak.
Jadi aku kini membela terhadap ini.
>> Sekarang, sebagai samping, kita yang programmer-- atau lebih tepatnya kita users-- yang
tidak pernah melihat bahwa 0 atau 1 tapi menggunakan alat yang disebut Debugger, atau alat-alat lain,
karena kami akan melihat sebelum panjang, Anda programmer
benar-benar melihat apa yang mungkin menjadi terjadi di dalam program Anda.
>> Jadi, pertanyaan tentang argc?
Ya.
>> AUDIENCE: Aku pernah melihat di mana mereka belum punya karakter, [Tak terdengar]
hanya mengatakan tali bintang d, seperti karakter asterisk koma.
Apakah mereka setara di sini?
>> DAVID Malan: Mereka.
Jadi pertanyaannya adalah, Anda memiliki program kadang-kadang terlihat
seperti ini yang tidak mengatakan String argv braket
tapi malah mengatakan sesuatu seperti char bintang argv braket.
Dan bahkan ada yang lain varian yang mungkin Anda lihat.
Mereka memang setara.
Untuk saat ini, kami memiliki ini semacam roda pelatihan
di dalam bentuk string dalam CS50 perpustakaan, tetapi hanya dalam waktu seminggu
atau jadi kami akan menghapus bahwa obstruksi sama sekali dan benar-benar
melihat apa char dan bintang , dan bagaimana mereka berhubungan dengan memori
representasi yang lebih umum.
Jadi kita akan kembali ke itu.
>> Pertanyaan lain pada argv argc atau kita?
Ya.
AUDIENCE: Mengapa kembali kesalahan [Tak terdengar]?
DAVID Malan: Mengapa itu kembali kesalahan only-- oh!
Dalam kasus sebelumnya, ketika kita yang futzing sekitar dengan memori,
mengapa hanya kembali kesalahan ketika saya benar-benar mengetik jumlah yang besar?
Jawaban singkatnya adalah, kita hanya beruntung.
Secara umum, komputer mengalokasikan memori dalam potongan,
dan itu memberi saya cukup bongkahan besar yang Aku berhasil lolos, tanpa diketahui,
menyentuh braket 2, braket 3, braket 50, tapi begitu aku mendorong
keberuntungan saya, saya melampaui batas-batas sepotong memori
sistem operasi telah memberi saya.
Dan saat itulah menjepit dan berkata, tidak.
Kesalahan segmentasi.
Ya.
>> AUDIENCE: Bagaimana komputer tahu nilai argc?
>> DAVID Malan: Bagaimana komputer mengetahui nilai argc?
Ketika Anda menjalankan program, program yang, oleh sifat prompt berkedip,
diserahkan array kata-kata yang diketik
pada prompt, itu diketik pada prompt.
Dan sehingga operasi sistem yang pada dasarnya
Mempopulai argumen utama untuk Anda.
Jadi itulah salah satu layanan yang Anda dapatkan, semacam diam-diam
di bawah kap sebuah sistem operasi.
Pertanyaan lain?
Ya.
>> AUDIENCE: Apa core dump artinya?
DAVID Malan: Apa core dump artinya?
Jadi itu adalah pertanyaan yang bagus.
Dan biarkan aku kembali ke direktori ini di sini.
Dan Anda akan melihat bahwa Aku punya file baru di sana.
Ini memang disebut inti, dan itu sebenarnya file berukuran layak biasanya.
Itu pada dasarnya adalah sebuah snapshot dari isi memori program saya
atau RAM ketika jatuh.
Dan ini akan berguna, berpotensi, diagnostik,
setelah kami berbicara dalam kuliah masa depan dan bagian tentang debugging,
karena Anda benar-benar dapat melakukan setara dengan otopsi digital
pada file itu untuk membantu mencari tahu apa yang Anda lakukan salah dalam program Anda.
Ya.
>> AUDIENCE: Apakah argc perintah di sendiri, atau dapat Anda nama itu sesuatu?
>> DAVID Malan: Pertanyaan yang bagus.
Apakah argc perintah dalam dirinya sendiri, atau dapat Anda nama itu sesuatu?
Hal ini jelas bukan perintah.
Ini hanya variabel nama atau nama argumen ini,
dan begitu benar-benar kita bisa menelepon foo ini,
kita bisa menyebut bar ini, yang cenderung menjadi pergi-untuk kata-kata bahwa komputer
ilmuwan pergi ke.
Tapi dengan konvensi, kita menggunakan argc dan argv.
Tapi itu hanya manusia konvensi, tidak lebih.
Baiklah.
Jadi ternyata, aku sudah menceritakan sedikit lie-- putih
dan terus terang, di masa depan, Anda akan melihat kami telah berbohong putih lainnya.
Tetapi untuk sekarang, kita akan untuk mengupas salah satunya.
Dalam hal ini di sini ketika saya sebelumnya menjalankan program seperti ./hello atau ./hello-3
Zamyla, kami memiliki isi saya memori komputer tampak kira-kira seperti
ini.
Tapi ingat apa string adalah.
Apa yang kita katakan seminggu yang lalu apa string yang sebenarnya di bawah tenda?
AUDIENCE: Array of chars.
DAVID Malan: Ini adalah array dari karakter, kan?
Jadi kita mungkin memiliki sebuah array string, namun, pada gilirannya, string
adalah array dari karakter.
Jadi jika saya benar-benar ingin menjadi anal ketika saya menggambar ini,
Aku benar-benar harus menggambar sedikit lebih seperti ini,
dimana di masing-masing indeks array argv saya,
ada sendiri merupakan seluruh string itu sendiri adalah dalam array.
Dan sekarang kebohongan putih kita mengatakan hari ini
adalah bahwa gambar tidak terlihat cukup seperti ini.
Bahkan, kotak kecil yang biasanya di luar persegi panjang besar
ada.
Tapi kita akan kembali ke sebelum lama.
Tapi ini ./hello backslash 0, bahwa menjadi karakter khusus yang
demarcates akhir string, dan kami punya satu lagi setelah
Nama Zamyla ini.
Jadi apa artinya ini?
>> Nah, biarkan aku pergi ke depan dan membuka dua contoh lain
yang tersedia secara online.
Satu disebut argv1.c dan yang lainnya adalah argv2.
Ini adalah program super sederhana yang berbeda dari program masa lalu
dalam sekarang saya menggunakan argc dan argv di sini.
Dan sekarang aku mengintegrasikan dengan untuk loop sejalan 18, dari i = 0 pada hingga argc.
Dan apa yang akan saya lakukan dengan baris kode ini di sini?
Dalam bahasa Inggris.
Hal ini jelas menunjukkan penggunaan argc.
Tapi dalam bahasa Inggris, apa ia lakukan jika saya menjalankan program ini?
Ya?
>> AUDIENCE: Ini akan mencetak Anda layar sebanyak yang Anda inginkan.
DAVID Malan: Tepat.
Kata Jadi apa pun yang saya ketik pada prompt, itu
akan memuntahkan mereka pada saya satu per baris.
Jadi mari kita pergi ke depan dan melakukannya.
Biarkan aku pergi ke direktori saya dan melakukan membuat ./argv1 argv1.
Dan sekarang, mari kita tetap sederhana.
Mari kita lakukan apa-apa pada awalnya.
Hal itu mencetak satu hal, dan itu memang nama program,
karena itulah dalam braket 0.
Jika saya sekarang mengatakan foo, itu akan dilakukan kedua, dan jika saya mengatakan foo bar,
itu akan mengatakan ketiga hal.
Nah, itu agak menarik, mungkin.
Tapi ingat argv yang adalah array dari string,
tapi string adalah array dari karakter, sehingga kita bisa mengambil hal-hal takik
dan menerapkan bahwa dasar logika dan membuat kode yang
terlihat sedikit lebih samar, diakui.
Tapi dengan memiliki bersarang lingkaran, sesuatu yang mirip
dengan apa yang Anda ingat dari Mario, misalnya, jika Anda melakukannya dengan cara ini.
>> Jadi sekarang melihat on line 19, aku lagi iterasi argumen saya,
dari 0 pada hingga argc.
Dan sekarang sejalan 21-- aku meminjam trik dari week-- lalu
Saya memeriksa apa yang panjang argv braket i.
Aku menyimpan jawabannya dalam n.
Dan kemudian aku mengintegrasikan dari j sampai n, dimana j diinisialisasi ke 0.
Jadi, konvensi untuk menghitung.
Setelah Anda telah menggunakan i, jika Anda memiliki loop bersarang, Anda tidak dapat menggunakan i lagi,
jika tidak Anda akan mengkritik, berpotensi, nilai luar loop batin.
Jadi aku menggunakan j oleh konvensi.
Kami mungkin menggunakan k.
Jika Anda memiliki lebih dari k, Anda mungkin memiliki terlalu banyak bersarang, biasanya.
Tapi sekarang, perhatikan printf saya garis sedikit berbeda.
Saya tidak mencetak% s, aku mencetak% c, yang, tentu saja,
adalah sebuah tempat untuk char.
>> Dan sekarang melihat sintaks ini.
New.
Kami belum melihat itu sebelumnya.
Tapi secara logis, ini hanya berarti mendapatkan string i di argv
dan mendapatkan j apa?
AUDIENCE: Karakter.
DAVID Malan: Karakter dalam string tersebut.
Jadi dengan menggunakan tanda kurung siku diikuti oleh tanda kurung siku,
ini menyelam pertama ke string argv ini,
dan kemudian yang kedua kurung persegi dengan j
adalah menyelam ke dalam karakter string tertentu dalam argv.
Dan kemudian, hanya untuk mengukur baik, Aku mencetak baris baru di sini.
Jadi sekarang biarkan aku pergi ke depan dan membuka sebuah jendela yang sedikit lebih besar
sehingga kita dapat melihat hal ini dalam aksi.
Biarkan aku pergi ke folder itu.
Dan sekarang lakukan membuat argv-2-- whoops-- membuat argv-2, ./argv 2.
Enter.
Dan itu sedikit sulit untuk membaca secara vertikal,
tapi itu memang nama Program, diikuti oleh baris kosong.
Sekarang biarkan aku pergi ke depan dan melakukan foo.
Demikian pula sulit dibaca, tapi itu memang mencetak satu karakter per baris.
Dan jika saya melakukan bar, sekarang mencetak baris tersebut demi baris.
Jadi takeaway di sini tidak begitu banyak itu, wow, lihat trik baru ini rapi
di mana Anda bisa mendapatkan di isi karakter spesifik array ini,
melainkan bagaimana kita mengambil dasar ini ide seperti pengindeksan ke dalam array,
dan kemudian mengindeks menjadi Array yang dalam array itu,
dan hanya menerapkan ide yang sama untuk contoh sedikit lebih canggih.
Tapi dasar-dasar yang benar-benar belum berubah, bahkan sejak pekan lalu.
>> Sekarang ini adalah semacam tepat waktu, dalam hal itu, mengingat, dalam minggu nol
kami bermain dengan buku telepon seperti ini.
Dan meskipun ini jelas potongan fisik kertas,
Anda dapat jenis memikirkan buku telepon sebagai array.
Tentu saja, jika Anda adalah untuk reimplement potongan ini potongan-potongan kertas
di komputer, mungkin Anda akan menggunakan sesuatu
seperti array untuk menyimpan semua dari mereka nama dan nomor dari A sepanjang jalan
melalui Z. Jadi ini bagus, karena memungkinkan kita kesempatan,
mungkin, untuk mempertimbangkan bagaimana Anda mungkin benar-benar melaksanakan sesuatu seperti itu.
Seperti dengan serangkaian pintu di sini.
Jadi jika saya bisa-- kita perlu satu sukarela untuk datang ke atas.
Mari kita lihat.
Sebuah wajah asing mungkin, wajah asing mungkin.
Bagaimana oranye?
Di sini.
Kemeja oranye, datang ke atas.
>> Mari kita pergi ke depan sekarang dan bergerak pintu-pintu ini lebih ke samping,
memindahkan ini keluar dari jalan sejenak.
Siapa nama Anda?
>> AJAY:
>> DAVID Malan: Ajay.
David.
Senang bertemu Anda.
Baiklah.
Jadi kita memiliki belakang enam ini pintu digital pada screen-- yang
atau, lebih tepatnya, tujuh pintu di screen-- sejumlah angka.
Dan aku sudah bilang apa-apa di advance-- setuju?
AJAY: Tidak ada di muka.
DAVID Malan: Yang saya ingin Anda lakukan sekarang adalah menemukan bagi saya, dan bagi kita,
benar-benar, nomor 50, satu langkah pada satu waktu.
>> AJAY: Nomor 50?
>> DAVID Malan: Jumlah 50.
Dan Anda dapat mengungkapkan apa yang di balik setiap pintu ini
hanya dengan menyentuhnya dengan jari.
Sialan. [Tertawa]
>> [Tepuk Tangan]
>> Sangat baik dilakukan.
OK.
Kami memiliki hadiah yang indah hadiah untuk Anda di sini.
Memilih Anda film kita bahas minggu lalu.
>> AJAY: Oh, man.
Oh, aku belum pernah melihat Spaceballs.
>> DAVID Malan: Spaceballs.
Baiklah.
Jadi tunggu saja satu saat.
How-- mari kita membuat ini a moment-- mendidik
bagaimana Anda pergi tentang menemukan nomor 50?
AJAY: Aku memilih secara acak.
DAVID Malan: Jadi Anda pilih acak dan beruntung.
AJAY: Ya.
DAVID Malan: OK.
Sangat baik.
Jadi sekarang, telah Anda tidak mendapatkan beruntung, apa lagi
mungkin terjadi di balik pintu ini?
Jadi jika saya pergi ke depan dan mengungkapkan angka-angka ini di sini,
mereka benar-benar berada dalam urutan acak.
Dan yang terbaik Anda bisa memiliki dilakukan, terus terang, adalah dengan, akhirnya,
dalam kasus terburuk, memeriksa mereka semua.
Jadi, Anda punya super beruntung, yang tidak apa yang kita sebut sebuah algoritma.
Ya, selamat.
Tapi sekarang let's-- humor saya, jika Anda bisa.
Mari kita pergi ke tab ini di sini.
Dan di sini adalah angka dalam jelas apa yang tampaknya menjadi urutan acak,
dan mereka.
Tapi sekarang kalau aku bukan klaim bahwa di balik pintu ini
adalah angka yang diurutkan.
Tujuannya sekarang adalah untuk juga menemukan kami nomor 50.
Tapi melakukannya algoritmik, dan memberitahu kami bagaimana Anda akan hal itu.
Dan jika Anda menemukannya, Anda tetap film.
Anda tidak menemukannya, Anda mengembalikannya.
AJAY: Jadi aku akan memeriksa ujung pertama, untuk menentukan apakah there
[Tertawa DAN Tepuk Tangan]
DAVID Malan: Di sini Anda pergi.
Mari kita lihat satu pendahulu Ajay ini,
Sean, yang tidak cukup beruntung.
OK, jadi tugas Anda di sini, Sean, adalah sebagai berikut.
Saya telah tersembunyi di balik ini pintu nomor tujuh,
tapi terselip di beberapa pintu ini juga adalah bilangan non-negatif lainnya.
Dan tujuan Anda adalah untuk memikirkan ini baris atas nomor hanya sebagai array.
Kami hanya urutan potongan kertas dengan angka di belakang mereka.
Dan tujuan Anda adalah, hanya menggunakan bagian atas Array di sini, cari saya nomor tujuh.
Dan kita kemudian akan kritik bagaimana Anda pergi tentang melakukannya.
Temukan kami nomor tujuh, silakan.
Nomor
5, 19, 13.
Ini bukan pertanyaan jebakan.
1.
Pada titik ini skor Anda sangat tidak baik, sehingga Anda mungkin juga terus berjalan.
3.
Pergilah.
Terus terang, saya tidak bisa tidak bertanya-tanya apa yang Anda bahkan berpikir tentang.
>> SEAN: Saya dapat mengambil dari hanya baris atas.
DAVID Malan: Hanya baris atas.
Jadi, Anda punya tiga kiri.
Jadi menemukan saya 7.
>> [AUDIENCE Teriak SARAN]
Jadi kedua dari mereka yang menakjubkan untuk alasan yang sangat berbeda.
Jadi ini adalah di mana kita tinggalkan sejenak lalu,
dan wawasan kunci di sini itu pintu-pintu ini memiliki angka
belakang mereka yang diurutkan, ideal takeaway yang adalah bahwa Anda bisa melakukan
fundamental yang lebih baik di example-- kedua ini
dan, memang, itu adalah Sean upaya pertama dengan angka acak
seperti before-- tetapi segera karena nomornya diurutkan,
seperti buku telepon, apa yang dapat Anda lakukan jelas?
Atau bagaimana Anda dapat memanfaatkan pengetahuan itu?
Ya.
>> AUDIENCE: Anda pergi setengah [Tak terdengar].
DAVID Malan: Ya.
Tepat.
Jadi naluri awal Ajay adalah untuk memeriksa ujungnya, seperti yang saya ingat,
dan kemudian kita semacam selesai contoh cepat.
Tetapi jika kita mulai melakukan hal ini lebih metodis sepanjang jalur tersebut,
tapi mulai mungkin dalam tengah, karena mereka diurutkan,
segera setelah kami mengungkapkan nomor 16, karena itu kita TAHU
dan mari kita melakukan apa yang kita itu-- Oleh karena tahu bahwa 50, dalam kasus hari ini,
harus menjadi ke kanan.
Jadi sama seperti pada minggu nol ketika kami merobek buku telepon di setengah
dan melemparkan setengah dari masalah pergi, ide yang sama di sini.
Kita bisa membuang setengah ini masalah pergi.
Dan mungkin apa yang Anda mungkin melakukan algorithmically,
setelah Anda tahu bahwa 50 harus ke kanan, jika di mana saja,
adalah mencoba ada, di tengah pintu yang tersisa.
Tentu saja, 50 lebih tinggi dari 42, jadi kita bisa
membuang sisa ini seperempat masalah pergi,
dan, akhirnya, mengidentifikasi sesuatu seperti 50.
Tapi sama seperti dengan buku telepon, angka-angka ini
diberikan kepada kami sudah terurut, yang membuat kita
dengan pertanyaan, bagaimana Anda mendapatkan hal-hal dalam rangka diurutkan?
Dan, terus terang, berapa biayanya?
Itu salah satu hal yang harus menyerahkan buku telepon
dan kemudian kesan teman-teman Anda dengan mencari nomor telepon yang benar-benar cepat, kan?
Merobek 32 halaman untuk menemukan orang dari 4 miliar halaman,
kami katakan adalah salah satu contoh ekstrim.
Tapi berapa lama waktu yang dibutuhkan Verizon untuk menyortir buku telepon?
Berapa banyak waktu yang dibutuhkan kita untuk menyortir tujuh angka-angka ini?
Itu adalah pertanyaan yang kami telah sejauh ini benar-benar diabaikan.
>> Jadi mari kita menjawab pertanyaan ini sekarang.
Dan kita semua dari film sekarang, tapi kami memiliki beberapa bola stres.
Jika, mengatakan, delapan relawan tidak akan keberatan bergabung dengan kami di sini?
Mari kita pergi ke depan dan melakukan, bagaimana kalian berempat, tiga dari Anda di sini?
Dapatkan beberapa wajah baru.
Dan kalian berempat sana?
Dan sekarang-- jangan Bias di sini-dan nomor delapan di sini di akhir.
Ayo up.
Baiklah.
Jadi apa yang kita miliki di sini untuk masing-masing adalah nomor.
Jika Anda ingin pergi depan, mengambil nomor ini.
Siapa nama Anda?
>> Artie: Artie.
>> DAVID Malan: Artie, oke.
Kau nomor 1.
>> AMIN: Amin.
DAVID Malan: Amin.
David.
Kau nomor 2.
Dan pergi ke depan, seperti yang saya tangan Anda lembar kertas,
berbaris diri di depan musik berdiri di urutan yang sama seperti di atas sana.
>> ANDY: Hi, Andy.
>> DAVID Malan: Andy, itu bagus untuk melihat Anda.
Nomor 3.
>> JACOB: Jacob.
>> DAVID Malan: Jacob, nomor 4.
Welcome aboard.
GRANT: Grant.
DAVID Malan: Grant.
Nomor 5.
>> Alanna: Alanna.
>> DAVID Malan: Alanna, nomor 6.
>> FRANCES: Frances.
DAVID Malan: Frances, nomor 7.
Dan?
>> RACHEL: Rachel.
>> DAVID Malan: Rachel, nomor 8.
Baiklah.
Pergi ke depan dan mendapatkan diri Anda dalam urutan ini.
Mari saya menempatkan satu yang tersisa musik berdiri di tempat.
Di mana Anda perlu berdiri?
OK.
Pergi ke depan dan hanya menempatkan nomor Anda di mana penonton dapat melihat mereka di,
musik berdiri menghadap ke luar.
Dan mudah-mudahan, pertama kami kewarasan cek di sini-4, 2, 6.
Oh-oh.
Tunggu dulu.
Kami tidak memiliki 8.
Saya perlu untuk mengusir Anda dari contoh entah bagaimana.
Nomor
Tidak, itu OK.
Mari kita lihat.
Kita bisa melakukan ini.
Stand by.
Di sana kami pergi.
Benar.
Baiklah.
Jadi, sekarang kita memiliki 8, 1, 3 7, 5.
OK.
Sangat baik.
>> Jadi pertanyaan di tangan, pada apa biaya, dan melalui metode apa,
dapat kita benar-benar mengurutkan nomor ini di sini sehingga kita dapat jenis bekerja mundur,
akhirnya, dan decide-- itu benar-benar mengesankan, apakah benar-benar efisien,
bahwa saya dapat membagi dan menaklukkan buku telepon?
Apakah benar-benar efisien Aku bisa membagi dan menaklukkan
potongan-potongan digital kertas di papan tulis,
apakah mungkin itu akan biaya kami keberuntungan dalam waktu atau energi atau CPU siklus
untuk benar-benar mendapatkan data kami ke beberapa terurut?
Jadi mari kita mengajukan pertanyaan itu.
>> Jadi pertama, angka-angka ini di hampir secara acak,
dan aku akan mengusulkan satu algoritma, atau proses
dengan mana kita dapat memilah orang-orang ini.
Aku akan mendekati ini cukup naif.
Dan aku akan mengenali bahwa itu semacam banyak bagi saya
untuk membungkus pikiran saya sekitar mengatur seluruh data sekaligus.
Tapi kau tahu apa?
Aku akan membuat beberapa perbaikan marjinal sangat sederhana.
4 dan 2 adalah rusak, jika tujuannya adalah untuk pergi dari 1 hingga 8.
Jadi, Anda tahu apa?
Aku akan memiliki Anda orang menukar, jika Anda mengaktifkan
secara fisik posisi dan potongan kertas Anda.
Sekarang 4 dan 6, ini adalah dalam rangka.
Aku akan meninggalkan orang-orang menjadi.
6 dan 8, mereka berada di urutan.
Akan meninggalkan mereka menjadi.
8 and1, rusak.
Jika Anda berdua tidak keberatan swapping.
Sekarang 8 dan 3, jika kalian bisa bertukar.
8 dan 7, jika kalian bisa bertukar.
Dan 8 dan 5, jika kalian bisa bertukar.
>> Sekarang, aku lakukan?
Tidak, jelas tidak.
Tapi aku telah membuat situasi yang lebih baik, kan?
Siapa nama Anda lagi, angka 8?
>> RACHEL: Rachel.
DAVID Malan: Jadi Rachel memiliki efektif menggelegak cukup jauh,
semua jalan ke akhir array saya nomor di sini.
Jadi masalah yang semacam dipecahkan.
Sekarang, jelas, 2 masih perlu bergerak sedikit, dan 4 dan 6 dan 1.
Tapi aku tampaknya telah mendapat sedikit lebih dekat ke solusi.
Jadi mari kita terapkan ini 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, nggak.
Mari kita swap.
Dan sekarang 7 dan 8.
Dan siapa namamu lagi?
FRANCES: Frances.
DAVID Malan: Frances.
Jadi sekarang Frances adalah bahkan lebih baik posisi, karena sekarang 7 dan 8
dengan benar menggelegak ke atas.
Jadi 2 dan 4, OK.
4 dan 1, tukar mari kita.
4 dan 3, tukar mari kita.
4 dan 6, Anda OK.
6 dan 5, tukar mari kita.
Dan sekarang orang-orang baik.
Kita hampir sampai.
2 dan 1, rusak, sehingga menukar.
Dan sekarang biarkan aku melakukan cek kewarasan.
2 dan 3, 3 dan 4, 4 dan 5, 5 dan 6, 6 dan 7, 8.
OK, jadi kita sudah selesai.
>> Tapi berapa biayanya yang saya mengurutkan nomor ini di sini?
Nah, berapa banyak langkah yang saya berpotensi ambil ketika menyortir orang-orang ini?
Yah, kita akan kembali ke pertanyaan itu.
Tapi, terus terang, jika Anda punya sedikit bosan, itu
jenis mengungkapkan bahwa ini bukan mungkin algoritma yang paling efisien.
Dan memang, terus terang, aku berkeringat semua lebih berjalan bolak-balik.
Itu tidak merasa sangat efisien.
Jadi mari kita mencoba sesuatu yang lain.
Jika kalian bisa me-reset dirimu delapan nilai-nilai ini.
Good job.
>> Mari kita lihat secara digital, hanya sesaat sebelum kita mencoba sesuatu yang lain,
apa yang baru saja terjadi.
Sampai di sini, Anda akan melihat visualisasi dari delapan manusia
dimana biru dan merah bar mewakili angka.
Lebih tinggi bar, semakin besar nomor.
Semakin pendek bar, semakin kecil angkanya.
Dan apa yang Anda akan melihat dalam secara acak lebih dari delapan dari mereka.
Anda akan melihat bar ini mendapatkan diurutkan berdasarkan algoritma yang sama,
atau set instruksi yang kami akan menelepon selanjutnya bubble sort.
Jadi perhatikan, setiap detik atau lebih, dua bar yang menyalakan merah,
sedang dibandingkan dengan komputer.
Dan kemudian jika bar besar dan sedikit bar rusak,
mereka sedang bertukar bagi saya.
>> Sekarang ini sangat membosankan untuk menonton ini, tentu,
untuk waktu yang lama, tetapi melihat takeaway-- bar besar bergerak ke kanan,
sedikit bar bergerak ke kiri.
Mari kita membatalkan proses ini dan mempercepat ini
menjadi jauh lebih cepat, sehingga kita bisa mendapatkan rasa tingkat tinggi apa,
memang, bubble sort lakukan.
Memang, itu menggelegak hingga sisi kanan daftar,
atau array, bar yang lebih besar.
Dan sebaliknya, bar kecil yang menggelegak jalan mereka ke kiri,
meskipun pada kecepatan yang lebih cepat dari sebelumnya kita lakukan.
Jadi, sulit untuk melihat dengan manusia, tapi secara visual itu memang apa
yang terjadi.
>> Tapi mari kita coba fundamental pendekatan yang berbeda sekarang.
Mari kita mencoba yang berbeda algoritma dimana kita memiliki Anda
orang dimulai dalam ini asli posisi, yang perintah ini di sini.
Dan mari kita pergi ke depan sekarang.
Dan aku akan melakukan sesuatu bahkan lebih sederhana, kan?
Dalam retrospeksi, swapping berpasangan lagi dan lagi, hampir sedikit pintar.
Mari kita lakukan sesuatu yang lebih naif, di mana jika saya ingin menyortir orang-orang ini,
biarkan aku terus mencari untuk elemen terkecil.
Jadi sekarang, 4 adalah Jumlah terkecil yang pernah kulihat.
Aku akan ingat itu.
Tidak, 2 lebih baik, dan ingat bahwa.
1 lebih kecil.
3, 7, 5.
OK.
Satu-- siapa namamu lagi?
>> Artie: Artie.
>> DAVID Malan: Artie.
Jadi, Artie, silakan.
Aku akan menarik Anda keluar dari garis.
Jika Anda bisa kembali ke sini.
Dan saya harus membuat ruang untuk dia.
Kami memiliki titik keputusan di sini.
Bagaimana kita bisa membuat ruang untuk Artie sini pada awal di mana nomor 1 milik?
>> AUDIENCE: Shift.
>> DAVID Malan: OK, kita bisa menggeser semua orang.
Tapi mengusulkan optimasi.
Yang terasa sedikit mengganggu bagi saya untuk meminta empat orang
untuk memindahkan semua jalan ke bawah.
Apa lagi yang bisa saya lakukan?
>> AUDIENCE: Beralih mereka.
>> DAVID Malan: Beralih mereka.
Dan siapa namamu lagi?
>> JACOB: Jacob.
DAVID Malan: Jacob, bergerak.
Jauh lebih efisien hanya untuk memiliki Lokasi tukar Yakub dengan Artie,
sebagai lawan memaksa keempat orang-orang ini,
terima kasih banyak, untuk posisi yang benar mereka.
Apa yang baik tentang Artie sekarang, dia dalam posisi yang benar nya.
Mari kita lakukan ini lagi.
2, itu jumlah terkecil yang pernah kulihat.
3, 7, 5.
OK.
2 pasti terkecil.
Tidak perlu melakukan pekerjaan apapun.
Mari kita lakukan lagi.
6.
Terkecil?
8.
Tidak.
4?
Ooh.
Biarkan aku ingat 4.
3.
Biarkan aku ingat 3.
7, 5.
Jumlah terkecil yang sudah terlihat pada lulus ini adalah 3.
Jika Anda akan datang pada keluar.
Dimana kita akan menempatkan Anda?
Dan siapa namamu?
>> Alanna: Alanna.
>> DAVID Malan: Alanna, kami akan harus mengusir Anda.
Tapi yang lebih efisien, hanya swap dua orang,
daripada memiliki beberapa orang benar-benar menghindari lebih.
Sekarang mari kita lakukan ini lagi.
Aku akan memilih 4, jadi datang pada keluar.
Dan siapa yang akan pindah?
Nomor 8, tentu saja.
Jika sekarang saya menemukan nomor 5, ayolah keluar.
Nomor 8 akan mendapatkan diusir lagi.
Saya sekarang akan menemukan nomor 6 di tempat.
7 di tempat.
8 di tempat.
>> Apa yang baru saja kita lakukan saat ini adalah sesuatu yang disebut selection sort,
dan jika kita memvisualisasikan ini, itu akan merasa sedikit berbeda.
Mari kita pergi ke depan dan dari ini menu di sini, visualization-- ini
mari kita mengubah ini untuk-- ayolah, Firefox.
Mari kita mengubahnya ke selection sort.
Dan mari kita mempercepatnya seperti sebelumnya, dan mulai visualisasi sekarang.
Dan algoritma ini memiliki nuansa yang berbeda untuk itu.
Pada setiap iterasi, terus terang, itu bahkan lebih mudah.
Aku hanya memilih elemen terkecil.
Sekarang, terus terang, saya punya sedikit beruntung bahwa waktu, dalam hal ini diurutkan super cepat.
Unsur-unsur yang acak.
Ini bukan, seperti yang kita akan akhirnya lihat, pada dasarnya lebih cepat.
Tapi mari kita melihat ketiga dan terakhir pendekatan di sini untuk apa yang terjadi.
Jadi mari kita pergi ke depan dan me-reset kalian terakhir kali berada dalam urutan ini di sini.
>> Dan sekarang, aku akan menjadi sedikit lebih pintar,
hanya untuk melengkapi algoritma kami.
Aku akan melakukan hal ini.
Aku akan tidak pergi bolak-balik begitu banyak.
Terus terang, saya bosan semua melintasi ini.
Aku hanya akan mengambil apa yang saya diberikan pada awal daftar,
dan aku akan memilah yang itu juga.
Jadi di sini kita.
Nomor 4.
Aku akan memasukkan nomor 4 ke dalam daftar diurutkan.
Selesai.
Saya mengklaim sekarang, dan hanya untuk membuat ini lebih jelas, ini bagian dari daftar saya diurutkan.
Ini semacam klaim bodoh, tapi memang 4 diurutkan dalam daftar ukuran satu.
Sekarang, aku akan mengambil nomor 2.
Nomor 2 Aku sekarang akan masukkan ke tempat yang tepat.
Jadi bagaimana 2 milik?
Jelas, di sini.
Jadi pergi ke depan dan bergerak kembali, jika Anda bisa.
Dan kenapa tidak kalian hanya mengambil musik Anda berdiri dengan Anda saat ini.
Dan mari kita paksa memasukkan Anda ke awal daftar.
Jadi sedikit lebih banyak pekerjaan.
Aku harus bergerak Yakub sekitar, dan siapa namamu?
>> AMIN: Amin.
>> DAVID Malan: Amin.
Tapi setidaknya aku tidak bolak-balik.
Aku hanya mengambil hal-hal seperti yang saya pergi.
Aku hanya memasukkan mereka di tempat yang tepat.
6, ini sebenarnya cukup mudah.
Mari kita memasukkan Anda di sana, jika Anda hanya ingin pindah sedikit.
Nomor 8, juga cukup mudah.
Tepat di sana.
Sialan.
Nomor 1 kita tidak bisa hanya menukar dengan Amin di sini,
karena itu akan untuk mengacaukan pesanan.
Jadi kita harus sedikit lebih pintar.
Jadi, Artie, jika Anda bisa cadangan sejenak.
Mari kita pergi ke depan dan menggeser sekarang, tidak seperti algoritma kami sebelumnya,
untuk memberikan ruang bagi Artie di sini di awal.
Jadi pada akhir hari, aku agak melakukan apa yang saya ingin menghindari sebelumnya.
Jadi algoritma saya adalah semacam dari terbalik, intelektual,
dari apa yang awalnya.
Aku hanya melakukan pergeseran pada titik yang berbeda.
Sekarang aku di 3.
Oh, sialan.
Kita harus melakukan lebih banyak pekerjaan lagi.
Jadi mari kita mendorong Anda keluar.
Mari kita bergerak 8, 6, 4-- oh oh-- dan 3 akan pergi di sana.
Jadi pada sedikit tabungan setidaknya saat ini.
7, tidak terlalu banyak pekerjaan yang harus dilakukan.
Jadi jika Anda ingin pop kembali, mari kita masukkan Anda.
Dan terakhir, 5, jika Anda ingin pop kembali, kami
perlu menggeser Anda, Anda, Anda, sampai lima di tempat.
>> Jadi sekarang untuk melihat ini pada tingkat tinggi grafis,
mari kita lakukan algoritma ini visualisasi satu waktu tambahan.
Jadi kita ini akan memanggil insertion sort.
Kami akan menjalankannya seperti cepat, dan mulai di sini.
Dan juga, memiliki rasa yang berbeda.
Ini semacam menjadi lebih baik dan lebih baik, tapi itu tidak pernah sempurna
sampai aku masuk dan halus dalam kesenjangan tersebut.
Karena, sekali lagi, aku hanya mengambil apa Aku diberikan dari kiri ke kanan.
Jadi saya tidak begitu beruntung bahwa segala sesuatunya sempurna.
Itu sebabnya kami memiliki kecil ini mispositions bahwa kita tetap dari waktu ke waktu.
>> Jadi semua algoritma ini tampaknya dijalankan pada langkah yang sedikit berbeda.
Bahkan, mana yang akan Anda katakan adalah yang terbaik atau tercepat sejauh ini?
Bubble sort, yang pertama?
Seleksi semacam, kedua?
Insertion sort, ketiga?
Saya mendengar beberapa macam pilihan.
Pikiran lain?
>> Jadi ternyata bahwa semua algoritma ini
pada dasarnya hanya seefisien setiap other-- atau, sebaliknya, sama seperti
efisien karena satu sama lain, karena kita dapat melakukan fundamental
lebih baik dari ketiga algoritma ini.
Dan itu sedikit kebohongan putih, juga.
ketika saya mengatakan sebagai efisien atau tidak efisien,
itu setidaknya untuk nilai super besar n.
Ketika kita memiliki delapan orang di sini, atau mungkin 50 atau jadi bar di layar,
Anda benar-benar akan melihat perbedaan antara ketiga algoritma.
Tapi seperti n, jumlah orang, atau jumlah angka,
atau jumlah orang di telepon buku, atau jumlah halaman web
dalam database Google akan lebih besar dan lebih besar,
kita akan melihat bahwa ketiga ini algoritma sebenarnya sangat miskin.
Dan kita bisa melakukan fundamental lebih baik dari itu.
>> Mari kita lihat, akhirnya, apa algoritma ini mungkin
terdengar seperti di konteks beberapa orang lain
serta dengan cara ini visualisasi sini
yang akan memperkenalkan kita kepada sejumlah algoritma.
Mari kita pergi ke depan dan mengucapkan selamat peserta kami di sini, semuanya
diurutkan sendiri sangat baik.
Jika Anda ingin mengambil hadiah perpisahan.
Anda dapat menyimpan nomor Anda.
Dan apa yang akan Anda lihat, atau lebih tepatnya mendengar, sekarang,
adalah bahwa ketika kita menempatkan suara untuk masing-masing bar ini
dan menghubungkannya dengan perangkat lunak, frekuensi yang berbeda dari suara,
Anda dapat membungkus pikiran Anda lebih audioly sekitar apa setiap hal-hal ini
terlihat seperti.
Yang pertama adalah insertion sort
>> [NADA]
>> Ini adalah semacam gelembung.
>> [NADA]
>> Seleksi semacam.
>> [NADA]
>> Sesuatu yang disebut merge sort.
>> [NADA]
>> Semacam Gnome.
>> [NADA]
>> Itu saja untuk CS50.
Kita akan melihat Anda pada hari Rabu.
>> Narator: Dan sekarang, "Jauh Pikiran, "oleh Daven Farnham.
Mengapa untuk loop?
Mengapa tidak membuatnya lebih baik?
Aku akan membuat lima lingkaran.
>> [Tertawa]