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. 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.