[Powered by Google Translate] [Seksyen 3] [Kurang Selesa]
>> [Nate Hardison] [Universiti Harvard]
>> [Ini adalah CS50.] [CS50.TV]
>> Baiklah, mari kita mulakan.
Selamat datang ke 4 Minggu CS50.
Jika anda semua membuka pelayar web dan membuka pset 3,
Kacau dengan CS50, kita akan mula pergi
melalui seksyen soalan di sana.
Sama seperti minggu lepas, kita akan bekerja di CS50 kawasan,
jika anda juga akan tarik itu juga,
dan jika anda pergi ke hadapan dan lawati pautan ini bahawa saya telah bangun di sini di atas.
Ia adalah masa untuk memulakan.
Kami telah mendapat program hi sedikit kami di sini. Tiada apa-apa gila.
Salah satu perkara pertama yang saya mahu lakukan dengan anda semua hari ini adalah pergi ke beberapa penyelesaian
Set Masalah 1, jenis penyelesaian contoh,
hanya supaya anda boleh mendapatkan rasa untuk apa jenis kakitangan kod menulis,
apa jenis pelajar kod lain menulis,
dan anda mengambil melihat pada ia kerana saya tahu ia pelik
apabila anda mengemukakan penyelesaian untuk set masalah dan mendapatkan komen
versi anda sendiri, tetapi kadang-kadang ia membantu untuk melihat bagaimana orang lain melakukannya,
terutama orang-orang yang baik cari.
Bagi sebahagian besar, saya benar-benar kagum dengan penyelesaian yang anda semua yang dihasilkan.
Saya belum lagi mula melihat 2s Set Masalah anda, tetapi jika mereka apa-apa seperti yang pertama,
ia bermakna apa-apa tetapi perkara-perkara yang baik.
>> Jika anda melihat semakan saya, mari kita mulakan sepanjang jalan di Ulangkaji 1,
dan kita akan mengambil melihat cepat pada penyelesaian Mario.
Jika anda tarik sehingga ini, program-program yang kita akan membentangkan betul.
Tidak ada isu-isu ketepatan dengan masalah-masalah ini, tetapi sebaliknya,
kita mahu bercakap sedikit tentang isu-isu reka bentuk yang berbeza
yang sedang digunakan di sini.
Salah satu perkara yang menarik tentang penyelesaian
adalah bahawa ia digunakan ini membina baru dipanggil paun menentukan,
kadang-kadang juga dirujuk sebagai hash menentukan.
Biar saya mengezum masuk di sini.
A # define membolehkan anda untuk memberi nama kepada nombor-nombor dalam program anda.
Dalam kes ini, ketinggian maksimum piramid di Mario
adalah 23 dan bukannya meletakkan 23 saya kod-
kita akan merujuk kepada sebagai pengekodan keras 23 -
bukannya ini memberikan MAX_HEIGHT nama ke nombor tersebut,
supaya turun di sini dalam gelung saya do sementara
anda sebenarnya boleh merujuk kepada MAX_HEIGHT
bukannya meletakkan nombor 23 masuk
[Pelajar] Apakah kelebihan berbuat demikian?
Itulah persoalan yang besar.
Satu adalah kebolehbacaan.
Satu kelebihan menggunakan # define adalah kebolehbacaan.
Apabila saya membaca kod ini, saya boleh melihat apa yang berlaku.
>> Saya dapat melihat dalam keadaan ini di sini bahawa kita sedang menguji
untuk ketinggian menjadi <0, yang kita boleh juga ditakrifkan
untuk menjadi ketinggian minimum atau ketinggian min.
Kelebihan lain adalah bahawa saya boleh membaca seluruh barisan untuk melihat
bahawa kita juga memeriksa untuk memastikan bahawa ketinggian tidak lebih daripada ketinggian maksimum,
kerana kita akan terus manakala ketinggian adalah lebih besar daripada ketinggian maksimum.
Kelebihan lain adalah jika saya mengezum keluar sedikit di sini-
jika saya menjalankan program ini dan saya berjalan ia, katakan, dengan 23 sekarang,
ia akan mencetak semua 23 baris seperti itu.
Tetapi katakan saya mahu menukar ketinggian maks,
dan sekarang saya mahu untuk menghadkan ketinggian maksimum piramid
untuk menjadi hanya mengatakan orang, yang 'funky'.
# Include , # define MAX_HEIGHT,
dan mari kita mengatakan bahawa kita mahu untuk menetapkan ia sama dengan 10.
Sekarang pada ketika ini, semua yang saya terpaksa lakukan ialah menukar ia di lokasi yang satu ini.
Saya boleh susun semula kod, dan sekarang jika saya cuba dan menaip 12,
ia akan meminta saya lagi.
Dalam kes ini, kita hanya menggunakan MAX_HEIGHT sekali.
Ia tidak begitu besar mudah untuk pergi dalam
dan mengubahnya dalam gelung manakala jika anda perlu.
Tetapi dalam program-program yang mana anda hendak rujukan nombor ajaib yang sama
berulang-ulang kali, ini # menentukan mekanisme adalah benar-benar berguna
kerana anda hanya menukar satu masa di atas fail-ia biasanya di mana anda meletakkan mereka-
dan perubahan menitis melalui seluruh fail.
>> Perkara lain yang saya mahu ambil perhatian dalam tugasan ini yang saya fikir kelihatan benar-benar bagus,
satu adalah penamaan pembolehubah.
Anda lihat di sini bahawa kita telah mendapat pembolehubah integer dipanggil berturut-turut dan ketinggian dipanggil.
Ruang, Hash, ia membantu membuat kod sedikit lebih mudah dibaca,
membuat ia sedikit lebih mudah difahami apa sebenarnya berlaku di.
Ini adalah berbeza untuk menggunakan, berkata, huruf secara rawak
atau hanya gobbledygook sama sekali.
Satu perkara yang terakhir yang saya akan menunjukkan bahawa untuk gelung,
sering pembolehubah ini iterator, kaunter-kaunter yang anda gunakan dalam anda untuk gelung,
ia adalah standard dan konvensional untuk memulakan mereka sama ada dengan i dan kemudian j dan kemudian k
dan pergi dari sana jika anda memerlukan lebih pembolehubah,
dan ini hanyalah konvensyen.
Terdapat banyak konvensyen.
Ia bergantung kepada bahasa pengaturcaraan yang anda gunakan.
Tetapi dalam C, kita biasanya bermula dengan i.
Ia tidak masuk akal untuk digunakan, katakan, atau b
bergantung kepada keadaan.
Itulah yang satu ini.
Jika anda kini tarik Semakan 2, anda akan melihat satu lagi Mario,
dan satu ini adalah sama kepada orang lain bahawa kita hanya melihat,
tetapi ia jenis sesuatu yang sejuk.
Jika kita melihat seksyen ini di sini di dalam dalaman untuk gelung,
mereka menggunakan beberapa sintaks gila mencari di sini betul-betul di garisan ini.
Ini dipanggil pengendali pertigaan.
Ia adalah kenyataan jika lain memeluwap menjadi satu baris.
Keadaan ini bahagian di dalam kurungan.
Ia adalah bersamaan dengan mengatakan jika ketinggian j <- i - 1.
Dan kemudian apa kandungan bahawa jika blok akan menjadi ruang
dan kemudian kandungan apa lagi akan ini #.
Ia asasnya memberikan ruang kepada pembolehubah ini.
Ia meletakkan ruang dalam kandungan pembolehubah blok,
jika syarat ini dipenuhi, dan jika keadaan ini tidak dipenuhi,
maka pembolehubah blok mendapat ini #.
Dan kemudian, sudah tentu, bukan membina keseluruhan rentetan
dan mencetak semua keluar pada akhir penyelesaian ini mencetak ia keluar satu aksara pada satu-satu masa.
Agak sejuk.
>> Satu lagi beberapa perkara untuk melihat. Kami akan bergerak tamak.
Sekarang jika kita melihat pada tamak, penyelesaian ini pertama
menggunakan ini # mentakrifkan agak sedikit.
Kami telah mendapat satu pemalar ditakrifkan untuk setiap nombor yang berbeza dalam program ini.
Kami telah mendapat satu sen bagi setiap dolar, satu untuk pihak, dimes, nikel, dan beberapa sen,
dan kini jika kita tatal ke bawah dan membaca kod,
kita boleh melihat standard do-gelung while percetakan segala-galanya.
Jenis crux masalah ini telah menyedari bahawa
anda diperlukan untuk menukar apungan bahawa anda membaca dari pengguna kepada integer
tepat melakukan matematik, dan ini adalah kerana
dengan nombor titik apung, seperti kita bercakap tentang dalam syarahannya secara ringkas,
ia tidak mustahil dengan tepat mewakili setiap nilai tunggal pada garis nombor
kerana terdapat nilai tak terhingga banyaknya antara 3 dan, katakan, 3.1 walaupun.
Anda boleh mempunyai 3,01 dan 3,001 dan 3,0001, dan anda boleh terus pergi.
Ia ternyata apabila anda sedang bekerja dengan wang, anda sering mahu menukar
ke dalam format integer supaya anda tidak kehilangan beberapa sen dan yang jenis barangan.
Berbuat demikian dan pembundaran adalah kunci.
Penyelesaian ini digunakan sempurna mudah, algoritma besar,
yang decremented beberapa sen baki, pertama oleh pihak-pihak,
kemudian oleh dimes, maka oleh nikel, maka dengan beberapa sen,
dan menambah bilangan syiling setiap kali.
>> Satu lagi penyelesaian yang kita akan lihat, seperti yang saya zoom out dan pergi ke 4 Semakan,
mempunyai satu permulaan yang sangat serupa tetapi div bukannya digunakan dan arena
betul-betul di sini untuk mengira beberapa sen.
Ini, bilangan kuarters adalah sama dengan bilangan sen dibahagikan dengan 25,
dan sebab ini berfungsi adalah kerana kita sedang melakukan pembahagian integer,
jadi ia membuang baki mana-mana.
[Pelajar] Adakah kita mempunyai mengulas carian?
Ia benar-benar bergantung.
[Pelajar] Anda mengulas lebih daripada kod yang betul di sini.
Ya, dan sebagainya terdapat sekumpulan falsafah yang berbeza-beza mengenai perkara ini.
Falsafah peribadi saya adalah bahawa kod anda adalah benar-benar kebenaran,
seperti kod anda adalah apa yang sebenarnya melaksanakan pada komputer,
dan sebagainya kod anda harus dibaca mungkin tidak memerlukan sebagai banyak komen.
Yang berkata, apabila anda melakukan perkara-perkara yang jenis sukar matematik
atau algorithmically, ia adalah baik untuk mengulas mereka supaya anda boleh
menambah satu dimensi tambahan, lapisan tambahan kepada sesiapa yang membaca kod anda.
Dalam penyelesaian ini, sering mereka mengulas lebih banyak hanya kerana
kita mahu menjadi mampu untuk mengedarkan mereka dan mempunyai orang memilih mereka sehingga
dan membaca mereka cukup mudah.
Tetapi pasti, saya akan bersetuju bahawa ini adalah berat.
[Pelajar] Tetapi apabila dalam keraguan, pergi lebih berat?
Apabila ragu-ragu, pergi berat.
Sesetengah orang kadang-kadang akan mengatakan 0 pulangan atau sesuatu seperti itu.
Saya berfikir bahawa adalah satu komen yang tidak masuk akal.
Dengan jelas bahawa apa yang berlaku.
Saya tidak perlu Bahasa Inggeris untuk memberitahu saya bahawa.
Kadang-kadang orang akan menulis barangan seperti "kthxbai!"
Itulah jenis comel tetapi juga tidak-
yang tidak membuat perbezaan antara mata mengulas atau tidak.
Mereka jenis komen hanya ha, ha.
Sejuk.
>> Pada ketika ini, mari kita mula bekerja pada Masalah Tetapkan seksyen 3 soalan.
Jika anda semua tarik sehingga ini lagi,
dengan minggu lepas, kita tidak akan menonton seluar dalam seksyen ini.
Kami akan membiarkan anda semua lakukan bahawa pada masa anda sendiri dan bercakap tentang soalan-soalan.
Tetapi sekarang dalam seksyen ini kita akan menghabiskan masa lebih sedikit
bercakap tentang kurang asas pengekodan
seperti yang kita lakukan pada minggu lepas, dan sebaliknya, kita akan memberi tumpuan lebih kepada
sedikit lebih daripada teori, jadi bercakap tentang carian binari dan kemudian sorting.
Dari orang-orang di antara kamu yang telah mengikuti bersama-sama dengan kuliah,
seseorang boleh memberi saya recap apa perbezaan
antara carian binari dan carian linear?
Apa yang berlaku? Pasti.
Searches carian Linear melalui setiap elemen dalam senarai yang diisih
satu demi satu demi satu demi satu demi satu,
dan carian binari membahagikan senarai kepada 2 kumpulan,
cek jika nilai kunci yang anda sedang mencari adalah lebih besar atau kurang daripada nilai titik tengah
bahawa anda hanya ditemui, dan jika ia adalah kurang daripada, ia pergi dengan senarai lebih rendah
dan kemudian membahagikan bahawa sekali lagi, tidak fungsi yang sama
semua jalan ke bawah sehingga ia mendapati titik tengah untuk menjadi sama dengan nilai sendiri.
Betul.
>> Mengapa kita mengambil berat?
Mengapa kita bercakap tentang carian dedua berbanding carian linear?
Yeah.
Binari adalah jauh lebih cepat, jadi jika anda menggandakan saiz masalah
ia mengambil satu lagi langkah bukannya dua kali ganda.
Tepat sekali.
Itulah jawapan yang hebat.
Carian Linear amat memeriksa satu elemen pada satu masa,
dan seperti yang kita lihat pada hari pertama kuliah
apabila David pergi melalui contoh buku telefon beliau
dan mengoyakkan keluar satu halaman buku telefon pada satu masa
dan disimpan melakukan yang lebih dan lebih dan lebih lagi,
ia akan membawanya masa yang benar-benar panjang untuk mencari sesiapa di dalam buku telefon,
kecuali, tentunya, dia sedang mencari seseorang pada permulaan sangat abjad.
Dengan carian binari, anda boleh pergi jauh lebih cepat,
dan ia bukan hanya dua kali sebagai cepat atau 3 kali sebagai cepat atau 4 kali lebih cepat.
Tetapi masalahnya mendapat lebih kecil dan lebih kecil dan lebih kecil lebih cepat.
Untuk menggambarkan ini, kami akan mula bercakap tentang apa yang berlaku di
apabila kita menulis carian dedua.
Masalah di tangan adalah bahawa jika saya mempunyai pelbagai nombor,
berkata, 1, 2, 3, 5, 7, 23, 45, 78, 12323,
dan kemudian 9 dengan satu tan 0s selepas ia,
kita mahu menjadi dapat memikirkan benar-benar cepat apa yang ada dalam
ini pelbagai nombor.
Saya tahu ini kelihatan bodoh sedikit dan sedikit tersusun,
kerana sekarang ia adalah.
Kami mempunyai pelbagai yang tidak mempunyai elemen yang sangat banyak di dalamnya,
dan jika saya bertanya kepada salah seorang di antara kamu untuk memikirkan sama ada atau tidak
23 adalah dalam pelbagai, anda boleh berbuat demikian cukup cepat
hanya dengan sambil mengerling ke arah ini dan memberitahu saya ya atau tidak.
Analog untuk dipertimbangkan bayangkan jika ini ialah, katakan,
spreadsheet Excel dengan 10,000 baris, 20,000 baris.
Sudah tentu, anda boleh melakukan arahan F atau F kawalan dan melihat sesuatu.
Anda juga boleh menggunakan penapis dan barangan carian,
tetapi jika anda terpaksa untuk melihat melalui garisan fail yang oleh baris demi baris,
ia akan membawa anda masa yang lama untuk mencari ia.
Ia adalah jenis seperti dalam contoh buku telefon, terlalu, di mana
tiada siapa yang kelihatan melalui halaman satu buku telefon pada satu masa.
Biasanya, mereka tidak membuka ke tengah,
atau dalam kes banyak buku telefon dan kamus di mana
anda sebenarnya ia telah dimasukkan pada huruf pertama,
anda flip kepada surat yang pertama dan membuka dan mula melalui sana.
>> Ingatkan saya nama anda sekali lagi. >> Sam.
Sam.
Seperti Sam berkata, bahawa proses carian linear akan menjadi benar-benar perlahan,
dan bukannya dengan carian binari, cara kerja-kerja ini adalah bahawa
setiap kali kita pergi melalui lelaran algoritma mencari kami,
kita akan membahagikan senarai pada separuh, pada dasarnya,
kepada dua yang lebih kecil senarai.
Dan kemudian pada lelaran seterusnya gelung, kita akan membahagikan lagi
ke dalam senarai kecil yang lain.
Seperti yang anda boleh lihat, masalah terus semakin kecil dan lebih kecil
kerana kita terus separuh membuang senarai setiap kali tunggal.
Bagaimanakah ini berfungsi buang?
Hanya sebagai peringatan, apa yang kita hendak lakukan jika kita komputer
dan kita telah, katakan, mencari nombor 5 dalam senarai ini
adalah bahawa kita akan memilih beberapa di tengah-tengah.
Di tengah-tengah senarai ini, kerana terdapat 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 nombor,
kita akan memilih nombor sama ada pada kedudukan ke-4 atau pada kedudukan ke-5,
dan kita akan memanggil bahawa pertengahan senarai kami.
Pilih nombor di tengah-tengah.
Kemudian, seperti Sam berkata, kita akan menguji untuk melihat jika nombor yang sama
kepada nombor yang kita mahu mendapatkan atau nombor kami kehendaki.
Jika ia adalah sama, maka kita dapati ia. Kita menang.
Jika ia tidak sama, maka terdapat beberapa kes.
Kedua-dua kes adalah sama ada nombor telah menjadi lebih besar daripada bilangan kita melihat,
atau ia adalah kurang daripada.
Jika ia adalah lebih besar, kita bergerak ke kanan.
Dan jika ia kurang, kita bergerak ke kiri.
Dan kemudian kita mengulangi keseluruhan proses sekali lagi
sama ada separuh yang betul atau separuh kiri senarai.
>> Masalah pertama dalam seksyen hari ini adalah untuk mengetahui
bagaimana kita sebenarnya boleh mula untuk menyatakan ini dalam kod C.
Kami telah mendapat pseudokod di sini.
Apa yang kita akan mula lakukan adalah saya akan tarik sehingga jenama-baru ruang,
menyelamatkan semakan ini supaya kita mempunyai nota ini untuk masa lain,
kami akan memadam semua ini, dan kemudian salin dan tampal daripada set masalah
maklumat ini ke dalam ruang kami, dan diharapkan ini tidak pecah.
Sempurna.
Jika kalian semua berbuat demikian, copy dan paste kod ini ke dalam ruang baru anda,
ke dalam satu kosong.
Mari kita cuba Daniel. Jika anda menyusun dan menjalankan program ini, ia berfungsi?
>> No Apa yang ia katakan?
Ia berkata kawalan sampai akhir fungsi bukan tidak sah.
Ya, jadi biarlah saya cuba berjalan ia.
Pernahkah anda semua dilihat sebelum ini? Adakah anda tahu apa ini bermakna?
Baiklah, mari kita membedah ini sedikit.
Ia berkata pada file.c on line 9, lajur 1 kita mempunyai ralat, sama seperti anda berkata,
dan ia mengatakan bahawa ia berpunca daripada amaran ralat dan amaran pulangan jenis.
Ia kelihatan seperti sesuatu yang sedang berlaku dengan jenis pulangan, yang tidak masuk akal.
Kami telah mendapat fungsi bukan tidak sah, yang bermakna bahawa kita telah mendapat fungsi
yang tidak akan kembali tidak sah.
Fungsi tidak sah adalah salah satu yang kelihatan seperti ini:
terbatal foo (), dan ia adalah tidak sah kerana jenis pulangan adalah tidak sah,
yang bermaksud bahawa jika kita mempunyai sesuatu di sini
seperti 1 pulangan, kita akan mendapat kesilapan pengkompil ini.
Walau bagaimanapun, kita mempunyai fungsi bukan tidak sah.
Fungsi bukan terbatal kami dalam kes ini adalah fungsi carian kami
kerana ia mempunyai sejenis pulangan bool.
Apabila ia mengatakan bahawa kawalan sampai ke penghujung fungsi bukan tidak sah,
ia adalah kerana carian tidak mempunyai sebarang pernyataan kembali.
Ia tidak kembali apa-apa jenis bool.
>> Kita boleh menetapkan bahawa, dan apa yang anda semua berfikir
carian harus kembali secara lalai?
Apa yang sepatutnya menjadi nilai lalai pulangan carian?
Kerana itulah apa yang kita boleh meletakkan pada akhir.
Charlotte, adakah anda mempunyai apa-apa?
Benar atau palsu? >> Benar atau palsu.
Yang mana satu?
Palsu. Saya tidak tahu.
Palsu? Mari kita cuba.
Mengapa anda akan mengatakan penyata palsu? Itulah gerak hati besar.
[Charlotte] Saya tidak tahu.
Kami akan kembali palsu dalam kes ini kerana ini akan menjadi lalai kami
jika bagi sebab-sebab tertentu senarai adalah kosong atau jarum
yang kita cari tidak wujud.
Kemudian pada akhir sangat, jika kita tidak kembali benar awal dalam fungsi ini,
kita sentiasa tahu bahawa fungsi ini akan mengatakan ndak, ia bukan dalam array.
Ia bukan dalam sisa rumput kering.
Sekarang jika kita menyusun dan menjalankan ia biarlah saya menjimatkan ini supaya kita boleh tarik sehingga ia.
Sekarang jika kita menyusun dan menjalankan program kami, ia membina.
Kami mendapat prompt kecil kami.
Jika saya mencecah 4-uh-oh.
Ia tidak mencetak apa-apa. Ia kelihatan seperti segala-galanya berakhir okay.
Kami telah mendapat untuk mengisi masuk
Kita bercakap tentang algoritma pseudokod sedikit lalu.
Biar saya lihat, menyimpan ini,
dan saya akan tarik algoritma yang kembali lagi.
Mari kita memukul lelaki ini. Nope.
Sana ia.
Bagaimana kita melakukan ini?
Apa yang akan menjadi strategi yang baik untuk bermula dari kod ini?
Anda perlu memilih nombor di tengah-tengah.
Bagaimana kita memilih nombor di tengah-tengah pelbagai?
Apa-apa cadangan?
[Pelajar] Strlen dibahagikan dengan 2.
Strlen dibahagikan dengan 2. Itulah satu besar.
Strlen kerja-kerja dengan pelbagai khas array.
Apakah jenis tatasusunan?
Rentetan tatasusunan, tatasusunan watak.
Ia adalah yang jenis yang sama konsep bahawa kami ingin memohon,
tetapi kita tidak boleh menggunakan strlen kerana kita tidak mempunyai pelbagai watak.
Kami mempunyai pelbagai ints.
Tetapi apakah strlen mendapatkan untuk kita?
Adakah anda tahu apa ia mendapat untuk kita?
[Pelajar] Strlen mendapat kita panjang.
Tepat sekali, ia mendapat kita panjang.
Strlen mendapat panjang pelbagai untuk kita.
>> Bagaimana kita mendapatkan bahawa dalam program pencarian binari kami?
Bagaimana anda akan mendapat panjang array?
[Pelajar] Strlen?
Anda boleh mendapatkan panjang pelbagai rentetan diformat dengan betul C dengan strlen.
Masalahnya, walaupun, adalah bahawa kita tidak mempunyai pelbagai rentetan.
Jika kita melihat kembali pada kod ini, kita mempunyai pelbagai integer.
Bagaimana kita tahu berapa lama ia?
[Pelajar] Adakah terdapat salah satu yang bersamaan dengan titik akhir, seperti l int atau sesuatu?
Ia ternyata terdapat sebenarnya tidak, dan sebagainya dengan cara, ini adalah
salah satu daripada perkara-perkara yang hanya baik untuk mengetahui tentang C,
bahawa tidak ada cara untuk mendapatkan panjang array
jika semua saya memberi anda adalah array.
Sebab ia berfungsi dengan tali, sebab strlen kerja,
adalah kerana jika rentetan diformat dengan betul,
ia akan mempunyai yang \ khas 0 watak pada akhir sangat.
>> Anda juga boleh bayangkan jika anda mempunyai rentetan yang tidak wajar diformat
dan tiada \ 0 watak di sana, maka segala-galanya tidak berfungsi.
[Pelajar] Bolehkah anda menambah \ 0?
Kita boleh dalam kes ini.
Kita boleh menambah beberapa jenis \ 0
atau beberapa jenis menandakan watak dan kemudian gunakan.
Tetapi itu tidak cukup akan bekerja
kerana 0 \ adalah untuk jenis char,
dan di sini kita telah mendapat ints.
Satu perkara lagi ialah jika kita menggunakan nilai istimewa
seperti -1 hingga menandakan akhir array
maka kita tidak boleh menyimpan -1 dalam tatasusunan integer kami.
Kami ingin terjebak.
Ia ternyata bahawa satu-satunya cara untuk mendapatkan panjang
pelbagai dalam C sebenarnya adalah untuk ingat
apabila anda membinanya dan kemudian lulus ia wujud dengan pelbagai
supaya apabila saya mempunyai fungsi yang akan melakukan beberapa pekerjaan
pada pelbagai integer atau terapung atau beregu atau apa yang telah anda,
Saya juga perlu untuk memberi fungsi panjang pelbagai,
dan itulah apa yang kita lakukan di sini dalam fungsi carian.
Jika anda melihat, apa yang kita lakukan apabila kita lulus dalam pelbagai kami di sini,
kita juga lulus dalam panjang, saiz.
Ia hanya berlaku bahawa kita telah dipanggil pembolehubah ini di sini,
parameter ini atau hujah.
Ini dipanggil senarai hujah atau senarai parameter fungsi,
dan ini juga dipanggil hujah atau parameter.
Orang menggunakan istilah yang berbeza pada masa yang berlainan.
Saya kadang-kadang pertukaran mereka sendiri.
Ia hanya kebetulan bahawa ini pemboleh ubah di sini dinamakan sama
ini # menentukan di sini.
Tetapi mereka tidak perkara yang sama.
Permodalan does matter.
>> Jika anda melihat apa yang berlaku di sini, kita mengaku
pelbagai int kami, yang kami telah dipanggil nombor.
Kami telah diberikan ia saiz kami, yang sepadan dengan kami # menentukan di atas.
Ia akan menjadi 8.
Dan kemudian apabila kita kemudian memanggil fungsi carian kami turun bawah,
kita lulus dalam bilangan yang kita mahu untuk mencari, yang kita telah digesa,
mendapat dari pengguna.
Kami lulus dalam array, nombor ini,
dan kemudian kita juga perlu lulus dalam saiz array,
dan kemudian nilai sebanyak 8 saiz mendapat disimpan
atau diluluskan untuk saiz ini ubah integer dipanggil.
Kami mempunyai saiz array.
Sekarang jika kita kembali kepada apa yang kita telah bercakap tentang awal,
Saya fikir Missy dibesarkan titik bahawa apa yang kita perlu lakukan ialah mendapatkan panjang array
dan dibahagikan dengan 2, dan yang akan memberi kita titik tengah.
Mari kita lihat.
Bolehkah saya mempunyai seseorang menulis ini dan simpan dalam ruang mereka?
Bagaimana pula Leila?
Bolehkah saya mempunyai anda menulis dalam ini?
Tulis baris pertama di mana anda mengambil panjang array dan mendapatkan titik tengah
dan menyimpan ia dalam pembolehubah baru.
Saya akan memberikan anda beberapa saat. Adakah anda bersedia?
[Pelajar didengar]
Pasti, saya mungkin telah anda mengira titik tengah
pelbagai sisa rumput kering di dalam fungsi carian
menggunakan panjang pelbagai sisa rumput kering, yang merupakan pembolehubah saiz?
Tiada apa-apa yang rumit di sini.
[Leila] Hanya saiz / 2 dan hanya-
Dan simpan, dan tekan butang Simpan sehingga di sini di atas,
dan kita akan tarik sehingga ia.
Sempurna.
Terdapat kita pergi. Menggerunkan.
>> Sebagai adalah, ini akan menyusun?
[Leila] Tidak, ia perlu lebih tinggi.
[Nate] Yeah, jadi apa yang kita perlu lakukan?
[Leila] Seperti titik tengah int atau sesuatu.
Menggerunkan. Ya, mari kita berbuat demikian, titik tengah int = saiz.
Ini akan menyusun?
Mari kita padamkan komen ini dan mendapatkan ia keluar dari jalan.
Apa yang tidak akan menyusun tentang perkara ini?
Kami tidak melakukan apa-apa dengan integer,
jadi kita perlu untuk mencetak atau sesuatu seperti itu.
Ya, sebenarnya.
Kami akan mendapatkan pemboleh ubah yang tidak digunakan.
Apa lagi yang tidak akan bekerja mengenai perkara ini?
Saya fikir anda berkata sesuatu, Sam. Bertitik.
Ya, saya hilang mereka koma bertitik.
Ia akan menjadi satu perkara yang berterusan sepanjang penggal.
Perkara terakhir yang saya akan lakukan adalah saya akan meletakkan sedikit ruang putih di sebelah sama ada
pengendali ini di sini, kerana itu biasanya bagaimana kita lakukan
mengikut kepada panduan gaya kami.
Kami telah mendapat titik tengah pelbagai kami.
Sekarang jika kita ingat kembali kepada algoritma kami,
apakah langkah kedua yang kita terpaksa lakukan apabila kita mempunyai titik tengah?
[Pelajar] Jika ia adalah lebih besar [didengar].
Ya, jadi kita perlu melakukan beberapa jenis perbandingan, dan apa yang kita membandingkan di sini?
Anda berkata jika ia adalah lebih besar daripada. Apakah ia dalam ayat itu merujuk kepada?
Bilangan yang datang, jika itu lebih besar daripada titik tengah, kemudian pergi sehingga array?
Tepat sekali, jadi bilangan yang datang sehingga apabila kita
Jarum, jadi kita membandingkan dengan jarum,
dan apa yang kita membandingkan terhadap jarum?
Kerana jarum adalah apa yang kita cari.
Kami membandingkan ia untuk sampai ke titik tengah.
>> Tetapi adakah ia masuk akal untuk memeriksa untuk melihat
jika jarum = titik tengah?
Adakah yang masuk akal?
Adakah sesiapa yang tidak bersetuju?
Mari kita mencubanya, jika (jarum == titik tengah).
[Pelajar] printf Adakah anda mendapati ia.
[Nate] printf ("Kami mendapati ia \ n");
Sebaliknya: saya akan mula melakukan sesuatu yang berbeza di sini.
Saya akan mula meletakkan pendakap sekitar jika penyata sepanjang masa
hanya kerana jika kita menambah barangan lebih, maka
kita tidak mendapat penyusun.
Ya, Sam. Anda telah mendapat satu titik.
Masalahnya ialah bahawa titik tengah mewakili kedudukan dalam array,
tetapi anda boleh mendapatkan ia untuk mewakili nilai dalam kedudukan yang array.
Itulah titik yang hebat.
Adakah semua orang mendengar apa yang Sam berkata?
Beliau berkata bahawa titik tengah seperti
mewakili hanya satu kedudukan dalam array, tetapi ia bukan elemen sebenar dalam array.
Jika anda berfikir tentang kod sebagai ditulis sekarang,
jika kita melihat array ini turun sini, yang mempunyai 8 elemen di dalamnya,
apakah nilai titik tengah akan menjadi dalam fungsi ini?
[Pelajar] 4.
[Nate] 4.
Jika kita mencari bilangan 4 -
dan kita hanya boleh menjalankan kod ini dan meletakkan wajah sedih sedikit di sini
kerana kita tidak mendapati ia jika kita menjalankan kod ini
seperti sekarang, memuat naik, bangunan, izinkan saya tatal ke bawah,
dan jika kita mencari nombor 4,
kita mendapati ia, tetapi kita tidak mendapat ini printf ya.
Salah satu sebab adalah bahawa kita tidak kembali benar,
tetapi adakah kita benar-benar mencari nombor 4?
Dan Sam mengatakan tidak.
Apa yang kita dapati?
Kami benar-benar mendapati titik tengah, yang jika kita lihat pada array turun sini,
ia akan menjadi unsur pada indeks 4 yang kita sedang melihat,
yang ialah 23.
>> Bagaimana kita sebenarnya mendapat elemen yang di titik tengah
dan bukan hanya titik tengah itu sendiri?
[Pelajar] Kami akan masukkan char atau sesuatu?
Apa yang akan yang melakukan, hanya keluar dari rasa ingin tahu?
Bolehkah anda menghuraikan lebih sedikit?
Anda perlu mengubah kedudukan ke nombor,
jadi anda telah mendapat untuk membuat beberapa sambungan Saya fikir ia adalah char, tetapi ia tidak mungkin.
Ya, itu adalah satu titik yang baik.
Kami telah melakukan banyak ini kedudukan menukar ke aksara, watak-watak ini,
dalam dua masalah pertama set.
Ia ternyata bahawa di sini, ini adalah hampir sama dengan
mengakses watak engan dalam rentetan, jika yang masuk akal.
Di sini kita mahu untuk mengakses elemen titik tengah.
Bagaimana kita melakukannya?
Kevin, adakah anda mempunyai sebarang cadangan bagaimana kita boleh berbuat demikian?
Anda boleh melakukan sisa rumput kering, kurungan terbuka, pertengahan, ditutup kurungan.
Anda boleh menulis untuk kita?
Simpan ia di sini, dan kami akan tarik sehingga itu.
Kami sedang mencari di baris ini 9,
dan kita menyedari bahawa kita tidak mahu untuk membandingkan jarum untuk titik tengah,
tetapi sebaliknya, kita mahu membandingkan jarum
kepada elemen di titik tengah kedudukan dalam pelbagai sisa rumput kering kami.
Sejuk.
Terdapat kita pergi.
Ya, yang kelihatan agak baik, jika (jarum == sisa rumput kering [titik]).
Kami mendapati ia.
Sekarang jika kita menjalankan belakang kod we'll sehingga sedikit bit
ia menyusun, ia berjalan, dan sekarang jika kita mencari 4,
kita tidak mendapati ia kerana sekarang kita sebenarnya mendapat nombor 23.
Kami mendapat nilai 23, dan itulah apa yang kita membandingkan dengan jarum kami.
Tetapi itu adalah baik. Itu adalah satu langkah ke arah yang betul.
>> Itulah apa yang kita cuba lakukan.
Kami tidak cuba untuk membandingkan jarum terhadap kedudukan dalam array
tetapi terhadap unsur-unsur sebenar dalam array.
Jika kita melihat kembali di langkah seterusnya dalam algoritma kami,
apakah langkah seterusnya?
Leila telah disebutkan secara ringkas.
[Pelajar] Periksa untuk melihat jika ia adalah lebih besar daripada atau kurang daripada dan kemudian membuat keputusan yang mana cara untuk bergerak.
[Nate] Yeah, jadi bagaimana kita akan berbuat demikian?
Anda boleh meletakkan di beberapa-I'll menyelamatkan semakan ini,
dan kemudian jika anda dimasukkan ke dalam beberapa baris yang akan berbuat demikian.
Ya, Charlotte. >> Saya mempunyai satu soalan.
Sekiranya ia tidak menjadi titik tengah - 1 kerana perkara pertama adalah
0 diindeks, jadi jika kita meletakkan 4, itu bukan sebenarnya watak yang kita sedang mencari?
Ya, dan masalah lain dengan yang
itulah tangkapan yang besar, kerana apa yang sedang berlaku akhirnya berlaku mungkin
jika kita terus bergerak dan kita tidak pernah menyesuaikan mulanya?
Saya rasa apa yang kita mungkin akhirnya melakukan cuba untuk mengakses
elemen di kedudukan ke-8 array,
yang dalam kes ini tidak wujud.
Kami akan mahu melakukan beberapa jenis perakaunan hakikat
bahawa kita mempunyai beberapa pengindeksan sifar.
[Charlotte] Maaf, saya maksudkan titik tengah - 1 dalam kurungan persegi.
Kita boleh berbuat demikian.
Kita akan kembali kepada isu ini dalam hanya sedikit.
Sebaik sahaja kita mula untuk mendapatkan gelung sebenar,
itulah apabila kita benar-benar akan melihat ini mula bermain.
Buat masa ini, kita boleh melakukan ini, tetapi anda benar-benar betul.
Itu pengindeksan sifar akan mempunyai kesan bahawa kita perlu mengambil kira.
Mari kita lihat.
>> Bagaimana adalah lebih besar daripada dan kurang daripada?
[Pelajar] saya mendapat bagaimana untuk melakukan lebih daripada dan kurang daripada bahagian.
Saya hanya tidak pasti apa untuk mencetak jika anda mendapati bahawa ia adalah kurang daripada titik tengah sisa rumput kering atau lebih besar daripada.
Di sini saya boleh menyimpan apa I've-
[Nate] Ya, jika anda menyimpan apa yang anda telah mendapat, dan kita akan tarik sehingga ia.
Terdapat kita pergi.
[Pelajar] Dan saya meletakkan tanda tanya untuk apa yang saya tidak tahu.
[Nate] Itu kelihatan hebat.
Di sini kita telah mendapat tanda tanya kerana kita masih tidak tahu
apa yang kita akan agak melakukannya lagi.
Apa yang kita mahu untuk melakukan oops, kami telah mendapat beberapa pendakap semua funky kepada kami.
Kami akan membetulkan pendakap ini.
Terdapat kita pergi.
Dan jadi apa yang kita mahu lakukan, mengikut algoritma kami,
jika kita tidak mencari jarum?
Katakanlah (wahai Muhammad) dalam kes itu bahawa jarum adalah kurang daripada apa yang kita sedang melihat. Kevin.
Hanya melihat separuh kiri.
Betul, jadi kami akan meletakkan komen di sini yang mengatakan "melihat kiri separuh."
Dan jika jarum adalah lebih besar daripada sisa rumput kering di titik tengah, apa yang kita mahu lakukan?
[Pelajar] Kemudian anda melihat separuh betul.
Lihatlah separuh betul, "melihat pada separuh betul."
Tidak terlalu lusuh.
Okay, jadi pada ketika ini, perkara-perkara yang kelihatan cukup baik.
Masalah dengan kod seperti yang ditulis adalah apa?
[Pelajar] Anda tidak mempunyai titik hujung bahagian.
Betul, kita tidak mempunyai titik hujung bahagian.
Kami juga hanya akan pergi melalui ini sekali.
Kami hanya akan melihat pada satu titik tengah.
Sama ada elemen berkenaan ada, atau ia tidak.
Dalam usaha untuk melengkapkan ini, kita akan perlu untuk melakukan beberapa jenis pengulangan.
Kita perlu untuk terus mengulangi sehingga kita dapati bahawa
sama ada unsur adalah di sana kerana kita telah mengecil dan akhirnya mendapati ia,
atau ia tidak di sana kerana kita telah melihat melalui semua perkara
di bahagian sesuai array dan mendapati bahawa tiada apa-apa di sana.
>> Apabila kita telah mendapat pengulangan ini berlaku, apa yang kita akan gunakan?
[Pelajar] gelung.
Beberapa jenis gelung. Ya.
[Pelajar] Bolehkah kita melakukan gelung do sementara dan ia berbuat demikian dan kemudian manakala
jarum tidak tidak sama: saya pasti di mana saya akan dengan itu.
Tetapi semacam berbuat demikian selagi ia tidak sama dengan nilai yang input pengguna.
Ya, jadi mari kita lihat, bagaimana ini mungkin menulis sendiri?
Anda berkata mari kita menggunakan gelung do sementara.
Di manakah melakukan permulaan?
[Pelajar] Hak selepas saiz / 2.
[Nate] Okay, dan apa yang kita akan lakukan?
Kami akan mengisi pada masa kemudian.
Apa yang kita akan lakukan?
[Pelajar] Tidakkah kita mahu melakukan semua barangan yang kita ada dalam bahagian jika?
[Nate] Adakah semua barangan ini, hebat.
Salin dan tampal.
Oh, manusia.
Mari kita lihat jika kerja-kerja ini, jika kita boleh tab lebih ini.
Cantik.
Okay, dan kita menyimpan ini supaya anda semua mempunyai ia.
Semua hak, dan kami akan untuk melakukan ini manakala
apakah keadaan semasa anda selepas?
[Pelajar] Walaupun jarum tidak sama, jadi seperti tanda seru.
Tetapi saya tidak pasti dengan tepat apa yang belum.
[Nate] Yeah, ini adalah salah satu cara untuk melakukannya.
Sam, adakah anda mempunyai komen?
[Sam] saya teringat apabila saya melihat video,
Saya mengambil screenshot salah satu seperti apabila kita melakukan pseudokod untuk ia,
terdapat beberapa hubungan antara max dan min.
Saya rasa ia adalah sesuatu seperti jika maks pernah kurang daripada min.
Mendapat ia.
[Sam] Atau suka jika maks tidak kurang daripada min atau sesuatu seperti itu,
kerana yang akan bermakna bahawa anda telah diperiksa segala-galanya.
>> Ya, jadi apakah ia bunyi seperti max dan min telah merujuk kepada?
[Sam] Nilai bahawa-integer yang akan berubah
berbanding di mana kita meletakkan titik tengah.
Tepat sekali.
[Sam] Pada ketika itu, ia akan [didengar] mengira max dan min.
Titik tengah ini maks dan idea min.
Adakah yang masuk akal kepada orang?
Jika kita mula melihat bagaimana kita pergi untuk melakukan lelaran ini,
anda benar-benar betul bahawa kita mahu menggunakan beberapa jenis gelung do-manakala.
Tetapi saya rasa jika kita ingat apa yang berlaku di tempat array ini
dan apa yang sebenarnya berlaku: saya akan menulis di sini-
pada lelaran pertama carian binari, kita mempunyai
Saya akan menggunakan b dan e untuk menandakan permulaan.
Dan kemudian akhir array kami.
Kita tahu bahawa permulaan adalah pada 4 hak di sini,
dan kita tahu bahawa akhir adalah di 108.
Katakanlah kita sedang mencari bilangan 15.
Kali pertama kita melakukan ini, seperti yang kita lihat sebelum ini,
titik tengah sama ada akan menjadi 16 atau 23
bergantung kepada bagaimana kita mengira perkara keluar.
Sejak membahagikan sama rata di tengah-tengah akan memberi kita ruang ini
antara 16 dan 23, kita tidak boleh sama rata membahagikan ia
atau membahagi dan mendapatkan pada titik tengah yang benar.
Kami akan melihat pada 16.
Kami akan sedar "Hei, 16> 15 yang kita cari."
Untuk kemudian melihat separuh kiri array
apa yang kita akan berakhir lakukan adalah membuang
keseluruhan bahagian atas ini
dan berkata, "Okay, sekarang titik akhir kita akan berada di sini."
Lelaran seterusnya gelung kita, kita sedang melihat pelbagai ini,
berkesan setelah dibuang bahagian ini kerana sekarang
jika kita mengambil titik tengah untuk menjadi perbezaan antara awal dan akhir,
kita dapati titik tengah kami untuk menjadi 8,
yang kemudiannya kami boleh menguji 8 untuk melihat di mana ia adalah berhubung dengan bilangan kita sedang mencari,
15, mendapati bahawa 15 adalah lebih besar,
jadi kita perlu bergerak ke bahagian kanan senarai,
yang kita tahu kerana kita manusia, dan kita dapat melihat ia.
Kita tahu bahawa bahagian yang betul akan menjadi di mana kita dapati,
tetapi komputer tidak tahu bahawa, supaya apa yang kita akan lakukan ialah kita akan sebenarnya
telah ini naik, dan kini awal dan akhir
adalah tempat yang sama, jadi titik tengah menjadi nombor sahaja dalam senarai pada ketika itu,
yang adalah 15, dan kami telah mendapati ia.
Adakah yang menumpahkan cahaya di mana ini maks keseluruhan dan notasi min akan,
mengesan titik hujung array untuk memikirkan
bagaimana untuk merapatkan perkara ke?
>> Apa yang akan berlaku jika ini tidak sama hingga 15 sekarang?
Apa yang jika kita telah mencari selama 15 dan, sebaliknya, nombor ini juga 16?
Kita akan berkata, "Oh, ia adalah lebih besar.
Kami mahu kembali ke kiri. "
Dan kita akan bergerak e kami ke kanan,
di mana titik kita mempunyai titik akhir yang akan bercanggah.
Ia tidak akan dapat mencari unsur-unsur apa-apa lagi
kerana sekarang kita mempunyai titik akhir dan titik permulaan kami,
max dan min kita, kini dibalik.
Kami mencari melalui pelbagai keseluruhan. Kami tidak dapat mencari apa-apa.
Itulah titik di mana kita akan mahu untuk mengatakan, "Baiklah, kita akan berhenti algoritma ini.
Kami tidak menemui apa-apa. Kita tahu ia bukan di sini. "
Bagaimana ini berlaku?
[Pelajar] Bagaimana sebenarnya komputer menukar akhir?
Bagaimanakah akhirnya berakhir sebelum permulaan?
Akhir berakhir sebelum permulaan
kerana matematik yang kita akan lakukan setiap kali kita lakukan ini.
Cara kita swap ialah jika anda melihat pada masa yang pertama kita lakukan ini swap
di mana kita mempunyai permulaan pada 4 dan akhir
sepanjang jalan di 108 dan titik tengah kami, berkata, pada 16 -
Saya akan untuk menetapkan semula kembali ini 15-jika kita sedang mencari untuk 15,
kita tahu bahawa apa yang kita lakukan apabila kita diperiksa 16 dan melihat bahawa ia adalah lebih besar
dan mahu untuk membuang keseluruhan bahagian kanan senarai,
kita lihat bahawa apa yang kita mahu lakukan adalah bergerak e di sini.
Berkesan, e sudah berpindah ke satu sebelum titik tengah.
Begitu juga, apabila kita melakukan ini lelaran algoritma
dan titik tengah adalah pada 8,
kita mendapati bahawa 8 <15, jadi kita mahu bergerak b
salah lalu titik tengah.
Sekarang, permulaan dan akhir kedua-duanya bersama-sama di 15.
>> Jika kita hendak berlaku untuk mencari beberapa nilai lain, bukan 15,
atau jika 15 ini telah sebaliknya menjadi 16,
kita akan mendapati bahawa e kita mahu untuk bergerak satu sebelum titik tengah.
Sekarang e akan ada dibalik kurang daripada b.
Mari kita berjalan melalui bagaimana kita sebenarnya akhirnya kod algoritma ini.
Kita tahu bahawa kita mahu mempunyai pengiraan titik tengah.
Kita juga tahu bahawa kita mahu untuk mengesan awal dan akhir array
array semasa kita supaya kita boleh memikirkan
di mana ini separuh kiri senarai dan mana separuh kanan senarai.
Kami berbuat demikian dengan sama ada bermula dan berakhir,
atau kita boleh memanggil mereka min dan maks.
Saya akan menggunakan bermula dan berakhir masa ini.
Apabila kita bermula, jika kita melihat kembali pada contoh kita ke sini,
permulaan kami telah bersedia untuk permulaan sangat array, sebagai semula jadi.
Apakah indeks ini? Apa yang kita harus bermula?
Daniel.
[Daniel] Haystack [0].
[Nate] Yeah, jadi kita boleh menetapkan sama dengan sisa rumput kering [0].
Masalahnya, walaupun, adalah bahawa ini memberikan kita tidak kedudukan elemen pertama.
Ia memberikan kita indeks elemen pertama atau nilai sebenar pada kedudukan yang pertama.
[Pelajar] Itu akan menukar kepada 0,20?
[Nate] Apakah ini akan lakukan-baik, ia tidak akan melakukan apa-apa penukaran yang.
Apa yang ia akan lakukan ialah ia akan menyimpan 4 a dalam memulakan,
dan kemudian ia akan menjadi sukar untuk membuat perbandingan terhadap bermula
kerana bermula akan memegang nilai 4,
yang merupakan permulaan pelbagai kami,
tetapi kita mahu menjejaki indeks dalam pelbagai
berbanding nilai.
Kita sebenarnya akan gunakan 0, seperti itu.
Bagi akhir array Charlotte membawa ini sehingga sedikit lebih awal.
Ini adalah di mana kita akan mengambil kira pengindeksan sifar.
>> Charlotte, apa yang akhir array?
Apakah indeks akhir?
[Charlotte] Saiz - 1.
Ya, dan saiz yang harus kita gunakan?
Sekiranya kita menggunakan saiz modal atau saiz huruf kecil?
Saiz modal.
Dalam kes ini, kita boleh menggunakan saiz modal.
Jika kita mahu fungsi ini untuk mudah alih
dan menggunakan fungsi ini dalam program-program lain,
kita sebenarnya boleh menggunakan saiz huruf kecil.
Ia adalah denda juga.
Tetapi Charlotte adalah benar-benar hak yang kita mahu mempunyai saiz - 1.
Di titik
[Pelajar] Bagaimana ia bahawa anda boleh menggunakan saiz huruf besar?
Bagaimana ia bahawa kita boleh menggunakan saiz huruf besar?
Ia ternyata bahawa ini # mentakrifkan benar-benar,
di bawah hood, teks seperti mencari dan menggantikan, jika yang masuk akal.
Apabila anda menyusun kod anda, fasa prapemprosesan
pengkompil pergi melalui fail,
dan ia kelihatan di mana-mana yang anda telah ditulis saiz modal,
dan ia menggantikan teks yang benar-benar dengan 8, seperti itu.
Dalam erti kata itu, ini adalah sangat berbeza daripada pemboleh ubah.
Ia tidak mengambil mana-mana ruang dalam ingatan.
Ia menggantikan teks mudah helah.
Dalam kes ini, kita akan menggunakan saiz.
Dari sini kita tidak mahu melakukan beberapa jenis pengulangan,
dan kita berada di landasan yang betul dengan gelung do sementara.
Kami mahu melakukan sesuatu sehingga keadaan tidak memegang lagi,
dan seperti yang kita lihat sebelum ini, kita lihat bahawa keadaan itu
sememangnya bahawa kita tidak mahu akhir
menjadi kurang daripada mula.
>> Ini adalah keadaan kita berhenti.
Jika ini berlaku, kita mahu untuk berhenti dan mengisytiharkan seperti, "Hei, kita telah tidak dijumpai apa-apa."
Untuk menyatakan ini, kita tidak mahu menggunakan beberapa jenis gelung.
Dalam kes ini, ia akan menjadi satu gelung do-manakala, untuk gelung, gelung sementara?
Kami mempunyai gelung do sementara di sini.
Adakah anda lelaki seperti pendekatan itu?
Adakah anda fikir kita harus cuba pendekatan yang berbeza?
Kevin, mana-mana pemikiran?
Kita boleh mempunyai gelung sementara kerana kita tahu maksimum
akan menjadi lebih besar daripada min di anyways permulaan.
Ya, jadi tidak ada pengawalan yang perlu berlaku.
Mereka gelung do-sementara adalah besar apabila anda perlu untuk memulakan sesuatu
sebelum kemudian mengujinya, sedangkan sini
kita tahu bahawa kita tidak akan menyimpan reinitializing kedua bermula dan berakhir
setiap pusingan gelung.
Kita tahu bahawa kita mahu untuk memulakan mereka, kemudian memeriksa keadaan kami.
Dalam kes ini, saya sebenarnya akan pergi dengan gelung sementara mudah.
Ia ternyata bahawa gelung do-sementara yang digunakan agak jarang.
Banyak tempat tidak mengajar adakah manakala gelung.
Mereka baik untuk mengendalikan input pengguna, jadi kita telah melihat banyak daripada mereka setakat ini.
Tetapi biasa bagi dan manakala gelung banyak lebih biasa.
Ia ternyata bahawa keadaan ini seperti yang ditulis
tidak benar-benar akan melakukan kita lebih baik, dan mengapa?
Saya minta maaf, saya tidak tahu nama anda.
Saya Jerry. >> Maaf?
Ia adalah B-O-R-U-I.
Oh, okay.
Saya tidak melihat anda dalam senarai saya.
Oh, ia adalah kerana-oh, yang tidak masuk akal.
Adakah anda mempunyai idea mengapa ini gelung sementara mungkin tidak berfungsi seperti yang sepatutnya,
seperti yang ditulis dengan keadaan?
[Jerry] Anda amat bermakna seperti yang anda mahu semua barangan selepas ia ke?
Ya, jadi itulah salah.
Kami mungkin perlu meletakkan semua barangan ini ke dalam gelung sementara, yang benar-benar benar.
Perkara lain yang sedikit lebih bermasalah, walaupun, adalah bahawa keadaan ini tidak berfungsi.
[Pelajar] Anda perlu untuk flip ia.
Betul, jadi keadaan ini akan tidak pernah menjadi kenyataan mulanya cara kita bercakap tentang ia.
Kami mahu melakukan sesuatu sehingga <akhir bermula,
tetapi kita mahu melakukan sesuatu sementara
memulakan akhir ≤.
>> Ada bahawa pembalikan logik sana.
Saya bersalah membuat kesilapan sepanjang masa.
[Pelajar] Mengapa ia perlu kurang daripada atau sama dengan?
Kerana adakah anda ingat kes yang kita dapat
di mana terdapat hanya satu elemen, dan kita telah turun,
dan kita telah melihat hanya 15 dalam pelbagai kami?
Dan permulaan dan akhir kami adalah unsur yang sama.
Kami mahu memastikan bahawa kita mengendalikan kes itu.
Jika kita lakukan lurus kurang daripada,
kita hanya akan dapat untuk mendapatkan ke pelbagai 2-elemen.
Sebaik sahaja kami mendapat turun kepada elemen yang lepas, jika itu adalah elemen kita, kita tidak akan mendapati ia.
Sekarang di sini, kita boleh lakukan betul-betul seperti anda berkata.
Kita boleh mula plopping barangan kanan ke tengah-tengah gelung sementara kami.
Kita boleh mencebur di titik tengah kami.
Kita boleh mengambil semua ini jika penyata,
tarik mereka keluar gelung do sementara ini,
mencebur mereka dalam,
membersihkan perkara sehingga sedikit,
dan saya akan pergi ke hadapan dan menyelamatkan semakan ini.
Dan pada ketika ini, kita semakin hampir.
Sam.
Saya rasa anda juga perlu mempunyai titik tengah int size = - 1/2.
Ada, saiz - 1/2.
Adakah terdapat apa-apa lagi yang kita perlu untuk menukar tentang baris itu?
Itu adalah tangkapan yang baik.
>> Apakah saiz lakukan? Adakah kita pernah menukar saiz?
Untuk memastikan garis seperti ini, kita perlu untuk menukar saiz.
Kita perlu menukar saiz setiap kali kita pergi di sekitar untuk gelung.
Tetapi ingat apabila kita telah melalui contoh kita hanya sedikit lebih awal,
dan kita mempunyai permulaan pada 4
dan akhir semua cara lebih di 108?
Bagaimana kita mengira titik tengah?
Adakah kita menggunakan saiz?
Atau kita telah menggunakan bermula dan berakhir sebaliknya?
Ia adalah perbezaan antara akhir dan permulaan.
Tepat sekali, dan bagaimana sebenarnya perlu saya menulis bahawa, Charlotte?
Hanya berakhir - bermula.
Anda tidak perlu untuk melakukan - 1
kerana - 1 telah dimasukkan di akhir dan bermula sudah.
[Nate] Great, anda benar-benar betul.
Kami tidak mempunyai untuk melakukan - 1 kerana - 1 telah dimasukkan
dan menyumbang untuk apabila kita memulakan pembolehubah akhir.
>> Adakah terdapat apa-apa lagi yang perlu saya lakukan syntactically mempunyai garis ini masuk akal?
[Pelajar] Plus bermula. >> Plus bermula?
[Pelajar] Pada akhir.
Kerana ia hanya dikira setengah panjang.
Anda perlu menambah bermula.
[Nate] Apakah ini akan mengira untuk kita?
Jika kita berfikir tentang akhir pada lelaran ini sangat pertama gelung,
akhir akan menjadi indeks kedudukan 7.
Mulakan adalah dalam kedudukan 0.
Ingat, kita sedang mencari sama ada
kedudukan 3 atau kedudukan 4.
Jika kita melihat matematik ini, hanya untuk membuat ia sedikit lebih ketara,
meletakkan beberapa nombor di sini, kita mempunyai 7, 0,
jadi 7-0, dan kemudian / 2
adalah 3 dalam pembahagian integer, yang.
Kemudian kita perlu kemudian menambah kembali kami mula?
Kami tidak dalam kes ini.
Pada lelaran pertama, ia akan didenda kerana bermula adalah 0.
Tetapi sebagai kemajuan kita, yang kita lakukan benar-benar semua hanya perlu
akhir memulakan / 2.
Ada satu muslihat lain di sini, dan itulah iaitu salah satu keutamaan.
[Pelajar] Adakah kita perlukan kurungan?
[Nate] Tepat sekali, dan itu kerana jika kita tidak meletakkan kurungan ini,
maka baris ini akan ditafsirkan dan bukannya
(akhir) - (mula / 2), yang kita pasti tidak mahu.
Watch out bagi mereka peraturan keutamaan.
[Pelajar] Mengapa ia tidak berakhir + bermula?
Mengapa ia tidak berakhir + bermula?
[Pelajar] Mengapa ia tidak?
Mengapa ia akan menjadi +?
Saya rasa anda betul.
[Pelajar] Kerana ia adalah purata?
[Nate] Akhir + memulakan, anda benar-benar betul.
Wow, saya benar-benar goofed. Anda betul.
Jika kita telah melakukan tolak, kita mahu menambah mula kembali masuk
Dalam kes ini, anda sangat betul bahawa kita mahu mengambil purata dua,
jadi kita tidak mahu untuk menambah mereka, berbanding tolak mereka.
[Pelajar] Ia juga akan berfungsi jika anda lakukan akhir - mula / 2 + bermula.
Ia akan jika kita lakukan saya percaya begitu.
>> Sebagai contoh, jika kita telah melihat bermula,
dan kita beralih ke sini
kepada 15.
Kini mula berada pada kedudukan 2.
Akhir adalah pada 7 kedudukan.
Jika kita tolak mereka, kita akan mendapat 5.
Bahagikan dengan 2, kita akan mendapat 2.
Dan kemudian kita campurkan 2 kembali dalam,
dan yang mendapat kita kepada kedudukan ke-4,
yang betul di sini, yang adalah titik tengah.
[Pelajar] Adakah kita perlu untuk menjaga pembalut?
Rasa apa yang kita perlu untuk menjaga membungkus?
Jika jumlah wang atau perbezaan antara
bergantung kepada bagaimana kita melakukannya bukan nombor genap.
Kemudian komputer mendapat keliru sama ada apabila ia adalah 2.5;
adakah anda bergerak ke kiri atau ke kanan untuk menentukan yang merupakan titik tengah?
Mendapat ia.
Ia ternyata bahawa dengan pembahagian integer,
kita tidak pernah mendapat nombor-nombor titik apung.
Kami tidak pernah mendapat perpuluhan.
Ia benar-benar dibuang.
Jika anda mempunyai komputer membahagikan dua pembolehubah int,
dan satu adalah 7, dan yang lain adalah 2,
anda tidak akan mendapat 3.5 hasilnya.
Ia akan mendapat 3.
Selebihnya akan dibuang, jadi ia berkesan pembulatan
bukan bulat tetapi lantai, jika anda semua sudah biasa dengan dalam matematik,
di mana anda benar-benar membuang perpuluhan,
dan sebagainya anda dasarnya Memangkas ia ke yang terdekat
kedudukan keseluruhan, kepada nombor bulat terdekat.
[Pelajar] Tetapi itulah bermasalah kerana jika anda mempunyai pelbagai 7 elemen
kemudian yang secara automatik mengambil elemen 3 daripada titik tengah bukan 4.
Bagaimana kita berurusan dengan itu?
Ia bermasalah kerana jika kita mempunyai pelbagai 7,
ia akan mengambil ke-3 bukan 4.
Anda boleh menjelaskan lebih sedikit?
[Pelajar] Kerana jika anda mempunyai 7 elemen maka elemen 4
akan menjadi titik tengah, betul-betul?
Ingat komen anda tentang menjadi sifar diindeks, walaupun.
[Pelajar] Yeah, jadi di posisi 3. Itu akan menjadi titik tengah.
Yeah.
Oh, okay. Saya melihat apa yang anda maksudkan.
Ia adalah jenis pelik, seperti yang kita dapat digunakan untuk tanggapan ini keseluruhan
menyingkirkan perpuluhan.
Itulah titik yang hebat.
Mari kita selesaikan ini.
Kami telah dikira titik tengah kami.
>> Kami menguji untuk melihat jika jarum kami adalah sama dengan nilai tengah.
Kami mencetak bahawa kita mendapati ia, tetapi benar-benar, apa yang kita mahu lakukan dalam situasi ini?
Kami telah mendapati ia, jadi kita mahu membiarkan pemanggil tahu bahawa kita mendapati ia.
Kami telah mendapat fungsi yang fungsi boolean ditaip.
Cara kita isyarat kepada pemanggil fungsi kita bahawa kita sudah bersedia untuk pergi
kita katakan, "Hei, ini adalah benar."
Bagaimana kita akan berbuat demikian, Kevin?
Anda mengangguk-angguk kepala anda. >> [Kevin] Tambah penyata yang benar.
[Nate] Tepat sekali, pulangan benar.
Sekarang, jika ia tidak sama, bagaimana kita akan melihat pada separuh kiri?
Apa-apa idea?
Stella, apa-apa idea?
Anda perlu menetapkan kedudukan baru untuk akhir.
Yeah.
Jadi yang perlu kita lakukan kedudukan titik tengah akhir.
Besar.
Kita perlu menetapkan posisi baru untuk akhir
untuk melihat separuh kiri.
Ini adalah apa yang kita bercakap tentang sebelum mana
Saya sentiasa akan kembali ke contoh ini.
Saya telah bermula di sini, dan kemudian saya mempunyai akhir semua cara di sini.
>> Sekali lagi, jika kita sedang mencari selama 15, dan titik tengah kami adalah pada 16,
dan kita menyedari, "Alamak, 16 adalah lebih besar.
Kami mahu bergerak ke separuh kiri. "
Kami kemudian akan bergerak akhir kepada 15,
dan kita berbuat demikian dengan mengambil salah satu dari titik tengah
dan menetapkan bahawa sebagai akhir baru kami.
Begitu juga, jika kita mahu melihat separuh betul, bagaimana kita akan berbuat demikian?
Adakah anda mempunyai idea?
[Pelajar] Anda hanya menetapkan mula titik + 1.
[Nate] Great.
Dan sekarang dalam kes yang kita tidak mencari apa-apa,
adakah itu mendapat penjagaan yang diambil untuk kita?
Daniel, adakah itu dijaga untuk kita?
[Daniel] No
[Nate] Jika kita membuat ia melalui pelbagai keseluruhan dan kami tidak menjumpai apa-apa,
mana yang akan dijaga, atau kita harus menjaga ia?
[Daniel] keadaan sementara.
[Nate] Ya, keadaan sementara, tepat.
Ia akan menjaga melalui pelbagai keseluruhan jika kita tidak menjumpai apa-apa.
Ini gelung sementara akan berakhir.
Kami tidak akan mengalami keadaan ini,
dan kita boleh kembali palsu.
Kami juga boleh meninggalkan ini jika di sini seperti ini
kerana jika ini jika pernyataan itu adalah benar,
dan fungsi kami akan kembali,
dan supaya kami akan asasnya membatalkan fungsi ini pada ketika ini
apabila kita kembali benar.
Tetapi apa yang berlaku dengan struktur ini di sini?
Ini akan berfungsi sepenuhnya, atau terdapat beberapa kecacatan logik di sana?
>> Terdapat beberapa kesilapan logik di sana, dengan cara ia ditubuhkan.
Apakah ia mungkin?
[Pelajar] Mengapa anda perlu - dan + 1s?
Yang menetapkan pelbagai kami sehingga menjadi separuh baru kami kiri dan separuh kanan.
[Pelajar] Tetapi mengapa tidak boleh anda lakukan ia tanpa - 1s dan + 1s?
[Nate] Kita boleh menetapkan ia sama dengan titik tengah?
Apa yang mungkin bermasalah tentang itu?
[Pelajar] Saya rasa ia adalah tidak cekap kerana anda memeriksa nilai yang sudah diperiksa.
[Nate] Tepat sekali, jadi Sam benar-benar betul.
Jika anda menetapkan akhir dan mula sama dengan titik tengah
bukan - 1 dan + 1 reflectively,
pada satu ketika di masa depan kita akan berakhir sehingga memeriksa titik tengah lagi.
[Pelajar] Saya memulakan pset yang, dan kemudian saya mempunyai sesuatu seperti itu
di mana saya terlupa 1 +, dan ia mendapat terperangkap dalam gelung tak terhingga.
Betul, kerana pada satu ketika anda tidak akan mendapat bermula dan berakhir
sebenarnya bertindih.
Sejuk.
Ada satu lagi kecacatan logik, dan itu adalah bahawa ini pasti harus
lain jika.
Mengapa yang mungkin?
>> Sebabnya ialah jika ia tidak lain jika-adakah anda melihat ia, Kevin?
[Kevin] Ya, kerana anda menukar titik akhir.
[Nate] Tepat sekali.
Kami mengubah titik akhir,
dan jika ia ditulis seperti ini-we'll membuat ruang antara-
ia akan menyemak kes ini.
Kes ini, jika ia berjaya, akan membatalkan fungsi.
Kemudian ia akan menyemak kes ini seterusnya,
dan jika ini berjaya, ia akan melaraskan titik akhir,
dan kemudian ia akan terus dan memeriksa kes ini.
Tetapi pada masa ini, kita tidak mahu ia terus menyemak.
Mujurlah, kita tidak menetapkan semula titik tengah di sini,
dan kita tahu bahawa kes ini tidak akan berjaya.
Tetapi kita pasti mahu meletakkan lain jika di sana
walaupun yang mungkin dalam kes ini
kerana kita tidak menyesuaikan titik tengah, yang akan membuat perbezaan?
Tidak, kerana kes-kes ini adalah semua eksklusif.
Sekali lagi, buruk saya.
Kami tidak, saya fikir, perlu lain ini jika.
Kita boleh mencubanya dan jalankan ia dan lihat apa yang berlaku.
Bangunan, ralat berlaku.
Ia mungkin kerana saya meninggalkan ini dan b e di sini.
Adakah saya mempunyai apa-apa lagi sehingga mereka di atas?
Ia tidak kelihatan seperti ia.
Kami zum keluar, membina,
sana ia pergi, jadi sekarang jika kita mencari 15,
ya.
Biar saya zum masuk
15, ya. Kita boleh berjalan lagi.
Memuat naik kod sumber, bangunan, berlari.
Kita boleh mencari sesuatu seperti 13,
dan kita tidak mendapat apa-apa yang mencetak, jadi ia tidak mencari untuk kita.
Itu yang besar, kerana ia bukan dalam senarai kami.
>> Kita kini berada di luar masa.
Itu akan menjadi untuk minggu ini.
Terima kasih kerana menyertai, dan melihat anda kemudian.
>> [CS50.TV]