[MUSIC PLAYING] Doug LLOYD: Baiklah. Bekerja dengan single variabel cukup menyenangkan. Tapi bagaimana jika kita ingin bekerja dengan banyak variabel, tapi kami tidak ingin memiliki banyak nama yang berbeda terbang di sekitar kode kita? Dalam hal ini, array akan datang sangat berguna. Array data yang benar-benar mendasar struktur untuk setiap bahasa pemrograman yang akan Anda gunakan. Dan mereka benar-benar, benar-benar berguna, terutama, karena kami akan melihat, di CS 50. Kami menggunakan array untuk memegang nilai dari tipe data yang sama di lokasi memori yang berdekatan. Artinya, itu adalah cara yang kita dapat mengelompokkan sekelompok bilangan bulat bersama dalam memori atau sekelompok karakter atau mengapung di memori benar-benar dekat bersama-sama dan bekerja dengan mereka tanpa harus memberikan setiap satu nama yang unik, yang dapat mendapatkan rumit setelah beberapa saat. Sekarang, salah satu cara untuk menganalogikan array adalah untuk berpikir tentang pos setempat kantor untuk kedua. Jadi menjauh dari pemrograman dan hanya menutup mata Anda dan memvisualisasikan dalam pikiran Anda kantor pos setempat. Biasanya, di sebagian besar posting kantor, ada sebuah bank besar sebuah kotak kantor pos di dinding. Array adalah blok raksasa dari memori yang berdekatan, dengan cara yang sama yang mail Bank di kantor pos Anda adalah ruang besar di dinding kantor pos. Array telah dipartisi menjadi kecil, identik berukuran blok ruang, yang masing-masing disebut elemen, di dengan cara yang sama bahwa dinding pos kantor telah dipartisi menjadi kecil, identik berukuran blok ruang, yang kita sebut kotak PO. Setiap elemen dari array dapat menyimpan sejumlah data, seperti setiap kotak pos mampu untuk mengadakan sejumlah surat. Apa yang dapat disimpan dalam setiap elemen array adalah variabel dari data yang sama jenis, seperti int atau char, hanya seperti di kotak pos Anda, Anda hanya bisa muat hal dari jenis yang sama, seperti surat atau paket kecil. Terakhir, kita dapat mengakses setiap elemen array langsung oleh nomor indeks, sama seperti kita dapat mengakses kantor pos kami kotak dengan mengetahui nomor kotak nya. Mudah-mudahan, analogi yang membantu Anda mendapatkan kepala Anda sekitar gagasan array oleh analogizing untuk sesuatu yang lain Anda mungkin sudah akrab dengan. Dalam C, elemen array adalah diindeks mulai dari 0, bukan dari 1. Dan ini benar-benar penting. Dan pada kenyataannya, ini adalah mengapa kita, di CS 50, dan mengapa ilmuwan komputer sering akan menghitung dari 0, adalah karena array C pengindeksan, yang selalu dimulai dari 0. Jadi jika array terdiri dari unsur-unsur n, elemen pertama dari array yang terletak pada indeks 0, dan elemen terakhir dari array terletak di indeks n minus 1. Sekali lagi, jika ada elemen n di kami array, indeks terakhir adalah n minus 1. Jadi jika array kita memiliki 50 elemen, Elemen pertama terletak pada indeks 0, dan elemen terakhir terletak di indeks 49. Sayangnya, atau untungnya, tergantung pada perspektif Anda, C sangat lunak di sini. Ini tidak akan mencegah Anda dari akan keluar dari batas-batas array Anda. Anda bisa mengakses minus 3 elemen array atau elemen 59 dari array, jika array Anda hanya memiliki 50 elemen. Ini tidak akan menghentikan program Anda dari kompilasi, tetapi pada waktu berjalan, mungkin Anda menemukan segmentasi kesalahan ditakuti jika Anda mulai untuk mengakses memori yang berada di luar batas-batas apa Anda diminta program Anda untuk memberikan Anda. Jadi hati-hati. Apa array deklarasi terlihat seperti? Bagaimana kita kode array ke dalam keberadaan seperti kita kode variabel lainnya? Ada tiga bagian ke array declaration-- jenis, nama, dan ukuran. Hal ini sangat mirip dengan deklarasi variabel, yang hanya jenis dan nama, elemen ukuran yang kasus khusus untuk array, karena kita mendapatkan banyak dari mereka pada saat yang sama. Jadi jenisnya adalah jenis variabel Anda ingin setiap elemen array menjadi. Apakah ingin array bilangan bulat? Kemudian, tipe data Anda harus int. Apakah Anda ingin menjadi array ganda atau mengapung? Jenis data harus ganda atau mengapung. Nama adalah apa yang Anda ingin memanggil array Anda. Apa yang Anda inginkan untuk nama raksasa ini Bank bilangan bulat atau mengapung atau karakter atau ganda, atau apa pun yang harus Anda? Apa yang Anda ingin menyebutnya? Cukup jelas. Terakhir, ukuran, yang pergi dalam kurung persegi, adalah berapa banyak elemen yang Anda lakukan seperti array Anda mengandung. Berapa banyak bilangan bulat yang Anda inginkan? Berapa banyak mengapung yang Anda inginkan? Jadi misalnya, int nilai siswa 40. Ini menyatakan sebuah array disebut Mahasiswa nilai, yang terdiri dari 40 bilangan bulat. Cukup jelas, saya berharap. Berikut contoh lain. Ganda harga menu 8. Hal ini menciptakan sebuah array disebut Harga menu, yang terdiri ruang di memori untuk delapan ganda. Jika Anda berpikir dari setiap elemen array tipe data-tipe, jadi misalnya, satu elemen dari array tipe int, dengan cara yang sama Anda akan berpikir lain variabel bertipe int, semua operasi akrab yang kita dibahas sebelumnya dalam Operasi Video akan masuk akal. Jadi di sini, kita bisa mendeklarasikan array dari Booleans disebut Truthtable, yang terdiri dari ruang untuk 10 Booleans. Dan kemudian, sama seperti kita hanya bisa menetapkan nilai untuk setiap variabel lain jenis Boolean, kita bisa mengatakan sesuatu seperti Truthtable braket persegi 2, yang adalah bagaimana kita menunjukkan, yang unsur tabel kebenaran? Unsur ketiga dari tabel kebenaran, karena ingat, kita menghitung dari 0. Jadi itulah bagaimana kita menunjukkan Unsur ketiga dari tabel kebenaran. Truthtable 2 sama palsu, seperti kita bisa declare-- atau kita bisa menetapkan, lebih tepatnya, setiap Variabel jenis boolean palsu. Kami juga dapat menggunakannya dalam kondisi. jika (truthtable 7 == benar), yang mengatakan, jika elemen kedelapan dari Truthtable benar, mungkin kita ingin mencetak pesan untuk pengguna, printf ("BENAR! n") ;. Yang menyebabkan kita untuk mengatakan Truthtable 10 sama dengan benar, kan? Yah, aku bisa, tapi itu cukup berbahaya, karena ingat, kami memiliki sebuah array 10 Booleans. Jadi indeks tertinggi bahwa compiler telah memberi kita adalah 9. Program ini akan mengkompilasi, tetapi jika sesuatu yang lain dalam memori ada di mana kita akan berharap Truthtable 10 untuk pergi, kita bisa menderita kesalahan segmentasi. Kita mungkin pergi dengan itu, tapi secara umum, cukup berbahaya. Jadi apa yang saya lakukan di sini adalah hukum C, tetapi belum tentu langkah terbaik. Sekarang, ketika Anda menyatakan dan menginisialisasi array secara bersamaan, sebenarnya ada cukup sintaks khusus yang Anda dapat digunakan untuk mengisi array dengan nilai awal. Ini bisa rumit untuk mendeklarasikan array dari ukuran 100, dan kemudian harus mengatakan, elemen 0 sama ini; Elemen 1 sama ini; Elemen 2 sama itu. Apa gunanya, kan? Jika itu array kecil, Anda bisa melakukan sesuatu seperti ini. Bool truthtable 3 sama terbuka penjepit keriting dan kemudian koma memisahkan daftar elemen yang Anda inginkan untuk dimasukkan ke dalam array. Kemudian tutup keriting brace titik koma. Hal ini menciptakan sebuah array ukuran tiga disebut Truthtable, dengan unsur-unsur palsu, benar, dan benar. Dan pada kenyataannya, Instansiasi sintaks saya miliki di sini adalah persis sama dengan melakukan sintaks elemen individu di bawah ini. Kedua cara coding akan menghasilkan array yang sama persis. Demikian pula, kita bisa iterate atas semua elemen dari array menggunakan loop, yang, di Bahkan, adalah sangat dianjurkan di rumah latihan. Bagaimana Anda membuat sebuah array 100 bilangan bulat, di mana setiap elemen array adalah indeks? Jadi misalnya, kita memiliki array 100 bilangan bulat, dan dalam elemen pertama, kami ingin menempatkan 0. Dalam elemen kedua, kita ingin menempatkan 1. Dalam elemen ketiga, kita ingin untuk menempatkan 2; dan seterusnya dan seterusnya. Itu benar-benar baik di rumah latihan untuk melakukan itu. Di sini, tidak terlihat seperti terlalu banyak yang berubah. Tapi perhatikan bahwa di antara kurung persegi, saat ini, Aku sudah benar-benar dihilangkan nomor tersebut. Jika Anda menggunakan ini sangat Instansiasi khusus sintaks untuk membuat array, Anda benar-benar tidak perlu untuk menunjukkan ukuran array terlebih dahulu. Compiler cukup pintar untuk mengetahui bahwa Anda benar-benar ingin array ukuran 3, karena Anda menempatkan tiga elemen di sebelah kanan tanda sama. Jika Anda telah menempatkan empat, itu akan memiliki diberikan Anda tabel kebenaran dari ukuran empat; dan seterusnya dan seterusnya. Array tidak terbatas pada satu dimensi, yang cukup keren. Anda benar-benar dapat memiliki banyak penspesifikasi sisi seperti yang Anda inginkan. Jadi misalnya, jika Anda ingin membuat papan untuk permainan Battleship, yang, jika Anda pernah bermain, adalah permainan yang bermain dengan pasak pada 10 dengan 10 grid, Anda bisa membuat sebuah array seperti ini. Anda bisa mengatakan Bool kapal perang persegi bracket 10 braket tertutup persegi persegi braket 10 ditutup braket persegi. Dan kemudian, Anda dapat memilih untuk menafsirkan ini dalam pikiran Anda sebagai 10 10 grid sel. Sekarang, pada kenyataannya, dalam memori, itu benar-benar hanya tetap menjadi elemen 100, dimensi array tunggal. Dan ini, pada kenyataannya, berlaku untuk jika Anda memiliki tiga dimensi atau empat atau lima. Ini benar-benar hanya tidak berkembang biak semua indices-- yang atau semua ukuran specifiers-- bersama-sama, dan Anda hanya mendapatkan satu dimensi array ukuran itu. Tapi dalam hal organisasi dan visualisasi dan persepsi manusia, dapat menjadi jauh lebih mudah untuk bekerja dengan grid jika Anda bekerja pada permainan seperti Tic-tac-toe atau Battleship, atau semacam itu. Ini adalah abstraksi besar, bukan memiliki untuk berpikir tentang Tic-tac-toe papan sebagai garis sembilan kotak atau papan Battleship sebagai garis 100 kotak. A 10 dengan 10 kotak atau tiga oleh tiga jaringan mungkin lebih banyak mudah untuk melihat. Sekarang, sesuatu yang sangat penting tentang array. Kami dapat memperlakukan setiap individu elemen dari array sebagai variabel. Kami melihat bahwa sebelumnya ketika kami menugaskan nilai Benar untuk Booleans tertentu atau menguji mereka di conditional. Tapi kita tidak bisa mengobati seluruh Array diri mereka sebagai variabel. Kita tidak bisa, misalnya, menetapkan satu array untuk array lain menggunakan penugasan operator. Ini bukan hukum C. Jika kita ingin, untuk apa example-- kita akan lakukan di contoh yang akan menyalin satu array ke yang lain. Jika kita ingin melakukan itu, kita benar-benar perlu menggunakan loop untuk menyalin setiap elemen individu satu per satu. Aku tahu itu memakan waktu sedikit. Jadi misalnya, jika kita memiliki beberapa ini baris kode, akan pekerjaan ini? Yah, tidak, tidak akan, kan? Karena kami berusaha untuk menetapkan makanan untuk bar. Itu tidak akan bekerja, karena itu array, dan kami hanya dijelaskan bahwa itu bukan hukum C. Sebaliknya, jika kita ingin menyalin isi dari makanan ke bar, yang adalah apa yang kita coba lakukan di sini, kita akan membutuhkan sintaks seperti ini. Kami memiliki untuk loop yang berlangsung dari J sama dengan 0 sampai 5, dan kami kenaikan J pada setiap iterasi dari loop dan elemen menetapkan seperti itu. Hal ini akan mengakibatkan bar juga menjadi satu, dua, tiga, empat, lima, tapi kita harus melakukannya ini sangat lambat unsur-by-elemen cara, bukan hanya dengan menyalin seluruh array. Dalam pemrograman lain bahasa, yang lebih modern, Anda dapat, pada kenyataannya, melakukan yang sederhana sama sintaks. Tapi C, sayangnya, kami tidak diperbolehkan untuk melakukan itu. Sekarang, ada satu lainnya hal yang saya ingin menyebutkan tentang array yang dapat sedikit sedikit rumit pertama kalinya Anda bekerja dengan mereka. Kami dibahas dalam video tentang ruang lingkup variabel, bahwa sebagian besar variabel dalam C, ketika Anda menelepon mereka dalam fungsi, yang disahkan oleh nilai. Apakah Anda ingat apa artinya untuk lulus sesuatu dengan nilai? Ini berarti kita membuat salinan variabel yang sedang lewat di. Fungsi callee, fungsi yang menerima variabel, tidak mendapatkan variabel itu sendiri. Ia mendapat lokal sendiri salinan untuk bekerja dengan. Array, tentu saja, melakukan tidak mengikuti aturan ini. Sebaliknya, apa yang kita sebut ini adalah lewat referensi. Callee sebenarnya tidak menerima array. Tidak menerima nya salinan lokal sendiri itu. Dan jika Anda berpikir tentang itu, ini masuk akal. Jika array benar-benar besar, itu mengambil begitu banyak waktu dan usaha untuk membuat salinan array 100 atau 1.000 atau 10.000 elemen, bahwa itu tidak layak untuk berfungsi untuk menerima salinan itu, melakukan beberapa pekerjaan dengan itu, dan kemudian hanya dilakukan dengan salinan; tidak perlu memiliki itu berkeliaran lagi. Karena array adalah beberapa besar dan rumit, kita hanya melewati mereka dengan referensi. Hanya kami percaya bahwa fungsi untuk, tidak melanggar apa-apa. Jadi itu benar-benar mendapatkan array. Tidak bisa copy lokal sendiri itu. Jadi apa artinya ini, kemudian, ketika callee memanipulasi elemen array? Apa yang terjadi? Untuk saat ini, kami akan gloss lebih mengapa persis ini terjadi, mengapa array tersebut diteruskan oleh referensi dan segala sesuatu yang lain melewati nilai. Tapi saya berjanji, kami akan kembali dan memberikan jawabannya untuk ini dalam sebuah video kemudian. Berikut ini salah satu latihan lebih untuk Anda sebelum kita membungkus hal pada array. The sekelompok kode di sini, itu tidak terlalu gaya yang baik, hanya aku akan membuat peringatan itu. Tidak ada komentar di sini, yang bentuk sangat buruk. Tapi itu hanya karena aku ingin menjadi mampu menyesuaikan segala sesuatu di layar. Di bagian atas, Anda dapat melihat bahwa saya memiliki dua deklarasi fungsi untuk mengatur berbagai dan mengatur int. Set array yang tampaknya mengambil array empat bilangan bulat sebagai input. Dan set int tampaknya mengambil satu bilangan bulat sebagai input. Tapi keduanya tidak memiliki output. Output, pengembalian mengetik, masing-masing adalah batal. Di Main, kita memiliki beberapa baris kode. Kami mendeklarasikan sebuah variabel integer disebut A dan menetapkan nilai 10. Kami mendeklarasikan array dari empat bilangan bulat disebut B dan menetapkan elemen 0, 1, 2, dan 3, masing-masing. Kemudian, kami memiliki panggilan untuk mengatur int dan panggilan untuk mengatur array. Definisi set array dan set int turun di bawah, di bagian bawah. Dan, sekali lagi, saya meminta Anda pertanyaan. Apa yang akan dicetak di sini di akhir Main? Ada col printout. Saya m mencetak dua bilangan bulat. Saya mencetak isi A dan isi B persegi braket 0. Jeda video di sini dan mengambil satu menit. Anda dapat mencari tahu apa ini Fungsi akan mencetak di akhir? Mudah-mudahan, jika Anda ingat perbedaan antara lewat nilai dan lewat referensi, ini masalah adalah tidak terlalu rumit untuk Anda. Dan jawabannya akan Anda temukan adalah ini. Jika Anda tidak benar-benar yakin untuk mengapa itu terjadi, mengambil kedua, kembali, meninjau apa yang saya hanya membahas tentang melewati array dengan referensi, dibandingkan lewat variabel lain dengan nilai, dan mudah-mudahan, itu akan membuat sedikit lebih masuk akal. Aku Doug Lloyd, dan ini adalah CS50.