>> DAVID J. MALAN: Ini adalah CS50 dan ini adalah permulaan minggu empat.
Dan, kanak-kanak, adalah Volkswagen di masalah semua kerana perisian.
Marilah kita lihat.
[VIDEO MAIN SEMULA]
-Cars, Watak-watak bijak dalam filem Fast and Furious.
Minggu ini automotif Jerman Volkswagen mendapati dirinya
di tengah-tengah skandal perkadaran yang berpotensi jenayah.
>> -Volkswagen Bersedia untuk menghadapi berbilion denda, tuduhan jenayah mungkin
untuk kakitangannya, kerana syarikat itu meminta maaf
untuk penipuan 11 juta kereta ke membantu ia menewaskan ujian pelepasan.
>> Model diesel -Certain adalah direka dengan perisian yang canggih
bahawa maklumat yang digunakan termasuk kedudukan stereng dan kenderaan
mempercepatkan untuk menentukan kereta itu menjalani ujian pelepasan.
Di bawah keadaan yang, enjin akan mengurangkan pelepasan toksik.
Tetapi kereta itu rigged untuk bypass bahawa apabila ia dipandu.
Pengeluaran meningkat 10 hingga 40 kali melebihi paras EPA boleh diterima.
>> [AKHIR MAIN SEMULA]
>> DAVID J. MALAN: Jadi mari kita kita lihat ini
dan melihat dengan jelas bagaimana ini mungkin dilaksanakan
dan bagaimana ini mungkin memberi kesan kepada begitu banyak kereta seperti ini.
Jadi, dalam tangan saya di sini adalah akhbar melepaskan yang telah dikeluarkan oleh EPA--
Alam Sekitar Agensi Perlindungan yang
merupakan agensi pengawal selia AS yang mengendalikan masalah alam sekitar,
dan kemudian sebenar notis undang-undang itu adalah
hantar ke Volkswagen hanya beberapa hari lalu.
>> Jadi EPA menulis, dan menzahirkan sekarang kepada umum, perisian canggih
algoritma tertentu pada Kenderaan Volkswagen mengesan
apabila kereta yang sedang menjalani ujian pelepasan rasmi
dan bertukar pelepasan penuh mengawal pada hanya semasa ujian.
Keberkesanan pencemaran kenderaan ini
alat-alat kawalan pelepasan adalah amat dikurangkan semasa semua pemanduan biasa
situasi.
Ini menyebabkan kereta yang memenuhi piawaian dalam makmal atau ujian
stesen, tetapi semasa operasi biasa mengeluarkan oxides-- nitrogen atau NOx--
pada sehingga 40 kali piawaian.
Perisian yang dihasilkan oleh Volkswagen adalah alat quote unquote, kekalahan,
seperti yang ditakrifkan oleh Bersih Akta Udara di Amerika Syarikat.
>> Mereka pergi untuk mengatakan bahawa EPA dan agensi lain
membongkar peranti kekalahan perisian selepas analisis bebas
oleh penyelidik di Barat Virginia University.
Pencemaran NOx menyumbang kepada nitrogen dioksida, ozon permukaan tanah,
dan bahan zarahan halus.
Pendedahan kepada pencemar telah dikaitkan
dengan pelbagai kesan-kesan kesihatan yang serius,
termasuk asma meningkat serangan dan pernafasan yang lain
penyakit yang boleh menjadi cukup serius untuk menghantar orang ke hospital.
Pendedahan kepada ozon dan zarah juga telah
telah dikaitkan dengan pra-matang kematian akibat pernafasan yang berkaitan
atau kardiovaskular kesan yang berkaitan.
Kanak-kanak, orang tua, orang-orang yang penyakit pernafasan yang wujud terlebih dahulu
adalah sangat berisiko untuk kesan-kesan kesihatan pencemar ini.
>> Memadai untuk mengatakan, ia agak serius.
Dan mari kita pergi untuk membaca hanya satu petikan lebih
dan kemudian kita akan lihat pada implikasi yang mendasari
ini dalam konteks sebuah kereta.
Secara khusus, Volkswagen dihasilkan dan dipasang
perisian dalam apa yang dikenali sebagai kawalan elektronik
module-- atau ECM-- daripada kenderaan ini yang dikesan
apabila kenderaan itu sedang diuji untuk mematuhi standard pelepasan EPA.
Berdasarkan pelbagai input termasuk kedudukan stereng, kenderaan
kelajuan, tempoh enjin ini operasi, dan tekanan barometer,
input ini dengan tepat dikesan parameter
prosedur ujian persekutuan digunakan untuk ujian pelepasan untuk pensijilan EPA
tujuan.
>> Semasa ujian pelepasan EPA, perisian kenderaan ECM
perisian yang menghasilkan berlari pelepasan mematuhi keputusan.
Pada waktu yang lain, yang perisian kenderaan ECM
berlari jalan yang berasingan penentukuran yang mengurangkan
keberkesanan sistem kawalan pelepasan secara keseluruhan,
khusus pemangkin terpilih pengurangan NOx Lean trap--
yang kita akan menyaksikan kira-kira dalam seketika.
Hasilnya, pelepasan NOx meningkat dengan faktor 10 hingga 40 kali
atas EPA tahap yang mematuhi bergantung kepada jenis kitaran memandu.
>> Jadi apa ini benar-benar bermakna, dan kod sumber untuk menjalankan perisian
pada Volkswagen tidak mempunyai belum didedahkan kepada umum,
ialah, berkesan, ini bersamaan adalah suatu tempat ada di dalam
kod Volkswagen.
Jika anda sedang diuji, dan jika kereta mengesan faktor persekitaran tertentu
seperti stereng kedudukan atau pergerakan
atau kekurangan daripadanya kereta atau apa-apa bilangan faktor-faktor lain
yang sedang hipotesis untuk menjadi sebahagian daripada formula ini,
mereka hanya menghidupkan pelepasan penuh mengawal.
Dalam erti kata lain, mereka mula mengeluarkan kurang daripada bahan pencemar.
>> Yang lain, dalam setiap keadaan lain apabila ia tidak dikesan sebagai
di dalam makmal, mereka hanya tidak.
Dan supaya anda boleh memudahkan ini ke dalam lebih pseudokod konkrit dengan sesuatu
macam ini.
Jika roda beralih tetapi stereng tidak, tidak senonoh
bahawa kereta itu adalah pada beberapa jenis berputar silinder
tetapi dalam beberapa jenis gudang sedang diuji,
kemudian berkelakuan sebagai EPA ingin anda untuk.
Jika tidak tidak.
Jadi mari kita lihat di video pendek yang
mengambil melihat apa implikasi adalah ini sebenarnya secara mekanikal.
>> [VIDEO MAIN SEMULA]
>> -Last Jumaat EPA mengumumkan bahawa beberapa Volkswagen Audi kereta yang dibuat antara 2009
dan tahun ini telah menggunakan peranti kekalahan yang dipanggil
untuk mendapatkan sekitar undang-undang pelepasan direka untuk mengekalkan udara yang bersih.
Tetapi apakah itu bermakna betul-betul?
>> Well, kereta moden mempunyai berpuluh-puluh komputer di dalamnya.
Dan sebahagian daripada mereka komputer membantu menyelaras fungsi
enjin untuk optimum prestasi sambil memastikan
bahawa tidak ada terlalu banyak sampah yang keluar dari paip ekzos.
Mereka telah benar-benar telah bekerja cara ini selama beberapa dekad sekarang.
Pada asasnya, setiap bahagian enjin kereta moden
mempunyai sensor atau pengawal di atasnya, dan komputer ini
membaca dalam data beribu-ribu kali setiap pelarasan membuat kedua
seperti nisbah bahan api kepada udara yang akan masuk ke dalam silinder.
>> Ini Volkswagen menipu dan model Audi adalah diesel,
dan diesel mempunyai satu lagi komputer benar-benar penting
parameter yang dikawal, yang merupakan jumlah bahan api yang tidak terbakar akan
ke dalam ekzos.
Nah ini tidak baik.
Tidak bunyi seperti anda mahu bahan api yang tidak terbakar pergi ke ekzos.
Tetapi dalam hal suatu diesel, anda mempunyai sesuatu
dipanggil perangkap NOx yang merupakan peranti yang menyerap dan perangkap untuk nitrogen oksida
yang pencemar yang akan jika tidak pergi ke atmosfera.
Dan kesan yang memerangkap NOx dipertingkatkan dengan bahan api yang tidak terbakar.
Jadi alat kekalahan adalah satu program khas dalam komputer ini yang boleh membuat ia
kelihatan seperti kereta yang memenuhi pelepasan piawaian walaupun ia tidak.
Volkswagen mempunyai masalah pada tangan.
Enjin diesel dikenali untuk mendapatkan ekonomi bahan api yang besar,
tetapi perangkap NOx hanya berfungsi dengan baik apabila lebih banyak bahan api digunakan.
Jadi kereta itu akan mengesan, menggunakan peranti kekalahan ini,
apabila ia telah mendapat satu pelepasan ujian, ia akan menggunakan lebih banyak bahan api,
membuat NOx perangkap kerja dengan baik, pelepasan akan menjadi baik.
Tetapi kemudian anda mendapatkan di jalan raya, peranti dimatikan, anda membakar bahan api yang kurang
tetapi anda meletakkan sebanyak 40 kali lebih bahan pencemar ke atmosfera.
Tetapi bagaimana palang pintu lakukan kereta tahu bahawa ia adalah
diuji untuk pematuhan pelepasan?
EPA mengatakan, ia adalah yang canggih sistem yang diperiksa perkara
seperti kedudukan stereng, kelajuan, berapa lama enjin berada di atas,
dan juga tekanan atmosfera.
Dalam erti kata lain, ada ada cara ini tidak sengaja
kerana perisian ini adalah direka dengan berhati-hati untuk mengesan
ujian pelepasan rasmi.
Itulah beberapa cukup serius penipuan dan itulah
mengapa Volkswagen adalah dalam masalah yang serius.
Malah, Ketua Pegawai Eksekutif mereka, Martin Winterkorn, baru sahaja melangkah ke bawah.
>> Jadi apa yang berlaku seterusnya?
Nah, jika anda salah seorang daripada setengah juta Jettas diesel, Beatles, Golfs, Passat,
atau Audi A3s dilaksanakan, berita baik ini adalah
bahawa kereta anda masih selamat untuk memandu.
Anda tidak perlu menyimpannya sehingga Volkswagen mengeluarkan dipanggil semula.
Tetapi pada satu ketika mereka mungkin akan mempunyai
untuk mengemas kini perisian di dalam kereta anda.
Apabila ini berlaku anda mungkin mendapat lebih sedikit batu pada tangki.
Peguam sudah bersiap sedia untuk tuntutan mahkamah tindakan kelas
jadi pemilik mungkin akan pampasan pada satu ketika pada masa hadapan.
Tetapi itu tidak akan berlaku bila-bila masa tidak lama lagi.
>> [AKHIR MAIN SEMULA]
DAVID J. MALAN: Jadi ini sebenarnya menimbulkan satu persoalan yang lebih besar gambar yang menarik
untuk percaya.
Betul?
Semua kita mempunyai iPhone atau Androids atau sesuatu dalam poket kita kemungkinan besar
hari ini, atau komputer riba pada pusingan kami yang
perisian yang berjalan dibuat oleh Apple dan Microsoft
dan tandan-syarikat lain.
Tetapi bagaimana kita tahu bahawa apa yang produk-produk perisian lakukan
sebenarnya apa ini syarikat berkata yang mereka lakukan?
>> Sebagai contoh, siapa yang mengatakan bahawa setiap kali anda
membuat panggilan telefon pada iPhone anda atau Android telefon atau sebagainya,
yang nombor telefon juga tidak dimuat naik ke pelayan beberapa syarikat
kerana program tertentu anda telah bertulis, sama ada ia adalah operasi
Sistem itu sendiri seperti IOS atau Android, atau kerana anda telah memuat turun
beberapa aplikasi pihak ketiga yang entah bagaimana yang mendengar
kepada semua yang anda taip di dalam atau di semua yang anda sebenarnya berkata.
Bagaimana anda tahu bahawa, apabila anda semua menjalankan dilafaz
atau Make untuk menyusun anda perisian sendiri dalam CS50, bagaimana
adakah anda kakitangan yang CS50 sendiri, melalui perpustakaan CS50,
belum pembalakan setiap rentetan yang anda pernah mendapat
atau setiap inci anda pernah mendapat?
Dengan baik, anda pasti dapat melihat kod sumber untuk sesuatu
seperti perpustakaan CS50, anda boleh melihat kod sumber
untuk sistem operasi Linux berjalan pada CS50 IDE.
Tetapi persembahan menakjubkan telah diberikan semula pada tahun 1984
menerima Anugerah Turing oleh ahli sains komputer yang sangat terkenal yang dikenali
as-- bernama Ken Thompson yang menerima Anugerah Turing yang
adalah jenis komputer sains ini Hadiah Nobel, jika anda akan,
untuk kerja-kerja pada sistem operasi yang dikenali sebagai
Unix, yang sangat serupa dalam semangat untuk apa yang kita gunakan iaitu Linux.
Dan soalan itu dia bertanya di dalam bukunya ucapan penerimaan, pada dasarnya
berbaring rangka kerja bagi tahun ke tahun perbincangan
tentang kepercayaan dan keselamatan, adalah ini.
Sejauh manakah perlu satu amanah kenyataan bahawa program-- sekeping
daripada software-- adalah percuma kuda Trojan?
Mungkin ia adalah lebih penting untuk mempercayai orang-orang yang menulis perisian.
>> Dan sebenarnya, kami telah dikaitkan ceramah bahawa dia
memberikan apabila menerima anugerah ini dalam tahun 80-an di laman web CS50
di bawah halaman Kuliah untuk hari ini.
Kerana apa yang anda akan melihat adalah bahawa dia sebenarnya memberikan
satu contoh yang agak mudah bagaimana walaupun pengkompil seperti dilafaz atau apa sahaja
penyusun yang lain telah digunakan pada masa lalu, bagaimana jika tertanam dalam kita pengkompil
diri kita gunakan adalah sedikit jika keadaan yang pada dasarnya berkata,
jika anda mendapati bahawa kod ini menggunakan fungsi GetString itu atau GetInt
fungsi, teruskan dan memasukkan pintu belakang atau kuda Trojan
supaya program yang kini mempunyai beberapa sifar
dan orang-orang yang melakukan sesuatu yang berniat jahat.
Log semua anda ketukan kekunci, memuat naik data yang
kepada beberapa pelayan, atau benar-benar apa-apa.
>> Dan apa Ken Thompson seterusnya untuk menghabiskan ceramahnya
adalah untuk menunjukkan bahawa walaupun anda mempunyai akses kepada sumber
kod pengkompil yang niat jahat mungkin melakukan ini,
ia tidak menjadi masalah kerana ada ayam dan telur
realiti banyak lalu tahun di mana penyusun
digunakan untuk menyusun diri mereka sendiri.
Dalam erti kata lain, dalam perjalanan pulang apabila seseorang telah telah menulis pengkompil pertama.
Dan selepas itu, bila-bila masa mereka telah dikemaskini pengkompil dengan menukar kod sumbernya,
menambah ciri-ciri dan recompiling ia untuk orang seperti kita untuk menggunakan, baik,
mereka menggunakan lama versi pengkompil
untuk menyusun baru versi pengkompil.
Dan jika anda melihat dengan ceramah yang dia berikan,
anda akan melihat bahawa kerana daripada bundar itu,
anda sebenarnya boleh mempunyai bug atau Kuda Trojan tertanam dalam perisian
kita gunakan.
Dan jika anda melihat penggunaan di Kod sumber untuk program-program,
ia mungkin tidak menjadi bukti kerana tipu muslihat ini sebenarnya
dalam beberapa versi yang lebih tua daripada pengkompil bahawa sejak telah
menyuntik ancaman ke dalam perisian kami.
>> Yang hanya untuk mengatakan, kita benar-benar tidak boleh dan tidak sepatutnya
perisian amanah berjalan pada komputer riba kami atau telefon atau apa-apa bilangan tempat.
Dan sebenarnya, kemudian pada semester ini apabila kita mula bercakap tentang pengaturcaraan web
dan benar-benar mula membina aplikasi web diri kita sendiri,
kita akan bercakap mengenai ancaman dan lain-lain.
Sekarang, anda mungkin tertanya-tanya dan perasan bahawa terdapat satu Darth kecil sedikit
Vader dalam klip yang The Verge telah menunjukkan terdapat
tentang Volkswagen. Jika anda tidak pernah dilihat, saya
fikir kita perlu meringankan mood kerana ini adalah semua
sangat menyedihkan dan menakutkan.
Saya akan melihat kembali di Super Bowl 2011
apabila komersial oleh Volkswagen-- dan ini
hampir membuat mereka disenangi again-- disiarkan buat pertama kali di TV.
Ia adalah 60 klip kedua yang saya fikir anda akan menikmati.
[VIDEO MAIN SEMULA]
[MUZIK - TEMA DARI "STAR WARS"]
[DOG BARKS]
[CAR BERMULA]
[AKHIR MAIN SEMULA]
DAVID J. MALAN: Ya.
Saya hanya memeriksa.
Kereta yang berada dalam senarai pelanggaran.
Baiklah.
Oleh itu, kita lihat beberapa pseudokod sebentar tadi.
Dan ini yang lebih besar coretan kod pseudo
bahawa kita telah melihat beberapa kali setakat ini.
Dan mari kita gunakan ini adalah satu peluang sekarang untuk memperkenalkan program baru
teknik yang kita lakukan melihat algorithmically
minggu lalu apabila kita melihat jenis merge.
Tetapi mari kita merasmikan ia dan melihat bagaimana kita mungkin menggunakannya kod sebenar,
dan kemudian kita akan menggunakan ini teknik di jalan yang paling
mungkin untuk menyelesaikan masalah tertentu yang lain.
>> Jadi ini adalah salah satu program pertama kita pernah menulis, walaupun kod pseudo.
Dan apa yang program ini dibenarkan kita untuk melakukan perjalanan
adalah untuk mencari Mike Smith dalam buku telefon.
Dan perhatikan dalam barisan tertentu lapan dan 11 yang mempunyai ini kenyataan Kembali ke.
Dan sebenarnya, tertentu bahasa, C di antara mereka,
benar-benar melakukan mempunyai pernyataan yang benar-benar
pergi ke yang membolehkan anda untuk melompat ke garisan tertentu.
Ia secara umumnya disukai kerana ia boleh dengan mudah disalahgunakan
dan anda boleh mula melompat anda program di seluruh tempat yang bertentangan
menggunakan jenis logik dan aliran kawalan
yang kami telah digunakan setakat ini dengan hanya gelung dan syarat dan sebagainya.
>> Tetapi kita boleh memudahkan algoritma ini kod kod pseudo seperti berikut.
Daripada ini lelaran atau pendekatan menggelung
di mana kita terus selalu pulang belakang dan belakang untuk beratur tiga,
mengapa tidak kita hanya jenis menyepak bola dan banyak lagi umumnya berkata selaras tujuh dan 10,
hanya menggantikan kedua-dua pasang baris dengan,
lain jika Smith awal dalam buku ini kita akan
mencari Mike dalam separuh kiri buku ini.
Lain jika Smith ialah kemudian dalam buku, cari Mike di sebelah kanan
setengah buku ini.
Dan perhatikan sudah bundar itu.
Betul?
Saya mencari Mike dalam buku telefon dan kemudian
Saya akhirnya melanda mungkin garis tujuh atau mungkin baris 10
dan arahan saya kepada diri saya sendiri adalah carian untuk Mike dalam separuh daripada buku telefon.
Nah, bagaimana saya mencari Mike?
Saya dalam pertengahan mencari Mike, mengapa
sedang anda jenis menyuruh aku dalam satu bulatan?
Tetapi tidak apa-apa kerana apa yang berlaku kepada saiz masalah itu,
seperti yang ditulis dalam talian 7 dan 10?
Kami tidak hanya mengatakan carian Mike, cari Mike.
Kami secara khusus mengatakan apa?
Cari dia dalam separuh kiri separuh kanan yang berkesan
separuh saiz masalah.
Jadi ia adalah OK bahawa kita jenis melibatkan diri dalam bundar ini,
hujah pekeliling ini, kerana sekurang-kurangnya kami
membuat masalah yang lebih kecil dan lebih kecil.
Dan akhirnya kita akan mencapai bahawa apa yang dipanggil kes asas di mana
kita mempunyai hanya satu halaman left-- sebagai sukarelawan kami minggu lepas
did-- kita mempunyai satu halaman kiri dan kemudian kita tidak
perlu terus mencari Mike Smith kerana dia sama ada pada laman tersebut
atau dia tidak.
>> Jadi bagaimana kita boleh melaksanakan idea ini, ini semacam bundar kod sebenar?
Nah, kita boleh memanfaatkan teknik yang yang yang umumnya dikenali sebagai rekursi.
Dan kita telah melihat ini dalam pseudokod untuk merge minggu lepas.
Ingat bahawa ini adalah pseudokod untuk jenis merge.
Ia boleh dikatakan lebih mudah daripada gelembung atau pilihan atau memasukkan sejenis
sahaja dari segi kesederhanaan yang anda boleh menyatakan ia.
>> Tetapi itu kerana kami semacam circularly
berkata, mencari sesuatu dengan mencarinya lagi.
Tetapi kita mencari sama ada di separuh kiri atau separuh betul
dan kemudian akhirnya kami bergabung dalam kes ini.
Tetapi di sini, juga, dengan kedua-dua baris jenis,
adakah kita sekali lagi mempunyai ini idea rekursi.
Dan secara kukuh apa ini bermakna, dalam konteks algoritma,
ialah algoritma yang adalah rekursif jika ia menggunakan atau panggilan sendiri.
>> Atau dari segi C, fungsi adalah recursive-- fungsi yang dipanggil
foo adalah rekursif jika foo, suatu kod sumbernya,
panggilan fungsi foo itu sendiri.
Dan yang tidak baik jika semua foo pernah tidak adalah panggilan sendiri lagi dan lagi.
Tidak mengapa jika foo akhirnya berhenti, seperti juga bergabung apapun, dengan berkata, tunggu satu minit,
jika masalah ini adalah super kecil, misalnya,
atau saya mendapati beliau yang saya cari, hanya kembali.
Jangan rekursif, tidak cyclically memanggil diri saya lagi.
>> Dan jadi mari kita lihat pada bagaimana ini sebenarnya mungkin bekerja.
Jadi, saya akan pergi ke hadapan dan terbuka dua contoh kod sumber di sini.
Salah satu yang dipanggil sigma 0.
Dan ini tidak sama sekali rekursi, tetapi mari kita
yang melihat apa yang program ini tidak.
Saya telah dilucutkan daripada semua komen daripada ia tetapi semua
kod sumber pada itu CS50 Laman web mempunyai komen jika anda
mahu membaca lagi kemudian.
Dan mari kita buat pasangan kewarasan memeriksa di sini.
>> Jadi di bahagian atas kod ini, kita ada termasuk CS50.h.
Apakah ini lakukan?
Mengapa di sini?
Dari segi orang biasa yang munasabah.
Apa yang ia buat?
Yeah.
>> PENONTON: Supaya fungsi GetInt berfungsi.
>> DAVID J. MALAN: Jadi yang fungsi GetInt berfungsi.
Oleh kerana di dalam ini fail, CS50.h, yang
kita akan melihat tidak lama dalam segi kod sumbernya,
mempunyai sekumpulan fungsi declared-- GetInt, GetString,
dan mempunyai banyak others-- dan melainkan jika kita sebenarnya mempunyai yang Termasuk line,
dilafaz pengkompil tidak akan tahu bahawa ia wujud.
Dan sama juga dengan garis dua di mana int ditakrifkan
printf, yang merupakan fungsi kita terus menggunakan agak sedikit.
Sekarang, garis empat kelihatan funky kerana ia hanya satu liner satu.
Ia mempunyai koma bertitik, tidak kerinting kawat gigi, tidak ada kod di dalamnya.
Tetapi apa yang tidak kita panggil perkara ini dalam beberapa minggu yang lalu?
Yeah.
Jadi prototaip.
Dan mengapa kita mempunyai prototaip yang seolah-olah
menjadi berlebihan sedikit biasanya kerana kita biasanya
lihat fungsi sekali lagi kemudian dalam fail, bukan?
Jadi mengapa kita ada-- anda hanya menggaru kepala anda tetapi saya akan mengambilnya.
Yeah.
>> PENONTON: [didengar] fungsi selepas utama.
DAVID J. MALAN: Tepat sekali.
Supaya pengkompil tahu anda akhirnya akan menentukan atau melaksanakan
fungsi yang selepas utama, mungkin.
Jadi dilafaz dan paling penyusun adalah jenis bodoh
dan mereka hanya akan tahu apa yang anda memberitahu mereka.
Dan jika anda mahu untuk menggunakan fungsi yang dipanggil sigma,
anda lebih baik mengajar pengkompil bahawa ia wujud terlebih dahulu.
>> Sekarang, sendiri utama, walaupun walaupun ia mempunyai banyak baris,
agak biasa diharapkan sekarang.
Ia mempunyai do manakala gelung tujuan yang dalam kehidupan
di sini nampaknya adalah untuk mendapatkan integer positif daripada pengguna.
Dan hanya menyimpan pestering dia atau dia sehingga mereka bekerjasama.
Kemudian pada garis 16 Saya mempunyai panggilan yang menarik.
IntAnswer.
Yang pada tangan kiri sisi memberi saya Int
yang boleh store-- dipanggil Answer-- yang akan menyimpan, nampaknya,
nilai pulangan Jepun.
Jadi sigma adalah hanya satu nama sewenang-wenangnya tetapi bermakna
yang saya telah diberikan ke fungsi tujuan yang dalam kehidupan
adalah untuk mengambil satu argument-- kita akan memanggilnya N dalam kes ini
dan hanya untuk mengambil jumlah daripada jumlah itu ditambah setiap nombor positif itulah
lebih kecil daripada itu.
>> Jadi, jika saya lulus dalam bilangan 2 hingga sigma, saya ingin menambah 2 + 1
ditambah 0-- tidak 0-- supaya memberikan saya 3.
Jika saya lulus dalam 3 hingga sigma, saya ingin 3 + 2 + 1, yang memberikan saya 6.
Dan sebagainya.
Oleh itu, ia hanya menambah sehingga semua nombor kurang daripada atau sama dengannya.
>> Sekarang, turun di sini saya hanya akan untuk mencetak di atas jawapan itu.
Jadi sebagai cek kewarasan cepat, mari kita membuat sigma 0-- dot mengurangkan sigma 0--
dan biarlah saya taip 2.
Dan saya memang mendapat 3.
Biar saya taip 3.
Saya memang mendapat 6.
Dan jika sesiapa sahaja boleh melakukan matematik dengan cepat, jika saya lakukan 50 apa yang saya akan dapat?
>> PENONTON: [didengar].
DAVID J. MALAN: Sebenarnya, tidak.
Tetapi 1275 yang cukup rapat.
Jadi ini adalah hasil daripada melakukan 50 plus 49 plus 48 plus 47 plus 46
semua jalan ke 1.
Jadi itu sahaja sigma tidak.
Tetapi mari kita lihat bagaimana kita ada dilaksanakan sekarang.
Jadi di bawah ini adalah fungsi itu sendiri.
Dan ini nampaknya tidak mempunyai apa-apa kaitan dengan rekursi lagi.
Malah, kami menggunakan teknik sekolah lama.
Saya Memulakan sejumlah pembolehubah dipanggil kepada sifar, maka saya mempunyai foreloop di sini,
dan saya mengisytiharkan Int dipanggil I, menetapkan ia sama dengan 1--
walaupun saya boleh menetapkan ia sama dengan sifar, tetapi sejak saya lakukan samping itu,
yang mengambil berat jika ia sifar atau satu.
Ia akan mempunyai kesan.
>> Jadi, saya iterating selama aku adalah kurang daripada atau sama dengan m, yang
hujah yang telah diluluskan pada.
Dan kemudian saya hanya menyimpan menokok I. Dan wawasan
gelung semua yang saya lakukan adalah melakukan jumlah ditambah sama I. Dan itu sengaja.
Saya tidak mahu lakukan, dalam hal ini kes, seperti jumlah plus plus.
Saya hendak benar-benar menambah nilai semasa saya
yang menyimpan semakin besar dan besar dan lebih besar untuk tally berjalan.
>> Dan kemudian saya kembali jumlah.
Dan sebagainya jawapan mendapat jumlah nilai.
Dan kemudian saya mencetak.
Jadi ada peluang di sini, walaupun, untuk jenis memudahkan
kod ini dari segi konsep dan jenis tamparan satu yang
keberatan dari segi kesederhanaan walaupun ia
mengambil masa yang lama untuk menyusun untuk memahami mengapa ini
adalah kuat dalam contoh-contoh kecil.
Berikut adalah sigma one-- jadi Versi kedua kod ini.
Segala-galanya sehingga atas adalah sama supaya cerita yang sama berlaku seperti sebelum ini.
Tetapi sekarang mari kita melihat pelaksanaan sigma yang
Saya telah dikecutkan kepada ini lines-- empat baris kod, benar-benar,
ditambah beberapa pendakap kerinting dan ruang putih.
>> Tetapi apa yang saya buat?
Jika m adalah kurang daripada atau sama dengan sifar, saya perlu sejenis mengendalikan
bahawa kes super mudah.
Dan jika anda tangan saya sifar atau apa-apa negatif yang ini pelik,
Saya hanya akan sewenang-wenangnya tetapi konsisten kembali sifar.
Saya tidak mahu perkara ini kepada masuk ke dalam beberapa terhingga pelik
gelung kerana nilai negatif.
Jadi, saya hanya berkata, jika anda memberikan saya sifar atau kurang, saya kembali sifar.
>> Tetapi itulah yang baik kerana itulah bahawa laman tunggal buku telefon
yang tinggal.
Saya menggigit mencetuskan masalah yang sangat khusus dan tidak memanggil sesuatu secara berulang.
Tetapi selaras 31, apa saya seolah-olah melakukan?
Kurungan hanya menjaga perkara, mudah-mudahan, itu lebih jelas.
Tetapi semua yang saya lakukan adalah saya kembali m-- apa sahaja
anda menyerahkan me-- ditambah nilai maaf m--,
dicampur dengan nilai sigma m tolak 1.
Jadi apa maknanya?
Jika anda memberikan saya nombor 3 sebagai input, jawapan yang saya ingin mendapatkan akhirnya
adalah 6 sebab 3 + 2 + 1 memberikan 6 saya.
Tetapi bagaimana saya berfikir tentang bagaimana kod ini berjalan?
Kali pertama saya panggil sigma dan saya lulus dalam nilai 3,
bahawa seperti mengatakan pada selembar kertas, di sini adalah nilai 3
dan saya telah diluluskan ini sebagai Jepun.
3 adalah jelas tidak kurang daripada 0 sehingga keadaan IF tidak terpakai.
ELSE tidak.
Jadi, apa yang saya lakukan?
Saya mahu kembali m, yang merupakan 3, ditambah sigma m tolak 1.
Jadi biarlah saya mengesan ini.
Saya akan meletakkan ini sekeping kertas ke bawah.
Dan apa nilai, untuk menjadi jelas, adakah saya akan lulus
ke Jepun pada ketika ini dalam cerita?
Apa nombor?
2, bukan?
3 tolak 1 ialah 2.
Jadi saya hanya memerlukan sedikit sekerap kertas sini.
Jadi sekarang sigma semakin dipanggil lagi.
Dan saya telah sengaja meletakkan ini ke bawah kerana ia adalah
jenis seperti berhenti bahawa versi cerita
kerana sekarang saya menumpukan kepada isyarat m tolak 1.
Jadi m adalah 3, m tolak 1 ialah 2.
Jadi di sini adalah 2 yang saya telah diluluskan.
2 adalah jelas tidak kurang daripada 0 jadi kes yang tidak terpakai.
Yang lain aku kembali m, yang ini perkara, ditambah sigma apa nilai?
Jadi, jika sigma 1-- kerana m sekarang 2 jadi 2 tolak 1 adalah 1.
Jadi sekarang saya mempunyai hanya nilai 1.
Saya lulus hanya nombor yang 1 kepada fungsi sigma-- yang
atau diri saya sini-- jadi 1 adalah jelas tidak kurang daripada sifar, masih tidak terpakai.
>> Kembali lagi 1 + sigma apa?
0.
Jadi biarlah saya hanya ingat bahawa.
Saya akan kembali kepada yang kemudian.
Sekarang saya akan pergi ke hadapan dan jot ke bawah nombor 0 kerana itulah
hujah atau parameter saya.
Saya lulus nombor 0 dan akhirnya proses ini
hanya mengulangi diri saya iklan nauseum tidak berhenti kerana apa
saya segera melakukan sekali saya melihat ini 0?
Saya kembali sifar.
Jadi sekarang anda mempunyai untuk putar balik cerita.
>> Jika saya kini pergi ke dalam masa, apa adalah perkara yang paling baru-baru ini
Saya lakukan jika anda telah benar-benar gulung semula video?
Saya akan mengambil yang paling terkini 1 dan yang memberikan saya 1 tambah 0 ialah 1.
Jika saya terus gulung semula yang cerita, yang akan memberi saya
2 tambah nilai ini berjalan, iaitu 1.
Jadi itu 3.
Dan kemudian saya akan terus gulung semula.
Ketika saya pertama kali menyebutkan angka 3-- jadi 3 campur 3 memberikan saya 6.
>> Dan kini, jika anda telah diadun video ini hingga ke tahap ini,
ini adalah sangat Soalan pertama saya bertanya.
Apabila berlalu 3, apakah sigma 3?
Ia sememangnya 6, jumlah semua ini keping kertas.
Jadi, jika yang mengambil sedikit masa untuk membalut fikiran anda sekitar, itulah denda.
Tetapi menganggap ia adalah satu little-- ia adalah sangat sengaja bahawa saya disusun
nombor-nombor di atas satu sama lain.
Ia adalah jenis seperti mempunyai memory-- rekod dalam masa,
seperti scrubber dalam video, bahawa saya memang boleh putar balik masuk.
Dan kita akan kembali kepada yang metafora dalam hanya sedikit.
>> Tetapi pertama, ternyata bahawa ada banyak Geeks dan orang-orang lucu,
Saya rasa, di Google.
Adakah seseorang yang amat baik pada fikiran Googling
datang hanya untuk seketika dan membantu saya mencari sesuatu?
Sangat, yang penting sangat rendah.
Seseorang yang tak pernah datang sebelum, mungkin.
OKAY.
Ya?
Datang pada.
Ayuh ke bawah.
Siapa nama anda?
>> SAM: Sam.
>> DAVID J. MALAN: Sam, datang ke atas ke bawah.
Ini adalah sama.
Gembira Mengenali Anda.
Hey.
Datang pada lebih.
Jadi segala-galanya yang anda lakukan, jika anda boleh, Sam, di sini adalah Google.
Bolehkah anda mencari rekursi jangka?
Jangan merosakkan.
>> Dan kini let's-- yeah.
OK Klik itu.
Better klik itu.
Ahh, mendapatkannya.
Tidak?
OKAY.
Jadi mari kita buat beberapa orang lain.
Tidak begitu banyak berkaitan akademik di sini, tetapi anda
pernah mencari Google untuk anagram?
>> SAM: No.
>> DAVID J. MALAN: OK.
Cari anagram bukannya rekursi.
Bagaimana pula serong.
Anda pernah dicari serong?
Sekarang, yang satu ini adalah sedikit sukar untuk melihat tetapi diharapkan everything's-- OK.
Ia hanya anda dan saya menikmati ini.
OKAY.
>> Jadi akhirnya, one's-- ini ia adalah satu serong sedikit.
Kini melakukan roll setong.
Hebat.
Baiklah.
Terima kasih kepada Sam.
Di sini anda pergi.
Terima kasih.
>> Jadi apa yang berlaku di dalam semua contoh-contoh ini bodoh?
Jadi benar-benar, di bawah bonet Berjuta-juta Google baris kod
nampaknya adalah bodoh beberapa IF keadaan yang pada dasarnya
memeriksa jika pengguna mempunyai ditaip dalam frasa ini,
melakukan sesuatu yang mungkin mengambil jumlah nontrivial masa
untuk melaksanakan hanya untuk menjadi lucu dengan cara ini.
Tetapi itu semua ia mendidih turun ke bawah hood.
Tetapi, sudah tentu, rekursi adalah lebih daripada geekier
contoh di kalangan mereka helah khas.
Dan sesungguhnya ada orang lain di luar sana juga bahawa kita mungkin mempunyai tidak
ditemui hanya lagi.
>> Jadi kita lihat, atau menimbangkan sekarang program berikutnya,
dan sudah tentu merebut apa-apa ini pada jalan keluar.
Saya akan pergi ke depan dan membuka program itu
akan cuba untuk menukar dua nilai.
Tetapi sebelum kita pergi ke sana, mari kita buat ini.
Bolehkah kita mendapat satu lagi sukarelawan, saya fikir?
Adakah anda ingin menjadi sukarelawan?
Tidak?
Naiklah.
Baiklah.
Jadi nama anda adalah apa?
>> LAUREN Lauren.
>> DAVID J. MALAN: Lauren.
Naiklah, Lauren.
Jadi Lauren sedang dicabar di sini seperti berikut.
Gembira Mengenali Anda.
Jadi Lauren di sini mempunyai di hadapan dua cawan kosong beliau.
Dan kami mempunyai beberapa oren jus dan susu
dan kami akan pergi hadapan dan melakukan yang berikut.
Kami hanya akan mengisi ini.
Beberapa auns susu di sini dan mari kita mengisi jus oren sedikit di sini.
>> Dan di hadapan semua ahli-ahli penonton,
swap dua nilai cawan ini.
Meletakkan jus oren dalam cawan susu dan susu dalam cawan jus oren.
Bagaimana anda akan melakukan ini jika anda berada di rumah dan mempunyai akses kepada bekalan lain?
LAUREN: Letakkan dalam cawan lain.
DAVID J. MALAN: OK.
Jadi mari kita sementara berubah-ubah, jika kita akan.
Dan pergi ke depan sekarang dan melaksanakan ini prosedur bertukar-sama.
Jadi, baik.
Kami telah meletakkan OJ ke dalam sementara berubah-ubah, susu ke dalam pembolehubah OJ itu,
dan kini berubah sementara ke dalam pembolehubah susu.
OKAY.
Jadi sangat baik dilakukan setakat ini.
Jadi ternyata out-- berpegang bahawa berfikir untuk seketika.
Di sini, hanya geek ia sedikit, ini akan menjadi kod C yang sepadan
bahawa kita hanya dilaksanakan.
Kami mempunyai dua input, a dan b, kedua- yang kita hanya akan mengatakan dengan kesederhanaan adalah
ini int.
Dan perhatikan di sini, jika saya mahu untuk menukar nilai-nilai bagi dua pembolehubah, a dan b,
kita memang memerlukan orang tengah, yang pembolehubah sementara, secawan sementara,
ke dalam mana tuangkan salah satu daripada nilai supaya kita mempunyai ruang letak untuk itu.
Tetapi kemudian kod ini betul-betul sebagai Lauren sini dilaksanakan.
>> Sekarang, hanya untuk mendapatkan sedikit gila, ternyata
bahawa anda boleh melakukan ini tanpa pembolehubah sementara.
Untuk melakukan ini dengan baik, walaupun, kita akan untuk mempunyai untuk menipu dengan beberapa kimia.
Kami mempunyai beberapa cawan tambahan di sini.
Jadi perkara yang paling dekat yang kelihatan seperti susu dan air perhaps--
atau susu dan OJ-- adalah kita mempunyai beberapa air, jadi kita akan mengisi satu ini sehingga
dengan beberapa auns air jelas.
Itu mungkin terlalu banyak.
Yeah.
Yang pasti terlalu banyak.
Pegang pada satu saat.
>> Dan sekarang kita mempunyai minyak, yang, seperti yang saya ingat dari sekolah menengah kelas kimia,
mudah-mudahan ia tidak bercampur dengan air.
Tetapi ia jenis jenis kelihatan seperti susu dan OJ.
Oleh sebab itu, tanpa menggunakan pembolehubah sementara,
anda boleh menukar kedua-dua nilai?
Jadi minyak masuk ke dalam cawan air, air masuk ke dalam cawan minyak.
LAUREN: Tiada cawan yang lain?
DAVID J. MALAN: Tiada cawan lain.
Dan saya tidak ada sebenarnya diuji ini sebelum tahun ini
jadi saya tidak tahu jika ini akan benar-benar bekerja kimia.
Yang tidak sepatutnya berlaku.
Adakah ia berfungsi?
Baiklah.
Jadi memisahkan?
Yang baik.
Sekarang kita mendapat untuk mendapatkan air ke dalam cawan yang lain.
Concentrators kimia lebih bijak boleh mungkin melakukan ini lebih baik daripada saya.
>> LAUREN: Air yang di bahagian bawah.
>> DAVID J. MALAN: The water-- itu adalah apa yang penting kali terakhir kita lakukan ini.
Anda perlu melakukannya dalam susunan yang betul.
Yeah.
Tak apa.
Jadi sekarang kita mempunyai dua cawan minyak.
OKAY.
Tak apa.
Tetapi secara kimia jika ini bekerja daripada Saya--
>> LAUREN: Ini adalah air.
>> DAVID J. MALAN: Itu kebanyakannya air.
Baiklah.
Tetapi itu masih cawan yang sama seperti sebelum ini.
Jadi tuangkan kitab itu cuba di sana.
OKAY.
Ini adalah penggunaan yang baik masa kelas hari ini.
OKAY.
Jadi sekarang we-- bagus.
Lebih kurang.
Baiklah.
Jadi sangat baik.
Terima kasih kepada Lauren.
Sangat baik dilakukan.
>> Jadi hanya untuk meniup fikiran anda, dan ini adalah sesuatu yang mungkin
bermain dengan jika anda suka dalam ID CS50, anda boleh, sebenarnya, swap dua pembolehubah
tanpa menggunakan integer sementara.
Dan ini adalah kod C yang sepadan.
Dan jika anda ingat dari lepas Rabu, kami memperkenalkan, jika secara ringkas,
sesetengah pengendali baru dalam C. Dan tidak sesiapa masih ingat apa yang lobak merah sedikit
simbol, bahawa segi tiga kecil simbol dari keyboard mewakili?
Apa bitwise pengendali?
>> PENONTON: Exor.
>> DAVID J. MALAN: Exor.
Eksklusif Or.
Jadi, jika anda mahu, hanya untuk bersenang-senang di rumah, untuk memberikan dan b dua sewenang-wenangnya
nilai-nilai seperti mana-mana eight-- dan saya akan memilih nilai lapan bit.
Jika anda melakukan ini dengan 32 bit, anda akan cepat bosan.
Tetapi hanya memberikan lapan bit nilai yang apa sahaja, satu atau dua,
dan memberi b nilai yang sama.
Dan kemudian menggunakan definisi daripada XOR dari Rabu lepas,
memohon sedikit dengan sedikit, setiap satu mereka lapan bit dalam setiap a dan b,
dan kemudian melakukannya betul-betul setiap kod ini.
Dan ia bukan salah apa anda lihat di sini pada skrin.
Ia memang bisul hingga tiga operasi XOR
dan entah bagaimana ajaib dan b akan bertukar tempat
tanpa kehilangan sebarang maklumat.
>> Jadi minyak dan air helah adalah paling dekat penjelmaan dunia sebenar
Saya boleh berfikir untuk meniru itu.
Tetapi ia pasti lebih mudah untuk menggunakan pembolehubah sementara,
seperti dalam kes ini di sini.
Dan ini juga adalah peluang yang berkata, terlalu, ini jenis pengoptimuman Mikro
sebagai seorang saintis komputer akan berkata, manakala jenis yang menyeronokkan
bercakap gah tentang bagaimana anda melakukan ini tanpa seperti bertukar-tukar antara pembolehubah tambahan,
bukan semua yang menarik.
Kerana untuk menyelamatkan 32 bit, kerana dalam hal int sebenar,
tidak semua yang menarik pada sistem di mana
anda mungkin menggunakan berpuluh-puluh megabait atau lebih memori seperti hari ini.
Dan sebenarnya, apabila kita kepada satu set masalah kemudian
dan anda melaksanakan ejaan penyemak dan anda akan
dicabar untuk berbuat demikian dengan RAM ini sebagai sedikit dan sedikit
masa yang mungkin di computer-- anda masih
mempunyai seminggu untuk melaksanakan kitab itu anda akan ada-- anda berada
dicabar untuk mengurangkan sumber-sumber.
Dan itu benar-benar satu-satunya peristiwa Seperti semester ini
di mana anda akan digalakkan untuk mencukur off walaupun prestasi terbaik
kos sebaliknya.
>> Jadi what-- bagaimana boleh kita melihat ini kod sebenar?
Biar saya pergi ke hadapan sekarang dan membuka contoh
yang sengaja dipanggil Tiada Swap kerana ia tidak
sebenarnya menukar pembolehubah kerana anda sebenarnya jangkakan.
Jadi mari kita lihat.
Berikut adalah program yang tidak mempunyai CS50 perpustakaan berlaku, hanya standard I / O.
Sekarang kita mempunyai prototaip untuk swap sehingga atas yang hanya
bermakna ia mendapat ditakrifkan kemudian.
Dan di sini adalah utama.
>> Saya sewenang-wenangnya diberikan x dan y, masing-masing, satu nilai dan dua
hanya kerana mereka kecil dan mudah untuk berfikir tentang.
Dan kemudian saya hanya mempunyai sekumpulan printfs di mana saya mempunyai cek kewarasan. x ialah 1
dan y adalah 2 adalah mungkin apa yang mereka printfs akan berkata.
Jadi ada sihir setakat ini.
>> Kemudian saya akan menuntut dengan mencetak def, bertukar-tukar dot dot dot.
Saya akan memanggil swap fungsi, lulus dalam x dan y.
Dan mari kita andaikan buat masa ini memandangkan swap dilaksanakan tepat
kerana ia adalah masa yang lalu dengan pembolehubah sementara.
Oleh itu, saya menuntut dengan berani, bertukar.
x kini ini dan y kini itu.
Tetapi fail, sudah tentu, dipanggil Tiada Tukar.
Jadi mari kita benar-benar melihat apa yang berlaku.
Jika saya menyusun tiada pertukaran dan kemudian melakukan ./noswap, x adalah 1, y ialah 2.
Bertukar-tukar bertukar.
x 1, y ialah 2.
Oleh itu, ia benar-benar seolah-olah boleh dipercayai sama sekali walaupun walaupun swap-- mari kita tatal ke bawah sekarang--
dilaksanakan tepat mengikut kod saya mencadangkan sebentar tadi.
Oleh itu, kita tidak akan mendapatkan mewah dengan barangan XOR buat masa ini.
Ini juga harus bekerja hanya seperti dengan susu dan OJ,
tetapi ia tidak seolah-olah bekerja.
>> Jadi mari kita buat ini lagi.
Mungkin saya hanya tidak berjalan dengan betul.
Jadi mari kita berjalan Tiada Swap lagi.
Mungkin Saya-- tidak.
Jadi ia hanya tidak berfungsi.
Jadi mari kita buat cek kewarasan sedikit.
Biar saya pergi ke hadapan di sini dalam Pertukaran dan hanya menambah, tunggu satu minit,
adalah% i / n dan mari kita plug-dalam nilai a.
Kerana saya benar-benar mahu untuk melihat apa yang sedang berlaku.
Dan sesungguhnya, ini adalah teknik debugging
yang anda mungkin menggunakan dalam waktu pejabat atau di rumah sudah,
serupa dengan separuh pertama Dan Video Armendariz dalam PSET3
di mana kami memperkenalkan cetak def sebagai teknik yang disyorkan, sekurang-kurangnya
bagi kes-kes yang mudah.
Biar saya pergi ke hadapan dan menjalankan membuat tiada pertukaran lagi, ./noswap.
>> Menarik.
Jadi notis apa yang seolah-olah benar. x adalah 1, y ialah 2, tetapi adalah 2 apabila b ialah 1.
Jadi kedua-dua entah bagaimana tidak perlu lagi bertukar tetapi x dan y tidak mendapat bertukar.
Jadi untuk mengetahui dengan jelas apa yang berlaku adalah, di sini saya mempunyai x dan y
dan mereka adalah pembolehubah tempatan dalam skop utama, saya lulus dalam x dan y
untuk menukar.
Sekarang, pertukaran, kerana majlis berasingan, bebas untuk memanggil hujah
atau apa-apa parameter ia mahu.
Foo atau bar atau x atau y atau atau b.
Hanya untuk membuat jelas bahawa mereka tidak serupa dengan x dan y semata-mata,
Saya katakan a dan b.
Tetapi kita boleh memanggil mereka apa-apa yang kita mahu.
>> Dan supaya ia kelihatan seperti swap diluluskan
x-- AKA a-- dan ia diluluskan y-- AKA b.
Entah bagaimana ketiga-tiga garisan bertukar-tukar nilai-nilai tepat
sebagai Lauren lakukan dengan susu dan OJ.
Tetapi apabila kita mencetak nilai-nilai, a dan b
memang swap tetapi x dan y tidak mempunyai perubahan kepada mereka.
Ingat bahawa x dan y adalah di sini.
>> Oleh itu, kita boleh melihat ini melalui teknik lain juga.
Dan ini juga adalah teknik yang tertanam dalam masalah menetapkan tiga.
Mari kita pergi ke hadapan dan melakukan ini dalam CS50 ID jika anda tidak sudah.
Pada sebelah kita tangan kanan mempunyai tab Debugger ini.
Dan jika anda membuka ini, ada beberapa maklumat yang sukar difahami
yang yang dilemparkan pada anda pada mulanya.
Tetapi mari kita mengusik ini selain sebenar cepat.
>> Jadi salah, anda lihat pembolehubah tempatan.
Ternyata membina ke CS50 IDE, dan banyak persekitaran pengaturcaraan yang lebih
secara amnya, adalah penyahpepijat.
Satu alat yang membolehkan anda untuk melihat secara visual apa yang berlaku di dalam program anda
tanpa perlu mengambil jalan keluar dengan menambah printfs dan menyusun dan menjalankan
dan menambah printf dan menyusun dan berjalan, yang sudah, pada waktu pejabat
atau rumah, mungkin mendapat cukup membosankan.
>> Jadi di sini, dalam hanya seketika, kami akan melihat dalam masa sebenar
nilai-nilai pembolehubah tempatan.
Kami juga akan dapat menetapkan apa yang dipanggil titik putus yang
peluang dalam program saya untuk berhenti seketika pelaksanaan pada garis tertentu kod
bahawa saya ingin tahu tentang.
Betul?
Program-program ini dijalankan dalam masa beberapa saat.
Ia adalah jenis yang bagus untuk kita manusia yang lebih perlahan dapat berhenti seketika, mengambil masa, lihat
apa yang berlaku di sekeliling garis tertentu kod
tanpa membajak program melaluinya dan kemasan sepenuhnya.
Jadi titik putus akan membolehkan kita untuk memecahkan dan berhenti seketika pada titik tertentu.
>> Timbunan panggilan adalah cara yang mewah mengatakan apa fungsi kini
dipanggil pada masa ini.
Utama sentiasa dipanggil pertama.
Tetapi jika Utama panggilan fungsi dipanggil Swap,
sedang kita benar-benar akan melihat ini menara fungsi yang telah
dipanggil dalam susunan kronologi terbalik.
Jadi mari kita lihat itu.
>> Saya akan zum keluar.
Saya akan kembali ke kod saya.
Dan hanya kerana saya mahu menjadi bengah sini,
Saya akan pergi ke depan dan klik hanya di sebelah kiri garis lima.
Dan yang mencipta titik merah.
Dan perhatikan di sebelah kanan yang penyahpepijat tahu, hey,
Saya hanya berkata, titik putus di noswap.c garis lima, khususnya
di baris ini kod.
Jadi penyahpepijat tahu saya yang telah meminta agar masa yang akan datang
Saya menjalankan program saya ia jeda pelaksanaan di sana bukan hanya
menjalankan segala-galanya super cepat.
>> Jadi sekarang saya akan klik Debug yang butang di bahagian paling atas IDE
dan yang akan melakukan yang berikut.
Ia akan membuka pada mulanya agak menakutkan terminal kedua window--
debugging jauh dari menjadi tuan rumah dan such--
dan kami akan kembali kepada apa yang semua yang bermakna tidak lama lagi.
Tetapi apa yang penting buat masa ini ialah bahawa titik merah telah melanda,
penyahpepijat mempunyai sengaja berhenti execution--
tidak pada garis per se tetapi pada hari pertama baris kod yang sebenar dalam fungsi itu.
Dan itulah sebabnya garis tujuh adalah sekarang berwarna kuning.
>> Dan sekarang mari kita lihat di sebelah kanan.
Ia kelihatan seperti, secara lalai, baik cukup, x mempunyai apa nilai?
0.
Dan y mempunyai apa nilai?
Zero.
Dan itulah yang diharapkan dalam erti kata yang x dan y-- bahawa garis ini-- kuning mempunyai
tidak dilaksanakan lagi.
Jadi x tidak perlu mempunyai nilai 1.
Ia mungkin mempunyai apa-apa nilai lain, nilai sampah kononnya.
Dan kami mendapat bernasib baik kerana ia sifar pada ketika ini, pada asasnya.
>> Jadi sekarang hanya ada beberapa tempat butang kita perlu mengambil berat
kira-kira apabila debugging dengan cara ini.
Perhatikan di sini, kami mempunyai butang Main.
Dan jika kita bermain atau memukul menyambung semula, itu hanya
akan berjalan melalui sepanjang program ini
atau sehingga ia mencecah titik putus lain.
Tetapi saya tidak menetapkan apa-apa yang lain titik putus supaya ia hanya
akan berjalan di penghujungnya.
Itu jenis kekalahan yang tujuan poking sekitar.
>> Jadi, saya mengambil berat tentang ikon ini ke kanan.
Dan jika saya pergi ke atas mereka, kerana anda harus juga,
anda akan melihat sedikit tips alat tips--.
Yang ini adalah melangkah.
Sekarang tidak bermakna skip baris kod berikut.
Yang hanya bermakna melaksanakannya dan bergerak ke depan, bergerak ke depan,
bergerak ke depan.
Dengan kata lain, melalui butang itu, boleh saya berjalan
melalui saya kod satu langkah pada satu masa.
Baris demi baris, secara literal.
Sekarang, di sebelah kanan itu, ada satu lagi
yang kita akan lihat dalam hanya seketika.
Ini adalah apa yang dikenali sebagai Langkah Ke icon itulah
akan membenarkan saya menyelam ke fungsi yang lain.
Tetapi mari kita lihat ini hanya seketika.
Jadi, saya akan klik melangkah.
Dan kini melihat, seperti yang saya klik butang ini di sebelah kanan atas,
menjaga mata anda secara kasar di bawah Tempatan Pembolehubah dan lihat apa yang berlaku ke x.
x kini 1 kerana garisan kuning kini telah dilaksanakan
dan kami telah berpindah ke garisan 8.
Dan hanya dalam masa y diharapkan dapat menjadi 2.
>> Sekarang, apa-apa yang menarik berlaku untuk sedikit.
Semua ini adalah adalah printf.
Dan perhatikan, di terminal menengah saya tingkap, saya melihat output cetakan def.
Dan sekarang saya perlu membuat keputusan sebagai pengaturcara.
Saya boleh melangkah lebih garisan ini kod, melaksanakannya tetapi tidak
semakin tertanya-tanya tentang apa yang di dalam.
Atau saya benar-benar boleh melangkah ke dalamnya dan pergi di dalam Pertukaran sendiri.
Jadi mari kita buat yang kedua.
>> Biar saya pergi ke hadapan dan klik tidak Datang tetapi Step Into.
Notis, tiba-tiba perubahan tetingkap
untuk menyerlahkan pertama baris kod dalam Tukar.
Itulah line 21.
Dan sekarang, apa yang jenis funky ialah, jika anda melihat penggunaan di sini, seperti yang dijangkakan,
koma b adalah 1 dan 2 masing-masing.
Mengapa temp 32767?
Mengimbas kembali temp bahawa, sama seperti cawan kosong masa yang lalu,
diisytiharkan di sini pada baris 21.
Mengapa 32,000- Maksud saya, mengapa ia hanya beberapa nilai pelik?
Ya?
>> PENONTON: Ia tidak dimulakan.
>> DAVID J. MALAN: Ia belum dimulakan.
Jadi komputer kita sentiasa mempunyai memori fizikal.
Ia sentiasa mempunyai RAM fizikal.
Dan selalu ada sifar ini dan satu di sana, bukan?
Kerana kita menggunakan kami komputer sepanjang hari,
anda menggunakan IDE CS50 atau pelayan sepanjang hari.
Jadi RAM yang sama ada mempunyai beberapa sifar atau kira-kira satu atau beberapa sifar dan satu.
Tidak kira sama ada atau tidak anda menggunakan mereka.
Anda tidak boleh hanya mempunyai kosong ruang di mana anda mahu bit.
Mereka sama ada sifar dan satu.
>> Jadi ternyata temp itu, kerana kami telah tidak dimulakan lagi,
kita mempunyai orang-orang 32 bit tetapi mereka tidak ada telah dimulakan dengan mana-mana nilai yang diketahui.
Jadi apa sahaja yang mereka adalah yang paling baru-baru ini digunakan bagi- mereka 32 bits--
kami hanya melihat artifak beberapa penggunaan yang dilakukan dahulu dari orang-orang tertentu 32
bit.
Sebaik sahaja saya klik Datang walaupun, phew, temp akan mendapat nilai 1.
Dan jika saya melakukannya sekali lagi, adalah akan diberi nilai 2
dan kemudian b akan diberi nilai 1.
>> Dan supaya apa yang baik sekarang di ketika ini dalam cerita
adalah bahawa penyahpepijat adalah menunjukkan saya, super perlahan-lahan
mengikut rentak saya sendiri, apa yang keadaan Pertukaran adalah.
Tetapi notis di atas di sini, notis bahawa timbunan panggilan sebenarnya
mempunyai dua lapisan kepadanya.
Sekarang salah satu yang yang ditonjolkan sebagai Swap, sekiranya saya klik Main sebaliknya,
melihat bagaimana pembolehubah tempatan menukar kerana pemaju hanya boleh melompat
sekitar dan pergi ke mana-mana skop yang berbeza.
Jadi, walaupun kita melakukan semua ini bekerja dan betul bertukar-tukar a dan b,
jika saya pergi berulang-alik antara Pertukaran di mana adalah 2 dan b adalah 1 dan Utama,
telah Main terjejas sama sekali?
No.
Jadi apa yang bisa dibesarkan di sini?
Nah, ternyata bahawa bila-bila masa anda memanggil fungsi seperti Swap,
dan anda lulus hujah-hujah itu, apa anda lulus ke fungsi Swap
dalam kes ini adalah salinan mereka hujah.
Jadi, jika x dan y adalah masing-masing 32 bit, apa Pertukaran semakin
adalah tempatan dua baru pembolehubah, atau hujah,
dipanggil dan b-- tetapi mereka adalah sewenang-wenangnya names-- tetapi corak sifar
dan orang-orang yang di dalam a dan b adalah berbaris untuk menjadi sama dengan x dan y
tetapi mereka tidak adalah Perkara yang sama dengan x dan y.
>> Ia seolah-olah Main mempunyai pada bahagian iaitu kertas nombor 1 dan 2 untuk x dan y,
dan kemudian apabila ia tangan yang sekeping kertas untuk swap,
Pertukaran dengan cepat mendapat pen sendiri, menulis ke bawah
1 dan 2 di dalam lembaran sendiri kertas, tangan menyokong xy asal dengan Main
dan kemudian melakukan sendiri perkara dengan a dan b.
Dan ini kini super penting kerana ini mempunyai implikasi nontrivial
untuk benar-benar menulis kod yang betul kerana ia seolah-olah kita tidak boleh menukar
dua pembolehubah.
>> Saya telah menulis fungsi Pertukaran yang betul.
Kami telah melaksanakan dengan Lauren sebagai fungsi swap yang betul dalam realiti,
tetapi nampaknya tidak ada yang perkara-perkara yang jika anda tidak boleh benar-benar
swap dua nilai-nilai kekal.
Oleh itu, kita perlu cara lain untuk benar-benar mendapatkan pada ini,
dan kita perlu dapat sebenarnya menyelesaikan masalah ini.
Dan ternyata out-- dan kami akan datang kembali ke gambar ini tertentu
sebelum long-- ini adalah salah satu cara yang anda mungkin menarik memori komputer anda.
Ia hanya segi empat tepat.
Anda boleh menarik apa-apa beberapa cara tetapi ia
sesuai untuk menarik sebagai segi empat tepat atas sebab berikut.
>> Kami akan bermula hari ini dan seterusnya bercakap tentang timbunan kononnya.
Dan timbunan hanya sebahagian yang daripada RAM-- sebahagian daripada memory--
yang berfungsi mempunyai akses apabila mereka dipanggil.
Dan maka ia ternyata bahawa di bahagian paling bawah timbunan ini
adalah di mana semua pembolehubah tempatan utama yang dan org C dan org V dan semua barangan itu
akan pergi secara lalai. Dan jika Utama panggilan beberapa fungsi lain seperti Swap,
baik, Pertukaran akan mendapat satu lagi lapisan memori sehingga di atasnya.
>> Dan sebagainya hanya untuk memberikan anda sepintas cepat gambar ini, jika Aku pergi ke sini--
dan biarlah saya mencerminkan ini ke atas overhed sebagai well-- apa yang sebenarnya saya ada,
jika kita hanya mengambil berat tentang bawah gambar ini buat masa ini,
ialah apabila saya menjalankan program dan Main mendapat dipanggil,
Utama diberikan sebahagian daripada RAM dalam komputer saya yang
di bahagian bawah apa yang dipanggil timbunan.
Dan saya akan menarik ia sengaja sebagai segiempat.
Jadi ia seperti 32 bit atau empat bait.
Dan jika ini fungsi utama mempunyai pembolehubah dipanggil x dengan nilai 1
dan ia mempunyai pembolehubah yang dipanggil y dengan nilai 2, itu
seperti mengambil sekerat ini memori yang Utama telah diberikan oleh operasi
sistem dan membahagikan ia sehingga supaya pembolehubah tempatan pertama pergi sini,
yang kedua pergi di sini, dan itu sahaja.
>> Apabila Main panggilan Swap, Pertukaran mendapat sepotong sendiri memori
bahawa kita akan menarik seperti ini dari sistem operasi,
dan ia akan mempunyai yang pembolehubah tempatan sendiri berdasarkan
pelaksanaan awal kami dengan pembolehubah tempatan yang
dan b yang pada mulanya mendapatkan nilai 1 dan 2.
Tetapi, sebaik sahaja kod Swap melaksanakan,
dan Lauren sebenarnya swap yang OJ dan susu, apa yang berlaku?
Nah, ini 2 menjadi 1, ini 1 menjadi 2, dan, dengan cara itu,
terdapat pembolehubah temp yang yang yang digunakan masa keseluruhan yang akhirnya
hilang.
Tetapi ia tidak penting berapa banyak kerja yang anda lakukan
di baris ini daripada- dalam ruang memori ini, x dan y adalah sama sekali tidak disentuh.
>> Oleh itu, kita memerlukan beberapa cara untuk memberi Pertukaran dan fungsi seperti itu
akses rahsia, jika anda akan, untuk fungsi like-- ke memori seperti x dan y.
Oleh itu, mari kita lihat pada satu contoh yang membantu
kita melihat dengan jelas apa yang telah berlaku masa ini keseluruhan.
Saya akan pergi ke hadapan dan membuka Bandingkan Zero.
Dan saya akan menutup penyahpepijat kami, saya akan
untuk menutup pesanan ini menakutkan hanya kata, tunggu satu minit,
anda berada dalam debugging tengah.
Saya akan menyembunyikan tab ini di sini hanya untuk kembali kepada kesederhanaan.
Jadi jangan bimbang jika GDB dibunuh.
Yang hanya bermakna bahawa program ini mempunyai telah berhenti, sengaja dalam kes ini,
oleh saya.
>> Dan kini Bandingkan Zero melakukan ini.
Saya menggunakan CS50 perpustakaan dalam standard I / O.
Saya telah mendapat satu fungsi utama yang pertama berkata, berkata sesuatu, dan mendapat rentetan.
Kemudian berkata lagi dan mendapat tali lain.
Dan perhatikan bahawa kedua-dua tali dipanggil s dan t, masing-masing.
Dan kini program ini, Bandingkan Zero, tujuannya dalam kehidupan,
ia sepatutnya beritahu saya, adakah saya menaip perkara yang sama?
Dan jadi saya akan kembali ke minggu satu.
Saya menggunakan operator sama sama saya yang merupakan pengendali kualiti.
Bukan pengendali tugasan, pengendali kesaksamaan.
Saya hanya membandingkan s dan t.
>> Jadi mari kita benar-benar pergi ke depan dan melakukan ini.
Dan saya akan pergi ke hadapan dan membuat Bandingkan Zero.
Saya akan melakukan ./comparezero.
Dan saya akan pergi ke hadapan dan berkata sesuatu
seperti, mari kita buat ibu dalam huruf kecil dan bagaimana pula ibu dalam huruf besar.
Dan sudah tentu saya menaip perkara yang berbeza.
Baiklah.
Itulah yang diharapkan.
>> Mari kita berjalan lagi.
Kedua-dua kali melakukan huruf kecil, huruf kecil.
Yang kelihatan super sama dengan saya.
Enter.
OKAY.
Mungkin ia hanya pelik kerana ia tidak suka tatabahasa saya.
Jadi mari kita buat MOM modal, modal MOM, serupa.
Perkara yang berbeza.
>> Jadi mengapa itu?
Nah, apa yang sebenarnya berlaku di bawah hood di sini?
Oleh itu, marilah kita kembali ke atas di sini hanya untuk seketika
dan mempertimbangkan apa GetString sebenarnya lakukan.
Apabila anda memanggil GetString, itu adalah satu fungsi kita
diri kita menulis dan entah bagaimana mendapat jujukan aksara daripada pengguna.
Dan mari kita andaikan bahawa yang pertama kali saya menghubungi GetString, yang memberikan saya
sebahagian memori yang kelihatan seperti ini.
Dan jika saya ditaip dalam semua huruf kecil m-o-m-- dan apa yang berlaku selepas itu?
Hanya cek kewarasan cepat.
>> Sifar Backslash.
Kita tahu bahawa.
Dan ingat bahawa kami bermain main dengan nama Zamila ini
dan mempunyai banyak nama-nama lain apabila Rob telah mencari di sini
apa yang berlaku di dalam ingatan.
Jadi cerita yang betul-betul sama.
Inilah yang GetString akan kembali kepada saya.
Sekarang, kod saya sebentar tadi disimpan nilai pulangan GetString
dalam pembolehubah dipanggil s.
Dan kemudian kali kedua saya memanggilnya, ia disimpan dalam pembolehubah dipanggil t.
>> Jadi jika Aku pergi ke sini, saya perlu untuk menarik variable-- tempatan ini
dan saya biasanya akan menarik tali sebagai just-- kita akan
memanggilnya s-- sebagai dataran kecil di sini.
Dan kini, somehow-- bagaimana ibu masuk ke dalam s ini berubah-ubah?
Nah, kita perlu kembali prinsip pertama di sini.
Apa yang GetString sebenarnya kembali?
>> Jadi ternyata bahawa M-O-M garis miring sifar, dan apa-apa bilangan
tali lain dalam memori seperti Zamila dan Rob atau Andy atau mana-mana orang lain,
sudah tentu dalam kita RAM atau memori komputer.
Dan RAM anda mempunyai like-- anda mempunyai gig RAM, dua gig RAM,
atau satu bilion atau dua bilion bait, atau mungkin lebih hari ini.
Jadi mari kita andaikan, untuk tujuan hari ini, bahawa ia tidak kira bagaimana kita nombor
mereka, tetapi kita boleh nombor setiap dari orang-orang bilion atau dua bilion
atau empat bilion bait.
>> Dan mari kita hanya sewenang-wenangnya mengatakan bahawa ini adalah gigitan pertama, gigitan kedua,
ketiga, keempat.
Saya sengaja tidak menggunakan sifar untuk hari ini tetapi kita akan kembali kepada itu.
Jadi dalam erti kata lain, jika ini adalah kali pertama saya menggunakan program ini,
Saya hanya mendapat bernasib baik dan yang pertama santapan adalah di lokasi satu maka dua
kemudian tiga daripada empat.
Dan jika saya terus melukis, nombor peti dua bilion akan menjadi cara di sini.
>> Jadi, apa yang anda berfikir, maka, GetString sebenarnya kembali?
Ia tidak kembali M-O-M backslash sifar per se kerana yang jelas
tidak sesuai di dalam kotak yang saya telah disediakan.
Jadi apa lagi yang mungkin GetString sebenarnya pulang semua minggu ini?
Jawapannya adalah di papan sini suatu tempat.
Anda tidak boleh muat M-O-M backslash sifar, jadi apa yang mungkin masuk akal bukan?
Jika anda terpaksa menjadi super pandai, meletakkan topi kejuruteraan yang dipanggil,
apa yang anda boleh kembali?
Apa yang paling sedikit maklumat anda boleh kembali yang akan masih
membolehkan anda mencari M-O-M dalam ingatan?
Ya?
>> PENONTON: Satu.
>> DAVID J. MALAN: Satu.
Dan mengapa satu?
PENONTON: Kerana ia akan memberitahu anda di mana untuk pergi [didengar].
DAVID J. MALAN: Tepat sekali.
Saya hanya akan kembali alamat tali bahawa saya telah mendapat.
Alamat dalam ini kes adalah lokasi satu.
Jadi apa yang sebenarnya sedang disimpan di dalam s-- dan setiap pembolehubah rentetan itu far--
baru sahaja menjadi alamat tali itu.
>> Sementara itu, jika saya panggil GetString kali kedua dan saya
menaip dalam literal thing-- yang sama M-O-M dengan lowercase-- M-O-M
dan satu lagi garis sendeng terbalik sifar, dan sekarang mungkin program saya
telah berjalan untuk beberapa waktu jadi mungkin ini adalah 10, ini adalah lokasi 11, ini ialah 12,
ini adalah 13.
Komputer menggunakan beberapa lain memori untuk apa-apa sebab.
Apa yang kini berlaku dalam kedua saya berubah-ubah dalam program t saya?
10.
Tepat sekali.
>> Dan apabila kita melihat kod sumber program ini
di mana saya hanya cuba untuk membandingkan dua nilai,
adalah s sama sama dengan t, apa yang jawapan manusia yang jelas?
Hanya ada kerana 1 tidak sama 10.
Dan sebagainya di sini terdapat satu peluang untuk kita benar-benar
hanya kembali ke, sekali lagi, pertama prinsip dan berfikir tentang, baik,
apa yang sedang berlaku di bawah hood?
Kami telah bercakap tentang bit dan bait dan ingatan,
tetapi ia sebenarnya berguna untuk memahami kerana apabila anda memanggil GetString,
walaupun kita memikirkan ia adalah kembali M-O-M atau tali ibu
atau Andy atau Zamila atau sebagainya, dari segi teknikal
ia hanya kembali alamat itu sebahagian memori.
>> Tetapi itu OK.
Kerana bagaimana saya tahu di mana tali berakhir?
Jika saya hanya diberikan mulanya?
Nah, garis sendeng terbalik sifar, bukan?
Hanya dalam masa linear saya boleh mencetak dengan cap def M-O-M.
Dan sebaik sahaja saya melihat garis sendeng terbalik sifar, saya tidak peduli di mana saya bermula,
Saya sudah tahu tersirat di mana saya perlu berakhir.
>> Dan sehingga hari ini menandakan beginning-- dan biar saya ini secara dramatik kerana kami
telah melalui banyak masalah kepada mendapatkan ini melatih wheels-- sini
jadi roda latihan hari ini mula terkeluar dan kami mendedahkan pada least--
>> [Tepuk tangan]
>> Itu adalah baik bernilai perjalanan untuk Sasaran pagi ini, ya?
Jadi sekarang-- ada, ternyata keluar, ada perkara seperti tali.
String tidak wujud.
Ia sinonim bahawa kita telah mempunyai di dalam perpustakaan CS50.
Selepas ini, kita akan mula memanggil s dan t tidak tali tetapi bintang char.
Dan bintang char kita akan mengusik selain tidak lama lagi.
Tetapi ini adalah untuk mengatakan, bahawa walaupun jika kita terus
menggunakan GetString buat masa ini, teknikal yang perlu saya
menjadi berkata bintang char dan char bintang.
>> Dan ternyata apa yang bintang akan menandakan sesuatu
dipanggil penunjuk atau alamat.
Dan sebenarnya, teaser untuk apa yang akan berlaku
adalah ini 20 music kedua dari kami rakan Nick Parlante di Stanford
yang, beberapa waktu lalu, menghabiskan jumlah yang tidak masuk akal masa,
sebaik saya boleh memberitahu di dalam bukunya dapur atau bawah tanah itu,
membuat claymation memperkenalkan kepada dunia
watak yang bernama Binky dengan siapa kita akan
diperkenalkan pada masa akan datang untuk petunjuk.
Jadi di sini adalah preview apa yang akan datang.
>> [VIDEO MAIN SEMULA]
>> Hey, Binky.
Bangun.
Ia adalah masa untuk penunjuk menyeronokkan.
>> -Apa itu?
Ketahui mengenai petunjuk?
Oh, goody.
>> [AKHIR MAIN SEMULA]
DAVID J. MALAN: Dan pada masa yang sama, kita akan melihat anda pada Rabu.
Baiklah.
Siapa menari?
Datang pada.
Siapa menari?
Anda mahu saya untuk mendapatkan ia bermula?
Saya akan mendapatkan ia bermula.
Woooo!
>> LAUREN: mewah Sweet Musa.