1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [MUSIC PLAYING] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 DAVID J. Malan: Baiklah. 5 00:00:12,660 --> 00:00:15,590 Ini adalah CS50, dan ini adalah awal minggu kedua. 6 00:00:15,590 --> 00:00:19,120 Jadi mari kita mulai hari ini dengan bug. 7 00:00:19,120 --> 00:00:20,974 Sebuah bug, tentu saja, adalah kesalahan dalam program, 8 00:00:20,974 --> 00:00:22,890 dan Anda akan mendapatkan sangat akrab dengan konsep ini 9 00:00:22,890 --> 00:00:26,050 jika Anda belum pernah diprogram sebelumnya. pset0 dan sekarang pset1. 10 00:00:26,050 --> 00:00:29,280 Tapi mari kita mempertimbangkan sesuatu sederhana pada awalnya. 11 00:00:29,280 --> 00:00:32,189 Program ini di sini bahwa saya melempar bersama-sama di muka, 12 00:00:32,189 --> 00:00:37,280 dan saya menyatakan bahwa ini harus mencetak 10 pada layar menggunakan printf, 13 00:00:37,280 --> 00:00:41,020 tapi itu tampaknya kereta dalam beberapa cara. 14 00:00:41,020 --> 00:00:45,370 >> Mengingat spesifikasi yang yang harus mencetak 10, 15 00:00:45,370 --> 00:00:50,230 tetapi tidak rupanya, apa akan Anda mengklaim adalah bug? 16 00:00:50,230 --> 00:00:52,004 Ya? 17 00:00:52,004 --> 00:00:54,420 Jadi itu adalah off oleh satu kesalahan, dan apa yang Anda maksud dengan itu? 18 00:00:54,420 --> 00:01:00,991 19 00:01:00,991 --> 00:01:01,490 OK. 20 00:01:01,490 --> 00:01:09,820 21 00:01:09,820 --> 00:01:10,410 Sangat baik. 22 00:01:10,410 --> 00:01:13,930 Jadi kita telah ditentukan mulai dari nilai nol untuk i, 23 00:01:13,930 --> 00:01:18,399 dan kami telah ditentukan nilai n dari 10, tapi kami telah digunakan kurang dari atau sama dengan. 24 00:01:18,399 --> 00:01:21,190 Dan alasan bahwa ini adalah dua karakter, bukan hanya satu simbol, 25 00:01:21,190 --> 00:01:22,630 seperti di buku matematika, adalah bahwa Anda tidak memiliki 26 00:01:22,630 --> 00:01:24,880 cara mengekspresikan satu ekuivalen karakter. 27 00:01:24,880 --> 00:01:28,450 >> Jadi itu berarti kurang dari, tapi jika Anda mulai menghitung dari nol, 28 00:01:28,450 --> 00:01:31,690 tapi Anda menghitung semua jalan melalui dan sama dengan 10, 29 00:01:31,690 --> 00:01:34,170 Anda tentu saja akan Jumlah 11 hal total. 30 00:01:34,170 --> 00:01:35,900 Jadi Anda akan mencetak 11. 31 00:01:35,900 --> 00:01:37,990 Jadi apa yang mungkin untuk memperbaiki ini? 32 00:01:37,990 --> 00:01:39,970 Ya? 33 00:01:39,970 --> 00:01:43,980 >> Jadi hanya menyesuaikan kurang dari atau sama dengan hanya kurang dari, 34 00:01:43,980 --> 00:01:46,250 dan ada, saya menyatakan, mungkin solusi lain, juga. 35 00:01:46,250 --> 00:01:47,210 Apa yang mungkin pun yang Anda lakukan? 36 00:01:47,210 --> 00:01:48,590 Ya? 37 00:01:48,590 --> 00:01:53,660 >> Jadi mulai menyamai ke 1, dan meninggalkan kurang dari atau sama dengan. 38 00:01:53,660 --> 00:01:56,187 Dan terus terang saya akan mengklaim bahwa, bagi manusia yang khas, 39 00:01:56,187 --> 00:01:57,770 ini mungkin lebih mudah. 40 00:01:57,770 --> 00:02:00,280 Mulai menghitung pada 1 dan menghitung sampai 10. 41 00:02:00,280 --> 00:02:01,690 Pada dasarnya melakukan apa yang Anda maksud. 42 00:02:01,690 --> 00:02:04,010 >> Tapi kenyataannya adalah di pemrograman, seperti yang kita lihat, 43 00:02:04,010 --> 00:02:07,598 ilmuwan komputer dan programmer umumnya mulai menghitung dari nol. 44 00:02:07,598 --> 00:02:09,389 Jadi itu baik sekali Anda bisa digunakan untuk itu. 45 00:02:09,389 --> 00:02:12,640 Kondisi Anda akan umumnya sesuatu seperti kurang dari. 46 00:02:12,640 --> 00:02:14,910 Jadi hanya logis kesalahan yang kita sekarang bisa 47 00:02:14,910 --> 00:02:17,990 memperbaiki dan akhirnya ulang ini dan mendapatkan hanya 10. 48 00:02:17,990 --> 00:02:19,610 >> Nah bagaimana bug ini di sini? 49 00:02:19,610 --> 00:02:24,200 Di sini, sekali lagi, saya menyatakan bahwa saya memiliki tujuan mencetak 10 stars-- 50 00:02:24,200 --> 00:02:28,140 satu per baris saat ini, tapi itu tidak. 51 00:02:28,140 --> 00:02:30,940 Sebelum kami mengusulkan apa memperbaiki adalah, apa ini 52 00:02:30,940 --> 00:02:34,640 mencetak visual jika saya harus mengkompilasi dan menjalankan program ini menurut Anda? 53 00:02:34,640 --> 00:02:35,140 Ya? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Bintang. 56 00:02:38,860 --> 00:02:41,690 Jadi semua bintang pada baris yang sama adalah apa yang saya dengar, 57 00:02:41,690 --> 00:02:43,391 dan kemudian karakter baris baru. 58 00:02:43,391 --> 00:02:44,140 Jadi mari kita coba itu. 59 00:02:44,140 --> 00:02:48,710 Jadi make-kereta 1, masukkan, dan aku melihat perintah dentang 60 00:02:48,710 --> 00:02:50,090 yang kita bicarakan terakhir kali. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, dan memang saya lihat semua 10 pada baris yang sama meskipun saya mengklaim 62 00:02:55,180 --> 00:02:58,690 dalam spesifikasi saya hanya komentar atas kode yang saya dimaksudkan untuk melakukan satu per 63 00:02:58,690 --> 00:02:59,230 line. 64 00:02:59,230 --> 00:03:00,580 Tapi ini terlihat benar. 65 00:03:00,580 --> 00:03:04,620 >> Sekarang baris 15 sepertinya aku mencetak bintang, dan kemudian baris 16 66 00:03:04,620 --> 00:03:06,620 sepertinya aku pencetakan karakter baris baru, 67 00:03:06,620 --> 00:03:09,560 dan mereka berdua menjorok sehingga Aku dalam loop jelas. 68 00:03:09,560 --> 00:03:13,610 Jadi seharusnya tidak saya lakukan star, baru line, star, baris baru, bintang, baris baru? 69 00:03:13,610 --> 00:03:14,110 Ya? 70 00:03:14,110 --> 00:03:18,430 71 00:03:18,430 --> 00:03:21,240 >> Ya, tidak seperti bahasa seperti Python, jika Anda terbiasa, 72 00:03:21,240 --> 00:03:23,540 lekukan tidak masalah ke komputer. 73 00:03:23,540 --> 00:03:25,280 Hanya penting bagi manusia. 74 00:03:25,280 --> 00:03:29,860 Jadi garis sedangkan di sini saya sudah menemukan 15 dan 16-- yang terlihat indah, 75 00:03:29,860 --> 00:03:31,330 tapi komputer tidak peduli. 76 00:03:31,330 --> 00:03:34,640 Komputer peduli benar-benar memiliki kurung kurawal 77 00:03:34,640 --> 00:03:36,310 sekitar baris kode. 78 00:03:36,310 --> 00:03:39,520 >> Sehingga itu clear-- seperti di Scratch-- bahwa kedua baris kode 79 00:03:39,520 --> 00:03:40,450 harus dieksekusi. 80 00:03:40,450 --> 00:03:44,390 Seperti salah satu teka-teki Scratch kuning potongan lagi dan lagi dan lagi. 81 00:03:44,390 --> 00:03:50,920 >> Jadi sekarang jika saya kembali menjalankan ini program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 Saya memiliki kesalahan sekarang. 83 00:03:51,770 --> 00:03:54,212 Apa yang saya lupa lakukan? 84 00:03:54,212 --> 00:03:55,420 Ya, jadi aku tidak compile. 85 00:03:55,420 --> 00:03:56,740 Jadi membuat kereta-2. 86 00:03:56,740 --> 00:03:59,840 Tidak ada berkas karena saya tidak benar-benar mengkompilasi versi kedua. 87 00:03:59,840 --> 00:04:04,860 Jadi sekarang menarik dideklarasikan variable-- tidak 2. 88 00:04:04,860 --> 00:04:05,510 Kami melakukan 1. 89 00:04:05,510 --> 00:04:11,050 Membuat kereta-1-- ./buggy-1-- dan sekarang masing-masing adalah pada baris yang sama. 90 00:04:11,050 --> 00:04:13,880 >> Sekarang ada pengecualian untuk ini klaim seharusnya saya 91 00:04:13,880 --> 00:04:15,520 Anda perlu ini kurung kurawal. 92 00:04:15,520 --> 00:04:20,160 Kapan sebenarnya OK-- jika Anda sudah melihat pada bagian atau textbooks-- 93 00:04:20,160 --> 00:04:22,130 untuk menghilangkan kurung kurawal? 94 00:04:22,130 --> 00:04:22,630 Ya? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Tepat. 97 00:04:26,870 --> 00:04:28,940 Ketika hanya ada satu baris kode yang Anda 98 00:04:28,940 --> 00:04:32,830 ingin berhubungan dengan lingkaran seperti dalam contoh pertama kami. 99 00:04:32,830 --> 00:04:36,380 Ini adalah sah untuk menghilangkan kurung kurawal 100 00:04:36,380 --> 00:04:40,310 seperti semacam kenyamanan dari compiler untuk Anda. 101 00:04:40,310 --> 00:04:40,810 Ya? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Pertanyaan yang bagus. 104 00:04:43,930 --> 00:04:45,500 Apakah itu dianggap sebagai kesalahan gaya? 105 00:04:45,500 --> 00:04:49,340 Kami akan promote-- seperti dalam CS50 panduan gaya, URL yang 106 00:04:49,340 --> 00:04:51,926 dalam pset1-- yang selalu menggunakan kurung kurawal. 107 00:04:51,926 --> 00:04:53,550 Tentu saja jika Anda baru untuk pemrograman. 108 00:04:53,550 --> 00:04:56,800 Kenyataannya adalah kita tidak akan melarang Anda 109 00:04:56,800 --> 00:04:58,680 melakukan kemudahan ini. 110 00:04:58,680 --> 00:05:00,846 Tapi jika Anda hanya mendapatkan ke dalam ayunan hal, 111 00:05:00,846 --> 00:05:04,020 benar-benar hanya selalu menggunakan keriting kawat gigi sampai Anda mendapatkan menguasainya. 112 00:05:04,020 --> 00:05:04,640 Pertanyaan yang bagus. 113 00:05:04,640 --> 00:05:05,320 >> Baiklah. 114 00:05:05,320 --> 00:05:07,660 Sehingga saat itu bug. 115 00:05:07,660 --> 00:05:09,190 Setidaknya dalam sesuatu yang cukup sederhana. 116 00:05:09,190 --> 00:05:11,260 Namun Anda mungkin berpikir ini cukup sederhana, kan? 117 00:05:11,260 --> 00:05:13,635 Ini adalah semacam minggu pertama memandang bahasa 118 00:05:13,635 --> 00:05:14,890 seperti, melihat bug Anda di dalamnya. 119 00:05:14,890 --> 00:05:17,250 Tetapi kenyataannya ini benar-benar representatif 120 00:05:17,250 --> 00:05:20,310 dari beberapa masalah yang cukup menakutkan yang dapat timbul di dunia nyata. 121 00:05:20,310 --> 00:05:23,530 >> Jadi beberapa dari Anda mungkin ingat jika Anda mengikuti berita teknologi, 122 00:05:23,530 --> 00:05:25,740 atau bahkan mungkin tertangkap angin ini pada bulan Februari 123 00:05:25,740 --> 00:05:29,434 ini tahun lalu bahwa Apple telah membuat sedikit kesalahan di kedua iOS, 124 00:05:29,434 --> 00:05:31,350 sistem operasi pada ponsel mereka, dan juga 125 00:05:31,350 --> 00:05:34,220 Mac OS, sistem operasi pada desktop dan laptop mereka. 126 00:05:34,220 --> 00:05:36,480 Dan Anda melihat headline seperti ini. 127 00:05:36,480 --> 00:05:41,120 Dan setelah itu, Apple berjanji untuk memperbaiki bug ini, 128 00:05:41,120 --> 00:05:45,950 dan sangat cepat melakukan memperbaikinya di iOS, tapi kemudian akhirnya tetap di Mac OS 129 00:05:45,950 --> 00:05:46,810 juga. 130 00:05:46,810 --> 00:05:50,370 >> Sekarang tidak ada berita ini saja benar-benar mengungkapkan apa masalah mendasar itu, 131 00:05:50,370 --> 00:05:55,640 tapi bug ini akhirnya dikurangi menjadi bug di SSL, secure socket layer. 132 00:05:55,640 --> 00:05:57,390 Dan cerita panjang pendek, ini adalah perangkat lunak yang 133 00:05:57,390 --> 00:06:01,030 bahwa browser dan lainnya perangkat lunak yang digunakan untuk melakukan apa? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Jika saya mengatakan bahwa SSL adalah terlibat, setiap kali Anda 136 00:06:06,860 --> 00:06:13,920 mengunjungi URL yang dimulai dengan HTTPS, lalu apa mungkin SSL berhubungan dengan? 137 00:06:13,920 --> 00:06:14,580 Enkripsi. 138 00:06:14,580 --> 00:06:16,470 Jadi kita akan berbicara tentang ini dalam beberapa hari mendatang. 139 00:06:16,470 --> 00:06:18,750 Enkripsi, seni mengacak informasi. 140 00:06:18,750 --> 00:06:22,200 >> Tapi cerita panjang pendek, Apple beberapa waktu yang lalu telah membuat kesalahan 141 00:06:22,200 --> 00:06:25,970 dalam pelaksanaannya terhadap SSL, software yang pada akhirnya mengimplementasikan 142 00:06:25,970 --> 00:06:30,120 URL seperti HTTPS atau max koneksi di sana juga. 143 00:06:30,120 --> 00:06:32,850 Hasil yang adalah bahwa Anda koneksi bisa berpotensi 144 00:06:32,850 --> 00:06:33,920 disadap. 145 00:06:33,920 --> 00:06:37,130 Dan koneksi Anda yang belum tentu dienkripsi 146 00:06:37,130 --> 00:06:40,350 jika Anda memiliki beberapa orang jahat di antara Anda dan situs web tujuan yang 147 00:06:40,350 --> 00:06:42,170 tahu bagaimana untuk mengambil keuntungan dari hal ini. 148 00:06:42,170 --> 00:06:45,090 >> Kini Apple akhirnya diposting a memperbaiki untuk ini akhirnya, 149 00:06:45,090 --> 00:06:46,920 dan deskripsi dari memperbaiki mereka ini. 150 00:06:46,920 --> 00:06:49,878 Transportasi aman gagal untuk memvalidasi keaslian koneksi. 151 00:06:49,878 --> 00:06:52,920 Masalah ini ditangani oleh memulihkan hilang langkah validasi. 152 00:06:52,920 --> 00:06:57,250 >> Jadi ini adalah penjelasan bergelombang dan tangan untuk hanya mengatakan bahwa kita kacau. 153 00:06:57,250 --> 00:07:00,920 Ada secara harfiah satu baris kode yang buggy 154 00:07:00,920 --> 00:07:05,130 pelaksanaannya dari SSL, dan jika Anda pergi online dan mencari ini 155 00:07:05,130 --> 00:07:07,210 Anda benar-benar dapat menemukan kode sumber asli. 156 00:07:07,210 --> 00:07:11,960 Misalnya, ini adalah screen shot dari hanya sebagian dari file yang cukup besar, 157 00:07:11,960 --> 00:07:15,965 tapi ini adalah fungsi rupanya disebut SSL memverifikasi Server tanda pertukaran kunci. 158 00:07:15,965 --> 00:07:17,840 Dan dibutuhkan sekelompok argumen dan masukan. 159 00:07:17,840 --> 00:07:20,298 Dan kita tidak akan fokus terlalu banyak pada minutia sana, 160 00:07:20,298 --> 00:07:24,390 tetapi jika Anda berfokus pada kode di dalam itu paling atas function-- mari 161 00:07:24,390 --> 00:07:25,590 memperbesar itu. 162 00:07:25,590 --> 00:07:28,140 Anda mungkin sudah menduga apa kesalahan mungkin 163 00:07:28,140 --> 00:07:31,230 bahkan jika Anda tidak tahu akhirnya apa yang Anda cari di. 164 00:07:31,230 --> 00:07:35,924 Ada semacam anomali di sini, yang adalah apa? 165 00:07:35,924 --> 00:07:38,940 >> Ya, saya tidak benar-benar seperti tampilan dua goto gagal. 166 00:07:38,940 --> 00:07:42,060 Terus terang, saya tidak benar-benar tahu apa goto gagal berarti, tetapi memiliki dua dari mereka 167 00:07:42,060 --> 00:07:42,810 kembali ke belakang. 168 00:07:42,810 --> 00:07:45,290 Itu hanya semacam menggosok saya intelektual dengan cara yang salah, 169 00:07:45,290 --> 00:07:48,910 dan memang jika kita memperbesar hanya jalur tersebut, ini adalah C. 170 00:07:48,910 --> 00:07:52,220 >> Jadi banyak kode Apple adalah dirinya ditulis dalam C, 171 00:07:52,220 --> 00:07:55,780 dan ini rupanya benar-benar equivalent-- 172 00:07:55,780 --> 00:07:59,060 tidak itu lekukan cantik versi, tetapi jika Anda menyadari kenyataan 173 00:07:59,060 --> 00:08:02,560 bahwa tidak ada kurung kurawal, apa Apple benar-benar menulis adalah kode yang terlihat 174 00:08:02,560 --> 00:08:03,540 seperti ini. 175 00:08:03,540 --> 00:08:07,080 Jadi saya sudah memperkecil keluar dan aku hanya tetap lekukan dalam arti 176 00:08:07,080 --> 00:08:10,690 bahwa jika tidak ada kurung kurawal, bahwa goto kedua gagal yang ada di kuning 177 00:08:10,690 --> 00:08:12,500 akan mengeksekusi apa pun. 178 00:08:12,500 --> 00:08:15,540 Ini tidak terkait dengan jika kondisi di atasnya. 179 00:08:15,540 --> 00:08:19,590 >> Jadi, bahkan lagi, jika Anda tidak cukup memahami apa ini mungkin bisa 180 00:08:19,590 --> 00:08:23,230 melakukan, tahu bahwa masing-masing conditions-- setiap lini ini 181 00:08:23,230 --> 00:08:26,180 adalah langkah yang sangat penting dalam proses pemeriksaan 182 00:08:26,180 --> 00:08:28,350 jika data Anda sebenarnya dienkripsi. 183 00:08:28,350 --> 00:08:31,710 Jadi melewatkan salah satu dari ini langkah, bukan ide yang terbaik. 184 00:08:31,710 --> 00:08:34,840 >> Tapi karena kita punya ini goto kedua gagal dalam kuning, 185 00:08:34,840 --> 00:08:36,840 dan karena setelah kami semacam estetis 186 00:08:36,840 --> 00:08:40,480 memindahkannya ke kiri di mana logis pada saat ini, apa 187 00:08:40,480 --> 00:08:43,230 artinya ini bagi baris kode di bawah goto kedua 188 00:08:43,230 --> 00:08:46,480 gagal akan Anda pikirkan? 189 00:08:46,480 --> 00:08:48,860 Ini selalu akan dilewati. 190 00:08:48,860 --> 00:08:52,100 Jadi gotos umumnya disukai untuk alasan kita tidak akan benar-benar masuk ke dalam, 191 00:08:52,100 --> 00:08:54,940 dan memang di CS50 kita cenderung tidak untuk mengajarkan pernyataan goto ini, 192 00:08:54,940 --> 00:08:58,130 tetapi Anda bisa memikirkan goto gagal sebagai melompat makna pergi 193 00:08:58,130 --> 00:08:59,600 ke beberapa bagian lain dari kode. 194 00:08:59,600 --> 00:09:03,120 >> Dengan kata lain melompati baris terakhir ini sama sekali, 195 00:09:03,120 --> 00:09:07,420 sehingga hasil ini bodoh kesalahan sederhana yang hanya 196 00:09:07,420 --> 00:09:10,330 akibat dari mungkin seseorang menyalin dan menyisipkan satu juga 197 00:09:10,330 --> 00:09:14,150 berkali-kali adalah bahwa seluruh keamanan iOS dan Mac OS 198 00:09:14,150 --> 00:09:18,240 rentan terhadap intersepsi oleh orang-orang jahat untuk beberapa waktu. 199 00:09:18,240 --> 00:09:19,940 Sampai Apple akhirnya tetap ini. 200 00:09:19,940 --> 00:09:23,100 >> Sekarang jika beberapa dari Anda benar-benar menjalankan versi lama dari iOS atau Mac OS, 201 00:09:23,100 --> 00:09:27,250 Anda dapat pergi ke gotofail.com yang adalah website yang seseorang mengatur 202 00:09:27,250 --> 00:09:29,190 pada dasarnya menentukan pemrograman 203 00:09:29,190 --> 00:09:30,980 jika komputer Anda masih rentan. 204 00:09:30,980 --> 00:09:33,600 Dan terus terang, jika sudah, itu mungkin ide yang baik 205 00:09:33,600 --> 00:09:36,870 untuk memperbarui telepon Anda atau Mac Anda pada saat ini. 206 00:09:36,870 --> 00:09:40,120 Tapi ada, hanya bukti betapa apresiasi ini tingkat rendah 207 00:09:40,120 --> 00:09:42,400 Rincian dan cukup ide sederhana bisa benar-benar 208 00:09:42,400 --> 00:09:44,590 diterjemahkan ke dalam keputusan dan masalah yang 209 00:09:44,590 --> 00:09:47,320 affected-- di case-- ini jutaan orang. 210 00:09:47,320 --> 00:09:49,107 >> Sekarang kata administrasi. 211 00:09:49,107 --> 00:09:50,690 Bagian ini akan dimulai Minggu mendatang. 212 00:09:50,690 --> 00:09:53,360 Anda akan menerima email dengan akhir pekan tentang bagian, di mana titik 213 00:09:53,360 --> 00:09:55,290 proses resectioning akan mulai jika Anda sudah 214 00:09:55,290 --> 00:09:56,998 menyadari bahwa Anda sekarang memiliki beberapa konflik baru. 215 00:09:56,998 --> 00:10:00,180 Jadi ini terjadi setiap tahun, dan kami akan mengakomodasi di masa yang akan datang. 216 00:10:00,180 --> 00:10:02,430 >> Kantor hours-- lakukan menjaga mata pada jadwal ini di sini. 217 00:10:02,430 --> 00:10:05,100 Perubahan sedikit minggu ini, terutama waktu mulai 218 00:10:05,100 --> 00:10:08,180 dan lokasi, sehingga berkonsultasi bahwa sebelum menuju ke jam kantor 219 00:10:08,180 --> 00:10:09,520 salah satu dari empat malam. 220 00:10:09,520 --> 00:10:12,680 Dan sekarang kata pada penilaian, terutama karena Anda menyelam ke dalam masalah 221 00:10:12,680 --> 00:10:14,350 menetapkan satu dan seterusnya. 222 00:10:14,350 --> 00:10:17,070 >> Jadi per spesifikasi, ini umumnya 223 00:10:17,070 --> 00:10:20,360 sumbu bersama yang kita mengevaluasi pekerjaan Anda. 224 00:10:20,360 --> 00:10:23,170 Lingkup mengacu pada apa Sejauh alat kode Anda 225 00:10:23,170 --> 00:10:25,690 fitur yang diperlukan oleh spesifikasi kami. 226 00:10:25,690 --> 00:10:28,290 Dengan kata lain, berapa banyak set piece apakah Anda menggigit. 227 00:10:28,290 --> 00:10:30,440 Apakah Anda melakukan ketiga hal itu, setengah dari itu, 100% dari itu. 228 00:10:30,440 --> 00:10:33,000 Bahkan jika itu tidak benar, berapa banyak Anda mencoba? 229 00:10:33,000 --> 00:10:35,290 Jadi yang menangkap tingkat usaha dan jumlah 230 00:10:35,290 --> 00:10:38,260 yang Anda menggigit orang masalah masalah set ini. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- satu ini, untuk sejauh mana, adalah kode Anda 232 00:10:40,690 --> 00:10:43,150 konsisten dengan kami spesifikasi dan bebas dari bug. 233 00:10:43,150 --> 00:10:44,770 Jadi tidak bekerja dengan benar? 234 00:10:44,770 --> 00:10:48,700 Jika kita memberikan beberapa masukan, apakah itu memberi kita output yang kita harapkan? 235 00:10:48,700 --> 00:10:52,570 Design-- sekarang ini adalah yang pertama dari yang sangat kualitatif, 236 00:10:52,570 --> 00:10:56,180 atau orang-orang yang membutuhkan penilaian manusia. 237 00:10:56,180 --> 00:10:59,690 Dan memang, ini adalah mengapa kita memiliki staf yang begitu banyak rekan-rekan mengajar dan program 238 00:10:59,690 --> 00:11:00,350 asisten. 239 00:11:00,350 --> 00:11:03,480 Sampai sejauh mana Anda kode yang ditulis dengan baik? 240 00:11:03,480 --> 00:11:05,810 >> Dan lagi ini adalah sangat penilaian kualitatif 241 00:11:05,810 --> 00:11:09,100 yang akan bekerja dengan Anda pada bi-terarah dalam minggu-minggu yang akan datang. 242 00:11:09,100 --> 00:11:12,060 Sehingga ketika Anda mendapatkan tidak hanya nilai numerik, tetapi juga 243 00:11:12,060 --> 00:11:16,682 sebuah nilai tertulis, atau umpan balik diketik, atau umpan balik yang ditulis dalam kata-kata bahasa Inggris. 244 00:11:16,682 --> 00:11:19,640 Itulah yang akan kita gunakan untuk mengarahkan Anda menuju benar-benar menulis kode yang lebih baik. 245 00:11:19,640 --> 00:11:23,320 Dan dalam kuliah dan bagian, kami akan mencoba untuk menunjuk out-- sesering yang kami can-- 246 00:11:23,320 --> 00:11:26,420 apa yang membuat sebuah program tidak hanya benar dan fungsional baik, 247 00:11:26,420 --> 00:11:28,200 tetapi juga dirancang dengan baik. 248 00:11:28,200 --> 00:11:31,850 Yang paling efisien itu bisa, atau bahkan yang paling indah dapat. 249 00:11:31,850 --> 00:11:33,100 >> Yang membawa kita ke gaya. 250 00:11:33,100 --> 00:11:36,876 Gaya akhirnya adalah penimbangan estetik. 251 00:11:36,876 --> 00:11:38,750 Apakah Anda memilih yang baik nama untuk variabel Anda? 252 00:11:38,750 --> 00:11:40,330 Apakah Anda menjorok kode Anda dengan benar? 253 00:11:40,330 --> 00:11:44,010 Apakah terlihat baik, dan oleh karena itu, adalah mudah bagi manusia lain 254 00:11:44,010 --> 00:11:46,550 untuk membaca masing-masing Anda dari kebenarannya. 255 00:11:46,550 --> 00:11:50,300 >> Sekarang umumnya per silabus, kami mencetak hal-hal ini pada skala lima poin. 256 00:11:50,300 --> 00:11:53,640 Dan biarkan aku menempa hal tersebut bahwa tiga memang baik. 257 00:11:53,640 --> 00:11:55,550 Sangat cepat melakukan orang mulai melakukan aritmatika. 258 00:11:55,550 --> 00:11:58,133 Ketika mereka mendapatkan tiga dari lima pada kebenaran untuk beberapa PSET 259 00:11:58,133 --> 00:12:02,040 dan mereka berpikir sialan, aku akan 60% yang pada dasarnya adalah D atau E. 260 00:12:02,040 --> 00:12:03,980 >> Itu bukan cara kita memikirkan angka-angka ini. 261 00:12:03,980 --> 00:12:06,880 Tiga memang baik, dan apa yang kita umumnya mengharapkan pada awal 262 00:12:06,880 --> 00:12:09,820 istilah adalah bahwa jika Anda mendapatkan sekelompok three's-- mungkin beberapa 263 00:12:09,820 --> 00:12:12,540 pameran, beberapa fours-- atau beberapa berpasangan, beberapa fours-- 264 00:12:12,540 --> 00:12:13,748 itu adalah tempat yang baik untuk memulai. 265 00:12:13,748 --> 00:12:16,320 Dan selama kita melihat lintasan ke atas dari waktu ke waktu, 266 00:12:16,320 --> 00:12:18,540 Anda berada di tempat yang sangat baik. 267 00:12:18,540 --> 00:12:20,752 >> Rumus yang kita gunakan untuk hal berat badan pada dasarnya 268 00:12:20,752 --> 00:12:22,710 ini per silabus, yang hanya berarti bahwa kita 269 00:12:22,710 --> 00:12:24,750 memberikan bobot yang lebih kebenaran. 270 00:12:24,750 --> 00:12:27,930 Karena itu sangat sering kebenaran yang mengambil sebagian besar waktu. 271 00:12:27,930 --> 00:12:28,760 Percayalah sekarang. 272 00:12:28,760 --> 00:12:31,190 Anda akan find-- setidaknya dalam satu pset-- bahwa Anda 273 00:12:31,190 --> 00:12:36,790 menghabiskan 90% dari waktu Anda bekerja pada 10% dari masalah. 274 00:12:36,790 --> 00:12:39,320 >> Dan segala sesuatu yang semacam bekerja kecuali untuk satu atau dua bug, 275 00:12:39,320 --> 00:12:41,570 dan mereka adalah bug yang membuat Anda sampai larut malam. 276 00:12:41,570 --> 00:12:43,380 Mereka adalah orang-orang yang semacam melarikan diri Anda. 277 00:12:43,380 --> 00:12:45,560 Tapi setelah tidur di atasnya, atau menghadiri jam kantor 278 00:12:45,560 --> 00:12:48,844 atau mengajukan pertanyaan secara online, ketika Anda sampai ke tujuan itu 100%, 279 00:12:48,844 --> 00:12:50,760 dan itulah mengapa kami berat kebenaran yang paling. 280 00:12:50,760 --> 00:12:54,102 Desain sedikit kurang, dan gaya sedikit kurang dari itu. 281 00:12:54,102 --> 00:12:56,060 Namun perlu gaya mind-- mungkin yang paling mudah 282 00:12:56,060 --> 00:12:58,890 ini untuk menggigit sesuai panduan gaya. 283 00:12:58,890 --> 00:13:01,580 >> Dan sekarang, lebih serius perhatikan pada kejujuran akademik. 284 00:13:01,580 --> 00:13:05,000 CS50 memiliki perbedaan malang menjadi produsen terbesar Papan Iklan 285 00:13:05,000 --> 00:13:07,330 kasus hampir setiap tahun secara historis. 286 00:13:07,330 --> 00:13:11,012 Hal ini bukan karena siswa menyontek di CS50 lagi daripada kelas lain, 287 00:13:11,012 --> 00:13:13,720 tetapi karena dengan sifat pekerjaan, fakta bahwa itu elektronik, 288 00:13:13,720 --> 00:13:16,636 fakta bahwa kita mencarinya, dan kenyataan kita adalah ilmuwan komputer, 289 00:13:16,636 --> 00:13:20,570 Saya dapat mengatakan kita sayangnya sangat baik dalam mendeteksi itu. 290 00:13:20,570 --> 00:13:22,710 >> Jadi apa artinya ini secara riil? 291 00:13:22,710 --> 00:13:24,820 Jadi, per silabus, filosofi program ini 292 00:13:24,820 --> 00:13:28,090 benar-benar mendidih hingga masuk akal. 293 00:13:28,090 --> 00:13:31,684 Ada baris ini antara melakukan pekerjaan seseorang pada Anda sendiri 294 00:13:31,684 --> 00:13:34,100 dan mendapatkan sedikit bantuan yang wajar dari seorang teman, 295 00:13:34,100 --> 00:13:38,020 dan terang-terangan melakukan yang bekerja untuk Anda teman, atau mengirim dia kode Anda 296 00:13:38,020 --> 00:13:41,080 sehingga ia hanya bisa mengambil atau meminjam keluar benar. 297 00:13:41,080 --> 00:13:43,580 Dan itu melewati batas bahwa kita ditarik dalam kelas. 298 00:13:43,580 --> 00:13:45,410 >> Lihat, silabus akhirnya untuk lini 299 00:13:45,410 --> 00:13:48,209 bahwa kita menarik sebagai wajar dan perilaku yang tidak masuk akal, 300 00:13:48,209 --> 00:13:50,000 tapi itu benar-benar mendidih ke esensi 301 00:13:50,000 --> 00:13:53,980 pekerjaan Anda perlu menjadi Anda sendiri pada akhirnya. 302 00:13:53,980 --> 00:13:56,230 Sekarang dengan mengatakan bahwa, ada heuristik. 303 00:13:56,230 --> 00:13:58,980 Karena seperti yang mungkin Anda imagine-- dari jam kantor dan visual 304 00:13:58,980 --> 00:14:01,060 dan video kami telah ditampilkan sehingga far-- CS50 305 00:14:01,060 --> 00:14:04,530 memang dimaksudkan untuk menjadi sebagai kolaboratif dan sebagai koperasi dan sebagai sosial 306 00:14:04,530 --> 00:14:06,450 mungkin. 307 00:14:06,450 --> 00:14:08,570 Seperti kolaborasi seperti yang ketat. 308 00:14:08,570 --> 00:14:11,314 >> Tapi dengan ini mengatakan, heuristik, seperti yang Anda lihat dalam silabus, 309 00:14:11,314 --> 00:14:12,980 adalah bahwa ketika Anda mengalami beberapa masalah. 310 00:14:12,980 --> 00:14:16,470 Anda memiliki beberapa bug dalam kode Anda bahwa Anda tidak bisa memecahkan, adalah wajar bagi Anda 311 00:14:16,470 --> 00:14:18,039 untuk menampilkan kode Anda kepada orang lain. 312 00:14:18,039 --> 00:14:21,080 Seorang teman bahkan di kelas, teman duduk di sebelah Anda di jam kerja, 313 00:14:21,080 --> 00:14:22,680 atau anggota staf. 314 00:14:22,680 --> 00:14:25,810 Tapi mereka mungkin tidak menunjukkan kode mereka kepada Anda. 315 00:14:25,810 --> 00:14:27,710 >> Dengan kata lain, sebuah menjawab question-- Anda 316 00:14:27,710 --> 00:14:29,940 Aku butuh help-- tidak oh, inilah kode saya. 317 00:14:29,940 --> 00:14:32,440 Lihatlah ini dan menyimpulkan dari itu apa yang akan Anda. 318 00:14:32,440 --> 00:14:34,580 Sekarang, tentu saja, ada cara jelas untuk permainan 319 00:14:34,580 --> 00:14:37,760 sistem ini dimana saya akan menunjukkan kode saya sebelum memiliki pertanyaan. 320 00:14:37,760 --> 00:14:40,150 Anda tunjukkan kode Anda saya sebelum memiliki pertanyaan. 321 00:14:40,150 --> 00:14:45,870 Tapi lihat silabus lagi untuk rincian halus di mana garis ini. 322 00:14:45,870 --> 00:14:50,606 >> Hanya untuk sekarang melukis gambar dan berbagi sebagai transparan mungkin 323 00:14:50,606 --> 00:14:53,480 di mana kita berada di dalam beberapa tahun terakhir, ini adalah jumlah kasus Dewan Iklan 324 00:14:53,480 --> 00:14:56,260 CS50 yang telah memiliki lebih dari tujuh tahun terakhir. 325 00:14:56,260 --> 00:14:58,717 Dengan 14 kasus jatuhnya terbaru ini. 326 00:14:58,717 --> 00:15:01,300 Dalam hal siswa yang terlibat, itu 20 beberapa siswa yang aneh 327 00:15:01,300 --> 00:15:02,490 ini musim gugur yang lalu. 328 00:15:02,490 --> 00:15:05,670 Ada puncak 33 siswa beberapa tahun yang lalu. 329 00:15:05,670 --> 00:15:08,830 Banyak di antaranya sayangnya tidak lagi di sini di kampus. 330 00:15:08,830 --> 00:15:13,100 >> Siswa yang terlibat sebagai persentase dari kelas secara historis berkisar antara 0% 331 00:15:13,100 --> 00:15:17,300 menjadi 5,3%, yang hanya untuk mengatakan ini setiap tahun tantangan. 332 00:15:17,300 --> 00:15:20,390 Dan untuk mencapai tujuan itu, apa yang kami ingin lakukan adalah menyampaikan satu 333 00:15:20,390 --> 00:15:24,310 bahwa kita dd-- hanya FYI bandingkan di sebuah keadilan untuk para siswa yang 334 00:15:24,310 --> 00:15:26,520 adalah mengikuti garis yang sesuai. 335 00:15:26,520 --> 00:15:29,620 Kami melakukan membandingkan semua saat ini pengiriman terhadap semua misi masa lalu 336 00:15:29,620 --> 00:15:30,840 dari bertahun-tahun terakhir. 337 00:15:30,840 --> 00:15:33,620 >> Kita tahu juga bagaimana Google sekitar dan menemukan repositori kode 338 00:15:33,620 --> 00:15:36,360 online, forum diskusi online, situs kerja online. 339 00:15:36,360 --> 00:15:41,580 Jika seorang siswa dapat menemukannya, kita bisa pasti merasa seperti yang kita menyesal dilakukan. 340 00:15:41,580 --> 00:15:45,330 Jadi apa yang Anda akan melihat dalam silabus meskipun penyesalan klausul ini. 341 00:15:45,330 --> 00:15:47,500 Aku pasti bisa menghargai, dan kita semua memiliki 342 00:15:47,500 --> 00:15:50,870 Staf telah melakukan kursus seperti ini, atau yang ini sendiri dari waktu ke waktu, 343 00:15:50,870 --> 00:15:53,997 pasti tahu bagaimana rasanya ketika hidup mendapat di jalan ketika Anda memiliki 344 00:15:53,997 --> 00:15:56,080 beberapa larut malam deadline-- tidak hanya di kelas ini, 345 00:15:56,080 --> 00:15:58,660 tapi another-- ketika Anda benar-benar kelelahan, stres, 346 00:15:58,660 --> 00:16:00,659 memiliki jumlah yang banyak sekali hal-hal lain yang dapat dilakukan. 347 00:16:00,659 --> 00:16:03,660 Anda akan membuat di beberapa titik di hidup pasti buruk, mungkin terlambat 348 00:16:03,660 --> 00:16:04,620 Keputusan malam. 349 00:16:04,620 --> 00:16:06,520 >> Jadi per silabus, ada klausul ini, 350 00:16:06,520 --> 00:16:10,629 sehingga jika dalam waktu 72 jam untuk membuat beberapa keputusan yang buruk, Anda mencoba untuk memperbaiki itu 351 00:16:10,629 --> 00:16:12,670 dan menjangkau saya dan salah satu kepala saja yang 352 00:16:12,670 --> 00:16:14,300 dan kami akan memiliki percakapan. 353 00:16:14,300 --> 00:16:16,220 Kami akan menangani hal-hal internal dengan harapan 354 00:16:16,220 --> 00:16:18,770 itu menjadi lebih dari saat mengajar atau pelajaran hidup, 355 00:16:18,770 --> 00:16:22,120 dan tidak sesuatu dengan konsekuensi sangat drastis 356 00:16:22,120 --> 00:16:24,570 seperti yang mungkin Anda lihat pada grafik ini di sini. 357 00:16:24,570 --> 00:16:26,540 >> Jadi itu adalah nada yang sangat serius. 358 00:16:26,540 --> 00:16:29,960 Mari kita berhenti sejenak untuk hanya beberapa detik untuk memecahkan ketegangan. 359 00:16:29,960 --> 00:16:34,442 >> [MUSIC PLAYING] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> DAVID J. Malan: Baiklah, jadi bagaimana adalah bahwa untuk segue sebuah? 362 00:17:20,250 --> 00:17:22,059 Untuk topik utama hari ini. 363 00:17:22,059 --> 00:17:23,859 Yang pertama adalah abstraksi. 364 00:17:23,859 --> 00:17:26,900 Lain yang akan menjadi representasi data, yang terus terang 365 00:17:26,900 --> 00:17:31,640 adalah cara yang sangat kering mengatakan bagaimana kita bisa pergi untuk memecahkan masalah dan berpikir 366 00:17:31,640 --> 00:17:33,250 tentang memecahkan masalah? 367 00:17:33,250 --> 00:17:37,285 Jadi Anda telah melihat di Scratch, dan Anda sudah terlihat mungkin sudah di pset1 dengan C 368 00:17:37,285 --> 00:17:39,930 bahwa Anda tidak hanya dapat menggunakan fungsi, seperti printf, 369 00:17:39,930 --> 00:17:42,770 bahwa orang lain di tahun terakhir menulis untuk Anda. 370 00:17:42,770 --> 00:17:45,340 Anda juga dapat menulis fungsi sendiri. 371 00:17:45,340 --> 00:17:48,440 >> Dan meskipun Anda mungkin tidak memiliki melakukan ini di C, dan terus terang di pset1 372 00:17:48,440 --> 00:17:51,866 Anda tidak benar-benar perlu untuk menulis fungsi sendiri karena problem-- yang 373 00:17:51,866 --> 00:17:53,990 sementara mungkin menakutkan pada pertama glance-- Anda akan melihat 374 00:17:53,990 --> 00:17:57,910 akhirnya dapat diselesaikan dengan tidak semua yang banyak baris kode. 375 00:17:57,910 --> 00:18:01,140 Tapi dengan mengatakan bahwa, dalam hal menulis fungsi sendiri, 376 00:18:01,140 --> 00:18:03,570 menyadari bahwa C memang memberi Anda kemampuan ini. 377 00:18:03,570 --> 00:18:06,940 >> Aku akan pergi dalam kode sumber saat ini, yang tersedia sudah online, 378 00:18:06,940 --> 00:18:10,900 dan aku akan pergi ke depan dan terbuka sebuah program yang disebut fungsi 0.C, 379 00:18:10,900 --> 00:18:14,620 dan fungsi nol kita akan melihat beberapa hal. 380 00:18:14,620 --> 00:18:19,160 Dalam baris pertama 18 melalui 23 adalah fungsi utama saya. 381 00:18:19,160 --> 00:18:22,414 Dan sekarang kita mulai membaca kode yang kita tidak menulis dengan cepat, 382 00:18:22,414 --> 00:18:25,080 tetapi aku sudah menulis di muka atau bahwa Anda dalam masalah set 383 00:18:25,080 --> 00:18:27,910 mungkin menerima memiliki ditulis sebelumnya. 384 00:18:27,910 --> 00:18:30,040 Cara yang baik untuk memulai membaca kode orang lain 385 00:18:30,040 --> 00:18:31,400 adalah mencari fungsi utama. 386 00:18:31,400 --> 00:18:34,420 Mencari tahu di mana entri Titik adalah untuk menjalankan program, 387 00:18:34,420 --> 00:18:36,580 dan kemudian ikuti secara logis dari sana. 388 00:18:36,580 --> 00:18:40,190 >> Jadi program ini rupanya cetakan Nama Anda diikuti dengan titik dua. 389 00:18:40,190 --> 00:18:42,490 Kami kemudian menggunakan GetString dari perpustakaan CS50 390 00:18:42,490 --> 00:18:46,050 untuk mendapatkan string, atau sebuah kata atau frase dari pengguna di keyboard. 391 00:18:46,050 --> 00:18:48,390 Dan kemudian ada ini hal PrintName sini-. 392 00:18:48,390 --> 00:18:51,420 >> Sekarang PrintName bukan fungsi yang datang dengan C. 393 00:18:51,420 --> 00:18:52,970 Hal ini tidak di io.h. standar 394 00:18:52,970 --> 00:18:55,570 Hal ini tidak di CS50.h. 395 00:18:55,570 --> 00:18:57,880 Ini agak dalam file yang sama. 396 00:18:57,880 --> 00:19:01,000 Perhatikan jika saya gulir ke bawah garis bit-- 25 sampai 27-- 397 00:19:01,000 --> 00:19:05,330 itu hanya cara yang cukup mengomentari kode Anda menggunakan bintang-bintang dan garis miring. 398 00:19:05,330 --> 00:19:07,320 Ini adalah multi-line komentar, dan ini hanya 399 00:19:07,320 --> 00:19:10,570 deskripsi saya di biru apa fungsi ini tidak. 400 00:19:10,570 --> 00:19:14,530 >> Karena di baris 28 sampai 31, Saya telah menulis fungsi super sederhana 401 00:19:14,530 --> 00:19:16,280 Nama yang adalah PrintName. 402 00:19:16,280 --> 00:19:19,560 Dibutuhkan berapa banyak argumen yang akan Anda katakan? 403 00:19:19,560 --> 00:19:25,120 Jadi satu argument-- karena ada satu Argumen yang tercantum dalam tanda kurung. 404 00:19:25,120 --> 00:19:27,000 Jenis yang String. 405 00:19:27,000 --> 00:19:30,240 Yang mengatakan PrintName seperti kotak hitam ini 406 00:19:30,240 --> 00:19:32,910 atau fungsi yang mengambil sebagai masukan string. 407 00:19:32,910 --> 00:19:35,730 >> Dan nama String yang nyaman akan Name. 408 00:19:35,730 --> 00:19:37,840 Tidak S, bukan N, tapi Name. 409 00:19:37,840 --> 00:19:41,090 Jadi apa PrintName lakukan? 410 00:19:41,090 --> 00:19:42,210 Sangat menyenangkan sederhana. 411 00:19:42,210 --> 00:19:45,390 Sama seperti satu baris kode untuk printf, tapi rupanya itu 412 00:19:45,390 --> 00:19:47,950 print "Halo," begitu dan begitu. 413 00:19:47,950 --> 00:19:50,070 Dimana begitu dan begitu berasal dari argumen. 414 00:19:50,070 --> 00:19:52,300 >> Sekarang ini bukan inovasi besar di sini. 415 00:19:52,300 --> 00:19:56,710 Sungguh, aku telah mengambil sebuah program yang bisa telah ditulis dengan satu baris kode 416 00:19:56,710 --> 00:20:00,190 dengan menempatkan ini di sini, dan berubah ke sesuatu 417 00:20:00,190 --> 00:20:04,920 yang melibatkan sekitar enam atau tujuh atau lebih baris kode semua jalan di sini. 418 00:20:04,920 --> 00:20:08,190 >> Tapi itu adalah berlatih dari Prinsip yang dikenal sebagai abstraksi. 419 00:20:08,190 --> 00:20:12,550 Jenis encapsulating dalam baru fungsi yang memiliki nama, dan lebih baik 420 00:20:12,550 --> 00:20:14,590 Belum nama yang secara harfiah mengatakan apa yang dilakukannya. 421 00:20:14,590 --> 00:20:16,880 Maksudku printf-- itu tidak khususnya deskriptif. 422 00:20:16,880 --> 00:20:18,932 Jika saya ingin membuat potongan puzzle, atau jika saya 423 00:20:18,932 --> 00:20:21,140 ingin membuat suatu fungsi yang mencetak nama seseorang, 424 00:20:21,140 --> 00:20:23,230 keindahan melakukan hal ini adalah bahwa saya benar-benar bisa 425 00:20:23,230 --> 00:20:27,170 memberikan fungsi yang nama yang menjelaskan apa yang dilakukannya. 426 00:20:27,170 --> 00:20:29,844 >> Sekarang dibutuhkan dalam input yang Aku sudah sewenang-wenang disebut nama, 427 00:20:29,844 --> 00:20:32,760 tapi itu terlalu mengagumkan deskriptif bukannya lebih sedikit 428 00:20:32,760 --> 00:20:36,140 generik seperti S. Dan batal, untuk saat ini, hanya berarti 429 00:20:36,140 --> 00:20:38,330 bahwa fungsi ini tidak tangan saya kembali apa-apa. 430 00:20:38,330 --> 00:20:41,127 Ini tidak seperti yang GetString harfiah tangan saya kembali string 431 00:20:41,127 --> 00:20:43,960 seperti yang kita lakukan dengan potongan-potongan kertas dengan teman sekelas Anda minggu lalu, 432 00:20:43,960 --> 00:20:45,990 melainkan hanya memiliki efek samping. 433 00:20:45,990 --> 00:20:48,080 Mencetak sesuatu ke layar. 434 00:20:48,080 --> 00:20:53,880 >> Jadi pada akhir hari, jika saya jangan membuat fungsi-0, ./function-0, 435 00:20:53,880 --> 00:20:55,450 kita akan melihat bahwa itu meminta nama saya. 436 00:20:55,450 --> 00:20:58,150 Saya ketik David, dan jenis nama saya. 437 00:20:58,150 --> 00:21:01,080 Jika saya melakukannya lagi dengan Rob, itu akan mengatakan "Halo, Rob." 438 00:21:01,080 --> 00:21:04,280 Jadi ide sederhana, tapi mungkin ekstrapolasi dari ini mental 439 00:21:04,280 --> 00:21:06,750 bahwa program-program Anda dapatkan sedikit lebih rumit, 440 00:21:06,750 --> 00:21:10,290 dan Anda ingin menulis sepotong kode dan panggilan yang code-- Invoke 441 00:21:10,290 --> 00:21:13,270 yang code-- oleh beberapa deskriptif nama seperti PrintName, 442 00:21:13,270 --> 00:21:15,600 C tidak memberi kita kemampuan ini. 443 00:21:15,600 --> 00:21:17,660 >> Berikut contoh sederhana lain. 444 00:21:17,660 --> 00:21:22,940 Misalnya, jika saya membuka file dari hari ini disebut return.c, 445 00:21:22,940 --> 00:21:24,270 melihat apa yang saya lakukan di sini. 446 00:21:24,270 --> 00:21:26,330 Sebagian besar fungsi utama ini printf. 447 00:21:26,330 --> 00:21:30,360 Saya pertama kali sewenang-wenang menginisialisasi variabel yang disebut x ke nomor 2. 448 00:21:30,360 --> 00:21:34,110 Saya kemudian mencetak "x sekarang % I "lewat di nilai x. 449 00:21:34,110 --> 00:21:35,500 Jadi aku hanya mengatakan apa itu. 450 00:21:35,500 --> 00:21:37,208 >> Sekarang aku hanya berani mengklaim dengan printf. 451 00:21:37,208 --> 00:21:42,050 Saya cubing bahwa nilai x, dan aku melakukannya dengan memanggil fungsi 452 00:21:42,050 --> 00:21:45,590 disebut kubus lewat di x sebagai argumen, 453 00:21:45,590 --> 00:21:49,300 dan kemudian menyimpan output dalam variabel itu sendiri, x. 454 00:21:49,300 --> 00:21:51,340 Jadi aku clobbering nilai x. 455 00:21:51,340 --> 00:21:53,380 Aku mengesampingkan nilai x dengan apa pun 456 00:21:53,380 --> 00:21:56,510 hasil dari panggilan fungsi kubus ini. 457 00:21:56,510 --> 00:21:59,530 Dan kemudian aku hanya mencetak beberapa barang berbulu sini mengatakan apa yang saya lakukan. 458 00:21:59,530 --> 00:22:01,600 >> Jadi apa yang kemudian kubus? 459 00:22:01,600 --> 00:22:03,510 Perhatikan apa yang fundamental berbeda di sini. 460 00:22:03,510 --> 00:22:05,540 Aku telah memberikan fungsi nama seperti sebelumnya. 461 00:22:05,540 --> 00:22:08,270 Aku sudah ditentukan nama untuk argumen. 462 00:22:08,270 --> 00:22:11,650 Kali ini disebut n bukan nama, tapi aku bisa menyebutnya apa pun yang saya inginkan. 463 00:22:11,650 --> 00:22:12,650 Tapi ini berbeda. 464 00:22:12,650 --> 00:22:14,080 Hal ini di sebelah kiri. 465 00:22:14,080 --> 00:22:16,290 Sebelumnya itu adalah apa kata kunci? 466 00:22:16,290 --> 00:22:16,870 Boys. 467 00:22:16,870 --> 00:22:18,580 Sekarang jelas int. 468 00:22:18,580 --> 00:22:20,630 >> Jadi apa yang mungkin mengambil? 469 00:22:20,630 --> 00:22:24,090 Sedangkan kekosongan menandakan semacam ketiadaan, dan itu terjadi. 470 00:22:24,090 --> 00:22:25,970 PrintName kembali apa-apa. 471 00:22:25,970 --> 00:22:27,942 Itu sesuatu, tapi itu tidak tangan saya kembali 472 00:22:27,942 --> 00:22:30,650 sesuatu yang saya bisa menempatkan pada sisi kiri tanda sama 473 00:22:30,650 --> 00:22:32,460 seperti saya telah melakukan di sini on line 22. 474 00:22:32,460 --> 00:22:36,780 >> Jadi jika saya katakan ke on line 30, apa itu mungkin menyiratkan 475 00:22:36,780 --> 00:22:38,610 tentang apa kubus tidak bagi saya? 476 00:22:38,610 --> 00:22:41,110 Ya? 477 00:22:41,110 --> 00:22:42,310 Ini mengembalikan sebuah integer. 478 00:22:42,310 --> 00:22:44,590 Jadi itu tangan saya kembali, untuk Misalnya, selembar kertas 479 00:22:44,590 --> 00:22:46,580 di mana ia telah menulis jawabannya. 480 00:22:46,580 --> 00:22:50,130 2 potong dadu, atau 3 potong dadu, atau 4 cubed-- apa pun yang saya berlalu dalam, 481 00:22:50,130 --> 00:22:51,540 dan bagaimana saya menerapkan ini? 482 00:22:51,540 --> 00:22:54,810 Yah, hanya n kali n kali n adalah bagaimana saya bisa kubus nilai. 483 00:22:54,810 --> 00:22:57,110 Jadi sekali lagi, super sederhana ide, tapi demonstratif 484 00:22:57,110 --> 00:23:00,100 sekarang bagaimana kita dapat menulis fungsi yang benar-benar telah kami kembali 485 00:23:00,100 --> 00:23:02,380 nilai-nilai yang mungkin menarik. 486 00:23:02,380 --> 00:23:05,740 >> Mari kita lihat satu contoh terakhir di sini disebut fungsi satu. 487 00:23:05,740 --> 00:23:08,530 Dalam contoh ini, dimulai untuk mendapatkan lebih menarik. 488 00:23:08,530 --> 00:23:12,400 Jadi dalam fungsi satu, ini pemberitahuan program-- akhirnya 489 00:23:12,400 --> 00:23:14,920 panggilan fungsi yang disebut GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt bukan fungsi di perpustakaan CS50, 491 00:23:17,800 --> 00:23:20,400 tapi kami memutuskan kami ingin untuk ada. 492 00:23:20,400 --> 00:23:24,550 >> Jadi jika kita gulir ke bawah kemudian dalam file, perhatikan bagaimana saya pergi tentang pelaksanaan 493 00:23:24,550 --> 00:23:26,560 mendapatkan int positif, dan saya mengatakan itu lebih menarik 494 00:23:26,560 --> 00:23:28,992 karena ini adalah layak jumlah baris kode. 495 00:23:28,992 --> 00:23:30,700 Ini bukan hanya konyol program kecil mainan. 496 00:23:30,700 --> 00:23:33,870 Ini benar-benar mendapat beberapa pengecekan error dan melakukan sesuatu yang lebih berguna. 497 00:23:33,870 --> 00:23:38,470 >> Jadi jika Anda sudah tidak melihat walkthrough video yang telah kita tertanam dalam pset1, 498 00:23:38,470 --> 00:23:42,350 tahu bahwa ini adalah jenis loop dalam C, serupa semangatnya 499 00:23:42,350 --> 00:23:44,270 untuk hal-hal yang dapat Anda lakukan Scratch. 500 00:23:44,270 --> 00:23:46,320 Dan melakukan mengatakan melakukan hal ini. 501 00:23:46,320 --> 00:23:47,500 Cetak ini. 502 00:23:47,500 --> 00:23:51,860 Lalu pergi ke depan dan mendapatkan n-- mendapatkan int dan menyimpannya dalam n, 503 00:23:51,860 --> 00:23:55,760 dan terus melakukan hal ini lagi dan lagi dan lagi selama n kurang dari satu. 504 00:23:55,760 --> 00:23:58,720 >> Jadi n akan menjadi kurang dari satu hanya jika manusia tidak bekerja sama. 505 00:23:58,720 --> 00:24:01,980 Jika ia sedang mengetik di 0 atau -1 atau -50, 506 00:24:01,980 --> 00:24:04,790 lingkaran ini akan terus mengeksekusi lagi dan lagi. 507 00:24:04,790 --> 00:24:07,549 Dan akhirnya melihat, saya hanya mengembalikan nilai. 508 00:24:07,549 --> 00:24:09,590 Jadi sekarang kita memiliki fungsi yang sudah bagus 509 00:24:09,590 --> 00:24:14,040 jika CS50 akan menerapkan di CS50.h dan CS50.c untuk Anda, 510 00:24:14,040 --> 00:24:16,520 tetapi di sini kita sekarang dapat menerapkan ini sendiri. 511 00:24:16,520 --> 00:24:19,230 >> Tapi dua komentar pada beberapa rincian penting. 512 00:24:19,230 --> 00:24:24,390 Satu-- mengapa saya menyatakan int n, menurut Anda, on line 29 513 00:24:24,390 --> 00:24:27,139 bukan hanya melakukan ini di sini, yang 514 00:24:27,139 --> 00:24:28,930 lebih konsisten dengan apa yang kami lakukan minggu lalu? 515 00:24:28,930 --> 00:24:29,430 Ya? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 Sebuah pikiran yang baik. 518 00:24:35,110 --> 00:24:37,080 Jadi jika kita meletakkannya di sini, itu seolah-olah kita 519 00:24:37,080 --> 00:24:39,110 tetap menyatakan lagi dan lagi. 520 00:24:39,110 --> 00:24:42,000 Bahwa dalam dan dari dirinya sendiri tidak bermasalah, per se, 521 00:24:42,000 --> 00:24:43,940 karena kita hanya perlu nilai sekali dan kemudian 522 00:24:43,940 --> 00:24:45,330 kita akan mendapatkan yang baru pula. 523 00:24:45,330 --> 00:24:45,940 Tapi pikiran yang baik. 524 00:24:45,940 --> 00:24:46,440 Ya? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Tutup. 527 00:24:53,330 --> 00:24:59,030 Jadi karena saya sudah dinyatakan n on line 29 di luar loop, 528 00:24:59,030 --> 00:25:01,390 itu dapat diakses di seluruh Seluruh fungsi ini. 529 00:25:01,390 --> 00:25:05,400 Tidak fungsi lain karena n masih dalam keriting ini 530 00:25:05,400 --> 00:25:06,470 kawat gigi di sini. 531 00:25:06,470 --> 00:25:07,940 Begitu-- yakin. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Tepat. 534 00:25:12,940 --> 00:25:14,356 Jadi ini bahkan lebih penting. 535 00:25:14,356 --> 00:25:18,600 Jika kita bukan menyatakan n di sini on line 32, 536 00:25:18,600 --> 00:25:22,340 itu bermasalah karena menebak di mana lagi saya harus mengaksesnya? 537 00:25:22,340 --> 00:25:25,620 On line 34, dan Aturan yang sederhana adalah 538 00:25:25,620 --> 00:25:30,060 bahwa Anda hanya dapat menggunakan variabel dalam kurung kurawal terbaru 539 00:25:30,060 --> 00:25:31,420 di mana Anda menyatakan. 540 00:25:31,420 --> 00:25:35,230 >> Sayangnya, baris 34 satu baris terlambat, 541 00:25:35,230 --> 00:25:38,560 karena saya sudah ditutup penjepit keriting on line 33 542 00:25:38,560 --> 00:25:41,220 yang sesuai dengan penjepit keriting on line 30. 543 00:25:41,220 --> 00:25:44,180 Dan jadi ini adalah cara untuk mengatakan bahwa variabel ini int adalah scoped, 544 00:25:44,180 --> 00:25:46,970 sehingga untuk berbicara, hanya dalam mereka kurung kurawal. 545 00:25:46,970 --> 00:25:48,910 Hanya saja tidak ada di luar mereka. 546 00:25:48,910 --> 00:25:51,580 >> Jadi memang, jika saya melakukan ini salah, biarkan aku menyimpan kode 547 00:25:51,580 --> 00:25:53,530 karena Ini-- salah ditulis. 548 00:25:53,530 --> 00:25:57,990 Biarkan aku pergi ke depan dan jangan membuat -fungsi 1, dan kesalahan notice--. 549 00:25:57,990 --> 00:26:03,502 Penggunaan dideklarasikan identifier n on line 35, yang ada di sini. 550 00:26:03,502 --> 00:26:05,210 Dan jika kita gulir ke atas lanjut, satu sama lain. 551 00:26:05,210 --> 00:26:08,750 Penggunaan dideklarasikan identifier n on line 34. 552 00:26:08,750 --> 00:26:11,200 >> Jadi compiler, dentang, adalah menyadari bahwa itu hanya 553 00:26:11,200 --> 00:26:13,720 tidak ada meskipun jelas itu ada visual. 554 00:26:13,720 --> 00:26:16,090 Jadi memperbaiki sederhana yang menyatakan itu ada. 555 00:26:16,090 --> 00:26:18,790 >> Sekarang biarkan aku gulir ke bagian atas file. 556 00:26:18,790 --> 00:26:21,080 Apa melompat keluar pada Anda sebagai menjadi sedikit berbeda 557 00:26:21,080 --> 00:26:23,070 dari hal-hal yang kita melihat minggu lalu? 558 00:26:23,070 --> 00:26:26,990 Saya tidak hanya punya nama, tidak hanya Saya punya beberapa tajam meliputi bagian atas, 559 00:26:26,990 --> 00:26:29,340 Aku punya sesuatu yang saya memanggil prototipe. 560 00:26:29,340 --> 00:26:36,100 Sekarang terlihat sangat mirip dengan apa yang kami hanya melihat sejenak lalu pada baris 27. 561 00:26:36,100 --> 00:26:39,230 >> Jadi mari kita menyimpulkan dari berbeda pesan kesalahan mengapa saya sudah melakukan ini. 562 00:26:39,230 --> 00:26:42,050 Biarkan aku pergi ke depan dan menghapus baris ini ada. 563 00:26:42,050 --> 00:26:44,240 Dan jadi kita tahu apa-apa tentang prototipe. 564 00:26:44,240 --> 00:26:45,430 Remake file ini. 565 00:26:45,430 --> 00:26:46,890 Membuat fungsi satu. 566 00:26:46,890 --> 00:26:48,090 Dan sekarang, sialan, empat kesalahan. 567 00:26:48,090 --> 00:26:50,220 Mari kita gulir ke atas untuk yang pertama. 568 00:26:50,220 --> 00:26:55,070 >> Deklarasi implisit fungsi mendapatkan int positif tidak valid di C99. 569 00:26:55,070 --> 00:26:57,780 C99 hanya berarti 1999 versi bahasa 570 00:26:57,780 --> 00:26:59,710 C, yang adalah apa yang kita memang gunakan. 571 00:26:59,710 --> 00:27:01,050 Jadi apa artinya ini? 572 00:27:01,050 --> 00:27:05,250 Yah C-- dan lebih khusus C compilers-- program cukup bodoh. 573 00:27:05,250 --> 00:27:07,420 Mereka hanya tahu apa yang telah Anda mengatakan kepada mereka, dan itulah 574 00:27:07,420 --> 00:27:08,960 sebenarnya tematik dari minggu lalu. 575 00:27:08,960 --> 00:27:12,910 >> Masalahnya adalah bahwa jika saya pergi tentang pelaksanaan nama di sini, 576 00:27:12,910 --> 00:27:17,640 dan saya memanggil fungsi yang disebut GetPositiveInt sini on line 20, 577 00:27:17,640 --> 00:27:22,520 fungsi yang secara teknis tidak ada sampai kompilator melihat garis 27. 578 00:27:22,520 --> 00:27:25,450 Sayangnya, compiler melakukan hal-hal atas, bawah, kiri, kanan, 579 00:27:25,450 --> 00:27:29,580 sehingga karena belum melihat pelaksanaan GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 tapi melihat Anda mencoba menggunakannya di sini, 581 00:27:32,400 --> 00:27:35,810 itu hanya akan bail-- berteriak Anda dengan kesalahan Message-- mungkin 582 00:27:35,810 --> 00:27:38,440 samar, dan tidak benar-benar mengkompilasi file. 583 00:27:38,440 --> 00:27:41,940 >> Jadi yang disebut prototipe up di sini harus diakui berlebihan. 584 00:27:41,940 --> 00:27:47,870 Secara harfiah, aku turun di sini dan saya menyalin dan disisipkan ini, dan saya taruh di sini. 585 00:27:47,870 --> 00:27:51,020 Void akan lebih tepat, sehingga kita akan harfiah copy dan paste saat ini. 586 00:27:51,020 --> 00:27:52,854 Aku benar-benar disalin dan disisipkan. 587 00:27:52,854 --> 00:27:54,270 Benar-benar seperti seperti remah roti. 588 00:27:54,270 --> 00:27:56,260 >> Sebuah petunjuk sedikit untuk compiler. 589 00:27:56,260 --> 00:27:58,860 Aku tidak tahu apa yang dilakukan belum, tapi aku menjanjikan untuk Anda 590 00:27:58,860 --> 00:28:00,260 bahwa akan ada akhirnya. 591 00:28:00,260 --> 00:28:04,010 Dan itulah mengapa ini line-- di baris 16-- berakhir dengan titik koma. 592 00:28:04,010 --> 00:28:05,486 Hal ini berlebihan dengan desain. 593 00:28:05,486 --> 00:28:05,986 Ya? 594 00:28:05,986 --> 00:28:11,340 595 00:28:11,340 --> 00:28:14,360 >> Jika Anda tidak menghubungkan perpustakaan Anda untuk yang-- oh, pertanyaan yang bagus. 596 00:28:14,360 --> 00:28:17,350 Tajam termasuk inklusi file header. 597 00:28:17,350 --> 00:28:20,040 Perlu akan-- harus hampir selalu berada di bagian paling atas 598 00:28:20,040 --> 00:28:23,270 file untuk similar-- untuk alasan yang sama persis, ya. 599 00:28:23,270 --> 00:28:26,430 Karena dalam standar io.h secara harfiah garis 600 00:28:26,430 --> 00:28:30,560 seperti ini, tetapi dengan printf kata, dan dengan argumen dan kembali jenis-nya. 601 00:28:30,560 --> 00:28:33,310 Jadi dengan melakukan tajam mencakup hingga di sini, apa yang Anda benar-benar melakukan 602 00:28:33,310 --> 00:28:36,380 adalah menyalin dan menyisipkan isi dari orang lain menulis di bagian atas. 603 00:28:36,380 --> 00:28:39,660 Dengan demikian cluing kode Anda ke dalam Fakta bahwa fungsi-fungsi yang ada. 604 00:28:39,660 --> 00:28:40,160 Ya? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Tentu saja. 607 00:28:48,260 --> 00:28:51,690 Jadi sangat pintar dan benar solusi akan, kau tahu apa? 608 00:28:51,690 --> 00:28:53,760 Aku tidak tahu apa prototipe, tapi aku tahu 609 00:28:53,760 --> 00:28:56,390 jika saya memahami bahwa C hanya bodoh dan rethinks atas ke bawah. 610 00:28:56,390 --> 00:28:57,820 Nah mari kita apa yang diinginkannya. 611 00:28:57,820 --> 00:29:01,650 Mari kita memotong kode, paste up atas, dan sekarang mendorong utama di bawah. 612 00:29:01,650 --> 00:29:03,470 Hal ini juga akan memecahkan masalah. 613 00:29:03,470 --> 00:29:07,409 >> Tapi Anda bisa dengan mudah datang dengan sebuah skenario di mana A perlu memanggil B, 614 00:29:07,409 --> 00:29:10,075 dan mungkin B panggilan kembali ke A. Ini adalah sesuatu yang disebut rekursi, 615 00:29:10,075 --> 00:29:11,370 dan kami akan kembali ke itu. 616 00:29:11,370 --> 00:29:13,911 Dan hal itu mungkin atau tidak mungkin baik hal, tetapi Anda pasti dapat 617 00:29:13,911 --> 00:29:15,110 istirahat solusi ini. 618 00:29:15,110 --> 00:29:17,690 >> Dan selain itu, saya akan mengklaim Gaya, 619 00:29:17,690 --> 00:29:20,760 terutama ketika program Anda menjadi selama ini dan selama ini, 620 00:29:20,760 --> 00:29:23,064 itu hanya super nyaman untuk menempatkan utama di bagian atas 621 00:29:23,064 --> 00:29:25,730 karena itu adalah hal yang paling programmer akan peduli. 622 00:29:25,730 --> 00:29:28,150 Dan jadi sedikit lebih bersih, bisa dibilang, untuk melakukannya dengan cara yang 623 00:29:28,150 --> 00:29:30,380 Awalnya saya melakukannya dengan prototipe bahkan 624 00:29:30,380 --> 00:29:33,396 meskipun terlihat sedikit berlebihan pada pandangan pertama. 625 00:29:33,396 --> 00:29:33,895 Ya? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Maaf, Anda dapat mengatakan itu keras? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Jika Anda beralih lokasi dari implementasi dan prototipe? 630 00:29:49,580 --> 00:29:51,270 Jadi itu adalah pertanyaan yang bagus. 631 00:29:51,270 --> 00:29:53,780 -Menyatakan kembali Jika Anda ini turun di sini, mari kita lihat apa yang terjadi. 632 00:29:53,780 --> 00:29:55,530 Jadi jika saya meletakkan ini di sini, Anda katakan. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Oh, maaf. 635 00:29:58,360 --> 00:29:58,859 Louder? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Bahkan lebih keras. 638 00:30:04,011 --> 00:30:04,760 Oh, pertanyaan yang bagus. 639 00:30:04,760 --> 00:30:05,860 Apakah itu membatalkan fungsi? 640 00:30:05,860 --> 00:30:08,901 Kau tahu, setelah bertahun-tahun, saya tidak pernah menempatkan prototipe setelah itu. 641 00:30:08,901 --> 00:30:13,810 Jadi mari kita lakukan membuat fungsi-1 setelah melakukan itu. 642 00:30:13,810 --> 00:30:15,279 >> [Bergumam] 643 00:30:15,279 --> 00:30:16,320 DAVID J. Malan: Oh, tunggu. 644 00:30:16,320 --> 00:30:17,944 Kami masih harus meletakkan segala sesuatu di bagian atas. 645 00:30:17,944 --> 00:30:21,400 Jadi mari kita lakukan ini di sini, jika saya memahami pertanyaan Anda dengan benar. 646 00:30:21,400 --> 00:30:24,700 Aku meletakkan segala sesuatu, termasuk prototipe di atas utama, 647 00:30:24,700 --> 00:30:28,180 tapi aku meletakkan prototipe bawah pelaksanaannya. 648 00:30:28,180 --> 00:30:33,190 >> Jadi jika saya membuat satu, saya mendapatkan kembali variabel tidak terpakai n error--. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Oh, ada. 651 00:30:37,860 --> 00:30:38,360 Terima kasih. 652 00:30:38,360 --> 00:30:39,430 Mari kita lihat, kita menyingkirkan ini. 653 00:30:39,430 --> 00:30:41,304 Itu bug yang berbeda, jadi mari kita mengabaikan itu. 654 00:30:41,304 --> 00:30:43,910 Mari kita benar-benar cepat remake ini. 655 00:30:43,910 --> 00:30:48,100 >> OK, sehingga data argumen tidak digunakan oleh Format String 656 00:30:48,100 --> 00:30:52,310 n-- oh, itu karena Aku berubah menjadi ini di sini. 657 00:30:52,310 --> 00:30:55,885 Baiklah, kita tahu apa jawabannya akan untuk-- baik-baik, di sini kita pergi. 658 00:30:55,885 --> 00:31:00,560 Ah, terima kasih atas positif. 659 00:31:00,560 --> 00:31:03,430 Baiklah, aku akan memperbaiki kode ini after-- mengabaikan bug tertentu 660 00:31:03,430 --> 00:31:08,300 karena ini was-- kerjanya adalah jawabannya. 661 00:31:08,300 --> 00:31:11,560 >> Jadi tidak menimpa apa yang baru saja dilakukan. 662 00:31:11,560 --> 00:31:14,800 Saya menduga compiler ditulis sedemikian rupa 663 00:31:14,800 --> 00:31:18,420 bahwa itu mengabaikan prototipe Anda karena tubuh, sehingga untuk berbicara, 664 00:31:18,420 --> 00:31:20,922 fungsi memiliki sudah dilaksanakan lebih tinggi. 665 00:31:20,922 --> 00:31:23,380 Saya harus benar-benar berkonsultasi manual kompilator 666 00:31:23,380 --> 00:31:26,171 untuk memahami apakah ada yang lain Implikasinya, tapi pada pandangan pertama 667 00:31:26,171 --> 00:31:29,290 hanya dengan mencoba dan bereksperimen, ada tampaknya tidak ada dampak. 668 00:31:29,290 --> 00:31:30,730 Pertanyaan yang bagus. 669 00:31:30,730 --> 00:31:33,660 >> Jadi mari kita maju sekarang, bergerak jauh dari efek samping yang 670 00:31:33,660 --> 00:31:36,660 adalah fungsi yang melakukan sesuatu seperti visual pada layar dengan printf, 671 00:31:36,660 --> 00:31:38,090 tetapi tidak mengembalikan nilai. 672 00:31:38,090 --> 00:31:41,550 Dan fungsi yang memiliki return Nilai-nilai seperti kami hanya melihat beberapa. 673 00:31:41,550 --> 00:31:45,350 Kita telah melihat gagasan dari ruang lingkup, dan kita akan melihat ini lagi dan lagi. 674 00:31:45,350 --> 00:31:47,210 Tapi untuk saat ini, sekali lagi, menggunakan aturan praktis 675 00:31:47,210 --> 00:31:51,410 bahwa variabel hanya dapat digunakan dalam yang paling baru dibuka 676 00:31:51,410 --> 00:31:54,350 dan kurung kurawal tertutup seperti yang kita melihat dalam contoh khusus. 677 00:31:54,350 --> 00:31:56,910 >> Dan seperti yang Anda menunjukkan, ada ability-- 678 00:31:56,910 --> 00:32:00,040 Anda bisa memecahkan beberapa masalah ini dengan menempatkan variabel global 679 00:32:00,040 --> 00:32:01,290 di bagian paling atas dari file. 680 00:32:01,290 --> 00:32:03,630 Namun dalam hampir semua kasus kita akan mengerut atas itu, 681 00:32:03,630 --> 00:32:06,170 dan memang bahkan tidak pergi ke dalam solusi untuk saat ini. 682 00:32:06,170 --> 00:32:09,890 Jadi untuk saat ini, takeaway adalah bahwa variabel memiliki gagasan dari ruang lingkup. 683 00:32:09,890 --> 00:32:13,430 >> Tapi sekarang mari kita lihat lain cara kering benar-benar melihat 684 00:32:13,430 --> 00:32:15,810 di beberapa cukup menarik rincian pelaksanaan. 685 00:32:15,810 --> 00:32:17,810 Bagaimana kita bisa merepresentasikan informasi. 686 00:32:17,810 --> 00:32:20,370 Dan kita sudah melihat ini di minggu pertama kelas. 687 00:32:20,370 --> 00:32:23,320 Melihat binari, dan mengingatkan diri desimal. 688 00:32:23,320 --> 00:32:28,310 >> Tapi ingat dari minggu lalu bahwa C memiliki jenis data yang berbeda dan tandan lainnya, 689 00:32:28,310 --> 00:32:30,600 tapi yang paling berguna untuk saat ini mungkin ini. 690 00:32:30,600 --> 00:32:36,030 Sebuah char, atau karakter, yang terjadi menjadi salah satu byte, atau delapan bit keseluruhan. 691 00:32:36,030 --> 00:32:40,060 Dan itu mengatakan bahwa ukuran char adalah hanya satu byte. 692 00:32:40,060 --> 00:32:45,370 Sebuah byte adalah delapan bit, jadi ini berarti bahwa kita dapat mewakili berapa banyak karakter. 693 00:32:45,370 --> 00:32:47,320 Berapa banyak surat atau simbol pada keyboard 694 00:32:47,320 --> 00:32:49,210 jika kita memiliki satu byte atau delapan bit. 695 00:32:49,210 --> 00:32:51,546 Pikirkan kembali minggu nol. 696 00:32:51,546 --> 00:32:53,420 Jika Anda memiliki delapan bit, berapa banyak total nilai 697 00:32:53,420 --> 00:32:55,503 dapat Anda wakili dengan pola nol dan satu? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 Satu-- lebih dari itu. 700 00:33:00,260 --> 00:33:03,490 Jadi jumlah 256 jika Anda mulai menghitung dari nol. 701 00:33:03,490 --> 00:33:07,120 Jadi jika Anda memiliki delapan bits-- jadi jika kita memiliki lampu biner kami di sini lagi, 702 00:33:07,120 --> 00:33:12,180 kita bisa mengubah mereka lampu pada dan off di setiap dari 256 pola yang unik. 703 00:33:12,180 --> 00:33:13,640 >> Sekarang ini adalah sedikit bermasalah. 704 00:33:13,640 --> 00:33:16,857 Tidak begitu banyak untuk bahasa Inggris dan bahasa cinta, tapi pasti 705 00:33:16,857 --> 00:33:19,190 ketika Anda memperkenalkan, untuk Misalnya, bahasa-bahasa Asia, yang 706 00:33:19,190 --> 00:33:22,580 memiliki simbol jauh lebih banyak daripada seperti 26 huruf abjad. 707 00:33:22,580 --> 00:33:24,390 Kami benar-benar mungkin perlu lebih dari satu byte. 708 00:33:24,390 --> 00:33:28,240 Dan untungnya di beberapa tahun terakhir memiliki masyarakat 709 00:33:28,240 --> 00:33:31,040 mengadopsi standar lain yang menggunakan lebih dari satu byte per charge. 710 00:33:31,040 --> 00:33:34,210 >> Tapi untuk saat ini di C, default adalah salah satu byte atau delapan bit. 711 00:33:34,210 --> 00:33:38,195 Integer, sementara itu, adalah empat bytes, atau dikenal sebagai 32 bit. 712 00:33:38,195 --> 00:33:41,320 Yang berarti apa yang mungkin terbesar nomor kita dapat mewakili dengan int 713 00:33:41,320 --> 00:33:41,820 rupanya? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Dengan miliar. 716 00:33:45,050 --> 00:33:46,760 Jadi empat miliar memberikan atau mengambil. 717 00:33:46,760 --> 00:33:49,840 2 pangkat 32th, jika kita mengasumsikan bahwa tidak ada angka negatif 718 00:33:49,840 --> 00:33:52,530 dan hanya menggunakan semua positif angka, itu empat miliar 719 00:33:52,530 --> 00:33:53,730 memberi atau mengambil kemungkinan. 720 00:33:53,730 --> 00:33:57,890 Sebuah float, sementara itu, adalah jenis yang berbeda tipe data di C. Ini masih angka, 721 00:33:57,890 --> 00:33:58,990 tapi itu bilangan real. 722 00:33:58,990 --> 00:34:00,660 Sesuatu dengan titik desimal. 723 00:34:00,660 --> 00:34:03,000 Dan ternyata C juga menggunakan empat byte 724 00:34:03,000 --> 00:34:05,340 untuk mewakili nilai-nilai floating point. 725 00:34:05,340 --> 00:34:09,420 >> Sayangnya berapa banyak mengambang nilai titik yang ada di dunia? 726 00:34:09,420 --> 00:34:11,582 Berapa banyak bilangan real yang ada? 727 00:34:11,582 --> 00:34:13,540 Ada tak terbatas nomor, dan dalam hal ini 728 00:34:13,540 --> 00:34:15,164 ada jumlah tak terbatas bilangan bulat. 729 00:34:15,164 --> 00:34:18,070 Jadi kita sudah jenis menggali lubang sendiri di sini. 730 00:34:18,070 --> 00:34:21,780 Dimana ternyata di computers-- di program paling ditulis dalam C pada them-- 731 00:34:21,780 --> 00:34:24,110 hanya bisa menghitung setinggi empat miliar memberi atau mengambil, 732 00:34:24,110 --> 00:34:26,260 dan nilai floating point hanya dapat tampaknya 733 00:34:26,260 --> 00:34:28,330 memiliki beberapa jumlah terbatas presisi. 734 00:34:28,330 --> 00:34:30,810 Hanya begitu banyak angka setelah titik desimal mereka. 735 00:34:30,810 --> 00:34:32,822 >> Karena, tentu saja, jika Anda hanya memiliki 32 bit, 736 00:34:32,822 --> 00:34:36,030 Aku tidak tahu bagaimana kita akan pergi tentang mewakili Numbers nyata mungkin 737 00:34:36,030 --> 00:34:37,409 dengan berbagai jenis pola. 738 00:34:37,409 --> 00:34:40,030 Tapi ada pasti terbatas jumlah pola tersebut, 739 00:34:40,030 --> 00:34:41,830 jadi di sini, juga, ini adalah bermasalah. 740 00:34:41,830 --> 00:34:43,710 >> Sekarang kita dapat menghindari masalah sedikit. 741 00:34:43,710 --> 00:34:45,710 Jika Anda tidak menggunakan pelampung, Anda bisa menggunakan ganda 742 00:34:45,710 --> 00:34:50,230 di C, yang memberi Anda delapan byte, yang mungkin pola cara yang lebih dari nol 743 00:34:50,230 --> 00:34:50,730 dan orang-orang. 744 00:34:50,730 --> 00:34:55,199 Tapi itu masih terbatas, yang akan menjadi bermasalah jika Anda menulis perangkat lunak 745 00:34:55,199 --> 00:34:57,670 untuk grafis atau mewah rumus matematika. 746 00:34:57,670 --> 00:35:00,410 Jadi Anda mungkin benar-benar ingin untuk menghitung lebih besar dari itu. 747 00:35:00,410 --> 00:35:05,640 Sebuah panjang long-- bodoh named-- juga delapan byte, atau 64 bit, 748 00:35:05,640 --> 00:35:10,260 dan ini adalah dua kali lebih lama sebagai int, dan itu untuk nilai integer panjang. 749 00:35:10,260 --> 00:35:15,655 >> Fun fact-- jika int adalah empat byte, berapa lama panjang di C biasanya? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 Juga empat byte, tetapi lama delapan byte, 752 00:35:21,560 --> 00:35:23,050 dan ini adalah untuk alasan historis. 753 00:35:23,050 --> 00:35:26,450 >> Tapi sekarang takeaway hanya data yang memiliki 754 00:35:26,450 --> 00:35:29,625 untuk diwakili dalam computer-- yang perangkat fisik dengan listrik, 755 00:35:29,625 --> 00:35:32,190 itu umumnya mengemudi mereka nol dan ones-- 756 00:35:32,190 --> 00:35:34,320 dengan jumlah terbatas presisi. 757 00:35:34,320 --> 00:35:35,620 Jadi apa masalahnya kemudian? 758 00:35:35,620 --> 00:35:37,480 >> Yah ada masalah overflow integer. 759 00:35:37,480 --> 00:35:39,780 Tidak hanya di C, tetapi dalam komputer secara umum. 760 00:35:39,780 --> 00:35:42,590 Misalnya, jika ini adalah byte layak bit-- 761 00:35:42,590 --> 00:35:45,120 jadi jika ini adalah delapan bit-- semua di antaranya adalah nomor satu. 762 00:35:45,120 --> 00:35:47,300 Apa angka adalah ini mewakili jika kita asumsikan 763 00:35:47,300 --> 00:35:50,730 itu semua nilai-nilai positif di biner? 764 00:35:50,730 --> 00:35:54,410 >> 255, dan itu bukan 256, karena nol adalah angka terendah. 765 00:35:54,410 --> 00:35:56,760 Jadi 255 adalah yang tertinggi satu, tapi masalahnya 766 00:35:56,760 --> 00:36:00,330 adalah rasa bahwa saya ingin kenaikan variabel ini yang 767 00:36:00,330 --> 00:36:04,030 menggunakan delapan bit total jika saya ingin kenaikan itu. 768 00:36:04,030 --> 00:36:07,160 >> Nah begitu aku menambahkan yang semua orang-orang ini, 769 00:36:07,160 --> 00:36:10,500 Anda mungkin bisa membayangkan visually-- hanya seperti membawa yang menggunakan decimals-- 770 00:36:10,500 --> 00:36:12,300 sesuatu akan mengalir ke kiri. 771 00:36:12,300 --> 00:36:15,590 Dan memang, jika saya menambahkan nomor satu ini, apa yang terjadi dalam biner 772 00:36:15,590 --> 00:36:17,670 adalah bahwa hal itu meluap kembali ke nol. 773 00:36:17,670 --> 00:36:21,730 >> Jadi, jika Anda hanya use-- bukan int, tapi satu byte untuk menghitung bilangan bulat 774 00:36:21,730 --> 00:36:27,170 dalam sebuah program, berdasarkan default-- secepat Anda bisa 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 muncul setelah 255, yang mungkin bukan apa 776 00:36:32,710 --> 00:36:34,790 pengguna akan mengharapkan. 777 00:36:34,790 --> 00:36:39,620 >> Sekarang sementara dalam floating point dunia, Anda juga memiliki masalah yang sama. 778 00:36:39,620 --> 00:36:42,670 Tidak begitu banyak dengan number-- terbesar walaupun itu masih menjadi masalah. 779 00:36:42,670 --> 00:36:45,360 Tapi dengan jumlah presisi bahwa Anda dapat mewakili. 780 00:36:45,360 --> 00:36:49,490 Jadi mari kita lihat contoh ini di sini juga dari code-- sumber hari ini 781 00:36:49,490 --> 00:36:52,070 mengapung-0.c. 782 00:36:52,070 --> 00:36:54,280 >> Dan melihat itu super program sederhana yang 783 00:36:54,280 --> 00:36:56,580 harus rupanya mencetak nilai apa keluar? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 Apa yang Anda bertaruh ini akan mencetak meskipun ada sedikit sintaks baru 786 00:37:04,110 --> 00:37:05,540 di sini? 787 00:37:05,540 --> 00:37:06,700 Jadi mudah-mudahan 0,1. 788 00:37:06,700 --> 00:37:10,000 Jadi setara dengan sepersepuluh karena aku melakukan 1 dibagi dengan 10. 789 00:37:10,000 --> 00:37:12,430 Aku menyimpan jawabannya dalam variabel yang disebut f. 790 00:37:12,430 --> 00:37:15,850 Variabel yang bertipe float, yang adalah kata kunci saya hanya diusulkan ada. 791 00:37:15,850 --> 00:37:18,910 >> Kami tidak melihat ini sebelumnya, tapi ini adalah jenis cara yang rapi di printf 792 00:37:18,910 --> 00:37:22,110 untuk menentukan berapa banyak digit Anda ingin melihat setelah titik desimal. 793 00:37:22,110 --> 00:37:25,020 Jadi notasi ini hanya berarti bahwa inilah placeholder. 794 00:37:25,020 --> 00:37:27,900 Ini untuk floating point nilai, dan oh, omong-omong, 795 00:37:27,900 --> 00:37:31,389 menunjukkan dengan titik desimal dengan satu angka setelah titik desimal. 796 00:37:31,389 --> 00:37:33,180 Jadi itulah nomor digit yang signifikan, 797 00:37:33,180 --> 00:37:34,650 sehingga untuk berbicara, bahwa Anda mungkin ingin. 798 00:37:34,650 --> 00:37:40,450 >> Jadi biarkan aku pergi ke depan dan melakukan membuat mengapung-0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 dan tampaknya 1 dibagi dengan 10 adalah 0.0. 800 00:37:46,660 --> 00:37:47,760 Sekarang mengapa ini? 801 00:37:47,760 --> 00:37:51,380 >> Nah lagi, komputer mengambil saya benar-benar, dan saya telah menulis 1 802 00:37:51,380 --> 00:37:56,680 dan saya tulis 10, dan mengambil menebak apa adalah tipe data yang diasumsikan untuk kedua 803 00:37:56,680 --> 00:37:58,440 nilai-nilai? 804 00:37:58,440 --> 00:38:00,970 Int, secara teknis sesuatu yang sedikit berbeda. 805 00:38:00,970 --> 00:38:04,150 Ini biasanya panjang, tapi itu akhirnya nilai integral. 806 00:38:04,150 --> 00:38:06,030 Tidak nilai floating point. 807 00:38:06,030 --> 00:38:09,456 >> Yang mengatakan bahwa jika ini adalah int dan ini adalah int, 808 00:38:09,456 --> 00:38:11,830 masalahnya adalah bahwa komputer tidak memiliki kemampuan 809 00:38:11,830 --> 00:38:13,680 bahkan menyimpan titik desimal. 810 00:38:13,680 --> 00:38:16,430 Jadi, ketika Anda melakukan 1 dibagi dengan 10 menggunakan bilangan bulat 811 00:38:16,430 --> 00:38:20,950 untuk kedua pembilang dan denominator, jawabannya harus 0,1. 812 00:38:20,950 --> 00:38:24,930 Tapi computer-- karena yaitu integers-- 813 00:38:24,930 --> 00:38:27,430 tidak tahu apa yang harus dilakukan dengan 0,1. 814 00:38:27,430 --> 00:38:30,010 >> Jadi apa yang jelas lakukan? 815 00:38:30,010 --> 00:38:33,120 Ini hanya membuangnya, dan apa yang saya lihat pada akhirnya 816 00:38:33,120 --> 00:38:38,830 adalah 0.0 hanya karena aku bersikeras bahwa printf menunjukkan satu titik desimal. 817 00:38:38,830 --> 00:38:41,740 Tapi masalahnya adalah bahwa jika Anda membagi integer dengan integer, 818 00:38:41,740 --> 00:38:44,347 Anda akan get-- menurut definisi dari C-- integer. 819 00:38:44,347 --> 00:38:46,680 Dan itu tidak akan melakukan sesuatu yang baik dan nyaman 820 00:38:46,680 --> 00:38:49,040 seperti putaran itu sampai ke terdekat satu atas atau bawah. 821 00:38:49,040 --> 00:38:51,860 Ini akan memotong semuanya setelah desimal. 822 00:38:51,860 --> 00:38:54,030 >> Jadi hanya secara intuitif, apa mungkin memperbaiki? 823 00:38:54,030 --> 00:38:55,351 Apa memperbaiki sederhana di sini? 824 00:38:55,351 --> 00:38:55,850 Ya? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Tepat. 827 00:39:01,100 --> 00:39:04,200 Mengapa kita tidak hanya memperlakukan ini sebagai floating point nilai efektif 828 00:39:04,200 --> 00:39:05,860 mengubahnya menjadi mengapung atau ganda. 829 00:39:05,860 --> 00:39:10,500 Dan jika saya membuat mengapung-0, atau jika saya mengkompilasi mengapung-1, 830 00:39:10,500 --> 00:39:12,570 yang identik dengan apa yang baru saja diusulkan. 831 00:39:12,570 --> 00:39:16,400 Dan sekarang saya lakukan mengapung-0, sekarang saya mendapatkan 0,1 saya. 832 00:39:16,400 --> 00:39:17,234 >> Sekarang ini menakjubkan. 833 00:39:17,234 --> 00:39:19,441 Tapi sekarang aku akan melakukan sesuatu yang sedikit berbeda. 834 00:39:19,441 --> 00:39:22,280 Saya penasaran untuk melihat apa yang sebenarnya terjadi di bawah tenda, 835 00:39:22,280 --> 00:39:26,050 dan aku akan mencetak ini untuk 28 tempat desimal. 836 00:39:26,050 --> 00:39:29,730 Saya ingin benar-benar melihat 0.1000-- sebuah infinite-- 837 00:39:29,730 --> 00:39:32,710 [Tak terdengar] 27 angka nol setelah itu 0,1. 838 00:39:32,710 --> 00:39:34,740 >> Nah mari kita lihat apakah itu apa memang saya dapatkan. 839 00:39:34,740 --> 00:39:39,430 Membuat mengapung-0 file yang sama. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Mari kita zoom in pada jawaban yang dramatis. 842 00:39:44,380 --> 00:39:49,980 Selama ini, Anda sudah berpikir 1 dibagi dengan 10 adalah 10%, atau 0,1. 843 00:39:49,980 --> 00:39:50,810 Ini bukan. 844 00:39:50,810 --> 00:39:53,210 Setidaknya sejauh komputer yang bersangkutan. 845 00:39:53,210 --> 00:39:57,060 >> Sekarang why-- OK, itu lengkap kebohongan 1 dibagi dengan 10 adalah 0,1. 846 00:39:57,060 --> 00:39:59,710 Tapi why-- yang tidak takeaway hari ini. 847 00:39:59,710 --> 00:40:04,010 Jadi mengapa komputer berpikir, tidak seperti kita semua di ruangan, 848 00:40:04,010 --> 00:40:06,870 bahwa 1 dibagi dengan 10 adalah sebenarnya itu nilai gila? 849 00:40:06,870 --> 00:40:10,620 Apa komputer melakukan rupanya? 850 00:40:10,620 --> 00:40:12,490 Apa itu? 851 00:40:12,490 --> 00:40:13,785 >> Ini tidak meluap, per se. 852 00:40:13,785 --> 00:40:15,910 Overflow biasanya ketika Anda membungkus nilai. 853 00:40:15,910 --> 00:40:18,970 Ini masalah ini ketidaktepatan dalam nilai floating point 854 00:40:18,970 --> 00:40:22,220 di mana Anda hanya memiliki 32 atau mungkin bahkan 64 bit. 855 00:40:22,220 --> 00:40:25,230 Tapi kalau ada yang tak terbatas jumlah Numbers nyata 856 00:40:25,230 --> 00:40:27,940 angka dengan poin desimal dan nomor thereafter-- pasti 857 00:40:27,940 --> 00:40:29,380 Anda tidak dapat mewakili semua dari mereka. 858 00:40:29,380 --> 00:40:32,870 Jadi komputer telah memberikan kami pertandingan terdekat 859 00:40:32,870 --> 00:40:37,090 untuk nilai dapat mewakili dipake banyak bit dengan nilai yang saya benar-benar ingin, 860 00:40:37,090 --> 00:40:38,690 yang 0.1. 861 00:40:38,690 --> 00:40:40,685 >> Sayangnya, jika Anda mulai melakukan matematika, atau Anda 862 00:40:40,685 --> 00:40:44,360 mulai melibatkan jenis-jenis floating nilai titik di programs-- penting 863 00:40:44,360 --> 00:40:46,770 software keuangan, software-- sesuatu militer 864 00:40:46,770 --> 00:40:49,090 di mana persepsi adalah mungkin cukup penting. 865 00:40:49,090 --> 00:40:51,520 Dan Anda mulai menambahkan nomor seperti ini, dan mulai 866 00:40:51,520 --> 00:40:54,050 menjalankan perangkat lunak yang dengan input benar-benar besar 867 00:40:54,050 --> 00:40:56,890 atau untuk banyak jam atau banyak hari atau banyak tahun, 868 00:40:56,890 --> 00:41:01,060 kesalahan-kesalahan kecil kecil pasti bisa menambahkan dari waktu ke waktu. 869 00:41:01,060 --> 00:41:04,252 >> Sekarang sebagai samping, jika Anda sudah pernah melihat Superman 3 atau Office Space 870 00:41:04,252 --> 00:41:05,960 dan Anda mungkin ingat bagaimana orang-orang mencuri 871 00:41:05,960 --> 00:41:08,668 banyak uang dari komputer mereka dengan menggunakan nilai-nilai floating point 872 00:41:08,668 --> 00:41:11,290 dan menambahkan sedikit sisanya, mudah-mudahan film yang 873 00:41:11,290 --> 00:41:12,390 sekarang lebih masuk akal. 874 00:41:12,390 --> 00:41:14,930 Ini adalah apa yang mereka menyinggung dalam film itu. 875 00:41:14,930 --> 00:41:16,710 Fakta bahwa sebagian besar perusahaan tidak akan terlihat 876 00:41:16,710 --> 00:41:18,600 setelah sejumlah tempat desimal, 877 00:41:18,600 --> 00:41:20,009 tetapi mereka adalah pecahan sen. 878 00:41:20,009 --> 00:41:22,550 Jadi Anda mulai menambahkan mereka, Anda mulai membuat banyak uang 879 00:41:22,550 --> 00:41:23,424 di rekening bank Anda. 880 00:41:23,424 --> 00:41:25,160 Jadi itulah Office Space menjelaskan. 881 00:41:25,160 --> 00:41:28,220 >> Sekarang sayangnya luar Office Space, ada 882 00:41:28,220 --> 00:41:31,794 beberapa sah mengganggu dan dampak yang signifikan 883 00:41:31,794 --> 00:41:33,710 dari jenis-jenis keputusan desain yang mendasari, 884 00:41:33,710 --> 00:41:35,990 dan memang salah satu alasan kita menggunakan C dalam kursus 885 00:41:35,990 --> 00:41:39,640 adalah sehingga Anda benar-benar memiliki tanah ini up pemahaman tentang bagaimana komputer bekerja, 886 00:41:39,640 --> 00:41:42,440 bagaimana perangkat lunak bekerja, dan tidak percaya begitu saja. 887 00:41:42,440 --> 00:41:45,820 >> Dan memang sayangnya, bahkan dengan bahwa pemahaman mendasar, 888 00:41:45,820 --> 00:41:47,370 kita manusia melakukan kesalahan. 889 00:41:47,370 --> 00:41:51,310 Dan apa yang saya pikir saya akan berbagi adalah Video delapan menit ini di sini diambil 890 00:41:51,310 --> 00:41:56,980 dari episode modern Marvels, yang acara pendidikan tentang bagaimana segala sesuatu bekerja 891 00:41:56,980 --> 00:42:00,370 yang cat dua gambar dari ketika penggunaan yang tidak benar 892 00:42:00,370 --> 00:42:02,540 dan pemahaman tentang nilai floating point 893 00:42:02,540 --> 00:42:05,610 menyebabkan beberapa signifikan Hasil disayangkan. 894 00:42:05,610 --> 00:42:06,363 Mari kita lihat. 895 00:42:06,363 --> 00:42:07,029 [VIDEO PEMUTARAN] 896 00:42:07,029 --> 00:42:11,290 -Kami Sekarang kembali ke "Rekayasa Bencana "tentang Modern Marvels. 897 00:42:11,290 --> 00:42:12,940 Komputer. 898 00:42:12,940 --> 00:42:15,580 Kita semua datang untuk menerima masalah yang sering frustasi yang 899 00:42:15,580 --> 00:42:20,960 mendapat dengan them-- bug, virus, dan glitches-- perangkat lunak untuk harga kecil 900 00:42:20,960 --> 00:42:23,100 untuk membayar untuk kenyamanan. 901 00:42:23,100 --> 00:42:27,770 Namun dalam teknologi tinggi dan kecepatan tinggi aplikasi militer dan program luar angkasa, 902 00:42:27,770 --> 00:42:32,780 masalah terkecil dapat diperbesar menjadi bencana. 903 00:42:32,780 --> 00:42:38,880 >> Pada tanggal 4 Juni 1996, para ilmuwan disiapkan untuk meluncurkan berawak Ariane 5 roket. 904 00:42:38,880 --> 00:42:41,190 Itu membawa ilmiah satelit yang dirancang 905 00:42:41,190 --> 00:42:44,570 untuk mendirikan tepat bagaimana Berinteraksi medan magnet bumi 906 00:42:44,570 --> 00:42:47,380 dengan angin surya. 907 00:42:47,380 --> 00:42:50,580 Roket ini dibangun untuk European Space Agency, 908 00:42:50,580 --> 00:42:54,400 dan lepas landas dari fasilitas yang di pantai Guyana Prancis. 909 00:42:54,400 --> 00:42:57,520 >> -Pada Sekitar 37 detik ke penerbangan, mereka pertama 910 00:42:57,520 --> 00:42:59,070 sesuatu yang melihat akan salah. 911 00:42:59,070 --> 00:43:02,240 Bahwa nozel yang berputar dengan cara mereka benar-benar tidak seharusnya. 912 00:43:02,240 --> 00:43:06,550 Sekitar 40 detik dalam penerbangan, jelas kendaraan dalam kesulitan, 913 00:43:06,550 --> 00:43:08,820 dan saat itulah mereka membuat keputusan untuk menghancurkannya. 914 00:43:08,820 --> 00:43:12,370 Petugas keamanan range, dengan nyali luar biasa, menekan tombol 915 00:43:12,370 --> 00:43:18,030 dan meledakkan roket sebelum bisa menjadi bahaya bagi keselamatan publik. 916 00:43:18,030 --> 00:43:21,010 >> -Ini adalah gadis yang perjalanan dari Ariane 5, 917 00:43:21,010 --> 00:43:23,920 dan kehancuran mengambil tempat karena cacat 918 00:43:23,920 --> 00:43:25,932 tertanam dalam perangkat lunak roket. 919 00:43:25,932 --> 00:43:27,640 -The Masalah pada Ariane adalah bahwa ada 920 00:43:27,640 --> 00:43:30,500 adalah nomor yang diperlukan 64 bit untuk mengekspresikan, 921 00:43:30,500 --> 00:43:33,560 dan mereka ingin mengkonversi ke nomor 16-bit. 922 00:43:33,560 --> 00:43:36,820 Mereka beranggapan bahwa jumlah tidak pernah akan menjadi sangat besar. 923 00:43:36,820 --> 00:43:40,940 Bahwa kebanyakan dari mereka digit di nomor 64-bit yang nol. 924 00:43:40,940 --> 00:43:42,450 Mereka salah. 925 00:43:42,450 --> 00:43:45,000 >> -The Ketidakmampuan satu program perangkat lunak untuk menerima 926 00:43:45,000 --> 00:43:49,460 jenis nomor yang dihasilkan oleh lain adalah akar dari kegagalan. 927 00:43:49,460 --> 00:43:54,260 Pengembangan perangkat lunak telah menjadi sangat mahal bagian dari teknologi baru. 928 00:43:54,260 --> 00:43:57,060 Ariane 4 roket telah sangat berhasil. 929 00:43:57,060 --> 00:44:01,600 Begitu banyak perangkat lunak yang diciptakan untuk itu juga digunakan dalam Ariane 5. 930 00:44:01,600 --> 00:44:04,790 >> -The Masalah dasar adalah bahwa Ariane 5. 931 00:44:04,790 --> 00:44:11,200 Apakah faster-- dipercepat lebih cepat, dan perangkat lunak tidak menyumbang untuk itu. 932 00:44:11,200 --> 00:44:14,910 >> Penghancuran -The roket adalah bencana keuangan yang besar. 933 00:44:14,910 --> 00:44:18,630 Semua karena kesalahan software menit. 934 00:44:18,630 --> 00:44:21,160 Tapi ini bukan yang pertama waktu masalah konversi data 935 00:44:21,160 --> 00:44:24,770 dialami teknologi roket modern. 936 00:44:24,770 --> 00:44:28,020 >> -Dalam 1991 dengan awal Perang Teluk pertama, 937 00:44:28,020 --> 00:44:30,540 rudal Patriot mengalami serupa 938 00:44:30,540 --> 00:44:32,465 dari masalah nomor konversi. 939 00:44:32,465 --> 00:44:36,760 Dan sebagai hasilnya 28 people-- 28 Soldiers-- Amerika tewas, 940 00:44:36,760 --> 00:44:39,010 dan sekitar seratus lainnya luka-luka. 941 00:44:39,010 --> 00:44:42,830 Ketika Patriot, yang seharusnya untuk melindungi terhadap Scud masuk, 942 00:44:42,830 --> 00:44:45,780 gagal untuk menembakkan rudal. 943 00:44:45,780 --> 00:44:51,610 >> -Ketika Irak menginvasi Kuwait, dan Amerika diluncurkan Desert Storm pada awal 1991, 944 00:44:51,610 --> 00:44:55,720 Baterai rudal Patriot dikerahkan untuk melindungi Arab Saudi dan Israel 945 00:44:55,720 --> 00:44:59,180 dari Irak Scud serangan rudal. 946 00:44:59,180 --> 00:45:03,080 The Patriot adalah US menengah permukaan-ke-udara sistem 947 00:45:03,080 --> 00:45:06,530 diproduksi oleh perusahaan Raytheon. 948 00:45:06,530 --> 00:45:09,500 >> -The Ukuran Patriot pencegat itself-- 949 00:45:09,500 --> 00:45:14,705 ini tentang kira-kira 20 meter, dan beratnya sekitar 2.000 pound. 950 00:45:14,705 --> 00:45:19,090 Dan ia membawa hulu ledak sekitar, Saya pikir itu sekitar £ 150. 951 00:45:19,090 --> 00:45:23,880 Dan hulu ledak itu sendiri ledak tinggi, yang 952 00:45:23,880 --> 00:45:26,700 memiliki fragmen sekitarnya. 953 00:45:26,700 --> 00:45:31,630 Jadi casing hulu ledak adalah dirancang untuk bertindak seperti gotri a. 954 00:45:31,630 --> 00:45:34,040 >> Rudal -The dilakukan empat per kontainer, 955 00:45:34,040 --> 00:45:37,170 dan diangkut oleh semi trailer. 956 00:45:37,170 --> 00:45:44,880 >> -Sistem Patriot anti-rudal kembali setidaknya 20 tahun sekarang. 957 00:45:44,880 --> 00:45:48,380 Ini pada awalnya dirancang sebagai rudal pertahanan udara 958 00:45:48,380 --> 00:45:50,810 untuk menembak jatuh pesawat musuh. 959 00:45:50,810 --> 00:45:54,410 Dalam Perang Teluk pertama ketika perang itu datang, 960 00:45:54,410 --> 00:45:59,650 Angkatan Darat ingin menggunakannya untuk menembak jatuh rudal Scud, bukan pesawat. 961 00:45:59,650 --> 00:46:03,580 Angkatan Udara Irak tidak begitu banyak masalah, 962 00:46:03,580 --> 00:46:06,590 tapi Angkatan Darat khawatir tentang Scud. 963 00:46:06,590 --> 00:46:10,120 Jadi mereka mencoba untuk upgrade Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting Musuh rudal bepergian di Mach 5 965 00:46:12,740 --> 00:46:15,670 itu akan cukup menantang. 966 00:46:15,670 --> 00:46:18,440 Tapi ketika Patriot dilarikan ke layanan, 967 00:46:18,440 --> 00:46:22,580 Angkatan Darat tidak menyadari modifikasi Irak yang 968 00:46:22,580 --> 00:46:25,880 membuat Scud mereka hampir mustahil untuk itu. 969 00:46:25,880 --> 00:46:30,690 >> Apa yang terjadi adalah Scud yang yang datang tidak stabil. 970 00:46:30,690 --> 00:46:32,000 Mereka goyah. 971 00:46:32,000 --> 00:46:37,210 Alasan untuk ini adalah Iraqis-- untuk mendapatkan 600 kilometer keluar 972 00:46:37,210 --> 00:46:41,680 dari berbagai 300-kilometer missile-- mengambil berat dari hulu ledak depan, 973 00:46:41,680 --> 00:46:43,340 dan membuat hulu ledak ringan. 974 00:46:43,340 --> 00:46:48,490 Jadi sekarang Patriot mencoba untuk datang di Scud, dan sebagian besar time-- yang 975 00:46:48,490 --> 00:46:52,880 mayoritas dari time-- itu hanya akan terbang oleh Scud. 976 00:46:52,880 --> 00:46:57,120 >> -Setelah Operator sistem Patriot menyadari Patriot terjawab target, 977 00:46:57,120 --> 00:47:01,630 mereka meledakkan hulu ledak Patriot untuk menghindari kemungkinan korban jika 978 00:47:01,630 --> 00:47:04,440 diizinkan untuk jatuh ke tanah. 979 00:47:04,440 --> 00:47:08,700 >> -Itu Apa yang kebanyakan orang melihat sebagai bola api besar di langit, 980 00:47:08,700 --> 00:47:14,180 dan disalahpahami sebagai penyadapan dari Scud hulu ledak. 981 00:47:14,180 --> 00:47:18,020 >> -meskipun Di langit malam, Patriots tampaknya berhasil menghancurkan 982 00:47:18,020 --> 00:47:23,280 Scud, di Dhahran mungkin ada salah tentang kinerjanya. 983 00:47:23,280 --> 00:47:27,930 Ada sistem radar Patriot kehilangan jejak dari Scud masuk 984 00:47:27,930 --> 00:47:30,260 dan tidak pernah diluncurkan karena untuk cacat software. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Itu adalah Israel yang pertama kali ditemukan bahwa semakin lama sistem itu pada, 987 00:47:38,880 --> 00:47:41,130 semakin besar waktu perbedaan menjadi. 988 00:47:41,130 --> 00:47:44,770 Karena jam tertanam di komputer sistem. 989 00:47:44,770 --> 00:47:48,190 >> -Tentang Dua minggu sebelum tragedi di Dhahran, 990 00:47:48,190 --> 00:47:50,720 Israel dilaporkan Departemen Pertahanan 991 00:47:50,720 --> 00:47:52,410 bahwa sistem itu kehilangan waktu. 992 00:47:52,410 --> 00:47:54,410 Setelah sekitar delapan jam berjalan, mereka melihat 993 00:47:54,410 --> 00:47:57,690 bahwa sistem menjadi terasa kurang akurat. 994 00:47:57,690 --> 00:48:01,850 Departemen Pertahanan menanggapi dengan memberitahu semua baterai Patriot 995 00:48:01,850 --> 00:48:04,800 untuk tidak memberikan sistem pada untuk waktu yang lama. 996 00:48:04,800 --> 00:48:06,980 Mereka tidak pernah mengatakan apa waktu yang lama adalah. 997 00:48:06,980 --> 00:48:09,140 8 jam, 10 jam, seribu jam. 998 00:48:09,140 --> 00:48:11,300 Tak ada yang tahu. 999 00:48:11,300 --> 00:48:13,320 >> -The Baterai Patriot ditempatkan di barak 1000 00:48:13,320 --> 00:48:18,310 di Dhahran internal dan cacat yang Jam telah selama lebih dari 100 jam 1001 00:48:18,310 --> 00:48:21,520 pada malam 25 Februari. 1002 00:48:21,520 --> 00:48:25,792 >> -It Dilacak waktu dengan akurasi sekitar sepersepuluh detik. 1003 00:48:25,792 --> 00:48:27,950 Sekarang sepersepuluh detik adalah nomor menarik 1004 00:48:27,950 --> 00:48:31,850 karena tidak dapat dinyatakan dalam biner persis, yang 1005 00:48:31,850 --> 00:48:36,500 berarti itu tidak bisa diungkapkan dengan tepat dalam komputer digital modern. 1006 00:48:36,500 --> 00:48:41,070 Sulit untuk percaya, tetapi menggunakan ini sebagai contoh. 1007 00:48:41,070 --> 00:48:43,420 >> Mari kita nomor satu ketiga. 1008 00:48:43,420 --> 00:48:47,330 Sepertiga tidak dapat dinyatakan dalam desimal persis. 1009 00:48:47,330 --> 00:48:52,060 Sepertiga adalah 0.333 berlangsung selama tak terhingga. 1010 00:48:52,060 --> 00:48:56,420 Tidak ada cara untuk melakukan itu dengan akurasi mutlak dalam desimal. 1011 00:48:56,420 --> 00:48:59,530 Itulah jenis masalah yang terjadi di Patriot. 1012 00:48:59,530 --> 00:49:04,040 Semakin lama sistem berlari, yang buruk kesalahan waktu menjadi. 1013 00:49:04,040 --> 00:49:08,840 >> -Setelah 100 jam operasi, kesalahan dalam waktu hanya sekitar sepertiga 1014 00:49:08,840 --> 00:49:10,440 detik. 1015 00:49:10,440 --> 00:49:14,150 Tapi dalam hal menargetkan rudal bepergian di Mach 5, 1016 00:49:14,150 --> 00:49:18,560 itu mengakibatkan pelacakan sebuah kesalahan lebih dari 600 meter. 1017 00:49:18,560 --> 00:49:21,870 Ini akan menjadi kesalahan fatal bagi para prajurit di Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> Apa yang terjadi adalah peluncuran Scud itu terdeteksi oleh satelit peringatan dini, 1019 00:49:28,455 --> 00:49:32,710 dan mereka tahu Scud datang arah umum mereka. 1020 00:49:32,710 --> 00:49:35,150 Mereka tidak tahu di mana itu berasal. 1021 00:49:35,150 --> 00:49:38,210 Sekarang sudah sampai radar komponen dari sistem Patriot 1022 00:49:38,210 --> 00:49:43,150 membela Dhahran untuk mencari dan menjaga melacak rudal musuh yang masuk. 1023 00:49:43,150 --> 00:49:44,561 >> Radar -The sangat cerdas. 1024 00:49:44,561 --> 00:49:46,560 Ini akan benar-benar melacak posisi Scud 1025 00:49:46,560 --> 00:49:48,930 dan kemudian memprediksi di mana mungkin akan 1026 00:49:48,930 --> 00:49:51,380 waktu berikutnya radar mengirim pulsa keluar. 1027 00:49:51,380 --> 00:49:53,040 Itu disebut gerbang jangkauan. 1028 00:49:53,040 --> 00:49:57,620 >> -Kemudian Setelah Patriot memutuskan cukup waktu memiliki 1029 00:49:57,620 --> 00:50:02,400 berlalu untuk kembali dan memeriksa berikutnya lokasi untuk objek yang terdeteksi ini 1030 00:50:02,400 --> 00:50:03,550 itu akan kembali. 1031 00:50:03,550 --> 00:50:07,820 Jadi ketika kembali ke salah tempat, kemudian melihat ada objek. 1032 00:50:07,820 --> 00:50:10,360 Dan ia memutuskan bahwa tidak ada objek. 1033 00:50:10,360 --> 00:50:13,630 Bahwa ada deteksi palsu dan tetes trek. 1034 00:50:13,630 --> 00:50:16,970 >> -The Masuk Scud menghilang dari layar radar, 1035 00:50:16,970 --> 00:50:20,200 dan beberapa detik kemudian, itu membanting ke markas. 1036 00:50:20,200 --> 00:50:22,570 The Scud menewaskan 28. 1037 00:50:22,570 --> 00:50:26,110 Itu yang terakhir dipecat selama Perang Teluk pertama. 1038 00:50:26,110 --> 00:50:31,920 Tragisnya, perangkat lunak diperbarui tiba saat fajar pada hari berikutnya. 1039 00:50:31,920 --> 00:50:34,870 Perangkat lunak cacat telah telah diperbaiki, penutupan 1040 00:50:34,870 --> 00:50:39,150 satu bab dalam bermasalah sejarah rudal Patriot. 1041 00:50:39,150 --> 00:50:40,030 >> [END VIDEO PUTAR] 1042 00:50:40,030 --> 00:50:41,488 >> DAVID J. Malan: Itu saja untuk CS50. 1043 00:50:41,488 --> 00:50:42,820 Kita akan melihat Anda pada hari Rabu. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [MUSIC PLAYING] 1046 00:50:50,370 --> 00:54:23,446