>> [MUSIC PLAYING]
DAVID J. Malan: Baiklah.
Ini adalah CS50, dan ini adalah awal minggu kedua.
Jadi mari kita mulai hari ini dengan bug.
Sebuah bug, tentu saja, adalah kesalahan dalam program,
dan Anda akan mendapatkan sangat akrab dengan konsep ini
jika Anda belum pernah diprogram sebelumnya. pset0 dan sekarang pset1.
Tapi mari kita mempertimbangkan sesuatu sederhana pada awalnya.
Program ini di sini bahwa saya melempar bersama-sama di muka,
dan saya menyatakan bahwa ini harus mencetak 10 pada layar menggunakan printf,
tapi itu tampaknya kereta dalam beberapa cara.
>> Mengingat spesifikasi yang yang harus mencetak 10,
tetapi tidak rupanya, apa akan Anda mengklaim adalah bug?
Ya?
Jadi itu adalah off oleh satu kesalahan, dan apa yang Anda maksud dengan itu?
OK.
Sangat baik.
Jadi kita telah ditentukan mulai dari nilai nol untuk i,
dan kami telah ditentukan nilai n dari 10, tapi kami telah digunakan kurang dari atau sama dengan.
Dan alasan bahwa ini adalah dua karakter, bukan hanya satu simbol,
seperti di buku matematika, adalah bahwa Anda tidak memiliki
cara mengekspresikan satu ekuivalen karakter.
>> Jadi itu berarti kurang dari, tapi jika Anda mulai menghitung dari nol,
tapi Anda menghitung semua jalan melalui dan sama dengan 10,
Anda tentu saja akan Jumlah 11 hal total.
Jadi Anda akan mencetak 11.
Jadi apa yang mungkin untuk memperbaiki ini?
Ya?
>> Jadi hanya menyesuaikan kurang dari atau sama dengan hanya kurang dari,
dan ada, saya menyatakan, mungkin solusi lain, juga.
Apa yang mungkin pun yang Anda lakukan?
Ya?
>> Jadi mulai menyamai ke 1, dan meninggalkan kurang dari atau sama dengan.
Dan terus terang saya akan mengklaim bahwa, bagi manusia yang khas,
ini mungkin lebih mudah.
Mulai menghitung pada 1 dan menghitung sampai 10.
Pada dasarnya melakukan apa yang Anda maksud.
>> Tapi kenyataannya adalah di pemrograman, seperti yang kita lihat,
ilmuwan komputer dan programmer umumnya mulai menghitung dari nol.
Jadi itu baik sekali Anda bisa digunakan untuk itu.
Kondisi Anda akan umumnya sesuatu seperti kurang dari.
Jadi hanya logis kesalahan yang kita sekarang bisa
memperbaiki dan akhirnya ulang ini dan mendapatkan hanya 10.
>> Nah bagaimana bug ini di sini?
Di sini, sekali lagi, saya menyatakan bahwa saya memiliki tujuan mencetak 10 stars--
satu per baris saat ini, tapi itu tidak.
Sebelum kami mengusulkan apa memperbaiki adalah, apa ini
mencetak visual jika saya harus mengkompilasi dan menjalankan program ini menurut Anda?
Ya?
>> Bintang.
Jadi semua bintang pada baris yang sama adalah apa yang saya dengar,
dan kemudian karakter baris baru.
Jadi mari kita coba itu.
Jadi make-kereta 1, masukkan, dan aku melihat perintah dentang
yang kita bicarakan terakhir kali.
./buggy-1, dan memang saya lihat semua 10 pada baris yang sama meskipun saya mengklaim
dalam spesifikasi saya hanya komentar atas kode yang saya dimaksudkan untuk melakukan satu per
line.
Tapi ini terlihat benar.
>> Sekarang baris 15 sepertinya aku mencetak bintang, dan kemudian baris 16
sepertinya aku pencetakan karakter baris baru,
dan mereka berdua menjorok sehingga Aku dalam loop jelas.
Jadi seharusnya tidak saya lakukan star, baru line, star, baris baru, bintang, baris baru?
Ya?
>> Ya, tidak seperti bahasa seperti Python, jika Anda terbiasa,
lekukan tidak masalah ke komputer.
Hanya penting bagi manusia.
Jadi garis sedangkan di sini saya sudah menemukan 15 dan 16-- yang terlihat indah,
tapi komputer tidak peduli.
Komputer peduli benar-benar memiliki kurung kurawal
sekitar baris kode.
>> Sehingga itu clear-- seperti di Scratch-- bahwa kedua baris kode
harus dieksekusi.
Seperti salah satu teka-teki Scratch kuning potongan lagi dan lagi dan lagi.
>> Jadi sekarang jika saya kembali menjalankan ini program-- ./buggy-2-- Hm.
Saya memiliki kesalahan sekarang.
Apa yang saya lupa lakukan?
Ya, jadi aku tidak compile.
Jadi membuat kereta-2.
Tidak ada berkas karena saya tidak benar-benar mengkompilasi versi kedua.
Jadi sekarang menarik dideklarasikan variable-- tidak 2.
Kami melakukan 1.
Membuat kereta-1-- ./buggy-1-- dan sekarang masing-masing adalah pada baris yang sama.
>> Sekarang ada pengecualian untuk ini klaim seharusnya saya
Anda perlu ini kurung kurawal.
Kapan sebenarnya OK-- jika Anda sudah melihat pada bagian atau textbooks--
untuk menghilangkan kurung kurawal?
Ya?
>> Tepat.
Ketika hanya ada satu baris kode yang Anda
ingin berhubungan dengan lingkaran seperti dalam contoh pertama kami.
Ini adalah sah untuk menghilangkan kurung kurawal
seperti semacam kenyamanan dari compiler untuk Anda.
Ya?
Pertanyaan yang bagus.
Apakah itu dianggap sebagai kesalahan gaya?
Kami akan promote-- seperti dalam CS50 panduan gaya, URL yang
dalam pset1-- yang selalu menggunakan kurung kurawal.
Tentu saja jika Anda baru untuk pemrograman.
Kenyataannya adalah kita tidak akan melarang Anda
melakukan kemudahan ini.
Tapi jika Anda hanya mendapatkan ke dalam ayunan hal,
benar-benar hanya selalu menggunakan keriting kawat gigi sampai Anda mendapatkan menguasainya.
Pertanyaan yang bagus.
>> Baiklah.
Sehingga saat itu bug.
Setidaknya dalam sesuatu yang cukup sederhana.
Namun Anda mungkin berpikir ini cukup sederhana, kan?
Ini adalah semacam minggu pertama memandang bahasa
seperti, melihat bug Anda di dalamnya.
Tetapi kenyataannya ini benar-benar representatif
dari beberapa masalah yang cukup menakutkan yang dapat timbul di dunia nyata.
>> Jadi beberapa dari Anda mungkin ingat jika Anda mengikuti berita teknologi,
atau bahkan mungkin tertangkap angin ini pada bulan Februari
ini tahun lalu bahwa Apple telah membuat sedikit kesalahan di kedua iOS,
sistem operasi pada ponsel mereka, dan juga
Mac OS, sistem operasi pada desktop dan laptop mereka.
Dan Anda melihat headline seperti ini.
Dan setelah itu, Apple berjanji untuk memperbaiki bug ini,
dan sangat cepat melakukan memperbaikinya di iOS, tapi kemudian akhirnya tetap di Mac OS
juga.
>> Sekarang tidak ada berita ini saja benar-benar mengungkapkan apa masalah mendasar itu,
tapi bug ini akhirnya dikurangi menjadi bug di SSL, secure socket layer.
Dan cerita panjang pendek, ini adalah perangkat lunak yang
bahwa browser dan lainnya perangkat lunak yang digunakan untuk melakukan apa?
>> Jika saya mengatakan bahwa SSL adalah terlibat, setiap kali Anda
mengunjungi URL yang dimulai dengan HTTPS, lalu apa mungkin SSL berhubungan dengan?
Enkripsi.
Jadi kita akan berbicara tentang ini dalam beberapa hari mendatang.
Enkripsi, seni mengacak informasi.
>> Tapi cerita panjang pendek, Apple beberapa waktu yang lalu telah membuat kesalahan
dalam pelaksanaannya terhadap SSL, software yang pada akhirnya mengimplementasikan
URL seperti HTTPS atau max koneksi di sana juga.
Hasil yang adalah bahwa Anda koneksi bisa berpotensi
disadap.
Dan koneksi Anda yang belum tentu dienkripsi
jika Anda memiliki beberapa orang jahat di antara Anda dan situs web tujuan yang
tahu bagaimana untuk mengambil keuntungan dari hal ini.
>> Kini Apple akhirnya diposting a memperbaiki untuk ini akhirnya,
dan deskripsi dari memperbaiki mereka ini.
Transportasi aman gagal untuk memvalidasi keaslian koneksi.
Masalah ini ditangani oleh memulihkan hilang langkah validasi.
>> Jadi ini adalah penjelasan bergelombang dan tangan untuk hanya mengatakan bahwa kita kacau.
Ada secara harfiah satu baris kode yang buggy
pelaksanaannya dari SSL, dan jika Anda pergi online dan mencari ini
Anda benar-benar dapat menemukan kode sumber asli.
Misalnya, ini adalah screen shot dari hanya sebagian dari file yang cukup besar,
tapi ini adalah fungsi rupanya disebut SSL memverifikasi Server tanda pertukaran kunci.
Dan dibutuhkan sekelompok argumen dan masukan.
Dan kita tidak akan fokus terlalu banyak pada minutia sana,
tetapi jika Anda berfokus pada kode di dalam itu paling atas function-- mari
memperbesar itu.
Anda mungkin sudah menduga apa kesalahan mungkin
bahkan jika Anda tidak tahu akhirnya apa yang Anda cari di.
Ada semacam anomali di sini, yang adalah apa?
>> Ya, saya tidak benar-benar seperti tampilan dua goto gagal.
Terus terang, saya tidak benar-benar tahu apa goto gagal berarti, tetapi memiliki dua dari mereka
kembali ke belakang.
Itu hanya semacam menggosok saya intelektual dengan cara yang salah,
dan memang jika kita memperbesar hanya jalur tersebut, ini adalah C.
>> Jadi banyak kode Apple adalah dirinya ditulis dalam C,
dan ini rupanya benar-benar equivalent--
tidak itu lekukan cantik versi, tetapi jika Anda menyadari kenyataan
bahwa tidak ada kurung kurawal, apa Apple benar-benar menulis adalah kode yang terlihat
seperti ini.
Jadi saya sudah memperkecil keluar dan aku hanya tetap lekukan dalam arti
bahwa jika tidak ada kurung kurawal, bahwa goto kedua gagal yang ada di kuning
akan mengeksekusi apa pun.
Ini tidak terkait dengan jika kondisi di atasnya.
>> Jadi, bahkan lagi, jika Anda tidak cukup memahami apa ini mungkin bisa
melakukan, tahu bahwa masing-masing conditions-- setiap lini ini
adalah langkah yang sangat penting dalam proses pemeriksaan
jika data Anda sebenarnya dienkripsi.
Jadi melewatkan salah satu dari ini langkah, bukan ide yang terbaik.
>> Tapi karena kita punya ini goto kedua gagal dalam kuning,
dan karena setelah kami semacam estetis
memindahkannya ke kiri di mana logis pada saat ini, apa
artinya ini bagi baris kode di bawah goto kedua
gagal akan Anda pikirkan?
Ini selalu akan dilewati.
Jadi gotos umumnya disukai untuk alasan kita tidak akan benar-benar masuk ke dalam,
dan memang di CS50 kita cenderung tidak untuk mengajarkan pernyataan goto ini,
tetapi Anda bisa memikirkan goto gagal sebagai melompat makna pergi
ke beberapa bagian lain dari kode.
>> Dengan kata lain melompati baris terakhir ini sama sekali,
sehingga hasil ini bodoh kesalahan sederhana yang hanya
akibat dari mungkin seseorang menyalin dan menyisipkan satu juga
berkali-kali adalah bahwa seluruh keamanan iOS dan Mac OS
rentan terhadap intersepsi oleh orang-orang jahat untuk beberapa waktu.
Sampai Apple akhirnya tetap ini.
>> Sekarang jika beberapa dari Anda benar-benar menjalankan versi lama dari iOS atau Mac OS,
Anda dapat pergi ke gotofail.com yang adalah website yang seseorang mengatur
pada dasarnya menentukan pemrograman
jika komputer Anda masih rentan.
Dan terus terang, jika sudah, itu mungkin ide yang baik
untuk memperbarui telepon Anda atau Mac Anda pada saat ini.
Tapi ada, hanya bukti betapa apresiasi ini tingkat rendah
Rincian dan cukup ide sederhana bisa benar-benar
diterjemahkan ke dalam keputusan dan masalah yang
affected-- di case-- ini jutaan orang.
>> Sekarang kata administrasi.
Bagian ini akan dimulai Minggu mendatang.
Anda akan menerima email dengan akhir pekan tentang bagian, di mana titik
proses resectioning akan mulai jika Anda sudah
menyadari bahwa Anda sekarang memiliki beberapa konflik baru.
Jadi ini terjadi setiap tahun, dan kami akan mengakomodasi di masa yang akan datang.
>> Kantor hours-- lakukan menjaga mata pada jadwal ini di sini.
Perubahan sedikit minggu ini, terutama waktu mulai
dan lokasi, sehingga berkonsultasi bahwa sebelum menuju ke jam kantor
salah satu dari empat malam.
Dan sekarang kata pada penilaian, terutama karena Anda menyelam ke dalam masalah
menetapkan satu dan seterusnya.
>> Jadi per spesifikasi, ini umumnya
sumbu bersama yang kita mengevaluasi pekerjaan Anda.
Lingkup mengacu pada apa Sejauh alat kode Anda
fitur yang diperlukan oleh spesifikasi kami.
Dengan kata lain, berapa banyak set piece apakah Anda menggigit.
Apakah Anda melakukan ketiga hal itu, setengah dari itu, 100% dari itu.
Bahkan jika itu tidak benar, berapa banyak Anda mencoba?
Jadi yang menangkap tingkat usaha dan jumlah
yang Anda menggigit orang masalah masalah set ini.
>> Correctness-- satu ini, untuk sejauh mana, adalah kode Anda
konsisten dengan kami spesifikasi dan bebas dari bug.
Jadi tidak bekerja dengan benar?
Jika kita memberikan beberapa masukan, apakah itu memberi kita output yang kita harapkan?
Design-- sekarang ini adalah yang pertama dari yang sangat kualitatif,
atau orang-orang yang membutuhkan penilaian manusia.
Dan memang, ini adalah mengapa kita memiliki staf yang begitu banyak rekan-rekan mengajar dan program
asisten.
Sampai sejauh mana Anda kode yang ditulis dengan baik?
>> Dan lagi ini adalah sangat penilaian kualitatif
yang akan bekerja dengan Anda pada bi-terarah dalam minggu-minggu yang akan datang.
Sehingga ketika Anda mendapatkan tidak hanya nilai numerik, tetapi juga
sebuah nilai tertulis, atau umpan balik diketik, atau umpan balik yang ditulis dalam kata-kata bahasa Inggris.
Itulah yang akan kita gunakan untuk mengarahkan Anda menuju benar-benar menulis kode yang lebih baik.
Dan dalam kuliah dan bagian, kami akan mencoba untuk menunjuk out-- sesering yang kami can--
apa yang membuat sebuah program tidak hanya benar dan fungsional baik,
tetapi juga dirancang dengan baik.
Yang paling efisien itu bisa, atau bahkan yang paling indah dapat.
>> Yang membawa kita ke gaya.
Gaya akhirnya adalah penimbangan estetik.
Apakah Anda memilih yang baik nama untuk variabel Anda?
Apakah Anda menjorok kode Anda dengan benar?
Apakah terlihat baik, dan oleh karena itu, adalah mudah bagi manusia lain
untuk membaca masing-masing Anda dari kebenarannya.
>> Sekarang umumnya per silabus, kami mencetak hal-hal ini pada skala lima poin.
Dan biarkan aku menempa hal tersebut bahwa tiga memang baik.
Sangat cepat melakukan orang mulai melakukan aritmatika.
Ketika mereka mendapatkan tiga dari lima pada kebenaran untuk beberapa PSET
dan mereka berpikir sialan, aku akan 60% yang pada dasarnya adalah D atau E.
>> Itu bukan cara kita memikirkan angka-angka ini.
Tiga memang baik, dan apa yang kita umumnya mengharapkan pada awal
istilah adalah bahwa jika Anda mendapatkan sekelompok three's-- mungkin beberapa
pameran, beberapa fours-- atau beberapa berpasangan, beberapa fours--
itu adalah tempat yang baik untuk memulai.
Dan selama kita melihat lintasan ke atas dari waktu ke waktu,
Anda berada di tempat yang sangat baik.
>> Rumus yang kita gunakan untuk hal berat badan pada dasarnya
ini per silabus, yang hanya berarti bahwa kita
memberikan bobot yang lebih kebenaran.
Karena itu sangat sering kebenaran yang mengambil sebagian besar waktu.
Percayalah sekarang.
Anda akan find-- setidaknya dalam satu pset-- bahwa Anda
menghabiskan 90% dari waktu Anda bekerja pada 10% dari masalah.
>> Dan segala sesuatu yang semacam bekerja kecuali untuk satu atau dua bug,
dan mereka adalah bug yang membuat Anda sampai larut malam.
Mereka adalah orang-orang yang semacam melarikan diri Anda.
Tapi setelah tidur di atasnya, atau menghadiri jam kantor
atau mengajukan pertanyaan secara online, ketika Anda sampai ke tujuan itu 100%,
dan itulah mengapa kami berat kebenaran yang paling.
Desain sedikit kurang, dan gaya sedikit kurang dari itu.
Namun perlu gaya mind-- mungkin yang paling mudah
ini untuk menggigit sesuai panduan gaya.
>> Dan sekarang, lebih serius perhatikan pada kejujuran akademik.
CS50 memiliki perbedaan malang menjadi produsen terbesar Papan Iklan
kasus hampir setiap tahun secara historis.
Hal ini bukan karena siswa menyontek di CS50 lagi daripada kelas lain,
tetapi karena dengan sifat pekerjaan, fakta bahwa itu elektronik,
fakta bahwa kita mencarinya, dan kenyataan kita adalah ilmuwan komputer,
Saya dapat mengatakan kita sayangnya sangat baik dalam mendeteksi itu.
>> Jadi apa artinya ini secara riil?
Jadi, per silabus, filosofi program ini
benar-benar mendidih hingga masuk akal.
Ada baris ini antara melakukan pekerjaan seseorang pada Anda sendiri
dan mendapatkan sedikit bantuan yang wajar dari seorang teman,
dan terang-terangan melakukan yang bekerja untuk Anda teman, atau mengirim dia kode Anda
sehingga ia hanya bisa mengambil atau meminjam keluar benar.
Dan itu melewati batas bahwa kita ditarik dalam kelas.
>> Lihat, silabus akhirnya untuk lini
bahwa kita menarik sebagai wajar dan perilaku yang tidak masuk akal,
tapi itu benar-benar mendidih ke esensi
pekerjaan Anda perlu menjadi Anda sendiri pada akhirnya.
Sekarang dengan mengatakan bahwa, ada heuristik.
Karena seperti yang mungkin Anda imagine-- dari jam kantor dan visual
dan video kami telah ditampilkan sehingga far-- CS50
memang dimaksudkan untuk menjadi sebagai kolaboratif dan sebagai koperasi dan sebagai sosial
mungkin.
Seperti kolaborasi seperti yang ketat.
>> Tapi dengan ini mengatakan, heuristik, seperti yang Anda lihat dalam silabus,
adalah bahwa ketika Anda mengalami beberapa masalah.
Anda memiliki beberapa bug dalam kode Anda bahwa Anda tidak bisa memecahkan, adalah wajar bagi Anda
untuk menampilkan kode Anda kepada orang lain.
Seorang teman bahkan di kelas, teman duduk di sebelah Anda di jam kerja,
atau anggota staf.
Tapi mereka mungkin tidak menunjukkan kode mereka kepada Anda.
>> Dengan kata lain, sebuah menjawab question-- Anda
Aku butuh help-- tidak oh, inilah kode saya.
Lihatlah ini dan menyimpulkan dari itu apa yang akan Anda.
Sekarang, tentu saja, ada cara jelas untuk permainan
sistem ini dimana saya akan menunjukkan kode saya sebelum memiliki pertanyaan.
Anda tunjukkan kode Anda saya sebelum memiliki pertanyaan.
Tapi lihat silabus lagi untuk rincian halus di mana garis ini.
>> Hanya untuk sekarang melukis gambar dan berbagi sebagai transparan mungkin
di mana kita berada di dalam beberapa tahun terakhir, ini adalah jumlah kasus Dewan Iklan
CS50 yang telah memiliki lebih dari tujuh tahun terakhir.
Dengan 14 kasus jatuhnya terbaru ini.
Dalam hal siswa yang terlibat, itu 20 beberapa siswa yang aneh
ini musim gugur yang lalu.
Ada puncak 33 siswa beberapa tahun yang lalu.
Banyak di antaranya sayangnya tidak lagi di sini di kampus.
>> Siswa yang terlibat sebagai persentase dari kelas secara historis berkisar antara 0%
menjadi 5,3%, yang hanya untuk mengatakan ini setiap tahun tantangan.
Dan untuk mencapai tujuan itu, apa yang kami ingin lakukan adalah menyampaikan satu
bahwa kita dd-- hanya FYI bandingkan di sebuah keadilan untuk para siswa yang
adalah mengikuti garis yang sesuai.
Kami melakukan membandingkan semua saat ini pengiriman terhadap semua misi masa lalu
dari bertahun-tahun terakhir.
>> Kita tahu juga bagaimana Google sekitar dan menemukan repositori kode
online, forum diskusi online, situs kerja online.
Jika seorang siswa dapat menemukannya, kita bisa pasti merasa seperti yang kita menyesal dilakukan.
Jadi apa yang Anda akan melihat dalam silabus meskipun penyesalan klausul ini.
Aku pasti bisa menghargai, dan kita semua memiliki
Staf telah melakukan kursus seperti ini, atau yang ini sendiri dari waktu ke waktu,
pasti tahu bagaimana rasanya ketika hidup mendapat di jalan ketika Anda memiliki
beberapa larut malam deadline-- tidak hanya di kelas ini,
tapi another-- ketika Anda benar-benar kelelahan, stres,
memiliki jumlah yang banyak sekali hal-hal lain yang dapat dilakukan.
Anda akan membuat di beberapa titik di hidup pasti buruk, mungkin terlambat
Keputusan malam.
>> Jadi per silabus, ada klausul ini,
sehingga jika dalam waktu 72 jam untuk membuat beberapa keputusan yang buruk, Anda mencoba untuk memperbaiki itu
dan menjangkau saya dan salah satu kepala saja yang
dan kami akan memiliki percakapan.
Kami akan menangani hal-hal internal dengan harapan
itu menjadi lebih dari saat mengajar atau pelajaran hidup,
dan tidak sesuatu dengan konsekuensi sangat drastis
seperti yang mungkin Anda lihat pada grafik ini di sini.
>> Jadi itu adalah nada yang sangat serius.
Mari kita berhenti sejenak untuk hanya beberapa detik untuk memecahkan ketegangan.
>> [MUSIC PLAYING]
>> DAVID J. Malan: Baiklah, jadi bagaimana adalah bahwa untuk segue sebuah?
Untuk topik utama hari ini.
Yang pertama adalah abstraksi.
Lain yang akan menjadi representasi data, yang terus terang
adalah cara yang sangat kering mengatakan bagaimana kita bisa pergi untuk memecahkan masalah dan berpikir
tentang memecahkan masalah?
Jadi Anda telah melihat di Scratch, dan Anda sudah terlihat mungkin sudah di pset1 dengan C
bahwa Anda tidak hanya dapat menggunakan fungsi, seperti printf,
bahwa orang lain di tahun terakhir menulis untuk Anda.
Anda juga dapat menulis fungsi sendiri.
>> Dan meskipun Anda mungkin tidak memiliki melakukan ini di C, dan terus terang di pset1
Anda tidak benar-benar perlu untuk menulis fungsi sendiri karena problem-- yang
sementara mungkin menakutkan pada pertama glance-- Anda akan melihat
akhirnya dapat diselesaikan dengan tidak semua yang banyak baris kode.
Tapi dengan mengatakan bahwa, dalam hal menulis fungsi sendiri,
menyadari bahwa C memang memberi Anda kemampuan ini.
>> Aku akan pergi dalam kode sumber saat ini, yang tersedia sudah online,
dan aku akan pergi ke depan dan terbuka sebuah program yang disebut fungsi 0.C,
dan fungsi nol kita akan melihat beberapa hal.
Dalam baris pertama 18 melalui 23 adalah fungsi utama saya.
Dan sekarang kita mulai membaca kode yang kita tidak menulis dengan cepat,
tetapi aku sudah menulis di muka atau bahwa Anda dalam masalah set
mungkin menerima memiliki ditulis sebelumnya.
Cara yang baik untuk memulai membaca kode orang lain
adalah mencari fungsi utama.
Mencari tahu di mana entri Titik adalah untuk menjalankan program,
dan kemudian ikuti secara logis dari sana.
>> Jadi program ini rupanya cetakan Nama Anda diikuti dengan titik dua.
Kami kemudian menggunakan GetString dari perpustakaan CS50
untuk mendapatkan string, atau sebuah kata atau frase dari pengguna di keyboard.
Dan kemudian ada ini hal PrintName sini-.
>> Sekarang PrintName bukan fungsi yang datang dengan C.
Hal ini tidak di io.h. standar
Hal ini tidak di CS50.h.
Ini agak dalam file yang sama.
Perhatikan jika saya gulir ke bawah garis bit-- 25 sampai 27--
itu hanya cara yang cukup mengomentari kode Anda menggunakan bintang-bintang dan garis miring.
Ini adalah multi-line komentar, dan ini hanya
deskripsi saya di biru apa fungsi ini tidak.
>> Karena di baris 28 sampai 31, Saya telah menulis fungsi super sederhana
Nama yang adalah PrintName.
Dibutuhkan berapa banyak argumen yang akan Anda katakan?
Jadi satu argument-- karena ada satu Argumen yang tercantum dalam tanda kurung.
Jenis yang String.
Yang mengatakan PrintName seperti kotak hitam ini
atau fungsi yang mengambil sebagai masukan string.
>> Dan nama String yang nyaman akan Name.
Tidak S, bukan N, tapi Name.
Jadi apa PrintName lakukan?
Sangat menyenangkan sederhana.
Sama seperti satu baris kode untuk printf, tapi rupanya itu
print "Halo," begitu dan begitu.
Dimana begitu dan begitu berasal dari argumen.
>> Sekarang ini bukan inovasi besar di sini.
Sungguh, aku telah mengambil sebuah program yang bisa telah ditulis dengan satu baris kode
dengan menempatkan ini di sini, dan berubah ke sesuatu
yang melibatkan sekitar enam atau tujuh atau lebih baris kode semua jalan di sini.
>> Tapi itu adalah berlatih dari Prinsip yang dikenal sebagai abstraksi.
Jenis encapsulating dalam baru fungsi yang memiliki nama, dan lebih baik
Belum nama yang secara harfiah mengatakan apa yang dilakukannya.
Maksudku printf-- itu tidak khususnya deskriptif.
Jika saya ingin membuat potongan puzzle, atau jika saya
ingin membuat suatu fungsi yang mencetak nama seseorang,
keindahan melakukan hal ini adalah bahwa saya benar-benar bisa
memberikan fungsi yang nama yang menjelaskan apa yang dilakukannya.
>> Sekarang dibutuhkan dalam input yang Aku sudah sewenang-wenang disebut nama,
tapi itu terlalu mengagumkan deskriptif bukannya lebih sedikit
generik seperti S. Dan batal, untuk saat ini, hanya berarti
bahwa fungsi ini tidak tangan saya kembali apa-apa.
Ini tidak seperti yang GetString harfiah tangan saya kembali string
seperti yang kita lakukan dengan potongan-potongan kertas dengan teman sekelas Anda minggu lalu,
melainkan hanya memiliki efek samping.
Mencetak sesuatu ke layar.
>> Jadi pada akhir hari, jika saya jangan membuat fungsi-0, ./function-0,
kita akan melihat bahwa itu meminta nama saya.
Saya ketik David, dan jenis nama saya.
Jika saya melakukannya lagi dengan Rob, itu akan mengatakan "Halo, Rob."
Jadi ide sederhana, tapi mungkin ekstrapolasi dari ini mental
bahwa program-program Anda dapatkan sedikit lebih rumit,
dan Anda ingin menulis sepotong kode dan panggilan yang code-- Invoke
yang code-- oleh beberapa deskriptif nama seperti PrintName,
C tidak memberi kita kemampuan ini.
>> Berikut contoh sederhana lain.
Misalnya, jika saya membuka file dari hari ini disebut return.c,
melihat apa yang saya lakukan di sini.
Sebagian besar fungsi utama ini printf.
Saya pertama kali sewenang-wenang menginisialisasi variabel yang disebut x ke nomor 2.
Saya kemudian mencetak "x sekarang % I "lewat di nilai x.
Jadi aku hanya mengatakan apa itu.
>> Sekarang aku hanya berani mengklaim dengan printf.
Saya cubing bahwa nilai x, dan aku melakukannya dengan memanggil fungsi
disebut kubus lewat di x sebagai argumen,
dan kemudian menyimpan output dalam variabel itu sendiri, x.
Jadi aku clobbering nilai x.
Aku mengesampingkan nilai x dengan apa pun
hasil dari panggilan fungsi kubus ini.
Dan kemudian aku hanya mencetak beberapa barang berbulu sini mengatakan apa yang saya lakukan.
>> Jadi apa yang kemudian kubus?
Perhatikan apa yang fundamental berbeda di sini.
Aku telah memberikan fungsi nama seperti sebelumnya.
Aku sudah ditentukan nama untuk argumen.
Kali ini disebut n bukan nama, tapi aku bisa menyebutnya apa pun yang saya inginkan.
Tapi ini berbeda.
Hal ini di sebelah kiri.
Sebelumnya itu adalah apa kata kunci?
Boys.
Sekarang jelas int.
>> Jadi apa yang mungkin mengambil?
Sedangkan kekosongan menandakan semacam ketiadaan, dan itu terjadi.
PrintName kembali apa-apa.
Itu sesuatu, tapi itu tidak tangan saya kembali
sesuatu yang saya bisa menempatkan pada sisi kiri tanda sama
seperti saya telah melakukan di sini on line 22.
>> Jadi jika saya katakan ke on line 30, apa itu mungkin menyiratkan
tentang apa kubus tidak bagi saya?
Ya?
Ini mengembalikan sebuah integer.
Jadi itu tangan saya kembali, untuk Misalnya, selembar kertas
di mana ia telah menulis jawabannya.
2 potong dadu, atau 3 potong dadu, atau 4 cubed-- apa pun yang saya berlalu dalam,
dan bagaimana saya menerapkan ini?
Yah, hanya n kali n kali n adalah bagaimana saya bisa kubus nilai.
Jadi sekali lagi, super sederhana ide, tapi demonstratif
sekarang bagaimana kita dapat menulis fungsi yang benar-benar telah kami kembali
nilai-nilai yang mungkin menarik.
>> Mari kita lihat satu contoh terakhir di sini disebut fungsi satu.
Dalam contoh ini, dimulai untuk mendapatkan lebih menarik.
Jadi dalam fungsi satu, ini pemberitahuan program-- akhirnya
panggilan fungsi yang disebut GetPositiveInt.
GetPositiveInt bukan fungsi di perpustakaan CS50,
tapi kami memutuskan kami ingin untuk ada.
>> Jadi jika kita gulir ke bawah kemudian dalam file, perhatikan bagaimana saya pergi tentang pelaksanaan
mendapatkan int positif, dan saya mengatakan itu lebih menarik
karena ini adalah layak jumlah baris kode.
Ini bukan hanya konyol program kecil mainan.
Ini benar-benar mendapat beberapa pengecekan error dan melakukan sesuatu yang lebih berguna.
>> Jadi jika Anda sudah tidak melihat walkthrough video yang telah kita tertanam dalam pset1,
tahu bahwa ini adalah jenis loop dalam C, serupa semangatnya
untuk hal-hal yang dapat Anda lakukan Scratch.
Dan melakukan mengatakan melakukan hal ini.
Cetak ini.
Lalu pergi ke depan dan mendapatkan n-- mendapatkan int dan menyimpannya dalam n,
dan terus melakukan hal ini lagi dan lagi dan lagi selama n kurang dari satu.
>> Jadi n akan menjadi kurang dari satu hanya jika manusia tidak bekerja sama.
Jika ia sedang mengetik di 0 atau -1 atau -50,
lingkaran ini akan terus mengeksekusi lagi dan lagi.
Dan akhirnya melihat, saya hanya mengembalikan nilai.
Jadi sekarang kita memiliki fungsi yang sudah bagus
jika CS50 akan menerapkan di CS50.h dan CS50.c untuk Anda,
tetapi di sini kita sekarang dapat menerapkan ini sendiri.
>> Tapi dua komentar pada beberapa rincian penting.
Satu-- mengapa saya menyatakan int n, menurut Anda, on line 29
bukan hanya melakukan ini di sini, yang
lebih konsisten dengan apa yang kami lakukan minggu lalu?
Ya?
Sebuah pikiran yang baik.
Jadi jika kita meletakkannya di sini, itu seolah-olah kita
tetap menyatakan lagi dan lagi.
Bahwa dalam dan dari dirinya sendiri tidak bermasalah, per se,
karena kita hanya perlu nilai sekali dan kemudian
kita akan mendapatkan yang baru pula.
Tapi pikiran yang baik.
Ya?
>> Tutup.
Jadi karena saya sudah dinyatakan n on line 29 di luar loop,
itu dapat diakses di seluruh Seluruh fungsi ini.
Tidak fungsi lain karena n masih dalam keriting ini
kawat gigi di sini.
Begitu-- yakin.
>> Tepat.
Jadi ini bahkan lebih penting.
Jika kita bukan menyatakan n di sini on line 32,
itu bermasalah karena menebak di mana lagi saya harus mengaksesnya?
On line 34, dan Aturan yang sederhana adalah
bahwa Anda hanya dapat menggunakan variabel dalam kurung kurawal terbaru
di mana Anda menyatakan.
>> Sayangnya, baris 34 satu baris terlambat,
karena saya sudah ditutup penjepit keriting on line 33
yang sesuai dengan penjepit keriting on line 30.
Dan jadi ini adalah cara untuk mengatakan bahwa variabel ini int adalah scoped,
sehingga untuk berbicara, hanya dalam mereka kurung kurawal.
Hanya saja tidak ada di luar mereka.
>> Jadi memang, jika saya melakukan ini salah, biarkan aku menyimpan kode
karena Ini-- salah ditulis.
Biarkan aku pergi ke depan dan jangan membuat -fungsi 1, dan kesalahan notice--.
Penggunaan dideklarasikan identifier n on line 35, yang ada di sini.
Dan jika kita gulir ke atas lanjut, satu sama lain.
Penggunaan dideklarasikan identifier n on line 34.
>> Jadi compiler, dentang, adalah menyadari bahwa itu hanya
tidak ada meskipun jelas itu ada visual.
Jadi memperbaiki sederhana yang menyatakan itu ada.
>> Sekarang biarkan aku gulir ke bagian atas file.
Apa melompat keluar pada Anda sebagai menjadi sedikit berbeda
dari hal-hal yang kita melihat minggu lalu?
Saya tidak hanya punya nama, tidak hanya Saya punya beberapa tajam meliputi bagian atas,
Aku punya sesuatu yang saya memanggil prototipe.
Sekarang terlihat sangat mirip dengan apa yang kami hanya melihat sejenak lalu pada baris 27.
>> Jadi mari kita menyimpulkan dari berbeda pesan kesalahan mengapa saya sudah melakukan ini.
Biarkan aku pergi ke depan dan menghapus baris ini ada.
Dan jadi kita tahu apa-apa tentang prototipe.
Remake file ini.
Membuat fungsi satu.
Dan sekarang, sialan, empat kesalahan.
Mari kita gulir ke atas untuk yang pertama.
>> Deklarasi implisit fungsi mendapatkan int positif tidak valid di C99.
C99 hanya berarti 1999 versi bahasa
C, yang adalah apa yang kita memang gunakan.
Jadi apa artinya ini?
Yah C-- dan lebih khusus C compilers-- program cukup bodoh.
Mereka hanya tahu apa yang telah Anda mengatakan kepada mereka, dan itulah
sebenarnya tematik dari minggu lalu.
>> Masalahnya adalah bahwa jika saya pergi tentang pelaksanaan nama di sini,
dan saya memanggil fungsi yang disebut GetPositiveInt sini on line 20,
fungsi yang secara teknis tidak ada sampai kompilator melihat garis 27.
Sayangnya, compiler melakukan hal-hal atas, bawah, kiri, kanan,
sehingga karena belum melihat pelaksanaan GetPositiveInt,
tapi melihat Anda mencoba menggunakannya di sini,
itu hanya akan bail-- berteriak Anda dengan kesalahan Message-- mungkin
samar, dan tidak benar-benar mengkompilasi file.
>> Jadi yang disebut prototipe up di sini harus diakui berlebihan.
Secara harfiah, aku turun di sini dan saya menyalin dan disisipkan ini, dan saya taruh di sini.
Void akan lebih tepat, sehingga kita akan harfiah copy dan paste saat ini.
Aku benar-benar disalin dan disisipkan.
Benar-benar seperti seperti remah roti.
>> Sebuah petunjuk sedikit untuk compiler.
Aku tidak tahu apa yang dilakukan belum, tapi aku menjanjikan untuk Anda
bahwa akan ada akhirnya.
Dan itulah mengapa ini line-- di baris 16-- berakhir dengan titik koma.
Hal ini berlebihan dengan desain.
Ya?
>> Jika Anda tidak menghubungkan perpustakaan Anda untuk yang-- oh, pertanyaan yang bagus.
Tajam termasuk inklusi file header.
Perlu akan-- harus hampir selalu berada di bagian paling atas
file untuk similar-- untuk alasan yang sama persis, ya.
Karena dalam standar io.h secara harfiah garis
seperti ini, tetapi dengan printf kata, dan dengan argumen dan kembali jenis-nya.
Jadi dengan melakukan tajam mencakup hingga di sini, apa yang Anda benar-benar melakukan
adalah menyalin dan menyisipkan isi dari orang lain menulis di bagian atas.
Dengan demikian cluing kode Anda ke dalam Fakta bahwa fungsi-fungsi yang ada.
Ya?
>> Tentu saja.
Jadi sangat pintar dan benar solusi akan, kau tahu apa?
Aku tidak tahu apa prototipe, tapi aku tahu
jika saya memahami bahwa C hanya bodoh dan rethinks atas ke bawah.
Nah mari kita apa yang diinginkannya.
Mari kita memotong kode, paste up atas, dan sekarang mendorong utama di bawah.
Hal ini juga akan memecahkan masalah.
>> Tapi Anda bisa dengan mudah datang dengan sebuah skenario di mana A perlu memanggil B,
dan mungkin B panggilan kembali ke A. Ini adalah sesuatu yang disebut rekursi,
dan kami akan kembali ke itu.
Dan hal itu mungkin atau tidak mungkin baik hal, tetapi Anda pasti dapat
istirahat solusi ini.
>> Dan selain itu, saya akan mengklaim Gaya,
terutama ketika program Anda menjadi selama ini dan selama ini,
itu hanya super nyaman untuk menempatkan utama di bagian atas
karena itu adalah hal yang paling programmer akan peduli.
Dan jadi sedikit lebih bersih, bisa dibilang, untuk melakukannya dengan cara yang
Awalnya saya melakukannya dengan prototipe bahkan
meskipun terlihat sedikit berlebihan pada pandangan pertama.
Ya?
Maaf, Anda dapat mengatakan itu keras?
>> Jika Anda beralih lokasi dari implementasi dan prototipe?
Jadi itu adalah pertanyaan yang bagus.
-Menyatakan kembali Jika Anda ini turun di sini, mari kita lihat apa yang terjadi.
Jadi jika saya meletakkan ini di sini, Anda katakan.
Oh, maaf.
Louder?
Bahkan lebih keras.
Oh, pertanyaan yang bagus.
Apakah itu membatalkan fungsi?
Kau tahu, setelah bertahun-tahun, saya tidak pernah menempatkan prototipe setelah itu.
Jadi mari kita lakukan membuat fungsi-1 setelah melakukan itu.
>> [Bergumam]
DAVID J. Malan: Oh, tunggu.
Kami masih harus meletakkan segala sesuatu di bagian atas.
Jadi mari kita lakukan ini di sini, jika saya memahami pertanyaan Anda dengan benar.
Aku meletakkan segala sesuatu, termasuk prototipe di atas utama,
tapi aku meletakkan prototipe bawah pelaksanaannya.
>> Jadi jika saya membuat satu, saya mendapatkan kembali variabel tidak terpakai n error--.
Oh, ada.
Terima kasih.
Mari kita lihat, kita menyingkirkan ini.
Itu bug yang berbeda, jadi mari kita mengabaikan itu.
Mari kita benar-benar cepat remake ini.
>> OK, sehingga data argumen tidak digunakan oleh Format String
n-- oh, itu karena Aku berubah menjadi ini di sini.
Baiklah, kita tahu apa jawabannya akan untuk-- baik-baik, di sini kita pergi.
Ah, terima kasih atas positif.
Baiklah, aku akan memperbaiki kode ini after-- mengabaikan bug tertentu
karena ini was-- kerjanya adalah jawabannya.
>> Jadi tidak menimpa apa yang baru saja dilakukan.
Saya menduga compiler ditulis sedemikian rupa
bahwa itu mengabaikan prototipe Anda karena tubuh, sehingga untuk berbicara,
fungsi memiliki sudah dilaksanakan lebih tinggi.
Saya harus benar-benar berkonsultasi manual kompilator
untuk memahami apakah ada yang lain Implikasinya, tapi pada pandangan pertama
hanya dengan mencoba dan bereksperimen, ada tampaknya tidak ada dampak.
Pertanyaan yang bagus.
>> Jadi mari kita maju sekarang, bergerak jauh dari efek samping yang
adalah fungsi yang melakukan sesuatu seperti visual pada layar dengan printf,
tetapi tidak mengembalikan nilai.
Dan fungsi yang memiliki return Nilai-nilai seperti kami hanya melihat beberapa.
Kita telah melihat gagasan dari ruang lingkup, dan kita akan melihat ini lagi dan lagi.
Tapi untuk saat ini, sekali lagi, menggunakan aturan praktis
bahwa variabel hanya dapat digunakan dalam yang paling baru dibuka
dan kurung kurawal tertutup seperti yang kita melihat dalam contoh khusus.
>> Dan seperti yang Anda menunjukkan, ada ability--
Anda bisa memecahkan beberapa masalah ini dengan menempatkan variabel global
di bagian paling atas dari file.
Namun dalam hampir semua kasus kita akan mengerut atas itu,
dan memang bahkan tidak pergi ke dalam solusi untuk saat ini.
Jadi untuk saat ini, takeaway adalah bahwa variabel memiliki gagasan dari ruang lingkup.
>> Tapi sekarang mari kita lihat lain cara kering benar-benar melihat
di beberapa cukup menarik rincian pelaksanaan.
Bagaimana kita bisa merepresentasikan informasi.
Dan kita sudah melihat ini di minggu pertama kelas.
Melihat binari, dan mengingatkan diri desimal.
>> Tapi ingat dari minggu lalu bahwa C memiliki jenis data yang berbeda dan tandan lainnya,
tapi yang paling berguna untuk saat ini mungkin ini.
Sebuah char, atau karakter, yang terjadi menjadi salah satu byte, atau delapan bit keseluruhan.
Dan itu mengatakan bahwa ukuran char adalah hanya satu byte.
Sebuah byte adalah delapan bit, jadi ini berarti bahwa kita dapat mewakili berapa banyak karakter.
Berapa banyak surat atau simbol pada keyboard
jika kita memiliki satu byte atau delapan bit.
Pikirkan kembali minggu nol.
Jika Anda memiliki delapan bit, berapa banyak total nilai
dapat Anda wakili dengan pola nol dan satu?
Satu-- lebih dari itu.
Jadi jumlah 256 jika Anda mulai menghitung dari nol.
Jadi jika Anda memiliki delapan bits-- jadi jika kita memiliki lampu biner kami di sini lagi,
kita bisa mengubah mereka lampu pada dan off di setiap dari 256 pola yang unik.
>> Sekarang ini adalah sedikit bermasalah.
Tidak begitu banyak untuk bahasa Inggris dan bahasa cinta, tapi pasti
ketika Anda memperkenalkan, untuk Misalnya, bahasa-bahasa Asia, yang
memiliki simbol jauh lebih banyak daripada seperti 26 huruf abjad.
Kami benar-benar mungkin perlu lebih dari satu byte.
Dan untungnya di beberapa tahun terakhir memiliki masyarakat
mengadopsi standar lain yang menggunakan lebih dari satu byte per charge.
>> Tapi untuk saat ini di C, default adalah salah satu byte atau delapan bit.
Integer, sementara itu, adalah empat bytes, atau dikenal sebagai 32 bit.
Yang berarti apa yang mungkin terbesar nomor kita dapat mewakili dengan int
rupanya?
Dengan miliar.
Jadi empat miliar memberikan atau mengambil.
2 pangkat 32th, jika kita mengasumsikan bahwa tidak ada angka negatif
dan hanya menggunakan semua positif angka, itu empat miliar
memberi atau mengambil kemungkinan.
Sebuah float, sementara itu, adalah jenis yang berbeda tipe data di C. Ini masih angka,
tapi itu bilangan real.
Sesuatu dengan titik desimal.
Dan ternyata C juga menggunakan empat byte
untuk mewakili nilai-nilai floating point.
>> Sayangnya berapa banyak mengambang nilai titik yang ada di dunia?
Berapa banyak bilangan real yang ada?
Ada tak terbatas nomor, dan dalam hal ini
ada jumlah tak terbatas bilangan bulat.
Jadi kita sudah jenis menggali lubang sendiri di sini.
Dimana ternyata di computers-- di program paling ditulis dalam C pada them--
hanya bisa menghitung setinggi empat miliar memberi atau mengambil,
dan nilai floating point hanya dapat tampaknya
memiliki beberapa jumlah terbatas presisi.
Hanya begitu banyak angka setelah titik desimal mereka.
>> Karena, tentu saja, jika Anda hanya memiliki 32 bit,
Aku tidak tahu bagaimana kita akan pergi tentang mewakili Numbers nyata mungkin
dengan berbagai jenis pola.
Tapi ada pasti terbatas jumlah pola tersebut,
jadi di sini, juga, ini adalah bermasalah.
>> Sekarang kita dapat menghindari masalah sedikit.
Jika Anda tidak menggunakan pelampung, Anda bisa menggunakan ganda
di C, yang memberi Anda delapan byte, yang mungkin pola cara yang lebih dari nol
dan orang-orang.
Tapi itu masih terbatas, yang akan menjadi bermasalah jika Anda menulis perangkat lunak
untuk grafis atau mewah rumus matematika.
Jadi Anda mungkin benar-benar ingin untuk menghitung lebih besar dari itu.
Sebuah panjang long-- bodoh named-- juga delapan byte, atau 64 bit,
dan ini adalah dua kali lebih lama sebagai int, dan itu untuk nilai integer panjang.
>> Fun fact-- jika int adalah empat byte, berapa lama panjang di C biasanya?
Juga empat byte, tetapi lama delapan byte,
dan ini adalah untuk alasan historis.
>> Tapi sekarang takeaway hanya data yang memiliki
untuk diwakili dalam computer-- yang perangkat fisik dengan listrik,
itu umumnya mengemudi mereka nol dan ones--
dengan jumlah terbatas presisi.
Jadi apa masalahnya kemudian?
>> Yah ada masalah overflow integer.
Tidak hanya di C, tetapi dalam komputer secara umum.
Misalnya, jika ini adalah byte layak bit--
jadi jika ini adalah delapan bit-- semua di antaranya adalah nomor satu.
Apa angka adalah ini mewakili jika kita asumsikan
itu semua nilai-nilai positif di biner?
>> 255, dan itu bukan 256, karena nol adalah angka terendah.
Jadi 255 adalah yang tertinggi satu, tapi masalahnya
adalah rasa bahwa saya ingin kenaikan variabel ini yang
menggunakan delapan bit total jika saya ingin kenaikan itu.
>> Nah begitu aku menambahkan yang semua orang-orang ini,
Anda mungkin bisa membayangkan visually-- hanya seperti membawa yang menggunakan decimals--
sesuatu akan mengalir ke kiri.
Dan memang, jika saya menambahkan nomor satu ini, apa yang terjadi dalam biner
adalah bahwa hal itu meluap kembali ke nol.
>> Jadi, jika Anda hanya use-- bukan int, tapi satu byte untuk menghitung bilangan bulat
dalam sebuah program, berdasarkan default-- secepat Anda bisa 250, 251, 252, 253, 254,
255-- 0 muncul setelah 255, yang mungkin bukan apa
pengguna akan mengharapkan.
>> Sekarang sementara dalam floating point dunia, Anda juga memiliki masalah yang sama.
Tidak begitu banyak dengan number-- terbesar walaupun itu masih menjadi masalah.
Tapi dengan jumlah presisi bahwa Anda dapat mewakili.
Jadi mari kita lihat contoh ini di sini juga dari code-- sumber hari ini
mengapung-0.c.
>> Dan melihat itu super program sederhana yang
harus rupanya mencetak nilai apa keluar?
Apa yang Anda bertaruh ini akan mencetak meskipun ada sedikit sintaks baru
di sini?
Jadi mudah-mudahan 0,1.
Jadi setara dengan sepersepuluh karena aku melakukan 1 dibagi dengan 10.
Aku menyimpan jawabannya dalam variabel yang disebut f.
Variabel yang bertipe float, yang adalah kata kunci saya hanya diusulkan ada.
>> Kami tidak melihat ini sebelumnya, tapi ini adalah jenis cara yang rapi di printf
untuk menentukan berapa banyak digit Anda ingin melihat setelah titik desimal.
Jadi notasi ini hanya berarti bahwa inilah placeholder.
Ini untuk floating point nilai, dan oh, omong-omong,
menunjukkan dengan titik desimal dengan satu angka setelah titik desimal.
Jadi itulah nomor digit yang signifikan,
sehingga untuk berbicara, bahwa Anda mungkin ingin.
>> Jadi biarkan aku pergi ke depan dan melakukan membuat mengapung-0, ./float-0,
dan tampaknya 1 dibagi dengan 10 adalah 0.0.
Sekarang mengapa ini?
>> Nah lagi, komputer mengambil saya benar-benar, dan saya telah menulis 1
dan saya tulis 10, dan mengambil menebak apa adalah tipe data yang diasumsikan untuk kedua
nilai-nilai?
Int, secara teknis sesuatu yang sedikit berbeda.
Ini biasanya panjang, tapi itu akhirnya nilai integral.
Tidak nilai floating point.
>> Yang mengatakan bahwa jika ini adalah int dan ini adalah int,
masalahnya adalah bahwa komputer tidak memiliki kemampuan
bahkan menyimpan titik desimal.
Jadi, ketika Anda melakukan 1 dibagi dengan 10 menggunakan bilangan bulat
untuk kedua pembilang dan denominator, jawabannya harus 0,1.
Tapi computer-- karena yaitu integers--
tidak tahu apa yang harus dilakukan dengan 0,1.
>> Jadi apa yang jelas lakukan?
Ini hanya membuangnya, dan apa yang saya lihat pada akhirnya
adalah 0.0 hanya karena aku bersikeras bahwa printf menunjukkan satu titik desimal.
Tapi masalahnya adalah bahwa jika Anda membagi integer dengan integer,
Anda akan get-- menurut definisi dari C-- integer.
Dan itu tidak akan melakukan sesuatu yang baik dan nyaman
seperti putaran itu sampai ke terdekat satu atas atau bawah.
Ini akan memotong semuanya setelah desimal.
>> Jadi hanya secara intuitif, apa mungkin memperbaiki?
Apa memperbaiki sederhana di sini?
Ya?
Tepat.
Mengapa kita tidak hanya memperlakukan ini sebagai floating point nilai efektif
mengubahnya menjadi mengapung atau ganda.
Dan jika saya membuat mengapung-0, atau jika saya mengkompilasi mengapung-1,
yang identik dengan apa yang baru saja diusulkan.
Dan sekarang saya lakukan mengapung-0, sekarang saya mendapatkan 0,1 saya.
>> Sekarang ini menakjubkan.
Tapi sekarang aku akan melakukan sesuatu yang sedikit berbeda.
Saya penasaran untuk melihat apa yang sebenarnya terjadi di bawah tenda,
dan aku akan mencetak ini untuk 28 tempat desimal.
Saya ingin benar-benar melihat 0.1000-- sebuah infinite--
[Tak terdengar] 27 angka nol setelah itu 0,1.
>> Nah mari kita lihat apakah itu apa memang saya dapatkan.
Membuat mengapung-0 file yang sama.
./floats-0.
Mari kita zoom in pada jawaban yang dramatis.
Selama ini, Anda sudah berpikir 1 dibagi dengan 10 adalah 10%, atau 0,1.
Ini bukan.
Setidaknya sejauh komputer yang bersangkutan.
>> Sekarang why-- OK, itu lengkap kebohongan 1 dibagi dengan 10 adalah 0,1.
Tapi why-- yang tidak takeaway hari ini.
Jadi mengapa komputer berpikir, tidak seperti kita semua di ruangan,
bahwa 1 dibagi dengan 10 adalah sebenarnya itu nilai gila?
Apa komputer melakukan rupanya?
Apa itu?
>> Ini tidak meluap, per se.
Overflow biasanya ketika Anda membungkus nilai.
Ini masalah ini ketidaktepatan dalam nilai floating point
di mana Anda hanya memiliki 32 atau mungkin bahkan 64 bit.
Tapi kalau ada yang tak terbatas jumlah Numbers nyata
angka dengan poin desimal dan nomor thereafter-- pasti
Anda tidak dapat mewakili semua dari mereka.
Jadi komputer telah memberikan kami pertandingan terdekat
untuk nilai dapat mewakili dipake banyak bit dengan nilai yang saya benar-benar ingin,
yang 0.1.
>> Sayangnya, jika Anda mulai melakukan matematika, atau Anda
mulai melibatkan jenis-jenis floating nilai titik di programs-- penting
software keuangan, software-- sesuatu militer
di mana persepsi adalah mungkin cukup penting.
Dan Anda mulai menambahkan nomor seperti ini, dan mulai
menjalankan perangkat lunak yang dengan input benar-benar besar
atau untuk banyak jam atau banyak hari atau banyak tahun,
kesalahan-kesalahan kecil kecil pasti bisa menambahkan dari waktu ke waktu.
>> Sekarang sebagai samping, jika Anda sudah pernah melihat Superman 3 atau Office Space
dan Anda mungkin ingat bagaimana orang-orang mencuri
banyak uang dari komputer mereka dengan menggunakan nilai-nilai floating point
dan menambahkan sedikit sisanya, mudah-mudahan film yang
sekarang lebih masuk akal.
Ini adalah apa yang mereka menyinggung dalam film itu.
Fakta bahwa sebagian besar perusahaan tidak akan terlihat
setelah sejumlah tempat desimal,
tetapi mereka adalah pecahan sen.
Jadi Anda mulai menambahkan mereka, Anda mulai membuat banyak uang
di rekening bank Anda.
Jadi itulah Office Space menjelaskan.
>> Sekarang sayangnya luar Office Space, ada
beberapa sah mengganggu dan dampak yang signifikan
dari jenis-jenis keputusan desain yang mendasari,
dan memang salah satu alasan kita menggunakan C dalam kursus
adalah sehingga Anda benar-benar memiliki tanah ini up pemahaman tentang bagaimana komputer bekerja,
bagaimana perangkat lunak bekerja, dan tidak percaya begitu saja.
>> Dan memang sayangnya, bahkan dengan bahwa pemahaman mendasar,
kita manusia melakukan kesalahan.
Dan apa yang saya pikir saya akan berbagi adalah Video delapan menit ini di sini diambil
dari episode modern Marvels, yang acara pendidikan tentang bagaimana segala sesuatu bekerja
yang cat dua gambar dari ketika penggunaan yang tidak benar
dan pemahaman tentang nilai floating point
menyebabkan beberapa signifikan Hasil disayangkan.
Mari kita lihat.
[VIDEO PEMUTARAN]
-Kami Sekarang kembali ke "Rekayasa Bencana "tentang Modern Marvels.
Komputer.
Kita semua datang untuk menerima masalah yang sering frustasi yang
mendapat dengan them-- bug, virus, dan glitches-- perangkat lunak untuk harga kecil
untuk membayar untuk kenyamanan.
Namun dalam teknologi tinggi dan kecepatan tinggi aplikasi militer dan program luar angkasa,
masalah terkecil dapat diperbesar menjadi bencana.
>> Pada tanggal 4 Juni 1996, para ilmuwan disiapkan untuk meluncurkan berawak Ariane 5 roket.
Itu membawa ilmiah satelit yang dirancang
untuk mendirikan 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 Prancis.
>> -Pada Sekitar 37 detik ke penerbangan, mereka pertama
sesuatu yang melihat akan salah.
Bahwa nozel yang berputar dengan cara mereka benar-benar tidak seharusnya.
Sekitar 40 detik dalam penerbangan, jelas kendaraan dalam kesulitan,
dan saat itulah mereka membuat keputusan untuk menghancurkannya.
Petugas keamanan range, dengan nyali luar biasa, menekan tombol
dan meledakkan roket sebelum bisa menjadi bahaya bagi keselamatan publik.
>> -Ini adalah gadis yang perjalanan dari Ariane 5,
dan kehancuran mengambil tempat karena cacat
tertanam dalam perangkat lunak roket.
-The Masalah pada Ariane adalah bahwa ada
adalah nomor yang diperlukan 64 bit untuk mengekspresikan,
dan mereka ingin mengkonversi ke nomor 16-bit.
Mereka beranggapan bahwa jumlah tidak pernah akan menjadi sangat besar.
Bahwa kebanyakan dari mereka digit di nomor 64-bit yang nol.
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 berhasil.
Begitu banyak perangkat lunak yang diciptakan untuk itu juga digunakan dalam Ariane 5.
>> -The Masalah dasar adalah bahwa Ariane 5.
Apakah faster-- dipercepat lebih cepat, dan perangkat lunak tidak menyumbang untuk itu.
>> Penghancuran -The roket adalah bencana keuangan yang besar.
Semua karena kesalahan software menit.
Tapi ini bukan yang pertama waktu masalah konversi data
dialami teknologi roket modern.
>> -Dalam 1991 dengan awal Perang Teluk pertama,
rudal Patriot mengalami serupa
dari masalah nomor konversi.
Dan sebagai hasilnya 28 people-- 28 Soldiers-- Amerika tewas,
dan sekitar seratus lainnya luka-luka.
Ketika Patriot, yang seharusnya untuk melindungi terhadap Scud masuk,
gagal untuk menembakkan rudal.
>> -Ketika Irak menginvasi Kuwait, dan Amerika diluncurkan Desert Storm pada awal 1991,
Baterai rudal Patriot dikerahkan untuk melindungi Arab Saudi dan Israel
dari Irak Scud serangan rudal.
The Patriot adalah US menengah permukaan-ke-udara sistem
diproduksi oleh perusahaan Raytheon.
>> -The Ukuran Patriot pencegat itself--
ini tentang kira-kira 20 meter, dan beratnya sekitar 2.000 pound.
Dan ia membawa hulu ledak sekitar, Saya pikir itu sekitar £ 150.
Dan hulu ledak itu sendiri ledak tinggi, yang
memiliki fragmen sekitarnya.
Jadi casing hulu ledak adalah dirancang untuk bertindak seperti gotri a.
>> Rudal -The dilakukan empat per kontainer,
dan diangkut oleh semi trailer.
>> -Sistem Patriot anti-rudal 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,
Angkatan Darat ingin menggunakannya untuk menembak jatuh rudal Scud, bukan pesawat.
Angkatan Udara Irak tidak begitu banyak masalah,
tapi Angkatan Darat khawatir tentang Scud.
Jadi mereka mencoba untuk upgrade Patriot.
>> -Intercepting Musuh rudal bepergian di Mach 5
itu akan cukup menantang.
Tapi ketika Patriot dilarikan ke layanan,
Angkatan Darat tidak menyadari modifikasi Irak yang
membuat Scud mereka hampir mustahil untuk itu.
>> Apa yang terjadi adalah Scud yang yang datang tidak stabil.
Mereka goyah.
Alasan untuk ini adalah Iraqis-- untuk mendapatkan 600 kilometer keluar
dari berbagai 300-kilometer missile-- mengambil berat dari hulu ledak depan,
dan membuat hulu ledak ringan.
Jadi sekarang Patriot mencoba untuk datang di Scud, dan sebagian besar time-- yang
mayoritas dari time-- itu hanya akan terbang oleh Scud.
>> -Setelah Operator sistem Patriot menyadari Patriot terjawab target,
mereka meledakkan hulu ledak Patriot untuk menghindari kemungkinan korban jika
diizinkan untuk jatuh ke tanah.
>> -Itu Apa yang kebanyakan orang melihat sebagai bola api besar di langit,
dan disalahpahami sebagai penyadapan dari Scud hulu ledak.
>> -meskipun Di langit malam, Patriots tampaknya berhasil menghancurkan
Scud, di Dhahran mungkin ada salah tentang kinerjanya.
Ada sistem radar Patriot kehilangan jejak dari Scud masuk
dan tidak pernah diluncurkan karena untuk cacat software.
>> Itu adalah Israel yang pertama kali ditemukan bahwa semakin lama sistem itu pada,
semakin besar waktu perbedaan menjadi.
Karena jam tertanam di komputer sistem.
>> -Tentang Dua minggu sebelum tragedi di Dhahran,
Israel dilaporkan Departemen Pertahanan
bahwa sistem itu kehilangan waktu.
Setelah sekitar delapan jam berjalan, mereka melihat
bahwa sistem menjadi terasa kurang akurat.
Departemen Pertahanan menanggapi dengan memberitahu semua baterai Patriot
untuk tidak memberikan sistem pada untuk waktu yang lama.
Mereka tidak pernah mengatakan apa waktu yang lama adalah.
8 jam, 10 jam, seribu jam.
Tak ada yang tahu.
>> -The Baterai Patriot ditempatkan di barak
di Dhahran internal dan cacat yang Jam telah selama lebih dari 100 jam
pada malam 25 Februari.
>> -It Dilacak waktu dengan akurasi sekitar sepersepuluh detik.
Sekarang sepersepuluh detik adalah nomor menarik
karena tidak dapat dinyatakan dalam biner persis, yang
berarti itu tidak bisa diungkapkan dengan tepat dalam komputer digital modern.
Sulit untuk percaya, tetapi menggunakan ini sebagai contoh.
>> Mari kita nomor satu ketiga.
Sepertiga tidak dapat dinyatakan dalam desimal persis.
Sepertiga adalah 0.333 berlangsung selama tak terhingga.
Tidak ada cara untuk melakukan itu dengan akurasi mutlak dalam desimal.
Itulah jenis masalah yang terjadi di Patriot.
Semakin lama sistem berlari, yang buruk kesalahan waktu menjadi.
>> -Setelah 100 jam operasi, kesalahan dalam waktu hanya sekitar sepertiga
detik.
Tapi dalam hal menargetkan rudal bepergian di Mach 5,
itu mengakibatkan pelacakan sebuah kesalahan lebih dari 600 meter.
Ini akan menjadi kesalahan fatal bagi para prajurit di Dhahran.
>> Apa yang terjadi adalah peluncuran Scud itu terdeteksi oleh satelit peringatan dini,
dan mereka tahu Scud datang arah umum mereka.
Mereka tidak tahu di mana itu berasal.
Sekarang sudah sampai radar komponen dari sistem Patriot
membela Dhahran untuk mencari dan menjaga melacak rudal musuh yang 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.
Itu disebut gerbang jangkauan.
>> -Kemudian Setelah Patriot memutuskan cukup waktu 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 ia memutuskan bahwa tidak ada objek.
Bahwa ada deteksi palsu dan tetes trek.
>> -The Masuk Scud menghilang dari layar radar,
dan beberapa detik kemudian, itu membanting ke markas.
The Scud menewaskan 28.
Itu yang terakhir dipecat selama Perang Teluk pertama.
Tragisnya, perangkat lunak diperbarui tiba saat fajar pada hari berikutnya.
Perangkat lunak cacat telah telah diperbaiki, penutupan
satu bab dalam bermasalah sejarah rudal Patriot.
>> [END VIDEO PUTAR]
>> DAVID J. Malan: Itu saja untuk CS50.
Kita akan melihat Anda pada hari Rabu.
>> [MUSIC PLAYING]