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