[Powered by Google Translate] [Bagian 3] [Kurang Nyaman]
>> [Nate Hardison] [Harvard University]
>> [Ini adalah CS50.] [CS50.TV]
>> Baiklah, mari kita mulai.
Selamat Datang Minggu 4 dari CS50.
Jika kalian membuka web browser dan membuka pset 3,
Perebutan dengan CS50, kita akan mulai terjadi
melalui bagian dari pertanyaan di sana.
Sama seperti minggu lalu, kita akan bekerja di CS50 Spaces,
jika Anda juga akan menarik bahwa sampai juga,
dan jika Anda pergi ke depan dan kunjungi link yang saya punya di sini di bagian atas.
Sudah waktunya untuk memulai.
Kami punya hi kecil kami program di sini. Gila apa-apa.
Salah satu hal pertama yang saya ingin lakukan dengan kalian hari ini adalah pergi ke beberapa solusi
untuk Set, Soal 1 jenis solusi misalnya,
saja sehingga Anda bisa mendapatkan merasakan apa jenis staf kode menulis,
apa jenis siswa kode lain menulis,
dan memiliki Anda mengambil melihat hal itu karena saya tahu itu aneh
ketika Anda mengirimkan solusi untuk sejumlah masalah dan mendapatkan komentar
pada versi Anda sendiri, tapi kadang-kadang sangat membantu untuk melihat bagaimana orang lain melakukannya,
terutama yang nice looking.
Untuk sebagian besar, saya benar-benar terkesan dengan solusi yang kalian dihasilkan.
Saya belum mulai melihat 2s Set Anda Soal, tetapi jika mereka sesuatu seperti yang pertama,
itu berarti apa-apa selain hal-hal baik.
>> Jika Anda melihat revisi saya, mari kita mulai sepanjang jalan turun di Revisi 1,
dan kita akan mengambil cepat melihat solusi Mario.
Jika Anda menarik ini, program-program yang kita akan hadir adalah benar.
Tidak ada masalah dengan benar masalah ini, melainkan,
kami ingin berbicara sedikit tentang masalah desain yang berbeda
yang sedang digunakan di sini.
Salah satu hal yang menarik tentang solusi
adalah bahwa hal itu digunakan ini membangun baru yang disebut pon mendefinisikan,
kadang-kadang juga disebut sebagai hash menentukan.
Biarkan aku memperbesar di sini.
Sebuah # define memungkinkan Anda untuk memberikan nama ke nomor tersebut dalam program Anda.
Dalam kasus ini, ketinggian maksimum piramida di Mario
adalah 23 dan bukannya menempatkan 23 di saya kode-
kita akan lihat bahwa sebagai hard coding 23 -
bukannya ini memberikan MAX_HEIGHT nama ke nomor tersebut,
sehingga di sini dalam do-while loop saya
Anda benar-benar dapat merujuk ke MAX_HEIGHT
bukannya menempatkan nomor 23 masuk
[Mahasiswa] Apa keuntungan dari melakukan hal itu?
Itu pertanyaan yang bagus.
Salah satunya adalah pembacaan.
Keuntungan menggunakan # define adalah pembacaan.
Ketika saya membaca kode ini, saya bisa melihat apa yang terjadi.
>> Aku bisa melihat di sini bahwa kondisi ini kita sedang menguji
dari ketinggian menjadi <0, yang kita bisa juga didefinisikan
menjadi ketinggian minimum atau ketinggian min.
Keuntungan lainnya adalah bahwa saya kemudian dapat membaca seluruh baris untuk melihat
bahwa kita juga memeriksa untuk memastikan bahwa ketinggian tidak lebih besar dari ketinggian max,
karena kita akan terus sementara tingginya lebih besar dari ketinggian maks.
Keuntungan lainnya adalah-jika saya zoom out sedikit di sini-
jika saya menjalankan program ini dan saya menjalankannya, mengatakan, dengan 23 sekarang,
akan mencetak semua 23 baris begitu saja.
Tapi mengatakan bahwa saya ingin mengubah ketinggian max,
dan sekarang saya ingin membatasi ketinggian maksimum piramida
menjadi hanya mengatakan-man, yang funky.
# Include, # define MAX_HEIGHT,
dan katakanlah kita ingin mengatur itu sama dengan 10.
Sekarang pada titik ini, semua saya harus lakukan adalah mengubahnya dalam satu lokasi.
Saya bisa mengkompilasi ulang kode, dan sekarang jika saya mencoba dan ketik 12,
ia akan meminta lagi.
Dalam kasus ini, kita hanya menggunakan MAX_HEIGHT sekali.
Ini tidak begitu besar dari kerumitan untuk pergi dalam
dan mengubahnya dalam loop sementara jika Anda perlu.
Namun dalam program di mana Anda referensi angka ajaib yang sama
berulang-ulang, hal ini # define mekanisme benar-benar berguna
karena Anda hanya mengubah satu kali di bagian atas dari file-itu biasanya di mana Anda menempatkan mereka-
dan perubahan merembes melalui sisa file.
>> Hal-hal lain saya ingin untuk dicatat dalam tugas ini yang saya pikir tampak sangat bagus,
salah satu adalah penamaan variabel.
Anda lihat di sini bahwa kita punya variabel integer disebut baris dan disebut tinggi.
Spasi, hash, ia membantu membuat kode sedikit lebih mudah dibaca,
membuatnya sedikit lebih dimengerti apa yang sebenarnya terjadi.
Hal ini berbeda untuk menggunakan, katakanlah, huruf acak
atau hanya omong kosong sama sekali.
Suatu hal terakhir yang saya akan menunjukkan adalah bahwa dalam untuk loop,
sering kali ini iterator variabel, loket ini yang Anda gunakan dalam Anda untuk loop,
itu standar dan konvensional untuk memulai mereka dengan baik i dan j kemudian dan kemudian k
dan pergi dari sana jika Anda membutuhkan lebih banyak variabel,
dan ini hanya sebuah konvensi.
Ada banyak konvensi.
Hal ini tergantung pada bahasa pemrograman yang Anda gunakan.
Tapi di C, kita biasanya mulai dengan i.
Ini tidak masuk akal untuk menggunakan, katakanlah, atau b
tergantung pada situasi.
Itu saja untuk yang satu ini.
Jika Anda sekarang menarik Revisi 2, Anda akan melihat lain Mario,
dan yang satu ini mirip dengan yang lain yang baru saja kita lihat,
tetapi tidak sesuatu yang baik dari dingin.
Jika kita melihat pada bagian ini di sini di dalam batin untuk loop,
mereka menggunakan beberapa sintaks mencari gila di sini tepat di baris ini.
Ini disebut ternary operator.
Ini adalah sebuah pernyataan jika lain diringkas menjadi satu baris.
Kondisi ini ini bagian dalam tanda kurung.
Ini setara dengan mengatakan jika j <tinggi - i - 1.
Dan kemudian apa isi dari bahwa jika blok yang akan ruang
dan kemudian isi apa lagi yang akan yang ini #.
Ini dasarnya menetapkan ruang untuk variabel ini.
Ini menempatkan ruang dalam isi dari variabel blok,
jika kondisi ini terpenuhi, dan jika kondisi ini tidak terpenuhi,
maka variabel blok ini mendapatkan #.
Dan kemudian, tentu saja, bukan membangun sebuah string seluruh
dan mencetak segala sesuatu pada akhirnya solusi ini mencetaknya keluar satu karakter pada satu waktu.
Pretty cool.
>> Lain beberapa hal untuk melihat. Kami akan pindah ke serakah.
Sekarang jika kita melihat serakah, ini solusi pertama
menggunakan ini # mendefinisikan cukup sedikit.
Kami punya satu konstan yang didefinisikan untuk masing-masing nomor yang berbeda dalam program ini.
Kami punya satu untuk sen per dolar, satu untuk tempat, dime, sen, dan uang,
dan sekarang jika kita scroll ke bawah dan membaca kode,
kita bisa melihat semua yang dilakukan-while pencetakan standar keluar.
Jenis inti dari masalah ini menyadari bahwa
Anda perlu mengkonversi pelampung yang Anda baca dalam dari pengguna ke integer
untuk secara akurat melakukan matematika, dan ini adalah karena
dengan angka floating point, seperti kita bicarakan dalam ceramah singkat,
itu tidak mungkin untuk secara akurat mewakili setiap nilai tunggal pada garis bilangan
karena ada nilai-nilai tak terhingga banyaknya antara 3 dan, katakanlah, bahkan 3,1.
Anda dapat memiliki 3,01 dan 3,001 dan 3,0001, dan Anda dapat terus berjalan.
Ternyata setiap kali Anda bekerja dengan uang, Anda sering ingin mengubahnya
dalam format integer sehingga Anda tidak kehilangan uang dan hal semacam itu.
Melakukan itu dan pembulatan adalah kunci.
Solusi ini menggunakan algoritma, sempurna langsung besar,
yang decremented jumlah sen tersisa, pertama oleh kuartal,
kemudian oleh dimes, maka dengan uang receh, maka dengan uang,
dan menambah jumlah koin setiap kali.
>> Solusi lain yang akan kita lihat, karena saya zoom out dan pergi ke Revisi 4,
memiliki awal yang sangat mirip, tetapi malah digunakan div dan mod
tepat di sini untuk menghitung jumlah sen.
Ini, jumlah perempat adalah sama dengan jumlah sen dibagi dengan 25,
dan alasan ini bekerja adalah karena kita sedang melakukan pembagian integer,
jadi membuang sisa.
[Mahasiswa] Apakah kita harus komentar pencarian?
Ini benar-benar tergantung.
[Mahasiswa] Kau komentar lebih dari kode di sini.
Ya, dan jadi ada sekelompok dari berbagai filosofi ini.
Filosofi pribadi saya adalah bahwa kode Anda benar-benar kebenaran,
seperti kode Anda adalah apa yang benar-benar melaksanakan pada komputer,
sehingga kode Anda harus sebagai dibaca mungkin untuk tidak memerlukan banyak komentar.
Yang mengatakan, ketika Anda melakukan hal-hal yang agak sulit matematis
atau algorithmically, ada baiknya untuk komentar mereka sehingga Anda dapat
menambah dimensi ekstra, lapisan tambahan untuk siapa pun yang membaca kode Anda.
Dalam solusi ini, sering kali mereka berkomentar lebih banyak hanya karena
kami ingin dapat mendistribusikan mereka dan memiliki orang-orang menjemput mereka
dan membacanya dengan mudah.
Tapi yang pasti, saya akan setuju bahwa ini adalah berat.
[Mahasiswa] Tapi ketika dalam keraguan, pergi lebih berat?
Jika ragu, pergi lebih berat.
Beberapa orang kadang akan mengatakan 0 kembali atau sesuatu seperti itu.
Saya pikir itu konyol komentar.
Jelas itulah yang terjadi.
Saya tidak perlu bahasa Inggris untuk memberitahu saya bahwa.
Kadang-kadang orang akan menulis hal-hal seperti "kthxbai!"
Itu agak lucu tapi juga tidak-
itu tidak membuat perbedaan antara titik komentar atau tidak.
Mereka jenis komentar hanya ha, ha.
Cool.
>> Pada titik ini, mari kita mulai bekerja pada Masalah Set 3 bagian pertanyaan.
Jika kalian menarik ini lagi,
seperti minggu lalu, kita tidak akan menonton celana pendek di bagian ini.
Kami akan membiarkan kalian melakukan itu pada waktu Anda sendiri dan berbicara tentang pertanyaan.
Tapi sekarang dalam bagian ini kita akan menghabiskan waktu sedikit lebih
berbicara tentang kurang dari dasar-dasar pengkodean
seperti yang kami lakukan pekan lalu, dan sebagai gantinya, kita akan lebih fokus pada
sedikit lebih dari teori, sehingga berbicara tentang pencarian biner dan kemudian menyortir.
Dari anda yang telah mengikuti bersama dengan kuliah,
bisa seseorang memberi saya rekap dari apa perbedaannya
antara pencarian biner dan pencarian linier?
Apa yang terjadi? Tentu.
Linear pencarian pencarian melalui setiap elemen dalam daftar diurutkan
satu per satu per satu oleh satu per satu,
dan pencarian biner membagi daftar menjadi 2 kelompok,
memeriksa apakah nilai kunci yang Anda cari lebih besar atau lebih kecil dari nilai titik tengah
bahwa Anda hanya menemukan, dan jika kurang dari, ia pergi dengan daftar yang lebih rendah
dan kemudian membagi itu lagi, apakah fungsi yang sama
semua jalan ke bawah sampai menemukan titik tengah untuk menjadi sama dengan nilai itu sendiri.
Benar.
>> Mengapa kita peduli?
Mengapa kita berbicara tentang pencarian biner dibandingkan pencarian linear?
Ya.
Biner adalah jauh lebih cepat, jadi jika Anda dua kali lipat ukuran masalah
dibutuhkan satu langkah lagi lebih dari dua kali lebih banyak.
Tepat.
Itu jawaban yang bagus.
Pencarian linear sangat banyak memeriksa satu elemen pada suatu waktu,
dan seperti yang kita lihat pada hari pertama kuliah
Ketika Daud pergi melalui contoh bukunya telepon
dan merobek satu halaman dari buku telepon pada suatu waktu
dan terus melakukan hal itu berulang-ulang,
itu akan membawanya waktu yang sangat lama untuk menemukan siapa pun di buku telepon,
kecuali, tentu saja, ia sedang mencari seseorang di awal alfabet.
Dengan pencarian biner, Anda dapat pergi jauh lebih cepat,
dan itu bukan hanya dua kali lebih cepat atau 3 kali lebih cepat atau 4 kali lebih cepat.
Tapi masalahnya semakin kecil dan lebih kecil dan lebih kecil lebih cepat.
Untuk menggambarkan hal ini, kita akan mulai berbicara tentang apa yang terjadi
ketika kita menulis pencarian biner.
Masalah yang dihadapi adalah bahwa jika saya memiliki sebuah array angka,
katakanlah, 1, 2, 3, 5, 7, 23, 45, 78, 12323,
dan kemudian dengan 9 ton 0s setelah itu,
kami ingin dapat mengetahui dengan sangat cepat apa yang ada di
ini array angka.
Saya tahu ini tampaknya sedikit konyol dan sedikit dibikin,
karena sekarang itu.
Kami memiliki sebuah array yang tidak memiliki unsur-unsur yang sangat banyak di dalamnya,
dan jika saya meminta salah satu dari Anda untuk mengetahui apakah atau tidak
23 adalah dalam array, Anda dapat melakukannya cukup cepat
hanya dengan melirik hal ini dan mengatakan ya atau tidak.
Analog yang perlu dipertimbangkan adalah bayangkan jika ini adalah, katakanlah,
Excel spreadsheet dengan 10.000 baris, 20.000 baris.
Tentu saja, Anda dapat melakukan perintah F atau F kontrol dan melihat sesuatu.
Anda juga dapat menggunakan filter dan hal-hal pencarian,
tetapi jika Anda harus melihat melalui itu file baris demi baris demi baris,
itu akan membawa Anda waktu lama untuk menemukannya.
Ini semacam seperti dalam contoh buku telepon, juga, di mana
tidak ada yang terlihat melalui halaman buku telepon satu per satu.
Biasanya, mereka membukanya ke tengah,
atau dalam kasus banyak buku telepon dan kamus mana
Anda benar-benar memilikinya mengetik pada huruf pertama,
Anda flip untuk surat pertama dan membuka dan mulai pergi lewat sana.
>> Ingatkan saya nama Anda lagi. >> Sam.
Sam.
Seperti Sam mengatakan, bahwa proses pencarian linear akan menjadi sangat lambat,
dan bukannya dengan pencarian biner, cara ini bekerja adalah bahwa
setiap kali kita pergi melalui iterasi algoritma pencarian kami,
kita akan membagi daftar dua, pada dasarnya,
menjadi dua daftar yang lebih kecil.
Dan kemudian pada iterasi berikutnya dari loop, kami akan membaginya lagi
menjadi daftar yang lebih kecil lainnya.
Seperti yang Anda lihat, masalah terus menjadi lebih kecil dan lebih kecil
karena kita tetap membuang setengah dari daftar setiap saat.
Bagaimana ini bekerja membuang?
Hanya sebagai pengingat, apa yang akan kita lakukan jika kita komputer
dan kami, katakanlah, mencari nomor 5 dalam daftar ini
adalah bahwa kita akan memilih nomor di tengah.
Di tengah-tengah daftar ini, karena ada 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 angka,
kita akan memilih nomor baik di posisi ke-4 atau di posisi ke-5,
dan kami akan menelepon bahwa tengah daftar kami.
Pilih nomor di tengah.
Kemudian, seperti Sam mengatakan, kami akan menguji untuk melihat apakah nomor yang sama
ke nomor yang kita ingin mendapatkan atau nomor yang kita inginkan.
Jika itu sama, maka kita telah menemukan itu. Kami menang.
Jika tidak sama, maka ada beberapa kasus.
Dua kasus yang baik jumlahnya harus lebih banyak daripada jumlah yang kita sedang melihat,
atau kurang dari.
Jika itu lebih besar, kita bergerak ke kanan.
Dan jika itu kurang, kita bergerak ke kiri.
Dan kemudian kita ulangi seluruh proses lagi
di kedua setengah kanan atau kiri setengah dari daftar.
>> Masalah pertama dalam bagian hari ini adalah untuk mengetahui
bagaimana kita benar-benar dapat mulai mengungkapkan hal ini dalam kode C.
Kami punya pseudocode di sini.
Apa yang kita akan mulai lakukan adalah saya akan menarik sebuah ruang baru,
menyimpan revisi ini sehingga kita memiliki catatan untuk nanti,
kita akan menghapus semua ini, dan kemudian copy dan paste dari sejumlah masalah
informasi ini ke ruang kami, dan mudah-mudahan ini tidak pecah.
Sempurna.
Jika kalian semua melakukan itu, copy dan paste kode ini ke ruang baru,
menjadi satu kosong.
Mari kita coba Daniel. Jika Anda mengkompilasi dan menjalankan program ini, cara kerjanya?
>> No Apa itu katakan?
Ia mengatakan kontrol mencapai akhir non-void fungsi.
Ya, jadi saya mencoba menjalankannya.
Pernahkah kalian melihat ini sebelumnya? Apakah Anda tahu apa artinya ini?
Oke, mari kita membedah ini sedikit.
Ini mengatakan di file.c on line 9, kolom 1 kita memiliki kesalahan, seperti yang Anda katakan,
dan mengatakan bahwa itu berasal dari peringatan kesalahan dan peringatan tipe kembali.
Sepertinya ada sesuatu yang terjadi dengan jenis kembali, yang masuk akal.
Kami punya fungsi non-void, yang berarti bahwa kita punya fungsi
yang tidak mengembalikan batal.
Sebuah fungsi void adalah salah satu yang terlihat seperti ini:
void foo (), dan itu batal karena tipe kembali adalah tidak sah,
yang berarti bahwa jika kita memiliki sesuatu di sini
seperti return 1, kita akan mendapatkan kesalahan kompilator untuk ini.
Namun, kami memiliki fungsi non-void.
Non-void fungsi kita dalam hal ini adalah fungsi pencarian kami
karena memiliki jenis kembalinya bool.
Ketika itu mengatakan bahwa kontrol mencapai akhir dari fungsi non-void,
itu karena pencarian tidak memiliki pernyataan kembali.
Ini tidak mengembalikan apa-apa tipe bool.
>> Kita bisa memperbaikinya, dan apa yang kalian pikirkan
pencarian harus kembali secara default?
Apa yang harus menjadi pengembalian nilai default pencarian?
Karena itulah apa yang kita dapat menempatkan di akhir.
Charlotte, apakah Anda punya-?
Benar atau salah >> Benar atau salah?.
Yang mana?
False. Saya tidak tahu.
Salah? Mari kita coba.
Mengapa Anda katakan return false? Itulah intuisi yang besar.
[Charlotte] Saya tidak tahu.
Kita akan kembali palsu dalam kasus ini karena ini akan menjadi default kita
jika karena alasan tertentu daftar kosong atau jarum
yang kita cari tidak ada.
Kemudian di akhir, jika kita tidak kembali benar sebelumnya dalam fungsi ini,
kita selalu tahu bahwa fungsi ini akan mengatakan nope, itu tidak dalam array.
Hal ini tidak di tumpukan jerami.
Sekarang jika kita mengkompilasi dan menjalankannya-biarkan aku menyimpan ini sehingga kita bisa tarik ke atas.
Sekarang jika kita mengkompilasi dan menjalankan program kami, itu membangun.
Kami mendapatkan prompt kecil kami.
Jika saya memukul 4-uh-oh.
Ini tidak mencetak apa pun. Sepertinya semuanya berakhir baik-baik saja.
Kita harus mengisi masuk
Kami berbicara tentang algoritma dalam pseudocode sedikit lalu.
Biarkan aku melihat, menyimpan,
dan Aku akan menarik algoritma yang kembali lagi.
Mari kita memukul orang ini. Nope.
Ada itu.
Bagaimana kita melakukan ini?
Apa yang akan menjadi strategi yang baik untuk memulai off kode ini?
Anda harus memilih nomor di tengah.
Bagaimana kita memilih nomor di tengah array?
Ada saran?
[Mahasiswa] Strlen dibagi 2.
Strlen dibagi 2. Itu salah besar.
Strlen bekerja dengan jenis khusus dari array.
Apa jenis array?
String array, array karakter.
Ini semacam sama konsep yang kita ingin menerapkan,
tapi kami tidak dapat menggunakan strlen karena kita tidak memiliki sebuah array karakter.
Kami memiliki sebuah array ints.
Tapi apa strlen mendapatkan bagi kita?
Apakah Anda tahu apa itu akan bagi kita?
[Mahasiswa] Strlen membuat kita panjang.
Tepat, itu membuat kita panjang.
Strlen mendapatkan panjang dari array bagi kita.
>> Bagaimana kita mendapatkan bahwa dalam program pencarian kami biner?
Bagaimana Anda mendapatkan panjang array?
[Mahasiswa] Strlen?
Anda bisa mendapatkan panjang array C diformat dengan benar string dengan strlen.
Masalahnya, meskipun, adalah bahwa kita tidak memiliki sebuah array string.
Jika kita melihat kembali kode ini, kita memiliki array integer.
Bagaimana kita tahu berapa lama itu?
[Mahasiswa] Apakah ada yang setara untuk titik akhir, seperti l int atau sesuatu?
Ternyata ada sebenarnya tidak, sehingga dengan cara, ini adalah
salah satu dari hal-hal yang hanya baik untuk tahu tentang C,
bahwa tidak ada cara untuk mendapatkan panjang array
jika semua saya berikan Anda adalah array.
Alasan bekerja dengan string, alasan strlen karya,
karena jika string diformat dengan benar,
itu akan memiliki \ istimewa 0 karakter di akhir.
>> Anda juga dapat bayangkan jika Anda memiliki sebuah string tidak benar diformat
dan tidak ada \ 0 karakter di sana, maka semuanya tidak bekerja.
[Siswa] Dapatkah Anda menambahkan \ 0?
Kita bisa dalam kasus ini.
Kita bisa menambahkan beberapa jenis \ 0
atau semacam menandakan karakter dan kemudian menggunakannya.
Tapi itu tidak cukup akan bekerja
karena 0 \ adalah untuk tipe char,
dan di sini kita punya ints.
Hal lain adalah jika kita menggunakan nilai khusus
seperti -1 untuk menandai akhir array
maka kita tidak pernah bisa menyimpan -1 dalam array bilangan bulat kita.
Kami akan terjebak.
Ternyata bahwa satu-satunya cara untuk mendapatkan panjang
dari array di C adalah untuk benar-benar mengingatnya
ketika Anda mengaturnya dan kemudian menyebarkannya sekitar dengan array
sehingga setiap kali saya memiliki fungsi yang akan melakukan beberapa pekerjaan
pada sebuah array bilangan bulat atau mengapung atau ganda atau apa pun,
Saya juga harus memberikan fungsi panjang array,
dan itulah apa yang kami lakukan di sini di fungsi pencarian.
Jika Anda melihat, apa yang kami lakukan ketika kami melewati dalam array kita di sini,
kami juga lulus dalam panjang, ukuran.
Ini terjadi begitu saja bahwa kita telah disebut variabel ini di sini,
ini parameter atau argumen.
Ini disebut daftar argumen fungsi atau daftar parameter,
dan ini juga disebut argumen atau parameter.
Orang-orang menggunakan istilah yang berbeda pada waktu yang berbeda.
Saya kadang-kadang interchange mereka sendiri.
Kebetulan bahwa variabel di sini adalah bernama sama
ini # define di sini.
Tapi mereka tidak sama.
Kapitalisasi itu penting.
>> Jika Anda melihat apa yang terjadi di sini, kami menyatakan
kami int array, yang kita sudah menelepon nomor.
Kami telah memberikannya ukuran kami, yang sesuai dengan kita # define di paling atas.
Ini akan menjadi 8.
Dan kemudian ketika kita kemudian memanggil fungsi pencarian kami di bawah,
kita lulus dalam nomor kita ingin mencari, yang kami telah diminta,
didapat dari pengguna.
Kami melewati dalam array, ini angka,
dan kemudian kita juga harus lulus dalam ukuran array,
dan kemudian nilai ukuran 8 akan disimpan
atau diteruskan ke ukuran ini disebut integer variabel.
Kami memiliki ukuran array.
Sekarang jika kita kembali ke apa yang kita bicarakan sebelumnya,
Saya pikir Missy dibesarkan titik bahwa apa yang perlu kita lakukan adalah mendapatkan panjang array
dan dibagi oleh 2, dan itu akan memberi kita titik tengah.
Mari kita lihat.
Dapatkah saya memiliki seseorang menulis ini dan menyimpannya dalam ruang mereka?
Bagaimana Leila?
Dapatkah saya memiliki Anda menulis dalam hal ini?
Tuliskan baris pertama di mana Anda mengambil panjang array dan mendapatkan titik tengah
dan menyimpannya dalam variabel baru.
Saya akan memberi Anda beberapa detik. Apakah Anda siap?
[Mahasiswa terdengar]
Tentu, aku bisa Anda menghitung titik tengah
dari array tumpukan jerami dalam fungsi pencarian
menggunakan panjang dari array tumpukan jerami, yang merupakan variabel ukuran?
Rumit apa di sini.
[Leila] Hanya ukuran / 2 dan hanya-
Dan menyimpannya, dan tekan tombol Simpan di sini di atas,
dan kami akan tarik ke atas.
Sempurna.
Di sana kami pergi. Mengagumkan.
>> Seperti, ini akan mengkompilasi?
[Leila] Tidak, itu harus lebih tinggi.
[Nate] Ya, jadi apa yang kita perlu lakukan?
[Leila] Seperti titik tengah int atau sesuatu.
Mengagumkan. Ya, mari kita lakukan itu, int titik tengah = ukuran.
Ini akan mengkompilasi?
Mari kita menghapus komentar ini dan mendapatkannya keluar dari jalan.
Apa yang tidak akan mengkompilasi tentang hal ini?
Kami tidak melakukan apa-apa dengan bilangan bulat,
jadi kita perlu untuk mencetak atau sesuatu seperti itu.
Ya, tepatnya.
Kita akan mendapatkan variabel yang tidak terpakai.
Apa lagi tidak akan bekerja tentang hal ini?
Saya pikir Anda mengatakan sesuatu, Sam. Titik koma.
Ya, aku kehilangan orang-titik koma.
Ini akan menjadi hal yang konstan sepanjang perjalanan istilah.
Hal terakhir yang saya akan lakukan adalah saya akan menaruh beberapa ruang putih di kedua sisi
dari operator ini di sini, karena itu biasanya bagaimana kita melakukannya
sesuai dengan panduan gaya kami.
Kami punya titik tengah dari array kita.
Sekarang jika kita ingat kembali ke algoritma kami,
apa langkah kedua yang kita harus lakukan setelah kita memiliki titik tengah?
[Mahasiswa] Jika lebih besar [tak terdengar].
Ya, jadi kita harus melakukan semacam perbandingan, dan apa yang kita membandingkan di sini?
Kau bilang jika lebih besar dari. Apa dalam kalimat maksud?
Jumlah yang muncul, jika itu lebih besar dari titik tengah, kemudian pergi ke array?
Tepat, sehingga jumlah yang muncul ketika kita-
Jarum, jadi kita membandingkan dengan jarum,
dan apa yang kita membandingkan terhadap jarum?
Karena jarum adalah apa yang kita cari.
Kita membandingkannya untuk sampai ke titik tengah.
>> Tapi apakah masuk akal untuk memeriksa untuk melihat
jika jarum titik tengah =?
Apakah itu masuk akal?
Apakah ada yang tidak setuju?
Mari kita mencobanya, jika (jarum == titik tengah).
[Mahasiswa] Apakah printf Anda menemukannya.
[Nate] printf ("Kami menemukan itu \ n");
Jika tidak-aku akan mulai melakukan sesuatu yang berbeda di sini.
Aku akan mulai menempatkan kawat gigi sekitar jika pernyataan sepanjang waktu
hanya karena jika kita menambahkan lebih banyak barang, maka
kita tidak mendapatkan kompiler.
Ya, Sam. Anda punya titik.
Masalahnya adalah bahwa titik tengah merupakan posisi dalam array,
tapi Anda bisa mendapatkannya untuk mewakili nilai dalam posisi array.
Itu poin yang bagus.
Apakah semua orang mendengar apa yang dikatakan Sam?
Dia mengatakan bahwa titik tengah seperti
hanya mewakili posisi dalam array, tapi itu bukan elemen yang sebenarnya dalam array.
Jika Anda berpikir tentang kode seperti yang tertulis sekarang,
jika kita melihat array ini di sini, yang memiliki 8 elemen di dalamnya,
berapakah nilai dari titik tengah akan berada di fungsi ini?
[Mahasiswa] 4.
[Nate] 4.
Jika kita mencari nomor 4 -
dan kita hanya bisa menjalankan kode ini dan menempatkan wajah sedih sedikit di sini
karena kami tidak menemukan itu-jika kita menjalankan kode ini
seperti sekarang, meng-upload, bangunan, biarkan aku gulir ke bawah,
dan jika kita mencari nomor 4,
kami menemukan itu, tapi kami tidak mendapatkan ini untuk printf ya.
Salah satu alasannya adalah bahwa kita tidak kembali benar,
tapi apakah kita benar-benar menemukan nomor 4?
Dan Sam mengatakan tidak.
Apa yang kita temukan?
Kami benar-benar menemukan titik tengah, yang jika kita melihat array di sini,
itu akan menjadi elemen pada indeks 4 yang kita sedang melihat,
yaitu 23.
>> Bagaimana kita benar-benar mendapatkan elemen pada titik tengah
dan bukan hanya titik tengah itu sendiri?
[Siswa] Kami akan masuk ke char atau sesuatu?
Apa yang akan lakukan, hanya karena ingin tahu?
Dapatkah Anda menguraikan lebih sedikit?
Anda harus mengubah posisi menjadi nomor,
jadi Anda harus membuat beberapa koneksi-saya pikir itu char, tapi tidak mungkin.
Ya, itu adalah titik yang baik.
Kami telah melakukan banyak hal ini posisi mengkonversi menjadi karakter, karakter ini,
di dua set pertama masalah.
Ternyata bahwa di sini, ini hampir mirip dengan
mengakses karakter engan dalam string, jika itu masuk akal.
Di sini kita ingin mengakses elemen titik tengah.
Bagaimana kita melakukan itu?
Kevin, apakah Anda punya saran bagaimana kita bisa melakukan itu?
Anda bisa melakukan tumpukan jerami, braket terbuka, pertengahan, ditutup braket.
Dapatkah Anda menulis bahwa bagi kita?
Simpan di sini, dan kami akan menarik itu.
Kami sedang melihat ini jalur 9,
dan kami menyadari bahwa kami tidak ingin membandingkan jarum ke titik tengah,
tetapi sebaliknya, kita ingin membandingkan jarum
ke elemen pada titik tengah posisi dalam array tumpukan jerami kami.
Cool.
Di sana kami pergi.
Ya, yang terlihat cukup bagus, jika (jarum == tumpukan jerami [titik tengah]).
Kami menemukan itu.
Sekarang jika kita jalankan kembali kode-kita naik sedikit sedikit-
itu mengkompilasi, berjalan, dan sekarang jika kita mencari 4,
kami tidak menemukannya karena sekarang kita benar-benar mendapatkan nomor 23.
Kami mendapatkan nilai 23, dan itulah apa yang kita membandingkan dengan jarum kami.
Tapi itu bagus. Itu adalah langkah ke arah yang benar.
>> Itulah yang kami coba lakukan.
Kami tidak mencoba untuk membandingkan jarum terhadap posisi dalam array
melainkan terhadap unsur-unsur yang sebenarnya dalam array.
Jika kita melihat ke belakang lagi sekarang di langkah berikutnya dalam algoritma kami,
apa langkah selanjutnya?
Leila sudah disebutkan secara singkat.
[Mahasiswa] Periksa untuk melihat apakah itu lebih besar dari atau kurang dari dan kemudian memutuskan ke mana harus bergerak.
[Nate] Ya, jadi bagaimana kita melakukannya?
Dapatkah Anda dimasukkan ke dalam beberapa-aku akan menyimpan revisi ini,
dan kemudian jika Anda masukkan ke dalam beberapa baris yang akan melakukan itu.
Ya, Charlotte >> Saya punya pertanyaan..
Bukankah seharusnya titik tengah - 1 karena hal pertama adalah
itu 0 diindeks, jadi jika kita menempatkan 4, itu tidak benar-benar karakter yang kita cari?
Ya, dan masalah lainnya dengan itu adalah-
itu menangkap besar, karena apa yang akan terjadi mungkin berakhir
jika kita terus bergerak dan kita tidak pernah menyesuaikan awalnya?
Saya kira apa yang kita mungkin berakhir lakukan adalah mencoba untuk mengakses
elemen di posisi 8 dari array,
yang dalam hal ini tidak ada.
Kami akan ingin melakukan semacam akuntansi untuk fakta
bahwa kita memiliki beberapa pengindeksan nol.
[Charlotte] Maaf, saya berarti titik tengah - 1 dalam kurung kotak.
Kita bisa melakukan itu.
Kami akan kembali ke masalah ini hanya dalam sedikit.
Setelah kita mulai untuk sampai ke perulangan yang sebenarnya,
saat itulah kita benar-benar akan melihat ini datang ke dalam bermain.
Untuk saat ini, kita bisa melakukan ini, tapi kau benar-benar benar.
Bahwa pengindeksan nol akan memiliki efek yang kita perlu menjelaskan.
Mari kita lihat.
>> Bagaimana adalah lebih besar dari dan kurang dari-?
[Mahasiswa] saya mendapatkan bagaimana melakukan lebih dari dan kurang dari bagian.
Saya hanya tidak yakin apa yang harus mencetak jika Anda menemukan bahwa itu adalah kurang dari titik tengah tumpukan jerami atau lebih besar dari.
Di sini saya dapat menyimpan apa yang aku pernah-
[Nate] Ya, jika Anda menyimpan apa yang Anda miliki, dan kami akan tarik ke atas.
Di sana kami pergi.
[Mahasiswa] Dan saya menempatkan tanda tanya untuk apa yang saya tidak tahu.
[Nate] Itu tampak hebat.
Di sini kita punya tanda tanya karena kita masih tidak tahu
apa yang akan kita lakukan cukup belum.
Apa yang kita ingin lakukan-oops, kami punya beberapa kawat gigi semua funky pada kita.
Kita akan memperbaiki ini kawat gigi.
Di sana kami pergi.
Dan jadi apa yang ingin kita lakukan, menurut algoritma kami,
jika kita tidak menemukan jarum?
Katakanlah dalam hal bahwa jarum kurang dari apa yang kita melihat. Kevin.
Hanya melihat kiri setengah.
Benar, jadi kita akan memasang komentar di sini yang mengatakan "melihat kiri setengah."
Dan jika jarum lebih besar dari tumpukan jerami pada titik tengah, apa yang ingin kita lakukan?
[Siswa] Kemudian Anda melihat di bagian kanan setengah.
Lihatlah kanan setengah, "lihat bagian kanan."
Tidak terlalu buruk.
Oke, jadi pada titik ini, hal-hal yang tampak cukup bagus.
Masalah dengan kode seperti yang tertulis adalah apa?
[Siswa] Anda tidak memiliki titik akhir untuk bagian.
Benar, kita tidak memiliki titik akhir untuk bagian.
Kami juga hanya akan pergi melalui ini sekali.
Kita hanya akan melihat satu titik tengah.
Entah elemen yang ada, atau tidak.
Dalam rangka untuk menyelesaikan ini, kita harus melakukan semacam pengulangan.
Kita perlu terus mengulangi sampai kita menemukan bahwa
baik elemen ini di sana karena kita sudah dipersempit dan akhirnya menemukannya,
atau itu tidak di sana karena kami telah melihat melalui semua hal
di bagian yang tepat dari array dan menemukan bahwa tidak ada di sana.
>> Setiap kali kita sudah mendapat pengulangan ini terjadi, apa yang akan kita gunakan?
[Siswa] Sebuah lingkaran.
Semacam lingkaran. Ya.
[Mahasiswa] Bisakah kita melakukan loop do-while dan memilikinya melakukan itu dan kemudian sementara
jarum tidak sama-aku tidak yakin di mana aku akan dengan itu.
Namun jenis seperti melakukan itu selama itu tidak sama dengan nilai yang input pengguna.
Ya, jadi mari kita lihat, bagaimana mungkin ini menulis sendiri?
Kau bilang mari kita menggunakan loop do-while.
Darimana melakukan start?
[Mahasiswa] Tepat setelah ukuran / 2.
[Nate] Oke, dan apa yang akan kita lakukan?
Kami akan mengisi sementara nanti.
Apa yang akan kita lakukan?
[Mahasiswa] Bukankah kita ingin melakukan semua hal yang kita miliki dalam porsi jika?
[Nate] Apakah semua hal ini, yang besar.
Copy dan paste.
Oh, man.
Mari kita lihat apakah ini bekerja, jika kita bisa tab selama ini.
Indah.
Oke, dan kami menyimpan sehingga kalian memilikinya.
Baiklah, dan kami akan melakukan ini pada saat-
apa kondisi saat Anda setelah?
[Mahasiswa] Sementara jarum tidak sama, sehingga seperti tanda seru.
Tapi aku tidak tahu persis apa yang belum.
[Nate] Ya, ini adalah salah satu cara untuk melakukannya.
Sam, apakah Anda memiliki komentar?
[Sam] Saya ingat ketika saya melihat video,
Aku mengambil screenshot dari salah satu-seperti ketika kita melakukan pseudocode untuk itu,
ada beberapa hubungan antara max dan min.
Saya pikir itu adalah sesuatu seperti jika max yang pernah kurang dari min.
Got it.
[Sam] Atau seperti jika max tidak kurang dari menit atau sesuatu seperti itu,
karena itu berarti bahwa Anda telah mencari segalanya.
>> Ya, jadi apa terdengar seperti max dan min yang mengacu pada?
[Sam] Nilai yang-bilangan bulat yang akan mengubah
relatif terhadap mana kita meletakkan titik tengah.
Tepat.
[Sam] Pada saat itu, itu akan [tak terdengar] menghitung max dan min.
Midpoint ini max dan min ide.
Apakah itu masuk akal untuk orang-orang?
Jika kita mulai melihat bagaimana kita akan melakukan iterasi ini,
Anda benar-benar benar bahwa kita ingin menggunakan semacam do-while loop.
Tapi saya kira jika kita ingat apa yang terjadi di tempat array ini
dan apa yang sebenarnya terjadi-aku akan menulis di sini-
pada iterasi pertama dari pencarian biner, kita memiliki-
Aku akan menggunakan b dan e untuk menunjukkan awal.
Dan kemudian akhir dari array kita.
Kita tahu bahwa awal adalah pada 4 tepat di sini,
dan kita tahu bahwa akhir berada pada 108.
Katakanlah kita sedang mencari nomor 15.
Pertama kali kita melakukan ini, seperti yang kita lihat sebelumnya,
titik tengah yang baik akan menjadi 16 atau 23
tergantung pada bagaimana kita menghitung hal-hal keluar.
Sejak merata membagi di tengah akan memberi kita ruang ini
antara 16 dan 23, kita tidak bisa merata membaginya
atau membagi dan mendapatkan di titik tengah yang benar.
Kita akan melihat 16.
Kita akan menyadari "Hei, 16> 15 yang kita cari."
Untuk kemudian melihat kiri setengah dari array
apa yang kita akan berakhir lakukan adalah membuang
ini bagian atas keseluruhan
dan berkata, "Oke, sekarang endpoint kami akan berada di sini."
Iterasi berikutnya dari loop kita, kita sekarang melihat array ini,
efektif setelah dibuang bagian ini karena sekarang
jika kita mengambil titik tengah untuk menjadi perbedaan antara awal dan akhir,
kita menemukan titik tengah kita menjadi 8,
yang kemudian kita dapat menguji 8 untuk melihat di mana itu dalam kaitannya dengan jumlah yang kita cari,
15, menemukan bahwa 15 lebih besar,
jadi kami harus pindah ke bagian kanan dari daftar,
yang kita tahu karena kita manusia, dan kita bisa melihatnya.
Kita tahu bahwa bagian kanan akan berada di tempat kita menemukannya,
tetapi komputer tidak tahu itu, jadi apa yang akan kita lakukan adalah kita akan benar-benar
telah ini naik, dan sekarang awal dan akhir
adalah tempat yang sama, sehingga titik tengah menjadi satu-satunya nomor dalam daftar pada saat itu,
yang 15, dan kami telah menemukan itu.
Apakah itu titik terang di mana ini max utuh dan notasi min akan,
melacak endpoint dari array untuk mengetahui
bagaimana mempersempit segalanya?
>> Apa yang akan terjadi jika hal ini tidak sama dengan 15 sekarang?
Bagaimana jika kita sedang mencari 15 dan, sebaliknya, angka ini juga 16?
Kami akan mengatakan, "Oh, itu lebih besar.
Kami ingin kembali ke kiri. "
Dan kami akan pindah e kami ke kanan,
di mana titik kita memiliki titik akhir yang akan bertentangan.
Ini tidak akan mampu untuk mencari elemen lagi
karena sekarang kita memiliki titik akhir dan titik awal kami,
max dan min kami, sekarang membalik.
Kami mencari melalui seluruh array. Kita tidak bisa menemukan apa-apa.
Itulah titik di mana kita akan ingin mengatakan, "Oke, kita akan menghentikan algoritma ini.
Kami tidak menemukan apa pun. Kami tahu itu tidak di sini. "
Bagaimana ini terjadi?
[Mahasiswa] Bagaimana tepatnya komputer beralih akhir?
Bagaimana akhirnya berakhir sebelum awal?
Akhirnya berakhir sebelum awal
karena matematika yang akan kita lakukan setiap kali kita melakukan ini.
Cara kita bertukar adalah jika Anda melihat pertama kalinya kami melakukan swap ini
di mana kita memiliki awal pada 4 dan akhir
semua jalan di 108 dan titik tengah kami, mengatakan, pada 16 -
Aku akan me-reset kembali ini untuk 15-jika kita sedang mencari 15,
kita tahu bahwa apa yang kita lakukan ketika kami memeriksa 16 dan melihat bahwa itu lebih besar
dan ingin membuang bagian kanan seluruh daftar,
kita melihat bahwa apa yang kita ingin lakukan adalah memindahkan e ini di sini.
Efektif, e mendapat pindah ke salah satu sebelum titik tengah.
Demikian juga, ketika kita melakukan ini iterasi dari algoritma
dan titik tengah berada di 8,
kami menemukan bahwa 8 <15, jadi kami ingin pindah b
salah satu masa lalu titik tengah.
Sekarang, awal dan akhir keduanya bersama-sama ini 15.
>> Jika kita sudah terjadi untuk mencari beberapa nilai lainnya, bukan 15,
atau jika 15 ini sudah bukan menjadi 16,
kita akan menemukan bahwa e kita ingin memindahkan satu sebelum titik tengah.
Sekarang e akan berada di sana membalik kurang dari b.
Mari kita berjalan melalui bagaimana kita benar-benar berakhir coding algoritma ini.
Kita tahu bahwa kita ingin memiliki perhitungan titik tengah.
Kita juga tahu bahwa kita ingin melacak awal dan akhir array
dari array saat kita sehingga kita dapat mengetahui
dimana kiri setengah dari daftar dan di mana kanan setengah dari daftar adalah.
Kami melakukannya dengan baik mulai dan akhir,
atau kita bisa menyebutnya min dan max.
Saya akan menggunakan memulai dan mengakhiri waktu ini.
Ketika kita mulai, jika kita melihat kembali contoh kita di sini,
awal kami didirikan pada awal dari array, seperti alam.
Apa indeks ini? Apa yang kami harus mulai bisa?
Daniel.
[Daniel] Haystack [0].
[Nate] Ya, jadi kita bisa mengaturnya sama dengan tumpukan jerami [0].
Masalahnya, meskipun, adalah bahwa ini memberi kita bukan posisi dari elemen pertama.
Ini memberi kita indeks dari elemen pertama atau nilai aktual pada saat itu posisi pertama.
[Mahasiswa] Itu akan mengkonversi ke .20?
[Nate] Apa ini akan lakukan adalah-baik, tidak akan melakukan converting apapun.
Apa yang akan dilakukannya itu akan menyimpan 4 di mulai,
dan kemudian akan sulit untuk membuat perbandingan terhadap mulai
karena begin akan memegang nilai 4,
yang merupakan awal dari array kita,
tapi kami ingin melacak indeks dalam array
yang bertentangan dengan nilai-nilai.
Kami benar-benar akan menggunakan 0, seperti itu.
Untuk akhir dari array-Charlotte dibesarkan ini sedikit lebih awal.
Ini adalah di mana kita akan memperhitungkan pengindeksan nol.
>> Charlotte, apa akhir dari array?
Apa indeks akhir?
[Charlotte] Ukuran - 1.
Ya, dan yang ukuran yang harus kita gunakan?
Haruskah kita menggunakan ukuran modal atau ukuran huruf kecil?
Modal ukuran.
Dalam kasus ini, kita bisa menggunakan ukuran modal.
Jika kita ingin fungsi ini menjadi portabel
dan menggunakan fungsi ini dalam program lain,
kita benar-benar bisa menggunakan ukuran huruf kecil.
Ini baik juga.
Tapi Charlotte benar-benar tepat bahwa kita ingin memiliki ukuran - 1.
Pada titik ini-
[Mahasiswa] Bagaimana mungkin Anda dapat menggunakan ukuran huruf besar?
Bagaimana kita bisa menggunakan ukuran huruf besar?
Ternyata bahwa # mendefinisikan benar-benar,
di bawah tenda, sebuah teks seperti mencari dan mengganti, jika itu masuk akal.
Ketika Anda mengkompilasi kode Anda, tahap preprocessing
dari compiler melewati file,
dan mencari di mana-mana bahwa Anda telah menulis ukuran modal,
dan menggantikan teks yang harfiah dengan 8, begitu saja.
Dalam hal ini, ini sangat berbeda dari variabel.
Ini tidak mengambil setiap ruang memori.
Ini adalah trik mengganti teks sederhana.
Dalam kasus ini, kita akan menggunakan ukuran.
Dari sini kita ingin melakukan semacam pengulangan,
dan kami berada di jalur yang benar dengan do-while loop kami.
Kami ingin melakukan sesuatu sampai kondisi tidak tahan lagi,
dan seperti yang kita lihat sebelumnya, kita melihat bahwa kondisi yang
memang kita tidak ingin akhir
menjadi kurang dari mulai.
>> Ini adalah kondisi kita berhenti.
Jika hal ini terjadi, kita ingin menghentikan dan menyatakan seperti, "Hei, kami tidak menemukan apa pun."
Untuk mengungkapkan hal ini, kita ingin menggunakan beberapa jenis loop.
Dalam kasus ini, itu akan loop do-while, untuk loop, loop sementara?
Kami memiliki loop do-sementara di sini.
Apakah kalian seperti pendekatan itu?
Apakah Anda pikir kita harus mencoba pendekatan yang berbeda?
Kevin, setiap pikiran?
Kita bisa memiliki loop sementara karena kita tahu maksimal
akan lebih besar dari menit pada anyways awal.
Ya, jadi tidak ada inisialisasi yang perlu terjadi.
Mereka do-while loop yang besar ketika Anda harus menginisialisasi sesuatu
sebelum kemudian pengujian, sedangkan di sini
kita tahu bahwa kita tidak akan terus inisialisasi ulang baik mulai dan berakhir
setiap putaran loop.
Kita tahu bahwa kita ingin menginisialisasi mereka, kemudian memeriksa kondisi kita.
Dalam kasus ini, saya benar-benar akan pergi dengan loop sementara sederhana.
Ternyata bahwa do-while loop yang digunakan cukup jarang.
Banyak tempat bahkan tidak mengajarkan lakukan sementara loop.
Mereka baik untuk menangani input pengguna, jadi kami telah melihat banyak dari mereka sejauh ini.
Tapi normal untuk dan sementara loop yang jauh lebih umum.
Ternyata kondisi ini seperti yang tertulis
tidak akan benar-benar melakukan kita banyak yang baik, dan mengapa demikian?
Maafkan aku, aku tidak tahu nama Anda.
Saya Jerry. >> Maaf?
Ini B-O-R-U-I.
Oh, oke.
Saya tidak melihat Anda dalam daftar saya.
Oh, itu karena-oh, itu masuk akal.
Apakah Anda memiliki gagasan tentang mengapa ini while loop mungkin tidak bekerja sebagaimana dimaksud,
seperti yang tertulis dengan kondisi?
[Jerry] Maksudmu seperti Anda ingin semua hal setelah ke-?
Ya, jadi itu satu.
Kita mungkin harus meletakkan semua barang-barang ini ke dalam while loop, yang benar-benar benar.
Hal lain yang sedikit lebih bermasalah, meskipun, adalah bahwa kondisi ini tidak bekerja.
[Siswa] Anda perlu flip itu.
Benar, sehingga kondisi ini tidak akan pernah menjadi kenyataan awalnya cara kita berbicara tentang hal itu.
Kami ingin melakukan sesuatu sampai <akhir dimulai,
tapi kami ingin melakukan sesuatu sementara
mulai akhir ≤.
>> Ada yang pembalikan logika di sana.
Aku bersalah karena membuat kesalahan-kesalahan sepanjang waktu.
[Mahasiswa] Mengapa harus kurang dari atau sama dengan?
Karena Anda ingat kasus bahwa kita harus
di mana hanya ada satu elemen, dan kami turun,
dan kami melihat hanya 15 dalam array kita?
Dan awal dan akhir kami adalah unsur yang sama.
Kami ingin memastikan bahwa kami menangani kasus itu.
Jika kita melakukan lurus kurang dari,
kita hanya akan mampu untuk turun ke array 2-elemen.
Setelah kami turun dengan elemen terakhir, jika itu elemen kami, kami tidak akan pernah menemukannya.
Sekarang di sini, kita bisa melakukan persis seperti yang Anda katakan.
Kita bisa mulai plopping hal tepat ke tengah-tengah loop sementara kami.
Kita bisa plop di titik tengah kami.
Kita bisa mengambil semua jika pernyataan,
menarik mereka keluar dari lingkaran do-while,
celepuk mereka,
membersihkan hal-hal sedikit,
dan aku akan pergi ke depan dan menyimpan revisi ini.
Dan pada titik ini, kita sudah cukup dekat.
Sam.
Saya pikir Anda juga harus memiliki titik tengah int size = - 1/2.
Got it, ukuran - 1/2.
Apakah ada hal lain yang perlu kita mengubah tentang garis itu?
Itu tangkapan yang baik.
>> Apa ukuran berapa? Apakah kita pernah mengubah ukuran?
Dalam rangka menjaga garis seperti ini, kita harus mengubah ukuran.
Kami harus mengubah ukuran setiap kali kita pergi sekitar untuk loop.
Tapi ingat ketika kita akan melalui contoh kita hanya sedikit lebih awal,
dan kami memiliki awal pada 4
dan akhirnya semua cara di atas pada 108?
Bagaimana kita menghitung titik tengah?
Apakah kita menggunakan ukuran?
Atau kita gunakan mulai dan berakhir sebagai gantinya?
Inilah perbedaan antara akhir dan awal.
Tepat, dan bagaimana tepatnya saya harus menulis itu, Charlotte?
Hanya berakhir - dimulai.
Anda tidak perlu melakukan - 1
karena - 1 telah dimasukkan di akhir dan mulai sudah.
[Nate] besar, Anda benar-benar benar.
Kami tidak harus melakukan - 1 karena - 1 telah dimasukkan
dan menyumbang ketika kita menginisialisasi variabel akhir.
>> Apakah ada hal lain yang perlu saya lakukan sintaksis untuk memiliki baris ini masuk akal?
[Mahasiswa] Ditambah mulai >> Plus. Dimulai?
[Mahasiswa] Pada akhir.
Karena itu hanya dihitung setengah panjang.
Anda perlu menambahkan mulai.
[Nate] Apa yang akan menghitung ini bagi kita?
Jika kita berpikir tentang akhir pada iterasi pertama dari loop,
akhirnya akan berada dalam posisi indeks 7.
Mulailah berada di posisi 0.
Ingat, kita sedang mencari baik
posisi 3 atau posisi 4.
Jika kita melihat matematika ini, hanya untuk membuatnya sedikit lebih nyata,
menaruh beberapa angka di sini, kami memiliki 7, 0,
jadi 7 - 0, dan kemudian / 2
adalah 3 di pembagian integer, yaitu.
Kemudian kita perlu kemudian menambahkan kembali kita mulai?
Kami tidak dalam kasus ini.
Pada iterasi pertama, itu akan baik-baik saja karena begin adalah 0.
Tapi seperti yang kita kemajuan, kita lakukan benar-benar semua hanya perlu
end - mulai / 2.
Ada satu trik lain di sini, dan itu adalah salah satu dari prioritas yaitu.
[Mahasiswa] Apakah kita perlu kurung?
[Nate] Tepat, dan itu karena jika kita tidak menempatkan tanda kurung,
maka baris ini akan ditafsirkan sebagai gantinya
sebagai (end) - (mulai / 2), yang kita pasti tidak ingin.
Watch out bagi mereka aturan didahulukan.
[Mahasiswa] Mengapa bukan akhir + dimulai?
Mengapa tidak berakhir + dimulai?
[Mahasiswa] Mengapa tidak?
Mengapa itu +?
Saya pikir kau benar.
[Mahasiswa] Karena itu rata-rata?
[Nate] Akhir + dimulai, Anda benar-benar benar.
Wow, aku benar-benar melakukan kesalahan. Kau benar.
Jika kita melakukan minus, kita akan ingin menambahkan mulai kembali masuk
Dalam hal ini, Anda sangat benar bahwa kita ingin mengambil rata-rata dari dua,
jadi kami ingin menambahkannya, sebagai lawan untuk mengurangi mereka.
[Mahasiswa] Hal ini juga akan bekerja jika Anda melakukan end - mulai / 2 + dimulai.
Ini akan jika kita lakukan-saya percaya begitu.
>> Sebagai contoh, jika kita melihat mulai,
dan kita bergeser ke sini
ke 15.
Sekarang mulai berada pada posisi 2.
Akhir berada pada posisi 7.
Jika kita kurangi mereka, kita mendapatkan 5.
Membagi bahwa dengan 2, kita mendapatkan 2.
Dan kemudian kita tambahkan 2 kembali,
dan yang membuat kita ke posisi ke-4,
yang ada di sini, yang merupakan titik tengah.
[Mahasiswa] Apakah kita perlu untuk mengurus pembungkus?
Dalam arti apa yang kita butuhkan untuk mengurus pembungkus?
Jika jumlah atau perbedaan antara
tergantung pada bagaimana kita melakukannya bukan bilangan genap.
Kemudian komputer akan bingung apakah ketika itu 2,5;
Anda bergerak ke kiri atau ke kanan untuk menentukan yang merupakan titik tengah?
Got it.
Ternyata bahwa dengan pembagian integer,
kita tidak pernah mendapatkan angka-angka floating point.
Kami tidak pernah mendapatkan desimal.
Ini benar-benar dibuang.
Jika Anda memiliki komputer membagi dua variabel int,
dan satu adalah 7, dan yang lainnya adalah 2,
Anda tidak akan mendapatkan 3,5 sebagai hasilnya.
Ini akan mendapatkan 3.
Sisanya akan dibuang, sehingga efektif pembulatan-
tidak bulat melainkan lantai, jika kalian sudah familiar dengan itu dalam matematika,
di mana Anda benar-benar membuang desimal,
dan sehingga Anda pada dasarnya truncating itu ke terdekat
Seluruh posisi, ke bilangan bulat terdekat.
[Mahasiswa] Tapi kemudian itu bermasalah karena jika Anda memiliki sebuah array dari 7 elemen
maka secara otomatis mengambil elemen ke-3 keluar dari titik tengah bukan 4.
Bagaimana kita berurusan dengan itu?
Ini bermasalah karena jika kita memiliki sebuah array dari 7,
itu akan memilih 3 bukan 4.
Bisakah Anda menjelaskan sedikit lebih?
[Mahasiswa] Karena jika Anda memiliki 7 elemen maka unsur ke-4
akan menjadi titik tengah, kan?
Ingat komentar Anda tentang menjadi nol diindeks, meskipun.
[Mahasiswa] Ya, jadi di posisi 3. Itu akan menjadi titik tengah.
Ya.
Oh, oke. Saya melihat apa yang Anda maksud.
Ini agak aneh, karena kami terbiasa dengan gagasan seluruh
menyingkirkan desimal.
Itu poin yang bagus.
Mari kita selesaikan ini.
Kami telah menghitung titik tengah kami.
>> Kami sedang menguji untuk melihat apakah jarum kami adalah sama dengan nilai tengah.
Kami mencetak bahwa kami menemukan itu, tapi benar-benar, apa yang ingin kita lakukan dalam situasi ini?
Kami telah menemukan itu, jadi kami ingin membiarkan pemanggil tahu bahwa kami menemukan itu.
Kami punya fungsi yang diketik fungsi boolean.
Cara kita sinyal ke pemanggil fungsi kita bahwa kita siap untuk pergi
yang kita katakan, "Hei, ini benar."
Bagaimana kita melakukan itu, Kevin?
Anda menganggukkan kepala Anda. >> [Kevin] Tambah return true.
[Nate] Tepat, kembali benar.
Sekarang, jika tidak sama, bagaimana kita melihat kiri setengah?
Ada gagasan?
Stella, ide?
Anda perlu menetapkan posisi baru untuk akhir.
Ya.
Jadi kita harus melakukan posisi titik tengah - akhir.
Besar.
Kita perlu menetapkan posisi baru untuk akhir
untuk melihat kiri setengah.
Ini adalah apa yang kita bicarakan sebelumnya di mana
Aku tetap akan kembali ke contoh ini.
Saya telah mulai di sini, dan kemudian saya memiliki akhir semua cara di atas sini.
>> Sekali lagi, jika kita sedang mencari 15, dan titik tengah kami adalah pada 16,
dan kita menyadari, "Ups, 16 lebih besar.
Kami ingin pindah ke kiri setengah. "
Kami kemudian akan memindahkan ujung ke 15,
dan kami melakukannya dengan mengambil satu jauh dari titik tengah
dan menetapkan bahwa sebagai akhir baru kami.
Demikian juga, jika kita ingin melihat kanan setengah, bagaimana kita melakukannya?
Apakah Anda punya ide?
[Siswa] Anda hanya mengatur mulai titik tengah + 1.
[Nate] Besar.
Dan sekarang dalam hal bahwa kita tidak menemukan apa-apa,
apakah itu mendapatkan perawatan yang diambil dari bagi kita?
Daniel, apakah yang bisa diambil dari perawatan bagi kita?
[Daniel] No
[Nate] Jika kita membuatnya melalui seluruh array dan kita tidak menemukan apa-apa,
mana yang akan diperhatikan, atau harus kita mengurusnya?
[Daniel] Kondisi saat.
[Nate] Ya, kondisi saat, tepatnya.
Ini akan mengurus melalui seluruh array jika kita tidak menemukan apa-apa.
Ini while loop akan berakhir.
Kami tidak pernah akan jumpai kondisi ini,
dan kita bisa kembali palsu.
Kami juga dapat meninggalkan ini jika di sini seperti ini
karena jika ini jika pernyataan benar,
dan fungsi kita akan kembali,
dan jadi kami pada dasarnya akan batalkan fungsi ini pada saat ini
ketika kita kembali benar.
Tapi apa yang terjadi dengan struktur ini di sini?
Ini akan bekerja sepenuhnya, atau apakah ada kesalahan logis di sana?
>> Ada beberapa kesalahan logis di sana, dengan cara itu diatur.
Apa mungkin itu?
[Siswa] Mengapa Anda perlu - dan + 1s?
Yang menetapkan array kita sampai menjadi setengah baru kami kiri dan bagian kanan.
[Mahasiswa] Tapi mengapa tidak bisa Anda melakukannya tanpa - 1s dan + 1s?
[Nate] Kita bisa mengaturnya sama dengan titik tengah?
Apa yang mungkin bermasalah tentang hal itu?
[Mahasiswa] Saya kira itu tidak efisien karena Anda sedang memeriksa nilai yang sudah diperiksa.
[Nate] Tepat, sehingga Sam benar-benar tepat.
Jika Anda mengatur akhir dan mulai sama dengan titik tengah
bukannya - 1 dan + 1 reflektif,
di beberapa titik di masa depan kita akan berakhir memeriksa titik tengah lagi.
[Mahasiswa] saya mulai pset, dan kemudian aku punya sesuatu seperti itu
di mana saya lupa + 1, dan itu terjebak dalam infinite loop.
Benar, karena pada titik tertentu Anda tidak akan pernah mendapatkan memulai dan mengakhiri
untuk benar-benar tumpang tindih.
Cool.
Ada satu kelemahan logis lebih, dan itu adalah bahwa ini pasti harus
lain jika.
Mengapa itu terjadi?
>> Alasannya adalah jika itu bukan lagi jika-kau melihatnya, Kevin?
[Kevin] Ya, karena Anda mengubah titik akhir.
[Nate] Tepat.
Kami mengubah titik akhir,
dan jika itu ditulis seperti ini-kita membuat spasi antara-
itu akan memeriksa kasus ini.
Kasus ini, jika berhasil, akan membatalkan keluar dari fungsi.
Kemudian akan memeriksa kasus ini selanjutnya,
dan jika ini berhasil, maka akan menyesuaikan titik akhir,
dan kemudian akan melanjutkan dan memeriksa kasus ini.
Tapi pada saat ini, kita tidak ingin untuk melanjutkan pemeriksaan.
Untungnya, kami belum me-reset titik tengah di sini,
dan kita tahu bahwa kasus ini tidak akan berhasil.
Tapi kita pasti ingin menempatkan lagi jika di sana
meskipun itu mungkin-dalam hal ini
karena kita tidak menyesuaikan titik tengah, yang akan membuat perbedaan?
Tidak, karena kasus-kasus ini semua eksklusif.
Sekali lagi, saya buruk.
Kami tidak, saya pikir, perlu lagi ini jika.
Kita bisa mencobanya dan menjalankannya dan melihat apa yang terjadi.
Bangunan, terjadi kesalahan.
Ini mungkin karena aku meninggalkan ini b dan e di sini.
Apakah saya harus lagi sampai mereka di atas?
Ini tidak terlihat seperti itu.
Kami zoom out, membangun,
ada kelanjutannya, jadi sekarang jika kita mencari 15,
ya.
Biarkan aku zoom in
15, ya. Kita bisa jalankan lagi.
Meng-upload kode sumber, membangun, menjalankan.
Kita dapat mencari sesuatu seperti 13,
dan kita tidak mendapatkan apa-apa mencetak, sehingga tidak menemukan bahwa bagi kita.
Itu bagus, karena itu tidak ada dalam daftar kami.
>> Kita sekarang kehabisan waktu.
Itu akan baik untuk minggu ini.
Terima kasih untuk bergabung, dan lihat nanti.
>> [CS50.TV]