DAVID J. Malan: Ini adalah CS50 dan ini adalah awal minggu keempat. Dan, anak laki-laki, adalah Volkswagen di masalah semua karena software. Mari kita lihat. [VIDEO PLAYBACK] -Cars, Karakter cerdas di film Fast and Furious. Minggu mobil Jerman ini Volkswagen menemukan dirinya di tengah-tengah skandal proporsi berpotensi kriminal. -Volkswagen Yang menguatkan untuk miliaran denda, tuntutan pidana mungkin untuk eksekutif, seperti perusahaan meminta maaf untuk mencurangi 11 juta mobil untuk membantu mengalahkan tes emisi. Model diesel -Certain yang dirancang dengan perangkat lunak yang canggih bahwa informasi yang digunakan termasuk posisi kemudi dan kendaraan mempercepat untuk menentukan mobil itu menjalani uji emisi. Dalam situasi itu, mesin akan mengurangi emisi beracun. Tapi mobil itu dicurangi untuk memotong bahwa ketika sedang didorong. Emisi meningkat 10 sampai 40 kali di atas tingkat EPA diterima. [END PLAYBACK] DAVID J. Malan: Jadi mari Lihatlah ini dan melihat persis bagaimana ini mungkin dilaksanakan dan bagaimana hal ini dapat mempengaruhi begitu banyak mobil seperti ini. Jadi di tangan saya di sini adalah pers melepaskan yang dikeluarkan oleh EPA-- Lingkungan Badan Perlindungan yang adalah badan pengawas AS yang menangani masalah lingkungan, dan kemudian aktual pemberitahuan hukum yang kirim ke Volkswagen hanya beberapa hari yang lalu. Jadi EPA menulis, dan mengungkapkan sekarang publik, sebuah perangkat lunak yang canggih algoritma tertentu pada Kendaraan Volkswagen mendeteksi ketika mobil sedang mengalami uji emisi resmi dan ternyata emisi penuh kontrol hanya pada saat tes. Efektivitas kendaraan ini polusi perangkat kontrol emisi adalah sangat dikurangi selama semua mengemudi normal situasi. Hal ini mengakibatkan mobil yang memenuhi standar di laboratorium atau pengujian stasiun, tapi selama operasi normal memancarkan oxides-- nitrogen atau NOx-- sampai dengan 40 kali standar. Perangkat lunak yang diproduksi oleh Volkswagen adalah perangkat kutipan tanda kutip, kekalahan, seperti yang didefinisikan oleh Clean Air Act di Amerika Serikat. Mereka pergi dengan mengatakan bahwa EPA dan lembaga lain menemukan perangkat kekalahan software setelah analisis independen oleh para peneliti di Barat Universitas Virginia. Polusi NOx memberikan kontribusi untuk nitrogen dioksida, tingkat ozon, dan partikel halus. Paparan ini polutan telah dikaitkan dengan berbagai efek kesehatan yang serius, termasuk peningkatan asma serangan dan pernapasan lainnya penyakit yang dapat cukup serius untuk mengirim orang ke rumah sakit. Paparan ozon dan partikel memiliki juga dikaitkan dengan prematur kematian karena pernapasan terkait atau kardiovaskular efek terkait. Anak-anak, orang tua, orang dengan penyakit pernapasan yang sudah ada sebelumnya sangat beresiko untuk efek kesehatan dari polusi. Cukup untuk mengatakan, itu cukup serius. Dan mari kita pergi untuk membaca hanya satu kutipan lebih dan kemudian kita akan melihat pada implikasi yang mendasari ini dalam konteks sebuah mobil. Secara khusus, Volkswagen diproduksi dan diinstal perangkat lunak dalam apa yang disebut kontrol elektronik module-- atau ECM-- dari kendaraan ini yang merasakan ketika kendaraan sedang diuji untuk sesuai dengan standar emisi EPA. Berdasarkan berbagai masukan termasuk Posisi setir, kendaraan kecepatan, durasi mesin operasi, dan tekanan udara, input ini tepatnya dilacak parameter prosedur pengujian federal yang digunakan untuk uji emisi untuk sertifikasi EPA tujuan. Selama uji emisi EPA, software kendaraan ECM berlari software yang diproduksi Hasil emisi compliant. Pada waktu yang lain, yang software kendaraan ECM berlari jalan terpisah kalibrasi yang mengurangi efektivitas sistem kontrol emisi secara keseluruhan, khususnya katalitik selektif pengurangan NOx Bersandar trap-- yang kita akan melihat tentang sebentar. Akibatnya, emisi NOx meningkat dengan faktor 10 sampai 40 kali di atas tingkat compliant EPA tergantung pada jenis siklus drive. Jadi apa ini benar-benar berarti, dan source code untuk perangkat lunak yang berjalan pada Volkswagen belum belum diungkapkan kepada publik, adalah bahwa, secara efektif, ini setara adalah suatu tempat ada di dalam kode Volkswagen. Jika Anda sedang diuji, dan jika mobil mendeteksi faktor lingkungan tertentu seperti roda kemudi posisi atau gerakan atau ketiadaan mobil atau sejumlah faktor lain yang saat ini dihipotesiskan untuk menjadi bagian dari formula ini, mereka hanya menyalakan emisi penuh mengontrol. Dengan kata lain, mereka mulai memancarkan kurang dari polutan. Lain, dalam setiap situasi lain ketika itu tidak terdeteksi sebagai di laboratorium, mereka hanya tidak. Dan sehingga Anda dapat menyederhanakan ini ke lebih pseudocode beton dengan sesuatu seperti ini. Jika roda yang beralih tetapi kemudi tidak, sugestif bahwa mobil itu pada beberapa jenis silinder yang berputar tetapi dalam beberapa jenis gudang sedang diuji, kemudian berperilaku sebagai EPA ingin Anda. Jika tidak tidak. Jadi mari kita lihat di video pendek yang mengambil melihat apa implikasi adalah ini benar-benar mekanis. [VIDEO PLAYBACK] -Terakhir Jumat EPA mengumumkan bahwa beberapa Mobil Volkswagen Audi dibuat antara 2009 dan tahun ini menggunakan yang disebut perangkat kekalahan untuk berkeliling hukum emisi dirancang untuk menjaga udara bersih. Tapi apa artinya tepatnya? Nah, mobil modern memiliki puluhan komputer di dalamnya. Dan beberapa dari mereka komputer membantu mengkoordinasikan fungsi mesin untuk optimal kinerja sambil memastikan bahwa tidak ada terlalu banyak sampah yang keluar dari pipa knalpot. Mereka sudah benar-benar telah bekerja cara ini selama beberapa dekade sekarang. Pada dasarnya, setiap bagian mesin mobil modern memiliki sensor atau kontroler di atasnya, dan komputer ini membaca data ribuan kali per penyesuaian pembuatan kedua seperti rasio bahan bakar udara yang masuk ke silinder. Ini kecurangan Volkswagen dan model Audi yang diesel, dan mesin diesel memiliki satu lagi komputer sangat penting parameter dikendalikan, yang merupakan jumlah bahan bakar yang tidak terbakar akan ke knalpot. Sekarang yang terdengar buruk. Tidak terdengar seperti Anda ingin bahan bakar tidak terbakar masuk ke knalpot. Tapi dalam kasus diesel, Anda memiliki sesuatu disebut perangkap NOx yang merupakan perangkat yang menyerap dan perangkap untuk nitrogen oksida yang polutan yang akan jika tidak pergi ke atmosfer. Dan efek yang perangkap NOx ditingkatkan dengan bahan bakar yang tidak terbakar. Jadi perangkat kekalahan adalah program khusus dalam komputer ini yang dapat membuatnya terlihat seperti mobil memenuhi emisi standar bahkan ketika tidak. Volkswagen memiliki masalah pada tangan. Mesin diesel yang dikenal untuk mendapatkan ekonomi bahan bakar besar, tapi perangkap NOx hanya bekerja dengan baik ketika lebih banyak bahan bakar yang digunakan. Sehingga mobil akan mendeteksi, menggunakan perangkat kekalahan ini, ketika mendapatkan emisi tes, itu akan menggunakan lebih banyak bahan bakar, membuat NOx kerja perangkap baik, emisi akan baik-baik saja. Tapi kemudian Anda mendapatkan di jalan, perangkat mematikan, Anda membakar lebih sedikit bahan bakar tetapi Anda meletakkan sebanyak 40 kali lebih polutan ke atmosfer. Tapi bagaimana sih melakukan mobil tahu bahwa itu sedang diuji untuk kepatuhan emisi? EPA mengatakan itu adalah canggih sistem yang diperiksa hal-hal seperti posisi roda kemudi, kecepatan, berapa lama mesin itu pada, dan bahkan tekanan atmosfer. Dengan kata lain, ada ada cara ini adalah disengaja karena software ini dirancang sangat hati-hati untuk mendeteksi tes emisi resmi. Itu beberapa cukup serius penipuan dan itulah mengapa Volkswagen di masalah serius tersebut. Bahkan, CEO mereka, Martin Winterkorn, hanya mengundurkan diri. Jadi apa yang terjadi selanjutnya? Nah, jika Anda salah satu dari setengah juta jettas diesel, Beatles, Golfs, Passats, atau Audi A3s dilakukan, kabar baik adalah bahwa mobil Anda masih aman untuk berkendara. Anda tidak harus menyimpannya sampai Volkswagen mengeluarkan recall. Tapi di beberapa titik mereka mungkin akan memiliki untuk memperbarui perangkat lunak di dalam mobil Anda. Ketika itu terjadi, Anda mungkin mendapatkan lebih sedikit mil per tangki. Pengacara sudah bersiap untuk gugatan class action sehingga pemilik mungkin mendapatkan kompensasi di beberapa titik di masa depan. Tapi itu tidak akan terjadi dalam waktu dekat. [END PLAYBACK] DAVID J. Malan: Jadi ini benar-benar menimbulkan pertanyaan gambaran yang lebih besar menarik sebagai percaya. Benar? Semua dari kita memiliki iPhone atau Android atau sesuatu di saku kita kemungkinan besar hari ini, atau laptop di lap kami yang menjalankan perangkat lunak yang dibuat oleh Apple dan Microsoft dan tandan perusahaan lain. Tapi bagaimana kita tahu bahwa apa yang produk perangkat lunak ini melakukan sebenarnya apa ini perusahaan mengatakan mereka lakukan? Misalnya, siapa yang mengatakan bahwa setiap kali Anda membuat panggilan telepon pada iPhone Anda atau telepon Android atau sejenisnya, bahwa nomor telepon juga tidak yang diupload ke server beberapa perusahaan karena beberapa program yang sudah tertulis, apakah itu operasi sistem itu sendiri seperti iOS atau Android, atau karena Anda men-download beberapa aplikasi pihak ketiga yang entah bagaimana mendengarkan untuk semua yang Anda mengetikkan atau segala sesuatu yang Anda benar-benar mengatakan. Bagaimana Anda tahu bahwa, ketika kalian menjalankan dentang atau Membuat untuk mengkompilasi Anda software sendiri dalam CS50, bagaimana apakah Anda staf yang CS50 sendiri, dengan cara perpustakaan CS50, belum login setiap string yang Anda pernah mendapatkan atau setiap inci Anda pernah mendapatkan? Nah, Anda pasti bisa melihat pada kode sumber untuk sesuatu seperti perpustakaan CS50, Anda bisa melihat kode sumber untuk sistem operasi Linux berjalan pada CS50 IDE. Tapi presentasi menakjubkan diberikan kembali pada tahun 1984 di penerimaan Turing Award oleh ilmuwan komputer sangat terkenal dikenal as-- bernama Ken Thompson yang menerima Turing Award yang adalah semacam ilmu komputer Hadiah Nobel, jika Anda mau, untuk karyanya pada sistem operasi yang disebut Unix, yang sangat mirip di semangat untuk apa yang kita gunakan yang Linux. Dan pertanyaan ia bertanya dalam bukunya pidato penerimaan, pada dasarnya meletakkan kerangka kerja untuk tahun dan tahun diskusi tentang kepercayaan dan keamanan, adalah ini. Sejauh mana harus satu kepercayaan Pernyataan bahwa program-- sepotong dari software-- bebas dari Trojan horse? Mungkin itu lebih penting untuk mempercayai orang-orang yang menulis perangkat lunak. Dan pada kenyataannya, kita sudah terkait untuk bicara bahwa ia berikan saat menerima penghargaan ini di era 80-an di website CS50 ini bawah halaman Lectures untuk hari ini. Karena apa yang akan Anda lihat adalah bahwa dia benar-benar memberikan contoh yang cukup sederhana tentang bagaimana bahkan kompilator seperti dentang atau apa pun compiler lain telah digunakan di masa lalu, bagaimana jika tertanam dalam kita compiler diri menggunakan sedikit jika Kondisi yang pada dasarnya mengatakan, jika Anda melihat bahwa kode ini menggunakan fungsi GetString atau getInt fungsi, pergi ke depan dan masukkan pintu belakang atau Trojan horse sehingga program yang sekarang memiliki beberapa angka nol dan orang-orang yang melakukan sesuatu yang berbahaya. Penebangan semua Anda keystrokes, meng-upload data yang ke beberapa server, atau benar-benar sesuatu. Dan apa Ken Thompson terus dilakukan di ceramahnya adalah untuk menunjukkan bahwa bahkan jika Anda memiliki akses ke sumber kode kompilator yang jahat mungkin melakukan hal ini, itu tidak masalah karena ada ayam ini dan telur realitas dari banyak masa lalu tahun dimana compiler digunakan untuk mengkompilasi sendiri. Dengan kata lain, jalan kembali ketika seseorang telah telah menulis compiler pertama. Dan setelah itu, setiap saat mereka telah memperbarui compiler dengan mengubah kode sumbernya, menambahkan fitur dan mengkompilasi ulang itu untuk orang-orang seperti kita untuk menggunakan, baik, mereka menggunakan tua versi compiler untuk mengkompilasi baru versi compiler. Dan jika anda melihat di pembicaraan yang ia berikan, Anda akan melihat bahwa karena dari bundar itu, Anda benar-benar dapat memiliki bug atau Trojan kuda tertanam dalam perangkat lunak kita sedang menggunakan. Dan bahkan jika Anda melihat kode sumber untuk program-program, bahkan tidak mungkin jelas karena tipu sebenarnya dalam beberapa versi lama dari compiler bahwa sejak telah menyuntikkan ancaman ke dalam perangkat lunak kami. Yang hanya untuk mengatakan, kami benar-benar tidak bisa dan tidak boleh software kepercayaan yang berjalan pada laptop kita atau telepon atau sejumlah tempat. Dan pada kenyataannya, kemudian di semester ini ketika kita mulai berbicara tentang pemrograman web dan benar-benar mulai membangun aplikasi web diri kita sendiri, kita akan bicara tentang ini ancaman dan lain-lain. Sekarang, Anda mungkin bertanya-tanya dan melihat bahwa ada Darth kecil kecil Vader dalam klip yang The Verge menunjukkan ada tentang Volkswagen. Jika Anda belum pernah melihat, saya pikir kita harus meringankan mood karena ini adalah semua sangat menyedihkan dan menakutkan. Aku akan melihat kembali di Super Bowl 2011 ketika komersial Volkswagen-- dan ini hampir membuat mereka menyenangkan again-- ditayangkan untuk pertama kalinya di TV. Ini adalah 60 klip kedua yang saya pikir Anda akan menikmati. [VIDEO PLAYBACK] [MUSIK - TEMA DARI "STAR WARS"] [ANJING kulit yang] [CAR MULAI] [END PLAYBACK] DAVID J. Malan: Ya. Aku hanya memeriksa. Mobil yang ada di daftar pelanggaran. Baiklah. Jadi kita melihat beberapa pseudocode beberapa saat yang lalu. Dan ini lebih besar potongan kode pseudocode bahwa kita telah melihat beberapa kali sejauh ini. Dan mari kita gunakan ini adalah kesempatan sekarang untuk memperkenalkan pemrograman baru teknik yang kita lakukan melihat algorithmically minggu lalu ketika kami melihat merge sort. Tapi mari kita memformalkan dan melihat bagaimana kita mungkin menggunakannya dalam kode aktual, dan kemudian kita akan menggunakan ini teknik jalan yang paling kemungkinan untuk memecahkan masalah tertentu lainnya. Jadi ini adalah salah satu program pertama kami pernah menulis, meskipun dalam kode pseudo. Dan apa program ini memungkinkan kami untuk melakukan kursus adalah untuk menemukan Mike Smith dalam buku telepon. Dan melihat di baris tertentu delapan dan 11 yang memiliki pernyataan Go To ini. Dan pada kenyataannya, beberapa bahasa, C di antara mereka, benar-benar melakukan memiliki Pernyataan yang secara harfiah pergi ke yang memungkinkan Anda untuk melompat ke baris tertentu. Ini umumnya disukai karena dapat sangat mudah disalahgunakan dan Anda dapat mulai melompat Anda Program seluruh tempat sebagai lawan untuk menggunakan jenis logika dan aliran kontrol bahwa kami telah digunakan sejauh ini dengan hanya loop dan kondisi dan sejenisnya. Tapi kita dapat menyederhanakan algoritma ini dalam kode pseudo sebagai berikut. Alih-alih ini berulang atau pendekatan perulangan di mana kita terus kembali dan kembali dan kembali ke garis tiga, kenapa tidak kita hanya jenis menyepak bola dan lebih umumnya mengatakan sejalan tujuh dan 10, hanya mengganti dua pasang garis dengan, lain jika Smith adalah awal dalam buku kita akan mencari Mike di kiri setengah dari buku ini. Lain jika Smith adalah kemudian di buku, mencari Mike di kanan setengah buku. Dan melihat sudah bundar tersebut. Benar? Aku mencari Mike di buku telepon dan kemudian Saya akhirnya memukul mungkin baris tujuh atau mungkin garis 10 dan instruksi saya kepada diri sendiri adalah pencarian untuk Mike di setengah dari buku telepon. Nah, bagaimana cara mencari Mike? Aku di tengah-tengah mencari Mike, mengapa kau semacam mengirimkan saya dalam lingkaran? Tapi itu OK karena apa terjadi dengan ukuran masalah, seperti yang ditulis dalam baris 7 dan 10? Kami tidak hanya mengatakan pencarian untuk Mike, mencari Mike. Kami secara khusus mengatakan apa? Mencari dia di kiri setengah dari kanan setengah yang efektif setengah ukuran dari masalah. Jadi itu OK bahwa kita jenis terlibat dalam bundar ini, argumen ini melingkar, karena setidaknya kami membuat masalah yang lebih kecil dan lebih kecil. Dan akhirnya kita akan mencapai bahwa kasus yang disebut basis mana kita hanya memiliki satu halaman left-- sebagai relawan kami minggu lalu did-- kami memiliki satu halaman kiri dan kemudian kita tidak harus terus mencari Mike Smith karena dia baik pada halaman yang atau dia tidak. Jadi bagaimana kita bisa menerapkan ide ini, ini semacam bundar dalam kode yang sebenarnya? Nah, kita dapat memanfaatkan teknik yang umumnya dikenal sebagai rekursi. Dan kita telah melihat ini di pseudocode untuk merge sort pekan lalu. Ingat bahwa ini adalah pseudocode untuk merge sort. Ini bisa dibilang lebih sederhana daripada gelembung atau seleksi atau insertion sort hanya dalam hal kesederhanaan dengan mana Anda dapat mengungkapkannya. Tapi itu karena kami semacam sirkuler mengatakan, mencari sesuatu dengan mencari lagi. Tapi kami mencari baik di kiri setengah atau setengah benar dan kemudian akhirnya kami penggabungan dalam kasus ini. Tapi di sini, juga, dengan dua baris semacam, Apakah kita lagi memiliki ini Ide rekursi. Dan konkret apa artinya ini, dalam konteks algoritma, adalah bahwa algoritma adalah rekursif jika menggunakan atau menyebut dirinya. Atau dalam hal C, fungsi adalah recursive-- fungsi yang disebut foo adalah rekursif jika foo, di suatu tempat di kode sumbernya, memanggil fungsi foo itu sendiri. Dan itu buruk jika semua foo pernah melakukan adalah menyebut dirinya lagi dan lagi. Ini OK jika foo akhirnya berhenti, seperti halnya menggabungkan semacam, dengan mengatakan, tunggu sebentar, jika masalah ini super kecil, misalnya, atau kutemui Aku mencari, hanya kembali. Jangan rekursif, tidak siklis menyebut diriku lagi. Dan jadi mari kita lihat bagaimana ini mungkin benar-benar bekerja. Jadi aku akan pergi ke depan dan terbuka dua contoh kode sumber di sini. Salah satu yang disebut sigma 0. Dan ini sama sekali tidak rekursif, tapi mari kita a melihat apa program ini tidak. Aku sudah dilucuti semua komentar dari itu tetapi semua dari kode sumber pada CS50 ini website memiliki komentar jika Anda ingin membacanya lagi nanti. Dan mari kita lakukan beberapa kewarasan cek di sini. Jadi di bagian atas kode ini, kita harus menyertakan CS50.h. Apa ini lakukan? Mengapa di sini? Dalam istilah awam yang wajar. Apa fungsinya? Ya. AUDIENCE: Sehingga fungsi getInt bekerja. DAVID J. Malan: Jadi yang fungsi getInt bekerja. Karena dalam hal ini File, CS50.h, yang kita akan melihat sebelum lama di hal kode sumbernya, memiliki banyak fungsi declared-- getInt, GetString, dan sekelompok others-- dan kecuali kami benar-benar memiliki yang Sertakan line, Klang compiler tidak akan tahu bahwa itu ada. Dan sama berlaku untuk garis dua di mana int didefinisikan printf, yang merupakan fungsi kita tetap menggunakan sedikit. Sekarang, garis empat tampaknya sedikit funky karena itu hanya satu kapal. Itu punya titik koma, tidak ada keriting kawat gigi, ada kode di dalamnya. Tapi apa yang kita sebut hal ini di minggu terakhir? Ya. Jadi prototipe. Dan mengapa kita memiliki prototipe yang tampaknya menjadi berlebihan sedikit biasanya karena kita biasanya melihat fungsi lagi kemudian dalam file, kan? Jadi mengapa kita have-- Anda hanya garuk-garuk kepala tapi aku akan mengambilnya. Ya. AUDIENCE: [tidak terdengar] fungsi setelah utama. DAVID J. Malan: Tepat. Sehingga compiler tahu Anda akhirnya akan menentukan atau menerapkan bahwa fungsi utama setelah, mungkin. Jadi dentang dan paling compiler adalah jenis bodoh dan mereka hanya akan tahu apa yang Anda katakan pada mereka. Dan jika Anda ingin menggunakan fungsi yang disebut sigma, Anda lebih baik mengajar compiler bahwa itu ada di muka. Sekarang, itu sendiri utama, bahkan meskipun itu sekelompok baris, cukup familiar mudah-mudahan sekarang. Itu punya do while tujuan yang dalam hidup di sini tampaknya adalah untuk mendapatkan bilangan bulat positif dari pengguna. Dan terus mengganggu dia atau sampai mereka bekerja sama. Kemudian pada baris 16 Saya memiliki panggilan yang menarik. IntAnswer. Yang di sisi kiri sisi memberikan saya sebuah Int yang dapat store-- disebut Answer-- yang akan menyimpan, tampaknya, nilai kembali dari sigma. Jadi sigma hanya sebuah sewenang-wenang tapi bermakna nama yang saya berikan ke fungsi tujuan yang dalam hidup adalah untuk mengambil satu argument-- kita akan menyebutnya N di case-- ini dan hanya untuk mengambil jumlah nomor yang ditambah setiap angka positif itu lebih kecil dari itu. Jadi jika saya lulus dalam jumlah 2 sampai sigma, saya ingin menambahkan 2 ditambah 1 ditambah 0-- tidak 0-- sehingga memberi saya 3. Jika saya lulus dalam 3 sampai sigma, saya ingin memiliki 3 ditambah 2 ditambah 1, yang memberi saya 6. Dan seterusnya. Jadi itu hanya menambahkan sampai semua nomor kurang dari atau sama dengan itu. Sekarang, di sini aku hanya akan untuk mencetak jawabannya. Jadi sebagai kewarasan cek cepat, mari kita membuat sigma 0-- dot slash sigma 0-- dan biarkan aku ketik 2. Dan saya memang mendapatkan 3. Biarkan saya ketik 3. Saya memang mendapatkan 6. Dan jika ada yang bisa melakukan matematika cepat, jika saya melakukan 50 apa yang akan saya dapatkan? AUDIENCE: [tidak terdengar]. DAVID J. Malan: Yah, tidak ada. Tapi 1275 yang cukup dekat. Jadi ini adalah hasil dari melakukan 50 ditambah 49 ditambah 48 ditambah 47 ditambah 46 semua jalan ke 1. Jadi itu semua sigma tidak. Tapi mari kita lihat bagaimana kita sudah dilaksanakan sekarang. Jadi di sini adalah fungsi itu sendiri. Dan ini tampaknya tidak memiliki hubungannya dengan rekursi belum. Bahkan, kita menggunakan Teknik sekolah tua. Aku menginisialisasi variabel yang disebut sum nol, maka saya memiliki foreloop di sini, dan aku mendeklarasikan Int disebut Aku, pengaturan itu sama dengan 1-- meskipun aku bisa mengaturnya sama dengan nol, tapi karena aku melakukan itu, siapa yang peduli jika itu nol atau satu. Ini akan tidak berpengaruh. Jadi aku iterasi selama aku adalah kurang dari atau sama dengan m, yang adalah argumen yang disahkan di. Dan kemudian saya hanya terus incrementing I. Dan wawasan loop semua yang saya lakukan adalah melakukan penjumlahan ditambah sama I. Dan itu disengaja. Saya tidak ingin lakukan, dalam hal ini kasus, seperti sum plus plus. Saya ingin benar-benar menambahkan nilai saat ini dari saya yang terus semakin besar dan besar dan lebih besar untuk penghitungan berjalan. Dan kemudian saya kembali sum. Dan jawabannya mendapat nilai sum. Dan kemudian saya mencetaknya. Jadi ada kesempatan di sini, meskipun, untuk jenis menyederhanakan kode ini secara konseptual dan jenis pukulan satu ini keberatan dalam hal kesederhanaan meskipun perlu waktu untuk menyortir dari menghargai mengapa ini adalah kuat dalam contoh-contoh kecil. Berikut adalah sigma satu-- sehingga Versi kedua dari kode ini. Semuanya atas identik sehingga bahwa cerita yang sama berlaku seperti sebelumnya. Tapi sekarang mari kita melihat pelaksanaan sigma yang Saya sudah dipangkas menjadi hanya ini lines-- empat baris kode, benar-benar, ditambah beberapa kurung kurawal dan ruang putih. Tapi apa yang saya lakukan? Jika m adalah kurang dari atau sama dengan nol, saya perlu jenis menangani kasus super sederhana. Dan jika Anda tangan saya nol atau apa negatif yang hanya aneh, Aku hanya akan sewenang-wenang tetapi secara konsisten kembali nol. Saya tidak ingin hal ini untuk masuk ke beberapa terbatas aneh lingkaran karena nilai negatif. Jadi aku hanya mengatakan, jika Anda memberi saya nol atau kurang, aku kembali nol. Tapi itu bagus karena itu bahwa halaman dari buku telepon yang tersisa. Aku menggigit masalah yang sangat spesifik dan tidak memanggil sesuatu rekursif. Tapi sejalan 31, apa saya tampaknya akan melakukan? Kurung hanya menjaga hal, mudah-mudahan, sedikit lebih jelas. Tapi semua saya lakukan adalah aku kembali m-- apapun Anda tangan me-- ditambah nilai m-- maaf, ditambah nilai sigma dari m minus 1. Jadi apa artinya ini? Jika Anda memberi saya nomor 3 sebagai masukan, jawabannya saya ingin mendapatkan akhirnya adalah 6 karena 3 ditambah 2 ditambah 1 memberi saya 6. Tapi bagaimana saya berpikir tentang bagaimana kode ini berjalan? Pertama kali saya sebut sigma dan saya lulus dalam nilai 3, itu seperti mengatakan pion kertas, inilah nilai 3 dan aku sudah melewati ini sebagai sigma. 3 jelas tidak kurang dari 0 sehingga kondisi IF tidak berlaku. ELSE tidak. Jadi apa yang harus saya lakukan? Saya ingin kembali m, yang 3, ditambah sigma dari m minus 1. Jadi biarkan aku melacak ini. Aku akan menempatkan ini selembar kertas ke bawah. Dan apa nilai, menjadi jelas, aku akan lulus ke sigma pada saat ini dalam cerita? Nomor berapa? 2, kan? 3 minus 1 adalah 2. Jadi saya hanya perlu sedikit secarik kertas di sini. Jadi sekarang sigma semakin dipanggil lagi. Dan saya sudah sengaja memasang bawah ini karena itu jenis seperti berhenti bahwa versi cerita karena sekarang aku fokus pada sinyal dari m minus 1. Jadi m adalah 3, m minus 1 adalah 2. Jadi di sini adalah 2 bahwa saya telah berlalu. 2 jelas tidak kurang dari 0 sehingga kasus itu tidak berlaku. Lain aku kembali m, yang ini hal, ditambah sigma dari nilai apa? Jadi jika sigma dari 1-- karena m adalah sekarang 2 jadi 2 minus 1 adalah 1. Jadi sekarang aku punya hanya nilai 1. Aku melewati hanya nomor 1 untuk fungsi sigma-- atau diriku di sini-jadi 1 adalah jelas tidak kurang dari nol, masih tidak berlaku. Lain kembali 1 ditambah sigma apa? 0. Jadi saya hanya ingat itu. Aku akan kembali ke nanti. Sekarang aku akan pergi ke depan dan Iota bawah angka 0 karena itulah Argumen saya atau parameter. Aku melewati angka 0 dan akhirnya proses ini hanya mengulang sendiri iklan nauseum tidak berhenti karena apa saya segera lakukan setelah saya melihat 0 ini? Aku kembali nol. Jadi sekarang Anda harus mundur cerita. Jika saya sekarang pergi mundur dalam waktu, apa adalah hal terbaru Saya melakukan jika Anda secara harfiah memutar video? Aku akan mengambil terbaru 1 dan itu memberi saya 1 ditambah 0 adalah 1. Jika saya terus memutar yang cerita, itu akan memberi saya 2 ditambah nilai ini berjalan, yaitu 1. Jadi itu 3. Dan kemudian aku akan terus rewinding. Ketika saya pertama kali meletakkan nomor 3-- sehingga 3 ditambah 3 memberi saya 6. Dan sekarang, jika Anda telah memutar ulang video sampai titik ini, ini adalah sangat Pertanyaan pertama saya bertanya. Ketika melewati 3, apa sigma dari 3? Ini memang 6, jumlah semua bagian kertas. Jadi jika yang mengambil sedikit waktu untuk membungkus pikiran Anda sekitar, itu baik-baik saja. Tapi mempertimbangkan itu little-- itu sangat disengaja yang saya ditumpuk angka-angka ini di atas satu sama lain. Ini semacam seperti memiliki memory-- rekor dalam waktu, seperti scrubber dalam sebuah video, bahwa saya memang bisa mundur di. Dan kita akan kembali ke yang metafora hanya sedikit. Tapi pertama, ternyata ada banyak Geeks dan orang-orang lucu, Saya kira, di Google. Akan seseorang yang sangat baik di Googling pikiran datang hanya sesaat dan membantu saya mencari sesuatu? Sangat, sangat rendah kunci. Seseorang yang tidak pernah datang sebelumnya, mungkin. OKE. Ya? Ayolah. Ayo turun. Siapa namamu? SAM: Sam. DAVID J. Malan: Sam, datang di bawah. Ini adalah sama. Senang berjumpa dengan mu. Hey. Ayo sini. Jadi semua saya perlu Anda lakukan, jika Anda bisa, Sam, inilah Google. Anda dapat mencari rekursi jangka? Jangan merusak. Dan sekarang let's-- ya. OK Klik itu. Baik klik itu. Ahh, mendapatkannya. Tidak? OKE. Jadi mari kita lakukan beberapa orang lain. Tidak begitu banyak terkait akademis di sini, tetapi Anda pernah mencari Google untuk anagram? SAM: No. DAVID J. Malan: OK. Mencari anagram bukan rekursi. Bagaimana miring. Anda pernah mencari miring? Sekarang, yang satu ini agak sulit untuk lihat tapi mudah-mudahan everything's-- OK. Ini hanya kau dan aku menikmati ini. OKE. Jadi akhirnya, one's-- ini itu miring sedikit. Sekarang lakukan gulungan per barel. Indah. Baiklah. Terima kasih besar untuk Sam. Di sini Anda pergi. Terima kasih. Jadi apa yang terjadi di semua dari contoh-contoh konyol? Jadi benar-benar, di bawah kap Jutaan Google baris kode tampaknya adalah beberapa konyol IF kondisi yang pada dasarnya memeriksa jika pengguna memiliki mengetik kalimat ini, melakukan sesuatu yang mungkin mengambil jumlah trivial waktu untuk menerapkan hanya untuk menjadi lucu dengan cara ini. Tapi itu semua itu bermuara ke bawah kap mesin. Tapi, tentu saja, rekursi lebih dari geekier Misalnya antara mereka trik khusus. Dan pasti ada orang lain di luar sana juga bahwa kita mungkin bahkan tidak ditemukan dulu. Jadi kita lihat, atau mempertimbangkan sekarang program berikut, dan tentu mengambil salah ini di jalan keluar. Aku akan pergi ke depan dan membuka program itu akan mencoba untuk menukar dua nilai. Tapi sebelum kita pergi ke sana, mari kita lakukan ini. Bisakah kita mendapatkan satu lagi relawan, saya pikir? Apakah Anda ingin menjadi relawan? Tidak? Ayo up. Ayo up. Baiklah. Jadi nama Anda adalah apa? LAUREN: Lauren. DAVID J. Malan: Lauren. Ayo up, Lauren. Jadi Lauren sedang menantang di sini sebagai berikut. Senang berjumpa dengan mu. Jadi Lauren sini memiliki di depan dari dua cangkir yang kosong. Dan kami memiliki beberapa orange jus dan susu dan kami akan pergi depan dan melakukan hal berikut. Kami hanya akan mengisi ini. Beberapa ons susu di sini dan mari kita mengisi jus jeruk sedikit di sini. Dan di depan semua penonton ini, menukar dua nilai dari cangkir tersebut. Masukan jus jeruk dalam cangkir susu dan susu dalam cangkir jus jeruk. Bagaimana Anda akan melakukan hal ini jika Anda berada di rumah dan memiliki akses ke perlengkapan lainnya? LAUREN: Taruh di secangkir. DAVID J. Malan: OK. Jadi mari kita sementara variabel, jika kita mau. Dan pergi ke depan sekarang dan mengimplementasikan prosedur swapping sama. Sangat bagus. Kami telah menempatkan OJ ke dalam sementara variabel, susu ke dalam variabel OJ, dan sekarang variabel sementara ke dalam variabel susu. OKE. Jadi sangat baik dilakukan sejauh ini. Jadi ternyata out-- berpendapat bahwa berpikir untuk sesaat. Di sini, hanya geek itu sedikit, ini akan menjadi kode C yang sesuai bahwa kita hanya dilaksanakan. Kami memiliki dua input, a dan b, keduanya yang kita hanya akan mengatakan untuk kesederhanaan adalah int itu. Dan perhatikan di sini, jika saya ingin menukar nilai-nilai dua variabel, a dan b, kita memang membutuhkan perantara, sebuah variabel sementara, secangkir sementara, ke mana tuangkan salah satu nilai sehingga kita memiliki tempat untuk itu. Tapi kemudian kode ini persis sebagai Lauren sini dilaksanakan. Sekarang, hanya untuk mendapatkan sedikit gila, ternyata Anda dapat melakukan ini tanpa variabel sementara. Untuk melakukan ini dengan benar, meskipun, kita akan harus menipu dengan beberapa kimia. Kami memiliki beberapa cangkir ekstra di sini. Jadi hal yang paling dekat yang terlihat seperti susu dan air perhaps-- atau susu dan OJ-- adalah kami memiliki beberapa air, jadi kita akan mengisi satu ini dengan beberapa ons air jernih. Itu mungkin terlalu banyak. Ya. Itu pasti terlalu banyak. Tunggu satu detik. Dan sekarang kami memiliki minyak, yang, seperti yang saya ingat dari sekolah kelas kimia menengah, mudah-mudahan itu tidak bercampur dengan air. Tapi itu semacam semacam terlihat seperti susu dan OJ. Jadi sekarang, tanpa menggunakan variabel sementara, Anda dapat menukar dua nilai? Jadi minyak masuk ke dalam cangkir air, air masuk ke dalam cangkir minyak. LAUREN: Tidak ada cangkir lain? DAVID J. Malan: Tidak ada cangkir lain. Dan aku sudah tidak benar-benar diuji ini sebelum tahun ini jadi saya tidak tahu apakah ini akan benar-benar bekerja secara kimia. Yang tidak seharusnya terjadi. Apakah bekerja? Baiklah. Jadi memisahkan? Baik. Sekarang kita harus mendapatkan air ke dalam gelas lainnya. Konsentrator kimia Smarter bisa mungkin melakukan hal ini lebih baik dari saya. LAUREN: Air yang ada di bagian bawah. DAVID J. Malan: The water-- itu apa kuncinya terakhir kali kami melakukan ini. Anda harus melakukannya dalam urutan yang benar. Ya. Tidak apa-apa. Jadi sekarang kita memiliki dua cangkir minyak. OKE. Tidak apa-apa. Tapi secara kimia jika ini bekerja dari Aku-- LAUREN: ini adalah air. DAVID J. Malan: Itu sebagian besar air. Baiklah. Tapi itu masih cangkir yang sama seperti sebelumnya. Jadi tuangkan itu-- mencobanya di sana. OKE. Ini adalah baik penggunaan waktu kelas hari ini. OKE. Jadi sekarang we-- bagus. Semacam. Baiklah. Jadi sangat baik. Terima kasih kepada Lauren. Bagus sekali. Jadi hanya untuk meniup pikiran Anda, dan ini adalah sesuatu yang mungkin bermain dengan jika Anda suka di CS50 ID, Anda dapat, pada kenyataannya, swap dua variabel tanpa menggunakan bilangan bulat sementara. Dan ini adalah kode C yang sesuai. Dan jika Anda ingat dari terakhir Rabu, kami memperkenalkan, jika sebentar, beberapa operator baru dalam C. Dan apakah orang ingat apa wortel kecil Simbol adalah, bahwa segitiga kecil simbol dari keyboard merupakan? Apa Operator bitwise? AUDIENCE: EXOR. DAVID J. Malan: EXOR. Exclusive Or. Jadi jika Anda ingin, hanya untuk bersenang-senang di rumah, untuk memberikan a dan b dua sewenang-wenang nilai-nilai seperti eight-- dan saya akan memilih nilai delapan bit. Jika Anda melakukan ini dengan 32 bit, Anda akan sangat cepat bosan. Tetapi hanya memberikan delapan bit Nilai itu pun, satu atau dua, dan memberikan b nilai yang sama. Dan kemudian menggunakan definisi dari XOR dari Rabu lalu, menerapkan bit yang demi sedikit, masing-masing delapan bit dalam setiap a dan b, dan kemudian melakukannya persis per kode ini. Dan itu tidak salah apa Anda lihat di sini di layar. Ini memang bermuara untuk tiga operasi XOR dan entah bagaimana ajaib dan b akan bertukar posisi tanpa kehilangan informasi apapun. Jadi trik minyak dan air adalah terdekat inkarnasi dunia nyata Saya bisa memikirkan untuk meniru itu. Tapi itu pasti lebih mudah untuk menggunakan variabel sementara, seperti dalam kasus ini di sini. Dan ini juga merupakan kesempatan mengatakan, juga, jenis optimasi mikro, sebagai seorang ilmuwan komputer akan mengatakan, sementara jenis menyenangkan untuk membual tentang bagaimana Anda melakukan ini tanpa seperti swapping dengan variabel tambahan, itu tidak semua yang menarik. Karena untuk menyimpan 32 bit, seperti dalam kasus int sebenarnya, tidak semua yang menarik pada sistem di mana Anda mungkin menggunakan puluhan megabyte atau bahkan lebih memori seperti hari ini. Dan pada kenyataannya, ketika kita mendapatkan untuk masalah set kemudian dan Anda menerapkan mantra checker dan Anda akan ditantang untuk melakukannya dengan ini RAM sedikit dan sedikit waktu mungkin pada computer-- Anda masih memiliki seminggu untuk melaksanakan itu-- Anda akan have-- Anda akan ditantang untuk meminimalkan sumber daya. Dan itu benar-benar satu-satunya Acara semester ini di mana Anda akan didorong untuk mencukur off bahkan kinerja terbaik biaya sebaliknya. Jadi bagaimana kita bisa-UMPC melihat ini dalam kode yang sebenarnya? Biarkan aku pergi ke depan sekarang dan membuka sebuah contoh yang sengaja disebut Tidak ada Swap karena tidak sebenarnya swap variabel Anda benar-benar harapkan. Jadi mari kita lihat. Berikut adalah program yang tidak memiliki CS50 Perpustakaan terjadi, hanya standar I / O. Sekarang kita memiliki prototipe untuk swap atas yang hanya berarti itu harus didefinisikan kemudian. Dan inilah utama. Aku sewenang-wenang ditugaskan x dan y, masing-masing, nilai-nilai satu dan dua hanya karena mereka kecil dan mudah untuk berpikir tentang. Dan kemudian aku hanya memiliki banyak printfs di mana saya memiliki cek kewarasan. x adalah 1 dan y adalah 2 diduga apa yang mereka printfs akan mengatakan. Jadi tidak ada sihir sejauh ini. Lalu aku akan mengklaim dengan mencetak def, bertukar dot dot dot. Aku akan memanggil swap fungsi, lewat di x dan y. Dan mari kita asumsikan untuk saat ini yang swap dilaksanakan tepat seperti itu beberapa saat yang lalu dengan variabel sementara. Dan jadi saya mengklaim berani, bertukar. x sekarang ini dan y sekarang itu. Tapi file, tentu saja, disebut ada Swap. Jadi mari kita benar-benar melihat apa yang terjadi. Jika saya mengkompilasi ada swap dan kemudian melakukan ./noswap, x adalah 1, y adalah 2. Swapping bertukar. x adalah 1, y adalah 2. Sehingga benar-benar tampaknya cacat bahkan meskipun swap-- mari gulir ke bawah sekarang-- diimplementasikan persis per kode saya mengusulkan beberapa saat yang lalu. Jadi kita tidak akan mendapatkan mewah dengan hal-hal XOR untuk saat ini. Ini juga, harus bekerja sama seperti dengan susu dan OJ, tetapi tidak tampaknya akan bekerja. Jadi mari kita lakukan ini lagi. Mungkin aku hanya tidak berjalan dengan benar. Jadi mari kita jalankan ada Swap lagi. Mungkin Aku-- ada. Jadi itu hanya tidak bekerja. Jadi mari kita lakukan sebuah pemeriksaan kecil. Biarkan aku pergi ke depan di sini di Swap dan hanya menambahkan, tunggu sebentar, adalah% i / n dan mari plug-in nilai dari. Karena aku benar-benar ingin untuk melihat apa yang terjadi. Dan memang, ini adalah teknik debugging Anda mungkin menggunakan di jam kantor atau di rumah sudah, mirip dengan paruh pertama Dan Video Armendariz di PSET3 dimana kami memperkenalkan cetak def sebagai teknik dianjurkan, setidaknya untuk kasus sederhana. Biarkan aku pergi ke depan dan menjalankan make tanpa swap lagi, ./noswap. Menarik. Jadi melihat apa yang tampaknya menjadi kenyataan. x adalah 1, y adalah 2, tetapi adalah 2 ketika b adalah 1. Jadi kedua entah bagaimana bertukar tapi x dan y tidak mendapatkan bertukar. Jadi harus jelas, apa yang terjadi adalah, di sini saya punya x dan y dan mereka adalah variabel lokal dalam lingkup utama, saya lewat di x dan y menukar. Sekarang, swap, sebagai fungsi yang terpisah, bebas untuk memanggil argumen atau parameter apa yang diinginkannya. Foo atau bar atau x atau y atau atau b. Hanya untuk membuat jelas bahwa mereka tidak identik dengan x dan y per se, Aku sudah mengatakan a dan b. Tapi kita bisa menyebut mereka apa pun yang kita inginkan. Dan sehingga terlihat seperti swap disahkan x-- AKA a-- dan itu disahkan y-- AKA b. Entah bagaimana tiga garis swapping nilai-nilai persis seperti Lauren melakukan dengan susu dan OJ. Tetapi ketika kita mencetak nilai-nilai, a dan b memang menukar tapi x dan y harus ada perubahan untuk mereka. Ingat bahwa x dan y adalah di sini. Jadi kita bisa melihat ini melalui teknik lain juga. Dan ini juga merupakan teknik tertanam dalam masalah menetapkan tiga. Mari kita pergi ke depan dan melakukan hal ini di CS50 ID jika Anda belum melakukannya. Di sisi kanan sisi kita memiliki tab Debugger ini. Dan jika Anda membuka ini sampai, ada beberapa informasi rahasia yang dilemparkan pada Anda awalnya. Tapi mari kita menggoda ini selain sangat cepat. Jadi satu, Anda melihat variabel lokal. Ternyata membangun ke CS50 IDE, dan banyak lingkungan pemrograman lebih umumnya, adalah debugger. Sebuah alat yang memungkinkan Anda untuk melihat secara visual apa yang terjadi di dalam program Anda tanpa harus resor untuk menambahkan printfs dan kompilasi dan menjalankan dan menambahkan printf dan kompilasi dan berjalan, yang sudah, di jam kantor atau rumah, mungkin menjadi cukup membosankan. Jadi di sini, hanya dalam beberapa saat, kami akan melihat secara real time nilai-nilai variabel lokal kami. Kami juga akan dapat mengatur apa yang disebut breakpoints yang peluang dalam program saya untuk menghentikan eksekusi pada baris tertentu dari kode yang saya ingin tahu tentang. Benar? Program-program ini dijalankan dalam hitungan detik. Ini jenis yang baik bagi kita manusia lebih lambat untuk dapat berhenti, luangkan waktu, melihat apa yang terjadi di sekitar baris kode tertentu tanpa membajak Program melalui itu dan finishing seluruhnya. Jadi breakpoints akan memungkinkan kita untuk istirahat dan berhenti pada titik tertentu. Panggilan stack adalah cara mewah mengatakan apa fungsi saat ini dipanggil pada saat ini. Main selalu disebut pertama. Tetapi jika Utama panggilan fungsi yang disebut Swap, kita benar-benar akan melihat ini menara fungsi yang telah disebut dalam urutan kronologis terbalik. Jadi mari kita lihat itu. Aku akan zoom out. Aku akan kembali ke kode saya. Dan hanya karena aku ingin menjadi bertele-tele di sini, Aku akan pergi ke depan dan klik hanya di sebelah kiri garis lima. Dan yang menciptakan titik merah. Dan melihat di sisi kanan bahwa debugger tahu, hei, Saya hanya mengatakan breakpoint di baris noswap.c lima, khusus di baris kode ini. Jadi debugger tahu bahwa saya telah meminta bahwa waktu berikutnya Saya menjalankan saya Program itu jeda eksekusi ada bukan hanya menjalankan semuanya super cepat. Jadi sekarang aku akan klik Debug yang tombol di bagian paling atas dari IDE dan itu akan melakukan hal berikut. Ini akan membuka awalnya agak menakutkan mencari terminal kedua window-- debugging jauh dari tuan rumah tersebut dan such-- dan kami akan kembali ke apa semua itu berarti tak lama. Tapi apa yang penting untuk saat ini adalah bahwa titik merah dipukul, debugger memiliki sengaja berhenti execution-- bukan pada garis per se tapi pertama baris kode aktual dalam fungsi itu. Dan itulah mengapa garis tujuh adalah sekarang ditandai dengan warna kuning. Dan sekarang mari kita lihat di sisi kanan. Sepertinya, secara default, cukup baik, x memiliki nilai apa? 0. Dan y memiliki nilai apa? Nol. Dan itulah yang diharapkan dalam arti bahwa x dan y-- yang line-- kuning memiliki tidak dieksekusi belum. Jadi x tidak harus memiliki nilai 1. Ini mungkin memiliki nilai lain, yang disebut nilai sampah. Dan kami beruntung di bahwa itu nol pada titik ini, pada dasarnya. Jadi sekarang hanya ada beberapa tombol kita perlu peduli tentang kapan debugging dengan cara ini. Perhatikan di sini, kami memiliki tombol Play. Dan jika kami bermain atau memukul melanjutkan, itu hanya akan dijalankan melalui sisa program atau sampai hits breakpoint lain. Tapi aku tidak diatur lain breakpoints sehingga hanya akan dijalankan melalui akhir. Semacam itu mengalahkan Tujuan dari mengaduk-aduk. Jadi sebagai gantinya, saya peduli ikon ini ke kanan. Dan jika saya membawa lebih mereka, karena Anda harus juga, Anda akan melihat sedikit tips-- tips alat. Yang satu ini adalah langkah di atas. Sekarang itu tidak berarti melewatkan baris kode berikut. Itu hanya berarti melaksanakannya dan pindah ke berikutnya, pindah ke berikutnya, pindah ke yang berikutnya. Dengan kata lain, melalui tombol itu, dapat aku berjalan melalui saya kode satu langkah pada satu waktu. Baris demi baris, secara harfiah. Sekarang, di sebelah kanan itu, ada satu lagi bahwa kita akan melihat hanya dalam beberapa saat. Ini adalah apa yang disebut Langkah Ke icon itu akan memungkinkan saya menyelam ke fungsi lain. Tapi mari kita lihat ini hanya dalam beberapa saat. Jadi aku akan klik melangkahi. Dan sekarang perhatikan, karena saya klik tombol ini di kanan atas, menjaga mata Anda sekitar bawah Lokal Variabel dan melihat apa yang terjadi pada x. x sekarang 1 karena garis kuning kini telah dieksekusi dan kita sudah pindah ke jalur 8. Dan hanya sesaat y mudah-mudahan harus menjadi 2. Sekarang, tidak ada yang menarik terjadi untuk sedikit. Semua ini adalah printf. Dan perhatikan, di terminal sekunder saya jendela, saya melihat output dari cetak def. Dan sekarang saya harus membuat keputusan sebagai programmer. Aku bisa melangkahi garis ini kode, dijalankan tetapi tidak mendapatkan penasaran tentang apa yang ada di dalamnya. Atau aku benar-benar dapat melangkah ke dalamnya dan pergi dalam Swap sendiri. Jadi mari kita lakukan yang terakhir. Biarkan aku pergi ke depan dan klik tidak Langkah Selama tapi Langkah Ke. Pemberitahuan, tiba-tiba perubahan jendela untuk menyorot pertama baris kode di Swap. Itu line 21. Dan sekarang, apa jenis funky adalah bahwa, jika Anda melihat di sini, seperti yang diharapkan, koma b adalah 1 dan 2, masing-masing. Mengapa suhu 32.767? Mengingat suhu itu, seperti cangkir kosong beberapa saat yang lalu, dinyatakan di sini on line 21. Mengapa 32,000- Maksudku, mengapa itu hanya beberapa nilai aneh? Ya? AUDIENCE: Ini tidak diinisialisasi. DAVID J. Malan: Ini belum diinisialisasi. Jadi komputer kita selalu memiliki memori fisik. Selalu memiliki RAM fisik. Dan selalu ada nol ini dan satu yang ada di sana, kan? Karena kita menggunakan kami komputer sepanjang hari, Anda menggunakan CS50 IDE atau server sepanjang hari. Jadi RAM yang baik memiliki beberapa angka nol atau seseorang atau beberapa nol dan satu. Tidak peduli apakah tidak Anda menggunakan mereka. Anda tidak bisa hanya memiliki kosong ruang di mana Anda ingin bit. Mereka baik nol dan satu. Jadi ternyata suhu itu, karena kita sudah tidak diinisialisasi itu belum, kami memiliki orang-orang 32 bit tetapi mereka tidak punya diinisialisasi ke nilai-nilai diketahui. Jadi apa pun yang mereka paling baru-baru ini digunakan for-- mereka 32 bits-- kita hanya melihat artefak dari beberapa penggunaan sebelumnya mereka tertentu 32 bit. Segera setelah saya klik Langkah Selama meskipun, Fiuh, suhu akan mendapatkan nilai 1. Dan jika saya melakukannya lagi, adalah bakalan untuk diberikan nilai 2 dan kemudian b akan diberi nilai 1. Dan jadi apa yang bagus sekarang di titik ini dalam cerita adalah bahwa debugger adalah menunjukkan kepada saya, super lambat kecepatan saya sendiri, apa yang keadaan Swap adalah. Tapi perhatikan di bagian atas sini, pemberitahuan bahwa panggilan stack sebenarnya memiliki dua lapisan untuk itu. Sekarang salah satu yang disorot sebagai Swap, jika saya klik pada Main sebaliknya, perhatikan bagaimana variabel lokal berubah karena pengembang hanya dapat hop sekitar dan masuk ke setiap ruang lingkup yang berbeda. Jadi meskipun kita melakukan semua ini bekerja dan benar swapping a dan b, jika saya pergi bolak-balik antara Swap di mana a adalah 2 dan b adalah 1 dan Main, telah Utama terpengaruh sama sekali? Tidak. Jadi apa takeaway di sini? Nah, ternyata bahwa setiap saat Anda memanggil fungsi seperti Swap, dan Anda lulus argumen itu, apa Anda melewati ke fungsi Swap dalam hal ini adalah salinan dari argumen-argumen. Jadi jika x dan y masing-masing masing-masing 32 bit, apa Swap semakin lokal dua baru variabel, atau argumen, disebut dan b-- tetapi mereka adalah sewenang-wenang names-- tetapi pola nol dan orang-orang dalam a dan b didapuk menjadi identik dengan x dan y tetapi mereka tidak hal yang sama seperti x dan y. Seolah-olah Main pada bagian atas kertas nomor 1 dan 2 untuk x dan y, dan kemudian ketika itu tangan yang selembar kertas untuk Swap, Swap sangat cepat mendapat pena sendiri, menuliskan 1 dan 2 pada lembar sendiri kertas, tangan kembali xy asli untuk Main dan kemudian melakukan sendiri hal dengan a dan b. Dan sekarang ini adalah super penting karena ini memiliki implikasi nontrivial untuk benar-benar menulis kode yang benar karena tampaknya kita tidak bisa menukar dua variabel. Saya telah menulis fungsi Swap yang benar. Kami telah menerapkan dengan Lauren sebagai fungsi pertukaran yang benar dalam kenyataannya, tapi rupanya tidak ada yang hal jika Anda tidak dapat benar-benar swap dua nilai secara permanen. Jadi kita perlu cara lain untuk benar-benar mendapatkan ini, dan kita harus mampu untuk benar-benar memecahkan masalah ini. Dan ternyata out-- dan kami akan datang kembali ke gambar tertentu sebelum long-- ini adalah salah satu cara yang Anda mungkin menarik memori komputer Anda. Ini hanya persegi panjang. Anda bisa menggambar apapun beberapa cara tapi itu nyaman untuk menarik sebagai persegi panjang karena alasan berikut. Kita akan mulai hari ini dan seterusnya berbicara tentang apa yang disebut stack. Dan stack hanya sepotong dari RAM-- sepotong memory-- yang berfungsi memiliki akses ketika mereka disebut. Dan ternyata di bagian paling bawah tumpukan ini adalah di mana semua variabel lokal Main dan org C dan V org dan semua itu akan pergi secara default. Dan jika Utama panggilan beberapa fungsi lain seperti Swap, baik, Swap akan mendapatkan lain lapisan memori di atas itu. Dan hanya untuk memberikan sepintas cepat gambar ini, jika saya pergi ke sini- dan biarkan aku cermin ini pada overhead well-- apa yang saya miliki, jika kita peduli hanya tentang bawah gambar ini untuk saat ini, adalah bahwa ketika saya menjalankan program dan Main dipanggil, Main diberikan sepotong RAM di komputer saya yang di bagian bawah disebut tumpukan ini. Dan aku akan menggambar sengaja sebagai persegi. Jadi seperti 32 bit atau empat byte. Dan jika fungsi utama ini memiliki variabel yang disebut x dengan nilai 1 dan memiliki variabel yang disebut y dengan nilai 2, yang seperti mengambil sepotong ini memori yang Utama telah diberikan oleh operasi sistem dan membaginya up sehingga variabel lokal pertama pergi di sini, yang kedua terjadi di sini, dan hanya itu. Ketika Main panggilan Swap, Swap mendapat sepotong sendiri memori bahwa kita akan menggambar seperti ini dari sistem operasi, dan itu akan memiliki nya variabel lokal sendiri berdasarkan pada implementasi kami sebelumnya dengan variabel lokal dan b yang awalnya mendapatkan nilai 1 dan 2. Tapi kemudian, secepat kode Swap mengeksekusi, dan Lauren benar-benar swap OJ dan susu, apa yang terjadi? Nah, 2 ini menjadi 1, ini 1 menjadi 2, dan, dengan cara, ada variabel temp yang menjadi digunakan bahwa sepanjang waktu yang akhirnya pergi jauh. Tapi itu tidak masalah berapa banyak pekerjaan yang Anda lakukan di baris ini of-- di ruang memori ini, x dan y-benar tersentuh. Jadi kita perlu beberapa cara pemberian Swap dan fungsi seperti itu akses rahasia, jika Anda akan, untuk fungsi like-- ke memori seperti x dan y. Jadi mari kita lihat contoh yang membantu kita lihat apa yang sudah terjadi sepanjang waktu ini. Aku akan pergi ke depan dan membuka Bandingkan Zero. Dan aku akan menutup debugger kami, aku akan untuk menutup pesan mencari ini menakutkan hanya mengatakan, tunggu sebentar, Anda berada di tengah debugging. Aku akan menyembunyikan tab ini di sini hanya untuk kembali ke kesederhanaan. Jadi jangan khawatir jika GDB dibunuh. Itu hanya berarti bahwa program ini memiliki telah berhenti, sengaja dalam hal ini, oleh saya. Dan sekarang Bandingkan Nol melakukan hal ini. Saya menggunakan CS50 perpustakaan dalam standar I / O. Aku punya fungsi utama yang pertama mengatakan, mengatakan sesuatu, dan mendapat string. Kemudian mengatakan lagi dan mendapat string lain. Dan perhatikan bahwa kedua string disebut s dan t masing-masing. Dan sekarang program ini, Bandingkan Nol, tujuannya dalam hidup, itu seharusnya memberitahu saya, aku ketik hal yang sama? Dan jadi saya akan kembali ke minggu satu. Saya menggunakan operator yang sama sama saya yang merupakan operator kualitas. Tidak operator penugasan, operator kesetaraan. Aku hanya membandingkan dan t. Jadi mari kita benar-benar pergi ke depan dan melakukan hal ini. Dan aku akan pergi ke depan dan membuat Bandingkan Zero. Aku akan melakukan ./comparezero. Dan aku akan pergi depan dan mengatakan sesuatu seperti, mari kita lakukan ibu dalam huruf kecil dan bagaimana ibu dalam huruf besar. Dan tentu saja saya ketik hal yang berbeda. Baiklah. Itulah yang diharapkan. Mari kita jalankan lagi. Kedua kali melakukan huruf kecil, huruf kecil. Itu terlihat super identik dengan saya. Masukkan. OKE. Mungkin itu hanya aneh karena itu tidak menyukai tata bahasa saya. Jadi mari kita melakukan MOM modal, modal IBU, identik. Hal yang berbeda. Jadi kenapa begitu? Nah, apa yang sebenarnya terjadi di bawah kap di sini? Jadi mari kita kembali lebih di sini untuk hanya sesaat dan mempertimbangkan apa GetString sebenarnya lakukan. Ketika Anda menelepon GetString, itulah fungsi kami diri menulis dan entah bagaimana mendapat urutan karakter dari pengguna. Dan mari kita asumsikan bahwa pertama Waktu saya sebut GetString, yang memberikan saya sepotong memori yang terlihat seperti ini. Dan jika saya mengetik di semua huruf kecil m-o-m-- dan apa yang terjadi setelah itu? Hanya cek kewarasan cepat. Nol backslash. Kita tahu bahwa. Dan ingat bahwa kami bermain sekitar dengan nama Zamila ini dan sekelompok nama lain ketika Rob sini mencari apa yang terjadi di dalam memori. Jadi cerita yang persis sama. Ini adalah apa yang GetString adalah kembali kepada saya. Sekarang, kode saya beberapa saat yang lalu disimpan nilai pengembalian GetString dalam variabel yang disebut s. Dan kemudian kedua kalinya aku menyebutnya, itu disimpan dalam sebuah variabel yang disebut t. Jadi jika saya pergi ke sini, saya perlu menggambar variable-- lokal ini dan aku umumnya akan menggambar string sebagai hanya-- kita akan menyebutnya s-- sebagai persegi kecil di sini. Dan sekarang, somehow-- bagaimana ibu masuk ke dalam variabel s ini? Nah, kita perlu kembali prinsip-prinsip pertama di sini. Apa yang sebenarnya GetString kembali? Jadi ternyata bahwa M-O-M backslash nol, dan sejumlah string lainnya di memori seperti Zamila dan Rob atau Andy atau orang lain, tentu saja di kita RAM komputer atau memori. Dan RAM Anda memiliki like-- Anda memiliki sebuah pertunjukan RAM, dua gigs RAM, atau miliar atau dua miliar byte, atau mungkin bahkan lebih hari ini. Jadi mari kita asumsikan, untuk tujuan hari ini, bahwa tidak peduli bagaimana kita nomor mereka, tapi kami dapat nomor masing-masing orang miliar atau dua miliar atau empat milyar byte. Dan mari kita sewenang-wenang mengatakan bahwa ini adalah gigitan pertama, gigitan kedua, ketiga, keempat. Saya sengaja tidak menggunakan nol untuk hari ini tapi kami akan kembali ke itu. Jadi dengan kata lain, jika ini adalah pertama kalinya saya menggunakan program ini, Aku hanya mendapatkan beruntung dan yang pertama gigitan di lokasi satu kemudian dua kemudian tiga dari empat. Dan jika aku terus menggambar, jumlah kotak dua miliar akan menjadi cara di sini. Jadi apa yang Anda pikirkan, maka, GetString benar-benar kembali? Ini tidak kembali M-O-M backslash nol per se karena yang jelas tidak akan cocok di kotak yang saya sudah ditarik. Jadi apa lagi yang mungkin GetString sebenarnya kembali semua minggu ini? Jawabannya adalah pada papan sini. Anda tidak dapat memasukkan M-O-M backslash nol, jadi apa mungkin masuk akal bukan? Jika Anda harus menjadi super pintar, menempatkan pada apa yang disebut topi rekayasa, apa yang bisa Anda kembali? Apa sedikitnya jumlah informasi Anda bisa kembali yang akan masih biarkan Anda menemukan M-O-M di memori? Ya? AUDIENCE: Satu. DAVID J. Malan: Satu. Dan mengapa satu? AUDIENCE: Karena itu akan memberitahu Anda pergi ke mana [tidak terdengar]. DAVID J. Malan: Tepat. Saya hanya akan kembali alamat dari string yang saya mendapatkan. Alamat di ini Kasus adalah lokasi satu. Jadi apa yang sebenarnya sedang disimpan di s-- dan setiap variabel string sehingga far-- baru saja menjadi alamat string yang. Sementara itu, jika saya sebut GetString kedua kalinya dan aku ketik harfiah thing-- sama M-O-M dengan lowercase-- M-O-M dan backslash lain nol, dan sekarang mungkin program saya telah berjalan selama beberapa waktu jadi mungkin ini adalah 10, ini adalah lokasi 11, ini 12, ini adalah 13. Komputer menggunakan beberapa lainnya memori untuk alasan apapun. Apa yang sekarang berjalan di kedua variabel dalam saya t Program? 10. Tepat. Dan jadi ketika kita melihat kode sumber dari program ini mana aku hanya berusaha untuk membandingkan dua nilai, adalah s sama sama dengan t, apa jawaban manusia yang jelas? Hanya ada karena 1 tidak sama 10. Dan di sinilah letak sebuah kesempatan bagi kita benar-benar hanya kembali ke, lagi, pertama prinsip dan berpikir tentang, baik, apa yang terjadi di bawah tenda? Kami telah berbicara tentang bit dan byte dan memori, tapi itu sebenarnya berguna untuk memahami karena ketika Anda menelepon GetString, meskipun kita berpikir itu adalah kembali M-O-M atau tali ibu atau Andy atau Zamila atau sejenisnya, secara teknis itu hanya kembali alamat dari yang sepotong memori. Tapi itu OK. Karena bagaimana saya tahu di mana string berakhir? Jika saya hanya diberikan awal? Nah, backslash nol, kan? Hanya dalam waktu linier aku bisa mencetak dengan print def M-O-M. Dan segera setelah saya melihat backslash nol, saya tidak peduli di mana saya mulai, Aku sudah tahu secara implisit di mana saya harus mengakhiri. Dan hari ini menandai beginning-- dan biarkan aku melakukan ini secara dramatis karena kita pergi melalui banyak kesulitan untuk mendapatkan ini di sini melatih wheels-- jadi hari ini roda pelatihan mulai datang dari dan kami mengungkapkan di least-- [Tepuk Tangan] Itu layak perjalanan Target pagi ini, ya? Jadi sekarang-- ada, ternyata keluar, tidak ada hal seperti string. String tidak ada. Ini sinonim yang kami punya dalam perpustakaan CS50. Selanjutnya, kita akan mulai menelepon s dan t tidak string tapi bintang arang. Dan bintang arang kita akan menggoda terpisah sebelum lama. Tapi ini mengatakan, bahwa bahkan jika kita terus menggunakan GetString untuk saat ini, secara teknis aku harus menjadi mengatakan bintang char dan bintang arang. Dan ternyata apa bintang yang akan menunjukkan sesuatu disebut pointer atau alamat. Dan pada kenyataannya, teaser untuk apa yang ada di depan adalah ini 20 klip kedua dari kami teman Nick Parlante di Stanford yang, beberapa waktu lalu, menghabiskan jumlah konyol waktu, sebagai terbaik yang bisa saya katakan dalam bukunya dapur atau ruang bawah tanah, membuat claymation memperkenalkan kepada dunia karakter bernama Binky dengan siapa kita akan diperkenalkan kali untuk pointer. Jadi di sini adalah preview dari apa yang akan datang. [VIDEO PLAYBACK] -Hei, Binky. Bangun. Sudah waktunya untuk pointer menyenangkan. -Apa itu? Belajar tentang pointer? Oh, goody. [END PLAYBACK] DAVID J. Malan: Dan pada catatan itu, kita akan melihat Anda pada hari Rabu. Baiklah. Siapa menari? Ayolah. Siapa menari? Anda ingin saya untuk mendapatkannya mulai? Saya akan memulainya. Woooo! LAUREN: Manis mewah Musa.