[Bermain muzik] DOUG LLOYD: Baiklah. Bekerja dengan single pembolehubah adalah sangat menyenangkan. Tetapi bagaimana jika kita mahu bekerja dengan banyak pembolehubah, tetapi kita tidak mahu mempunyai sekumpulan nama yang berbeza terbang di sekitar kod kami? Dalam kes ini, tatasusunan adalah akan datang benar-benar berguna. Tatasusunan adalah data benar-benar asas struktur bagi mana-mana bahasa pengaturcaraan yang akan anda gunakan. Dan mereka benar-benar, benar-benar berguna, terutamanya, seperti yang kita akan lihat, dalam CS 50. Kami menggunakan tatasusunan untuk memegang nilai-nilai jenis data yang sama di lokasi ingatan yang berhampiran. Iaitu, ia adalah satu cara yang kita boleh kumpulan sekumpulan bilangan bulat bersama-sama dalam ingatan atau sekumpulan watak-watak atau terapung dalam memori benar-benar rapat dan kerja dengan mereka tanpa perlu memberikan setiap satu nama yang tersendiri, yang boleh mendapatkan rumit selepas sebentar. Kini, salah satu cara untuk analogize tatasusunan adalah untuk berfikir tentang pos tempatan anda pejabat untuk kali kedua. Jadi melangkah jauh dari program dan hanya menutup mata anda dan menggambarkan dalam fikiran anda pejabat pos tempatan anda. Biasanya, dalam kebanyakan jawatan pejabat, ada bank yang besar sebuah peti pejabat pos di dinding. Pelbagai adalah satu blok gergasi memori berdampingan, cara yang sama bahawa mel bank di pejabat pos anda ruang yang besar di dinding pejabat pos. Tatasusunan telah dibahagikan kepada kecil, sepercaman blok bersaiz ruang, setiap yang dipanggil elemen, dalam dengan cara yang sama bahawa dinding jawatan pejabat telah dibahagikan kepada kecil, sepercaman blok bersaiz ruang, yang kita panggil kotak PO. Setiap elemen array boleh menyimpan sejumlah data, seperti setiap kotak pejabat pos mampu untuk memegang sejumlah mel. Apa yang boleh disimpan di dalam setiap elemen array adalah pembolehubah data yang sama jenis, seperti int atau char, hanya seperti dalam peti surat anda, anda hanya boleh memuatkan perkara dari jenis yang sama, seperti surat atau pakej kecil. Akhir sekali, kita boleh mengakses setiap elemen array secara langsung dengan jumlah indeks, sama seperti kita boleh mengakses pejabat pos kami kotak dengan mengetahui nombor peti mel itu. Mudah-mudahan, analogi yang membantu anda mendapatkan kepala anda sekitar idea tatasusunan oleh analogizing kepada sesuatu yang lain bahawa anda mungkin sudah biasa dengan. Dalam C, unsur-unsur tatasusunan adalah diindeks bermula dari 0, bukan dari 1. Dan ini adalah benar-benar penting. Dan sebenarnya, ini adalah mengapa kita, dalam CS 50, dan mengapa saintis komputer kerap akan dikira dari 0, adalah kerana array C pengindeksan, yang sentiasa bermula pada 0. Jadi, jika array mengandungi n elemen, elemen pertama array itu terletak pada indeks 0, dan elemen terakhir array terletak pada indeks tolak n 1. Sekali lagi, jika ada n unsur dalam kita pelbagai, indeks yang terakhir adalah n tolak 1. Jadi, jika pelbagai kami mempunyai 50 unsur-unsur, Elemen pertama terletak pada indeks 0, dan elemen terakhir terletak pada indeks 49. Malangnya, atau nasib baik, bergantung kepada perspektif anda, C adalah sangat ringan di sini. Ia tidak akan menghalang anda daripada akan keluar dari batas-batas lokasi anda. Anda boleh mengakses tolak 3 elemen pelbagai anda atau unsur ke-59 lokasi anda, jika lokasi anda hanya mempunyai 50 elemen. Ia tidak akan menghentikan program anda dari menyusun, tetapi pada masa jangka, anda mungkin menghadapi ditakuti segmentasi kesalahan jika anda mula mengakses memori yang berada di luar batas-batas apa anda bertanya kepada program anda untuk memberikan anda. Jadi berhati-hati. Apakah array pengisytiharan kelihatan seperti? Bagaimana kita memberi kod pelbagai wujud seperti kita memberi kod apa-apa ubah yang lain? Terdapat tiga bahagian untuk array declaration-- jenis, nama, dan saiz. Ini adalah hampir sama dengan pengisytiharan pembolehubah, yang hanya jenis dan nama, elemen saiz yang kes khas untuk pelbagai, kerana kita mendapat sekumpulan daripada mereka pada masa yang sama. Jadi jenis adalah apa jenis pembolehubah anda mahu setiap elemen array untuk menjadi. Jangan mahu ia pelbagai integer? Kemudian, jenis data yang patut menjadi int. Adakah anda mahu ia menjadi satu pelbagai beregu atau terapung? Jenis data perlu dua atau terapung. Nama ini adalah apa yang anda mahu panggil lokasi anda. Apa yang anda mahu menamakan gergasi ini bank integer atau pelampung atau aksara atau beregu, atau apa sahaja yang anda? Apa yang anda mahu panggil ia? Cukup sendiri penjelasan. Akhir sekali, saiz, yang pergi di dalam tanda kurung siku, adalah bagaimana banyak unsur yang anda lakukan seperti pelbagai anda untuk mengawal. Berapa banyak bilangan bulat yang anda mahu? Berapa banyak kereta berhias yang anda mahu? Jadi, sebagai contoh, int gred pelajar 40. Ini menceritakan pelbagai dipanggil Pelajar gred, yang terdiri daripada 40 integer. Cukup sendiri penjelasan, saya berharap. Berikut adalah contoh yang lain. Harga menu Double 8. Ini mewujudkan pelbagai dipanggil Harga menu, yang terdiri ruang dalam ingatan selama lapan beregu. Jika anda berfikir bagi setiap elemen daripada pelbagai jenis data-jenis, jadi sebagai contoh, elemen tunggal pelbagai jenis int, cara yang sama anda akan berfikir apa-apa lain berubah-ubah dari jenis int, semua operasi biasa yang kita dibincangkan sebelum ini dalam Operasi video akan masuk akal. Jadi di sini, kita boleh mengisytiharkan array daripada Booleans dipanggil Truthtable, yang terdiri daripada ruang untuk 10 Booleans. Dan kemudian, sama seperti kita hanya boleh memberikan nilai kepada apa-apa ubah lain jenis Boolean, kita boleh mengatakan sesuatu seperti Truthtable kurungan persegi 2, iaitu bagaimana kita menunjukkan, yang unsur jadual kebenaran? Elemen ketiga jadual kebenaran, kerana ingat, kita mengira dari 0. Jadi itulah bagaimana kita menunjukkan Elemen ketiga jadual kebenaran. Truthtable 2 sama palsu, seperti yang kita boleh declare-- atau kita boleh menyerahhakkan, sebaliknya, apa-apa Boolean jenis pembolehubah adalah palsu. Kita juga boleh menggunakan ia dalam keadaan. jika (truthtable 7 == benar), yang mengatakan, jika unsur kelapan daripada Truthtable adalah benar, mungkin kita ingin mencetak mesej kepada pengguna, printf ("TRUE! n") ;. Yang menyebabkan kita untuk mengatakan Truthtable 10 sama dengan benar, bukan? Well, saya boleh, tetapi ia cukup berbahaya, kerana ingat, kita mempunyai pelbagai 10 Booleans. Jadi indeks tertinggi bahawa pengkompil telah memberikan kita adalah 9. Program ini akan menyusun, tetapi jika sesuatu yang lain dalam ingatan wujud di mana kita akan mengharapkan Truthtable 10 untuk pergi, kita boleh mengalami kesalahan segmentasi. Kami mungkin pergi dengannya, tetapi secara umum, cukup berbahaya. Jadi apa yang saya lakukan di sini adalah C undang-undang, tetapi tidak semestinya langkah terbaik. Kini, apabila anda mengaku dan memulakan array pada masa yang sama, ada sebenarnya yang cukup sintaks khas yang anda boleh gunakan untuk mengisi array dengan nilai-nilai permulaan. Ia boleh mendapatkan rumit untuk mengisytiharkan pelbagai saiz 100, dan kemudian perlu untuk mengatakan, elemen 0 sama ini; elemen 1 sama dengan ini; elemen 2 sama dengan itu. Apa gunanya, bukan? Jika ia merupakan satu lokasi yang kecil, anda boleh melakukan sesuatu seperti ini. Bool truthtable 3 sama terbuka kerinting dan kemudian koma mengasingkan senarai unsur-unsur yang anda mahu dimasukkan ke dalam array. Kemudian tutup kerinting pendakap koma bertitik. Ini mewujudkan pelbagai saiz tiga dipanggil Truthtable, dengan unsur-unsur palsu, benar, dan benar. Dan sebenarnya, merta yang sintaks Saya ada di sini adalah sama seperti melakukan sintaks elemen individu di bawah. Kedua-dua cara pengekodan akan menghasilkan pelbagai yang sama. Begitu juga, kita boleh melelar atas semua unsur-unsur daripada pelbagai menggunakan gelung, yang, Malah, adalah sangat disyorkan di rumah senaman. Bagaimana anda membuat array daripada 100 bilangan bulat, di mana setiap elemen array adalah indeks? Jadi, sebagai contoh, kita mempunyai pelbagai 100 bilangan bulat, dan dalam elemen pertama, kita mahu meletakkan 0. Dalam elemen kedua, kita mahu meletakkan 1. Dalam elemen ketiga, kami mahu untuk meletakkan 2; dan sebagainya dan sebagainya. Itu benar-benar baik di rumah senaman untuk berbuat demikian. Di sini, ia tidak kelihatan seperti terlalu banyak telah berubah. Tetapi perhatikan bahawa di antara tanda kurung siku, kali ini, Saya sebenarnya telah ditinggalkan nombor. Jika anda menggunakan ini sangat merta khas sintaks untuk mewujudkan pelbagai, anda sebenarnya tidak perlu menunjukkan saiz array terlebih dahulu. Pengkompil cukup pintar untuk mengetahui bahawa anda benar-benar mahu pelbagai saiz 3, kerana anda meletakkan tiga elemen di sebelah kanan tanda yang sama. Jika anda telah meletakkan empat, ia akan mempunyai berikan kepada kamu jadual kebenaran saiz empat; dan sebagainya dan sebagainya. Tatasusunan tidak terhad kepada satu dimensi, yang cukup sejuk. Anda sebenarnya boleh mempunyai banyak specifiers sampingan seperti yang anda mahu. Jadi, sebagai contoh, jika anda ingin membuat papan untuk permainan Battleship, yang, jika anda pernah bermain, adalah permainan yang bermain dengan pasak pada 10 sebanyak 10 grid, anda boleh membuat pelbagai seperti ini. Anda boleh mengatakan Bool perang kurungan persegi 10 tertutup persegi kurungan persegi pendakap 10 ditutup kurungan persegi. Dan kemudian, anda boleh memilih untuk mentafsir ini dalam fikiran anda sebagai 10 sebanyak 10 grid sel. Sekarang, sebenarnya, dalam ingatan, ia benar-benar tidak hanya kekal sebagai elemen 100, pelbagai dimensi tunggal. Dan ini, sebenarnya, juga dengan jika anda mempunyai tiga dimensi atau empat atau lima. Ia benar-benar hanya tidak membiak semua indices-- yang atau semua saiz specifiers-- bersama-sama, dan anda hanya mendapat satu dimensi pelbagai saiz itu. Tetapi dari segi organisasi dan visualisasi dan persepsi manusia, ia boleh menjadi lebih mudah untuk bekerja dengan grid jika anda bekerja pada permainan seperti Tic-tac-toe atau Battleship, atau sesuatu seperti itu. Ia adalah satu abstraksi yang besar, daripada harus berfikir tentang Tic-tac-toe lembaga dalam garisan sembilan kuasa dua atau papan Battleship dalam garisan daripada 100 kuasa dua. A 10 10 grid atau tiga oleh tiga grid mungkin banyak lagi mudah untuk menyedarinya. Sekarang, sesuatu yang benar-benar penting tentang tatasusunan. Kita boleh merawat setiap individu elemen array sebagai pembolehubah. Kami melihat bahawa sebelum ini apabila kita telah memberikan nilai Benar untuk Booleans tertentu atau menguji mereka dalam conditional. Tetapi kita tidak boleh merawat keseluruhan tatasusunan diri mereka sebagai pembolehubah. Kita tidak boleh, sebagai contoh, menetapkan satu lokasi kepada pelbagai lain menggunakan tugasan operator. Ia bukan undang-undang C. Jika kita mahu, sebagai example-- apa kita akan lakukan dalam contoh yang adalah untuk menyalin satu lokasi kepada yang lain. Jika kita mahu berbuat demikian, kita sebenarnya perlu menggunakan gelung untuk menyalin setiap elemen individu satu pada satu masa. Saya tahu ia memakan sedikit masa. Jadi, sebagai contoh, jika kita mempunyai pasangan ini baris kod, akan berfungsi? Well, tidak, ia tidak akan, bukan? Kerana kita cuba untuk memberikan makanan kepada bar. Itu tidak akan berjaya, kerana ia adalah pelbagai, dan kami baru diterangkan yang itu bukan undang-undang C. Sebaliknya, jika kita mahu menyalin kandungan makanan ke dalam bar, yang adalah apa kita cuba lakukan di sini, kita perlu sintaks seperti ini. Kami ada untuk gelung yang masuk daripada J adalah sama dengan 0 sehingga 5, dan kita kenaikan J pada setiap lelaran gelung dan unsur-unsur menyerahhakkan seperti itu. Ini akan menyebabkan bar juga menjadi satu, dua, tiga, empat, lima, tetapi kita perlu melakukannya ini sangat unsur-by-unsur cara perlahan, bukannya dengan hanya menyalin keseluruhan array. Dalam pengaturcaraan lain bahasa, yang lebih moden, anda boleh, sebenarnya, berbuat semudah itu sama sintaksis. Tetapi C, malangnya, kami tidak dibenarkan untuk berbuat demikian. Sekarang, ada satu lain Perkara yang saya ingin menyebut tentang tatasusunan yang boleh menjadi sedikit sedikit rumit pada kali pertama anda bekerja dengan mereka. Kami membincangkan dalam video mengenai skop berubah-ubah, bahawa kebanyakan pembolehubah dalam C, yang kamu berdoa mereka dalam fungsi, diluluskan oleh nilai. Adakah anda masih ingat apa yang dimaksudkan untuk lulus sesuatu dengan nilai? Ini bermakna kita membuat satu salinan berubah-ubah yang yang diluluskan pada. Fungsi CALLEE, fungsi yang yang menerima berubah-ubah, tidak mendapat pembolehubah itu sendiri. Ia mendapat tempatan sendiri salinannya untuk bekerja dengan. Tatasusunan, sudah tentu, tidak tidak mengikut peraturan ini. Sebaliknya, apa yang kita panggil ini berlalu dengan rujukan. CALLEE sebenarnya tidak menerima array. Ia tidak menerima mereka salinan tempatan sendiri daripadanya. Dan jika anda berfikir tentang ia, ini boleh diterima. Jika tatasusunan adalah benar-benar besar, ia mengambil begitu banyak masa dan usaha untuk membuat salinan pelbagai 100 atau 1,000 atau 10,000 elemen, bahawa ia tidak berbaloi untuk berfungsi untuk menerima satu salinan daripadanya, membuat kerja-kerja dengan itu, dan kemudian hanya dilakukan dengan salinan itu; ia tidak perlu untuk mempunyai ia melepak lagi. Kerana tatasusunan adalah beberapa besar dan rumit, kita hanya lulus mereka melalui rujukan. Kami hanya percaya kepada fungsi yang kepada, tidak melanggar apa-apa. Supaya ia benar-benar mendapatkan array. Ia tidak mendapat salinan tempatan sendiri daripadanya. Jadi apakah maksud ini, kemudian, apabila CALLEE yang memanipulasi elemen array? Apa yang berlaku? Buat masa ini, kami akan gloss atas sebab betul-betul ini berlaku, mengapa tatasusunan diluluskan oleh rujukan dan segala-galanya diluluskan oleh nilai. Tetapi saya berjanji kepada anda, kami akan kembali dan memberikan jawapan ini dalam video kemudian. Berikut adalah satu senaman yang lebih untuk anda sebelum kita mengakhiri perkara pada tatasusunan. Tandan kod di sini, itu tidak terutamanya gaya yang baik, hanya saya akan membuat kaveat itu. Ada sebarang komen di sini, yang merupakan bentuk agak buruk. Tetapi ia hanya kerana saya mahu menjadi dapat dimuatkan segala-galanya pada skrin. Di bahagian atas, anda boleh melihat bahawa saya mempunyai dua akuan fungsi untuk set pelbagai dan menetapkan int. Set lokasi nampaknya mengambil array empat integer sebagai input. Dan int set nampaknya mengambil integer tunggal sebagai input. Tetapi kedua-dua mereka tidak mempunyai output. Output, pulangan menaip, masing-masing adalah tidak sah. Di Main, kita mempunyai beberapa baris kod. Kami mengisytiharkan pembolehubah integer dikenali sebagai A dan sediakan nilai 10. Kami mengaku pelbagai empat integer dikenali sebagai B dan menetapkan unsur-unsur 0, 1, 2, dan 3, masing-masing. Kemudian, kita mempunyai panggilan untuk menetapkan int dan panggilan untuk menetapkan pelbagai. Takrif pelbagai set dan set int yang turun di bawah, di bahagian bawah. Dan sebagainya, sekali lagi, saya meminta anda soalan. Apa yang akan dicetak di sini pada akhir Main? Ada col cetakan. Saya mencetak dua integer. Saya mencetak kandungan A dan kandungan B kurungan persegi 0. Jeda video di sini dan mengambil satu minit. Bolehkah anda memikirkan apa ini fungsi akan mencetak pada akhir? Mudah-mudahan, jika anda masih ingat yang perbezaan antara hantaran oleh nilai dan lulus dengan merujuk, ini masalah tidak terlalu sukar untuk anda. Dan jawapan yang anda lakukan mendapati adalah ini. Jika anda tidak benar-benar pasti tentang mengapa itu berlaku, mengambil kedua, kembali, mengkaji apa yang saya hanya membincangkan tentang lulus tatasusunan dengan merujuk, berbanding lulus pemboleh ubah yang lain dengan nilai, dan mudah-mudahan, ia akan membuat rasa yang lebih sedikit. Saya Doug Lloyd, dan ini adalah CS50.