[Powered by Google Translate] [Minggu 2, Lanjutan] [David J. Malan, Universitas Harvard] [Ini adalah CS50. - CS50.TV] Baiklah. Ini adalah CS50, dan ini adalah akhir minggu 2. Jika Anda berharap untuk menjadi lapar sekitar waktu ini besok, tahu bahwa kita akan mengadakan sebagai besok kelompok kecil, Kamis, 1:15 WIB. Ada URL ini di sini jika Anda ingin RSVP. Ruang terbatas, jadi tolong maafkan jika bentuk telah diisi pada saat Anda mengisi ini. URL lain, meskipun, yang mungkin menarik ini. Dalam hanya tentang waktu satu bulan, kursus ini akan disediakan semua lebih luas melalui edx, melalui mana orang-orang di Internet akan dapat mengikuti bersama, terlibat dalam kursus cukup aktif, pada kenyataannya. Mereka akan menggunakan Appliance CS50 CS50 dan Diskusikan dan sebagian besar perangkat lunak berbagai bahwa kita sudah telah menggunakan semester ini. Dan salah satu inisiatif kami ingin mengambil sebagai percobaan tahun ini adalah untuk melihat seberapa banyak konten kita dapat menerjemahkan ke dalam bahasa lisan dan tertulis lainnya. Jadi jika Anda mungkin memiliki kepentingan untuk berpartisipasi dalam proyek ini dimana kami akan memberikan transkrip bahasa Inggris dan sub judul untuk kuliah kursus ini dan celana pendek dan seminar dan bagian dan sejenisnya, jika Anda berbicara fasih atau menulis dengan lancar beberapa bahasa lain, kami akan senang untuk melibatkan Anda dalam proyek ini dimana Anda mengambil satu atau lebih dari video, menerjemahkannya ke dalam bahasa yang Anda tahu cukup baik. Untuk memberikan rasa antarmuka, ada ini antarmuka pengguna berbasis web bahwa kita akan menggunakan yang akan menciptakan dasarnya UI seperti ini. Ini saya mengajar beberapa Halloween lalu, dan di sisi kanan ada hitam di samping ini perangko waktu, Anda akan melihat berbagai hal yang keluar dari mulut saya hari itu, dan kemudian di bawahnya Anda akan dapat menerjemahkan ke dalam beberapa bahasa lain apa pemetaan adalah antara, dalam hal ini, Inggris dan, katakanlah, Spanyol. Jadi itu sebenarnya alat yang sangat user-friendly. Anda dapat mundur dan maju cepat sangat mudah dengan shortcut keyboard. Jadi jika Anda ingin mengambil bagian dalam percobaan ini dan memiliki kata-kata Anda melihat dan membaca dengan potensi ribuan orang di luar sana, jangan ragu untuk berpartisipasi. Satu kata tentang kucing dari hari Senin. Agar kita telah mengirim pesan yang terlalu menakutkan, lakukan menyadari bahwa, sebagai jam kantor sarankan dan sebagai bagian menyarankan, desain tentu saja sangat banyak telah siswa berkolaborasi dan berbicara dengan bekerja melalui set masalah dan masalah bersama-sama, dan benar-benar garis hanya datang ke, lagi, pekerjaan yang Anda akhirnya harus mengirimkan sendiri. Dan jadi cukup jujur, dalam jam kantor itu benar-benar normal, itu benar-benar diharapkan bahkan, untuk mengobrol dengan beberapa teman sebelah Anda. Jika ia sedang berjuang dengan topik tertentu dan Anda seperti, "Oh, well, izinkan saya memberi Anda sekilas dari beberapa baris kode yang saya tulis," itu bagus, yang terjadi, dan itu sangat kondusif, saya pikir, dengan proses pembelajaran. Dimana garis akan melintasi adalah ketika kepala adalah semacam miring di sini untuk detik terlalu banyak atau menit untuk yang benar-benar untuk baru saja kesempatan blokir untuk teman Anda, dan tentu ketika hal-hal bisa dipertukarkan melalui email dan Dropbox dan sejenisnya, ada juga adalah garis. Jadi dengan segala cara merasa nyaman dan merasa didorong untuk chatting dengan teman-teman dan teman sekelas tentang psets dan lebih dan hanya menyadari bahwa apa yang Anda akhirnya menyerahkan harus benar-benar menjadi produk kreasi Anda dan bukan orang lain. Dan jadi salah satu dari domain-masalah khusus untuk pset2, yang akan keluar besok malam larut, adalah untuk menyelam ke dalam dunia kriptografi, yang merupakan seni enkripsi atau mengacak informasi, dan ini pada akhirnya berhubungan dengan dunia keamanan. Sekarang, keamanan bagi kebanyakan dari kita datang dalam bentuk mekanisme yang cukup biasa. Semua dari kita memiliki username dan password, dan semua dari kita memiliki username dan password yang sangat buruk, kemungkinan besar. Jika password Anda adalah sama pada beberapa situs Web, itu mungkin bukan ide yang terbaik, seperti yang akan kita bahas menuju akhir semester. Jika password Anda ditulis pada catatan lengket - tidak ada lelucon - pada monitor anda, itu juga belum tentu desain terbaik tapi cukup fenomena umum. Dan jika Anda tidak menggunakan kriptografi untuk mengenkripsi password Anda, mereka sangat rentan. Jadi jika Anda berpikir Anda menjadi super pintar dengan memiliki dokumen Word yang tersembunyi suatu tempat pada hard drive Anda yang memiliki semua password Anda tapi itu di folder yang tidak ada yang akan melihat ke dalam, itu juga bukan merupakan mekanisme yang sangat aman. Dan jadi apa pset2 akan memperkenalkan ini seni kriptografi dan berebut informasi sehingga hal-hal seperti password semua lebih aman. Konteks di sini adalah bahwa dengan data aman datang kesempatan untuk mengenkripsi dan berebut itu. Dan jadi ini, misalnya, adalah contoh dari pesan dienkripsi. Ini benar-benar mengatakan sesuatu dalam bahasa Inggris, tapi itu jelas tidak sepenuhnya jelas. Dan kami akan datang lingkaran penuh hari ini untuk menggoda selain apa pesan rahasia di sini adalah. Tapi di dunia nyata komputer, hal-hal bahkan tidak terlihat seperti mereka mungkin frase bahasa Inggris. Sebagai contoh, ini adalah apa yang Anda mungkin menemukan pada Linux standar atau Mac atau komputer UNIX dalam sebuah file yang sekali waktu disebut file password. Saat ini sudah dipindahkan ke tempat lain. Tetapi jika Anda melihat di tempat yang tepat pada sistem, Anda akan melihat tidak hanya nama pengguna Anda atau orang lain pada sistem, tetapi Anda akan melihat versi dienkripsi password mereka. Memang, kata crypt ada menunjukkan bahwa hal-hal berikut dienkripsi, dan rangkaian huruf acak dan karakter dan angka, dan sebagainya dapat didekripsi hanya dengan mengetahui rahasia umum beberapa - kata rahasia, nomor rahasia - dan begitu memang, seni kriptografi pada akhirnya bermuara percaya dari beberapa macam dan mengetahui sesuatu yang orang lain tidak. Jadi kita akan menjelajahi secara rinci sedikit lebih saat ini dan di pset yang akan datang. Dan sekarang kata pada lulus / gagal. Terutama karena beberapa dari Anda telah menyelam ke pset1, Appliance, dan dunia yang sangat baru untuk diri sendiri, menyadari bahwa frustrasi dan kebingungan dan hanya kesulitan teknis yang cukup diharapkan, terutama dengan pset pertama, di mana ada begitu banyak baru, hanya mendapatkan akrab dengan ls dan cd dan semua perintah misterius dan lingkungan baru, dan itu terpisah dari bahan aktual dan pemrograman sendiri. Jadi menyadari juga bahwa ada pasti jam kantor yang ada sebagai struktur pendukung. Bagian ini dimulai Minggu mendatang. Tapi yang paling penting, jika Anda merasa hanya bahwa ini bukan dunia untuk Anda, menyadari bahwa itu benar-benar hanya mengambil waktu. Dan kalau bukan karena kesempatan ini tahun yang lalu bagi saya untuk mengambil kelas lulus / gagal, jujur, saya tidak akan pernah menginjakkan kaki di kelas. Dan Anda dapat mengubah ini sampai, katakanlah, Senin kelima tentu saja, jadi jika Anda berada di tepi sekarang, menyadari bahwa daripada kepala ke beberapa perairan lain sama sekali, jangan tentu mempertimbangkan hanya berubah untuk lulus / gagal. Sekali lagi, tidak ada yang benar-benar budaya ini di sini di Harvard mengambil hal-hal lulus / gagal karena semua orang benar-benar ingin mencapai atau overachieve, tapi terus terang, ini adalah cara yang indah untuk mencoba sesuatu yang keluar yang mungkin tidak akrab bagi Anda, dan Anda akan berakhir melakukan, dalam banyak kasus, cukup baik, mungkin banyak kejutan Anda. Dan dalam hal yang lebih konkret, apa yang saya pikir lulus / gagal pada umumnya tidak, terutama karena Anda mungkin pernah mengalami dengan pset0, jika Anda masukkan ke dalam 10 jam, 15 jam, 25 jam dalam beberapa pset dan Anda hanya membenturkan kepala ke dinding dan semakin Super larut malam tetapi Anda telah mengambil 90% pset dari jalan dan Anda hanya tidak tahu satu hal, lulus / gagal benar-benar mengambil tepi off dari kelas seperti ini, di mana Anda dapat semacam bahagia mengatakan, "Oke, aku tahu itu tidak sempurna, tapi saya bekerja pantatku off ini, aku cukup senang dengan di mana itu berakhir, " dan itu akan memenuhi harapan untuk lulus / gagal. Jadi jangan ingat-ingat. Baiklah. Jadi anda yang telah berjuang untuk menggunakan Universitas Harvard Wi-Fi, tahu bahwa ada SSID CS50, koneksi Wi-Fi, beredar bahwa Anda mungkin memiliki lebih beruntung untuk. Ini sedikit ironis bahwa password untuk ini, jika Anda ingin mencoba menghubungkan ke untuk kecepatan yang lebih baik - dan biarkan kami tahu apakah itu tidak lebih baik - adalah 12345, sepanjang jalan hingga 8 karena 8 lebih aman dari 5. Jadi jika Anda memerlukan sandi Wi-Fi, koneksi ke CS50 nirkabel sini, 12345678, dan kirim ke CS50 Diskusikan jika Anda masih memiliki masalah konektivitas intermittent, dan kami akan membiarkan kekuatan yang akan tahu untuk ruang ini. Baiklah. Jadi teaser cepat, terutama bagi Anda yang penggemar laki-laki atau anak perempuan dari Semua Apple sesuatu. Apa yang saya digali dari beberapa tahun yang lalu adalah file ini di sini, iUnlock.c, hanya untuk jenis membuat lebih konkrit dan lebih kompleks beberapa program C lebih mendasar kita telah menulis. Jadi saya membuka file ini, iUnlock.c. Ini tersedia di halaman Kuliah untuk hari ini. Di sisi kiri Anda akan melihat daftar panjang fungsi. Jadi rekan yang menulis ini menulis sebuah banyak fungsi, lebih dari sekedar utama. Dia menggunakan sejumlah besar perpustakaan di sini, dan jika kita mulai bergulir melalui, apa ini sebenarnya adalah retak, saya percaya, pertama untuk iPhone asli. Bila Anda ingin jailbreak iPhone asli, yang berarti untether itu dari AT & T dan benar-benar menginstal software khusus di atasnya dan melakukan hal-hal bahwa Apple tidak ingin orang lakukan, seseorang mengambil waktu untuk mencari tahu persis bagaimana mereka bisa mengeksploitasi kelemahan software, kesalahan, bug, dalam perangkat lunak Apple, dan dengan demikian lahir iUnlock.c-- bahwa jika Anda membuatnya pada komputer Anda dan diinstal ke iPhone yang terhubung ke komputer Anda melalui, katakanlah, kabel USB, ini akan memberi Anda hak akses administratif atau root pada iPhone Anda dan membiarkan Anda melakukan cukup banyak apa pun yang Anda inginkan. Dan begitu sudah ada kucing ini menarik dan permainan tikus antara Apple dan seluruh dunia khususnya karena mereka, seperti banyak perusahaan, mencoba untuk mengunci barang-barang mereka ke bawah sehingga Anda hanya bisa melakukannya dengan itu apa yang mereka inginkan. Namun berkat orang-orang seperti ini dan pemahaman tingkat rendah rincian - dan dalam hal ini pemrograman C - dan banyak konstruksi familiar bahwa kita sudah mulai bermain dengan, Anda dapat benar-benar memanfaatkan hardware dengan cara yang Anda inginkan dan belum tentu beberapa entitas perusahaan. Jadi misalnya, saya tidak tahu apa semua ini lakukan, tapi GetVersion terdengar cukup sederhana, dan sepertinya ini adalah fungsi bahwa orang ini menulis. Dibutuhkan beberapa jenis integer sebagai argumen, tidak kembali apa-apa, namun tampaknya loop dengan untuk loop di sini dan jika kondisi, jika kondisi istirahat, dan entah bagaimana berhubungan dengan nomor versi jika kita scroll ke bawah, meskipun banyak kata kunci akan menjadi baru. Dan ada banyak seluruh fungsi di sini kita belum pernah melihat dan mungkin tidak pernah melihat selama semester. Pada akhir hari, itu mengikuti aturan yang sama dan logika bahwa kami telah bermain dengan sejauh ini. Jadi ini jauh terlalu tua untuk memecahkan 3s iPhone 4s atau atau segera 5s hari ini, tapi tahu bahwa itu semua sangat banyak berasal dari dunia ini bahwa kita telah menyelam ke dalam. Mari kita lihat contoh sedikit lebih sederhana: yang satu ini, hanya untuk mendapatkan pemanasan dengan beberapa sintaks dan juga beberapa jenis data lain bahwa kita sudah bicara tentang tetapi belum benar-benar terlihat di C. Ini adalah file yang bernama positive1.c, dan per komentar di atas, ini hanya menuntut bahwa pengguna memberikan angka positif. Jadi contoh dari sebuah loop do-while, yang bagus untuk pemakai program interaktif di mana Anda perlu untuk memberitahu pengguna untuk melakukan sesuatu, dan jika mereka tidak bekerja sama Anda berteriak pada mereka atau menolak masukan mereka. Contoh kasus: Saya akan melakukan baris 19 sampai 24 asalkan pengguna tidak memberi saya angka positif. Ini detail di sini on line 18, mengapa saya menyatakan n diatas ini perulangan seluruh membangun sebagai lawan tepat di sebelah jalur 22 di mana saya benar-benar peduli untuk mendapatkan n? Ya. [Mahasiswa] Lingkup. >> Ya, jadi ini masalah lingkup. Dan dalam istilah awam, apa lingkup lihat? Ya. >> [Respon siswa terdengar] >> Dapatkah Anda berbicara sedikit lebih keras? [Mahasiswa] Dimana Anda dapat mengakses variabel tersebut. >> Sempurna. Di mana Anda dapat mengakses variabel tertentu. Dan secara umum, aturan praktis sejauh ini telah bahwa ruang lingkup dari beberapa variabel didefinisikan oleh kurung kurawal terbaru bahwa Anda telah melihat. Dan sehingga dalam kasus ini, jika saya membuat kesalahan dengan menyatakan n on line 22, baris yang akan bekerja. Saya akan mendapatkan sebuah int, dan saya akan memasukkannya ke dalam n variabel di baris 22, tapi yang baris kode sekarang akan tidak tahu apa yang saya bicarakan? >> [Mahasiswa] 25. [Malan] 25, dan ternyata 24 juga karena dalam hal ini berada di luar kurung kurawal. Jadi hanya sedikit gangguan tapi sangat mudah dipecahkan dengan hanya mendeklarasikan variabel di luar fungsi itu sendiri. Kita akan lihat nanti saat Anda dapat melangkah lebih jauh dan Anda bahkan bisa mendapatkan sedikit malas. Dan ini tidak direkomendasikan secara umum, tetapi Anda bahkan bisa mendapatkan malas dan menempatkan variabel global, sehingga untuk berbicara, bukan dalam fungsi, tidak dalam satu lingkaran, tetapi dalam file itu sendiri, di luar semua fungsi yang sudah Anda tulis, seperti yang saya lakukan di sini pada baris 15. Hal ini umumnya disukai, tetapi menyadari bahwa ini adalah solusi kadang-kadang masalah lain, seperti yang kita akhirnya akan melihat. Jadi untuk saat ini kita akan meninggalkannya seperti ini, tapi mari kita lihat apakah kita dapat menulis ulang ini hanya untuk memulai mengekspresikan diri kita sedikit berbeda. Program ini, hanya harus jelas, adalah positive1. Biarkan aku pergi ke depan di sini dan di jendela terminal saya membuat positive1, Enter. Mengkompilasi baik-baik saja. Aku akan menjalankan positive1, tekan Enter. Saya menuntut bahwa Anda memberi saya bilangan bulat positif. Aku akan mengatakan -1. Itu tidak bekerja. 0, 99. Yang tampaknya untuk bekerja. Mungkin tidak tes yang paling ketat, tapi setidaknya itu adalah cek kewarasan bagus bahwa kita berada di jalur yang benar. Jadi sekarang biarkan aku pergi ke depan dan membuka versi 2 ini, dan apa yang berbeda sudah? Menerapkan hal yang sama, tapi apa yang melompat keluar sebagai jelas berbeda kali ini? Ini bool dalam warna hijau. Hal ini disorot dalam warna hijau, ini kata kunci yang dikenal sebagai bool, yang merupakan jenis data. Ini tidak datang dibangun untuk semua versi C. Anda perlu menyertakan perpustakaan tertentu. Dalam kasus kami, saya termasuk perpustakaan CS50 sehingga kita memiliki akses ke bool. Tapi di baris 18, kita tampaknya memiliki nilai Boolean sini disebut bersyukur. Saya bisa disebut apa-apa ini, tapi saya menyebutnya bersyukur hanya untuk jenis menyampaikan beberapa makna semantik. Jadi awalnya on line 18, saya tampaknya tidak bersyukur karena nilai Boolean bersyukur diinisialisasi ke false dalam baris 18. Dan maka tampaknya apa yang saya lakukan di sini di baris 21 sampai 23 adalah Saya baru saja jenis ditulis ulang logika saya. Jadi tidak secara fungsional berbeda, tetapi sejalan 22 sekarang saya memeriksa apakah int pengguna telah memberikan lebih besar dari 0, maka saya hanya mengubah nilai bersyukur ke true. Dan mengapa saya melakukan itu? Karena sejalan 25, rupanya aku akan memeriksa kondisi. Melakukan loop ini sementara bersyukur adalah palsu. Jadi saya mengusulkan ini sebagai alternatif untuk versi 1 karena itu setidaknya sedikit lebih intuitif mungkin, itu sedikit lebih membumi dalam bahasa Inggris. Jadi lakukan hal berikut saat Anda tidak bersyukur atau saat bersyukur adalah palsu. Dan kali ini juga saya tampaknya tidak peduli untuk mengingat apa yang pengguna mengetik karena pemberitahuan tidak ada n variabel, jadi sebenarnya, sedikit kebohongan putih di sana. Secara fungsional, program ini sedikit berbeda setelah kami sampai ke bawah itu karena aku tidak mengingat apa n adalah. Tapi saya ingin menunjukkan di sini juga bahwa meskipun kita telah melihat GetInt dan GetString yang digunakan pada sisi kanan tanda sama dengan sejauh sehingga kita mengingat nilai, secara teknis, itu tidak benar-benar diperlukan. Jika untuk alasan apapun Anda tidak peduli untuk menyimpan nilai, Anda hanya ingin memeriksa nilai, perhatikan bahwa kita hanya bisa menulis ini sebagai GetInt, terbuka paren, paren dekat. Itu fungsi akan mengembalikan nilai, seperti yang kita telah mengatakan. Ini akan memberi Anda kembali sebuah int. Dan jadi jika Anda berpikir mental ini terjadi, ketika saya mengetik 99, GetInt mengembalikan nomor 99, dan begitu konseptual, itu seolah-olah kode saya sebenarnya ini. Jadi jika 99 memang lebih besar dari 0, maka bersyukur menjadi benar, maka baris 25 menyadari ooh, kita sudah selesai karena aku sekarang bersyukur, dan sejalan 26, kami hanya mengatakan, "Terima kasih untuk bilangan bulat positif!" apa itu terjadi menjadi. Sekarang mari kita lakukan sintaksis gula sedikit di sini, sehingga untuk berbicara. Mari kita lihat apakah kita dapat membersihkan baris ini 25 dengan varian ketiga dan terakhir di positive3. Perhatikan satu-satunya perbedaan sekarang adalah apa baris kode? >> [Mahasiswa] 25. >> [Malan] Ya, 25. Dan kita tidak benar-benar melihat trik ini dulu, tapi kami melihat tanda seru pada hari Senin, yang menunjukkan apa? >> [Mahasiswa] Tidak. Tidak >> atau negasi. Jadi mengambil nilai Boolean dan flip nilainya. Benar menjadi palsu, palsu menjadi benar. Jadi ini, saya akan mengusulkan, bahkan sedikit lebih intuitif cara menulis kode karena saya masih bersyukur untuk menginisialisasi palsu, saya masih melakukan hal berikut, Aku mengatur bersyukur untuk benar ketika saatnya tiba, tapi sekarang Anda benar-benar bisa hanya menerjemahkan kode ini secara lisan kiri ke kanan, sementara (bersyukur!), karena bang atau tanda seru menunjukkan gagasan tidak, jadi sementara tidak bersyukur. Jadi sekali lagi, kami belum memperkenalkan konsep-konsep baru per se. Kami berbicara tentang boolean kembali ketika kami bermain dengan Scratch, tapi sadar sekarang kita hanya bisa mulai menulis kode kita dalam berbagai cara. Jadi terutama di pset1 jika Anda semacam berjuang untuk mencari tahu cara untuk menulis beberapa program, kemungkinan besar Anda beruntung karena bisa ada beberapa solusi yang bahwa Anda dapat terjadi atas. Misalnya, ini hanya 3 untuk bahkan yang paling sederhana dari program. Baiklah. Dan sekarang ingat pada hari Senin kami pergi pada catatan ini dengan nilai-nilai kembali. Jadi untuk pertama kalinya kami menulis sebuah program yang tidak hanya memiliki utama; juga memiliki fungsi kustom sendiri yang saya tulis di sini. Jadi sejalan 31 sampai 34 Saya telah menerapkan fungsi kubus. Ini tidak rumit. Ini hanya * a * dalam kasus ini. Tapi apa yang penting tentang hal itu adalah bahwa aku mengambil input dalam bentuk dan aku kembali output dalam bentuk * a * a. Jadi sekarang aku punya kemampuan, seperti saya dulu dengan prinf saja, untuk memanggil fungsi ini dengan memanggil fungsi kubus. Dan fungsi kubus mengambil beberapa masukan, dan fungsi kubus kembali beberapa output. Sebaliknya, printf hanya melakukan sesuatu. Ini tidak kembali apa-apa yang kita peduli, meskipun sebagai samping itu tidak mengembalikan nilai; Anda hanya umumnya mengabaikannya. Printf hanya melakukan sesuatu. Ini memiliki efek samping dari mencetak ke layar. Sebaliknya di sini, kita memiliki fungsi kubus, yang benar-benar kembali sesuatu. Jadi bagi mereka yang akrab dengan ini, itu ide yang cukup jelas. Tetapi bagi mereka yang kurang akrab dengan ide lewat di input dan mendapatkan kembali output, mari kita coba sesuatu yang super hanya sederhana. Apakah ada yang nyaman datang di panggung sebentar? Anda harus nyaman dengan kamera pada Anda juga. Ya? Oke. Siapa nama Anda? >> [Mahasiswa] Ken. >> Ken. Baiklah. Ken, naiklah. Ken akan menjadi fungsi dari macam di sini. Mari kita pergi ke depan dan melakukan hal ini. Mari kita sedikit mewah. Senang bertemu Anda. Selamat datang di tengah panggung. Baiklah. Mari kita menekan tombol ini di sini. Baiklah. Jadi di sini Anda memiliki papan tulis modern, dan apa yang saya adalah fungsi utama, misalnya, dan saya tidak memiliki iPad di tanganku. Saya tidak begitu ingat bagaimana - Yah, aku tidak bisa mengatakan itu. Saya tidak benar-benar memiliki tulisan tangan yang bagus, dan karena itu saya ingin Anda untuk mencetak sesuatu di layar untuk saya. Saya menjadi program utama, dan aku akan memiliki Anda mengatakan ini dengan menulis dalam cakar ayam saya dan kemudian melewati Anda masukan. Jadi konyol meskipun latihan ini, gagasan tentang fungsi dan memanggil fungsi dan mengembalikan fungsi benar-benar bermuara pada hal ini. Saya utama, saya baru saja menulis printf, kutipan-tanda kutip sesuatu di layar, Saya menjalankan program ini, dan segera setelah printf dipanggil, dibutuhkan satu argumen atau satu parameter kadang-kadang antara tanda kutip ganda. Berikut ini adalah argumen itu. Saya menyerahkannya pada Ken. Dia adalah kotak hitam menulis beberapa beberapa tahun lalu yang tampaknya hanya tahu bagaimana untuk mencetak hal-hal di layar. Jadi mengeksekusi. Itu tidak buruk. Sangat baik. Jadi sekarang Ken dilakukan mengeksekusi. Apakah dia harus menyerahkan apa-apa kembali? Bukan berarti kita lihat sejauh ini. Sekali lagi, printf tidak benar-benar kembali nomor, tapi kami akan mengabaikan bahwa untuk saat ini karena kita tidak pernah menggunakannya. Jadi itu saja untuk Ken. Dan jadi sekarang main mengambil alih kontrol program lagi karena baris kode, printf, dilakukan mengeksekusi. Dan kita pergi tentang cara kami, melaksanakan apapun jalur lain yang ada. Jadi sekarang mari kita coba contoh yang sedikit berbeda. Kali ini di sini mari kita pertama jelas layar, dan kali ini kita akan melakukan fungsi cubing, tapi kali ini, saya mengharapkan nilai output. Jadi mari kita pergi ke depan dan melakukan hal ini. Sekarang saya memiliki baris kode yang mengatakan x mendapat kubus x. Baris kode, recall, terlihat seperti ini: x = kubus (x); Jadi bagaimana ini akan bekerja? Mari kita pergi ke depan dan memberikan layar putih lagi. Saya akan menuliskan sekarang nilai x, yang pada saat ini dalam waktu kebetulan, katakanlah, 2 untuk tetap sederhana. Saya telah menuliskan di selembar kertas nilai 2, yang adalah x nilai saya. Saya menyerahkannya kepada Ken. >> Dan aku hanya menulis jawabannya? >> Ya, mari kita menulis jawabannya. Oke. Dan sekarang dia harus kembali saya sesuatu. Sempurna. Bagus segue. Jadi sekarang dia tangan saya kembali nilai 8 dalam kasus ini, dan apa yang harus saya lakukan dengan itu? Sebenarnya - mari kita lihat, mendapatkan hak ini. Apa yang akan saya lakukan dengan itu? Sekarang aku akan mengambil nilai ini dan benar-benar menyimpannya pada mereka bit yang sama di memori. Tapi perhatikan Aku agak berjuang di sini. Aku agak bingung karena di mana saya benar-benar menulis nilai x, karena apa yang saya baru saja dilakukan adalah Ken fisik tangan selembar kertas yang memiliki nilai 2, yang x, dan memang, inilah yang terjadi. Jadi ternyata bahwa ketika Anda memanggil fungsi dan Anda lulus dalam argumen seperti halo, dunia atau Anda lulus dalam argumen seperti 2, pada umumnya, Anda lewat dalam salinan argumen itu. Dan jadi seperti aku menuliskan nomor 2 di sini dan menyerahkannya kepada Ken, itu harus berarti bahwa saya masih memiliki salinan dari nilai 2 tempat karena memang, sekarang aku sudah mendapatkan kembali nilai 8, saya harus kembali ke RAM dan benar-benar menuliskan 8 di mana saya pernah punya nomor 2. Jadi secara visual, ingat ini gagasan melintas di, harfiah, salinan nilai. Ken melakukan hal itu, tangan saya kembali sesuatu - dalam hal ini nilai seperti 8 - dan kemudian saya harus melakukan sesuatu dengan nilai bahwa jika saya ingin tetap di sekitar. Jadi semua ini akan kembali menjadi terlalu akrab sebelum lama. Terima kasih banyak untuk demo ini di sini, Ken. [Tepuk tangan] Sangat baik dilakukan. Mari kita lihat bagaimana yang pada akhirnya berhubungan dengan beberapa fungsi panggilan yang kita telah lakukan di sini. Biarkan aku pergi ke depan dan membawa kita kembali ke contoh cubing sini. Perhatikan bahwa jika kita ingin benar-benar mulai mengambil ini lebih lanjut, kita akan harus sadar akan fakta bahwa x jumlah yang sedang lewat di sini berbeda dari apa yang sebenarnya sedang berlalu ke fungsi. Jadi sekali lagi, ini melewati copy akan menjadi sangat erat hanya dalam beberapa saat. Mari kita lihat sesuatu yang tidak cukup bekerja benar belum. Aku akan pergi ke depan dan membuka contoh kereta ketiga, yang cacat oleh alam, dan itu disebut buggy3 dan menerapkan fungsi swapping. Di sini kita memiliki fungsi utama yang x dan y sewenang-wenang diinisialisasi ke 1 dan 2, masing-masing. Kita bisa menggunakan GetInt, tetapi kita hanya perlu latihan sederhana, jadi sulit-kode sebagai 1 dan 2. Di baris 21 dan 22, kita tampaknya mencetak x dan y, 1 per baris. Kemudian pada baris 23, saya menyatakan saya menukar nilai-nilai, titik, titik, titik. Saya rupanya memanggil fungsi di baris 24 swap yang disebut yang mengambil 2 argumen. Ini benar-benar legit untuk fungsi untuk mengambil 2 argumen. Kami telah melihat printf melakukannya sudah. Jadi pertukaran ternyata mengambil x dan y, dan seperti namanya, Saya akan berharap bahwa itu akan menukar ini 2 nilai. Jadi kemudian aku mengklaim on line 25 "bertukar!" dan saya mencetak ulang x dan y dengan asumsi bahwa mereka memang telah bertukar. Tetapi jika aku benar-benar menjalankan program ini - biarkan aku membuka jendela terminal, biarkan saya membuat buggy3 - seperti namanya, ini tidak akan berakhir dengan baik karena ketika saya tekan Enter, perhatikan bahwa x adalah 1, y adalah 2, namun pada akhir program, mereka masih, pada kenyataannya, sama. Jadi berdasarkan demonstrasi hanya sekarang dengan Ken, apa yang sebenarnya terjadi? Mari selami ini fungsi swap. Ini super pendek. Ini hanya beberapa baris kode yang panjang. Tapi apa masalah mendasar berdasarkan cerita sederhana mengatakan di sini dengan Ken? Mengapa swap yang rusak? [Mahasiswa] Anda menyimpan ke salinan, bukan variabel. Tepat. Kami menyimpan untuk menyalin, bukan variabel itu sendiri. Dengan kata lain, swap ternyata mengambil 2 argumen, int, dan itu sewenang-wenang disebut a dan b, dan di sini saya sudah lulus dalam x dan y, yang masing-masing 1 dan 2, tapi aku tidak benar-benar lewat di x, aku tidak benar-benar lewat di y, Saya melewati salinan x dan salinan y. Ini hampir seolah-olah Anda disalin dan disisipkan swap nilai-nilai yang Anda inginkan untuk benar-benar memanipulasi. Jadi jika itu terjadi, ketika saya mulai melaksanakan Program baris 35 kemudian 36, ketika saya sampai ke baris 37, saat ini dalam cerita, berapakah nilai dari? Pada titik ini dalam cerita, baris 37, berapakah nilai dari pada saat ini? >> [Mahasiswa] 1. [Malan] Itu hanya harus 1, benar, karena x disahkan sebagai argumen pertama, dan fungsi ini hanya sewenang-wenang memanggil argumen pertama a. Demikian pula adalah y argumen kedua, dan itu hanya sewenang-wenang memanggil b argumen kedua. Dikotomi ini sebenarnya cukup sederhana dijelaskan. Pikirkan tentang hal ini. Tak satu pun dari kita telah bertemu dengan orang yang menulis printf, jadi pasti, ia tidak tahu apa variabel kita 30 tahun kemudian akan dipanggil. Jadi harus ada perbedaan antara apa yang Anda sebut variabel dalam fungsi Anda menulis dan apa yang Anda sebut variabel dalam fungsi Anda menelepon atau menggunakan. Jadi dengan kata lain, saya telah menulis saya sebagai variabel x dan y, tetapi jika orang lain telah menulis fungsi swap, dia pasti tidak akan tahu apa variabel saya akan dipanggil, sehingga menyadari bahwa ini adalah mengapa Anda memiliki dualitas nama. Secara teknis, aku bisa melakukan ini dengan kebetulan, namun mereka masih akan disahkan sebagai salinan. Itu hanya akan menjadi murni kebetulan estetis jika orang yang menulis pertukaran telah menggunakan nama yang sama. Jadi pada titik ini dalam cerita, baris 37, adalah 1, b adalah 2, dan sekarang saya melanjutkan untuk swap mereka. Pertama-tama, izinkan saya benar-benar melakukan hal ini jauh lebih sederhana. Aku tidak tahu apa yang 3 baris kode lakukan. Mari saya hanya melakukan ini: b = a; a = b; dilakukan. Mengapa hal ini rusak, logis? Ini semacam hal yang intuitif, kan? Jadi b dan b menjadi menjadi, tapi masalahnya adalah bahwa segera setelah baris 37 mengeksekusi, apa nilai dari a dan b? Hal yang sama, 1, karena engkau telah musnah, sehingga untuk berbicara, Anda telah berubah b menyamai. Jadi sekali baris 37 telah dieksekusi, itu besar, Anda sekarang memiliki 2 salinan dari nomor 1 dalam fungsi ini, sehingga kemudian ketika Anda mengatakan di baris 38 a = b, Anda jenis kacau karena Anda hanya menugaskan 1 ke 1. Kau seperti kehilangan nilai yang Anda pedulikan. Jadi dalam versi asli ini, perhatikan apa yang saya lakukan. Saya bukannya punya baris ketiga kode yang tampak seperti ini. Saya mendeklarasikan variabel sementara. Tmp adalah nama yang sangat umum untuk variabel sementara, dan itu int karena itu harus sesuai dengan apa yang saya ingin membuat salinan. Saya menyimpan salinan dari dalam tmp, jadi setelah baris 37 telah dieksekusi, nilai adalah - kewarasan cek cepat - 1, nilai b adalah 2, dan nilai tmp juga 1. Jadi sekarang saya mengeksekusi baris 38. Setelah baris 38 mengeksekusi, yang mengambil nilai b. Dan b adalah 2, jadi sekarang 2. Jadi pada titik ini dalam cerita, adalah 2, b adalah 2, dan tmp adalah 1, jadi sekarang logis, kita bisa nilai hanya celepuk tmp ke dalam b dan kami sudah selesai. Jadi kita sudah memecahkan masalah itu. Sayangnya, ketika saya menjalankan program ini dalam bentuk ini, tidak benar-benar menukar nilai-nilai. Tapi harus jelas, mengapa? Aku tetap masalah logis dari beberapa saat yang lalu, tapi sekali lagi, jika saya menjalankan program ini, x dan y tetap tidak berubah pada akhir eksekusi program. [Komentar mahasiswa terdengar] >> Kami belum kembali apa-apa, jadi itu benar. Tapi ternyata ada sedikit masalah di sini karena sejauh ini, satu-satunya hal yang kita sudah bisa kembali adalah satu hal, dan ini merupakan pembatasan C. Anda hanya dapat kembali benar-benar satu nilai, dalam hal ini aku seperti terjebak di sini karena saya bisa mengembalikan nilai baru x atau saya bisa mengembalikan nilai baru y, tapi aku ingin kembali keduanya. Jadi kembali ini bukan solusi sederhana di sini. Tapi masalahnya fundamental adalah mengapa? Apa yang telah kita benar-benar bertukar? [Mahasiswa] dan b. >> A dan b. Tapi a dan b adalah salinan dari x dan y, yang berarti kita hanya melakukan semua pekerjaan ini, kami hanya menghabiskan 3 menit berbicara tentang fungsi swap dan semua 3 variabel tersebut, dan itu hebat, sempurna benar dalam isolasi, tapi ruang lingkup dan b hanya dalam baris-baris di sini. Jadi sama seperti untuk loop, jika Anda mendeklarasikan integer i dalam untuk loop, sama, jika Anda menyatakan dalam a dan b fungsi yang telah Anda tulis, mereka hanya di dalam fungsi yang berlaku, yang berarti secepat swap dilakukan mengeksekusi dan kami pergi dari baris ke baris 24 25, x dan y belum berubah sama sekali. Anda hanya menyia-nyiakan banyak waktu swapping salinan variabel. Jadi ternyata bahwa solusi untuk ini sebenarnya tidak jelas. Ini tidak cukup memadai untuk mengembalikan nilai-nilai karena kita hanya bisa mengembalikan 1 value, dan aku benar-benar ingin menukar kedua x dan y pada saat yang sama, jadi kita akan harus kembali ke ini. Tapi untuk saat ini, menyadari bahwa masalah fundamental berasal dari fakta bahwa a dan b adalah salinan dan mereka berada dalam lingkup mereka sendiri. Mari kita coba untuk memecahkan masalah ini dalam beberapa cara. Biarkan saya benar-benar gulir kembali ke sini dan membuka, katakanlah, varian keempat ini, buggy4. Bagaimana ini? Ini adalah masalah serupa tetapi sederhana untuk melihat sebelum kita mengambil bacokan di memecahkannya. Program ini disebut kenaikan, dan itu tampaknya menginisialisasi integer x untuk 1 di baris 18. Saya kemudian mengklaim x adalah 1, saya kemudian mengklaim "Incrementing ..." Saya kemudian memanggil kenaikan, namun kemudian di baris 22 dan 23, saya menyatakan itu sudah bertambah, Saya mengklaim x sekarang apapun itu - 2, mungkin - tapi program ini adalah kereta. Apa masalahnya? Ya. >> [Respon siswa terdengar] >> Tepat. Jadi x telah dinyatakan, jelas, on line 18. Yang ada di dalam kurung kurawal utama itu. Jadi jawaban sederhana di sini adalah bahwa sementara ada di sini x, itu tidak ada di baris 32, sehingga program ini benar-benar bahkan tidak akan mengkompilasi. Compiler ketika saya mencoba mengkompilasi kode ini akan berteriak padaku tentang beberapa identifier dideklarasikan atau sesuatu seperti itu. Bahkan, mari kita coba. Ini adalah membuat buggy4. Ada itu. Penggunaan 'x' identifier dideklarasikan di baris 32. Dan sebenarnya, mari kita lebih eksplisit di sini hari ini sehingga ini berguna dalam jam kantor dan di rumah. Perhatikan bahwa itu agak samar tertulis. Tapi fakta bahwa dentang memiliki berteriak pada kita, mengatakan buggy4.c: 32:5, benar-benar berguna. Ini berarti bahwa kesalahan adalah on line 32 pada posisi karakter 5. Jadi 1, 2, 3, 4, 5. Itu, pada kenyataannya, di mana masalahnya. Dan juga, juga, perlu diingat pada jam kantor dan di rumah, aku beruntung di sini. Saya punya satu kesalahan. Ini akan relatif mudah untuk memperbaikinya. Tetapi jika Anda mendapatkan seluruh layar penuh pesan kesalahan besar, lagi menyadari bahwa yang paling bawah mungkin saja gejala yang paling atas. Jadi selalu memburu bug Anda dari atas ke bawah karena mungkin saja ada efek rantai daisy yang menyarankan Anda memiliki masalah cara yang lebih dari yang Anda benar-benar melakukan. Jadi bagaimana kita bisa memperbaiki ini jika tujuan saya adalah untuk kenaikan x? >> [Mahasiswa] Membuat x global. Oke, jadi kita bisa membuat x global. Mari kita mengambil jalan pintas yang saya memperingatkan tentang sebelumnya, tapi heck, kita hanya perlu memperbaiki cepat, jadi mari kita katakan x int di sini. Itu membuat x global. Jadi sekarang utama memiliki akses ke sana dan kenaikan telah akses ke sana, dan jadi izinkan saya pergi ke depan dan kompilasi ini sekarang. Membuat buggy4, Enter. Sepertinya untuk mengkompilasi sekarang. Mari kita jalankan buggy4. Dan tampaknya benar-benar bekerja. Ini adalah salah satu dari hal-hal yang lakukan seperti yang saya katakan, bukan seperti yang saya lakukan, karena saya baru saja dilakukan di sini, karena pada umumnya, program kami akan mendapatkan jauh lebih menarik dan lebih lama dari ini, dan jika solusi Anda untuk masalah hidup yang hanya menempatkan semua variabel di bagian atas file Anda, sangat cepat melakukan program mendapatkan mengerikan sulit untuk mengelola. Ini akan sulit untuk memikirkan nama variabel baru, semakin sulit untuk memahami apa variabel yang melakukan apa, dan sebagainya secara umum, ini bukan solusi yang baik. Jadi mari kita lakukan ini lebih baik. Kami tidak ingin menggunakan variabel global di sini. Saya ingin kenaikan x, jadi saya jelas bisa - pada akhir hari, ini adalah jenis cerita konyol karena kita hanya melakukan hal ini - tetapi jika aku tidak tahu tentang Operator itu atau saya tidak diizinkan untuk mengubahnya dalam main sendiri, bagaimana lagi yang bisa saya menerapkan Ken di sini kali ini bukan untuk kubus tetapi untuk kenaikan? Bagaimana cara mengubah hal ini di sini? Ya. [Mahasiswa] Tiket di x dan kemudian kembali [tak terdengar] >> Oke, baik. Jadi kenapa tidak saya lulus dalam x dan kemudian daripada mengembalikannya, kenapa tidak aku hanya kembali x + 1. Beberapa hal lebih harus mengubah sini. Aku di jalur yang benar. Apa lagi yang harus saya Tweak? Orang lain. Ya. [Respon siswa tidak terdengar] Saya perlu mengubah jenis kembalinya selisih karena tidak membatalkan. Void berarti apa-apa dikembalikan, tapi jelas sekarang adalah, jadi ini kebutuhan untuk mengubah - >> [mahasiswa] int. int untuk konsisten dengan apa yang aku benar-benar kembali. Sekarang sesuatu yang lain masih kereta di sini. Ya. [Respon siswa terdengar] >> [Malan] Jadi saya perlu untuk kenaikan x? [Respon siswa terdengar] >> [Malan] Ah, jadi saya harus lulus x. Jadi saya harus melakukannya di sini. >> [Komentar siswa tidak terdengar] [Malan] Jadi prototipe, saya harus mengubah ini di sini. Jadi ini harus menjadi int, ini harus menjadi - hmm, aku benar-benar memiliki bug di sini. Mari kita perbaiki ini yang pertama. Apa yang harus ini benar-benar menjadi? Ini harus menjadi sesuatu yang int. Bisa jadi x, tapi terus terang, jika Anda mulai memanggil semua x variabel Anda, itu akan mendapatkan kurang dan kurang jelas yang mana. Jadi mari kita sembarangan memilih konvensi penamaan yang berbeda untuk fungsi pembantu saya, fungsi aku menulis. Kita akan menyebutnya, atau kita bisa menyebutnya - Mari kita menyebutnya nomor menjadi lebih eksplisit. Jadi kemudian aku harus kembali apapun jumlahnya ditambah 1, dan sekarang saya harus mengubah 1 hal lain di sini dan satu hal lainnya di sini. Apa yang saya harus mengubah on line 21 pertama? >> [Respon siswa tidak terdengar] [Malan] saya harus menetapkan ke x. Aku tidak bisa hanya memanggil kenaikan (x). Saya perlu mengingat jawaban dengan mengubah nilai x di sisi kiri. Dan meskipun x sekarang di sebelah kiri dan kanan, itu benar-benar baik-baik saja karena sisi kanan dijalankan pertama kemudian akan menjatuhkan ke hal kiri - x dalam kasus ini. Dan kemudian yang terakhir, ini adalah memperbaiki mudah sekarang. Ini hanya harus sesuai apa yang di bawah, nomor int. Jadi sejumlah besar perubahan untuk fungsi benar-benar bodoh tetapi wakil dari hal-hal yang kita akan semakin ingin lakukan. Jadi membuat buggy4. Saya sudah kacau di suatu tempat. Oh, Tuhan. Lima kesalahan dalam program 6-line. Jadi apa yang salah pada baris 18, karakter 5? Jadi saya harus menyatakan ini int,. Mari kita lihat. Ada sejumlah kesalahan lainnya. Oh, Tuhanku - 19, 18, 21 - tapi sekali lagi, mari kita membersihkan layar, L Kontrol sini, dan memutarkan dentang. Jadi 5 masalah sebenarnya hanya bahwa 1. Jadi sekarang mari kita jalankan buggy4, Enter. Wah, x telah bertambah dengan benar. Baiklah. Setiap pertanyaan tentang bagaimana untuk kenaikan angka? Ya. [Pertanyaan siswa tidak terdengar] >> Pertanyaan bagus. Bagaimana mungkin aku bisa mengubah x ke nomor dan program akan segera mengetahui? Sekali lagi, menganggapnya sebagai abstraksi ini. Jadi jika saya utama dan Ken adalah kenaikan, terus terang, saya tidak peduli apa yang Ken panggilan iPad nya. Saya tidak peduli apa yang dia sebut sesuatu yang ada hubungannya dengan pelaksanaan nya fungsi ini. Ini adalah detail pelaksanaan yang saya, utama, tidak perlu peduli. Dan sehingga hanya mengubah secara konsisten dalam fungsi - jumlah di sini dan nomor di sini - adalah semua yang diperlukan selama aku mengkompilasi ulang. Ini semacam seperti jika Anda berpikir tentang banyak dari kita, bagi anda dengan SIM yang telah didorong atau jika Anda bahkan didorong dalam mobil, kebanyakan dari kita tidak tahu bagaimana mobil bekerja di bawah kap mesin. Dan harfiah, jika Anda membuka kap, kebanyakan dari kita - termasuk saya sendiri - tidak akan benar-benar tahu apa yang kita sedang melihat, jenis seperti Anda mungkin merasa dengan hal-hal seperti ini sekarang. Tapi kita tidak benar-benar harus peduli bagaimana mobil bekerja, kita tidak harus peduli apa semua batang dan piston dan kabel dalam mobil yang sebenarnya dilakukan. Jadi sesuatu seperti apa yang Anda sebut piston tidak penting di sini dalam kasus ini. Ide yang sama. Ya. >> [Pertanyaan siswa tidak terdengar] Jika ada menggunakan lebih dari saat xa variabel lalu, Anda, programmer, harus mengubah mereka di mana-mana. Atau Anda benar-benar bisa melakukan File, Menu, dan kemudian Cari, Ganti - sesuatu seperti itu - tetapi Anda akan harus membuat perubahan sendiri. Anda harus konsisten. >> [Mahasiswa] Jika ada beberapa variabel [tak terdengar] Sebuah urutan tertentu seperti di sini, jika ini adalah int nomor lain? >> [Mahasiswa] Benar. [Malan] Ya. Agar penting ketika Anda memanggil fungsi. Jadi jika saya memanggil peningkatan sini dengan sesuatu sesuatu koma, ada pemetaan langsung. Variabel pertama, apa pun namanya, dibuat salinan dari argumen pertama di sini. Maaf. Hal ini seharusnya tidak menjadi kurung. Garis Argumen kedua dengan yang kedua. Jadi urutan, ya, hal. Baiklah. Maaf. Saya mengambil jalan panjang untuk sampai ke sana. Pertanyaan lain? Baiklah. Jadi mari kita lihat apakah kita tidak bisa melukiskan gambaran apa yang sebenarnya terjadi di sini bawah kap mesin, sehingga untuk berbicara. Ini adalah persegi panjang yang mungkin mewakili memori komputer Anda. Bahkan jika Anda tidak tahu bagaimana memori bekerja atau bagaimana RAM bekerja, setidaknya berasumsi bahwa Anda memiliki tandan itu hari ini. Anda punya megabyte itu, Anda punya gigabyte itu, dan kita tahu dari minggu 0 byte yang adalah hanya apa? >> [Mahasiswa] 8 bit. 8 bit, kan? Jadi 8 nol dan 1. Jadi jika komputer Anda memiliki pertunjukan RAM, 2 gigs of RAM hari ini, Anda memiliki miliar atau 2 miliar byte memori atau sekitar 8 miliar atau 16 milyar bit dalam komputer Anda. Berbeda dengan contoh Willy kecil Wooly, itu bukan partikel magnetik biasanya lagi. Semakin - di laptop setidaknya - itu solid state drive, SSD, yang hanya memiliki bagian yang bergerak. Ini semua elektronik. Ini semua listrik berbasis. Jadi pikirkan persegi panjang ini hanya sebagai mewakili 1 atau 2 gigabyte memori yang Anda miliki. Jadi sepotong memori. Dunia ilmu komputer telah semacam dipartisi potongan memori untuk melakukan hal yang berbeda. Misalnya, jika ini adalah RAM komputer Anda, seperti yang disarankan oleh persegi panjang di sana, ternyata bahwa dengan konvensi, di bagian atas RAM Anda, sehingga untuk berbicara, umumnya apa yang disebut segmen teks. Mereka adalah 0s dan 1s yang telah disusun. Jadi ketika kita telah melihat di bawah kap pada apa a.out adalah, semua 0s dan 1s, ketika Anda menjalankan sebuah program, mereka 0s dan 1s yang diambil dari hard drive Anda ke sesuatu yang disebut RAM, dan RAM mereka diletakkan di atas. Sementara itu, Anda memiliki hal-hal lain: menginisialisasi data, uninitialize data. Mereka 2 petak memori mengacu pada variabel global, yang Anda tidak sering menggunakan tapi kadang-kadang jika Anda melakukannya, mereka akhirnya sampai di sana juga. Lalu ada beberapa hal lain: variabel lingkungan, yang kita tidak akan menghabiskan banyak waktu pada, tapi kemudian 2 hal penting yang akan datang kembali sepanjang semester, stack dan heap. Jadi sebagian besar memori komputer Anda dicadangkan ketika menjalankan program untuk sesuatu yang disebut stack dan sesuatu yang disebut tumpukan. Kami tidak akan berbicara tentang tumpukan saat ini, tapi kami akan berbicara tentang stack. Tumpukan dimaksudkan untuk menyulap visual dari nampan dining hall makan di Mather Rumah atau di mana pun Anda berada di mana staf ruang makan bersih mereka setiap hari, mereka menumpuk mereka dari lantai ke atas, dan sama, dalam memori, ada ide menempatkan sesuatu pada stack, meletakkan sesuatu di tumpukan, meletakkan sesuatu di tumpukan. Dan apa yang kita maksudkan dengan ini? Mari kita zoom in pada hanya bagian bawah gambar ini, RAM komputer Anda, mengusulkan berikut. Ternyata bahwa ketika Anda menjalankan program seperti a.out atau Halo - program apa pun adalah bahwa Anda sudah menulis - lagi, mereka 0s dan 1s yang diambil dari hard drive Anda, yang penyimpanan jangka panjang, tetap ada bahkan ketika Anda menarik steker, dimuat ke RAM. RAM lebih cepat daripada hard drive - itu lebih kecil dari hard drive - tapi itu di mana program hidup saat Anda sedang menjalankan mereka. Jadi Anda klik dua kali sebuah program pada Mac atau PC, itu diambil dari hard drive ke dalam RAM. Segera setelah itu dimuat ke dalam RAM, go 0s dan 1s di atas jalan, segmen teks yang disebut, tapi kemudian segera setelah program Anda benar-benar mulai berjalan, fungsi utama disebut, dan utama, seperti yang kita lihat, seringkali memiliki variabel lokal, dan memiliki ints dan string dan karakter dan sejenisnya. Jadi jika program anda yang telah Anda tulis atau program yang telah diklik ganda digunakan beberapa variabel dalam utama, mereka berakhir di bagian bawah tumpukan memori Anda, sehingga untuk berbicara. Lebih konkret, apa ini benar-benar berarti? Ini hanya berarti bahwa jika kita akan ke nomor byte RAM di komputer Anda, melihat bahwa ini mungkin menjadi nomor byte 0, ini mungkin menjadi nomor 1 byte, 2, 3, 4, 5, 6, semua jalan sampai dengan 2 miliar akan semua jalan sampai ada di bagian atas. Jadi dengan kata lain, ketika kita berbicara tentang RAM atau memori dalam hal byte, itu hanya berarti bahwa seseorang telah memutuskan apa yang harus menomori masing-masing potongan memori. Jadi, ketika Anda membutuhkan 32 bit untuk int atau Anda membutuhkan 8 bit untuk char, di mana mereka berakhir di memori? Secara konseptual, mereka hanya berakhir di bagian bawah hal ini disebut stack. Tapi apa yang menarik sekarang adalah saat utama memanggil fungsi - misalkan fungsi yang disebut foo, hanya nama sewenang-wenang - apa yang terjadi adalah utama adalah di bagian bawah ini tumpukan memori; foo sekarang diletakkan di atas utama dalam memori. Jadi setiap variabel lokal yang foo telah berakhir semacam konseptual di atas mereka yang utama. Jika foo panggilan fungsi lain yang disebut bar, variabel-variabel tersebut berakhir di sini. Jika bar panggilan sesuatu yang lain, di sini, di sini, di sini. Jadi apa yang menarik tentang menjalankan sebuah program adalah bahwa ketika Anda memanggil fungsi dan sebagai fungsi-fungsi memanggil fungsi-fungsi dan sebagai fungsi-fungsi panggilan fungsi, Anda membangun ini tumpukan fungsi dalam memori. Dan hanya sekali kembali fungsi Anda mulai mendapatkan memori yang kembali. Jadi salah satu cara termudah untuk kehabisan memori dalam program komputer adalah untuk menulis fungsi yang tidak pernah kembali. Jadi misalnya, mari kita menunjukkan sebanyak dengan program sengaja kereta. Biarkan aku pergi ke depan dan melakukan # include, int main (void), dan aku akan lakukan sementara (2> 1), yang mungkin tidak akan pernah berubah pada kita, dan biarkan aku pergi ke depan sekarang dan lakukan printf. Sebenarnya, itu akan menjadi kurang menarik secara visual. Mari kita lakukan ini. Untuk int i = 0; i> 0 - mari kita membuat kesalahan ini - i + +. Dan jangan printf sini. Mari kita mempraktekkan apa yang saya berkhotbah. Mari kita memiliki metode di sini, chorus kosong, dan kita akan mengatakan int i, dan kemudian aku akan mengatakan printf - tidak, mari kita membuat ini lebih menarik. Mari kita sebenarnya tidak mencetak apa pun sama sekali. Mari kita lakukan ini: chorus (i). Baiklah. Jadi ini adalah kereta karena mengapa? Saya membuat ini sebagai aku pergi karena program ini tidak benar-benar melakukan hal-hal menarik. Tapi itu bukan tujuan. Tujuannya adalah untuk menulis sebuah program yang fungsi utamanya melakukan apa, rupanya? Menyebut dirinya. Dan sebenarnya, kita tidak perlu loop. Mari kita menyederhanakan bahkan ini hanya agar tidak melupakan benar-benar bug mendasar. Panggilan utama chorus menyanyikan chorus beberapa, maka saya melakukan sesuatu yang bodoh dan aku punya chorus chorus panggilan karena saya mengira orang lain yang akan mengimplementasikan itu mungkin, dan sekarang ini tidak akan mengkompilasi belum. Saya perlu melakukan apa? Aku butuh prototipe, ingat. Jadi saya harus memiliki di sini chorus void (int i); Jadi sekarang kalau aku turun di sini - sebenarnya, mari kita gunakan jendela besar. Mari kita pergi ke depan dan membuat chorus. Mari kita pergi ke depan dan membuat chorus. Penggunaan undeclared identifier i. Oh, itu bodoh. Kita tidak perlu argumen. Mari kita lakukan ini. Saya berharap kami sudah mulai dengan cara ini. Ini akan menjadi sebuah program jauh lebih mudah untuk menulis. Ada. Sekarang mari kita pergi ke jendela terminal saya, jalankan kembali dentang, dan di sini kita pergi. Itu benar-benar cepat. Apa yang sebenarnya baru saja terjadi, meskipun? Nah, sekarang saya akan menambahkan garis cetak sehingga kita dapat melihat. Izinkan saya mengatakan printf ("Aku di sini") - tidak ada variabel. Kami akan membiarkannya seperti itu. Biarkan saya jalankan kembali membuat. Biarkan aku memutarkan chorus. Dan ... ayolah. Terus. Sebagai samping, mengapa tidak jatuh belum? Kesalahan segmentasi terjadi super cepat sebelumnya. [Respon siswa terdengar] >> Tepat. Jadi butuh waktu untuk mencetak, kan? Ini hanya membutuhkan lebih banyak pekerjaan pada bagian komputer. Dan ada itu: Segmentation fault. Jadi perhatikan betapa cepat program dijalankan. Jika Anda tidak mencetak apapun, super cepat. Tapi kami masih punya kesalahan segmentasi karena apa yang terjadi? Jika Anda berpikir tentang bagaimana memori komputer Anda diletakkan keluar, ini terjadi untuk menjadi utama, tapi di sini mari kita sebut chorus ini, dan mari kita sebut chorus ini. Dan sekarang jika saya melakukan estetika saya benar, ini hanya akan mengatakan chorus, chorus, chorus, chorus, chorus, chorus, chorus, nauseum iklan, dan akhirnya, apa yang akan terjadi? Jika gambaran besar, secara harfiah, ini, apa yang baru saja terjadi konseptual? Overruns tumpukan tumpukan. Atau, lebih buruk lagi, Anda hanya dibanjiri segala sesuatu, termasuk segmen teks, yang merupakan 0s dan 1s yang mewakili program anda. Singkatnya, ini hanya super, buruk super. Program Anda telah berputar di luar kendali. Anda menggunakan memori jauh lebih dari yang Anda inginkan semua karena kesalahan bodoh dalam hal ini, atau dalam hal ini fungsi yang sangat sengaja dilakukan menamakan dirinya. Sekarang, hal ini tidak semuanya buruk. Fungsi menyebut diri mereka sebenarnya memiliki kekuatan besar ketika Anda menggunakannya dengan benar. Saya belum menggunakannya dengan benar di sini. Jadi ini tidak semuanya buruk, tapi fakta bahwa saya tidak pernah benar-benar berhenti menyebut diri saya adalah kelemahan mendasar di sini dari program ini. Jadi di mana kita pergi dengan semua ini? Apa yang sebenarnya terjadi? Ketika saya memanggil fungsi kenaikan seperti yang kami lakukan pada mereka contoh, Aku punya nilai seperti 1 bahwa saya lulus masuk Saya lulus dalam salinan nomor 1, sehingga berikut ini terjadi. Mari kita pergi ke contoh kenaikan, ini pria yang tepat di sini. Berikut adalah apa yang sebenarnya terjadi. Ketika saya sebut kenaikan dan saya lulus dalam x, pictorially, apa yang terjadi di sini adalah ini. Jika saya memiliki nilai 1 disimpan di sini dan aku benar-benar memanggil kenaikan, yang sekarang disebut chorus - iPad adalah melempar saya dari sini. Mari kita sebut kenaikan ini, dan kita tidak tahu apa ini fungsi berikutnya akan menjadi. Jadi apa yang sebenarnya terjadi di sini di suatu tempat di utama saya memiliki sepotong memori yang menyimpan nomor 1. Ketika saya sebut kenaikan, saya menggunakan lain sepotong memori, tapi sekarang saya memiliki salinan 1. Ketika saya kenaikan nilai tersebut, ini menjadi 2, tapi kemudian apa yang terjadi segera setelah kembali kenaikan? Memori ini hanya akan diserahkan kembali ke sistem operasi, yang berarti semua yang Anda lakukan adalah apa pun yang berguna. The 1 yang awalnya terkandung dalam utama masih benar-benar ada. Jadi di mana kita pergi dengan ini? Ternyata bahwa dalam memori Anda memiliki urutan back-to-back byte bahwa Anda dapat menempatkan barang-barang di, dan ternyata kita sudah melihat sesuatu yang melibatkan menempatkan sesuatu kembali kembali ke belakang ke belakang. Apa yang dimaksud dengan string berdasarkan pada minggu 1 dan sekarang minggu 2? Ini hanya kumpulan karakter. Jadi ternyata sama seperti Anda dapat menempatkan angka dalam memori, sama bisa Anda menempatkan karakter dalam memori. Dan sekali kita mulai menempatkan karakter dalam memori kembali untuk kembali ke kembali ke belakang, ternyata menggunakan sederhana hal-hal seperti untuk loop atau loop sementara, kita dapat iterate dari kiri ke kanan atas karakter dalam string dan mulai memijat mereka menjadi karakter yang berbeda sama sekali - bisa menjadi b, b bisa menjadi c - sehingga pada akhirnya, kita bisa mengambil sebuah kalimat bahasa Inggris yang benar-benar masuk akal dan mengkonversi masing-masing huruf satu per satu dengan berjalan melalui memori komputer kita kiri ke kanan untuk benar-benar mengenkripsi. Jadi mari kita lima menit istirahat kami di sini, dan ketika kita kembali, kita akan memulai proses mengacak informasi. Baiklah. Sebelum kita menyelam ke dalam beberapa kripto dan hal-hal yang disebut array, biarkan aku berhenti sejenak untuk setiap pertanyaan karena saya merasa seperti aku benar-benar jenis kacau beberapa topik tersebut. Jadi mari kita perbaiki sekarang jika kita bisa. Kami hanya berbicara tentang nilai-nilai kembali, kita berbicara tentang argumen, dan kami berbicara tentang gagasan ini, yang kita akan kembali ke dalam minggu-minggu yang akan datang, memandang memori sebagai sejumlah besar tersebut nampan ditumpuk, sehingga untuk berbicara, dari bawah ke atas, sehingga setiap baki yang akan diletakkan di stack merupakan fungsi yang saat ini sedang dipanggil. Ada pertanyaan? Biarkan saya mengajukan pertanyaan di sini. Biarkan aku menyederhanakan ini kembali ke apa itu sebelum beberapa dari kami Q & A. sebelumnya Fakta bahwa kenaikan memiliki kurung buka, nomor int, ditutup kurung - apa nomor int mewakili? [Mahasiswa] argumen An. >> Argumen An. Oke. Tapi apa argumen? [Respon siswa terdengar] >> Apa itu? >> [Mahasiswa] Sesuatu yang Anda lulus masuk Oke, sehingga sesuatu yang Anda lulus masuk Dan lebih umum, itu hanya input. Jika Anda sedang menulis sebuah fungsi dan tujuan yang berfungsi dalam kehidupan adalah untuk melakukan sesuatu yang sedikit berbeda setiap kali Anda menggunakannya, maka satu-satunya cara untuk itu terjadi akan benar-benar tampaknya untuk memberikan itu dengan masukan sehingga dapat melakukan sesuatu yang berbeda dengan masukan bahwa setiap kali. Jadi, Anda perlu menentukan dua hal ketika sebuah fungsi mengambil input. Anda perlu menentukan nama yang Anda ingin memberikan masukan yang murni untuk kenyamanan Anda sendiri sehingga Anda dapat merujuk ke sana dalam fungsi yang Anda sendiri yang menulis, seperti yang saya lakukan di sini di baris 32. Tapi Anda juga perlu menentukan jenisnya karena C adalah bahasa pemrograman yang hanya mensyaratkan bahwa jika Anda ingin variabel, Anda harus memberitahu komputer apa tipe data itu, sebagian besar sehingga tahu berapa banyak bit untuk mengalokasikan untuk variabel yang karena bisa jadi 6 - maaf, itu tidak akan menjadi 6. Hal ini dapat 16, dapat 8, bisa 32, bahkan 64, namun komputer perlu tahu. Sekarang, int di sisi kiri mewakili apa, sebaliknya? [Respon siswa terdengar] >> Apa itu? >> [Mahasiswa] Jenis fungsi. Jenis fungsi dan, lebih khusus, jenis output. Benar. Jadi sementara hal dalam kurung merupakan input, jika ada, hal ke kiri mewakili output. Dan dalam hal ini, peningkatan rupanya mengembalikan sebuah int, dan begitu int adalah jenis kembalinya fungsi ini. Apa artinya untuk kembali? Secara harfiah, Anda menggunakan kata kunci kembali dan kemudian jika apa yang Anda kembali di sebelah kanan kata kunci adalah integer, maka itu memang konsisten dengan apa yang telah kita janjikan. Anda tidak bisa melakukan sesuatu seperti ini - halo, dunia - karena itu adalah string. Jelas, itu bukan integer. Jadi singkatnya, beban benar-benar pada kita, programmer, untuk lebih spesifik untuk apa kita kembali dan kemudian benar-benar pergi tentang mengembalikannya. Konteks di sini sekarang adalah bahwa memori komputer Anda adalah gigabyte, 2 gigabyte - apapun - mungkin lebih, mungkin kurang, tapi komputer memandangnya sebagai memiliki bagian yang berbeda. Sesuatu turun di sana, sesuatu yang lain terjadi di sana, hal-hal yang berbeda terjadi di tengah, dan hari ini kita hanya mulai bercerita, tapi kami akan kembali ke ini dari waktu ke waktu. Untuk saat ini, satu-satunya memori kita benar-benar peduli adalah segmen teks karena itu hanya merupakan dentang yang 0s dan 1s telah outputted. Jadi, ketika Anda menjalankan perintah pada keyboard seperti a.out atau Anda klik dua kali ikon pada Mac OS atau Windows, program Anda dimuat dari hard drive Anda ke RAM dan itu menjatuhkan di bagian atas RAM komputer Anda, sehingga untuk berbicara. Sementara itu, sebagai program Anda mulai berjalan dan utama dipanggil dalam program yang Anda tulis atau program Microsoft atau Apple menulis, salah satu variabel lokal berakhir di sana di bagian bawah memori komputer Anda. Tetapi jika panggilan utama fungsi lain yang sendiri memiliki variabel atau argumen, mereka berakhir di atasnya. Dan jika fungsi yang memanggil sesuatu, mereka berakhir di atasnya, di atas, di atasnya. Dan hanya sekali fungsi dilakukan mengeksekusi apakah tumpukan nampan, sehingga untuk berbicara, mulai mendapatkan rendah dan lebih rendah. Dan inilah yang kemudian, secara singkat, menjelaskan mengapa ketika Anda menelepon kubus atau Anda memanggil kenaikan, Anda lewat dalam salinan nilai. Dan apa artinya pictorially adalah bahwa Anda benar-benar menulis nomor 1 di bagian lain dari memori, perubahan bahwa 1 sampai 2 dalam kasus selisih atau ke 8 dalam kasus kubus dan kemudian membuang memori yang jauh segera setelah kenaikan atau kembali kubus fungsi. Pertanyaan. [Mahasiswa] mana variabel global disimpan? Variabel global disimpan dalam apa yang saat ini disebut data diinisialisasi atau data uninitialized, perbedaan yang jika Anda memiliki variabel global dan Anda menetapkan segera nilai dengan tanda sama, itu berakhir di atas sana, dan jika Anda hanya mengatakan int x; dengan tidak ada nilai, itu berakhir sedikit lebih rendah di RAM hanya dengan konvensi. Pertanyaan lain? Baiklah. Jadi gambar ini akan datang kembali seperti yang kita dapatkan lebih kuat dengan apa yang dapat kita lakukan dengan komputer, tetapi untuk sekarang, mari kita intro singkat untuk kriptografi, jenis tertentu kriptografi yang tidak memecahkan semua masalah dunia tetapi tidak memecahkan beberapa dari mereka. Dalam hal ini di sini, kita memiliki sesuatu yang disebut rahasia kriptografi kunci. Rahasia-kunci kriptografi, seperti namanya, berasal dari keamanan rahasia. Misalnya, jika Anda sudah kembali di sekolah dasar dan Anda sedang melewati sebuah surat rahasia sedikit cinta untuk anak laki-laki atau perempuan Anda menghancurkan, jika Anda ingin lulus catatan bahwa melalui penonton, Anda mungkin tidak akan menulis seperti catatan dalam bahasa Inggris atau apa pun bahasa asli Anda. Sebaliknya, Anda mungkin mengenkripsi atau Anda mungkin hanya mengirim pesan teks hari ini. Tapi Anda mungkin benar-benar melewati mereka catatan seluruh kelas. Dan untuk melakukan hal ini dengan aman sedemikian rupa sehingga Anda teman dan guru tidak tahu apa yang Anda tulis, Anda mungkin datang dengan algoritma yang cukup sederhana, muda meskipun Anda mungkin, hanya berebut kata-kata. Jadi, bukannya menulis Anda mungkin menulis b, bukan b Anda mungkin menulis c, bukannya c Anda mungkin menulis d, dan sebagainya. Atau Anda bisa datang dengan terjemahan yang lebih canggih surat kepada huruf yang berbeda. Tapi menangkap adalah anak laki-laki atau perempuan kepada siapa Anda mengirim catatan ini kebutuhan untuk mengetahui sesuatu, yang adalah apa, jelas? >> [Mahasiswa] Apa yang Anda kirim. Apa rahasia Anda, seperti apa itu pemetaan antara a dan b dan c dan s d's. Apakah itu hanya menambahkan 1 ke masing-masing huruf untuk pergi dari a ke b, b ke c? Apakah lebih kompleks dari itu? Jadi, Anda dan menghancurkan Anda perlu memiliki informasi rahasia, tapi ada semacam catch-22 di sini. Jika ini adalah pertama kalinya Anda mengirimkan surat cinta melalui kelas, bagaimana adalah bahwa laki-laki atau perempuan akan tahu apa rahasia bahkan ini? Jadi rahasia-key kripto tidak memecahkan semua masalah dunia, dan sebenarnya ada hubungan di sini bahwa kami akan kembali ke menjelang akhir semester. Demikian pula jangan kebanyakan dari kita tidak tahu seseorang yang bekerja, misalnya, di Amazon.com, dan belum banyak dari kita mungkin membeli barang-barang di Amazon.com, dan kami telah diajarkan untuk menganggap bahwa transaksi e-commerce yang aman. URL ini mungkin mengatakan https, ada mungkin ikon gembok konyol kecil di suatu tempat, ada beberapa jenis kriptografi mengamankan informasi kartu kredit Anda antara Anda dan Amazon.com. Namun jika kriptografi melibatkan mengetahui rahasia beberapa namun saya tidak tahu siapa pun di Amazon dan saya sudah pasti tidak mengatur apapun rahasia dengan seseorang di Amazon, bagaimana komputer saya atau browser saya melakukan hal ini? Ternyata ada jenis lain sama sekali kriptografi yang memecahkan masalah itu. Tapi untuk saat ini, kita akan fokus pada satu sederhana di mana Anda dapat mengatur di muka untuk mengetahui beberapa rahasia seperti +1 atau beberapa pemetaan antara a dan b. Dan proses kriptografi umumnya melibatkan ini. Anda memiliki beberapa teks biasa, digambarkan di sini, di sebelah kiri, Anda menjalankannya melalui beberapa jenis algoritma atau prosedur untuk mengenkripsi itu - mungkin itu hanya menjadi b, b menjadi c - dan kemudian Anda berakhir dengan ciphertext. Sementara itu, setelah menghancurkan Anda menerima catatan ini rahasia, ia harus kemudian mendekripsi dengan umumnya membalikkan algoritma yang sehingga untuk mendapatkan kembali teks biasa. Ada inkarnasi fisik ini. Sebagai contoh, ini adalah sebuah cincin rahasia kecil decoder, dan ini adalah sebuah cincin dalam arti bahwa ada dua cepat di sini. Di pinggiran luar dari hal ini, ada huruf A sampai Z, meskipun mereka secara acak, dan di dalam, sebenarnya ada beberapa nomor sehingga dengan cincin ini Anda dapat mengubah jenis luar tetapi tidak dalam dalam rangka untuk berbaris angka dengan huruf. Dari film berjudul A Christmas Story, Anda akan melihat bahwa Ralphie kecil begitu bersemangat untuk mencari tahu apa pesan rahasia kecil Orphan Annie adalah kepadanya yang telah disampaikan, saya pikir, dalam bentuk pesan numerik pada kotak sereal dan Anda harus mengumpulkan semua kartu kecil yang datang dalam kotak sereal, Anda harus mengirimkan mereka, Anda harus mendapatkan kembali cincin decoder rahasia sehingga Anda akhirnya dapat mengetahui apa pemetaan adalah antara huruf dan angka atau surat dan surat-surat. Bagaimana di komputer kita bisa pergi tentang pelaksanaan atau mewakili hal-hal seperti ini? Kita membutuhkan suatu cara untuk mengekspresikan diri kita sedikit lebih fleksibel daripada variabel kami sejauh ini telah memungkinkan. Kami sudah ints, kami sudah chars, kami sudah mengapung dan ganda dan beberapa orang lainnya, tetapi mereka adalah potongan individu dari memori yang tidak benar-benar memungkinkan kita untuk mengekspresikan hal-hal seperti kata-kata dan kalimat dan frase. Memang, kami telah disebut string hal-hal seperti, tapi kami berjanji bahwa ini benar-benar hanya penyederhanaan dalam perpustakaan CS50 bahwa kita berniat untuk mengupas. Dan jadi mari kita mulai melakukannya di sini. Biarkan aku pergi ke depan dan membuka file - semua file yang tersedia, seperti biasa, online - array.c disebut untuk memecahkan masalah yang tidak terkait dengan string tapi itu cat gambar di sini bagaimana kita bisa menggunakan sesuatu yang disebut array. Array adalah tipe data. Ini adalah jenis variabel dari jenis yang memiliki tipe data yang lebih kecil beberapa di dalamnya kembali untuk kembali ke kembali ke belakang. Jadi misalnya, jika kita ingin menulis sebuah program kecil yang memberikan rata-rata kuis Anda untuk kursus seperti 50 yang memiliki 2 kuis, Anda bisa dengan mudah menulis program ini didasarkan bahkan pada beberapa materi minggu lalu dengan menggunakan GetInt dan beberapa variabel: int quiz1, int quiz2. Dan itu cukup sederhana. Ini mungkin 10, 20 baris kode max untuk melaksanakan program yang meminta pengguna untuk 2 skor kuis dan kemudian menghitung rata-rata dengan menambahkan mereka bersama-sama, membagi dengan 2, dan kemudian mencetak hasilnya. Kita mungkin bisa melakukan itu cukup mudah sekarang setelah beberapa jumlah menit. Tapi masalahnya adalah bahwa anggaplah bahwa 50 memiliki 3 atau 4 kuis. Misalkan Anda ingin menggunakan program yang sama untuk kelas yang memiliki mingguan kuis. Pikirkan tentang kelas yang mingguan kuis. Jika ada 16 atau lebih minggu dalam satu semester, sekarang Anda memiliki 16 variabel: int quiz1, int quiz2, int quiz3, int quiz4. Segera setelah Anda mulai melihat redundansi ini, copy dan paste kode, harus mulai untuk membuat Anda berharap ada cara yang lebih baik. Dan untungnya, karena array ada. Jadi mari kita lakukan ini. Pertama, biarkan saya memperkenalkan hal yang sangat sederhana bahwa kita sudah tidak digunakan sejauh ini, tetapi Anda akan melihat kadang-kadang dalam kode. Ini adalah apa yang umumnya disebut konstanta. Jadi itu adalah konstan dalam arti bahwa nilai ini tidak pernah berubah. Konvensi manusia saat membuat sebuah konstanta adalah dengan menggunakan huruf kapital semua hanya agar benar-benar menonjol dalam kode Anda, dan kata kunci khusus yang Anda gunakan dalam C # define. Jadi kita katakan # define, lalu spasi, maka kata yang ingin Anda gunakan untuk nama konstanta ini dan kemudian nilai konstan. Perhatikan ini berbeda dengan menugaskan sesuatu untuk variabel. Tidak ada tanda sama, ada titik koma tidak. Ini adalah apa yang umumnya dikenal sebagai direktif preprocessor, tetapi lebih pada lain waktu. Untuk saat ini, ini menciptakan nilai tidak berubah disebut Kuis nilai sebenarnya numerik yang adalah 2. Jadi di mana pun Anda melihat kuis, kuis, kuis seluruh file ini, itu hanya nomor 2. Jika saya melihat utama sekarang, mari kita lihat bagaimana ini bekerja. Pertama tampak sedikit samar, tapi itu semua barang dari minggu 1. Meminta pengguna untuk nilai. Bagaimana kita melakukan ini? Sejalan 22 - ini benar-benar bagian dari nakal - Saya menyatakan pelampung tapi bukan hanya pelampung tunggal. Saya menyatakan, lebih tepatnya, array floating-point nilai. Variabel itu akan disebut kelas, seperti yang tersirat di sini, namun satu-satunya sintaks baru kemudian orang-kurung siku. Fakta bahwa saya telah mengatakan nilai mengambang dan kemudian braket terbuka dan kemudian nomor - perhatikan jika ini adalah sebuah konstanta ini hanya seperti yang kami lakukan ini - ini berarti, "Hei komputer, beri aku 2 mengapung dan mari kita secara kolektif menyebut mereka nilai." Hal ini berbeda dengan proses yang jauh lebih membosankan seperti ini: float Grade1; mengapung grade2, dan sebagainya. Jadi array memungkinkan kita untuk menerapkan ide ini, tetapi jauh lebih sedikit messily, sedemikian rupa sehingga kita dapat menulis 1 baris kode bukan, katakanlah, 16 untuk semester 16-minggu. Saya tidak mau keras-kode 2 karena jika Anda berpikir tentang hal ini sekarang secara logis, kira tahun depan CS50 perubahan 3 kuis gantinya dan aku punya nomor 2 di sini, aku punya nomor 2 di sini, Aku punya nomor 2 di sini, nomor 2 di sini. Ini menjadi sangat membosankan dan sangat mudah untuk mengacaukan dan sengaja mengubah 1 nilai 3 dan kehilangan beberapa nilai lain 2. Jadi aku akan pergi bukan abstrak ini dan menggunakan konstan yang, seperti namanya, tidak pernah berubah. Dan sekarang tak peduli apakah kami memiliki berbagai kuis tahun ini atau berikutnya, Saya hanya perlu mengubahnya di satu tempat di sini di atas. Jadi itu semua adalah konstan. Sementara itu, fitur konseptual baru adalah bahwa dari array. Jadi tanda kurung siku memberikan saya ini banyak mengapung dan memungkinkan saya secara kolektif menyebut mereka nilai di sini. Jadi sekarang mari kita lihat apa yang akan saya lakukan. Di sini, di baris 24 adalah awal dari untuk loop. Ini benar-benar tidak ada yang mewah. Ini hanya menggunakan Kuis bukan nomor keras-kode. Tapi tidak ada intelektual yang berbeda ada dari minggu lalu. Ini hanya printf, sehingga printf ("Quiz d #% dari% d:") karena saya hanya ingin mencetak memberikan kuis nomor 1 dari 2 dan kemudian 2 dari 2. Jadi ini adalah hal yang murni estetika. Tapi bagian yang menarik sekarang ini sejalan 27. Dalam rangka untuk mengisi salah satu dari dua penampung dengan nilai floating-point, Anda lagi menggunakan tanda kurung siku. Dalam kasus ini, saya menggunakan i karena ini untuk loop telah dimulai dengan i menyamai nilai apa, rupanya? [Mahasiswa] 0. >> [Malan] 0. Jadi pada iterasi pertama dari loop ini, itu seolah-olah saya menulis ini dalam kode, tetapi pada iterasi kedua dari lingkaran ini, itu seolah-olah saya menulis ini dalam kode saya. Tapi fakta bahwa saya menggunakan variabel sempurna karena, seperti namanya, itu bervariasi nilainya pada setiap iterasi, jadi aku mengisi array ini satu tempat pada suatu waktu. Apa array ini terlihat seperti? Alasan saya menggambar persegi panjang super sederhana di layar di sini sebelum adalah untuk alasan ini. Array hanyalah sepotong memori diikuti oleh sepotong memori diikuti oleh sepotong memori dan sebagainya. Jadi, jika array saya adalah ukuran 2 dalam hal ini di sini, semua saya akan melakukan dengan mengetikkan nilai kuis saya seperti di sini - saya mendapat 100 pada satu ini dan kemudian saya mendapat 99 satu ini - maka memori ini mungkin tidak dapat digunakan karena aku hanya meminta komputer untuk berbagai ukuran 2. Mereka kotak masih ada, kan? Anda masih memiliki 2 gigabyte RAM bahkan jika Anda hanya meminta 2 mengapung. Jadi ide di balik array adalah bahwa komputer hanya mengambil sepotong memori dan kemudian pembagian adil untul potongan kecil kembali untuk kembali ke kembali ke belakang. Dan sehingga semua array adalah. Ini sepotong bersebelahan di dalam memori yang Anda dapat meletakkan segala sesuatu. Hal ini terjadi untuk kemudian melakukan beberapa aritmatika membosankan. Jika saya scroll ke bawah sini, ini adalah di mana saya kemudian iterate atas array. Saya datang dengan penjumlahan dari semua nilai dalam array, dan kemudian saya menggunakan fungsi putaran di sini untuk benar-benar melakukan jumlah dibagi dengan kuis. Tapi biarkan aku melambaikan tanganku pada saat itu sebagai semacam aritmatika cukup untuk saat ini. Tapi semua itu lakukan bagi saya pada akhirnya adalah menghitung rata-rata. Jadi kuis pertama ditambah kuis kedua dibagi dengan 2 dan kemudian mencetak keluar sebagai int. Tapi mari kita sekarang transisi ke contoh yang berbeda yang disebut string1, yang melukiskan gambaran serupa tapi string menggunakan. Biarkan aku pergi ke depan dan menyederhanakan ini untuk sesaat. Maafkan lekukan untuk saat ini. Perhatikan pada baris 19 dari contoh ini, saya mendapatkan string dari pengguna. Tapi perhatikan apa yang saya lakukan selanjutnya dalam garis 22 dan seterusnya. Aku benar-benar iterasi dari saya sampai - dan ini adalah trik baru - strlen, panjang string. Ini adalah fungsi yang datang dengan C bahwa jika Anda lulus string, ia memberitahu Anda berapa banyak karakter dalam string tersebut. Itu saja. Dan fakta bahwa itu strlen bukannya panjang string hanya karena lebih ringkas. Tiga puluh tahun yang lalu, orang suka menulis hal-hal sesingkat mungkin, jadi kami telah terus konvensi itu di sini. i + + hanya berarti kenaikan i di setiap iterasi. Dan sekarang perhatikan ini, yang benar-benar menarik. Sejalan 24, saya katakan, "Komputer, beri aku karakter, 8 bit, dan menyebutnya c." Tapi apa ini di sisi kanan katakan? Dalam bahasa Inggris, apa yang mewakili? [Mahasiswa] Karakter pertama dalam array. Tepat. Berikan karakter pertama dalam array. Atau, lebih umum, memberi saya karakter engan dalam array. Dan menyadari itu penting sekarang bahwa sebagai ilmuwan komputer, kami benar-benar menghitung dari 0. Anda tidak memiliki kebijaksanaan sekarang untuk mulai melakukan hal ini. Sekarang Anda harus berperilaku sesuai dengan harapan komputer dan menghitung dari 0 karena [0] akan menjadi karakter pertama dalam string, [1] akan menjadi yang kedua, [2] akan menjadi yang ketiga, dan sebagainya. Jadi program ini, jika saya compile, ini lagi string1, sehingga membuat string1, dan sekarang saya sudah menjalankan string1 di jendela terminal saya. Ini menunggu masukan, jadi saya akan mengetikkan David, Enter, dan sekarang mencetak David semua pada baris yang berbeda karena pemberitahuan apa yang saya lakukan. Saya mencetak satu karakter pada satu waktu. Kami tidak akan pergi ke detail hari ini, tapi saya dihapus sesaat lalu cek ini di sini. Ternyata bahwa jika pengguna mengalami gangguan, permusuhan, atau hanya bingung, Anda benar-benar dapat gagal untuk memberikan string dengan panjang tertentu. Jika Anda menekan tombol yang salah pada keyboard, Anda mungkin memberikan tali sama sekali, atau jika Anda berbahaya, Anda dapat mencoba untuk menyisipkan di bernilai gigabyte tentang esai untuk mengisi string ini, dan jika komputer kehabisan memori, ternyata bahwa kita akan mendapatkan kembali nilai ini khusus yang disebut NULL. Jadi untuk saat ini, hanya tahu bahwa ada nilai ini khusus yang disebut NULL yang akan memungkinkan kita untuk memeriksa ketika kita keluar dari memori, antara lain. Tapi kalau aku membuka sekarang string2, melihat satu perbedaan di sini. Perhatikan satu perbedaan di sini dengan string2. Dengan string2, ini untuk loop adalah sedikit berbeda. Biarkan saya menghapus NULLs sehingga kita bisa berbicara dengan orang lain waktu. Apa yang berbeda tentang untuk loop saat ini? Aku bisa kembali ke contoh sebelumnya. Jadi itulah versi 2, ini adalah versi 1. 1, 2. 1, 2. Panggilan strlen adalah di mana? Itu di bagian pertama dari untuk loop. Setiap pikiran tentang mengapa aku melakukan ini? Ya. [Mahasiswa] Jadi Anda tidak memanggil fungsi setiap saat. [Malan] Jadi kita tidak memanggil fungsi setiap saat. Tepat. Ingat dari untuk loop bahwa mereka super sederhana setelah Anda semacam memahami bahwa ini adalah inisialisasi, kondisi, dan pembaruan. Masalahnya adalah bahwa kondisi terjadi pada setiap iterasi dari loop. Dan sehingga dalam contoh di sini, apa yang buruk tentang fakta bahwa ini adalah kondisi saya? [Mahasiswa] Kau menelepon strlen. [Malan] Anda menelepon strlen lagi dan lagi dan lagi. Tapi begitu aku sudah mengetik di David, panjang string yang 5, dan itu tidak akan berubah pada setiap iterasi dari loop karena string masih D-a-v-i-d. Jadi ini adalah petunjuk pada apa yang akan menjadi ide yang semakin penting dikenal sebagai keputusan desain di mana hanya tidak membuat komputer melakukan pekerjaan yang tidak perlu. Sama seperti sneak preview dari pset2, pset2 dalam edisi standar akan menantang Anda untuk benar-benar menerapkan beberapa jumlah cipher, beberapa jumlah algoritma enkripsi, sehingga Anda berdua dapat mengenkripsi dan pesan rahasia mendekripsi banyak seperti Ralphie orang di sana diterjemahkan. Dalam edisi hacker dari pset2, kita akan pergi sedikit lebih jauh. Kami akan menyerahkan file dari sebuah sistem komputer yang sebenarnya yang berisi sejumlah besar nama pengguna dan password terenkripsi yang sebenarnya, dan tantangan untuk edisi hacker akan menjadi untuk mengcrack password dan mencari tahu apa kriptografi atau apa rahasia itu digunakan untuk benar-benar menghasilkan orang password. Dan kita akan melakukan hal ini dengan menggunakan fitur baru di sini C bahwa saya akan memberikan Anda hanya demo yang dikenal sebagai argumen baris perintah. Ternyata, karena beberapa dari Anda mungkin telah melihat dalam bagian atau dalam buku teks, utama tidak selalu harus kekosongan dalam tanda kurung. Ternyata utama juga dapat ditulis seperti ini, dengan dua argumen, argc dan argv, di mana argc adalah jumlah kata yang Anda ketik setelah nama program pada baris perintah Anda dan argv adalah kata-kata yang sebenarnya. Dan sebagai tanda kurung siku ada menunjukkan, argv tampaknya array. Ini akan menjadi string setelah string setelah string dalam memori. Jadi apa yang akan kita dapat melakukan dimulai dengan pset 2 adalah sesuatu seperti ini. Jika saya membuat argv1, yang merupakan contoh kita akan kembali ke pada hari Senin, dan menjalankannya, melihat bahwa itu tampaknya tidak melakukan apa-apa belum. Itu hanya mencetak namanya sendiri. Tapi kalau aku mengatakan selamat tinggal kelas, perhatikan bahwa program ini ternyata iterates atas setiap kata-kata yang diketik pada prompt. Dan cara dimana kita akan mendapatkan akses ke kata-kata yang pengguna telah diketik pada prompt adalah dengan mengubah utama mulai akhir pekan ini dari int main (void) ke int main (argc, argv) dan dengan demikian akan lahir argumen baris perintah. Dan sekali Anda mendapatkan benar-benar canggih ini, Anda akan dapat menulis program yang benar-benar trippy seperti ini satu di sini, yang berjalan di atas dan di luar beberapa fungsi yang sudah kita lakukan sejauh ini, tetapi semua cukup kuat. Jadi kita akan meninggalkan ini dengan ini pada layar, dan kita akan melihat Anda pada hari Senin. [CS50.TV]