1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Mari kita bicara tentang array. 2 00:00:09,360 --> 00:00:12,780 Jadi mengapa kita pernah ingin menggunakan array? 3 00:00:12,780 --> 00:00:17,210 Nah katakanlah Anda memiliki program yang perlu untuk menyimpan 5 ID mahasiswa. 4 00:00:17,210 --> 00:00:21,270 Ini mungkin tampak masuk akal untuk memiliki 5 variabel yang terpisah. 5 00:00:21,270 --> 00:00:24,240 Untuk alasan kita akan melihat dalam sedikit, kita akan mulai menghitung dari 0. 6 00:00:24,240 --> 00:00:30,700 Variabel kita akan memiliki akan id0 int, int id1, dan sebagainya. 7 00:00:30,700 --> 00:00:34,870 Setiap logika kita ingin tampil pada ID siswa akan perlu disalin dan disisipkan 8 00:00:34,870 --> 00:00:36,870 untuk masing-masing ID mahasiswa. 9 00:00:36,870 --> 00:00:39,710 Jika kita ingin memeriksa siswa kebetulan berada di CS50, 10 00:00:39,710 --> 00:00:43,910 pertama-tama kita harus memeriksa apakah id0 mewakili siswa dalam kursus. 11 00:00:43,910 --> 00:00:48,070 Kemudian untuk melakukan hal yang sama untuk mahasiswa berikutnya, kita harus copy dan paste kode untuk id0 12 00:00:48,070 --> 00:00:54,430 dan mengganti semua kejadian dari id0 dengan id1 dan seterusnya untuk id2,, 3, dan 4. 13 00:00:54,430 --> 00:00:57,560 >> Segera setelah Anda mendengar bahwa kita perlu copy dan paste, 14 00:00:57,560 --> 00:01:00,440 Anda harus mulai berpikir bahwa ada solusi yang lebih baik. 15 00:01:00,440 --> 00:01:05,360 Sekarang bagaimana jika Anda menyadari bahwa Anda tidak perlu 5 ID mahasiswa melainkan 7? 16 00:01:05,360 --> 00:01:09,570 Anda perlu kembali ke kode sumber Anda dan menambahkan id5, suatu id6, 17 00:01:09,570 --> 00:01:14,260 dan copy dan paste logika untuk memeriksa apakah ID milik kelas untuk 2 ID baru. 18 00:01:14,260 --> 00:01:19,600 Tidak ada yang menghubungkan semua ID bersama-sama, sehingga tidak ada cara untuk meminta 19 00:01:19,600 --> 00:01:22,040 program untuk melakukan hal ini untuk ID 0 sampai 6. 20 00:01:22,040 --> 00:01:26,120 Nah sekarang Anda sadar bahwa Anda memiliki 100 ID mahasiswa. 21 00:01:26,120 --> 00:01:30,770 Ini mulai tampak kurang dari ideal untuk perlu secara terpisah menyatakan masing-masing ID, 22 00:01:30,770 --> 00:01:33,760 dan copy dan paste logika bagi mereka ID baru. 23 00:01:33,760 --> 00:01:38,380 Tapi mungkin kami bertekad, dan kami melakukannya untuk semua 100 siswa. 24 00:01:38,380 --> 00:01:42,240 Tapi bagaimana jika Anda tidak tahu berapa banyak siswa sebenarnya ada? 25 00:01:42,240 --> 00:01:47,320 Hanya ada beberapa siswa n dan program Anda harus meminta pengguna apa yang n. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Ini tidak akan bekerja dengan baik. 27 00:01:50,250 --> 00:01:53,820 Program Anda hanya bekerja untuk beberapa nomor konstan siswa. 28 00:01:53,820 --> 00:01:57,520 >> Memecahkan semua masalah ini adalah keindahan array. 29 00:01:57,520 --> 00:01:59,930 Jadi apa array? 30 00:01:59,930 --> 00:02:04,480 Dalam beberapa bahasa pemrograman sebuah tipe array mungkin bisa melakukan sedikit lebih, 31 00:02:04,480 --> 00:02:09,960 tetapi di sini kita akan fokus pada struktur data array dasar seperti yang Anda akan melihat dalam C. 32 00:02:09,960 --> 00:02:14,030 Array adalah hanya blok besar memori. Itu saja. 33 00:02:14,030 --> 00:02:17,770 Ketika kita mengatakan kita memiliki sebuah array dari 10 bilangan bulat, itu hanya berarti kita memiliki beberapa blok 34 00:02:17,770 --> 00:02:20,740 memori yang cukup besar untuk menampung 10 bilangan bulat terpisah. 35 00:02:29,930 --> 00:02:33,410 Dengan asumsi bahwa integer adalah 4 byte, ini berarti bahwa sebuah array dari 10 bilangan bulat 36 00:02:33,410 --> 00:02:37,180 adalah blok kontinu dari 40 byte memori. 37 00:02:42,660 --> 00:02:46,280 Bahkan ketika Anda menggunakan array multidimensi, yang kita tidak akan masuk ke sini, 38 00:02:46,280 --> 00:02:49,200 itu masih hanya blok besar memori. 39 00:02:49,200 --> 00:02:51,840 Notasi multidimensi hanya kenyamanan. 40 00:02:51,840 --> 00:02:55,640 Jika Anda memiliki 3 oleh 3 array multidimensi bilangan bulat, 41 00:02:55,640 --> 00:03:00,650 maka program Anda akan benar-benar hanya memperlakukan ini sebagai blok besar dari 36 byte. 42 00:03:00,650 --> 00:03:05,460 Jumlah total bilangan bulat adalah 3 kali 3, dan integer masing-masing membutuhkan 4 byte. 43 00:03:05,460 --> 00:03:07,750 >> Mari kita lihat contoh dasar. 44 00:03:07,750 --> 00:03:10,660 Kita bisa lihat di sini 2 cara yang berbeda dari array menyatakan. 45 00:03:15,660 --> 00:03:18,580 Kita harus komentar 1 dari mereka keluar untuk program untuk mengkompilasi 46 00:03:18,580 --> 00:03:20,900 karena kita mendeklarasikan x dua kali. 47 00:03:20,900 --> 00:03:25,140 Kita akan melihat beberapa perbedaan antara 2 jenis deklarasi dalam sedikit. 48 00:03:25,140 --> 00:03:28,560 Kedua garis mendeklarasikan array berukuran N, 49 00:03:28,560 --> 00:03:30,740 di mana kita telah # define N sebagai 10. 50 00:03:30,740 --> 00:03:34,460 Kita bisa dengan mudah meminta pengguna untuk bilangan bulat positif 51 00:03:34,460 --> 00:03:37,250 dan digunakan yang bulat sebagai jumlah elemen dalam array kita. 52 00:03:37,250 --> 00:03:41,960 Seperti contoh mahasiswa ID kami sebelumnya, ini adalah jenis seperti menyatakan 10 benar-benar terpisah 53 00:03:41,960 --> 00:03:49,000 imajiner variabel, x0, x1, x2, dan seterusnya sampai xN-1. 54 00:03:57,270 --> 00:04:00,840 Mengabaikan garis di mana kita mendeklarasikan array, perhatikan tanda kurung siku utuh 55 00:04:00,840 --> 00:04:02,090 dalam untuk loop. 56 00:04:02,090 --> 00:04:09,660 Ketika kita menulis sesuatu seperti x [3], yang saya hanya akan membaca sebagai x braket 3, 57 00:04:09,660 --> 00:04:13,090 Anda dapat berpikir seperti meminta x3 imajiner. 58 00:04:13,090 --> 00:04:17,519 Perhatikan dibandingkan dengan array berukuran N, ini berarti bahwa jumlah dalam kurung, 59 00:04:17,519 --> 00:04:22,630 yang kita sebut indeks, bisa apa saja dari 0 sampai N-1, 60 00:04:22,630 --> 00:04:25,660 yang merupakan total indeks N. 61 00:04:25,660 --> 00:04:28,260 >> Untuk berpikir tentang bagaimana hal ini benar-benar bekerja 62 00:04:28,260 --> 00:04:31,260 ingat bahwa array adalah sebuah blok besar memori. 63 00:04:31,260 --> 00:04:37,460 Dengan asumsi bahwa integer adalah 4 byte, x seluruh array adalah blok 40 byte memori. 64 00:04:37,460 --> 00:04:41,360 Jadi x0 mengacu pada 4 byte pertama dari blok. 65 00:04:45,810 --> 00:04:49,230 X [1] mengacu pada 4 byte berikutnya dan seterusnya. 66 00:04:49,230 --> 00:04:53,760 Ini berarti bahwa awal x adalah semua program yang pernah perlu untuk melacak. 67 00:04:55,660 --> 00:04:59,840 Jika Anda ingin menggunakan x [400], maka program tahu bahwa ini setara 68 00:04:59,840 --> 00:05:03,460 hanya 1.600 byte setelah dimulainya x. 69 00:05:03,460 --> 00:05:08,780 Dimana kita mendapatkan 1.600 byte dari? Hanya saja 400 kali 4 byte per integer. 70 00:05:08,780 --> 00:05:13,170 >> Sebelum pindah, itu sangat penting untuk menyadari bahwa dalam C 71 00:05:13,170 --> 00:05:17,080 tidak ada penegakan indeks yang kita gunakan dalam array. 72 00:05:17,080 --> 00:05:23,180 Blok besar kami hanya 10 bilangan bulat panjang, tapi tidak akan berteriak pada kita jika kita menulis x [20] 73 00:05:23,180 --> 00:05:26,060 atau bahkan x [-5]. 74 00:05:26,060 --> 00:05:28,240 Indeks bahkan tidak harus nomor. 75 00:05:28,240 --> 00:05:30,630 Hal ini dapat berupa ekspresi sewenang-wenang. 76 00:05:30,630 --> 00:05:34,800 Dalam program ini kita menggunakan variabel i dari untuk loop untuk indeks ke array. 77 00:05:34,800 --> 00:05:40,340 Ini adalah pola yang sangat umum, perulangan dari i = 0 sampai panjang array, 78 00:05:40,340 --> 00:05:43,350 dan kemudian menggunakan i sebagai indeks untuk array. 79 00:05:43,350 --> 00:05:46,160 Dengan cara ini Anda secara efektif loop atas seluruh array, 80 00:05:46,160 --> 00:05:50,600 dan Anda dapat menetapkan untuk setiap tempat dalam array atau menggunakannya untuk beberapa perhitungan. 81 00:05:50,600 --> 00:05:53,920 >> Pada bagian pertama untuk loop, i dimulai dari 0, 82 00:05:53,920 --> 00:05:58,680 dan sehingga akan menetapkan ke tempat 0 dalam array, nilai 0 kali 2. 83 00:05:58,680 --> 00:06:04,370 Kemudian saya bertahap, dan kami menetapkan tempat pertama dalam array nilai 1 kali 2. 84 00:06:04,370 --> 00:06:10,170 Kemudian saya akan menambahkan lagi dan seterusnya sampai kita tetapkan untuk posisi N-1 dalam array 85 00:06:10,170 --> 00:06:13,370 nilai N-1 kali 2. 86 00:06:13,370 --> 00:06:17,810 Jadi kami telah membuat sebuah array dengan 10 angka pertama bahkan. 87 00:06:17,810 --> 00:06:21,970 Mungkin evens akan menjadi nama yang sedikit lebih baik untuk variabel daripada x, 88 00:06:21,970 --> 00:06:24,760 tapi itu akan memberikan hal-hal pergi. 89 00:06:24,760 --> 00:06:30,210 Yang kedua untuk loop kemudian hanya mencetak nilai-nilai yang kita telah disimpan dalam array. 90 00:06:30,210 --> 00:06:33,600 >> Mari kita coba jalankan program dengan kedua jenis deklarasi array 91 00:06:33,600 --> 00:06:36,330 dan lihatlah output dari program. 92 00:06:51,450 --> 00:06:57,020 Sejauh yang bisa kita lihat, program berperilaku dengan cara yang sama untuk kedua jenis deklarasi. 93 00:06:57,020 --> 00:07:02,230 Mari kita juga kita lihat apa yang terjadi jika kita mengubah loop pertama untuk tidak berhenti di N 94 00:07:02,230 --> 00:07:05,040 melainkan katakanlah 10.000. 95 00:07:05,040 --> 00:07:07,430 Jalan di luar akhir array. 96 00:07:14,700 --> 00:07:17,210 Ups. Mungkin Anda pernah melihat ini sebelumnya. 97 00:07:17,210 --> 00:07:20,440 Sebuah kesalahan segmentasi berarti program Anda telah jatuh. 98 00:07:20,440 --> 00:07:24,430 Anda mulai melihat ini ketika Anda menyentuh daerah memori Anda tidak boleh menyentuh. 99 00:07:24,430 --> 00:07:27,870 Di sini kita menyentuh 10.000 tempat di luar awal x, 100 00:07:27,870 --> 00:07:31,920 yang jelas adalah tempat di memori kita tidak harus menyentuh. 101 00:07:31,920 --> 00:07:37,690 Jadi sebagian besar dari kita mungkin tidak akan sengaja menempatkan 10.000 bukannya N, 102 00:07:37,690 --> 00:07:42,930 tapi bagaimana jika kita melakukan sesuatu yang lebih halus seperti mengatakan menulis kurang dari atau sama dengan N 103 00:07:42,930 --> 00:07:46,830 dalam kondisi loop sebagai lawan kurang dari N. 104 00:07:46,830 --> 00:07:50,100 Ingat bahwa array hanya memiliki indeks dari 0 sampai N-1, 105 00:07:50,100 --> 00:07:54,510 yang berarti bahwa indeks N berada di luar akhir array. 106 00:07:54,510 --> 00:07:58,050 Program ini tidak mungkin kecelakaan dalam kasus ini, tapi masih error. 107 00:07:58,050 --> 00:08:01,950 Bahkan, kesalahan ini sangat umum bahwa ia memiliki nama itu sendiri, 108 00:08:01,950 --> 00:08:03,970 off oleh 1 kesalahan. 109 00:08:03,970 --> 00:08:05,970 >> Itu saja untuk dasar-dasar. 110 00:08:05,970 --> 00:08:09,960 Jadi apa perbedaan utama antara 2 jenis deklarasi array? 111 00:08:09,960 --> 00:08:13,960 Salah satu perbedaan adalah di mana blok besar memori berjalan. 112 00:08:13,960 --> 00:08:17,660 Dalam deklarasi pertama, yang saya akan menelepon jenis braket-array, 113 00:08:17,660 --> 00:08:20,300 meskipun hal ini tidak berarti nama konvensional, 114 00:08:20,300 --> 00:08:22,480 ia akan pergi pada stack. 115 00:08:22,480 --> 00:08:27,450 Sedangkan di kedua, yang saya akan menelepon jenis pointer-array, ia akan pergi di heap. 116 00:08:27,450 --> 00:08:32,480 Ini berarti bahwa ketika kembali fungsi, array braket otomatis akan deallocated, 117 00:08:32,480 --> 00:08:36,419 sedangkan saat Anda Eksplisit harus panggilan gratis pada array pointer 118 00:08:36,419 --> 00:08:38,010 atau Anda memiliki kebocoran memori. 119 00:08:38,010 --> 00:08:42,750 Selain itu, array braket sebenarnya tidak variabel. 120 00:08:42,750 --> 00:08:45,490 Hal ini penting. Ini hanya simbol. 121 00:08:45,490 --> 00:08:49,160 Anda dapat menganggapnya sebagai konstanta yang compiler memilih untuk Anda. 122 00:08:49,160 --> 00:08:52,970 Ini berarti bahwa kita tidak dapat melakukan sesuatu seperti x + + dengan tipe braket, 123 00:08:52,970 --> 00:08:56,240 meskipun ini adalah hal yang sah dengan tipe pointer. 124 00:08:56,240 --> 00:08:58,270 >> Jenis pointer adalah variabel. 125 00:08:58,270 --> 00:09:01,510 Untuk jenis pointer, kita memiliki 2 blok yang terpisah dari memori. 126 00:09:01,510 --> 00:09:06,060 Variabel x itu sendiri disimpan dalam stack dan hanya pointer tunggal, 127 00:09:06,060 --> 00:09:08,620 tapi blok besar memori disimpan di heap. 128 00:09:08,620 --> 00:09:11,010 Variabel x pada stack hanya menyimpan alamat 129 00:09:11,010 --> 00:09:14,010 dari blok besar memori di heap. 130 00:09:14,010 --> 00:09:17,370 Salah satu implikasi dari hal ini adalah dengan ukuran operator. 131 00:09:17,370 --> 00:09:22,480 Jika Anda bertanya untuk ukuran array braket, itu akan memberi Anda ukuran blok besar memori, 132 00:09:22,480 --> 00:09:24,620 sesuatu seperti 40 byte, 133 00:09:24,620 --> 00:09:26,920 tetapi jika Anda meminta untuk ukuran jenis pointer array, 134 00:09:26,920 --> 00:09:32,740 akan memberikan ukuran variabel x itu sendiri, yang pada alat mungkin hanya 4 byte. 135 00:09:32,740 --> 00:09:36,530 Menggunakan jenis pointer-array, adalah mustahil untuk secara langsung meminta 136 00:09:36,530 --> 00:09:38,530 ukuran blok besar memori. 137 00:09:38,530 --> 00:09:42,530 Hal ini biasanya tidak banyak pembatasan karena kita sangat jarang ingin ukuran 138 00:09:42,530 --> 00:09:46,980 dari blok besar memori, dan biasanya kita dapat menghitung jika kita membutuhkannya. 139 00:09:46,980 --> 00:09:51,490 >> Akhirnya, array braket terjadi untuk menyediakan kami dengan jalan pintas untuk menginisialisasi array. 140 00:09:51,490 --> 00:09:56,130 Mari kita lihat bagaimana kita bisa menulis 10 bilangan bulat pertama bahkan menggunakan initilization pintas. 141 00:10:11,220 --> 00:10:14,470 Dengan array pointer, tidak ada cara untuk melakukan jalan pintas seperti ini. 142 00:10:14,470 --> 00:10:18,120 Ini hanyalah pengantar untuk apa yang dapat Anda lakukan dengan array. 143 00:10:18,120 --> 00:10:20,990 Mereka muncul di hampir setiap program yang Anda tulis. 144 00:10:20,990 --> 00:10:24,390 Mudah-mudahan Anda sekarang dapat melihat cara yang lebih baik melakukan contoh mahasiswa ID 145 00:10:24,390 --> 00:10:26,710 dari awal video. 146 00:10:26,710 --> 00:10:29,960 >> Nama saya Rob Bowden, dan ini adalah CS50.