1 00:00:00,000 --> 00:00:02,200 [Powered by Google Translate] [Minggu 3] 2 00:00:02,200 --> 00:00:03,950 [David J. Malan - Universitas Harvard] 3 00:00:03,950 --> 00:00:07,140 [Ini adalah CS50. - CS50.TV] 4 00:00:07,140 --> 00:00:10,720 Mari saya mengarahkan kita ke arah mana kami tinggalkan terakhir kali, 5 00:00:10,720 --> 00:00:13,890 yang mulai berpikir sedikit lebih dari sekitar sintaks 6 00:00:13,890 --> 00:00:17,150 dan mencoba untuk berpikir sedikit kurang tentang semua hal-hal kecil 7 00:00:17,150 --> 00:00:20,630 yang mengambil sedikit waktu untuk menyesuaikan diri dengan sejauh dalam hal titik koma 8 00:00:20,630 --> 00:00:22,360 dan tanda kurung dan kurung kurawal, 9 00:00:22,360 --> 00:00:25,630 untuk mulai mengambil hal-hal sedikit untuk tingkat konseptual yang lebih tinggi 10 00:00:25,630 --> 00:00:28,800 sehingga masalah yang kita sekarang mulai memecahkan selama beberapa minggu berikutnya 11 00:00:28,800 --> 00:00:32,340 akan melibatkan lebih banyak masalah tingkat yang lebih tinggi konseptual 12 00:00:32,340 --> 00:00:36,310 dan sedikit kurang dalam sintaksis sebagai Anda mendapatkan kaki Anda basah 13 00:00:36,310 --> 00:00:40,090 dan tangan Anda kotor dengan beberapa sintaks dari beberapa minggu terakhir ini. 14 00:00:40,090 --> 00:00:43,690 >> Jadi ingat bahwa minggu lalu kami memperkenalkan gagasan dari sebuah array. 15 00:00:43,690 --> 00:00:49,320 Dan sebuah array dalam bahasa Inggris dapat digambarkan sebagai apa? >> [Respon siswa tidak terdengar] 16 00:00:49,320 --> 00:00:51,710 Maaf? 17 00:00:51,710 --> 00:00:54,810 Sebuah koleksi? >> [Respon siswa terdengar] >> Oke, baik. 18 00:00:54,810 --> 00:00:57,820 Sebuah koleksi item. Jadi kita melihat array dalam Scratch. 19 00:00:57,820 --> 00:01:01,880 Jika Anda kebetulan gunakan untuk pset 0 salah satu daftar Scratch yang Anda dapat menarik hal-hal 20 00:01:01,880 --> 00:01:05,410 seperti jeruk dan pisang ke dalam, inventarisasi macam, 21 00:01:05,410 --> 00:01:07,100 itu jenis seperti apa array adalah. 22 00:01:07,100 --> 00:01:10,980 Dan kemudian lebih teknis, dalam konteks sebuah komputer yang sebenarnya, 23 00:01:10,980 --> 00:01:14,730 array hanyalah sepotong bersebelahan memori. 24 00:01:14,730 --> 00:01:18,590 Dengan kata lain, Anda memiliki byte, maka lain byte, maka byte yang lain, maka byte yang lain, 25 00:01:18,590 --> 00:01:21,330 dan jika Anda adalah untuk menarik orang-orang byte dalam gambar, 26 00:01:21,330 --> 00:01:24,510 mereka akan kembali untuk kembali ke kembali ke belakang. Itulah yang kami maksud dengan berdekatan. 27 00:01:24,510 --> 00:01:26,690 >> Jadi jumlah byte 1, kemudian 2, kemudian 3. 28 00:01:26,690 --> 00:01:29,680 Itu tidak berarti di sini, di sini, di sini, di sini. 29 00:01:29,680 --> 00:01:33,800 Array adalah sepotong bersebelahan 0 atau lebih byte. 30 00:01:33,800 --> 00:01:36,160 Jadi apa yang mereka berguna untuk? 31 00:01:36,160 --> 00:01:40,090 Ingat kita punya semacam ini contoh buat nilai kuis orang menyimpan dalam sebuah program 32 00:01:40,090 --> 00:01:42,580 untuk menghitung rata-rata kuis Anda untuk kursus tertentu, 33 00:01:42,580 --> 00:01:46,780 dan ingat bahwa kita bisa mulai menulis program yang dengan mendeklarasikan quiz1 variabel. 34 00:01:46,780 --> 00:01:49,550 Kemudian kita bisa memiliki variabel lain yang disebut quiz2. 35 00:01:49,550 --> 00:01:52,030 Tapi kemudian jika ada 3 kuis di kelas ini, quiz4. 36 00:01:52,030 --> 00:01:55,710 Atau jika ada kuis mingguan, akan quiz5, quiz6, quiz7. 37 00:01:55,710 --> 00:01:58,520 Jadi, Anda akan memiliki semua variabel yang dideklarasikan dalam main 38 00:01:58,520 --> 00:02:00,470 atau di tempat lain dalam program Anda, 39 00:02:00,470 --> 00:02:03,870 dan masalah dengan pendekatan itu, mudah meskipun hanya copy dan paste, 40 00:02:03,870 --> 00:02:06,120 apakah hanya sangat cepat menjadi berat. 41 00:02:06,120 --> 00:02:09,360 Allah melarang Anda benar-benar memiliki 30 atau 50 kuis kuis. 42 00:02:09,360 --> 00:02:12,080 Jika itu seperti kuis gaya pop sekolah tinggi harian, 43 00:02:12,080 --> 00:02:15,910 maka Anda hanya memiliki daftar ridiculously panjang variabel dinyatakan, 44 00:02:15,910 --> 00:02:17,780 dan ini hanya sangat cepat menjadi tidak terkendali. 45 00:02:17,780 --> 00:02:20,820 Itu jelek, sulit untuk mempertahankan, itu jauh lebih mudah untuk membuat kesalahan ketik 46 00:02:20,820 --> 00:02:23,910 jika Anda mendapatkan 1 nomor mistyped suatu tempat dalam program Anda. 47 00:02:23,910 --> 00:02:26,800 >> Jadi kami memperkenalkan konsep array sebagai gantinya. 48 00:02:26,800 --> 00:02:30,760 Dan ingat bahwa kami menerapkan program ini dengan melakukan sedikit sesuatu seperti ini. 49 00:02:30,760 --> 00:02:33,950 Biarkan aku pergi ke 3 direktori Sumber hari Senin 50 00:02:33,950 --> 00:02:37,160 dan membuka array, yang kita lihat terakhir kali. 51 00:02:37,160 --> 00:02:39,940 Dan meskipun ada beberapa trik baru C di sini, 52 00:02:39,940 --> 00:02:41,920 di antaranya gagasan konstan, 53 00:02:41,920 --> 00:02:47,140 ingat bahwa kita menyatakan mengapung beberapa dasarnya dengan menggunakan sintaks ini: 54 00:02:47,140 --> 00:02:51,750 float, maka nama variabel, maka kita menggunakan kurung siku benar-benar untuk pertama kalinya, 55 00:02:51,750 --> 00:02:55,450 dan apa yang kita lakukan dalam kurung siku tersebut secara efektif menempatkan nomor. 56 00:02:55,450 --> 00:02:59,780 Tapi bukannya menempatkan nomor, saya menempatkan kata ini dikapitalisasi, kuis. 57 00:02:59,780 --> 00:03:03,220 Dan apa motivasi untuk menempatkan kata dikapitalisasi seperti kuis 58 00:03:03,220 --> 00:03:08,170 dan kemudian menggunakan trik baris 17 di sini untuk benar-benar memberikan yang nomor? 59 00:03:08,170 --> 00:03:11,240 Apa motivasi di sana? Ya. 60 00:03:11,240 --> 00:03:13,360 >> [Respon siswa terdengar] >> Tepat. 61 00:03:13,360 --> 00:03:16,630 Jika kita ingin mengubah bahwa nilai 2, kita hanya perlu mengubahnya dalam 1 tempat 62 00:03:16,630 --> 00:03:19,680 karena menganggap - Aku bahkan tidak ingat apa program ini melakukan persis, 63 00:03:19,680 --> 00:03:22,040 tetapi jika Anda hanya skim itu Anda melihat kuis, kuis. 64 00:03:22,040 --> 00:03:24,720 Anda lihat kuis, di sini lebih Kuis. 65 00:03:24,720 --> 00:03:28,180 Jadi jika kita tidak memiliki konstan, ini penggunaan tajam mendefinisikan, 66 00:03:28,180 --> 00:03:33,320 kita akan mengetik 2, kemudian 2, kemudian 2, kemudian 2, yang baik-baik saja. Ini akan sama benar. 67 00:03:33,320 --> 00:03:36,220 Tapi misalkan tahun depan kita memiliki 3 kuis di CS50. 68 00:03:36,220 --> 00:03:39,190 Jadi aku harus pergi dan memperbarui kode, saya harus mengkompilasi ulang, 69 00:03:39,190 --> 00:03:43,820 tapi masalahnya adalah jika saya melakukan sesuatu yang bodoh, seperti saya mengabaikan 1 menyebutkan 2 70 00:03:43,820 --> 00:03:46,750 dan lupa untuk plug-in 3, seluruh program bisa sangat baik istirahat. 71 00:03:46,750 --> 00:03:48,720 Jadi kita hanya meminta masalah. 72 00:03:48,720 --> 00:03:53,170 >> Jadi gagasan konstan adalah semua tentang anjak beberapa bagian dari data, 73 00:03:53,170 --> 00:03:56,070 apakah itu string atau char atau pelampung atau apa pun, 74 00:03:56,070 --> 00:04:00,070 dan menyatakan itu 1 tempat sehingga Anda dapat lebih mudah mengubahnya di masa mendatang. 75 00:04:00,070 --> 00:04:03,660 Dan itu juga, terus terang, sedikit lebih mudah untuk dibaca karena jika Anda hanya memikirkan hal ini sekarang, 76 00:04:03,660 --> 00:04:07,840 itu kuis, atau kita bahkan bisa mengubah nama itu sesuatu seperti NUMBER_OF_QUIZZES 77 00:04:07,840 --> 00:04:09,430 atau lebih eksplisit sesuatu. 78 00:04:09,430 --> 00:04:11,830 Kode hanya menjadi sedikit lebih jelas untuk apa yang dilakukannya, 79 00:04:11,830 --> 00:04:15,780 dan Anda bertanya-tanya sedikit kurang apa nomor 2 mungkin terjadi berarti. 80 00:04:15,780 --> 00:04:18,920 Jadi konstan tidak ada hubungannya dengan fundamental array. 81 00:04:18,920 --> 00:04:22,990 Array diperkenalkan dengan cara tersebut kurung siku. 82 00:04:22,990 --> 00:04:26,610 >> Jadi melihat bahwa di baris 23 kita meminta pengguna, "Apa skor kuis Anda?" 83 00:04:26,610 --> 00:04:31,120 Kemudian kita hanya memiliki lingkaran yang tampaknya meminta user untuk kelas mereka. Bagaimana? 84 00:04:31,120 --> 00:04:37,460 Ini iterates dari 0 sampai 2. Dan saya katakan 2 karena kuis di semua topi saat ini 2. 85 00:04:37,460 --> 00:04:42,310 Jadi iterates dari 0 sampai dengan 2 dan kemudian mencetak Quiz # sesuatu dari sesuatu, 86 00:04:42,310 --> 00:04:45,830 dan kemudian menggunakan GetFloat untuk mendapatkan nilai dari pengguna. 87 00:04:45,830 --> 00:04:49,050 Jadi melihat ini adalah satu-satunya baru lainnya dari sintaks dari Rabu lalu. 88 00:04:49,050 --> 00:04:53,120 Jika Anda ingin menyimpan sesuatu di lokasi tertentu dalam array itu, 89 00:04:53,120 --> 00:04:55,460 Anda lagi menggunakan tanda kurung siku. 90 00:04:55,460 --> 00:04:57,030 >> Jadi ada sedikit dikotomi di sini. 91 00:04:57,030 --> 00:04:59,040 Pertama kali Anda menggunakan tanda kurung siku 92 00:04:59,040 --> 00:05:02,250 Anda menggunakannya untuk menentukan seberapa besar Anda ingin array menjadi. 93 00:05:02,250 --> 00:05:06,580 Tapi ini konteks berikutnya di sini di mana kita lagi menggunakan ini tanda kurung siku 94 00:05:06,580 --> 00:05:10,540 berarti di mana dalam array yang Anda ingin menempatkan beberapa nilai? 95 00:05:10,540 --> 00:05:13,650 Dan perbedaan di sini dapat disimpulkan dari konteks. 96 00:05:13,650 --> 00:05:17,130 Perhatikan di sini kita memiliki tipe data, maka kita memiliki nama variabel, 97 00:05:17,130 --> 00:05:20,770 maka kita memiliki kurung siku kami dengan sejumlah dalamnya, titik koma. Itu saja. 98 00:05:20,770 --> 00:05:22,290 Jadi itu deklarasi. 99 00:05:22,290 --> 00:05:28,390 Itu hanya seolah-olah kita telah melakukan sesuatu seperti pelampung Grade1, pelampung grade2; 100 00:05:28,390 --> 00:05:31,730 tapi sekali lagi, ini sangat cepat devolves ke copy terlalu banyak, pasta, 101 00:05:31,730 --> 00:05:34,260 jadi bukannya kami hanya disederhanakan seperti itu, 102 00:05:34,260 --> 00:05:38,800 yang berarti selanjutnya kita memiliki nilai yang dapat disimpan di braket 0, 103 00:05:38,800 --> 00:05:41,760 kita memiliki kelas yang dapat disimpan pada braket 1, 104 00:05:41,760 --> 00:05:46,890 tapi bagaimana jika saya menyia-nyiakan dan, misalnya, loop saya pergi sejauh - 105 00:05:46,890 --> 00:05:48,740 misalnya, saya membuat ini kurang dari atau sama dengan, 106 00:05:48,740 --> 00:05:50,620 yang recall merupakan sumber bug sebelumnya - 107 00:05:50,620 --> 00:05:55,590 yang secara efektif berarti bahwa pada beberapa iterasi disengaja ketiga lingkaran ini 108 00:05:55,590 --> 00:06:00,380 Saya menggunakan braket 2. Efektif, apa yang mungkin terjadi di sini? Maaf? 109 00:06:00,380 --> 00:06:02,860 [Mahasiswa] Ini akan diganti. >> Apakah akan diganti? 110 00:06:02,860 --> 00:06:04,520 Apa yang akan diganti? 111 00:06:04,520 --> 00:06:10,890 Ini benar-benar mengatakan mengganti apa yang di lokasi 2 dengan nilai kembali dari GetFloat. 112 00:06:10,890 --> 00:06:13,690 Tapi masalahnya adalah seberapa besar array saat ini dalam cerita? 113 00:06:13,690 --> 00:06:17,730 [Respon terdengar mahasiswa] >> array masih hanya ukuran 2 114 00:06:17,730 --> 00:06:22,730 karena array, seperti variabel apapun, dinyatakan terlebih dahulu, sebelum kita menggunakannya, 115 00:06:22,730 --> 00:06:27,220 dan kami ditentukan di sini karena konstan ini bahwa saya memiliki 2 nilai bahwa aku akan menempatkan. 116 00:06:27,220 --> 00:06:29,930 >> Tapi ingat, ilmuwan komputer mulai menghitung dari 0. 117 00:06:29,930 --> 00:06:33,620 Jadi lokasi pertama dalam array yang braket 0. 118 00:06:33,620 --> 00:06:40,210 Lokasi berikutnya adalah 1. Hal ini pernah jadi sedikit terlalu jauh ke samping. 119 00:06:40,210 --> 00:06:42,870 Jadi dengan kata lain, jika saya benar-benar memiliki array ini - 120 00:06:42,870 --> 00:06:46,790 dan biarkan aku melihat seberapa baik ini bekerja sama di sini untuk kita - 121 00:06:46,790 --> 00:06:52,360 jika saya memiliki array yang saya hanya ditarik sebagai berikut 122 00:06:52,360 --> 00:06:56,750 dan saya sudah dialokasikan ruang untuk 2 elemen, aku mungkin menggambar ini seperti ini dalam memori 123 00:06:56,750 --> 00:06:58,020 mana ini kanvas putih besar. 124 00:06:58,020 --> 00:07:00,920 Ini hanya RAM saya miliki dalam komputer saya, pertunjukan RAM, 2 gigs of RAM, apa pun, 125 00:07:00,920 --> 00:07:05,400 tetapi sekarang 2 kotak individual merupakan pelampung, 32 bit. 126 00:07:05,400 --> 00:07:10,860 Jadi jika saya menempatkan nomor 1 di sini seperti 1,0, maka saya menempatkan nomor lain di sini seperti 3,2 127 00:07:10,860 --> 00:07:15,280 tapi kemudian saya lakukan braket 2, itu seperti menempatkan sesuatu di sini. 128 00:07:15,280 --> 00:07:17,820 Dan seperti gambar menunjukkan, tidak ada ada. 129 00:07:17,820 --> 00:07:20,450 Ini semacam seperti tanah tak bertuan karena saya belum meminta sistem operasi 130 00:07:20,450 --> 00:07:23,550 untuk memberikan saya ini kuis ketiga. 131 00:07:23,550 --> 00:07:26,940 Jika aku ingin bahwa kuis ketiga, saya harus memiliki pemikiran yang 132 00:07:26,940 --> 00:07:31,700 untuk meminta sistem operasi untuk itu dengan menyatakan Kuis menjadi tidak 2 133 00:07:31,700 --> 00:07:34,210 tapi bukan sama 3. 134 00:07:34,210 --> 00:07:39,000 >> Jadi dengan kata lain, gambar yang kita miliki secara efektif di tangan terlihat seperti ini di sini. 135 00:07:39,000 --> 00:07:42,260 Ini lagi adalah tanah tak bertuan. Kami lebih baik tidak mencoba menulis nilai-nilai di sini. 136 00:07:42,260 --> 00:07:45,300 Tapi sekali lagi, karena para ilmuwan komputer menghitung dari 0, 137 00:07:45,300 --> 00:07:49,520 ketika kita berbicara tentang lokasi ini dalam array, yang seharusnya menjadi lokasi 0, 138 00:07:49,520 --> 00:07:53,890 ini seharusnya menjadi lokasi 1, dan ini bahkan tidak ada 139 00:07:53,890 --> 00:07:57,380 karena kita hanya meminta sistem operasi untuk 2 tempat tersebut. 140 00:07:57,380 --> 00:08:00,130 Jadi bagi anda dengan pengalaman pemrograman sebelumnya dari bahasa lain 141 00:08:00,130 --> 00:08:04,150 mungkin tahu bahwa hal ini tidak selalu terjadi dengan array atau hal-hal yang disebut vektor. 142 00:08:04,150 --> 00:08:06,930 Sebaliknya, Anda hanya dapat terus menambahkan dan menambahkan, dan menambahkan hal-hal ke array, 143 00:08:06,930 --> 00:08:10,720 yang, terus terang, kita punya kemampuan dalam Scratch, namun kita tampaknya telah diberikan itu di sini 144 00:08:10,720 --> 00:08:15,160 karena dengan C Anda pemrograman lebih eksplisit. 145 00:08:15,160 --> 00:08:17,980 Ini hanya Anda dan komputer sekarang, dan komputer hanya akan melakukan 146 00:08:17,980 --> 00:08:19,530 apa yang Anda katakan untuk dilakukan. 147 00:08:19,530 --> 00:08:24,270 Jadi jika Anda hanya mengatakan itu untuk memberikan 2 mengapung dengan cara baris 22 di sini, 148 00:08:24,270 --> 00:08:27,640 itu semua Anda akan mendapatkan kembali dari sistem operasi: ruang untuk 2. 149 00:08:27,640 --> 00:08:34,049 >> Jadi semakin program yang Anda akan sesekali menjadi kereta berkaitan dengan array. 150 00:08:34,049 --> 00:08:37,520 Ini hanya semacam sifat binatang dimana kita semua tidak sempurna, 151 00:08:37,520 --> 00:08:42,490 dan pada titik tertentu Anda akan mengindeks sangat mungkin melampaui batas array Anda. 152 00:08:42,490 --> 00:08:45,980 Dan itu hanya cara mewah untuk mengatakan Anda pergi ke sesuatu braket 153 00:08:45,980 --> 00:08:49,970 dan sesuatu itu terlalu besar nomor. Anda melampaui batas-batas array Anda. 154 00:08:49,970 --> 00:08:51,530 Tapi terbalik sekarang ini. 155 00:08:51,530 --> 00:08:54,990 Sisa dari program ini benar-benar tidak ada hubungannya dengan fundamental array. 156 00:08:54,990 --> 00:08:58,180 Ini semua hanya tentang beberapa aritmatika sederhana untuk rata-rata komputasi. 157 00:08:58,180 --> 00:09:03,200 Jadi kita miliki di sini di sini untuk loop pertama sejumlah variabel yang disebut bahwa kita menginisialisasi ke 0. 158 00:09:03,200 --> 00:09:09,020 Kemudian kita iterate dari 0 sampai dengan 2 lagi dan kami menambah bahwa variabel penjumlahan 159 00:09:09,020 --> 00:09:12,620 kelas engan, sehingga braket 0 maka braket 1. 160 00:09:12,620 --> 00:09:15,130 Dan kemudian seperti yang akan Anda lakukan di sekolah dasar untuk menghitung rata-rata, 161 00:09:15,130 --> 00:09:19,420 kami hanya mengambil uang tersebut, membaginya dengan jumlah total kuis, 162 00:09:19,420 --> 00:09:22,520 dan kemudian untuk mengukur baik kita memanggil fungsi di sini disebut putaran. 163 00:09:22,520 --> 00:09:28,580 >> Sekarang, sebagai samping, apa kesepakatan dengan int kurung on line 34? 164 00:09:28,580 --> 00:09:31,730 Mungkin telah datang sudah dalam bagian, belum benar-benar berbicara tentang hal itu secara resmi di sini, 165 00:09:31,730 --> 00:09:35,210 tapi apa ini int dalam parens mungkin melakukan? >> [Respon siswa tidak terdengar] 166 00:09:35,210 --> 00:09:38,500 Ya, ini mengacu pada casting atau typecasting, 167 00:09:38,500 --> 00:09:41,690 yang berarti mengambil 1 tipe data dan mengubahnya ke yang lain. 168 00:09:41,690 --> 00:09:45,400 Anda tidak dapat melakukan hal ini dengan semua jenis data karena kadang-kadang akan menjadi sedikit aneh. 169 00:09:45,400 --> 00:09:49,640 Tapi dalam kasus ini, jika nilai kembali dari putaran adalah pelampung 170 00:09:49,640 --> 00:09:53,880 karena, setelah semua, saya mengambil pelampung dan membaginya dengan angka seperti 2, 171 00:09:53,880 --> 00:09:55,840 Aku akan mendapatkan kembali pelampung. 172 00:09:55,840 --> 00:10:00,760 Tetapi orang-orang sekolah dasar tidak benar-benar ingin tahu bahwa rata-rata adalah 93,4 173 00:10:00,760 --> 00:10:04,420 karena mereka akan menyadari bahwa mereka yang pernah begitu dekat dengan yang 95 titik pembulatan. 174 00:10:04,420 --> 00:10:09,540 >> Jadi kita ingin gantinya menggunakan int untuk putaran setiap orang untuk int terdekat, 175 00:10:09,540 --> 00:10:12,730 yang dalam hal ini akan menjadi 94 tanpa poin setelah itu. 176 00:10:12,730 --> 00:10:14,530 Jadi itu hanya trik matematika sedikit. 177 00:10:14,530 --> 00:10:17,570 Dan kita akan kembali ke gagasan casting karena akan memiliki implikasi, 178 00:10:17,570 --> 00:10:21,640 jika Anda belum menemukan sudah, untuk masalah set 2. 179 00:10:21,640 --> 00:10:25,210 Jadi array kemudian, Anda bisa memikirkan - itu akan membuat saya tersenyum sepanjang hari. 180 00:10:25,210 --> 00:10:27,830 Sepertinya ini jika Anda menggambar gambar itu, 181 00:10:27,830 --> 00:10:31,460 tapi kuncinya adalah bahwa ukuran juga dipilih oleh Anda 182 00:10:31,460 --> 00:10:34,050 ketika Anda memintanya dari sistem operasi. 183 00:10:34,050 --> 00:10:39,460 Setiap pertanyaan kemudian pada array? Ya. 184 00:10:39,460 --> 00:10:47,080 [Pertanyaan siswa tidak terdengar] 185 00:10:47,080 --> 00:10:49,310 Ah, pertanyaan yang bagus. 186 00:10:49,310 --> 00:10:53,150 Pertanyaannya adalah apa yang terjadi pada 0 nol dalam array? Ini tidak ada dalam konteks ini. 187 00:10:53,150 --> 00:10:57,430 Itu hanya ada dalam konteks string, yang kita akan datang ke hanya dalam beberapa saat. 188 00:10:57,430 --> 00:11:02,300 Tapi untuk array, seperti dalam kasus ini, semua yang Anda dapatkan adalah apa yang Anda minta sistem operasi untuk. 189 00:11:02,300 --> 00:11:04,050 >> Dan sebagai samping, supaya ini tidak jelas, 190 00:11:04,050 --> 00:11:07,030 Saya selalu mengatakan Anda bertanya sistem operasi, meminta sistem operasi. 191 00:11:07,030 --> 00:11:10,090 Sebuah sistem operasi, seperti yang mungkin Anda ketahui, adalah Mac OS, Windows, Linux. 192 00:11:10,090 --> 00:11:13,560 Ketika Anda menelepon fungsi seperti GetFloat 193 00:11:13,560 --> 00:11:19,280 atau Anda menyatakan variabel seperti nilai, 194 00:11:19,280 --> 00:11:23,200 pada akhir hari Anda secara efektif meminta orang lain untuk memberikan memori yang 195 00:11:23,200 --> 00:11:25,940 karena kita sebagai calon programmer 196 00:11:25,940 --> 00:11:28,800 tidak tahu bagaimana untuk benar-benar mendapatkan akses fisik ke memori. 197 00:11:28,800 --> 00:11:31,100 Tetapi seseorang melakukan: sistem operasi. 198 00:11:31,100 --> 00:11:36,630 Jadi selain menyajikan kita dengan ikon cantik dan menu dan folder dan sejenisnya 199 00:11:36,630 --> 00:11:39,050 yang Anda lihat pada desktop Anda, apakah Mac atau PC, 200 00:11:39,050 --> 00:11:42,240 Sistem operasi juga melakukan hal-hal tingkat rendah duniawi, 201 00:11:42,240 --> 00:11:44,680 hal-hal yang sangat teknis pengelolaan gigabyte yang 202 00:11:44,680 --> 00:11:48,780 atau 2 gigabyte memori yang Anda miliki, mengelola CPU yang Anda miliki, dan sebagainya. 203 00:11:48,780 --> 00:11:50,170 Jadi, ketika Anda menulis kode, 204 00:11:50,170 --> 00:11:53,900 Anda benar-benar hooking ke sistem operasi Anda dalam pengertian itu. 205 00:11:53,900 --> 00:11:55,720 Aku akan harus meminimalkan itu. Baiklah. 206 00:11:55,720 --> 00:11:59,980 >> Pertanyaan lain tentang array? 207 00:12:00,330 --> 00:12:02,520 Tidak ada? Oke. 208 00:12:02,520 --> 00:12:06,680 Jadi transisi alami dari array sebenarnya untuk topik yang agak familiar. 209 00:12:06,680 --> 00:12:09,570 Dan kami melihat pernah begitu singkat ini terakhir kali juga. 210 00:12:09,570 --> 00:12:12,500 Ini adalah contoh string dari Rabu. 211 00:12:12,500 --> 00:12:15,060 Ini contoh String adalah sebuah program yang cukup sederhana, 212 00:12:15,060 --> 00:12:18,120 dan aku sudah benar-benar disederhanakan dengan beberapa baris untuk tujuan hari ini. 213 00:12:18,120 --> 00:12:22,680 Semua yang dilakukannya dalam baris 19 adalah mendapatkan string dari user, menyimpannya dalam variabel yang disebut s. 214 00:12:22,680 --> 00:12:28,670 Kemudian pada baris 22 dan seterusnya itu rupanya mencetak string 1 karakter per baris. 215 00:12:28,670 --> 00:12:30,730 Tapi bagaimana melakukan ini? 216 00:12:30,730 --> 00:12:33,350 Kita mendeklarasikan variabel i, pengaturan sama dengan 0, 217 00:12:33,350 --> 00:12:35,770 dan ini menjadi kebiasaan lama sekarang. 218 00:12:35,770 --> 00:12:39,270 Kami tidak melihat ini sampai Rabu, tetapi Anda dapat menyimpulkan jenis dari namanya 219 00:12:39,270 --> 00:12:44,610 strlen hanya mengembalikan apa ketika diberikan s? Panjang string. 220 00:12:44,610 --> 00:12:47,940 Jadi jika saya lulus string, kutipan-tanda kutip DAVID, 221 00:12:47,940 --> 00:12:51,810 itu mudah-mudahan akan kembali ke saya nomor 5 karena DAVID. 222 00:12:51,810 --> 00:12:55,600 Jadi itulah tujuannya dalam hidup adalah untuk mengambil string, apakah sulit dikodekan oleh Anda 223 00:12:55,600 --> 00:12:58,840 atau dalam hal ini terpasang sebagai variabel, sebagai argumen, 224 00:12:58,840 --> 00:13:01,980 dan itu angka apa yang panjang string yang. 225 00:13:01,980 --> 00:13:06,470 >> Jadi di sini sekarang kita meminjam beberapa notasi dari contoh kuis sebelumnya. 226 00:13:06,470 --> 00:13:09,390 Ini tidak ada hubungannya dengan pelampung, tidak ada hubungannya dengan kuis, 227 00:13:09,390 --> 00:13:13,100 tapi ternyata bahwa kebohongan putih kecil kami telah memberitahu Anda sejak minggu 1 228 00:13:13,100 --> 00:13:16,330 adalah bahwa string tidak benar-benar ada di C. 229 00:13:16,330 --> 00:13:20,230 Sebuah string pada akhir hari benar-benar hanya sebuah array. 230 00:13:20,230 --> 00:13:25,140 Ini sebuah array byte, sehingga byte, byte, byte, byte, dimana recall hanya 8 bit, 231 00:13:25,140 --> 00:13:28,130 sehingga sepotong memori, sepotong memori, sepotong memori, sepotong memori. 232 00:13:28,130 --> 00:13:31,210 Dan cara dengan mana string diimplementasikan 233 00:13:31,210 --> 00:13:33,070 adalah dengan menempatkan karakter pertama di sini, 234 00:13:33,070 --> 00:13:37,470 maka di sini, maka di sini, maka di sini, back to back ke belakang dalam memori komputer. 235 00:13:37,470 --> 00:13:42,160 Jadi jika Anda ingin mengeja kata seperti HELLO, Anda akan menempatkan 1 karakter H, 236 00:13:42,160 --> 00:13:48,240 maka E, maka L kemudian L, maka O - 5 karakter total - suatu tempat di RAM komputer Anda. 237 00:13:48,240 --> 00:13:52,080 Tapi detail kunci di sini adalah bahwa mereka akan kembali ke kembali ke belakang ke belakang, 238 00:13:52,080 --> 00:13:54,200 tepat di sebelah satu sama lain. 239 00:13:54,200 --> 00:13:58,820 Ketika ketika saya mengatakan s [i], apa yang dalam bahasa Inggris ini memberi saya? 240 00:14:01,240 --> 00:14:04,550 Apa s [i] mewakili dalam kasus ini? Ya. 241 00:14:04,550 --> 00:14:07,800 >> [Mahasiswa] Karakter engan dalam string. >> Tepat. Karakter engan dalam string. 242 00:14:07,800 --> 00:14:12,260 Sekarang, saya akan mulai dari 0 per saya untuk loop di sini, 243 00:14:12,260 --> 00:14:14,850 tapi itu bagus karena semuanya mulai menghitung dari 0. 244 00:14:14,850 --> 00:14:19,160 Jadi s [0] akan mewakili H huruf dalam kata seperti HELLO, 245 00:14:19,160 --> 00:14:24,530 s [1] akan mewakili surat seperti E dalam kata seperti HELLO, dan sebagainya. 246 00:14:24,530 --> 00:14:27,130 Dan apa yang kita tampaknya akan melakukan pada setiap iterasi dari loop ini 247 00:14:27,130 --> 00:14:32,780 untuk sementara menyimpan karakter engan dalam variabel yang disebut c, yang hanya char, 248 00:14:32,780 --> 00:14:35,010 dan kemudian kami mencetak c 249 00:14:35,010 --> 00:14:37,620 sehingga pada akhir hari apa program ini dilakukan adalah sebagai berikut. 250 00:14:37,620 --> 00:14:42,900 Jika saya pergi ke direktori source dan saya membuat string1 dan saya pergi ke depan dan menjalankan string1, 251 00:14:42,900 --> 00:14:51,920 dan kemudian saya ketik kata seperti HELLO, Enter, semua hal ini adalah mencetak karakter 1 pada suatu waktu. 252 00:14:51,920 --> 00:14:54,010 >> Jadi ada kesempatan untuk perbaikan di sini. 253 00:14:54,010 --> 00:14:58,150 Aku agak melakukan pekerjaan lebih, meskipun itu lebih jelas mungkin cara ini, dari yang diperlukan. 254 00:14:58,150 --> 00:15:03,270 Yang baris kode di sini bisa saya mungkin membuang sama sekali? Ya. 255 00:15:03,270 --> 00:15:08,290 Baris 24. Sejalan 24 Saya mendeklarasikan variabel c. 256 00:15:08,290 --> 00:15:14,320 Saya menyimpan karakter engan s di dalamnya, tapi kemudian saya menggunakan c disini. 257 00:15:14,320 --> 00:15:20,160 Jadi saya menggunakan c, jadi saya merasa seperti saya tidak bisa hanya membuang line 24 pergi. 258 00:15:20,160 --> 00:15:23,850 [Komentar mahasiswa terdengar] >> Tepat. 259 00:15:23,850 --> 00:15:26,240 Jadi ketika datang untuk berbicara tentang desain program, 260 00:15:26,240 --> 00:15:30,740 melihat ini penyederhanaan sedikit kode, yang hanya sebagai dibaca, 261 00:15:30,740 --> 00:15:34,680 tapi menyadari bahwa s hanya variabel, tipe data adalah array, 262 00:15:34,680 --> 00:15:38,610 sehingga s [i] hanya akan langsung kembali ke Anda karakter engan dalam string itu. 263 00:15:38,610 --> 00:15:40,620 Dan jika Anda ingin mencetaknya, itu bagus. 264 00:15:40,620 --> 00:15:43,680 Anda hanya harus menggunakan c% karena Anda tidak mencetak string, 265 00:15:43,680 --> 00:15:48,520 Anda mencetak karakter dalam sebuah string, dan ini juga memiliki efek mencetak karakter engan. 266 00:15:48,520 --> 00:15:51,390 Dan mengingat perbedaan hanya benar-benar dari minggu lalu dengan menggunakan printf 267 00:15:51,390 --> 00:15:54,220 adalah bahwa sementara dalam beberapa minggu terakhir kita akan melakukan sesuatu yang super sederhana 268 00:15:54,220 --> 00:15:58,510 seperti placeholder% s maka nama string di sini, 269 00:15:58,510 --> 00:16:01,190 sekarang kita menyelam dalam sedikit lebih dalam di bawah kap dan berkata, 270 00:16:01,190 --> 00:16:06,090 tidak mencetak string, mencetak karakter tunggal di dalamnya. 271 00:16:06,090 --> 00:16:10,570 >> Jadi kita bisa melakukan sesuatu yang sedikit berbeda di sini karena ada 1 lainnya - tidak bug 272 00:16:10,570 --> 00:16:14,090 karena program ini benar, tapi aku melakukan sesuatu yang bodoh 273 00:16:14,090 --> 00:16:16,810 yang saya sebutkan secara singkat pada hari Rabu. 274 00:16:16,810 --> 00:16:22,680 Tapi berpikir kembali, bagaimana mungkin desain program ini ditingkatkan lebih jauh? Ya. 275 00:16:22,680 --> 00:16:28,280 [Respon siswa terdengar] >> Oh, baik. 276 00:16:28,280 --> 00:16:32,120 Jadi ingat bahwa kita memperkenalkan variabel kedua disebut n terakhir kali, 277 00:16:32,120 --> 00:16:34,850 yang tampaknya bertentangan diri kita sendiri karena tujuan saya yang kedua yang lalu 278 00:16:34,850 --> 00:16:37,380 itu hanya untuk membuang variabel sebagai tidak perlu, 279 00:16:37,380 --> 00:16:40,700 tapi ingat bahwa pada hari Rabu kita benar-benar melakukan ini. 280 00:16:40,700 --> 00:16:46,170 Saya mengubah untuk loop untuk benar-benar memiliki koma di sini, maka n = strlen, 281 00:16:46,170 --> 00:16:52,120 dan kemudian di sini saya lakukan i 00:16:57,660 Apa keuntungan mendasar yang saya mencapai dengan mengubah inisialisasi saya untuk ini 283 00:16:57,660 --> 00:17:01,590 dan kondisi saya ini sekarang? >> [Respon siswa terdengar] >> Tepat. 284 00:17:01,590 --> 00:17:06,170 Aku tidak mengingat strlen lagi dan lagi dan lagi karena mengingat bagaimana untuk bekerja loop. 285 00:17:06,170 --> 00:17:08,790 Bahkan jika mereka mulai mendapatkan lebih rumit yang tampak, 286 00:17:08,790 --> 00:17:12,480 ingat bahwa hal sebelum koma pertama adalah inisialisasi, yang terjadi sekali. 287 00:17:12,480 --> 00:17:14,359 Kondisi ini, meskipun, adalah di tengah, 288 00:17:14,359 --> 00:17:17,710 dan ini akan diperiksa setiap kali Anda pergi melalui loop. 289 00:17:17,710 --> 00:17:22,420 >> Jadi itu agak bodoh untuk bertanya komputer pertanyaan yang sama lagi dan lagi - 290 00:17:22,420 --> 00:17:25,920 Apa panjang HELLO? Apa panjang HELLO? Apa panjang HELLO? - 291 00:17:25,920 --> 00:17:29,740 karena seperti yang kita akan melihat hari ini dan pada hari Rabu, ini pasti akan memakan waktu, 292 00:17:29,740 --> 00:17:34,320 dan itu bukan penggunaan yang sangat baik waktu karena untuk mengetahui panjang string 293 00:17:34,320 --> 00:17:37,030 benar-benar membutuhkan sedikit usaha. 294 00:17:37,030 --> 00:17:39,760 Ini tidak seketika, karena dalam beberapa bahasa. 295 00:17:39,760 --> 00:17:43,920 Jadi dengan mengubah ini ke n, harga saya membayar adalah apa? 296 00:17:43,920 --> 00:17:45,640 Kami melihat trade-off di sini. 297 00:17:45,640 --> 00:17:49,460 Saya bisa menghemat waktu dengan tidak mengajukan pertanyaan sialan yang sama lagi dan lagi, 298 00:17:49,460 --> 00:17:51,740 tapi itu akan saya biaya sesuatu, yang adalah apa? 299 00:17:51,740 --> 00:17:55,050 >> [Mahasiswa] Anda kehilangan sejumlah memori. >> Tepat. Ini akan saya biaya beberapa memori. 300 00:17:55,050 --> 00:17:56,670 Jadi dalam hal ini biaya saya apa? 301 00:17:56,670 --> 00:18:01,530 Sebanyak 32 bit karena n adalah hanya sebuah int, seperti yang tersirat oleh int kata di sini. 302 00:18:01,530 --> 00:18:03,300 Tapi apakah itu oke? 303 00:18:03,300 --> 00:18:05,800 Terus terang, itu mungkin apa-apa karena jika Anda berpikir tentang hal ini, 304 00:18:05,800 --> 00:18:09,030 semakin lama string adalah, semakin banyak waktu aku akan menyia-nyiakan 305 00:18:09,030 --> 00:18:11,920 karena strlen akan dipanggil lagi dan lagi dan lagi 306 00:18:11,920 --> 00:18:13,520 untuk setiap iterasi dari loop. 307 00:18:13,520 --> 00:18:18,070 Dan hari ini, saya memiliki Mac 2 gigs of RAM, hari ini 4 gigs RAM kadang-kadang. 308 00:18:18,070 --> 00:18:22,420 Saya pikir saya mampu 4 orang byte untuk benar-benar mempercepat pekerjaan. 309 00:18:22,420 --> 00:18:26,590 Tapi ini akan menjadi trade-off dan tema yang benar-benar dalam pemrograman dan ilmu komputer 310 00:18:26,590 --> 00:18:28,320 tidak pernah benar-benar mendapatkan sesuatu secara gratis. 311 00:18:28,320 --> 00:18:32,880 Jika Anda ingin meningkatkan sesuatu di sini, Anda harus membayar untuk itu di sisi lain entah bagaimana. 312 00:18:32,880 --> 00:18:35,880 Ruang terhadap waktu dalam kasus ini. 313 00:18:35,880 --> 00:18:40,700 >> Jadi ini semua mengarah ke arah sesuatu yang samar seperti ini, 314 00:18:40,700 --> 00:18:44,070 yang, karena Anda mungkin tahu sekarang, benar-benar mengatakan? 315 00:18:44,070 --> 00:18:47,420 [Respon terdengar mahasiswa] >> Ya, jadi ini adalah, Pastikan untuk minum Ovaltine Anda, 316 00:18:47,420 --> 00:18:52,490 benar-benar menggunakan algoritma yang disebut ROT13, ROT 1-3, 317 00:18:52,490 --> 00:18:55,500 yang hanya berarti memutar semua huruf 13 tempat, 318 00:18:55,500 --> 00:18:58,720 yang berarti mengambil A dan kemudian menambahkan 13 untuk itu dan pergi dot, dot, dot 319 00:18:58,720 --> 00:19:04,640 semua jalan ke surat ke-13 pergi, melakukan hal yang sama untuk B dan C dan D untuk dan sebagainya. 320 00:19:04,640 --> 00:19:10,850 Dan jadi jika kita benar-benar mengubah ini di sini menggunakan pergeseran dari 13 tempat, 321 00:19:10,850 --> 00:19:14,580 kita akan kembali ke apa yang Ralphie kecil itu, yang, Pastikan untuk minum Ovaltine Anda. 322 00:19:14,580 --> 00:19:18,160 Tapi sekarang untuk masalah set 2, dalam edisi standar minimal, 323 00:19:18,160 --> 00:19:21,680 Anda harus melakukan hal ini jenis enciphering sendiri, 324 00:19:21,680 --> 00:19:25,990 dan kita harus entah bagaimana mengambil masukan seperti ini dan mengenkripsi atau mendekripsi itu. 325 00:19:25,990 --> 00:19:29,850 >> Jadi mana yang semacam dasar menuntun kita pada kesempatan itu? 326 00:19:29,850 --> 00:19:32,650 Mari kita lihat contoh ketiga di sini. 327 00:19:32,650 --> 00:19:38,430 Pertama-tama, itu disebut ASCII. Apa ASCII merujuk kembali? 328 00:19:38,430 --> 00:19:40,460 American Standard Kode untuk Informasi Interchange, 329 00:19:40,460 --> 00:19:43,850 yang merupakan cara yang sangat panjang mengatakan apa? Apa ASCII? 330 00:19:43,850 --> 00:19:47,890 [Respon siswa terdengar] >> Apa itu? >> [Mahasiswa] Sebuah peta karakter. >> Sebuah peta karakter. 331 00:19:47,890 --> 00:19:51,390 Itu hanya memetakan nomor ke huruf karena dunia memiliki standar 332 00:19:51,390 --> 00:19:55,380 apa nomor akan mewakili apa huruf sehingga kita semua dapat menggunakan komputer 333 00:19:55,380 --> 00:19:59,340 dan program kami semua hanya kompatibel ketika datang untuk mencetak sesuatu di layar. 334 00:19:59,340 --> 00:20:04,680 Jadi ingat bahwa 65 terjadi untuk mewakili A, 97 terjadi untuk mewakili huruf kecil a. 335 00:20:04,680 --> 00:20:08,510 Dan jadi ini program sederhana di sini ASCII adalah mengambil keuntungan dari fakta bahwa - 336 00:20:08,510 --> 00:20:12,770 bahwa dunia tahu bahwa modal adalah 65 - dan itu hanya mencetak pemetaan. 337 00:20:12,770 --> 00:20:16,320 >> Jadi sebelum kita menyelam ke dalam kode ini, biarkan aku malah membuka jendela terminal. 338 00:20:16,320 --> 00:20:21,550 Biarkan aku pergi ke depan dan membuat ASCII, dan kemudian mari kita menjalankan hal ini hanya untuk merusak output. 339 00:20:21,550 --> 00:20:25,960 Dan itu hanya melakukan hal ini: grafik yang sangat besar yang hanya memberitahu saya semua berbagai kode 340 00:20:25,960 --> 00:20:27,950 untuk semua berbagai surat. 341 00:20:27,950 --> 00:20:32,100 Jadi program super sederhana, tapi aku tidak perlu kode keras yang 52 baris output: 342 00:20:32,100 --> 00:20:34,860 26 huruf, 26 huruf kecil. 343 00:20:34,860 --> 00:20:37,790 Sebaliknya, saya melakukan ini pemrograman dengan beberapa loop. 344 00:20:37,790 --> 00:20:39,720 Perhatikan apa yang saya lakukan di sini. 345 00:20:39,720 --> 00:20:44,790 Saya mengulangi dari i adalah 65 pada hingga 65 + 26 karena saya ingin mencetak 26 huruf 346 00:20:44,790 --> 00:20:49,860 dalam abjad Inggris, i + + pada setiap iterasi, dan sekarang perhatikan ini lagi. 347 00:20:49,860 --> 00:20:52,540 Ini terulangnya typecasting teman kita 348 00:20:52,540 --> 00:20:54,620 dimana Anda mengkonversi 1 tipe data yang lain 349 00:20:54,620 --> 00:20:57,480 karena apa yang saya ingin lakukan dalam program khusus ini? 350 00:20:57,480 --> 00:21:02,650 Saya ingin menghitung numerik karena itulah bagaimana saya dibesarkan menghitung - 65, 66, 67, dan sebagainya - 351 00:21:02,650 --> 00:21:04,420 tapi saya tidak ingin mencetak hanya angka. 352 00:21:04,420 --> 00:21:08,030 Saya ingin mencetak huruf diikuti dengan nomor. 353 00:21:08,030 --> 00:21:18,640 Saya ingin mencetak A: nomor, B: jumlah, tapi aku bisa melakukan ini dengan variabel yang sama persis. 354 00:21:18,640 --> 00:21:21,630 Jadi saya mencetak c% sebagai tempat untuk karakter, 355 00:21:21,630 --> 00:21:25,080 % D sebagai pengganti untuk digit atau nomor. 356 00:21:25,080 --> 00:21:27,750 Lalu apa yang harus saya pasang di bagi 2 penampung? 357 00:21:27,750 --> 00:21:33,960 Saya pasang pertama di setara karakter saya, dan kemudian saya mencetak saya sendiri. 358 00:21:33,960 --> 00:21:36,400 >> Jadi perhatikan ini juga hanya bekerja. 359 00:21:36,400 --> 00:21:39,320 Sama seperti saya dapat menyerahkan dari float ke int 360 00:21:39,320 --> 00:21:41,750 dalam rangka untuk pergi dari bilangan real ke integer, 361 00:21:41,750 --> 00:21:46,100 di sini saya bisa pergi dari int ke char, yang sedikit aneh - 362 00:21:46,100 --> 00:21:48,680 tidak cukup memetakan ke dunia nyata - tapi di komputer 363 00:21:48,680 --> 00:21:51,140 Char adalah hanya nomor di bawah kap mesin, 364 00:21:51,140 --> 00:21:53,590 jadi kita sedang pernah begitu eksplisit sini untuk komputer, mengatakan, 365 00:21:53,590 --> 00:21:58,920 printf, mencetak tidak saya sebagai 65, mencetak keluar sebagai setara numerik. 366 00:21:58,920 --> 00:22:02,110 Dan ternyata aku teknis bahkan tidak perlu ini. 367 00:22:02,110 --> 00:22:05,020 Apa yang saya lakukan beberapa saat yang lalu secara eksplisit pengecoran 368 00:22:05,020 --> 00:22:08,760 dengan menentukan apa tipe data saya ingin pergi dari dan ke. 369 00:22:08,760 --> 00:22:11,840 Tapi perhatikan bahwa saya sudah memiliki ini c% placeholder 370 00:22:11,840 --> 00:22:14,930 dan ini% lainnya c placeholder sini. 371 00:22:14,930 --> 00:22:18,880 Meskipun hal ini tidak int, komputer menyadari bahwa char, 372 00:22:18,880 --> 00:22:21,080 itu hanya sebuah int bawah tenda. 373 00:22:21,080 --> 00:22:25,100 >> Jadi jika saya benar-benar mengkompilasi ulang ini dan jalankan kembali program ASCII, 374 00:22:25,100 --> 00:22:31,210 melihat itu masih hanya bekerja karena komputer menyadari bahwa ada korespondensi ini. 375 00:22:31,210 --> 00:22:34,870 Sekarang, itu lebih penting untuk melakukan pengecoran eksplisit dalam dunia mengapung untuk ints 376 00:22:34,870 --> 00:22:37,460 karena di sana Anda benar-benar membuat keputusan yang dihitung: 377 00:22:37,460 --> 00:22:40,140 membuang semuanya setelah titik desimal. 378 00:22:40,140 --> 00:22:44,990 Berikut ada benar-benar untuk membuang karena karakter adalah hanya nomor, 379 00:22:44,990 --> 00:22:48,220 dan string hanya sebuah array karakter. 380 00:22:48,220 --> 00:22:52,530 Jadi ketika tiba saatnya untuk menerapkan beberapa enkripsi atau dekripsi, 381 00:22:52,530 --> 00:22:56,770 bagaimana mungkin kita benar-benar bisa menerjemahkan sesuatu seperti ini omong kosong, 382 00:22:56,770 --> 00:22:58,670 Pastikan untuk minum Ovaltine Anda? 383 00:22:58,670 --> 00:23:02,700 Bagaimana jika kita tahu sekarang - mari kita sebagai asumsi - bahwa kunci, 384 00:23:02,700 --> 00:23:08,010 nomor yang kita berputar semua surat-surat oleh, adalah nomor 13? 385 00:23:08,010 --> 00:23:11,800 Jadi kami pergi dari huruf B sepanjang jalan ke O pada awal kalimat, 386 00:23:11,800 --> 00:23:14,710 Pastikan untuk minum Ovaltine Anda, karena jika saya melakukan B 387 00:23:14,710 --> 00:23:19,600 dan kemudian aku pergi C, D, E, F, G, H, I, J, K, L, M, N, O, 388 00:23:19,600 --> 00:23:23,760 itu sebabnya enkripsi dari huruf B menjadi O 389 00:23:23,760 --> 00:23:26,570 karena saya hanya menambahkan 13 untuk itu. 390 00:23:26,570 --> 00:23:33,460 >> Jadi jika saya ingin mendekripsi ini, saya pada dasarnya harus mengambil O dan kemudian kurangi 13 dari itu. 391 00:23:33,460 --> 00:23:36,880 Atau, terus terang, karena ada 26 huruf dalam alfabet, ini luar biasa simetris, 392 00:23:36,880 --> 00:23:41,260 kita juga bisa hanya menambahkan 13 dan kami akan kembali ke B. surat 393 00:23:41,260 --> 00:23:44,290 Tapi bagaimana Anda pergi tentang pelaksanaan sesuatu seperti ini di Caesar 394 00:23:44,290 --> 00:23:46,600 atau benar-benar memanipulasi string pada umumnya? 395 00:23:46,600 --> 00:23:51,380 Jika huruf B adalah nomor berapa? 396 00:23:51,380 --> 00:23:55,290 Apa huruf B? Jadi 66, kan? 397 00:23:55,290 --> 00:23:59,220 Jadi jika huruf A adalah 65 dan huruf B adalah 66, 398 00:23:59,220 --> 00:24:03,940 jadi 66, semua saya harus lakukan adalah menambahkan 13 untuk itu, dan ini memberi saya 79. 399 00:24:03,940 --> 00:24:09,150 Dan jika kita pergi ke lembar contekan kecil kami, 79 memang peta ke O. 400 00:24:09,150 --> 00:24:11,290 >> Tapi ada sedikit kasus sudut sini. 401 00:24:11,290 --> 00:24:15,170 Apa, katakanlah, huruf Z? 402 00:24:15,170 --> 00:24:20,180 Jika kita melakukan 66 + 25 untuk mendapatkan semua jalan ke akhir alfabet, kita berada di 91. 403 00:24:20,180 --> 00:24:24,520 91 + 13 memberi saya 104, dan coba tebak? 404 00:24:24,520 --> 00:24:29,200 104 tidak sama huruf besar. 405 00:24:29,200 --> 00:24:31,610 Mari kita kembali ke contekan kecil di sini. 406 00:24:31,610 --> 00:24:38,070 Jika saya jalankan kembali program ini dalam pemberitahuan, alat yang 104, jika saya kembali ke jendela terminal, 407 00:24:38,070 --> 00:24:41,800 104 adalah rupanya h huruf kecil. 408 00:24:41,800 --> 00:24:46,400 Jadi kita perlu beberapa trik kunci di sini dalam rangka untuk memastikan bahwa ketika kita mulai dari Z 409 00:24:46,400 --> 00:24:50,260 dan kami menambahkan 13 untuk itu kita tidak ingin terus menempa depan untuk angka yang lebih besar dan lebih besar. 410 00:24:50,260 --> 00:24:52,600 Apa yang kita benar-benar ingin lakukan? 411 00:24:52,600 --> 00:24:54,570 Anda ingin membungkus. 412 00:24:54,570 --> 00:25:00,250 >> Jadi ternyata, karena Anda mungkin telah melihat di bagian sekarang atau di spec masalah set sendiri 413 00:25:00,250 --> 00:25:05,730 menyadari bahwa ada ini operator lain di C yang juga merupakan tanda persen, 414 00:25:05,730 --> 00:25:11,020 tapi sementara kita telah menggunakan% di sini untuk menentukan placeholder, 415 00:25:11,020 --> 00:25:15,420 tahu bahwa, terutama untuk sejumlah masalah 2, ada juga sesuatu seperti ini: 416 00:25:15,420 --> 00:25:18,990 int x = y% z. 417 00:25:18,990 --> 00:25:22,770 Mari saya hanya menyajikan ini sebagai bentuk yang sangat generik ini. 418 00:25:22,770 --> 00:25:25,580 Persen berarti apa dalam bahasa pemrograman? >> [Mahasiswa] Modulo. 419 00:25:25,580 --> 00:25:28,790 Modulo, yang merupakan cara mewah untuk mengatakan sisanya. 420 00:25:28,790 --> 00:25:31,620 Meskipun ada perbedaan sedikit dengan definisi sana, 421 00:25:31,620 --> 00:25:37,210 ini berarti membagi y oleh z tetapi tidak mengembalikan hasil pembagian tersebut; 422 00:25:37,210 --> 00:25:39,650 sebagai gantinya, kembali sisanya. 423 00:25:39,650 --> 00:25:47,390 >> Jadi jika y sebenarnya 3 dan z sebenarnya 2, 3 dibagi dengan 2 adalah 1 dengan sisa 1, 424 00:25:47,390 --> 00:25:51,550 jadi apa yang x sebenarnya sama dalam skenario ini? 1. 425 00:25:51,550 --> 00:25:54,540 Ini adalah suatu yang sederhana, tingkat rendah ide. 426 00:25:54,540 --> 00:25:56,480 Dibutuhkan sedikit waktu untuk mendapatkan pikiran Anda dibungkus sekitarnya 427 00:25:56,480 --> 00:25:58,740 karena itu mungkin sudah cukup lama sejak Anda bahkan harus peduli tentang sisa-sisa 428 00:25:58,740 --> 00:26:01,160 dan benar-benar menggunakannya untuk sesuatu tujuan, 429 00:26:01,160 --> 00:26:05,290 tetapi dalam kasus ini fakta sederhana bahwa Anda dapat pergi dari sejumlah besar seperti 3 430 00:26:05,290 --> 00:26:08,920 ke nomor yang relatif kecil seperti 2 dan kemudian membungkus efektif 431 00:26:08,920 --> 00:26:14,160 dengan menggunakan sisanya ke nilai yang lebih kecil seperti 1 akan menjadi trik yang sangat berharga 432 00:26:14,160 --> 00:26:17,690 bahwa kita bisa menggunakan kedua untuk sesuatu seperti Caesar dan Vigenere ini hal lainnya 433 00:26:17,690 --> 00:26:22,240 dalam masalah set 2, tapi ini akan menjadi trik berulang sepanjang semester. 434 00:26:22,240 --> 00:26:24,880 Ini, Ide sederhana sederhana hanya mengambil sisanya pada umumnya 435 00:26:24,880 --> 00:26:26,530 akan memungkinkan kita untuk membungkus. 436 00:26:26,530 --> 00:26:31,140 Dan seperti yang kita mulai bermain lebih dengan array, seperti yang kita mulai bermain lebih dengan memori itu sendiri, 437 00:26:31,140 --> 00:26:35,800 ini akan menjadi lebih dan lebih dari sebuah trik yang kuat. 438 00:26:35,800 --> 00:26:43,420 >> Jadi pertanyaan kemudian pada ASCII atau representasi string sebagai array? 439 00:26:43,420 --> 00:26:47,430 Dan kita akan mengambil itu 1 notch lebih lanjut. Ya. 440 00:26:47,430 --> 00:26:52,350 [Pertanyaan siswa tidak terdengar] >> Pertanyaan bagus. 441 00:26:52,350 --> 00:26:55,370 Apa artinya bila variabel memiliki tanda bintang di depannya? 442 00:26:55,370 --> 00:26:57,720 Biarkan saya menunda menjawab bahwa secara rinci, 443 00:26:57,720 --> 00:27:00,100 tapi itu mengacu pada topik yang dikenal sebagai pointer. 444 00:27:00,100 --> 00:27:03,440 Pointer harus dilakukan dengan memori, dan kami benar-benar hari 445 00:27:03,440 --> 00:27:06,330 mengambil langkah pertama menuju diskusi tersebut, 446 00:27:06,330 --> 00:27:08,600 tetapi untuk sekarang, biarkan aku berpura-pura bahwa bintang tidak ada 447 00:27:08,600 --> 00:27:15,380 dan kami akan terus memanggil string string daripada menggunakan char *, 448 00:27:15,380 --> 00:27:19,530 yang Anda mungkin pernah lihat sebelumnya dan saya akan memakai layar hanya dalam beberapa saat sebagai teaser. 449 00:27:19,530 --> 00:27:23,010 Jadi kita akan kembali ke yang jauh lebih rinci daripada banyak dari Anda mungkin akan menyukai. 450 00:27:23,010 --> 00:27:25,760 Akhirnya, tidak hari ini. Ya. 451 00:27:25,760 --> 00:27:42,810 >> [Pertanyaan siswa tidak terdengar] 452 00:27:42,810 --> 00:27:47,080 Dalam konteks apa yang Anda miliki untuk memberikan tanda untuk karakter? >> [Mahasiswa] Ya. 453 00:27:47,080 --> 00:27:52,130 Jadi secara default, bila Anda tidak menaruh +, hanya angka positif yang diasumsikan. 454 00:27:52,130 --> 00:27:55,390 Jadi jika hanya menulis nomor 1, itu adalah 1 positif. 455 00:27:55,390 --> 00:27:57,710 Jika Anda benar-benar ingin menentukan negasi dari nilai, 456 00:27:57,710 --> 00:28:01,060 Anda benar-benar harus melakukan -1 pada keyboard Anda. 457 00:28:01,060 --> 00:28:20,440 Tapi ini mungkin bukan pertanyaan Anda. >> [Respon siswa tidak terdengar] 458 00:28:20,440 --> 00:28:22,200 >> Pertanyaan bagus. Oke. 459 00:28:22,200 --> 00:28:24,970 Jadi ini harus dilakukan, saya kumpulkan, dengan beberapa jenis bug yang Anda berlari ke dalam 460 00:28:24,970 --> 00:28:27,640 karena Anda mengkonversi integer ke karakter, 461 00:28:27,640 --> 00:28:29,780 tapi entah bagaimana negatif terlibat, 462 00:28:29,780 --> 00:28:32,380 sehingga karakter baru saja keluar munged entah bagaimana. 463 00:28:32,380 --> 00:28:36,710 Jadi untuk saat ini, biarkan aku menyederhanakan sedikit sampai kita kembali ke topik semacam ini. 464 00:28:36,710 --> 00:28:39,570 Untuk saat ini, memikirkan hal-hal seperti ini - dan ini terlalu menyederhanakan. 465 00:28:39,570 --> 00:28:43,500 Tapi di dunia integer, Anda memiliki berapa banyak bit yang Anda inginkan? 466 00:28:43,500 --> 00:28:45,190 Anda memiliki 32 bit. 467 00:28:45,190 --> 00:28:49,030 Dan sejauh ini, kita telah berbicara tentang jumlah bilangan bulat karena itu Anda dapat mewakili 468 00:28:49,030 --> 00:28:52,430 kira-kira 4 miliar secara total karena Anda memiliki 32 bit, 469 00:28:52,430 --> 00:28:55,100 jadi itu 2 ke 32, sehingga kira-kira 4 miliar. 470 00:28:55,100 --> 00:28:58,810 Tapi kami melihat seminggu atau 2 lalu bahwa Anda tidak benar-benar memiliki kisaran angka 471 00:28:58,810 --> 00:29:01,240 dari 0 pada hingga 4 miliar. 472 00:29:01,240 --> 00:29:06,340 Rentang ini bukannya pergi dari sekitar 2 miliar negatif menjadi positif 2 miliar. 473 00:29:06,340 --> 00:29:10,990 Tapi ini kemudian menimbulkan pertanyaan, bagaimana Anda mewakili gagasan negatif 2 miliar 474 00:29:10,990 --> 00:29:13,260 apalagi negatif 1? 475 00:29:13,260 --> 00:29:17,960 Untuk saat ini, kita dapat menyederhanakan dan hanya mengatakan bahwa kita akan menggunakan bit paling kiri 476 00:29:17,960 --> 00:29:22,380 dari mereka 32 bit, dan jika itu adalah 1 itu adalah angka negatif, 477 00:29:22,380 --> 00:29:25,090 dan jika itu yang 0 itu adalah angka positif. 478 00:29:25,090 --> 00:29:28,570 Masalah dengan representasi yang disederhanakan dari angka negatif 479 00:29:28,570 --> 00:29:33,700 adalah bahwa jika Anda sengaja menjadi pintar dan mencoba untuk mengkonversi dari karakter ke nomor 480 00:29:33,700 --> 00:29:37,190 atau sebaliknya, tidak ada hal seperti itu sebagai karakter negatif. 481 00:29:37,190 --> 00:29:42,550 Dalam dunia ASCII, yang hanya menggunakan 8 bit, semua 8 orang materi bit, 482 00:29:42,550 --> 00:29:46,810 dan bit paling kiri tidak ada hubungannya dengan negatif. 483 00:29:46,810 --> 00:29:49,670 Dan hanya harus jelas, ketika saya mengatakan bit paling kiri, 484 00:29:49,670 --> 00:29:54,610 ingat bahwa ketika kita melakukan sedikit-terkait kami contoh di minggu pertama 485 00:29:54,610 --> 00:30:02,570 ingat bahwa kita menarik hal-hal seperti 1001101, sesuatu seperti ini. 486 00:30:02,570 --> 00:30:07,210 Ketika saya mengatakan bit paling kiri, saya hanya harfiah berarti 1 yang Anda tulis sepanjang jalan ke kiri. 487 00:30:07,210 --> 00:30:11,910 Jadi dalam dunia karakter tidak ada gagasan negatif, 488 00:30:11,910 --> 00:30:16,360 sehingga bit paling kiri sebenarnya memiliki sesuatu untuk dilakukan dengan ASCII, tidak ada hubungannya dengan negatif. 489 00:30:16,360 --> 00:30:19,390 >> Jadi kedengarannya seperti - dan keluar dari konteks sulit untuk menjawab dengan tepat - 490 00:30:19,390 --> 00:30:25,840 tapi entah bagaimana, kode Anda membingungkan bahwa bit paling kiri sebagai mewakili nilai negatif 491 00:30:25,840 --> 00:30:29,160 saat itu benar-benar bagian dari karakter yang bersangkutan. 492 00:30:29,160 --> 00:30:32,250 Dan lagi, aku menyederhanakan karena komputer benar-benar melakukan sesuatu yang sedikit lebih menarik 493 00:30:32,250 --> 00:30:37,080 dari sekedar perubahan yang agak paling kiri ke 1 untuk tanda negatif terhadap 0. 494 00:30:37,080 --> 00:30:41,270 Mereka sebaliknya, jika Anda penasaran untuk Google, menggunakan sesuatu yang biasanya disebut komplemen 2 ini, 495 00:30:41,270 --> 00:30:43,830 yang sedikit lebih canggih dari pendekatan 496 00:30:43,830 --> 00:30:45,490 tetapi gagasan pada akhirnya sama. 497 00:30:45,490 --> 00:30:50,530 >> Jadi singkatnya, itu ada hubungannya dengan fakta bahwa Anda sedang memijat nomor ke karakter 498 00:30:50,530 --> 00:30:53,750 atau sebaliknya, tetapi kode Anda tidak menyadari fakta 499 00:30:53,750 --> 00:30:56,510 bahwa 1 dari bit tersebut memiliki arti penting dalam dunia numerik. 500 00:30:56,510 --> 00:30:59,940 Itu tidak terjadi di dunia karakter. 501 00:30:59,940 --> 00:31:04,270 Tapi terdengar seperti Anda tetap, dalam hal Moot sekarang. Pertanyaan lain. 502 00:31:06,030 --> 00:31:07,110 Oke. 503 00:31:07,110 --> 00:31:11,560 Jadi sejauh ini, semua program kami telah menulis telah mengambil masukan dari pengguna mungkin 504 00:31:11,560 --> 00:31:14,330 dalam bentuk fungsi seperti GetInt, GetString, 505 00:31:14,330 --> 00:31:16,990 atau jika Anda sudah membaca berbagai buku di depan atau referensi online, 506 00:31:16,990 --> 00:31:21,390 Anda sendiri mungkin telah menggunakan fungsi seperti scanf yang, terus terang, kita gunakan di perpustakaan CS50. 507 00:31:21,390 --> 00:31:25,370 Tapi dalam seminggu atau 2, kita benar-benar akan menunjukkan kepada Anda bagaimana perpustakaan CS50 diimplementasikan 508 00:31:25,370 --> 00:31:27,890 sehingga kita dapat mengambil orang-orang roda pelatihan di luar sama sekali. 509 00:31:27,890 --> 00:31:31,340 >> Tapi ternyata ada cara lain untuk mendapatkan masukan dari pengguna. 510 00:31:31,340 --> 00:31:34,670 Pada kenyataannya, kita sendiri telah menggunakan argumen baris perintah 511 00:31:34,670 --> 00:31:36,500 selama beberapa minggu sekarang. 512 00:31:36,500 --> 00:31:41,150 Setiap kali kita telah menjalankan dentang atau kita telah menjalankan make, 513 00:31:41,150 --> 00:31:45,050 kita tidak hanya mengetik dentang, Enter, kami belum membuat mengetik, Enter. 514 00:31:45,050 --> 00:31:49,340 Apa yang telah kita biasanya ditulis setelah dentang kata pada kami jendela terminal prompt? 515 00:31:51,110 --> 00:31:52,900 [Mahasiswa] Nama file. >> Nama file, kan? 516 00:31:52,900 --> 00:31:57,560 Hello.c atau mario.c atau apa pun nama file yang relevan. 517 00:31:57,560 --> 00:32:01,910 Dan dalam arti apa yang Anda benar-benar dilakukan adalah Anda telah mempengaruhi perilaku dentang 518 00:32:01,910 --> 00:32:05,750 karena pasti orang-orang yang menulis dentang tidak tahu bahwa sedikit lama Anda 519 00:32:05,750 --> 00:32:08,890 akan menulis sebuah program yang disebut tahun mario.c kemudian. 520 00:32:08,890 --> 00:32:13,150 Jadi Anda harus entah bagaimana mempengaruhi perilaku program tersebut, 521 00:32:13,150 --> 00:32:18,140 dan bahwa dentang program yang harus ditulis sedemikian rupa sehingga dapat menerima masukan dari Anda 522 00:32:18,140 --> 00:32:23,480 dengan penambahan kata-kata pada prompt sebelum hits pengguna Enter. 523 00:32:23,480 --> 00:32:27,860 >> Jadi ternyata bahwa untuk beberapa waktu kita telah menyatakan hampir semua program kami 524 00:32:27,860 --> 00:32:32,840 untuk memulai seperti ini - int main (void) - dan kemudian kami pergi ke depan 525 00:32:32,840 --> 00:32:35,110 dan mulai menulis kode kita. 526 00:32:35,110 --> 00:32:37,910 Dan kita mungkin memiliki beberapa tajam termasuk di bagian atas file, 527 00:32:37,910 --> 00:32:40,660 tapi hampir semua program kami sejauh ini telah dimulai dengan ini 528 00:32:40,660 --> 00:32:44,200 meskipun Anda mungkin telah melihat dalam bagian, dalam buku-buku, online referensi 529 00:32:44,200 --> 00:32:46,570 bahwa hal ini sebenarnya tidak harus batal. 530 00:32:46,570 --> 00:32:55,820 Bentuk lain yang sah untuk mengambil adalah int argc dan kemudian string argv []. 531 00:32:55,820 --> 00:32:57,500 Jadi sekarang apa ini menyiratkan? 532 00:32:57,500 --> 00:33:01,320 Ternyata argc, yang merupakan konvensi manusia - Anda bisa menyebutnya foo, 533 00:33:01,320 --> 00:33:03,710 tapi itu hanya akan menjadi jauh lebih jelas bagi pembaca - 534 00:33:03,710 --> 00:33:09,330 argc saja argumen ke fungsi yang disebut utama yang mewakili apa? 535 00:33:09,330 --> 00:33:12,450 Apa argc berdiri untuk untuk mereka yang akrab? 536 00:33:12,450 --> 00:33:14,980 >> [Respon siswa terdengar] >> Ya, jumlah argumen atau jumlah argumen. 537 00:33:14,980 --> 00:33:16,510 Ini sesederhana itu. 538 00:33:16,510 --> 00:33:19,160 Berapa banyak argumen yang dilewatkan ke program ini? 539 00:33:19,160 --> 00:33:20,630 Apa artinya? 540 00:33:20,630 --> 00:33:27,090 Jika pada baris perintah saya telah menjalankan sesuatu seperti ini - dentang-mario.c - 541 00:33:27,090 --> 00:33:35,440 argc ketika saya tekan Enter akan mengambil nilai, agak membingungkan, 2. 542 00:33:35,440 --> 00:33:40,150 Jadi ternyata bahwa argc adalah jumlah argumen, 543 00:33:40,150 --> 00:33:46,280 tetapi untuk alasan historis, nama program itu sendiri termasuk dalam hitungan. 544 00:33:46,280 --> 00:33:51,950 Jadi argc adalah 2 ketika saya menulis dentang mario.c. 545 00:33:51,950 --> 00:33:54,290 Apa argv mengandung? 546 00:33:54,290 --> 00:33:57,020 Pertama-tama, argv terlihat seperti string tetapi tidak cukup 547 00:33:57,020 --> 00:33:59,310 karena pada Rabu lalu dan semua yang lebih hari ini, 548 00:33:59,310 --> 00:34:02,890 ini tanda kurung siku menunjukkan apa? Itu array. 549 00:34:02,890 --> 00:34:07,110 Tidak ada angka dalam array, dan itu harus masuk akal intuitif 550 00:34:07,110 --> 00:34:10,790 karena orang-orang yang menulis tahun lalu dentang tentu tidak tahu 551 00:34:10,790 --> 00:34:16,300 berapa banyak kata-kata orang seperti kita akan ketik pada prompt sebelum menekan Enter. 552 00:34:16,300 --> 00:34:22,280 >> Jadi dalam hal ini di sini mereka telah menyatakan fungsi utama sebagai mengambil array argumen, 553 00:34:22,280 --> 00:34:24,590 0 atau lebih argumen. 554 00:34:24,590 --> 00:34:26,460 Mereka tidak tahu sebelumnya berapa banyak ada, 555 00:34:26,460 --> 00:34:29,690 sehingga tidak sengaja ada di dalam jumlah tersebut kurung siku. 556 00:34:29,690 --> 00:34:32,750 Tapi fakta bahwa tanda kurung siku ada yang memberitahu komputer, 557 00:34:32,750 --> 00:34:34,639 mengharapkan array. 558 00:34:34,639 --> 00:34:37,489 Argv hanya singkatan notasi untuk vektor argumen. 559 00:34:37,489 --> 00:34:39,889 Vektor adalah cara mewah untuk mengatakan array, 560 00:34:39,889 --> 00:34:42,980 dan array adalah cara mewah untuk mengatakan daftar atau koleksi. 561 00:34:42,980 --> 00:34:47,360 Jadi ini hanya berarti bahwa jika Anda menulis main seperti ini 562 00:34:47,360 --> 00:34:51,100 bukannya seperti bagaimana kita telah melakukannya selama beberapa minggu, 563 00:34:51,100 --> 00:34:54,699 Program Anda sekarang memiliki kekuatan untuk menerima argumen baris perintah 564 00:34:54,699 --> 00:34:58,520 sehingga tidak ada lagi apakah Anda harus menulis mario dan kemudian tekan Enter, 565 00:34:58,520 --> 00:35:01,610 kemudian mengetikkan nomor untuk berapa banyak blok tinggi Anda ingin piramida menjadi, 566 00:35:01,610 --> 00:35:03,100 lalu tekan Enter lagi. 567 00:35:03,100 --> 00:35:07,720 Kami bahkan tidak perlu menggunakan GetString lagi atau GetInt atau GetFloat dalam hal ini. 568 00:35:07,720 --> 00:35:12,370 Kami hanya bisa berharap pengguna untuk mengetik kata-kata pada prompt itu sendiri 569 00:35:12,370 --> 00:35:16,850 seperti penulis dentang memutuskan akan menjadi program benar-benar menjengkelkan 570 00:35:16,850 --> 00:35:20,550 jika untuk mengkompilasi kode Anda Anda pertama kali dentang mengetik, tekan Enter, 571 00:35:20,550 --> 00:35:24,090 Kemudian kami berkata kepada pengguna, silakan ketik nama file yang ingin mengkompilasi, 572 00:35:24,090 --> 00:35:26,920 maka kita ketik di mario.c dan tekan Enter. 573 00:35:26,920 --> 00:35:29,850 Tapi itulah apa yang telah kami lakukan kepada para pengguna kami beberapa minggu terakhir. 574 00:35:29,850 --> 00:35:33,550 Kami menggunakan GetString dan kami menunggu sampai program ini berjalan untuk meminta mereka untuk masukan. 575 00:35:33,550 --> 00:35:36,710 Yang tidak lagi perlu terjadi. 576 00:35:36,710 --> 00:35:41,160 >> Jadi dalam contoh di sini, kita sekarang memiliki string argv, 577 00:35:41,160 --> 00:35:43,390 dan ini juga terlalu menyederhanakan, 578 00:35:43,390 --> 00:35:45,610 roda pelatihan yang akan segera datang dari. 579 00:35:45,610 --> 00:35:50,860 Ini adalah cara yang lebih tepat menulis ini deklarasi alternatif utama 580 00:35:50,860 --> 00:35:54,740 karena ternyata apa yang kita terus menelepon string yang sebenarnya memiliki bintang, 581 00:35:54,740 --> 00:35:58,440 asterisk, dalam definisi yang sebenarnya, tapi ini hanya terlihat rumit, 582 00:35:58,440 --> 00:36:02,600 itu membingungkan pada awalnya, jadi kita menyederhanakan dengan hanya menciptakan sinonim macam 583 00:36:02,600 --> 00:36:09,340 di perpustakaan CS50 bahwa peta char * untuk string kata yang lebih user-friendly. 584 00:36:09,340 --> 00:36:13,180 >> Jadi mari kita benar-benar mencoba ini kemudian. Biarkan aku pergi ke depan dan membuka gedit sini. 585 00:36:13,180 --> 00:36:17,010 Biarkan aku pergi ke depan dan membuka argv dari 1. 586 00:36:17,010 --> 00:36:21,620 Program ini ternyata mencetak argumen, tetapi dalam istilah bahasa Inggris, 587 00:36:21,620 --> 00:36:26,290 dengan melihat kode ini, apa yang dilakukan ini lebih spesifik? 588 00:36:26,290 --> 00:36:35,910 Jika saya ketik perintah a.out foo bar, apa yang akan dicetak dalam jendela hitam dan putih? 589 00:36:35,910 --> 00:36:41,260 A.out foo bar, Enter. 590 00:36:43,120 --> 00:36:48,300 Silakan. Ya. >> [Respon siswa tidak terdengar] 591 00:36:48,300 --> 00:36:52,730 Baik. Jadi a.out, baris baru, foo, baru garis, bar, baris baru. 592 00:36:52,730 --> 00:36:54,980 Mengapa ini? Kita pasti bisa mengkonfirmasi hanya dalam beberapa saat. 593 00:36:54,980 --> 00:36:56,940 Ini adalah jenis garis halus kode. 594 00:36:56,940 --> 00:36:59,560  Itu hanya mencetak baris baru hanya untuk membuat hal-hal cantik di layar. 595 00:36:59,560 --> 00:37:03,730 Ini adalah sebuah loop yang iterasi dari 0 pada hingga argc, 596 00:37:03,730 --> 00:37:07,210 dan ini incrementing pada setiap iterasi + +. 597 00:37:07,210 --> 00:37:12,270 Jadi ini sekarang mengatakan mencetak string, seperti yang tersirat oleh% s. 598 00:37:12,270 --> 00:37:16,460 Argv [i] cukup banyak ide yang sama dari contoh sebelumnya. 599 00:37:16,460 --> 00:37:19,580 Kami digunakan untuk memanggil variabel s, sekarang itu disebut, sewenang-wenang, argv. 600 00:37:19,580 --> 00:37:24,270 Ini berarti mencetak argumen engan yang diketik pada baris perintah, 601 00:37:24,270 --> 00:37:28,690 dan kemudian setelah semuanya selesai, untuk mengukur baik cetak satu lagi baris baru. 602 00:37:28,690 --> 00:37:31,600 >> Jadi mari kita lihat ini. Mari saya membuka jendela terminal. 603 00:37:31,600 --> 00:37:37,470 Biarkan saya mengkompilasi argv dari 1, dan sekarang biarkan aku menjalankan argv dari 1, Enter. Hmm. Oke. 604 00:37:37,470 --> 00:37:40,850 Mari kita menjalankan bar foo. Menarik. Baz. 605 00:37:40,850 --> 00:37:42,640 Dan jika Anda pernah bertanya-tanya mengapa saya mengetik ini, 606 00:37:42,640 --> 00:37:45,010 ini hanya sebuah konvensi komputer juga bodoh ilmu. 607 00:37:45,010 --> 00:37:48,050 Dunia seringkali hanya membutuhkan placeholder verbal untuk kata-kata. 608 00:37:48,050 --> 00:37:50,090 Jadi jika Anda ingin berbicara tentang beberapa string generik, 609 00:37:50,090 --> 00:37:53,250 ilmuwan komputer hanya cenderung untuk mengatakan foo ketika mereka membutuhkan kata acak, 610 00:37:53,250 --> 00:37:55,530 kemudian mereka mengatakan bar jika mereka membutuhkan kata acak kedua, 611 00:37:55,530 --> 00:37:59,100 kemudian mereka mengatakan baz jika mereka membutuhkan kata ketiga, maka mereka katakan qux jika mereka membutuhkan kata keempat, 612 00:37:59,100 --> 00:38:01,520 dan kemudian ada online debat besar agama seperti apa datang setelah qux, 613 00:38:01,520 --> 00:38:04,940 sehingga Anda dapat Google bahwa untuk mencari tahu apa kata sewenang-wenang lainnya harus. 614 00:38:04,940 --> 00:38:07,480 Tapi ini tidak berarti apapun telah, 615 00:38:07,480 --> 00:38:10,100 meskipun foo bar, jika Anda Google itu, yang tidak memiliki arti, 616 00:38:10,100 --> 00:38:12,780 yang merupakan bagian dari etimologi sini. 617 00:38:12,780 --> 00:38:17,550 >> Jadi semua ini lakukan kemudian mencetak 1 dari string per baris. 618 00:38:17,550 --> 00:38:19,900 Jadi jika saya sebagai gantinya, meskipun, ingin mendapatkan sedikit lebih menarik, 619 00:38:19,900 --> 00:38:22,550 anggaplah bahwa saya tidak ingin mencetak setiap string per baris; 620 00:38:22,550 --> 00:38:26,220 Saya ingin mencetak masing-masing karakter dari setiap string per baris. 621 00:38:26,220 --> 00:38:28,550 Bagaimana aku bisa melakukan itu bukan? 622 00:38:28,550 --> 00:38:33,720 Apa yang saya perlu mengubah tentang program ini jika saya ingin mencetak tidak setiap kata 623 00:38:33,720 --> 00:38:37,290 tapi saya ingin mencetak setiap huruf kata dengan huruf demi huruf, 624 00:38:37,290 --> 00:38:40,590 maka huruf berikutnya kata dengan huruf demi huruf? 625 00:38:40,590 --> 00:38:43,650 Bagaimana kita menggabungkan ide-ide sejauh ini? Ya. 626 00:38:43,650 --> 00:38:47,390 [Mahasiswa]% c. >> Baiklah. Jadi kita membutuhkan suatu tempat c%. 627 00:38:47,390 --> 00:38:50,680 Baik, karena saya tidak ingin mencetak string keseluruhan, saya ingin mencetak karakter. Apa lagi? 628 00:38:50,680 --> 00:38:54,290 >> [Respon siswa terdengar] >> menarik. 629 00:38:54,290 --> 00:38:56,860 Jadi kita perlu semacam dimensi kedua di sini sekarang 630 00:38:56,860 --> 00:39:02,300 karena memikirkan argv sebagai sebuah array, tapi itu sebuah array dari string. 631 00:39:02,300 --> 00:39:07,170 Tapi seperti dari, seperti, 15 menit yang lalu, apa string? Ini adalah array karakter. 632 00:39:07,170 --> 00:39:12,320 Jadi benar-benar, argv adalah array dari array karakter, 633 00:39:12,320 --> 00:39:14,870 array dari array karakter. 634 00:39:14,870 --> 00:39:19,170 Jadi ternyata kita dapat menggunakan notasi bracket hanya lebih persegi. Jadi mari kita lakukan ini. 635 00:39:19,170 --> 00:39:23,650 Di bagian atas lingkaran ini on line 19, aku akan iterate dari i sampai dengan argc, 636 00:39:23,650 --> 00:39:25,760 tapi kemudian aku akan melakukan hal ini: 637 00:39:25,760 --> 00:39:27,580 untuk - Saya tidak dapat menggunakan saya sekarang. 638 00:39:27,580 --> 00:39:30,300 Aku butuh variabel lain karena saya ingin iterate atas kata-kata 639 00:39:30,300 --> 00:39:32,640 tapi kemudian juga atas huruf dalam kata-kata 640 00:39:32,640 --> 00:39:37,280 jadi saya semacam memiliki sumbu vertikal dan sumbu horisontal, semacam konseptual. 641 00:39:37,280 --> 00:39:43,930 Jadi j int mendapat 0, maka saya ingin melakukan j selama j kurang dari - dan saya akan membersihkan ini dalam sedikit. 642 00:39:43,930 --> 00:39:48,410 Bagaimana cara iterate atas huruf dalam string? Kami melakukan ini beberapa saat yang lalu. 643 00:39:48,410 --> 00:39:54,670 Strlen dari argv [i]. Baik. 644 00:39:54,670 --> 00:39:57,860 Dan lagi, saya sedang membuat inefisiensi kecil di sini dengan tidak menciptakan n atau apapun, 645 00:39:57,860 --> 00:39:59,610 tapi kami akan kembali untuk itu. 646 00:39:59,610 --> 00:40:03,270 >> Jadi sekarang j + +. Sekarang aku harus indent lebih lanjut di sini. 647 00:40:03,270 --> 00:40:06,950 Apa yang harus saya sekarang ingin mencetak pada setiap iterasi? 648 00:40:06,950 --> 00:40:09,720 [Respon siswa terdengar] >> Jadi [i] akan memberikan kata. 649 00:40:09,720 --> 00:40:12,910 [I] [j], semacam matriks. 650 00:40:12,910 --> 00:40:14,810 Bagi Anda dengan matematika-y latar belakang, 651 00:40:14,810 --> 00:40:19,340 kita semacam pengindeksan lebih dalam ke dalam matriks atau array ini dari array, 652 00:40:19,340 --> 00:40:21,380 struktur 2-dimensi. 653 00:40:21,380 --> 00:40:25,070 Jadi sekarang mari kita lihat apa yang terjadi di sini. Mari saya membuka jendela terminal besar saya. 654 00:40:25,070 --> 00:40:28,170 Biarkan saya jalankan kembali membuat dari argv dari 1. 655 00:40:28,170 --> 00:40:33,090 Dan aku sudah mengacau di sini, yang merupakan pelajaran yang baik karena saya juga lupa untuk melakukan hal ini. 656 00:40:33,090 --> 00:40:37,150 Secara implisit menyatakan 'strlen' C fungsi perpustakaan dengan unsigned tipe '- 657 00:40:37,150 --> 00:40:40,360 Aku bahkan tidak tahu apa sisa berarti, tetapi saya telah melihat ini sebelumnya, 658 00:40:40,360 --> 00:40:42,000 implisit menyatakan. 659 00:40:42,000 --> 00:40:45,540 Setiap kali kita melihat kesalahan ini, apa ini biasanya menandakan? 660 00:40:45,540 --> 00:40:48,520 >> [Respon siswa terdengar] >> Saya lupa perpustakaan top up. Tapi tunggu dulu. 661 00:40:48,520 --> 00:40:51,690 Biasanya aku sudah kacau karena saya lupa perpustakaan CS50, tapi itu ada. 662 00:40:51,690 --> 00:40:54,480 Biasanya aku sudah kacau karena saya sudah lupa standar I / O. 663 00:40:54,480 --> 00:40:57,960 Dan terus terang, saya bahkan tidak perlu ini. Kami tidak menggunakan GetString hari. 664 00:40:57,960 --> 00:40:59,900 Jadi apa yang saya hilang? 665 00:40:59,900 --> 00:41:04,860 Ada perpustakaan lain yang sekarang kita perlu menggunakan string.h sesekali disebut, 666 00:41:04,860 --> 00:41:08,980 dan ini hanya satu lagi perpustakaan yang memiliki fungsi lebih yang tidak dalam standar I / O. 667 00:41:08,980 --> 00:41:11,640 >> Jadi mari kita kembali ke jendela terminal besar saya. 668 00:41:11,640 --> 00:41:16,670 Oke. Sekarang, sialan, saya kira saya salah. Saya menggunakan perpustakaan CS50. 669 00:41:16,670 --> 00:41:18,460 Jadi kita bisa memperbaiki ini di salah satu dari 2 cara. 670 00:41:18,460 --> 00:41:21,510 Kita dapat mengambil roda pelatihan di luar sekarang dan hanya melakukan hal ini, 671 00:41:21,510 --> 00:41:26,600 atau jenis mari kita menjaga dari penyederhanaan itu hanya untuk saat ini, paste kembali, 672 00:41:26,600 --> 00:41:30,180 memecahkan masalah itu, dan sekarang kembali ke jendela terminal. 673 00:41:30,180 --> 00:41:33,080 Jadi harus jelas, di perpustakaan CS50 bukan hanya fungsi, 674 00:41:33,080 --> 00:41:36,920 itu juga string kata kunci, itulah sebabnya mengapa kesalahan yang baru saja terjadi. 675 00:41:36,920 --> 00:41:43,010 >> Jadi di sini kita pergi. Saya tetap kedua masalah perpustakaan. Enter. Baik. 676 00:41:43,010 --> 00:41:49,250 Argv dari 1, foo bar, Enter. Sangat baik. 677 00:41:49,250 --> 00:41:52,830 Jadi sekarang kita memiliki setiap huruf dari setiap kata dicetak 1 per baris, 678 00:41:52,830 --> 00:41:55,290 yang tidak membuat untuk program yang sangat menarik, 679 00:41:55,290 --> 00:41:59,350 tapi perhatikan sekarang kita memiliki kemampuan tidak hanya kata-kata iterasi 680 00:41:59,350 --> 00:42:04,090 tetapi juga atas huruf individu dalam kata-kata, yang terdengar sangat akrab 681 00:42:04,090 --> 00:42:10,330 bahkan yang paling sederhana dari aplikasi seperti huruf berebut dalam string seperti ini. 682 00:42:10,330 --> 00:42:12,410 Mari kita pergi ke depan dan mengambil 5 menit istirahat kami di sini. 683 00:42:12,410 --> 00:42:14,410 Dan ketika kita kembali, kita akan mulai berbicara tentang efisiensi 684 00:42:14,410 --> 00:42:17,670 dengan mana kita dapat melakukan hal-hal yang lebih baik. 685 00:42:19,370 --> 00:42:21,900 >> Baiklah. Kami kembali. 686 00:42:21,900 --> 00:42:26,970 Berkat salah satu dari kami yang TF memainkan banyak bananagrams, 687 00:42:26,970 --> 00:42:30,000 kita benar-benar memiliki sejumlah besar karakter dengan kami di sini hari ini 688 00:42:30,000 --> 00:42:32,520 fisik menjelma dengan potongan-potongan plastik kecil, 689 00:42:32,520 --> 00:42:36,910 dan biarkan aku mengusulkan bahwa batu putih kosong di sini merupakan RAM di komputer saya - 690 00:42:36,910 --> 00:42:39,790 laptop, desktop, apa pun - dan ada tampak seperti banyak dari itu 691 00:42:39,790 --> 00:42:44,090 karena jika kita mulai memotong RAM ini menjadi kecil byte ukuran potongan, 692 00:42:44,090 --> 00:42:48,970 mari kita sewenang-wenang mengatakan bahwa sesuatu yang ukuran dan kabur mewakili - 693 00:42:48,970 --> 00:42:52,430 di sana kita pergi, dan mari kita zoom out sedikit di sini - 694 00:42:52,430 --> 00:42:56,120 katakanlah sesuatu yang merupakan ukuran satu byte. 695 00:42:56,120 --> 00:43:00,400 Jadi kita memang bisa muat sejumlah byte atau karakter dalam memori ini, 696 00:43:00,400 --> 00:43:02,860 seperti yang disarankan oleh ukuran relatif di sini. 697 00:43:02,860 --> 00:43:06,780 >> Jadi misalkan sekarang bahwa tujuannya adalah untuk mengalokasikan memori untuk string. 698 00:43:06,780 --> 00:43:08,680 Bagaimana hal ini benar-benar bekerja? 699 00:43:08,680 --> 00:43:11,380 Dalam program kami telah menulis, kita biasanya telah menggunakan GetString, 700 00:43:11,380 --> 00:43:16,300 tapi sekarang, jelas, ada saluran ini lain melalui mana kita bisa mendapatkan input pengguna dalam argv 701 00:43:16,300 --> 00:43:18,190 melalui argumen baris perintah. 702 00:43:18,190 --> 00:43:20,580 Tapi apa yang sebenarnya terjadi di bawah tenda? 703 00:43:20,580 --> 00:43:24,920 Ternyata jika kita sebut - mari kita gulir kembali ke GetString - yang GetString fungsi 704 00:43:24,920 --> 00:43:28,190 di perpustakaan CS50, pengguna diminta untuk string, 705 00:43:28,190 --> 00:43:30,780 diketik oleh pengguna dalam beberapa kata - sebut saja HELLO. 706 00:43:30,780 --> 00:43:35,410 Dan kita telah mengatakan selama beberapa minggu bahwa nilai pengembalian GetString 707 00:43:35,410 --> 00:43:37,750 sebenarnya string, seperti kata HELLO. 708 00:43:37,750 --> 00:43:39,660 >> Tapi apa yang benar-benar melakukan GetString? 709 00:43:39,660 --> 00:43:45,230 Sebagai jenis pengguna dalam HELLO, Enter, GetString adalah mencari tahu, 710 00:43:45,230 --> 00:43:47,930 oke, berapa banyak karakter ini? Ini adalah H-E-L-L-O. 711 00:43:47,930 --> 00:43:52,500 Sehingga perlu mengalokasikan, perlu meminta sistem operasi - Linux dalam hal ini - 712 00:43:52,500 --> 00:43:55,410 untuk setidaknya 5 byte untuk menyimpan HELLO. 713 00:43:55,410 --> 00:43:59,570 Dan apa yang kemudian mulai lakukan setelah itu akan kembali mereka 5 byte dari sistem operasi 714 00:43:59,570 --> 00:44:04,120 adalah untuk lay out HELLO kembali untuk kembali ke kembali ke belakang. 715 00:44:04,120 --> 00:44:11,070 Dan jadi apa yang sebenarnya kembali dari GetString adalah sepotong data yang terlihat seperti ini. 716 00:44:11,070 --> 00:44:16,850 Tapi ini agak tidak akurat karena ternyata bahwa itu tidak sesederhana 717 00:44:16,850 --> 00:44:20,310 sebagai hanya menyimpan HELLO dalam memori komputer 718 00:44:20,310 --> 00:44:24,140 karena menganggap bahwa program saya bahwa saya sedang menulis di C kemudian memanggil GetString lagi, 719 00:44:24,140 --> 00:44:28,210 dan kata berikutnya pengguna jenis dalam adalah BYE, BYE. 720 00:44:28,210 --> 00:44:31,300 Yah, saya harus cocok dengan kata BYE di suatu tempat di memori. 721 00:44:31,300 --> 00:44:33,790 Saya tidak bisa mengalahkan HELLO. 722 00:44:33,790 --> 00:44:37,320 Misalnya, saya tidak ingin komputer untuk hanya mulai Timpa seperti ini 723 00:44:37,320 --> 00:44:41,400 kata aslinya karena saya masih mungkin menggunakan kata HELLO dalam variabel 724 00:44:41,400 --> 00:44:43,070 tempat lain dalam program saya. 725 00:44:43,070 --> 00:44:45,900 >> Jadi B-Y-E harus berakhir di tempat lain dalam memori. 726 00:44:45,900 --> 00:44:50,460 Tapi konvensi biasanya adalah bahwa string berikutnya Anda mengalokasikan 727 00:44:50,460 --> 00:44:54,940 mungkin, tapi tidak selalu, akan berakhir pada lokasi memori yang tersedia berikutnya. 728 00:44:54,940 --> 00:44:57,370 Dan jika saya belum meminta sistem operasi untuk memori setiap 729 00:44:57,370 --> 00:45:01,380 sejak terakhir kali aku menelepon GetString, kemungkinan adalah BYE kata 730 00:45:01,380 --> 00:45:05,790 akan berakhir tepat setelah kata HELLO dalam memori. 731 00:45:05,790 --> 00:45:10,550 Tapi pada titik ini Anda mungkin dapat melihat di mana masalah potensial muncul. 732 00:45:10,550 --> 00:45:13,310 Karena selanjutnya potongan memori, byte berikutnya yang hanya gratis - 733 00:45:13,310 --> 00:45:18,230 membersihkan batu tulis putih - dalam memori komputer berada tepat di sebelah HELLO, 734 00:45:18,230 --> 00:45:23,670 rasanya seperti string pertama saya meminta mungkin tiba-tiba sekarang berubah 735 00:45:23,670 --> 00:45:26,410 karena saya sudah dasarnya berubah ke HELLOBYE 736 00:45:26,410 --> 00:45:31,310 bukannya entah bagaimana demarcing awal BYE dan akhir HELLO. 737 00:45:31,310 --> 00:45:33,920 >> Jadi ternyata bahwa apa yang sebenarnya terjadi di bawah tenda, 738 00:45:33,920 --> 00:45:37,570 yang mungkin telah dilirik dalam referensi online atau bagian atau buku 739 00:45:37,570 --> 00:45:41,780 atau tidak sama sekali dulu adalah bahwa sebenarnya ada demarkasi yang disengaja 740 00:45:41,780 --> 00:45:45,890 antara kata-kata dalam memori komputer. 741 00:45:45,890 --> 00:45:52,480 Dan pada kenyataannya, dalam hal ini di sini, bukan hanya menempatkan BYE sebelah kanan HELLO, 742 00:45:52,480 --> 00:45:58,610 sebagai gantinya, komputer menempatkan karakter khusus, karakter null khusus, sehingga untuk berbicara, 743 00:45:58,610 --> 00:46:03,050 yang diwakili dengan tanda garis miring terbalik dengan 0. 744 00:46:03,050 --> 00:46:06,700 Jadi cerita panjang pendek, ingat bahwa karakter terwakili dalam ASCII. 745 00:46:06,700 --> 00:46:09,680 ASCII hanya pemetaan antara angka dan huruf, 746 00:46:09,680 --> 00:46:13,870 dan sebagian besar surat-surat dimulai sekitar 65 untuk modal A, 747 00:46:13,870 --> 00:46:19,780 tapi ternyata Anda pasti dapat mewakili angka 0 sebagai integer atau dalam biner, 748 00:46:19,780 --> 00:46:22,690 dan ternyata dunia memutuskan lama, lama, "Kau tahu apa?" 749 00:46:22,690 --> 00:46:27,550 "Mari kita cadangan angka 0 tidak mewakili setiap karakter pada keyboard - 750 00:46:27,550 --> 00:46:30,810 "Ada surat, tidak ada angka, tidak ada tanda baca. 0 adalah khusus." 751 00:46:30,810 --> 00:46:35,830 "Ini akan menjadi karakter null khusus, dan kita akan menuliskannya sebagai \ 0." 752 00:46:35,830 --> 00:46:41,170 Perbedaan yang jika kita hanya menulis 0, 0 adalah karakter. 753 00:46:41,170 --> 00:46:45,700 Ingat bahwa ada kode ASCII untuk 0, untuk 1, untuk 2, selama 3 754 00:46:45,700 --> 00:46:50,570 karena 0 karakter berbeda dari angka 0. 755 00:46:50,570 --> 00:46:54,270 Dan Anda dapat melihat bahwa jika Anda melihat kembali dari minggu 1 ketika kami pertama kali berbicara tentang ASCII, 756 00:46:54,270 --> 00:46:59,130 0 dan 1 dan 2 dan 3 semua jalan sampai dengan 9 memiliki kode ASCII sendiri. 757 00:46:59,130 --> 00:47:02,300 Mereka tidak, kebetulan, 0 sampai 9. Mereka sangat berbeda. 758 00:47:02,300 --> 00:47:08,770 Jadi 0 hanya berarti "Aku istimewa," dan \ 0 berarti, secara harfiah, "Aku bukan karakter 0." 759 00:47:08,770 --> 00:47:11,360 "Saya ini nilai khusus, karakter null." 760 00:47:11,360 --> 00:47:16,930 Jadi saya benar-benar membutuhkan salah satu dari ini karena saya tidak bisa membuat kesalahan yang sama dua kali. 761 00:47:16,930 --> 00:47:21,550 >> Jadi setelah BYE kata kita juga akan membutuhkan salah satu dari karakter null. 762 00:47:21,550 --> 00:47:27,090 Biarkan aku ambil pena saya di sini dan biarkan aku dengan cepat menarik lain \ 0 763 00:47:27,090 --> 00:47:30,480 sehingga setelah saya telah meminta sistem operasi untuk 2 string 764 00:47:30,480 --> 00:47:33,270 melalui GetString diikuti dengan panggilan lain untuk GetString, 765 00:47:33,270 --> 00:47:35,640 ini adalah apa yang benar-benar di memori. 766 00:47:35,640 --> 00:47:39,900 Jadi ketika aku kembali string, aku benar-benar mendapatkan kembali bahwa, 767 00:47:39,900 --> 00:47:43,450 dan ketika saya mendapatkan string berikutnya, aku benar-benar kembali itu. 768 00:47:43,450 --> 00:47:47,910 Jadi ini menimbulkan pertanyaan, strlen, pertama-tama, apa yang harus itu kembali? 769 00:47:47,910 --> 00:47:54,650 Ketika saya sebut strlen pada string s dan s adalah kata HELLO bahwa pengguna mengetik, 770 00:47:54,650 --> 00:47:57,800 apa yang kita jelas mengatakan panjang HELLO adalah beberapa menit yang lalu? 771 00:47:57,800 --> 00:48:01,290 Itu 5, kan? H-E-L-L-O. Dan itu tentu saja bagaimana strlen bekerja. 772 00:48:01,290 --> 00:48:05,670 Ia mengembalikan apa yang manusia normal akan mengharapkan panjang string untuk menjadi. 773 00:48:05,670 --> 00:48:11,030 Namun dalam kenyataannya, seberapa besar adalah array karakter yang menyimpan halo? 774 00:48:11,030 --> 00:48:12,770 Ini sebenarnya 6. 775 00:48:12,770 --> 00:48:15,740 Jadi strlen tidak menyebutkan fakta bahwa untuk Anda. 776 00:48:15,740 --> 00:48:20,300 Tapi di balik kap mesin komputer memang menggunakan 6 byte untuk menyimpan kata 5 huruf, 777 00:48:20,300 --> 00:48:22,380 dan ini benar tidak peduli berapa lama kata tersebut. 778 00:48:22,380 --> 00:48:26,470 Ada selalu akan menjadi karakter null khusus yang berakhir pada akhir dari string 779 00:48:26,470 --> 00:48:28,800 untuk Demarc panjang total. 780 00:48:28,800 --> 00:48:33,430 >> Jadi jika Anda sekarang orang menerapkan strlen 20, 30 tahun yang lalu, 781 00:48:33,430 --> 00:48:35,520 bagaimana Anda pergi tentang pelaksanaan strlen itu sendiri? 782 00:48:35,520 --> 00:48:39,980 Kami mengambil begitu saja bahwa itu ada, seperti kita mengambil begitu saja bahwa printf ada, 783 00:48:39,980 --> 00:48:42,850 tetapi jika HELLO adalah kata dalam pertanyaan 784 00:48:42,850 --> 00:48:45,220 dan apa yang saya miliki dalam memori adalah sesuatu yang terlihat seperti ini, 785 00:48:45,220 --> 00:48:48,130 jika Anda harus reimplement strlen karena Anda diminta untuk 786 00:48:48,130 --> 00:48:50,260 atau karena, terus terang, Anda tidak tahu strlen ada - 787 00:48:50,260 --> 00:48:54,280 Anda harus menggulung satu ini pada Anda sendiri - bagaimana mungkin Anda menerapkan strlen 788 00:48:54,280 --> 00:48:57,760 ketika diberi sesuatu yang tampak seperti ini? 789 00:48:57,760 --> 00:49:02,750 Sekarang kita tahu string adalah array, kita dapat iterate atas masing-masing karakter individu 790 00:49:02,750 --> 00:49:06,320 menggunakan sesuatu seperti - Mari kita mencoba untuk melakukan hal ini dengan cepat. 791 00:49:06,320 --> 00:49:12,060 >> Biarkan aku pergi ke alat. Mari saya membuat file baru, strlen.c. 792 00:49:12,060 --> 00:49:19,260 Biarkan aku pergi ke depan sekarang dan jangan termasuk stdio.h sehingga kita memiliki akses ke printf. 793 00:49:19,260 --> 00:49:25,820 Biarkan aku melakukan int main (void). Oh. Saya hanya akan melakukan ini pada saya sendiri untuk saat itu. [Terkekeh] 794 00:49:25,820 --> 00:49:28,300 Terima kasih. 795 00:49:28,300 --> 00:49:31,000 Ini adalah apa yang saya lakukan. Baiklah. 796 00:49:31,000 --> 00:49:34,820 Jadi sebelum aku menyalakan layar, saya mengetik semua itu. 797 00:49:34,820 --> 00:49:37,550 Dan sekarang apa yang akan saya lakukan adalah sebagai berikut: 798 00:49:37,550 --> 00:49:40,360 printf ("Beri aku string:") 799 00:49:40,360 --> 00:49:42,700 Itu hanya petunjuk berbulu. 800 00:49:42,700 --> 00:49:45,700 Sekarang biarkan aku melakukan GetString = string s. 801 00:49:45,700 --> 00:49:47,260 Saya sudah perlu untuk melakukan perubahan sekarang. 802 00:49:47,260 --> 00:49:52,740 Saya menggunakan perpustakaan CS50 tiba-tiba, jadi biarkan aku pergi ke depan dan ketik cs50.h. 803 00:49:52,740 --> 00:50:00,720 Dan sekarang mari kita lakukan ini: printf ("Panjang adalah:% d, strlen [s] - 804 00:50:00,720 --> 00:50:03,540 dan aku belum selesai. Apa lagi yang harus saya tambahkan ke program ini? 805 00:50:03,540 --> 00:50:05,740 >> [Mahasiswa] string.h. >> String.h. 806 00:50:05,740 --> 00:50:10,800 Jadi untuk saat ini, kami menggunakan strlen, jadi mari kita pastikan compiler tahu di mana itu, 807 00:50:10,800 --> 00:50:12,390 sehingga kewarasan sedikit memeriksa. 808 00:50:12,390 --> 00:50:16,400 Saya mendapatkan string di baris 8, dan sejalan 9 Saya mencetak panjangnya dengan d%. 809 00:50:16,400 --> 00:50:19,400 Jadi mari kita pergi ke depan dan membuka ini. 810 00:50:19,400 --> 00:50:23,380 Kami telah membuat strlen - mengkompilasi baik-baik saja - 811 00:50:23,380 --> 00:50:30,120 strlen - biarkan aku memperbesar - Masukkan, H-E-L-L-O, Enter. Panjangnya 5. 812 00:50:30,120 --> 00:50:32,730 >> Oke, jadi strlen tampaknya bekerja, tapi dunia tahu itu. 813 00:50:32,730 --> 00:50:37,310 Jadi mari kita sekarang menerapkan strlen diri sebagai berikut. 814 00:50:37,310 --> 00:50:39,490 Biarkan aku mengambil perpustakaan ini pergi. 815 00:50:39,490 --> 00:50:42,590 Kita tidak lagi memiliki akses ke string.h karena saya bahkan tidak tahu itu ada. 816 00:50:42,590 --> 00:50:45,970 Tapi itu tidak apa-apa karena saya bisa menerapkan strlen sendiri 817 00:50:45,970 --> 00:50:50,200 dan memilikinya mengambil string disebut masukan, 818 00:50:50,200 --> 00:50:53,830 dan sekarang aku perlu untuk mengetahui panjang string ini. 819 00:50:53,830 --> 00:50:55,880 Jadi bagaimana saya bisa melakukan ini? 820 00:50:55,880 --> 00:51:00,190 Bagaimana jika saya lakukan - mari kita lihat bagaimana melakukan ini - Apa yang Anda ingin lakukan? 821 00:51:00,190 --> 00:51:04,130 >> [Respon siswa terdengar] >> Oke. 822 00:51:04,130 --> 00:51:05,970 Jadi kita bisa melakukan ini dalam banyak cara. Biarkan saya mencoba untuk mengambil pendekatan ini. 823 00:51:05,970 --> 00:51:10,220 Biarkan saya memberi diriku variabel int i, jadi saya mulai pada 0. 824 00:51:10,220 --> 00:51:19,380 Dan biarkan aku mengatakan ini: sementara input [i] tidak sama dengan apa? \ 0. 825 00:51:19,380 --> 00:51:23,480 Jadi ternyata, seperti halnya dengan semua karakter saat menulis secara harfiah dalam sebuah program, 826 00:51:23,480 --> 00:51:25,940 Anda harus menggunakan tanda kutip tunggal, bukan tanda kutip ganda. 827 00:51:25,940 --> 00:51:29,250 Jadi jika saya sedang menulis surat, saya akan melakukan itu, huruf b, saya akan melakukannya. 828 00:51:29,250 --> 00:51:33,440 Hal ini, sebaliknya, akan menjadi string, bukan karakter individu. 829 00:51:33,440 --> 00:51:38,470 >> Jadi saya ingin \ 0 harfiah. Apa yang ingin saya lakukan dalam lingkaran ini? 830 00:51:38,470 --> 00:51:42,650 Sebenarnya, aku butuh variabel lain, sehingga panjang int mendapat 0. 831 00:51:42,650 --> 00:51:46,190 Bahkan jika Anda tidak yakin mengapa kami mulai dengan cara kita lakukan, 832 00:51:46,190 --> 00:51:50,110 sekarang kita akan jalan ini, apa yang ingin saya lakukan pada baris 9? 833 00:51:50,110 --> 00:51:55,820 panjang + + dan kemudian turun di sini on line 10, panjang kembali. 834 00:51:55,820 --> 00:51:58,370 Jadi bagaimana strlen diimplementasikan? 835 00:51:58,370 --> 00:52:00,550 Ini benar-benar diterapkan mungkin seperti ini. 836 00:52:00,550 --> 00:52:03,470 Mungkin orang yang digunakan untuk loop, mungkin lakukan sementara loop - siapa tahu? 837 00:52:03,470 --> 00:52:05,940 Kami benar-benar harus melihat di bawah kap pada kode sumber yang sebenarnya 838 00:52:05,940 --> 00:52:08,520 dalam beberapa file disebut string.c mungkin. 839 00:52:08,520 --> 00:52:10,480 >> Tapi di sini mari kita berpikir tentang apa yang saya lakukan. 840 00:52:10,480 --> 00:52:13,640 Saya mendeklarasikan sebuah variabel yang disebut i, pengaturan sama dengan 0. 841 00:52:13,640 --> 00:52:17,520 Saya kemudian menyatakan lagi panjang yang disebut variabel, pengaturan sama dengan 0. 842 00:52:17,520 --> 00:52:25,440 Lalu saya katakan sementara karakter i dalam input tidak sama dengan karakter null khusus, \ 0, 843 00:52:25,440 --> 00:52:27,070 kenaikan panjang. 844 00:52:27,070 --> 00:52:32,550 Tapi begitu karakter engan ini karakter khusus, apa yang terjadi pada loop? 845 00:52:32,550 --> 00:52:36,540 Ini sirkuit pendek. Ini berhenti, yang berarti kita kemudian langsung kembali panjang. 846 00:52:36,540 --> 00:52:40,740 >> Jadi jika saya tidak mengacaukan, mari kita pergi ke depan dan kembali ke jendela terminal saya. 847 00:52:40,740 --> 00:52:43,550 Biarkan aku mengkompilasi ulang. Dan aku mengacaukan. 848 00:52:43,550 --> 00:52:46,320 Kompatibel ulang fungsi perpustakaan strlen. 849 00:52:46,320 --> 00:52:48,650 Jadi saya mencoba untuk mendapatkan terlalu pintar untuk kebaikan saya sendiri di sini. 850 00:52:48,650 --> 00:52:51,610 Compiler benar-benar tahu bahwa ada fungsi yang disebut strlen 851 00:52:51,610 --> 00:52:55,290 meskipun kita belum termasuk perpustakaan. Itu baik-baik saja. Apapun. 852 00:52:55,290 --> 00:52:58,230 Kita hanya akan bekerja sama kemudian. Mari kita mengubah nama panjang ini. 853 00:52:58,230 --> 00:53:04,110 Biarkan saya mengubah penggunaan untuk panjang di sini, dan ini akan membuat dentang bahagia. 854 00:53:04,110 --> 00:53:08,900 Sebagai samping, karena beberapa fungsi-fungsi ini begitu darn umum - 855 00:53:08,900 --> 00:53:12,390 strlen, prinf - mereka benar-benar memiliki semacam status khusus. 856 00:53:12,390 --> 00:53:15,310 Dan sehingga dentang hanya tahu sedikit sesuatu yang istimewa tentang mereka. 857 00:53:15,310 --> 00:53:18,760 Itu tidak selalu terjadi dengan fungsi yang paling, jadi itu sebabnya kami mendapat berteriak. 858 00:53:18,760 --> 00:53:21,350 >> Mari saya coba lagi. Untungnya, itu bekerja waktu itu. 859 00:53:21,350 --> 00:53:23,560 Jadi sekarang biarkan aku berjalan sendiri strlen program. 860 00:53:23,560 --> 00:53:29,740 Beri aku string: H-E-L-L-O, Enter. Dan aku telah mengacaukan. 861 00:53:29,740 --> 00:53:34,750 Kenapa? >> [Respon siswa terdengar] >> Tepat. 862 00:53:34,750 --> 00:53:39,180 Jadi aku punya diriku di sini infinite loop yang sangat tampan 863 00:53:39,180 --> 00:53:42,270 karena meskipun aku incrementing panjang pada setiap iterasi, 864 00:53:42,270 --> 00:53:47,860 apa yang saya jelas tidak melakukan? Aku tidak incrementing i. Oke. Mudah memperbaiki. Ya? 865 00:53:47,860 --> 00:53:52,430 Oke. Tidak Sekarang kita akan bertabrakan dengan beberapa kesalahan umum lain di mana saya harus tanda kurung. 866 00:53:52,430 --> 00:53:54,430 Dan terus terang, kode ini mulai terlihat jelek, 867 00:53:54,430 --> 00:53:56,460 jadi kita akan mengambil bacokan di membersihkan hal ini dalam sekejap. 868 00:53:56,460 --> 00:53:58,810 Tapi sekarang aku incrementing baik panjang dan i. 869 00:53:58,810 --> 00:54:02,630 Terus terang, saya sudah melihat kesempatan untuk perbaikan di sini, tapi kami akan kembali untuk itu. 870 00:54:02,630 --> 00:54:05,270 >> Jadi sekarang mari kita pastikan kita setidaknya membuat kemajuan. 871 00:54:05,270 --> 00:54:08,320 Hal ini terjadi pada beberapa dari Anda, dan saya tidak menyebutkan ini di muka. 872 00:54:08,320 --> 00:54:12,420 Bila Anda memiliki kemalangan skenario seperti ini, bagaimana Anda memperbaiki ini 873 00:54:12,420 --> 00:54:15,130 singkat restart alat atau komputer Anda atau menutup jendela? 874 00:54:15,130 --> 00:54:16,860 Ini sebenarnya mudah. 875 00:54:16,860 --> 00:54:21,680 Kontrol C akan mengirimkan wortel kecil simbol C, dan itu hanya berakhir sebagian besar program. 876 00:54:21,680 --> 00:54:25,990 Jika Anda memiliki loop tak terbatas benar-benar buruk yang mencetak kali hal-hal tak terhingga banyaknya, 877 00:54:25,990 --> 00:54:29,960 kadang-kadang Anda mungkin harus menekan Control C seribu kali untuk membuatnya benar-benar mendengarnya. 878 00:54:29,960 --> 00:54:33,910 Jadi hanya sadar sekarang karena aku tidak mencetak apa-apa, itu cukup mudah. 879 00:54:33,910 --> 00:54:37,970 Dan secara teknis, sekali sudah cukup, tapi saya tidak sabar dan saya biasanya memukul bahwa berkali-kali. 880 00:54:37,970 --> 00:54:43,400 >> Jadi strlen. Beri aku string: HELLO. Apakah akan bekerja saat ini? 881 00:54:44,580 --> 00:54:47,490 Oke. Kesalahan umum lainnya. Harus mengkompilasi ulang. 882 00:54:47,490 --> 00:54:50,430 Itu memang disengaja, yang satu. Baiklah. 883 00:54:50,430 --> 00:54:54,260 Jadi strlen, H-E-L-L-O, Enter. Sangat baik. 884 00:54:54,260 --> 00:54:55,910 Jadi kita sekarang memiliki strlen sampai 5. 885 00:54:55,910 --> 00:54:58,100 Jadi kita telah benar-benar reimplemented roda itu. 886 00:54:58,100 --> 00:55:02,080 Jadi sekarang mari kita membersihkan ini karena ini tidak membuat saya terkesan 887 00:55:02,080 --> 00:55:04,080 dengan desain kode saya. 888 00:55:04,080 --> 00:55:07,200 Apa yang bisa kita jelas menghilangkan dalam program ini untuk membersihkan ini? 889 00:55:07,200 --> 00:55:11,840 [Respon siswa terdengar] >> Ya. Secara harfiah, kita memperlakukan saya dan panjang identik. 890 00:55:11,840 --> 00:55:16,440 Jadi kenapa tidak kita hanya mendapatkan cerdas dan mengatakan sementara panjang? 891 00:55:16,440 --> 00:55:20,450 Sebaliknya, mari kita sebut saja panjang untuk memulai dengan, menginisialisasi ke 0 892 00:55:20,450 --> 00:55:23,340 karena secara default string memiliki panjang tidak sampai kita mengetahui apa itu. 893 00:55:23,340 --> 00:55:26,160 >> Sekarang kita melakukan ini, dan sekarang ini adalah program yang cukup elegan. 894 00:55:26,160 --> 00:55:28,660 Satu variabel. Aku membersihkan itu, diperketat itu. 895 00:55:28,660 --> 00:55:31,980 Jadi sekarang mari kita kembali ke jendela terminal saya. Mari kita pergi ke depan dan menjalankan ini. 896 00:55:31,980 --> 00:55:35,670 Membuat strlen. Terlihat bagus. Jalankan strlen lagi, Enter. 897 00:55:35,670 --> 00:55:40,680 Beri aku string: HELLO, Enter. Dan tampaknya akan bekerja sebagai 5. 898 00:55:40,680 --> 00:55:45,580 Sekarang, harus jelas, jika saya tidak menulis, misalnya, HELLO di 1 string 899 00:55:45,580 --> 00:55:48,840 dan kemudian BYE di lain, kita pasti bisa memiliki beberapa kata. 900 00:55:48,840 --> 00:55:53,150 Jika ekspresi saya benar-benar ingin mengetik tidak HELLO tetapi, misalnya, 901 00:55:53,150 --> 00:55:58,920 HELLO WORLD, perhatikan bahwa apa yang kita tidak akan memiliki situasi ini di sini, kan? 902 00:55:58,920 --> 00:56:00,580 Itu akan menunjukkan bahwa itu 2 string. 903 00:56:00,580 --> 00:56:06,060 Anda pasti dapat memiliki karakter spasi bar, jadi jika kita benar-benar mengetik dalam frase lagi 904 00:56:06,060 --> 00:56:08,390 seperti DUNIA HELLO, apa yang kita benar-benar harus di memori 905 00:56:08,390 --> 00:56:12,730 terlihat sedikit sesuatu seperti itu ada. 906 00:56:12,730 --> 00:56:18,910 >> Baiklah. Setiap pertanyaan kemudian mengenai representasi sini string? 907 00:56:18,910 --> 00:56:20,450 Tidak ada? Baiklah. 908 00:56:20,450 --> 00:56:25,130 Jadi saya katakan sebelumnya bahwa menelepon strlen lagi dan lagi sengaja seperti itu 909 00:56:25,130 --> 00:56:28,070 mungkin bukan ide terbaik karena Anda akan melakukan seluruh banyak pekerjaan 910 00:56:28,070 --> 00:56:30,280 lagi dan lagi dan lagi. 911 00:56:30,280 --> 00:56:36,150 Memang, apa jenis pekerjaan yang diperlukan untuk mencari tahu panjang string, rupanya? 912 00:56:36,150 --> 00:56:40,720 Anda harus mulai dari awal dan kemudian lihat, lihat, lihat, lihat, lihat 913 00:56:40,720 --> 00:56:44,930 sampai akhirnya Anda melihat bahwa karakter khusus, di mana titik, ah, sekarang saya tahu panjang. 914 00:56:44,930 --> 00:56:48,040 Jadi sebelumnya ketika kami telah strlen dipanggil lagi dan lagi dan lagi, 915 00:56:48,040 --> 00:56:52,080 alasan saya mengusulkan bahwa agak bodoh adalah karena lagi-lagi, string yang terlihat seperti itu. 916 00:56:52,080 --> 00:56:54,880 Ini tidak akan berubah setiap kali Anda iterate melalui lingkaran tertentu, 917 00:56:54,880 --> 00:56:56,890 sehingga Anda melakukan pekerjaan yang tidak perlu. 918 00:56:56,890 --> 00:57:00,620 Pada saat yang sama Anda harus tahu, sebagai samping, bahwa kompiler seperti dentang hari ini 919 00:57:00,620 --> 00:57:02,530 telah dikembangkan selama bertahun-tahun, 920 00:57:02,530 --> 00:57:05,690 dan compiler penulis, programmer, cukup pintar. 921 00:57:05,690 --> 00:57:10,170 Dan sehingga ternyata bahwa dentang dan lainnya kompiler benar-benar dapat mengetahui bahwa, 922 00:57:10,170 --> 00:57:13,650 oke, ya, Anda menulis strlen dalam kondisi Anda, 923 00:57:13,650 --> 00:57:17,520 yang secara teknis berarti bahwa kita akan menyebutnya lagi dan lagi dan lagi. 924 00:57:17,520 --> 00:57:21,880 Tapi compiler pintar benar-benar dapat mengoptimalkan keputusan semacam pengguna miskin 925 00:57:21,880 --> 00:57:23,870 keluar dari kode Anda untuk memperbaiki hal. 926 00:57:23,870 --> 00:57:27,360 >> Jadi jangan hanya menyadari bahwa kadang-kadang compiler lebih pintar dari kita 927 00:57:27,360 --> 00:57:29,210 dan akan jenis menyembunyikan kesalahan kita sendiri. 928 00:57:29,210 --> 00:57:31,620 Namun yang pasti ketika datang ke set masalah dan sejenisnya, 929 00:57:31,620 --> 00:57:35,340 jangan berpikir tentang keputusan-keputusan desain fundamental salah 930 00:57:35,340 --> 00:57:38,110 berpotensi untuk alasan sederhana bahwa kita akan melakukan pekerjaan jauh lebih 931 00:57:38,110 --> 00:57:41,330 daripada kita benar-benar harus lakukan. Tapi berapa banyak lebih banyak pekerjaan? 932 00:57:41,330 --> 00:57:44,960 Dalam kasus WORLD HELLO, mari kita mulai untuk menggeneralisasi ukuran masalah ini. 933 00:57:44,960 --> 00:57:48,100 Apa panjang masalah atau ukuran masalah 934 00:57:48,100 --> 00:57:50,770 ketika kata pengguna mengetik adalah HALO? 935 00:57:50,770 --> 00:57:53,790 Ini rupanya 5, mungkin 6. Plus atau minus 1. Apapun. 936 00:57:53,790 --> 00:57:55,680 Hal ini begitu dekat kita hanya akan menyebutnya 5. 937 00:57:55,680 --> 00:58:00,480 >> Jadi apa ukuran masalah di sini ketika mencoba untuk mencari tahu panjang HELLO? 938 00:58:00,480 --> 00:58:06,790 Ini 1, 2, 3, 4, 5, 6 dan mungkin untuk karakter terakhir, tetapi mari kita generalisasi bahwa sebagai n. 939 00:58:06,790 --> 00:58:10,300 Jadi n, hanya n variabel, adalah apa yang ilmuwan komputer biasanya akan menggunakan 940 00:58:10,300 --> 00:58:13,890 untuk menggambarkan ukuran masalah, dan masalah di tangan adalah berapa lama HELLO? 941 00:58:13,890 --> 00:58:17,050 Berapa banyak waktu yang strlen ambil? 942 00:58:17,050 --> 00:58:21,010 Dibutuhkan pada urutan langkah n, di mana setiap langkah berarti melihat karakter, 943 00:58:21,010 --> 00:58:23,350 melihat karakter, melihat karakter. 944 00:58:23,350 --> 00:58:26,850 Dan kami memiliki diskusi ini beberapa waktu lalu, jumlah operasi membutuhkan sesuatu. 945 00:58:26,850 --> 00:58:29,910 Hari pertama kelas kami semua canggung berdiri, 946 00:58:29,910 --> 00:58:32,060 dan kemudian semua orang mulai berpasangan off dengan satu sama lain 947 00:58:32,060 --> 00:58:35,990 dalam rangka untuk benar-benar menghitung idealnya berapa banyak orang berada di dalam ruangan. 948 00:58:35,990 --> 00:58:39,860 Dan kami juga melakukan hal lain dimana jika saya bukan melakukannya dengan cara lama sekolah 949 00:58:39,860 --> 00:58:44,800 hanya mulai 1, 2, 3, 4, 5, 6, dan sebagainya, 950 00:58:44,800 --> 00:58:49,360 itu juga, ukuran masalah yang berukuran n. Ada orang-orang n di dalam ruangan. 951 00:58:49,360 --> 00:58:52,010 Tapi aku bisa mempercepat itu, kan? Gaya sekolah dasar saya bisa mulai menghitung dalam 2s. 952 00:58:52,010 --> 00:58:55,560 2, 4, 6, 8, 10, 12. Dan yang terasa begitu jauh lebih cepat, dan memang itu. 953 00:58:55,560 --> 00:59:01,720 Itu benar-benar dua kali lebih cepat, tapi sekali lagi, jika lain 400 orang masuk ke ruangan ini 954 00:59:01,720 --> 00:59:08,250 sekaligus, algoritma tersebut akan memakan waktu 400 atau mungkin 200 langkah. 955 00:59:08,250 --> 00:59:13,310 >> Tapi sebaliknya, jika kita benar-benar mendapatkan cerdas dan kita malah memiliki semua Anda menghitung sendiri, 956 00:59:13,310 --> 00:59:15,280 mengingat bagaimana algoritma yang bekerja. 957 00:59:15,280 --> 00:59:17,110 Anda semua berdiri. Biarkan aku cepat-maju untuk ini. 958 00:59:17,110 --> 00:59:20,430 Anda semua berdiri, Anda berpasangan, maka setengah dari Anda duduk, 959 00:59:20,430 --> 00:59:22,510 setengah dari Anda duduk, setengah dari Anda duduk, 960 00:59:22,510 --> 00:59:27,350 dan pada setiap iterasi dari loop dari minggu 0, kita dibelah dua masalah yang dihadapi 961 00:59:27,350 --> 00:59:30,040 dan pergi ke n / 2, maka n / 4, maka n / 8. 962 00:59:30,040 --> 00:59:35,350 Dan implikasi dari itu adalah bahwa jika lain 400 orang berjalan ke ruang, bukan masalah besar, 963 00:59:35,350 --> 00:59:40,120 itu akan membawa kita putaran 1 lagi, tidak 400 putaran lagi, tidak 200 putaran lagi. 964 00:59:40,120 --> 00:59:43,640 Dan jadi cerita kami mengatakan beberapa waktu lalu harus melakukan sedikit sesuatu dengan ini. 965 00:59:43,640 --> 00:59:47,750 Ini garis merah di sini adalah linear, itu lurus, dan itu diberi label sebagai n 966 00:59:47,750 --> 00:59:50,250 karena sebagai ukuran masalah tumbuh, 967 00:59:50,250 --> 00:59:54,690 jika algoritma atau program dengan mana Anda memecahkan dibutuhkan langkah n, 968 00:59:54,690 --> 00:59:58,620 kita bisa plot sebagai garis lurus di mana dibutuhkan lebih banyak waktu semakin besar ukuran masalah. 969 00:59:58,620 --> 01:00:03,280 Dan pendekatan twosies, menghitung 2, 4, 6, 8, masih garis lurus, hanya sedikit lebih baik. 970 01:00:03,280 --> 01:00:08,440 Butuh waktu sedikit kurang, sehingga garis kuning di bawah titik garis merah untuk titik. 971 01:00:08,440 --> 01:00:12,580 >> Tetapi bahkan lebih baik adalah ini grail suci dari apa yang kita disebut waktu logaritmik 972 01:00:12,580 --> 01:00:14,830 di mana bahkan jika lagi kita dua kali lipat jumlah orang di dalam ruangan, 973 01:00:14,830 --> 01:00:18,240 kami dua kali ukuran buku telepon dari hari pertama kelas, 974 01:00:18,240 --> 01:00:22,310 bukan masalah besar, dibutuhkan 1 halaman air mata lebih banyak, membutuhkan waktu 1 duduk lebih turun 975 01:00:22,310 --> 01:00:25,550 dalam rangka memecahkan masalah yang dua kali lebih besar. 976 01:00:25,550 --> 01:00:27,460 Dan jadi pembicaraan kita sekarang bisa mulai memiliki yang 977 01:00:27,460 --> 01:00:30,380 bagaimana kita benar-benar memecahkan masalah secara efisien 978 01:00:30,380 --> 01:00:32,510 jika kita mempertimbangkan masalah sederhana seperti ini? 979 01:00:32,510 --> 01:00:36,210 Misalkan kita memiliki 8 pintu belakang yang beberapa angka, 980 01:00:36,210 --> 01:00:39,720 dan masing-masing angka ini tidak diurutkan dengan cara apapun, 981 01:00:39,720 --> 01:00:42,830 mereka hanya acak bilangan bulat di balik pintu, 982 01:00:42,830 --> 01:00:47,290 dan kami bertanya bagaimana Anda pergi tentang menemukan nomor - siapa tahu - 983 01:00:47,290 --> 01:00:50,250 7 balik pintu? 984 01:00:50,250 --> 01:00:53,400 Apa yang akan Anda, manusia, dilakukan dalam rangka untuk menemukan saya nomor 7 985 01:00:53,400 --> 01:00:56,810 kalau lagi masing-masing adalah pintu dan untuk melihat nilai Anda harus membuka pintu? 986 01:00:56,810 --> 01:00:59,650 Apa yang akan Anda algoritma menjadi mungkin? 987 01:00:59,650 --> 01:01:05,310 >> [Respon siswa terdengar] >> Jadi, mulailah dengan kiri dan membuka pintu, membuka pintu, membuka pintu. 988 01:01:05,310 --> 01:01:08,570 Dan dalam kasus terburuk, berapa lama itu akan membawa kita untuk menemukan nomor 7? 989 01:01:08,570 --> 01:01:12,800 Dan lagi, mereka tidak diurutkan, sehingga tidak semudah, juga, aku akan membuka pintu 7. 990 01:01:12,800 --> 01:01:15,240 Ini bisa membawa kita, maksimal, 8 langkah. 991 01:01:15,240 --> 01:01:19,940 Dalam kasus terburuk, 7 adalah secara acak pada akhir dari garis pintu, 992 01:01:19,940 --> 01:01:22,090 jadi kita mungkin harus mencoba semua pintu n. 993 01:01:22,090 --> 01:01:24,440 Jadi sekali lagi di sini, tampaknya kita memiliki algoritma linear. 994 01:01:24,440 --> 01:01:27,030 Bahkan, kami melakukan ini hanya beberapa tahun yang lalu. 995 01:01:27,030 --> 01:01:29,910 Salah satu pendahulu Anda ditantang dengan tepat ini 996 01:01:29,910 --> 01:01:32,050 di mana kita tidak memiliki versi digital, kita malah memiliki papan tulis 997 01:01:32,050 --> 01:01:33,780 dengan beberapa lembar kertas di atasnya. 998 01:01:33,780 --> 01:01:36,940 Dan apa yang saya pikir akan saya lakukan adalah mengambil cepat melihat kembali bagaimana ini pergi, 999 01:01:36,940 --> 01:01:40,760 salah satu peluang yang paling canggung dan mungkin terbaik di atas panggung 1000 01:01:40,760 --> 01:01:42,530 untuk memiliki demonstrasi di sini di Sanders. 1001 01:01:42,530 --> 01:01:44,000 Kami memiliki 2 baris nomor. 1002 01:01:44,000 --> 01:01:47,280 Kita hanya akan melihat apa yang terjadi di sini dengan Sean untuk bagian paling atas dari baris. 1003 01:01:47,280 --> 01:01:49,660 Kecuali ada yang pernah lagi sukarelawan di CS50, 1004 01:01:49,660 --> 01:01:52,010 kita memiliki berkat Sean untuk menjaga ini pada kamera, 1005 01:01:52,010 --> 01:01:54,670 jadi dia tahu bahwa ratusan orang telah menonton ini sekarang selama bertahun-tahun. 1006 01:01:54,670 --> 01:01:59,500 Tapi Sean melakukan pekerjaan yang menakjubkan - atau dia - pada kami benar-benar menemukan nomor tertentu?. 1007 01:01:59,500 --> 01:02:04,570 >> Jadi mari kita lihat bagaimana ia memecahkan algoritma ini sehingga kita akan melanjutkan pembicaraan ini tak lama 1008 01:02:04,570 --> 01:02:08,300 bagaimana kita menemukan hal-hal efisien. 1009 01:02:08,300 --> 01:02:12,300 [Malan video] Saya telah tersembunyi di balik pintu-pintu nomor 7, 1010 01:02:12,300 --> 01:02:16,710 tapi terselip di beberapa pintu serta yang lain non-negatif angka, 1011 01:02:16,710 --> 01:02:19,980 dan tujuan Anda adalah untuk memikirkan ini baris atas angka hanya sebagai array 1012 01:02:19,980 --> 01:02:22,920 atau hanya urutan potongan kertas dengan angka di belakang mereka, 1013 01:02:22,920 --> 01:02:26,960 dan tujuan Anda adalah, hanya menggunakan array atas sini, menemukan saya nomor 7. 1014 01:02:26,960 --> 01:02:30,800 Dan kita kemudian akan kritik bagaimana Anda pergi tentang melakukannya. >> Baiklah. 1015 01:02:30,800 --> 01:02:33,880 [Malan] Temukan kami nomor 7, silakan. 1016 01:02:36,210 --> 01:02:38,350 [Tertawa] 1017 01:02:41,610 --> 01:02:44,460 [Malan] No [tertawa] 1018 01:02:45,760 --> 01:02:58,080 5, 19, 13, [tertawa]. Ini bukan pertanyaan jebakan. 1019 01:03:00,560 --> 01:03:02,390 1. 1020 01:03:04,560 --> 01:03:06,910 [Tertawa] 1021 01:03:06,910 --> 01:03:10,760 Pada titik ini skor Anda tidak begitu baik, sehingga Anda mungkin juga terus. [Tertawa] 1022 01:03:12,490 --> 01:03:14,070 3. 1023 01:03:17,340 --> 01:03:23,480 Pergilah. Terus terang, saya tidak bisa membantu tetapi bertanya-tanya apa yang Anda bahkan berpikir tentang. [Tertawa] 1024 01:03:25,010 --> 01:03:28,870 Hanya baris atas, sehingga Anda punya 3 kiri. Jadi menemukan saya 7. 1025 01:03:28,870 --> 01:03:45,360 [Siswa bergumam] 1026 01:03:46,270 --> 01:03:49,870 [Malan] 17. 1027 01:03:49,870 --> 01:03:55,460 [Siswa bergumam] 1028 01:03:56,920 --> 01:04:01,550 [Malan] 7! [Tepuk tangan] 1029 01:04:01,550 --> 01:04:06,080 >> Jadi pada hari Rabu kita akan menyelam ke dalam ini dan algoritma yang lebih canggih untuk menemukan hal-hal. 1030 01:04:06,080 --> 01:04:10,200 Untuk saat ini kami akan meninggalkan Anda dengan Sean dan melihat Anda pada hari Rabu. 1031 01:04:11,280 --> 01:04:13,000 [CS50.TV]