DAVID J Malan: Semua tepat, jadi ini adalah CS50. Dan ini jelas Jumat. Dan ini adalah akhir minggu satu. Jadi Anda mungkin ingat bahwa kita tinggalkan, Terakhir kali, dengan cliffhanger macam. Dimana kita mengekspos kebohongan ini, bahwa tidak ada peduli apa yang telah diajarkan tumbuh up, 1 dibagi dengan 10 tidak, di Bahkan, 0,1 atau 0,100 atau 0,10000. Bahkan, jika kita mengkompilasi ini Program, seperti yang kita lakukan kemarin, dengan, membuat ketidaktepatan, dan kemudian lakukan dot, garis miring, ketidaktepatan, kita belajar bahwa ini adalah apa yang 1 dibagi dengan 10 sebenarnya. Jadi itu tidak benar-benar cukup kasus. Tapi ini tidak sedikit di beberapa keterbatasan mendasar dari komputer. Dan memang, di antara hal yang kita akan melakukan hari ini adalah kita lihat mengapa ini memiliki terjadi, apa implikasi ini memiliki, bagaimana manusia telah gagal untuk memahami ini dalam beberapa sangat situations-- serius hasil yang telah cukup tragis dan expensive-- dan juga lihatlah bagaimana kita benar-benar dapat mempertahankan terhadap jenis-jenis keterbatasan. Jadi secara intuitif, mungkin, mengapa 1 dibagi dengan 10, menurut komputer saya di sini, bukan hanya 1/10, 0,10? Ya. Apa yang kamu pikirkan? AUDIENCE MEMBER: radix adalah berbeda? DAVID J Malan: The apa? Oh, radix yang berbeda? Jadi tidak cukup. Ini sebenarnya lebih mendasar untuk perangkat keras. Pikiran lain? Ya. AUDIENCE MEMBER: Mereka mewakili angka berbeda? DAVID J Malan: Jadi they-- kanan. Mereka mewakili nomor berbeda. Akurat, rupanya. Sehingga is-- Nah, berbeda dari apa? Atau dari siapa? Dari kami? AUDIENCE MEMBER: Ya. Mereka tidak menggunakan desimal sistem untuk [tidak terdengar]. DAVID J Malan: OK. Jadi dalam arti, mereka tidak menggunakan sistem desimal. Di bawah kap mesin, semuanya, memang, biner, dan itu terkait, pada kenyataannya. Tapi itu bahkan lebih sederhana penjelasan dari itu. Ya. AUDIENCE MEMBER: Mereka hanya memiliki begitu banyak bit. Mereka hanya dapat menyimpan hingga tertentu batas, seperti dengan desimal. DAVID J Malan: Ya. Ini adalah apa yang benar-benar mendapatkan itu. Ternyata komputer biasanya, akan selalu hanya menggunakan jumlah terbatas informasi untuk mewakili sesuatu. Benar? Setelah semua, kita hanya memiliki tetap jumlah ruang hard disk. Kami hanya memiliki jumlah tetap RAM, atau memori komputer. Dan jika Anda hanya memiliki jumlah tetap sesuatu, pasti Anda tidak bisa benar-benar menghitung hingga tak terbatas atau nomor yang Anda inginkan. Anda, jenis, harus memilih dan memilih apa yang rentang dari nilai Anda akan mendukung. Dan misalnya, satu atau dua minggu lalu, ketika kita berbicara tentang ASCII, dan kami berbicara sekitar 8 bit, atau byte, sehingga untuk berbicara, jumlah terbesar yang kami bisa mewakili dengan 8 bit adalah apa? 255. Dan kita dapat mewakili 256 Total nilai tapi tidak jika kita menghabiskan salah satu dari mereka pada 0-- Nah, tapi jika kita menghabiskan satu dari mereka pada 0, maka jumlah terbesar adalah, tentu saja, 255. Jadi ternyata, bahwa ini adalah kasus juga, dalam konteks ini. Kami mulai berbicara, terakhir kali, tentang angka floating-point, yang berbeda dari bilangan bulat, di bahwa mereka memiliki titik desimal dan, mudah-mudahan, beberapa nomor setelah itu, tetapi mereka juga. Sebuah komputer hanya biasanya akan menggunakan 32 bit, mungkin 64 bit untuk mewakili nilai floating point. Jadi meskipun kita sudah dewasa belajar matematika dan mengetahui bahwa Anda benar-benar dapat memiliki jumlah tak terbatas nomor setelah titik desimal, tidak jika Anda memiliki memori yang terbatas. Anda, jenis, harus bulat, atau memilih dan memilih nomor Anda akan mewakili. Dan sehingga Anda bisa memikirkan, dalam arti, yang ini komputer terdekat pendekatan dengan nilai 1/10 yang itu bisa, hanya dengan 32 atau lebih bit. Dan itu bukan hanya 1/10. Misalnya, jika saya mengubahnya ke 1/3, yang kami pikir bahkan lebih sederhana. Jadi 1 dibagi dengan 3. Biarkan saya menyimpan file. Biarkan aku pergi ke depan dan mengkompilasi ulang itu. Dan biarkan aku berjalan kembali itu. Di sini juga, tampaknya, 1/3 tidak 0,3 dan kemudian jumlah tak terbatas 3 ini sesudahnya. Anda memiliki ketidaktepatan ini di akhir. Jadi kita manusia yang benar, dan apa Anda pelajari adalah, pada kenyataannya, yang benar, tapi kami menabrak terhadap beberapa keterbatasan. Dan apa yang saya pikir kami akan lakukan hari ini, mulai dengan melihat, terus terang, konsekuensi tragis ini kadang-kadang, ketika umat manusia tidak cukup menerapkan realitas ini dan keterbatasan ini. Dan kita akan melihat serangkaian sketsa dari History Channel yang mengambil melihat bagaimana hal-hal yang tidak beres. Ini tentang 8 menit, dan kami akan kembali setelah ini dan lihatlah persis apa lagi yang bisa salah. Jika kita bisa meredupkan lights-- [VIDEO PLAYBACK] -Computers, Kita semua datang untuk menerima masalah yang sering frustasi yang pergi bersama mereka. Bug, virus, dan perangkat lunak gangguan yang harga kecil membayar untuk kenyamanan. Namun dalam teknologi tinggi dan kecepatan tinggi aplikasi militer dan program luar angkasa, masalah terkecil bisa diperbesar menjadi bencana. Pada tanggal 4 Juni 1996, para ilmuwan disiapkan untuk meluncurkan berawak roket Ariane 5. Hal itu membawa ilmiah satelit dirancang untuk menetapkan secara tepat bagaimana Berinteraksi medan magnet bumi dengan angin surya. Roket ini dibangun untuk European Space Agency dan lepas landas dari fasilitas yang di pantai Guyana. -dan Sekitar 30 detik ke penerbangan, mereka pertama kali sesuatu yang tidak beres melihat. Bahwa nozel yang berputar dengan cara mereka benar-benar tidak seharusnya. Sekitar 40 detik ke penerbangan, jelas kendaraan dalam kesulitan, dan saat itulah mereka membuat keputusan untuk menghancurkannya. Sebuah Safety Officer Range dengan nyali yang luar biasa menekan tombol, meledakkan roket sebelum bisa menjadi bahaya untuk keselamatan publik. -Ini Adalah gadis yang pelayaran dari Ariane 5, dan kehancuran mengambil menempatkan karena cacat tertanam dalam perangkat lunak roket. -The Masalah pada Ariane adalah bahwa ada adalah nomor yang diperlukan 64 bit untuk mengekspresikan, dan dia ingin mengkonversi untuk nomor 16 bit. Mereka beranggapan bahwa jumlah tidak pernah akan menjadi sangat besar, bahwa sebagian besar dari mereka digit di jumlah 64 bit adalah 0 ini. Mereka salah. -The Ketidakmampuan satu program perangkat lunak untuk menerima jenis nomor yang dihasilkan oleh lain adalah akar dari kegagalan. Pengembangan perangkat lunak telah menjadi sangat mahal bagian dari teknologi baru. Ariane 4 roket telah sangat sukses, begitu banyak perangkat lunak diciptakan untuk itu juga digunakan pada Ariane 5. -The Masalah dasar adalah bahwa Ariane 5 lebih cepat, lebih cepat dipercepat. Dan perangkat lunak belum menyumbang untuk itu. Kehancuran -The roket adalah bencana keuangan yang besar, semua karena kesalahan software menit. Tapi ini bukan yang pertama waktu masalah konversi data telah melanda teknologi roket modern. -Dalam 1991, dengan awal Perang Teluk Pertama, rudal Patriot mengalami serupa dari masalah nomor konversi. Akibatnya, 28 orang, 28 tentara Amerika tewas dan sekitar 100 lainnya luka-luka, ketika Patriot, yang seharusnya untuk melindungi terhadap Scud masuk, gagal untuk api rudal. -Ketika Irak menyerbu Kuwait dan Amerika diluncurkan Desert Storm pada awal tahun 1991, Baterai rudal Patriot dikerahkan untuk melindungi Arab Saudi dan Israel dari Irak Scud serangan rudal. Patriot adalah AS, jarak menengah permukaan-ke-udara sistem diproduksi oleh perusahaan Raytheon. -The Ukuran pencegat Patriot, itu sendiri, adalah tentang, kira-kira 20 kaki panjang. Dan beratnya sekitar 2000 pound. Dan itu membawa hulu ledak dari about-- Saya pikir itu sekitar 150 pound. Dan hulu ledak, itu sendiri, adalah ledak tinggi, yang memiliki fragmen sekitarnya. Casing hulu ledak adalah dirancang untuk bertindak seperti gotri. Rudal -The adalah dilakukan, 4 per kontainer, dan diangkut oleh semi-trailer. -The Sistem anti rudal Patriot kembali setidaknya 20 tahun sekarang. Ini pada awalnya dirancang sebagai rudal pertahanan udara untuk menembak jatuh pesawat musuh. Dalam Perang Teluk Pertama, ketika perang itu datang, Tentara ingin menggunakannya untuk menembak jatuh Scud, bukan pesawat terbang. Angkatan Irak tidak begitu banyak masalah, tapi Angkatan Darat khawatir tentang Scud. Dan sehingga mereka mencoba untuk upgrade Patriot. -Intercepting Musuh rudal bepergian di mach lima itu akan cukup menantang. Tapi ketika Patriot dilarikan ke layanan, Tentara tidak menyadari sebuah Modifikasi Irak yang membuat Scud mereka hampir mustahil untuk memukul. -Apa Yang terjadi, adalah Scud yang yang datang, tidak stabil, mereka bergoyang-goyang. Alasan untuk ini, adalah Irak, dalam rangka untuk mendapatkan 600 kilometer dari berbagai rudal 300 kilometer, mengambil berat dari hulu ledak depan dan membuat hulu ledak ringan. Jadi sekarang, Patriot yang mencoba untuk datang di gerakan cepat, dan sebagian besar waktu, mayoritas dari waktu, itu hanya akan terbang dengan gerakan cepat itu. -Setelah Operator sistem Patriot menyadari Patriot terjawab target, mereka meledakkan hulu ledak Patriot, untuk menghindari kemungkinan korban jika diizinkan untuk jatuh ke tanah. -Itu Adalah apa yang kebanyakan orang melihat, mereka bola api besar di langit, dan disalahpahami sebagai penyadapan dari Scud hulu ledak. Meskipun di malam hari langit, Patriots muncul menjadi berhasil menghancurkan Scud, di Dhahran, mungkin ada kesalahan tentang kinerjanya. Ada, sistem radar Patriot kehilangan jejak dari Scud masuk, dan tidak pernah diluncurkan, karena cacat perangkat lunak. Itu adalah Israel yang pertama kali menemukan bahwa semakin lama sistem itu pada, semakin besar perbedaan waktu menjadi, karena jam tertanam di komputer sistem. -Tentang 2 minggu sebelum tragedi di Dhahran, Israel dilaporkan Departemen Pertahanan, bahwa sistem itu kehilangan waktu, bahwa setelah sekitar 8 jam berjalan, mereka melihat bahwa sistem ini menjadi terasa kurang akurat. Departemen Pertahanan menanggapi dengan memberitahu semua baterai Patriot untuk tidak meninggalkan sistem pada untuk waktu yang lama. Mereka tidak pernah mengatakan apa waktu yang lama adalah. 8 jam? 10 jam? 1000 jam? Tak ada yang tahu. -The Baterai Patriot ditempatkan di barak di Dhahran, internal dan cacat nya Jam, telah di lebih dari 100 jam pada malam 25 Februari. -Hal Dilacak waktu untuk akurasi dari sekitar 1/10 detik. Sekarang 1/10 detik adalah jumlah menarik karena tidak bisa dinyatakan dalam biner, persis. Yang berarti, tidak bisa dinyatakan, tepatnya, di setiap komputer digital modern. Sulit untuk percaya, tetapi menggunakan ini sebagai contoh. Mari kita mengambil nomor, 1/3. 1/3 tidak bisa diungkapkan dalam desimal, persis. 1/3 adalah 0,333 berlangsung tak terhingga. Tidak ada cara untuk melakukan itu, dengan akurasi mutlak, dalam desimal. Itulah jenis yang sama Masalah yang terjadi di Patriot. Semakin lama sistem berlari, yang buruk kesalahan waktu menjadi. -Setelah 100 jam operasi, kesalahan dalam waktu hanya sekitar 1/3 detik. Tapi dalam hal menargetkan rudal bepergian di mach 5, itu mengakibatkan pelacakan sebuah error lebih dari 600 meter. Ini akan menjadi kesalahan fatal untuk tentara di Dhahran. -Apa Yang terjadi, adalah peluncuran Scud itu terdeteksi oleh satelit peringatan dini, dan mereka baru bahwa Scud itu datang ke arah umum mereka. Mereka tidak tahu di mana itu berasal. -itu Sekarang hingga radar komponen dari sistem Patriot, membela Dhahran, untuk mencari dan menjaga melacak rudal musuh masuk. Radar -The sangat cerdas. Ini akan benar-benar melacak posisi Scud dan kemudian memprediksi di mana mungkin akan, waktu berikutnya, radar mengirim pulsa keluar. Yang disebut gerbang jangkauan. -Lalu, Setelah Patriot memutuskan waktu yang cukup memiliki berlalu untuk kembali dan memeriksa berikutnya lokasi untuk objek yang terdeteksi ini, itu akan kembali. Jadi ketika kembali ke salah tempat, kemudian melihat ada objek dan memutuskan bahwa tidak ada objek, itu adalah deteksi palsu, dan tetes trek. Yang masuk Scud menghilang dari layar radar, dan detik kemudian, terhempas ke barak. The Scud menewaskan 28 dan yang terakhir satu dipecat selama Perang Teluk Pertama. Tragisnya, perangkat lunak diperbarui tiba di Dhahran hari berikutnya. Perangkat lunak cacat memiliki pernah tetap, penutupan salah satu bab dalam bermasalah sejarah rudal Patriot. [END PLAYBACK] DAVID J Malan: Jadi kita akan melihat pada beberapa keterbatasan yang sama hanya sedikit. Tapi pertama-tama, mari kita transisi ke beberapa FYI ini. Jadi satu-- akhir pekan ini, ada akan bagian super, yang dimaksudkan untuk menggantikan bagian yang dijadwalkan secara rutin, yang akan memulai seminggu maka. Lihatlah website CS50 ini untuk informasi lebih lanjut tentang mereka. Mereka juga akan difilmkan dan streaming hidup bagi mereka yang tidak hadir. Soal set 1 adalah pada situs saja yang sudah, dan kami akan melihat di bahwa hanya sedikit. Dan jam kantor juga, akan mengambil menempatkan Senin ini sampai Kamis. Jadi ini adalah yang paling kanonik Program kami melihat terakhir kali. Ini seperti yang paling sederhana Program Anda dapat menulis di C, dan bahkan itu sedikit berani mengklaim. Benar? Karena ada banyak tampak kompleksitas ini. Jadi mari kita cepat melihat apa beberapa elemen ini yang kemudian mencoba untuk memberikan model mental untuk bagaimana ini sederhana program bekerja, dan kemudian kami akan mulai melihat hal-hal yang lebih kompleks. Jadi baris ini di sini, disorot sekarang, warna kuning, apa yang kita katakan, terakhir kali, yang ini tidak untuk kita? Apa tujuan yang dilayaninya? Siapapun dari jauh kembali? Ya. AUDIENCE MEMBER: [tidak terdengar] DAVID J Malan: Baik. Sehingga memberikan Anda akses perintah, atau mari menyebutnya fungsi, bahwa seseorang lain menulis, yang menyatakan, sehingga untuk berbicara, dalam beberapa file lain. Jadi kita akan melihat apa file H adalah versus C file, akhirnya. Tapi untuk saat ini, hanya tahu printf itu, misalnya, adalah salah satu fungsi yang telah menyatakan dalam beberapa file lain, di suatu tempat lain pada hard drive awan yang memungkinkan kita untuk mengakses printf dan menggunakannya tanpa harus menemukan kembali bahwa roda diri kita sendiri. Sementara itu, utama. Apa analog utama, pekan lalu? Ya. AUDIENCE MEMBER: Hijau bendera diklik. DAVID J Malan: Ya. Scratch, saat bendera hijau diklik. Ini seperti potongan puzzle yang kicks hal off. Dan sama, melakukan dunia memutuskan beberapa tahun lalu bahwa dalam C, dan sekelompok bahasa lain, jika Anda ingin menulis sebuah program, Fungsi pertama Anda telah disebut, utama. Dan itu harus terlihat seperti ini. Tapi kami akan kembali, lain waktu, untuk apa, int, dan, batal, berarti dalam konteks itu. Untuk saat ini, kurung kurawal adalah jenis seperti potongan puzzle bentuk Scratch ini yang merangkum beberapa jumlah baris. Dan di antara di garis di sini, adalah salah satu ini di sini. printf adalah fungsi yang tujuannya di hidup adalah untuk mencetak string diformat. Dan oleh diformat, saya berarti Anda bisa pasang nilai placeholder, dan Anda dapat menentukan berapa banyak desimal poin, berapa banyak angka untuk mencetak setelah titik desimal dan sejenisnya. Dan printf, tentu saja, membutuhkan waktu satu atau lebih argumen atau parameter, atau dikenal, lebih sederhana, sebagai masukan. Jadi printf, seperti banyak fungsi, mengambil input. Dan masukan mereka dirangkul oleh dua kurung di sini. Dan dalam mereka adalah salah satu masukan. Ini string, seperti yang kita menyebutnya, yang hanya urutan karakter, seperti kata, atau frase, atau keseluruhan esai bahkan, di antara tanda kutip ganda. Dan itulah yang akan mempengaruhi perilaku printf karena, tentu saja, itu hanya fungsi cetak generik. Itu tidak akan tahu apa untuk mencetak, kecuali Anda kirim. Dan kemudian, beberapa hal-hal kecil. Apa yang kita katakan aneh ini urutan simbol adalah? Ya. AUDIENCE MEMBER: garis Baru. DAVID J Malan: garis Baru. Jadi ternyata, Anda tidak bisa hanya memukul, masuk, ketika Anda sedang menulis program. Umumnya, compiler akan mendapatkan agak bingung dengan apa yang Anda maksud. Sebaliknya, Anda harus benar-benar mengatakan, memberikan garis baru di sini. Dan / n adalah apa yang kita umumnya memanggil karakter melarikan diri. Jadi n, untuk baris baru. Dan compiler tahu bahwa ketika melihat / n, itu benar-benar harus mendorong komputer, akhirnya, atau printf, dalam hal ini, untuk mencetak sebuah baru yang sebenarnya line, seperti memukul, masukkan, tombol pada keyboard Anda. Dan terakhir, apa yang kita katakan ini bagian dari sintaks adalah untuk? Apa mewakili? Ya. AUDIENCE MEMBER: [tidak terdengar] DAVID J Malan: Ini hanya akhir baris. Ini akhir dari pernyataan itu. Dan menyadari bahwa kita tidak menempatkan mereka di mana-mana. Kita tentu tidak menempatkan mereka di ujung setiap baris. Misalnya, ada tidak ada pada Baris pertama, ada tidak ada pada baris dengan, utama, ada tidak ada yang setelah kurung kurawal, tetapi Anda akan mulai melihat dan mendapatkan akrab dengan mana itu disebut untuk. Dan itu hampir selalu setelah fungsi memanggil atau pernyataan, beberapa tindakan bahwa Anda benar-benar mengambil. Dan tahu sekarang, terutama jika di antara mereka kurang nyaman, ini adalah hal-hal yang bodoh bahwa Anda akan berakhir sengaja membenturkan kepala Anda ke dinding atas. Karena Anda akan logis percaya diri dalam beberapa masalah Anda telah diselesaikan untuk masalah set, dan sialan hanya tidak akan mengkompilasi atau bahkan berjalan. Dan begitu sering, awal, itu akan karena Anda melewatkan kurung, atau Anda melewatkan titik koma. Dan jadi hanya berhati-hati dari hal-hal seperti, dan mencoba untuk tidak frustrasi oleh mereka karena sangat cepat melakukan hal ini menjadi topi tua. Tapi itu sangat mudah untuk mendapatkan frustrasi sejak awal, sebagai hasilnya. Jadi sekarang, mari kita lihat bagaimana baris ini benar-benar bekerja dan kemudian melihat sedikit satu lebih rumit. Jadi kita memiliki lebih di sini, kemampuan untuk menggambar pada layar ini. Dan mari kita mengira bahwa ini layar komputer saya, tapi saya menulis, halo Program, dan saya belum diimplementasikan, printf. Orang lain telah dilaksanakan, printf. Yang ingin mengklaim telah dilaksanakan, printf? Jika kita dapat? Baiklah, siapa namamu? SISWA 1: [? Copal. ?] DAVID J Malan: Copal, datang ke atas. Ayo up. Baiklah. Jadi kita miliki, di sini, beberapa tag nama, karena kita akan membuat permainan sedikit ini. Dan kami akan menghubungi Anda, printf. Dan jika Anda ingin datang ke sini, apa yang baru saja ditarik pada layar, itu cukup sederhana, ada saya, ini. Baiklah, jadi, halo nama saya, printf, jika Anda ingin menempatkan bahwa pada. Baiklah. Dan jika Anda dapat pergi berdiri oleh layar komputer seolah-olah Anda adalah fungsi yang datang dengan sistem komputer ini. Dan tujuan Anda dalam hidup adalah untuk benar-benar mencetak sesuatu. Tapi banyak seperti program kami baru saja di layar, di sini, kita akan harus benar-benar memberikan beberapa masukan. Dan, jika saya masukan, di sini, adalah Rupanya, apa yang akan diteruskan ke printf, mari jenis mengejek itu seperti ini. Aku akan benar-benar menulis di selembar kertas, "halo, dunia," backslash N. Dan harus jelas, apa yang Saya baru saja ditarik pada kertas ini, terlihat seperti ini. Jadi ketika saya menjalankan program ini, dan ini garis kuning kode dijalankan, itu seolah-olah saya, program halo, saya menyerahkan beberapa masukan dari ke fungsi bahwa orang lain menulis. Dan jika Anda, dengan jari Anda, sebenarnya bisa, dengan jari Anda, menggambar pada layar apapun itu adalah Anda telah diserahkan, efeknya, akhirnya, adalah untuk melihat hal itu, di layar. Dan sudut kasus kecil di sini. Dan baik, kita tidak akan melihat , baris baru, pada saat ini. Ini akan menjadi salah untuk Anda secara eksplisit menggambar baris baru. Tetapi jika kita terus menulis kata-kata di layar, mereka akan berakhir di bawah itu. Jadi terima kasih banyak, tapi tetap di sini untuk hanya satu saat. Kita sekarang perlu satu lainnya relawan, jika kita bisa, itu akan perlu memainkan peran of-- Ini hanya orang-orang dalam orkestra sekarang. Bagaimana about-- OK. Disini. Ayo up. Siapa namamu? SISWA 2: [? Ivay. ?] DAVID J Malan: Maaf? SISWA 2: [? Ivay. ?] DAVID J Malan: Ethan, datang ke atas. Tidak? Apakah saya mendapatkan salah itu, bahkan setelah Anda mengatakan itu dua kali? Ayo up. Sulit untuk mendengar di sini. OKE. Dan aku minta maaf, siapa namamu? SISWA 2: [? Ivay. ?] [? DAVID J Malan: Ivay. ?] OKE. Untuk saat ini, jika Anda tidak pikiran, Anda GetString. SISWA 2: OK. Keren. DAVID J Malan: Jadi, jika Anda ingin untuk berdiri di sini untuk sesaat, mari kita lihat sedikit lebih program yang kompleks, yang kini memiliki tiga baris kode. Jadi kita memiliki, satu, sebutkan nama Anda menggunakan printf; dua, panggilan untuk GetString, diikuti dengan tugas untuk variabel disebut, string s, atau disebut s; dan kemudian panggilan lain untuk, printf, tapi kali ini dengan dua input. Jadi kita sudah melakukan negara Nama Anda, atau lebih tepatnya, kami telah sudah dilakukan panggilan printf. Jadi aku akan menulis, Sebutkan nama Anda. Dan, apa yang akan saya lulus, printf, hanya dalam beberapa saat, cukup sederhana, ini. Jadi jika Anda ingin pergi ke depan dan menarik ini di layar, itu masukan Anda sekarang. Baiklah. Dan lupa String, kita sekarang memiliki produk kami dari kode di sini. Jadi dalam, GetString, kita perlu untuk benar-benar memanggil, GetString. Jadi tujuan Anda dalam hidup adalah untuk hanya berjalan keluar ke orkestra, jika Anda bisa, dan mendapatkan nama seseorang. Tapi mari kita memberikan sesuatu untuk memakainya. Jika Anda ingin, pergi depan dan mendapatkan string, mendapatkan nama seseorang di bahwa selembar kertas, jika Anda bisa. Baiklah. Dan kita akan lihat, hanya dalam beberapa saat, yang namanya kita sudah. Sementara itu, apa yang akan saya telah siap, adalah bagian kosong kertas, di mana, aku akan untuk menyimpan nilai apapun yang adalah bahwa GetString adalah kembali kepada saya, Aku, menjadi variabel string disebut, s. Baiklah. Jadi apa yang Anda miliki di sini? Nik. Baiklah. Jadi kita memiliki nama Nik sini. Jadi ini adalah apa yang benar-benar telah dikembalikan bagi saya, sehingga untuk berbicara, dengan GetString. Saya, sekarang, saya akan mengeksekusi sisi kiri ekspresi itu, di mana saya hanya salin, untuk tujuan hari ini, Nik. Jadi sekarang, aku punya variabel disebut, s, menyimpan nama Nik. Aku sudah diserahkan kepada printf, argumen sebelumnya. Tapi di baris kami ketiga dan terakhir dari kode, saya benar-benar harus printf tangan sesuatu yang different-- sedikit "Halo,% s," backslash n. Dan baris terakhir aku akan untuk send-- hal terakhir aku akan menuliskan sekarang, adalah ini. Jadi dua baris kode, atau bukan baris terakhir kode, panggilan untuk dua inputs-- satu, ini, dan dua, ini. Jadi jika fungsi printf kami sekarang dapat mengambil ini sebagai masukan, biarkan aku membersihkan layar untuk Anda. Sebenarnya tidak ada, Anda dapat melanjutkan. Kami akan menyerahkannya, karena itu pada program yang sama. Kita harus melihat, halo, Nik. Baiklah. Jadi ini adalah beberapa lingkaran untuk melompat melalui, hanya menulis, menyatakan Anda nama, dan, halo, Nik. Tapi ini ide sederhana pesan lewat, input dan output lewat penerima, adalah model kita akan memiliki tepat bahkan fungsi yang paling kompleks. Jadi terima kasih banyak untuk Anda berdua. Kami memiliki stres yang indah bola di sini untuk Anda. Dan terima kasih kepada GetString kami dan relawan printf sama. Terima kasih. Baiklah. Terima kasih untuk Anda berdua. Jadi kita telah berbicara tentang sejauh ini, terutama tentang string. Dan ternyata C yang dapat benar-benar memahami tipe data beberapa yang berbeda. Bahkan, mari kita a melihat ini di sini. Jadi C, dan banyak bahasa, memahami hal-hal yang disebut karakter. Sebuah arang umumnya byte tunggal, atau delapan bit. Dan itu merupakan satu karakter, seperti huruf A, atau modal huruf A, atau huruf kecil A, atau tanda seru, atau karakter apapun yang Anda dapat mengetik pada keyboard Anda, dan kadang-kadang bahkan lebih. Kami juga kebetulan melihat mengapung. Sebuah float, umumnya, sebuah Nilai 32-bit, atau empat byte karena lagi, satu byte adalah delapan bit. Jadi pelampung adalah nilai floating point, sesuatu dengan titik desimal. Dan memang, itulah yang film ini berbicara ketika mereka berbicara tentang mengambang nilai titik, beberapa nomor tetap bit digunakan untuk mewakili bilangan real. Tapi ada juga hal-hal yang disebut ganda. Ini ada di Jawa, jika Anda telah mengambil APCS, dan ganda, sebagai nama untungnya menunjukkan, dua kali lebih besar sebagai pelampung. Ini masih bilangan real, itu hanya memiliki lebih banyak bit dengan yang pernah menjadi lebih tepat, atau untuk menyimpan nomor yang lebih besar. int mudah. Kami berbicara tentang itu terakhir kali. Ini hanya sebuah integer. Dan itu umumnya 32 bit, atau empat byte. Dan, jika Anda memiliki, mari kita lihat sekarang, 32 bits-- dan kami melakukan ini di minggu 0, pernah jadi briefly-- jika Anda memiliki 32 bit, apa yang terbesar nomor yang bisa mewakili sebagai integer? Berikan atau ambil? Ini seperti 4 miliar, dan itu hanya jika kita mewakili bilangan positif saja. Jika Anda memiliki 32 bit, dan Anda ingin mewakili angka negatif juga, kisaran Anda, pada dasarnya, negatif 2 miliar ke positif 2 miliar. Namun umumnya, kami akan mulai pada 0 pergi ke 4 miliar. Anda tidak perlu tahu persis, tapi kita bisa melihat ini, pada kenyataannya, jika saya hanya membuka kalkulator kecil, di sini. Aku bisa melakukan 2 32, dan itulah seberapa besar, berapa banyak nilai-nilai yang Anda bisa mewakili, dengan 32 bit. Dan itu kira-kira 4 miliar. Jadi kita akan terus melihat nomor yang di beberapa tempat yang berbeda. Tapi jika Anda perlu lagi angka dari itu, ternyata ada yang sesuatu yang disebut lama. Dan lama adalah umumnya 64 bit, yang berarti itu urutan besarnya bahkan lebih besar dari int. Jadi saya bahkan tidak bisa mengucapkan terbesar nomor yang dapat Anda mewakili, tapi itu nyata lebih besar. Sekarang sebagai samping, secara historis, jika int adalah 32 bit, dan lama adalah 64 bit, bagaimana besar adalah panjang, tidak lama? Anda akan berpikir itu lebih lama dari int tapi mungkin kurang panjang dari panjang panjang, tapi itu benar-benar tergantung. Dan ternyata salah satu frustrasi juga, dengan menulis kode pada sistem tertentu, adalah bahwa tidak semua jenis data ini memiliki nilai pra-ditentukan. Kadang-kadang ini banyak bit. Kadang-kadang banyak bit. Jadi Anda benar-benar harus tahu, kadang-kadang, hardware apa Anda menjalankan perangkat lunak Anda. Untungnya, bahasa lain dan tipe data lain yang sekarang ada, memungkinkan Anda untuk lebih tepatnya. Nah, kami melihat tali, dan kami melihat bool, juga, tapi ternyata mereka datang hanya dengan perpustakaan CS50. Jadi mereka tidak dibangun ke C. Mereka sebaliknya, datang dalam file disebut CS50.h, bahwa kita akan akhirnya mengupas lapisan-lapisan dari. Tapi untuk saat ini, mereka hanya jenis data tambahan. Sebuah bool adalah benar atau salah, dan string adalah rangkaian karakter, seperti sebuah kata. Sekarang printf, kita lihat, memiliki penampung,% s adalah salah satu. Dan Anda mungkin bisa, sekarang, menyimpulkan dari contoh-contoh lain, bagaimana Anda bisa memiliki placeholder untuk jenis data yang berbeda. Misalnya, mengambil menebak, jika Anda ingin mencetak satu char menggunakan printf, placeholder mungkin% c. Dan jika Anda ingin mencetak sebuah bilangan bulat dengan placeholder,% i. % lld adalah nilai desimal lama, tapi lama, sehingga peta itu. Dan kemudian% f untuk mengambang nilai titik atau untuk ganda, jadi kadang-kadang mereka digunakan kembali dalam konteks yang berbeda. Jadi kita akan melihat dan menggunakan beberapa dari mereka dari waktu ke waktu. Dan printf dan fungsi lainnya juga escape sequence dukungan orang lain, dan kadang-kadang, ini diperlukan. Jadi backslash n adalah baris baru. Backslash t, apakah ada ingin mengambil bacokan? AUDIENCE MEMBER: Tab. DAVID J Malan: Tab. Jadi, jika Anda benar-benar ingin untuk mencetak tab, tidak tetap jumlah ruang tapi sebenarnya karakter tab, Anda tidak memukul Anda, tab, tombol pada keyboard, umumnya, Anda benar-benar melakukan backslash t. Backslash kutip ganda, mengapa aku pernah ingin itu? Benar? Mengapa saya tidak dapat hanya mengetik kutipan ganda pada keyboard? AUDIENCE MEMBER: Karena, jika tidak, itu akan berpikir itu akhirnya dari seperti cetak Anda [? teks. ?] DAVID J Malan: Tepat. Ingat, dengan kami contoh printf, ketika kita melewati ke printf di input, di sebelah kiri dari string masukan yang dan di sebelah kanan input yang semi, tentu saja, adalah kutipan ganda. Jika masukan Anda sendiri memiliki ganda kutipan di tengah-tengah itu, komputer mungkin berpotensi bingung, untuk, melakukan kutipan ganda ini milik di tengah? Apakah itu milik dengan yang kiri? Apakah itu milik dengan orang yang tepat? Dan, jika Anda ingin membuat super jelas, Anda backslash kutip ganda, sehingga itu melarikan diri, sehingga untuk berbicara, dan itu tidak digabungkan untuk sesuatu yang lain. Dan ada beberapa orang lain di sini, r backslash, tanda kutip tunggal, 0, bahwa kita dapat melihat dari waktu ke waktu, juga. Dan sekarang, bagaimana dengan fungsi? Jadi tindakan yang dapat kita ambil sejauh ini dalam bahasa ini, C, baik, kita lihat, printf, tentu saja, dan semua yang lain pada layar, di sini, bahwa kita akan menggunakan untuk Tentu saja ini beberapa minggu pertama saja, datang ketika perpustakaan CS50. Dan mereka membuat lebih mudah, di C, untuk benar-benar mendapatkan input pengguna. Ternyata di C, dan terus terang dalam beberapa bahasa, itu sakit nyata di leher untuk melakukan sesuatu yang sederhana, seperti yang cepat pengguna untuk keyboard, untuk nya masukan. Dan fungsi-fungsi ini memudahkan. Dan juga memiliki kesalahan memeriksa seluruh, sehingga, ketika Anda ingat pada hari Rabu, kami melihat, coba lagi, peringatan, ketika saya tidak bekerja sama, dan saya mengetik kata, bukan angka? Kami telah melakukan angkat berat awal untuk memastikan pengguna bekerja sama. Tapi ini hanya pelatihan roda yang kita akhirnya akan, dan cepat, lepas landas. Jadi untuk rekap, maka, mari kita lihat, seperti yang kita lakukan dengan Scratch, di beberapa konstruksi kanonik di C. Hal ini dimaksudkan untuk, semacam dari, menjadi tur angin puyuh, hanya sehingga Anda memiliki referensi dan bahwa Anda telah melihat hal-hal pada awalnya. Tapi kemudian kita akan melihat coding yang sebenarnya menggunakan beberapa blok bangunan tersebut. Begitu banyak seperti di Scratch, ketika kita telah pernyataan seperti, katakan atau, tunggu, di C, kita memiliki fungsi juga, seperti printf. Jika kita ingin mengungkapkan kondisi di C, itu sama, semangat, itu potongan puzzle yang tampak seperti ini di Scratch. Tapi sebaliknya, kita harfiah hanya menulis, jika. Dan kemudian, dalam tanda kurung, kami menempatkan kondisi, dimana kondisi itulah yang kita akan menelepon, lagi, ekspresi boolean. Dan lagi, ini adalah semacam pseudo. Dan, pada kenyataannya, // adalah komentar. Itu hanya kata-kata bahasa Inggris untuk diriku sendiri. Tapi ini adalah umum Struktur dari, jika, kondisi. Tapi kita akan melihat beton contoh hanya dalam beberapa saat. Jika Anda ingin memiliki dua arah pertigaan jalan, seperti yang kita lakukan dengan relawan kami di Rabu, Anda dapat memiliki, lain jika. Dan jika Anda ingin memiliki ketiga dan Kondisi akhir, atau situasi default, Anda dapat memiliki hanya sebuah blok lain, ada. Dan sama, dengan ekspresi boolean, Anda bisa, dan, mereka bersama-sama. Dan kita melihat pada hari Rabu, yang itu bukan ampersand tunggal, itu dua, untuk alasan-tingkat yang lebih rendah yang kita akhirnya akan melihat dan bermain dengan. Hal-hal atau-ing bersama adalah 2 vertikal bar. Pada keyboard AS, ini umumnya kunci dengan tombol Shift di atas Anda Enter atau tombol Kembali. Lalu ada hal-hal yang kita akan menggunakan mungkin sekali atau dua kali. Mereka secara fungsional setara dengan apa yang dapat Anda lakukan dengan, jika, lain jika, lain jika yang lain, membangun, tapi mereka disebut switch. Mereka terlihat sangat berbeda, tapi kami akan melihat di beberapa kode distribusi kami, untuk masalah set masa depan, kemungkinan besar, yang kadang-kadang hanya cantik cara mengungkapkan keseluruhan sekelompok kondisi, tanpa banyak kurung kurawal dan banyak kurung dan lekukan. Tapi mereka memberi kita tidak lebih kekuatan dari yang kita sudah. Dan sekarang loop. Dan yang satu ini, kita akan melihat di sedikit lebih lambat. Tapi kemudian, kita akan mulai menggunakan ini, terutama bagi mereka yang sudah akrab. Ini adalah cara kanonik, jika sangat cara misterius, untuk menulis loop di C. Sekarang loop di Scratch adalah cukup sederhana. Anda memiliki, selamanya, blok. Anda memiliki, ulangi, blok dengan hanya nomor Anda harus mengetikkan. Dan dengan, untuk loop, Anda dapat menerapkan kedua ide-ide, tapi itu sedikit lebih teknis. Tapi terus terang, itu juga relatif sederhana. Setelah Anda tahu urutan operasi, Anda benar-benar hanya akan pasang di nilai dan memberitahu komputer apa yang harus dilakukan. Jadi, inilah contoh. Ini adalah lingkaran itu, cukup sederhana, menghitung dari satu nomor up melalui lain. Dan hanya dengan melirik itu, bahkan jika Anda memiliki pengalaman sebelumnya dengan bahasa ini, jumlah yang apakah itu mungkin mulai menghitung di? OK, 0. Dan aku menebak itu karena Anda melihat bahwa ada sebuah int dan i, yang merupakan variabel. Ini diinisialisasi ke 0. Dan kemudian, sepertinya kita melewati printf nilai. Dan, pada kenyataannya, saya membuat kesalahan ketik kecil di sini. Tapi itu mudah diperbaiki. Biarkan aku menambahkan, saya di sini. Kami sekarang memiliki printf makhluk berlalu bahwa nilai placeholder. Dan apa yang akan menghitung melalui? AUDIENCE: 50. 50. 49. DAVID J Malan: 49. Jadi 50, pada pandangan pertama, tampaknya benar. Tapi, ternyata, akan menjadi kondisi kita bahwa kita tetap memeriksa. Dan kita akan berhenti setelah i tidak lagi kurang dari 50. Jadi lingkaran ini, sebaliknya, harus mengeksekusi, asalkan saya kurang dari 50. Tapi segera setelah itu menjadi 50, atau 51, atau lebih buruk, harus berhenti secara otomatis. Baiklah. Jadi apa yang sebenarnya terjadi di sini? Jadi ini adalah urutan operasi untuk loop. Satu, Anda memiliki disebut inisialisasi. Disorot potongan kuning ini kode dijalankan pertama, dan memiliki efek yang, per Rabu, Anda mungkin bayangkan. Ini menciptakan sebuah variabel yang disebut i dan toko di variabel yang nilai 0. Jadi saya adalah 0 pada titik ini dalam cerita. Hal berikutnya yang terjadi dalam konstruksi ini, adalah bahwa kondisi akan diperiksa. Jadi saya cek langsung, adalah saya kurang dari 50? Dan tentu saja, jawabannya untuk saat ini, pasti, ya. Ya, karena saya adalah 0, dan yang pasti kurang dari 50. Lalu apa yang terjadi, adalah bahwa ini baris kode dijalankan. Dan pada kenyataannya, jika ada beberapa baris kode pada mereka kurung kurawal, mereka semua dijalankan satu demi satu. Dan dalam efek sini, Rupanya, untuk mencetak jumlah i, yang akan menjadi 0, kemudian 1, kemudian 2. Tapi kenapa? Mengapa itu bisa bertambah? Nah, hal keempat yang yang terjadi adalah bahwa sintaks ini dijalankan, setelah titik koma. i ++ adalah cara singkat untuk mengatakan; mengambil nilai i, dan tambahkan 1 untuk itu; dan kemudian pada waktu berikutnya, tambahkan 1 untuk itu; dan waktu berikutnya, tambahkan 1 untuk itu. Jadi jika kita terus, apa yang akan terjadi selanjutnya saya tidak akan menginisialisasi saya lagi. Jika saya terus melakukan inisialisasi i ke 0, contoh ini tidak akan pernah berakhir karena saya akan terjebak pada 0. Tapi apa yang akan terjadi adalah bahwa kondisi akan diperiksa, baris kode akan dijalankan, i akan bertambah, Kondisi akan diperiksa, Kode akan dijalankan. Dan itu terus bersepeda lagi, dan lagi, dan lagi, sampai saya ++ menginduksi nilai 50. Kondisi ini kemudian mengatakan, adalah 50 kurang dari 50? Jawabannya, tentu saja, tidak ada, dan sehingga seluruh kode berhenti mengeksekusi. Dan jika Anda memiliki lebih kode pada layar bawah, itulah apa yang terjadi selanjutnya. Itu muncul dari ini kurung kurawal dan terus mencetak lagi setelah itu. Jadi lelucon sekarang, dari Foxtrot, yang Anda mungkin akan sekarang mengerti. Itu selalu lucu. Ini seperti terkekeh jenis meresap, dan kemudian Anda sadar bahwa Anda tidak harus menjadi menertawakan humor seperti ini. Tapi ada beberapa takeaway di sini, pedagogis, juga. Jadi ternyata bahwa aku hilang sepotong sintaks, atau Foxtrot yang hilang sepotong sintaks sini. Apa yang hilang, bahwa kami sudah di setiap contoh lainnya, sejauh ini? Kembali, ada, sehingga itu sesuatu yang lain, bahwa kita akan kembali ke sebelum lama. Apa yang hilang, meskipun? Ya. AUDIENCE MEMBER: The inisialisasi [tidak terdengar]. DAVID J Malan: OK. Jadi ya. Jadi sebenarnya, ini is-- Nah, dan jumlah diinisialisasi di atas, atau lebih tepatnya, dinyatakan di atas. Jadi ini adalah cara lain untuk melakukannya. Tapi tidak dalam satu garis itu berlaku sekalipun. Bagaimana di sini? AUDIENCE MEMBER: Apakah kurung kurawal? DAVID J Malan: Ya. Jadi kurung kurawal hilang. Tapi kode ini, maksudku, untuk kredit mereka, sebenarnya, sintaksis yang valid. Ternyata, Anda tidak perlu kurung kurawal jika Anda hanya memiliki satu baris kode yang Anda ingin mengeksekusi dalam loop. Sekarang kita selalu, di kelas dan di semua kode distribusi kami, termasuk kurung kurawal lagi pula, hanya demi kejelasan. Tapi menyadari bahwa dalam buku teks dan contoh online, Anda mungkin sangat baik melihat keriting kawat gigi hilang kadang-kadang. Dan itu OK, jika apa yang Anda telah menjorok dan dimaksudkan hanya satu baris kode, dan tidak beberapa baris kode, berpotensi. Baiklah. Jadi terkait dengan isu ketidaktepatan, adalah masalah overflow, dalam arti bahwa, sama, jangan bilangan bulat memiliki batas kepada mereka seperti nilai floating point? Dalam dunia floating point nilai-nilai, kita hanya bisa begitu tepat, setelah itu, kadang-kadang hal-hal buruk bisa terjadi, dan program kami dapat buggy dan kesalahan. Sekarang bahkan dengan bilangan bulat, Anda dapat mengalami masalah. Sekarang integer tidak memiliki titik desimal atau angka setelah. Itu hanya sejumlah alami, biasanya. Jadi apa yang bisa salah dengan int? Jika saya menggunakan int untuk menghitung, apa yang bisa salah? Tampaknya jauh lebih sederhana. Ya. AUDIENCE MEMBER: Jika Jumlah mendapat [tidak terdengar] DAVID J Malan: Ya. Bagaimana jika Anda menghitung begitu tinggi, bahwa Anda tidak bisa mengungkapkan bahwa jumlah yang sangat besar. Benar? Pada titik tertentu, Anda akan melebihi batas dari nilai 32-bit atau 64-bit nilai. Sekarang lagi, aku tidak yakin bagaimana mengucapkan nilai 64-bit, tapi aku tahu dengan 32-bit integer, nilai terbesar bisa, jika itu hanya positif nilai-nilai, kira-kira 4 miliar. Jadi jika saya mencoba untuk menghitung sampai 5 miliar, sesuatu yang akan terjadi. Tapi mari kita lihat apa, pada kenyataannya, bisa terjadi. Dalam dunia integer overflow, di mana Anda, dalam arti, meluap kapasitas dari integer, apa yang akan terjadi? Jadi, inilah bilangan biner, itu sebuah kemunduran untuk 0. Ini semua 1 itu, dan penampung ada, adalah kekuatan dari 2, jadi ini adalah biner. Jadi ini adalah 8, 1 bit pada layar. Dan jika Anda ingat atau Anda dengan cepat melakukan matematika, apa nilai yang diwakili di sini dengan delapan 1 bit? 255. Dan bahkan jika Anda tidak cukup yakin matematika, Anda bisa melakukan itu. Atau Anda bisa hanya jenis alasan melalui itu, tunggu sebentar, jika saya mewakili nilai 8 bit, dan aku punya 256 nilai yang mungkin, tapi yang pertama adalah 0, Aku hanya tahu bahwa terbesar akan menjadi 255, dan itulah yang satu ini mungkin. Jadi misalkan saya mencoba untuk menambahkan 1 ke nilai ini. Apa yang akan Anda lakukan di kelas sekolah saat menambahkan 1, dan tidak benar-benar cocok karena Anda harus membawa 1? Apa nomor ini akan untuk menjadi ketika Anda menambahkan 1? Ini akan menjadi 0. Benar? Karena jika Anda memiliki lebih banyak bits-- dan aku akan mencoba, jenis, tipe itu di sini- jika kita memiliki lebih bit, apa yang kita bisa lakukan di sini adalah menambahkan 1, dan kemudian kita akan mendapatkan ini. Whoops. Kami akan memiliki 1 bit sepanjang jalan di sini. Tapi jika ini adalah terbatas nilai, itu hanya 8 bit, dan itulah yang telah ditentukan oleh komputer, yang 1 adalah efektif tidak ada. Ini hanya semacam jatuh dari tebing. Dan jika Anda menambahkan 1-255, apa nilai yang Anda tampaknya mendapatkan? 0. Dan angka sengaja, dan mungkin, tidak sengaja, berakhir membungkus sekitar seperti ini. Jadi apa yang bisa menjadi implikasi dari ini? Nah, ada beberapa hal yang berbeda. Jadi satu, itu berakhir tampak seperti 0, tidak sengaja, tetapi Anda dapat melihat jenis, bahkan di dunia nyata, untuk lebih baik atau buruk, manifestasi dari ide ini dari batas. Misalnya, ada di antara kalian yang pernah bermain Lego Star Wars, tidak ada yang kebetulan tahu jumlah maksimum koin Anda dapat mengumpulkan di Lego Star Wars? Mengambil menebak berdasarkan pertanyaan terkemuka hari ini. Ini lebih besar dari 256 atau 255. Ini 4 miliar. Jadi ternyata, dan ada beberapa people-- beberapa Googling dikonfirmasi night-- lalu mendapatkan 4 miliar koin emas, atau yang lainnya, di Lego Star Wars. Meskipun tampaknya, ada cara untuk mengelabui permainan, ada bug atau fitur, yang memungkinkan Anda hanya bertambah banyak dan banyak poin. Tapi mungkin terbesar nilai, menurut ke layar ini ditembak dari seseorang yang saya ditemukan secara online, memang, 4 miliar. Sekarang kenapa begitu? Justru 4 miliar, mungkin karena seseorang memutuskan, yang sedang menulis game ini, bahwa mereka bisa melakukan 4 miliar, sesuatu, sesuatu, sesuatu, seperti nilai saya memasang dengan kalkulator sebelumnya, tapi itu hanya sedikit lebih bersih bagi manusia mengatakan jumlah maksimum dari coins-- atau kancing, seperti yang mereka sebut them-- yang Anda dapat mengumpulkan adalah 4 miliar. Dan, mengapa ini? Bagaimana game LEGO menerapkan counter yang melacak jumlah uang yang Anda miliki? Mereka menggunakan apa? AUDIENCE MEMBER: Berhenti menghitung setelah 4 miliar. DAVID J Malan: Berhenti menghitung setelah 4 miliar, yang berarti Anda dapat menyimpulkan, sebagai programmer, bahwa mereka mungkin menggunakan 32 bit integer. Seperti programmer harfiah hanya diketik, int, dalam kode nya, dan itulah jenis variabel yang mereka gunakan untuk menyimpan kode seseorang. Jadi ada manifestasi lainnya dari jenis-jenis batas. Jadi saya tidak bermain game-- ini dan saya membaca di sejarah untuk mengkonfirmasi sebagai much-- tetapi dalam Versi asli dari Peradaban, di mana Anda tampaknya berinteraksi satu sama lain dan dapat berperang atau memiliki damai, Gandhi seharusnya menjadi salah satu karakter paling damai, seperti yang saya memahaminya, dalam pertama versi Peradaban. Dan pada kenyataannya, pada skala 1 sampai 10, agresivitas nya hanya 1. Jadi pernah jadi sedikit agresif, rupanya. Tapi di beberapa titik, Anda dapat rupanya menginstal demokrasi dalam geografi Anda. Dan jika Anda menginstal demokrasi dalam versi permainan, maka tingkat agresi Anda turun. Ini adalah hal yang baik. Orang lebih tenang Rupanya, dalam situasi itu. Namun ternyata, seseorang melakukan tidak memiliki, jika, kondisi dalam versi asli dari kode. Jadi tingkat agresi Gandhi pergi dari positif 1, minus 2, menjadi negatif 1, tapi permainan tidak memahami angka negatif. Jadi apa yang terjadi adalah agresi Gandhi Tingkat pergi dari 1, dengan 0, ke negatif 1, yang memiliki efek membungkus sekitar untuk menjadi karakter paling agresif dalam permainan, pada nilai 255, pada skala 1 sampai 10. Dan sejak itu, telah ada lebih inkarnasi dari game ini, dan mereka sudah menyimpannya sebagai semacam telur Paskah, bahwa Gandhi tampaknya sehingga sangat agresif. Tapi itu hasil dari kesalahan pemrograman yang sangat sederhana dalam versi awal permainan. Sekarang, lebih mengganggu, lebih baru-baru ini, Boeing 787 didokumentasikan sebagai memiliki bug, bukan jenis perangkat Anda sangat ingin memiliki bug. Dan gejala, yang saya akan baca di sini, dari sebuah artikel online, adalah ini, model 787 pesawat yang telah didukung terus untuk 248 hari dapat kehilangan semua arus bolak-balik, AC, daya listrik, karena unit kontrol pembuat, GCUs, secara bersamaan masuk ke mode fail-safe. Jadi ini adalah peringatan yang dikeluarkan ketika masalah ini ditemukan. Kondisi ini disebabkan oleh counter software, internal ke GCUs, sehingga integer atau variabel, yang akan meluap setelah 248 hari power secara berkelanjutan. Boeing adalah dalam proses mengembangkan software upgrade GCU yang akan memperbaiki kondisi tidak aman. Begitu mirip rudal skenario, dimana mereka memiliki beberapa jenis variabel yang menghitung, dan menghitung, dan menghitung, namun secara bertahap meluap batas-batas kemampuan, sama melakukan pesawat sialan memiliki overflow variabel setelah cukup waktu berjalan. Dan cara lidah-di-pipi dari bekerja di sekitar masalah ini adalah untuk benar-benar, reboot, pesawat Anda setiap 247 hari, sehingga memori akan dihapus dan variabel kembali ke 0. Tapi menyadari, ini adalah sangat inkarnasi besar perangkat lunak, tapi terutama karena kita mendengar tentang Apple sistem operasi pergi ke mobil, dan mobil diri mengemudi dari Google, dan sejumlah inkarnasi dari perangkat lunak dalam kehidupan kita sehari-hari, TV dan jam tangan, dan banyak lagi, menyadari dikelilingi oleh perangkat lunak, semua yang ditulis oleh kita manusia. Dan seperti yang kita semua akan segera menemukan, itu sangat mudah dan sangat khas untuk membuat kesalahan ketika menulis perangkat lunak. Dan jika Anda tidak menangkap mereka, beberapa hal-hal buruk bisa terjadi. Sekarang kadang-kadang, beberapa hal-hal lucu bisa terjadi, atau setidaknya kadang-kadang kita tahu untuk mengharapkan beberapa keburukan. Jadi 0 dibagi dengan 0, dari kelas sekolah, umumnya merupakan hal yang buruk. Ini tidak terdefinisi. Dan ternyata out-- dan mari kita lihat apakah mic saya dapat memilih ini up-- bahwa Apple memiliki beberapa menyenangkan dengan ini baru-baru. Jadi saya memiliki iPhone sini. Aku akan berbicara dengan Siri dan memintanya untuk memberikan jawaban 0 dibagi dengan 0. Apa yang 0 dibagi dengan 0? SIRI: Bayangkan bahwa Anda memiliki 0 cookie, dan Anda memisahkan mereka merata antara 0 teman. Berapa banyak cookie tidak setiap orang mendapatkan? Lihat? Ini tidak masuk akal. Dan Cookie Rakasa sedih bahwa tidak ada cookie. Dan Anda sedih bahwa Anda tidak memiliki teman. DAVID J Malan: Ini semacam menjengkelkan. Jadi ini adalah apa yang hanya mengatakan ada. Ini tak tentu, itu tidak didefinisikan, dan memang, banyak bahasa pemrograman atau, benar-benar, kompiler akan mendeteksi ketika Anda, dalam program, mencoba untuk membagi 0 oleh 0. Lebih menyenangkan daripada meskipun ini, adalah yang ternyata, Cookie Rakasa adalah di Twitter hari ini. Dan dia menjawab ini, dengan ini, yang benar-benar menggemaskan. Tapi mari kita cepat melihat beberapa konstruksi lainnya, dan kemudian menempatkan beberapa ini kode untuk digunakan, dengan cara-cara yang baik. Jadi ternyata, selain untuk loop, ada sesuatu yang disebut loop sementara, yang terlihat berbeda dan diimplementasikan sebuah differently-- sedikit dan kita akhirnya akan melihat examples-- tetapi dalam beberapa hal, itu sederhana karena tidak memungkinkan Anda untuk menginisialisasi dan memperbarui dalam batas loop. Anda masih dapat menerapkannya. Sehingga Anda dapat melakukan hal yang sama persis dengan loop sementara, seperti dengan untuk loop, tapi sintaks Anda, ultimately-- seperti yang akan kita akhirnya see-- akan menjadi berbeda. Bahkan ada do while, yang sebenarnya sedikit berbeda, dalam sedangkan untuk loop dan loop sementara selalu memeriksa kondisi pertama mereka, jika Anda membaca hal ini atas ke bawah, jenis terlihat seperti itu akan memeriksa kondisi itu lalu karena itu benar-benar baris terakhir kode. Dan memang, itu akan berguna dalam program-program tertentu yang kita tulis, jika Anda ingin hanya membabi buta melakukan sesuatu dan akhirnya memeriksa kondisi. Itu tidak selalu berarti buruk. Jika kita ingin variabel, kita dapat melakukan dalam beberapa cara yang berbeda. Dan kami melihat di Foxtrot yang kartun, salah satu cara untuk melakukannya, di mana Anda mendeklarasikan variabel Anda, seperti int kontra titik koma, dan kemudian later-- mungkin berikutnya line, mungkin 10 baris later-- Anda benar-benar menginisialisasi itu. Jadi ini 2 baris kode mendeklarasikan variabel bertipe int dan menyebutnya counter, sehingga memberikan saya cukup bit untuk mengadakan int. Dan kemudian akhirnya, menempatkan nilai 0 ke variabel itu. Ini mengatur 0 dan 1 dalam pola, yang kita tahu dari minggu lalu, merupakan jumlah yang kita kenal sebagai 0. Atau terus terang, Anda dapat melakukan hal ini banyak lebih ringkas, hanya seperti ini. Sekarang kami juga memiliki kemampuan untuk memanggil fungsi. Dan pada kenyataannya, inilah garis 2 program, atau kutipan dari padanya, yang memungkinkan kita untuk benar-benar menulis beberapa kode yang mendapat string dari user-- jauh seperti relawan kami sejenak ago-- menyimpan hasil di variabel disebut nama, dan then-- seperti dengan relawan kami dengan cetakan printf-- keluar nilai-nilai dengan melewatkan dua argumen, yang String, diikuti oleh variabel disebut, nama, sendiri. Jadi mari kita lihat, sebelum kita kembali ke Mario sana, di beberapa sekarang, contoh ini. Aku akan pergi ke depan dan terbuka up, katakanlah, fungsi-0.c. Dan seperti biasa, kode ini tersedia di website saja yang, sehingga Anda dapat bermain bersama di rumah dan melihat nanti. Tapi di sini program di dalamnya Intinya, dari garis 17-22. Program utama adalah di mana Program selalu akan mulai. Program ini, tampaknya, akan untuk mencetak nama Anda, usus. Ini kemudian akan menelepon GetString, seperti yang kami lakukan dengan relawan kami. Dan kemudian, ini menarik, itu akan memanggil PrintName. Ternyata, selama ini, ada tampaknya menjadi fungsi yang disebut PrintName. Yang mencetak nama seseorang. Kami tidak perlu menggunakan printf dari tadi, ada PrintName. Tapi itu menyesatkan karena PrintName tidak datang dengan C. Orang tidak menciptakan itu sekitar 40 atau 50 tahun yang lalu, Saya lakukan, sebagai gantinya. Dan pada kenyataannya, jika saya gulir turun lebih lanjut, pemberitahuan bagaimana saya bisa menulis saya sendiri fungsi dalam C. Kami akan akhirnya menjelaskan mengapa kita selalu mengatakan, kekosongan, di beberapa tempat, tapi untuk saat ini, mari kita hanya melihat nama. On line 24, jika Anda ingin membuat fungsi sendiri, Anda benar-benar menulis nama fungsi. Saya memilih PrintName. Dalam kurung, Anda kemudian menentukan apa jenis input, dan berapa banyak Anda ingin fungsi ini untuk mengambil. Dalam hal ini, saya ingin mengambil 1 variabel disebut, nama, dan itu akan menjadi Jenis, string, sehingga akan ada beberapa urutan karakter. Dan kemudian, program-- ini seperti di Scratch, Anda dapat memiliki teka-teki kustom pieces-- akan memiliki perilaku kebiasaan ini. Ini akan memanggil printf melintas di, halo, placeholder, dan kemudian itu akan pasang dalam apa pun pengguna yang disebut. Jadi ini adalah contoh dari apa yang seorang ilmuwan komputer akan abstraksi panggilan atau fungsional dekomposisi, yang hanya cara mewah saying-- Apakah jika Anda menyukai ide tingkat tinggi ini, seperti aku ingin fungsi yang mencetak nama seseorang, benar-benar Anda harfiah dapat menulis printf dan kemudian lulus dalam argumen yang Anda inginkan, dan program akan bekerja, karena memiliki sejak Rabu. Tapi Anda bisa mulai untuk abstrak pergi gagasan mencetak nama. Anda dapat memberikan nama, seperti PrintName, dan ini adalah ide ini dari layering dari minggu 0. Sejak saat itu, saya dan Anda tidak perlu tahu atau peduli berapa PrintName diimplementasikan. Ya itu menggunakan printf, mungkin itu tidak, siapa yang tahu apa yang menggunakan? Siapa peduli? Sekarang saya sedang berbicara di sini, bukannya di sini. Dan memang, sebagai program kami mendapatkan lebih maju dan canggih, kita akan terus mengambil untuk diberikan bahwa potongan puzzle tingkat rendah ada. Karena kita menulis mereka atau orang lain lakukan, sehingga bahwa kita kemudian dapat membangun di atas mereka. Mari kita lihat ini varian, berfungsi satu. Jadi yang satu ini sedikit lebih canggih, tapi ternyata bahwa di perpustakaan CS50 ini, hanya ada fungsi getInt. Kami tidak berpikir, tahun lalu, untuk mengimplementasikan fungsi GetPositiveInt. Dan itu sedikit mengganggu karena jika kalian menulis sebuah program dimana Anda ingin mendapatkan yang positif bilangan bulat dari pengguna, Anda benar-benar dapat menggunakan getInt. Dan Anda benar-benar dapat memeriksa dengan kondisi dan mungkin satu lingkaran jika itu int lebih besar dari 0 dan berteriak pengguna jika dia tidak memberikan Anda angka positif. Tapi mari kita membangun ini bangunan memblokir diri kita sendiri, sebuah, sepotong Scratch kustom, jika Anda mau. Aku akan memiliki program di sini bahwa pada akhirnya, saya ingin dapat menelepon GetPositiveInt, dan saya ingin menjadi mampu mencetak apa pun yang int adalah. Tapi ini disarikan pergi sekarang. Itu hanya diberikan tingkat tinggi Nama yang mengatakan apa yang dilakukannya, yang indah karena itu sangat intuitif sekarang untuk membaca. Dan jika saya melakukan peduli apa yang di bawahnya kap mesin, biarkan aku gulir ke bawah. Dan itu sedikit menakutkan pada awalnya, terutama jika ini adalah program pertama Anda, tapi mari kita lihat. Saya tidak lagi mengatakan, kekosongan, karena ternyata fungsi, seperti GetString, bisa mengembalikan nilai bagi saya. Mereka tidak hanya memiliki untuk mencetak ke layar, mereka benar-benar dapat tangan saya sesuatu kembali. Dan padahal sebelumnya PrintName, Aku tidak perlu apa-apa kembali. Aku butuh efek samping sesuatu muncul di layar, tapi aku tidak membutuhkan manusia untuk menyerahkan sesuatu kembali. Di sini, dengan GetPositiveInt, seperti dengan getInt, Saya ingin diserahkan sesuatu kembali. Jadi saya katakan tidak, batal, pada baris 23, tapi int, yang mengatakan, fungsi ini bahwa saya menulis, disebut GetPositiveInt akan tangan saya kembali integer, tidak apa-apa, tidak batal. Sementara itu, itu akan mengambil tidak input, jadi saya sudah, jenis, dibalik itu. Aku tidak memberikan GetPositiveInt apapun masukan, saya ingin memberikan output. Dan kemudian apa yang terjadi sekarang? Jadi di sini adalah bagaimana saya bisa mendeklarasikan variabel. Saya sudah melakukannya di luar loop, untuk alasan kita akhirnya akan melihat, tapi ini hanya memberikan saya 32 bit disebut, n, dan saya sudah pra-menentukan mereka untuk menyimpan integer. Dan inilah yang, lakukan saat membangun, dan ini adalah mengapa itu berguna. Secara harfiah melakukan ini, sedangkan n kurang dari 1. Jadi mari kita lihat apa yang terjadi. Saya mencetak, silakan memberi saya int positif. Saya kemudian mendapatkan int, menggunakan CS50 ini berfungsi dan disimpan dalam n. Dan kemudian, apa baris kode mungkin dijalankan berikutnya, secara logis? Baris yang nomor? Ya, jadi 31. Anda tidak akan tahu ini sampai Anda sudah diberitahu atau semacam menyimpulkan itu, tapi itu benar. Ia pergi atas ke bawah dan kemudian terus mengulangi. Jadi jika saya telah mengetik di mengatakan, jumlah negatif 1, adalah n kurang dari 1 negatif? Ya. Karena negatif 1 kurang dari 1. Jadi apa yang harus terjadi? Aku akan melakukan hal ini sedangkan n kurang dari 1, jadi saya akan kembali ke garis 28. Dan masing-masing time-- dan mari kita jalankan this-- membuat fungsi 1 melakukan kompilasi, dan sekarang dot slash fungsi 1. Jika saya ketik negatif 1, itu akan terus berteriak padaku sampai aku bekerja sama karena masing-masing input saya kurang dari 1 dan jika itu sementara kurang dari 1, Aku akan terus melakukan hal ini. Jika saya akhirnya memberikan nomor seperti 50, untungnya, ia mengatakan, terima kasih untuk 50. Mengapa? Karena begitu n tidak kurang dari 1, saya berhenti terjebak dalam lingkaran ini, dan kata kunci baru ini hari ini, kembali, secara harfiah melakukan itu. Jadi saya baru saja dilaksanakan, dalam akal, setara dengan GetString, di mana aku menyerahkan kembali ke siapa pun yang menggunakan saya, beberapa nilai. Tidak harus string, itu adalah int. Jadi sederhana, cepat Misalnya, tapi kami akan segera melihat beberapa lebih canggih versi masih. Bahkan, mari kita lihat sebuah satu numerik, yang disebut return.c. Dan yang satu ini benar-benar sedikit lebih sederhana. Jadi tujuan program ini di life-- mari kompilasi dan menjalankannya, sehingga membuat kembali, dot slash, pemberitahuan return-- Program hanya kubus nilai 2. Ini sangat bodoh, sulit kode, tidak mengambil input apapun, tetapi tidak menunjukkan lain Fungsi yang saya tulis sendiri. Jadi di sini, saya sudah menyatakan variabel, disebut x, tipe int, sama dengan nomor 2, benar-benar sewenang-wenang. Ini hanya beberapa pencetakan halus. Dikatakan x sekarang, seperti dan seperti, cubing dot dot dot. Dan sihir ini rupanya sejalan 21. Saya menelepon fungsi yang disebut, kubus, Saya menyerahkannya selembar kertas dengan nomor 2 tertulis di atasnya, dan apa nilai, matematis, saya ingin keluar dari itu? Sama seperti cek kewarasan? 8. Benar? Aku ingin 2 potong dadu kembali, 2 untuk kekuatan 3, jadi 8 kembali. Jadi mana kubus diimplementasikan? Nah, pemberitahuan itu dilaksanakan di sini. Dan seperti sebelumnya, secara logis, meskipun sintaks mungkin sangat baru untuk banyak dari Anda, Saya ingin fungsi ini untuk tangan saya kembali selembar kertas dengan int di atasnya. Jadi saya memiliki int, yang Nama sewenang-wenang, tapi nyaman disebut kubus. Input untuk itu, adalah n ketik integer, jadi itu bagaimana saya bisa lulus dalam jumlah 2 pada selembar kertas. Dan kemudian ternyata C mendukung matematika, sehingga Anda tidak memiliki x untuk kali, Anda hanya menggunakan tanda bintang untuk perkalian. Dan ini kembali kali n n kali n, yang hanya nilai potong dadu. Jadi di mana kita akan pergi dengan semua ini? Ini jelas merupakan tur angin puyuh, yakinlah, bahwa dalam bagian yang super dan di masalah set 1, Anda akan berjalan melalui semua ini semua lebih. Dan di masalah set 1, kami akan transisi dari dunia grafis dari Scratch untuk sesuatu baris perintah lebih di C. Tapi kita akan menarik inspirasi dari sini permainan ini dari masa lampau, dimana menggunakan C dan edisi standar p set Anda akan menerapkan piramida Mario. Dan dalam edisi hacker dari p set, jika Anda memilih untuk memilih, Anda akan menerapkan sedikit lebih menantang piramida dengan dua puncak. Anda juga akan menerapkan algoritma, algoritma serakah. Ternyata ada yang beberapa logika yang menarik balik proses menjalankan stasiun kasir dan benar-benar menyerahkan seseorang perubahan kembali. Ada sebuah algoritma yang cukup mudah, Anda bahkan mungkin pegang intuitif ketika Anda pertama kali membaca itu-- menyadari itulah yang aku selalu dilakukan setiap kali aku diberi seseorang beberapa uang back-- yang memungkinkan Anda untuk selalu meminimalkan jumlah catatan kertas atau uang logam bahwa Anda menyerahkan kembali ke pengguna. Dan ini, tentu saja, adalah menarik karena jika Anda pergi ke CVS atau entah apa lagi, Anda tidak ingin menjadi tangan sejumlah besar orang-orang atau sejumlah besar uang. Anda ingin paling sedikit koin, mungkin, mungkin. Akhirnya, Anda juga akan ditantang untuk mencoba-coba di dunia air dan benar-benar mendapatkan apresiasi untuk pemetaan antara tingkat aliran, dari suka, air mandi, berapa banyak air yang digunakan. Dan kiasan didalamnya, akan klip ini di sini, yang kita akan berakhir selama hanya 60 detik, yang melukiskan gambaran aliran rendah mandi kepala. [VIDEO PLAYBACK] -Baiklah. Aku punya segalanya di sini. Saya mendapat Cyclone F Series, Hydra, Jetflow, Stockholm Supersteam, Anda nama itu. -Dan Apa yang Anda rekomendasikan? -Apa yang sedang Anda cari? Pria -Kekuatan. Kekuasaan. -seperti Silkwood. -Itu Untuk radiasi. -Betul. -Sekarang Apa ini? -itu Yang Commando 450. Saya tidak menjual satu. -Tapi Itulah yang kami inginkan. Ini adalah komando 450. -Tidak Percayalah. Ini hanya digunakan di sirkus. Ini untuk gajah. -aku Membayar apa-apa. -Apa Tentang Jerry? -Dia Tidak bisa menangani itu. Dia halus. Oh ya. [END PLAYBACK] DAVID J Malan: Baiklah. Itu kalau untuk CS50. Kita akan melihat Anda minggu depan. SPEAKER 1: [? Scully?], [? Ian,?] sejauh proyek outro ini, apa yang telah kalian datang dengan? SPEAKER 2: Yah, kami telah memberikan itu berbagai pemikiran, dan kami berpikir bahwa cara terbaik to-- SPEAKER 3: May I? SPEAKER 2: Ya. Dengan segala cara, sebenarnya. SPEAKER 3: Jadi saya pikir kita dapat meringkas ide kami untuk outros dengan satu tidak word--. DAVID J Malan: Tidak ada? SPEAKER 3: Tidak ada. DAVID J Malan: Apa artinya? SPEAKER 3: The outros adalah tentang apa-apa. SPEAKER 2: Yah, maksudku, dalam filsafat, Maksudku, tidak ada yang selalu sesuatu. SPEAKER 1: Jadi what's-- apa premis? SPEAKER 3: Jadi itu seperti hidup. OKE. Apa yang kamu lakukan hari ini? DAVID J Malan: aku bangun, memiliki sarapan, dan datang untuk bekerja. SPEAKER 3: Itu sebuah outro. SPEAKER 2: Tapi, maksudku, seharusnya tidak sesuatu terjadi padanya pada the-- SPEAKER 3: Tidak, tidak, tidak, tidak. Tidak ada yang terjadi. SPEAKER 1: Jadi mengapa kita menonton? SPEAKER 3: Karena ini merupakan outro untuk CS50. DAVID J Malan: Belum.