[Powered by Google Translate] [Minggu 2, Sambungan] [David J. Malan, Universiti Harvard] [Ini adalah CS50. - CS50.TV] Semua hak. Ini adalah CS50, dan ini adalah akhir 2 minggu. Jika anda mengharapkan untuk menjadi lapar sekitar masa ini esok, tahu bahawa kita akan mengadakan esok kumpulan kecil, Khamis, 1:15. Terdapat URL ini di sini jika anda ingin untuk RSVP. Ruang adalah terhad, jadi maafkanlah jika borang yang telah diisi oleh masa anda mengisi ini. Satu lagi URL, walaupun, yang mungkin menarik minat ini. Dalam hanya kira-kira masa sebulan, kursus ini akan disediakan semua lebih meluas melalui EDX, melalui mana orang di Internet akan dapat mengikuti bersama-sama, melibatkan diri dalam kursus ini agak aktif, sebenarnya. Mereka akan menggunakan Appliance CS50 dan CS50 Bincangkan dan kebanyakan alat perisian pelbagai yang kita sudah telah menggunakan semester ini. Dan salah satu inisiatif kita ingin mengambil sebagai percubaan tahun ini adalah untuk melihat betapa banyak kandungan kita boleh menterjemahkan ke dalam bahasa lisan dan bertulis yang lain. Jadi, jika anda mungkin mempunyai kepentingan dalam mengambil bahagian dalam projek ini di mana kami akan menyediakan transkrip dan sarikata Bahasa Inggeris untuk kuliah kursus dan seluar pendek dan seminar dan seksyen dan sebagainya, jika anda bercakap dengan lancar atau menulis dengan lancar beberapa bahasa lain, kita akan suka untuk melibatkan diri anda dalam projek ini di mana anda mengambil satu atau lebih video, menterjemahkannya ke dalam bahasa anda tahu cukup baik. Untuk memberi anda rasa antara muka, ada ini antara muka berasaskan web pengguna bahawa kita akan menggunakan yang akan mewujudkan asasnya UI seperti ini. Ini saya mengajar Halloween dahulu, dan di sebelah kanan di sana dalam hitam sebelah setem masa, anda akan melihat pelbagai perkara yang keluar dari mulut saya bahawa hari, dan kemudian di bawah anda akan dapat untuk menterjemahkan ke dalam bahasa lain apa sebenarnya pemetaan di antara keduanya, dalam kes ini, Bahasa Inggeris, mengatakan, Sepanyol. Jadi ia sebenarnya alat yang sangat user-friendly. Anda boleh putar balik dan pantas ke hadapan sangat mudah dengan kekunci pintas. Jadi jika anda ingin mengambil bahagian dalam eksperimen ini dan mempunyai kata-kata anda dilihat dan dibaca oleh berpotensi beribu-ribu orang di luar sana, sila berasa bebas untuk menyertai. Satu perkataan tentang kucing dari Isnin. Supaya kami telah menghantar mesej yang terlalu menakutkan, lakukan sedar bahawa, seperti waktu pejabat mencadangkan dan sebagai bahagian mencadangkan, reka bentuk kursus adalah amat telah pelajar bekerjasama dan bercakap untuk bekerja melalui set masalah dan masalah bersama-sama, dan benar-benar garis hanya datang ke, sekali lagi, kerja anda akhirnya mengemukakan seharusnya anda sendiri. Dan sebagainya agak jujur, dalam waktu pejabat, ia adalah benar-benar biasa, ia benar-benar dijangka malah, untuk berbual dengan beberapa orang kawan di sebelah anda. Jika dia sedang bergelut dengan beberapa topik dan anda seperti, "Oh, baik, izinkan saya memberi anda gambaran sepintas lalu beberapa baris kod yang saya tulis," itulah denda, yang berlaku, dan yang amat kondusif, saya fikir, dengan proses pembelajaran. Jika garis mendapat melintasi adalah apabila kepala adalah jenis condong ke sini untuk saat terlalu banyak atau minit untuk yang benar-benar telah menjadi peluang nyahhalang untuk rakan anda, dan sudah tentu apabila perkara mendapat ditukar melalui e-mel dan Dropbox dan sebagainya, terdapat juga baris. Jadi dengan cara semua berasa selesa dan berasa digalakkan untuk berbual dengan rakan-rakan dan rakan sekelas tentang psets dan lebih dan hanya menyedari bahawa apa yang anda akhirnya mengemukakan benar-benar harus menjadi produk ciptaan anda dan bukan orang lain. Dan sebagainya salah satu masalah domain khusus untuk pset2, yang akan keluar malam esok lewat, adalah untuk menyelam ke dalam dunia kriptografi, yang merupakan seni menyulitkan atau bergegas maklumat, dan ini akhirnya berkaitan dengan dunia keselamatan. Kini, keselamatan bagi kebanyakan kita datang dalam bentuk mekanisme yang agak biasa. Semua kita mempunyai nama pengguna dan kata laluan, dan kita semua mempunyai nama pengguna dan kata laluan yang sangat buruk, kemungkinan besar. Jika kata laluan anda adalah sama pada beberapa laman web, yang mungkin bukan idea yang terbaik, seperti yang kita akan membincangkan ke arah akhir semester. Jika kata laluan anda ditulis pada nota melekit - jenaka tidak - pada monitor anda, yang juga tidak semestinya reka bentuk yang terbaik tetapi agak satu fenomena biasa. Dan jika anda tidak menggunakan kriptografi untuk menyulitkan kata laluan anda, mereka terdedah. Jadi, jika anda berfikir anda menjadi super bijak dengan mempunyai dokumen Word tersembunyi tempat pada cakera keras anda yang mempunyai semua kata laluan anda tetapi ia adalah dalam folder bahawa tiada siapa yang akan melihat, yang terlalu tidak adalah satu mekanisme yang sangat selamat. Dan jadi apa pset2 akan memperkenalkan ini seni kriptografi dan bergegas maklumat supaya perkara-perkara seperti kata laluan adalah semua lebih selamat. Konteks di sini adalah bahawa dengan data tidak selamat datang peluang untuk menyulitkan dan perebutan ia. Dan sebagainya ini, misalnya, adalah satu contoh mesej disulitkan. Ini sebenarnya mengatakan sesuatu dalam bahasa Inggeris, tetapi ia adalah jelas tidak sepenuhnya jelas. Dan kita akan datang bulatan penuh hari ini untuk mengusik selain apa mesej ini rahsia di sini. Tetapi dalam dunia sebenar komputer, perkara-perkara tidak walaupun kelihatan seperti mereka mungkin frasa Bahasa Inggeris. Sebagai contoh, ini adalah apa yang anda mungkin mendapati pada standard Linux atau Mac atau komputer UNIX dalam fail yang pernah suatu masa dahulu dipanggil fail kata laluan. Kini ia telah berpindah ke tempat lain. Tetapi jika anda melihat di tempat yang betul pada sistem, anda akan melihat bukan sahaja username anda atau bahawa orang lain pada sistem, tetapi anda akan melihat versi disulitkan kata laluan mereka. Malah, perkataan kubur sana menunjukkan bahawa barangan berikut adalah disulitkan, dan ini siri surat yang seolah-olah rawak dan huruf dan nombor dan sebagainya boleh dibuka hanya dengan umumnya mengetahui beberapa rahsia - perkataan rahsia, rahsia nombor - dan sebagainya sememangnya, seni kriptografi akhirnya bisul ke mempercayai sejenis dan mengetahui sesuatu yang orang lain tidak. Jadi kita akan meneroka ini dalam sedikit lebih terperinci hari ini dan dalam pset untuk datang. Dan kini satu perkataan pada pas / gagal. Terutamanya kerana sesetengah daripada anda telah menyelam ke pset1, Appliance, dan sebuah dunia yang sangat baru untuk diri sendiri, menyedari bahawa kekecewaan dan kekeliruan dan hanya masalah teknikal agak dijangka, terutama dengan pset pertama, di mana terdapat hanya begitu banyak baru, hanya mendapat biasa dengan ls dan cd dan semua arahan batin dan persekitaran baru, dan itulah berasingan dari bahan sebenar dan pengaturcaraan sendiri. Jadi sedar juga bahawa terdapat pasti waktu pejabat yang wujud sebagai struktur sokongan. Seksyen bermula Ahad ini akan datang. Tetapi yang paling penting, jika anda rasa hanya bahawa ini bukan dunia untuk anda, menyedari bahawa ia benar-benar tidak hanya mengambil masa. Dan kalaulah tidak bagi peluang ini tahun lalu untuk saya mengambil pas kelas / gagal, secara jujur, saya tidak akan telah pun menjejakkan kaki di dalam kelas. Dan anda boleh menukar sehingga, katakan, hari Isnin kelima kursus, jadi jika anda berada di pinggir kini, menyedari bahawa bukannya kepala ke beberapa perairan yang lain sama sekali, tidak pasti mempertimbangkan hanya berubah untuk lulus / gagal. Sekali lagi, tidak benar-benar budaya ini di sini di Harvard mengambil perkara lulus / gagal sejak semua orang benar-benar mahu untuk mencapai atau overachieve, tetapi terus terang, ini adalah cara yang indah untuk mencuba sesuatu yang keluar yang mungkin tidak biasa kepada anda, dan anda akan berakhir lakukan, dalam kebanyakan kes, agak halus, mungkin banyak untuk mengejutkan anda. Dan dari segi yang lebih konkrit, apa yang saya fikir lulus / gagal umumnya tidak, terutamanya kerana anda mungkin telah mengalami dengan pset0, jika anda meletakkan dalam 10 jam, 15 jam, 25 jam ke beberapa pset dan anda hanya terhantuk kepala anda terhadap dinding dan ia mendapat super pada lewat malam tetapi anda telah mengambil pset 90% dari jalan dan anda hanya tidak dapat memikirkan satu perkara, lulus / gagal benar-benar mengambil kelebihan luar kelas seperti ini, di mana anda boleh menyusun gembira berkata, "Okay, saya tahu ia tidak sempurna, tetapi saya bekerja pantat saya mengenai perkara ini, saya cukup gembira dengan mana ia berakhir, " dan yang akan memenuhi harapan pas / gagal. Jadi jangan menyimpan bahawa dalam fikiran. Semua hak. Jadi orang-orang yang telah berjuang untuk menggunakan Universiti Harvard Wi-Fi, tahu bahawa terdapat SSID CS50, sambungan Wi-Fi, yang terapung di sekeliling bahawa anda mungkin mempunyai nasib yang lebih baik untuk. Ia adalah ironis sedikit bahawa kata laluan untuk ini, jika anda ingin mencuba untuk menyambung ke ini untuk kelajuan yang lebih baik - dan marilah kita tahu jika ia tidak baik - 12345, sepanjang jalan sehingga 8 kerana 8 adalah lebih selamat daripada 5. Jadi, jika anda memerlukan kata laluan Wi-Fi, menyambung ke CS50 tanpa wayar di sini, 12345678, dan paparkan dalam CS50 Bincangkan jika anda masih mempunyai isu penyambungan sekejap, dan kita akan membiarkan kuasa yang akan tahu untuk ruang ini. Semua hak. Jadi penggoda cepat, terutamanya bagi mereka yang peminat lelaki atau perempuan semua perkara Apple. Apa yang saya digali daripada beberapa tahun kembali fail ini di sini, iUnlock.c, hanya untuk jenis membuat lebih konkrit dan lebih kompleks beberapa program C yang lebih asas kita telah menulis. Jadi saya membuka fail ini, iUnlock.c. Ia boleh didapati pada halaman Ceramah untuk hari ini. Pada sebelah kiri anda lihat satu senarai panjang fungsi. Jadi rakan-rakan yang menulis ini menulis banyak fungsi, lebih daripada sekadar utama. Dia menggunakan sekumpulan keseluruhan perpustakaan di sini, dan jika kita mula menatal, apa ini sebenarnya adalah yang pertama, saya percaya, retak untuk iPhone asal. Apabila anda mahu untuk jailbreak iPhone asal, yang bermaksud untether daripada AT & T dan sebenarnya memasang perisian khas di atasnya dan melakukan perkara-perkara bahawa Apple tidak mahu orang untuk melakukan, seseorang mengambil masa untuk memikirkan bagaimana mereka boleh mengeksploitasi kelemahan perisian, kesilapan, pepijat, dalam perisian Apple, dan dengan itu dilahirkan iUnlock.c - bahawa jika anda disusun pada komputer anda dan dipasang ia ke bawah yang disambungkan ke komputer anda melalui, katakan, kabel USB, ini akan memberikan anda keistimewaan pentadbiran atau akar di bawah anda dan membiarkan anda lakukan cukup banyak apa sahaja yang anda mahu. Dan sebagainya telah ada ini kucing yang menarik dan permainan tetikus antara Apple dan seluruh dunia khususnya kerana mereka, seperti banyak syarikat, cuba untuk mengunci barangan mereka ke bawah supaya anda hanya boleh lakukan dengan apa yang mereka ingin. Tetapi terima kasih kepada orang-orang seperti ini dan pemahaman butiran tahap rendah - dan dalam kes ini pengaturcaraan C - dan banyak membina biasa bahawa kita telah mula bermain dengan, anda mampu untuk benar-benar memanfaatkan perkakasan dengan cara yang anda lihat patut dan tidak semestinya beberapa entiti korporat. Jadi, sebagai contoh, saya tidak mempunyai idea apa yang semua ini adalah melakukan, tetapi GetVersion kedengaran cukup mudah, dan ia kelihatan seperti ini adalah fungsi yang orang ini menulis. Ia mengambil beberapa jenis integer sebagai hujah, tidak kembali apa-apa, tetapi nampaknya gelung dengan gelung sini dan jika keadaan, jika rehat keadaan, dan entah bagaimana berkaitan dengan nombor versi jika kita tatal ke bawah, walaupun banyak kata kunci ini akan menjadi baru. Dan terdapat banyak keseluruhan fungsi di sini tidak pernah kita lihat dan mungkin tidak pernah melihat sepanjang semester. Pada akhir hari, ia mengikut peraturan yang sama dan logik bahawa kita telah bermain dengan setakat ini. Jadi ini adalah terlalu lama untuk memecahkan 3 iPhone anda atau 4s atau tidak lama lagi 5S hari ini, tetapi tahu bahawa ia semua amat berasal dari dunia ini yang kita telah menyelam ke dalam. Mari kita lihat pada contoh yang sedikit lebih mudah: yang satu ini, hanya untuk mendapatkan panas dengan sintaks tertentu dan juga beberapa jenis data lain bahawa kita telah bercakap tentang tetapi tidak benar-benar dilihat dalam C. Ini adalah fail yang dipanggil positive1.c, dan setiap komen-komen di atas, ini hanya menuntut bahawa pengguna memberikan nombor positif. Jadi ia adalah satu contoh gelung do-sementara, yang bagus untuk program pengguna interaktif di mana anda perlu untuk memberitahu pengguna untuk melakukan sesuatu, dan jika mereka tidak bekerjasama anda menjerit pada mereka atau menolak input mereka. Kes di titik: Saya akan melakukan garisan 19 melalui 24 selagi pengguna tidak memberikan saya nombor positif. Detail di sini on line 18, kenapa Saya mengaku n atas gelung ini keseluruhan membina berbanding sebelah kanan hingga 22 barisan di mana saya benar-benar peduli untuk mendapatkan n? Yeah. [Pelajar] Skop. >> Yeah, jadi isu ini skop. Dan dari segi orang biasa, apakah skop merujuk kepada? Yeah. >> [Sambutan pelajar didengar] >> Bolehkah anda bercakap sedikit lebih kuat? [Pelajar] di mana anda boleh mengakses pembolehubah yang. >> Perfect. Di mana anda boleh mengakses pembolehubah tertentu. Dan secara amnya, kemestian setakat ini telah bahawa skop beberapa pembolehubah ditakrifkan oleh pendakap kerinting yang paling terkini yang anda telah lihat. Dan demikian dalam kes ini, jika saya membuat kesilapan mengisytiharkan n on line 22, garis yang akan bekerja. Saya akan mendapat int, dan saya akan meletakkan ia ke dalam n yang berubah-ubah di baris 22, tetapi yang baris kod sekarang akan tidak mempunyai idea apa yang saya bercakap tentang? >> [Pelajar] 25. [Malan] 25, dan ia bertukar keluar 24 juga kerana dalam kes ini ia jatuh di luar daripada pendakap kerinting. Jadi hanya sedikit kacau ganggu tetapi sangat mudah diselesaikan dengan hanya mengisytiharkan pembolehubah luar fungsi sendiri. Kita akan lihat nanti hari ini anda boleh pergi satu langkah ke hadapan dan anda juga boleh mendapatkan sedikit malas. Dan ini tidak disyorkan secara umum, tetapi anda juga boleh mendapatkan malas dan meletakkan pembolehubah global, jadi untuk bercakap, tidak dalam fungsi, bukan di dalam gelung, tetapi dalam fail sendiri, luar semua fungsi anda telah ditulis, seperti yang saya lakukan di sini on line 15. Ini secara umumnya disukai, tetapi sedar ini adalah satu penyelesaian yang kadang-kadang masalah-masalah lain, kerana akhirnya kita akan melihat. Jadi sekarang kita akan meninggalkan ia seperti ini, tetapi mari kita lihat jika kita boleh menulis semula ini hanya untuk memulakan menyatakan diri kita sedikit berbeza. Program ini, hanya perlu jelas, adalah positive1. Biar saya teruskan di sini dan dalam tetingkap terminal saya membuat positive1, Masukkan. Menyusun okay. Saya akan untuk menjalankan positive1, tekan Enter. Saya menuntut bahawa anda memberi saya integer positif. Saya akan mengatakan -1. Yang tidak bekerja. 0, 99. Itu seolah-olah untuk bekerja. Mungkin tidak ujian paling ketat, tetapi sekurang-kurangnya ia adalah cek kewarasan bagus bahawa kita berada di landasan yang betul. Jadi sekarang mari saya pergi ke hadapan dan membuka versi 2 ini, dan apa yang berbeza? Ia melaksanakan perkara yang sama, tetapi apa yang melompat keluar sebagai jelas berbeza masa ini? Ini bool hijau. Ia ditonjolkan dalam hijau, kata kunci ini dikenali sebagai bool, yang merupakan jenis data. Ia tidak datang dibina dalam semua versi C. Anda perlu termasuk perpustakaan tertentu. Dalam kes kami, saya termasuk perpustakaan CS50 supaya kita mempunyai akses kepada bool. Tetapi di baris 18, kita seolah-olah mempunyai nilai Boolean sini dipanggil bersyukur. Saya boleh dipanggil apa-apa ini, tetapi saya memanggilnya bersyukur hanya untuk jenis menyampaikan beberapa makna semantik. Jadi pada mulanya on line 18, saya nampaknya tidak bersyukur kerana nilai bersyukur Boolean dimulakan palsu dalam 18 baris. Dan kemudian ia seolah-olah apa yang saya telah dilakukan di sini dalam barisan 21 melalui 23 Saya hanya jenis ditulis semula logik saya. Jadi tidak berfungsi berbeza, tetapi di baris 22 sekarang saya memeriksa jika int pengguna telah disediakan adalah lebih besar daripada 0, maka saya hanya menukar nilai berterima kasih kepada true. Dan mengapa saya berbuat demikian? Kerana di baris 25, nampaknya saya akan untuk memeriksa keadaan. Adakah gelung ini manakala bersyukur adalah palsu. Jadi saya mencadangkan ini sebagai alternatif kepada versi 1 kerana ia sekurang-kurangnya sedikit lebih intuitif mungkin, ia sedikit lebih mendalam dalam Bahasa Inggeris. Jadi melakukan perkara-perkara berikut semasa anda tidak bersyukur atau sementara bersyukur adalah palsu. Dan masa ini juga saya nampaknya tidak ingati apa yang pengguna ditaip dalam kerana notis tidak ada n ubah, jadi sebenarnya, satu pembohongan putih sedikit di sana. Fungsi, program ini adalah sedikit berbeza sekali kita sampai kepada bahagian bawah ia kerana saya tidak mengingati apa yang n. Tetapi saya mahu untuk menunjukkan di sini juga bahawa walaupun kita telah melihat GetInt dan GetString yang digunakan di sebelah kanan satu tanda sama setakat supaya kita ingat nilai teknikalnya, yang tidak tegas perlu. Jika atas apa jua sebab anda hanya tidak peduli untuk menyimpan nilai, anda hanya mahu untuk memeriksa nilai, notis bahawa kita hanya boleh menulis ini sebagai GetInt, terbuka paren, paren rapat. Bahawa fungsi akan kembali nilai, seperti yang kita telah berkata. Ia akan memberi anda kembali int. Dan jadi jika anda mental memikirkan perkara ini berlaku, apabila saya menaip dalam 99, GetInt mengembalikan nombor 99, dan sebagainya konsep, ia seolah-olah kod saya sebenarnya ini. Jadi, jika 99 memang lebih besar daripada 0, maka bersyukur menjadi benar, maka garis 25 sedar aduh, kita lakukan kerana saya kini bersyukur, dan di baris 26, kita hanya berkata, "Terima kasih kerana integer positif!" apa yang ia berlaku untuk menjadi. Sekarang mari kita buat gula sintaktik sedikit di sini, jadi untuk bercakap. Mari kita lihat jika kita boleh membersihkan 25 ini selaras dengan varian ini ketiga dan terakhir dalam positive3. Notis-satunya perbezaan sekarang ialah apa baris kod? >> [Pelajar] 25. >> [Malan] Yeah, 25. Dan kita telah tidak benar-benar melihat silap mata ini sahaja lagi, tetapi kita tidak melihat tanda seru pada hari Isnin, yang menandakan apa? >> [Pelajar] Tidak. >> Tidak atau penafian. Jadi mengambil nilai Boolean dan flip nilainya. Benar menjadi palsu, palsu menjadi benar. Jadi ini, saya akan mencadangkan, walaupun sedikit lebih intuitif cara menulis kod kerana saya masih memulakan berterima kasih kepada palsu, saya masih melakukan perkara-perkara berikut, Saya menetapkan berterima kasih kepada true apabila tiba masanya, tetapi kini anda boleh benar-benar hanya menterjemahkan kod ini secara lisan kiri ke kanan, sementara (bersyukur); kerana bang atau titik seru menandakan tanggapan tidak, jadi sementara tidak bersyukur. Jadi sekali lagi, kita tidak memperkenalkan sebarang konsep baru per se. Kita bercakap tentang Booleans kembali apabila kita bermain dengan Scratch, tetapi sedar sekarang kita hanya boleh mula menulis kod kita dalam pelbagai cara. Jadi, terutamanya dalam pset1 jika anda jenis berjuang untuk memikirkan cara untuk menulis beberapa program, kemungkinan adalah anda berada dalam nasib kerana ada boleh menjadi apa-apa bilangan penyelesaian bahawa anda boleh berlaku ke atas. Sebagai contoh, ini adalah hanya 3 bagi walaupun yang paling mudah program. Semua hak. Dan sekarang ingat pada hari Isnin kita meninggalkan pada nota ini dengan nilai-nilai kembali. Jadi untuk kali pertama kita menulis satu program yang tidak hanya mempunyai utama; ia juga mempunyai fungsi tersendiri adat yang saya tulis di sini. Jadi di baris 31 melalui 34 saya telah melaksanakan fungsi kiub. Ia tidak kompleks. Ia hanya * a * a dalam kes ini. Tetapi apa yang penting mengenainya adalah bahawa saya mengambil input dalam bentuk dan saya kembali output dalam bentuk * a * a. Jadi sekarang saya mempunyai keupayaan, banyak seperti saya digunakan dengan prinf sahaja, untuk memanggil fungsi ini dengan memanggil fungsi kiub. Dan fungsi kiub mengambil beberapa input, dan fungsi kiub kembali output beberapa. Sebaliknya, printf hanya melakukan sesuatu. Ia tidak kembali apa-apa yang kita mengambil berat tentang, walaupun sebagai selain ia tidak memulangkan nilai; anda hanya umumnya mengabaikan ia. Printf hanya melakukan sesuatu. Ia mempunyai kesan sampingan percetakan skrin. Sebaliknya di sini, kita mempunyai fungsi kiub, yang sebenarnya mengembalikan sesuatu. Jadi bagi mereka yang biasa dengan ini, ia adalah satu idea yang agak mudah. Tetapi bagi mereka yang kurang biasa dengan idea ini lulus dalam input dan mendapatkan kembali output, mari kita cuba hanya sesuatu yang mudah super. Adakah sesiapa yang selesa datang di atas pentas secara ringkas? Anda perlu menjadi selesa dengan kamera pada anda juga. Yeah? Okay. Apa nama anda? >> [Pelajar] Ken. >> Ken. Semua hak. Ken, datang ke atas. Ken akan menjadi fungsi kejayaannya di sini. Mari kita pergi ke hadapan dan melakukan ini. Mari kita mendapat mewah sedikit. Nice to meet you. Selamat datang ke peringkat pusat. Semua hak. Mari kita memukul butang ini di sini. Semua hak. Jadi di sini anda mempunyai papan hitam moden, dan apa yang saya adalah fungsi utama, misalnya, dan saya tidak mempunyai iPad dalam tangan saya. Saya tidak benar-benar ingat bagaimana untuk - Baiklah, saya tidak boleh mengatakan bahawa. Saya tidak benar-benar mempunyai tulisan tangan yang baik, dan sebagainya Oleh itu, saya mahu anda untuk mencetak sesuatu pada skrin bagi saya. Saya menjadi program utama, dan saya akan mempunyai anda mengatakan ini dengan menulis dalam calar ayam saya dan kemudian lulus anda input. Jadi bodoh walaupun latihan ini adalah, konsep fungsi dan memanggil fungsi dan mengembalikan fungsi benar-benar bisul turun ini. Saya utama, saya baru sahaja menulis printf, quote-unquote sesuatu pada skrin, Saya menjalankan program ini, dan secepat printf mendapat dipanggil, ia mengambil masa satu hujah atau satu parameter kadang-kadang antara petikan berganda. Berikut adalah hujah itu. Saya lulus ia ke Ken. Beliau adalah kotak hitam menulis beberapa beberapa tahun yang lalu yang nampaknya hanya tahu bagaimana untuk mencetak perkara pada skrin. Jadi melaksanakan. Itu bukan buruk. Sangat baik. Jadi sekarang Ken dilakukan melaksanakan. Adakah dia perlu menyerahkan saya kembali apa-apa? Tidak bahawa kita telah melihat setakat ini. Sekali lagi, printf tidak sebenarnya mengembalikan nombor, tetapi kita akan mengabaikan bahawa buat masa sekarang kerana kita tidak pernah digunakan. Jadi itulah untuk Ken. Dan jadi sekarang utama mengambil alih kawalan program lagi kerana bahawa baris kod, printf, dilakukan melaksanakan. Dan kita pergi tentang cara kami, melaksanakan apa jua garisan lain terdapat. Jadi sekarang mari kita cuba satu contoh yang sedikit berbeza. Kali ini di sini mari kita mula-mula mengosongkan skrin, dan kali ini kita akan melakukan fungsi cubing, tetapi kali ini, saya menjangkakan nilai output. Jadi mari kita pergi ke hadapan dan melakukan ini. Kini saya mempunyai satu baris kod yang mengatakan x mendapat kiub x. Baris kod, ingat, kelihatan seperti ini: x = kiub (x); Jadi bagaimana ini akan bekerja? Mari kita pergi ke hadapan dan memberikan anda skrin putih lagi. Saya akan menulis sekarang nilai x, yang pada masa ini dalam masa yang berlaku kepada menjadi, katakan, 2 untuk memastikan ia mudah. Saya telah diturunkan pada sehelai kertas nilai 2, yang merupakan nilai x saya. Saya menyerahkannya kepada Ken. >> Dan saya hanya menulis jawapannya? >> Yeah, mari kita hanya menulis jawapannya. Okay. Dan kini dia telah kembali saya sesuatu. Sempurna. Nice segue. Jadi sekarang dia tangan saya kembali nilai 8 dalam kes ini, dan apa yang saya lakukan dengan ia? Sebenarnya - mari kita lihat, mendapatkan hak ini. Apa yang saya akan lakukan dengan ia? Sekarang saya akan mengambil nilai ini dan sebenarnya menyimpan dalam bit-bit yang sama dalam ingatan. Tetapi notis aku jenis berjuang di sini. Saya sedikit keliru kerana di mana saya sebenarnya menulis nilai x, kerana apa yang saya baru sahaja dilakukan adalah fizikal tangan Ken sekeping kertas yang mempunyai nilai 2, yang x, dan sesungguhnya, itulah sebenarnya apa yang berlaku. Jadi ternyata bahawa apabila anda memanggil fungsi dan anda lulus dalam hujah seperti hello, dunia atau anda lulus dalam hujah seperti 2, secara amnya, anda lulus dalam salinan hujah itu. Dan sebagainya hanya kerana saya menulis nombor 2 di sini dan menyerahkan kepada Ken, yang mesti bermakna bahawa saya masih mempunyai salinan nilai 2 tempat kerana sesungguhnya, sekarang bahawa saya telah mendapat kembali nilai 8, saya perlu kembali dalam RAM dan sebenarnya menulis 8 di mana saya pernah nombor 2. Jadi visual, ingat ini tanggapan lulus di, secara literal, salinan nilai. Ken tidak perkara itu, tangan saya kembali sesuatu - dalam kes ini nilai seperti 8 - dan kemudian saya perlu melakukan sesuatu dengan nilai yang jika saya mahu memastikan ia sekitar. Jadi semua ini akan kembali untuk menjadi semua terlalu biasa tidak lama lagi. Thank you so much untuk demo ini di sini, Ken. [Tepukan] Sangat baik dilakukan. Mari kita lihat bagaimana yang akhirnya berkaitan dengan beberapa fungsi memanggil yang kita telah lakukan di sini. Biar saya pergi ke hadapan dan membawa kita kembali kepada contoh cubing di sini. Notis bahawa jika kita mahu sebenarnya mula mengambil ini dengan lebih lanjut, kita akan mempunyai untuk menjadi sedar akan hakikat bahawa x nombor yang sedang berlalu di sini adalah berbeza daripada apa yang sebenarnya diluluskan untuk fungsi. Jadi sekali lagi, ini lulus dengan salinan akan menjadi agak yg dalam hanya seketika. Mari kita melihat sesuatu yang tidak cukup berfungsi dengan betul lagi. Saya akan pergi ke hadapan dan membuka contoh kereta ketiga, yang cacat oleh alam semula jadi, dan ia dipanggil buggy3 dan ia melaksanakan fungsi bertukar-tukar. Di sini kita mempunyai fungsi utama yang telah x dan y sewenang-wenangnya dimulakan untuk 1 dan 2, masing-masing. Kita boleh menggunakan GetInt, tetapi kita hanya perlu senaman mudah, jadi ia adalah keras berkod sebagai 1 dan 2. Dalam baris 21 dan 22, kita nampaknya mencetak x dan y, 1 per baris. Kemudian on line 23, saya mendakwa saya bertukar-tukar nilai-nilai ini, dot, dot, dot. Saya nampaknya memanggil fungsi dalam barisan 24 swap dipanggil yang mengambil masa 2 hujah. Ia benar-benar legit untuk fungsi untuk mengambil 2 hujah. Kami telah melihat printf melakukannya sudah. Jadi swap nampaknya mengambil x dan y, dan seperti namanya, Saya berharap bahawa ia akan menukar ini 2 nilai. Jadi maka saya menuntut on line 25 "bertukar!" dan saya mencetak semula x dan y di bawah andaian bahawa mereka telah memang telah bertukar. Tetapi jika saya benar-benar menjalankan program ini - izinkan saya membuka tetingkap terminal, izinkan saya membuat buggy3 - seperti namanya, ini tidak akan berakhir dengan baik kerana apabila saya tekan Enter, notis bahawa x ialah 1, y 2, dan lagi pada akhir program, mereka masih, pada hakikatnya, sama. Jadi berdasarkan demonstrasi tadi dengan Ken, apa yang sebenarnya berlaku? Mari kita menyelam ke dalam fungsi swap ini. Ia adalah super pendek. Ia hanya beberapa baris kod lama. Tetapi apa masalah asas yang berdasarkan cerita mudah memberitahu di sini dengan Ken? Mengapa swap rosak? [Pelajar] Anda menyimpan salinan, bukan pembolehubah. Tepat sekali. Kami menyimpan salinan, bukan pembolehubah sendiri. Dalam erti kata lain, swap nampaknya mengambil masa 2 hujah, int, dan ia sewenang-wenangnya dipanggil a dan b, dan di sini saya telah lulus dalam x dan y, yang masing-masing 1 dan 2, tetapi saya tidak benar-benar lulus dalam x, saya tidak benar-benar lulus dalam y, Saya lulus satu salinan x dan salinan y. Ia hampir seolah-olah anda disalin dan ditampal ke dalam swap nilai-nilai yang anda mahu ia untuk benar-benar memanipulasi. Jadi, jika itulah kes, apabila saya permulaan program yang melaksanakan garis 35 kemudian 36, apabila saya sampai ke garis 37, pada ketika ini dalam cerita, apakah nilai? Pada ketika ini dalam cerita, line 37, apakah nilai pada ketika ini? >> [Pelajar] 1. [Malan] Ia hanya perlu 1, betul, kerana x telah diluluskan pada sebagai hujah pertama, dan fungsi ini hanya sewenang-wenangnya memanggil hujah pertama. Begitu juga adalah y Hujah kedua, dan ia hanya sewenang-wenangnya memanggil b hujah kedua. Dikotomi ini sebenarnya agak hanya dijelaskan. Fikirkanlah. Tiada seorang pun daripada kami telah bertemu dengan orang yang menulis printf, begitu pasti, dia tidak mempunyai idea apa pembolehubah kami 30 tahun kemudian akan dipanggil. Jadi perlu ada perbezaan antara apa yang anda memanggil pembolehubah dalam fungsi anda menulis dan apa yang anda memanggil pembolehubah dalam fungsi anda memanggil atau menggunakan. Jadi dalam erti kata lain, saya telah menulis pembolehubah saya sebagai x dan y, tetapi jika orang lain telah ditulis fungsi swap, dia pasti tidak akan tahu apa pembolehubah saya akan dipanggil, jadi sedar bahawa ini adalah mengapa anda mempunyai dualiti nama. Secara teknikalnya, saya boleh melakukan ini secara kebetulan, tetapi mereka masih akan lulus sebagai salinan. Ia hanya akan menjadi satu kebetulan tulen estetik jika bahawa orang yang menulis swap telah menggunakan nama yang sama. Jadi pada ketika ini dalam cerita, line 37, adalah 1, b ialah 2, dan kini saya meneruskan untuk menukar mereka. Pertama sekali, izinkan saya sebenarnya melakukan ini lebih hanya. Saya tidak tahu apa yang mereka 3 baris kod telah lakukan. Biar saya hanya melakukan ini: b = a; a = b; dilakukan. Mengapa ini pecah, secara logiknya? Ia adalah jenis perkara yang intuitif, bukan? Jadi menjadi b dan b menjadi, tetapi masalahnya ialah bahawa secepat line 37 melaksanakan, apa nilai a dan b? Yang sama, 1, kerana anda telah clobbered, jadi untuk bercakap, anda telah berubah b menyamai. Jadi, apabila talian 37 telah dilaksanakan, yang hebat, anda kini mempunyai 2 salinan nombor 1 dalam fungsi ini, maka apabila kamu katakan dalam 38 baris a = b, anda jenis diskru kerana anda hanya memberikan 1-1. Anda telah jenis kehilangan nilai yang anda mengambil berat tentang. Jadi, dalam versi asal ini, notis apa yang saya lakukan. Saya bukannya mempunyai barisan ketiga kod yang kelihatan seperti ini. Saya mengisytiharkan pembolehubah sementara. Tmp adalah nama yang sangat biasa bagi pembolehubah sementara, dan ia adalah int kerana ia mempunyai untuk memadankan apa yang saya mahu untuk membuat salinan. Saya menyimpan salinan dalam satu tmp, jadi sekali talian 37 telah disempurnakan, nilai a adalah - cek kewarasan cepat - 1, nilai b 2, dan nilai tmp juga 1. Jadi sekarang saya melaksanakan garis 38. Setelah barisan 38 melaksanakan, mengambil pada nilai b. Dan b adalah 2, jadi kini 2. Jadi pada ketika ini dalam cerita, adalah 2, b 2, dan tmp adalah 1, jadi sekarang secara logik, kita boleh nilai hanya tmp mencebur ke b dan kami sudah selesai. Jadi kita telah menyelesaikan masalah itu. Malangnya, apabila saya menjalankan program ini di dalam borang ini, ia tidak sebenarnya menukar sebarang nilai. Tetapi untuk menjadi jelas, mengapa? Saya tetap masalah logik daripada hanya seketika lalu, tetapi sekali lagi, jika saya menjalankan program ini, x dan y kekal tidak berubah menjelang akhir pelaksanaan program. [Komen pelajar didengar] >> Kami telah tidak dikembalikan apa-apa, jadi yang benar. Tetapi ternyata ada sedikit masalah di sini kerana setakat ini, satu-satunya perkara yang kita telah dapat kembali adalah satu perkara, dan ini adalah sekatan C. Anda hanya boleh kembali benar-benar satu nilai, di mana saya jenis yang terperangkap di sini kerana saya dapat kembali nilai baru x atau saya boleh memulangkan nilai baru y, tetapi saya mahu kedua-dua belakang. Jadi kembali tidak penyelesaian yang mudah di sini. Tetapi masalah yang asasnya ialah, mengapa? Apa yang telah kita sebenarnya bertukar? [Pelajar] a dan b. >> A dan b. Tetapi a dan b adalah salinan x dan y, yang bermakna kita hanya melakukan semua kerja-kerja ini, kita hanya menghabiskan masa selama 3 minit bercakap tentang fungsi swap dan semua 3 pembolehubah ini, dan yang hebat, sempurna betul dalam pengasingan, tetapi dan skop b sahaja dalam ayat-ayat ini di sini. Jadi seperti gelung, jika anda mengisytiharkan integer i dalam gelung, begitu juga, jika anda sedang mengisytiharkan a dan b dalam fungsi yang anda telah ditulis, mereka hanya dalam sah fungsi itu, yang bermakna secepat swap dilakukan melaksanakan dan kita pergi dari 24 baris ke baris 25, x dan y tidak pernah berubah sama sekali. Anda hanya membazirkan banyak keseluruhan masa bertukar-tukar salinan pembolehubah. Jadi ternyata bahawa penyelesaian untuk ini sebenarnya tidak jelas. Ia bukan agak mencukupi untuk mengembalikan nilai kerana kita hanya boleh kembali 1 nilai, dan saya benar-benar mahu untuk menukar kedua-dua x dan y pada masa yang sama, jadi kita akan perlu kembali kepada ini. Tetapi untuk sekarang, menyedari bahawa isu asasnya berasal dari fakta bahawa a dan b adalah salinan dan mereka berada dalam skop mereka sendiri. Mari kita cuba untuk menyelesaikan masalah ini dalam beberapa cara. Biar saya sebenarnya tatal kembali ke sini dan membuka, katakan, varian keempat ini, buggy4. Bagaimana tentang perkara ini? Ini adalah masalah yang serupa tetapi lebih mudah untuk melihat sebelum kita mengambil menikam menyelesaikan ia. Program ini dipanggil kenaikan, dan ia nampaknya initializes integer x 1 di baris 18. Saya kemudian mendakwa x ialah 1, saya kemudiannya mendakwa "incrementing ..." Saya kemudian memanggil kenaikan, tetapi kemudian dalam baris 22 dan 23, saya mendakwa ia telah incremented, Saya mendakwa x ialah kini apa sahaja ia adalah - 2, mungkin - tetapi program ini adalah kereta. Apa masalah? Yeah. >> [Sambutan pelajar didengar] >> Tepat sekali. Jadi x telah diisytiharkan, jelas, on line 18. Itu adalah di dalam pendakap kerinting utama. Jadi jawapan yang mudah di sini adalah bahawa manakala x wujud di sini, ia tidak wujud di baris 32, jadi program ini sebenarnya bahkan tidak akan menyusun. Pengkompil apabila saya cuba menyusun kod ini akan menjerit pada saya tentang beberapa pengecam yang tidak diisytiharkan atau sesuatu yang bermaksud sedemikian. Malah, mari kita cuba. Ini adalah membuat buggy4. Sana ia. Penggunaan 'x' pengecam tidak diisytiharkan di baris 32. Dan sebenarnya, mari kita menjadi lebih jelas di sini hari ini supaya ini adalah berguna dalam waktu pejabat dan di rumah. Perhatikan bahawa ia adalah sedikit cryptically ditulis. Tetapi hakikat bahawa mempunyai dilafaz menjerit pada kami, mengatakan buggy4.c: 32:5, sebenarnya adalah berguna. Ia bermakna bahawa kesilapan adalah pada 32 baris pada kedudukan watak 5. Jadi 1, 2, 3, 4, 5. Itulah, sebenarnya, mana masalah ini. Dan juga, terlalu, ingat pada waktu pejabat dan di rumah, saya bernasib baik di sini. Saya mempunyai satu kesilapan. Ia akan menjadi agak mudah untuk menetapkan. Tetapi jika anda mendapat skrin sepenuh mesej ralat hangat, lagi menyedari bahawa satu panhandle hanya mungkin gejala satu teratas. Jadi sentiasa mengejar turun bug anda dari atas ke bawah kerana terdapat hanya mungkin kesan rantaian daisy yang mencadangkan anda mempunyai cara yang lebih banyak masalah daripada anda sebenarnya lakukan. Jadi bagaimana kita boleh memperbaiki ini jika matlamat saya adalah untuk kenaikan x? >> [Pelajar] Buat x global. Okay, jadi kita boleh membuat x global. Mari kita mengambil jalan pintas yang saya memberi amaran tentang awal, tetapi palang pintu, kita hanya perlu cepat, jadi mari kita hanya mengatakan x int di sini. Itu membuatkan x global. Jadi sekarang utama mempunyai akses kepada dan kenaikan telah akses kepada, dan sebagainya biarlah saya pergi ke hadapan dan menyusun ini sekarang. Buat buggy4, Enter. Nampaknya untuk menyusun sekarang. Mari kita menjalankan buggy4. Dan ia seolah-olah benar-benar bekerja. Ini adalah salah satu daripada perkara-perkara itu melakukan seperti yang saya katakan, tidak seperti yang saya lakukan, kerana saya baru sahaja dilakukan di sini, kerana secara umum, program kami akan mendapat lebih menarik dan lebih lama daripada ini, dan jika penyelesaian untuk masalah hidup hanya meletakkan semua pembolehubah di atas fail anda, sangat cepat program mendapatkan horrifically sukar untuk menguruskan. Ia mendapat sukar untuk berfikir sehingga nama-nama pembolehubah baru, ia menjadi sukar untuk memahami apa ubah melakukan apa, dan sebagainya secara umum, ini tidak merupakan penyelesaian yang baik. Jadi mari kita buat ini lebih baik. Kita tidak mahu menggunakan pembolehubah global di sini. Saya tidak mahu untuk kenaikan x, jadi saya dapat jelas - pada akhir hari, ini adalah jenis cerita bodoh kerana kita hanya melakukan ini - tetapi jika saya tidak tahu tentang pengendali itu atau saya tidak dibenarkan untuk menukar dalam utama itu sendiri, bagaimana lagi saya boleh melaksanakan Ken di sini masa ini tidak kiub tetapi untuk kenaikan? Bagaimana saya boleh mengubah perkara ini di sini? Yeah. [Pelajar] Lulus dalam x dan kemudian kembali [didengar] >> Okay, baik. Jadi mengapa tidak saya lulus dalam x dan kemudian bukannya kembali, kenapa saya tidak hanya kembali x + 1. Satu pasangan lebih banyak perkara perlu mengubah di sini. Saya pada landasan yang betul. Apa lagi yang saya perlukan untuk tweak? Orang lain. Yeah. [Sambutan pelajar didengar] Saya perlu untuk menukar jenis pulangan kenaikan kerana ia tidak membatalkan. Terbatal tiada bermakna dipulangkan, tetapi jelas kini ia adalah, jadi ini keperluan untuk menukar kepada - >> [pelajar] int. int untuk menjadi konsisten dengan apa sahaja yang saya sebenarnya kembali. Kini sesuatu yang lain masih kereta di sini. Yeah. [Sambutan pelajar didengar] >> [Malan] Jadi saya perlu kenaikan x? [Sambutan pelajar didengar] >> [Malan] Ah, jadi saya perlu untuk lulus x. Jadi saya perlu melakukan ini di sini. >> [Komen pelajar didengar] [Malan] Jadi prototaip, saya perlu menukar ini di sini. Jadi ini telah menjadi int, ini telah menjadi - hmm, saya sebenarnya mempunyai pepijat ke sini. Mari kita menetapkan ini yang pertama. Apakah yang perlu ini sebenarnya? Ia mendapat untuk menjadi sesuatu int. Ia boleh x, tetapi terus terang, jika anda mula memanggil semua x pembolehubah anda, ia akan mendapat kurang dan kurang jelas yang mana. Jadi mari kita hanya sewenang-wenangnya memilih konvensyen penamaan yang berbeza untuk fungsi pembantu saya, fungsi Saya menulis. Kami akan memanggilnya, atau kita boleh memanggil ia - Mari kita memanggilnya nombor untuk menjadi lebih jelas. Jadi maka saya perlu kembali apa jua nombor campur 1, dan kini saya mempunyai untuk menukar 1 perkara lain di sini dan satu perkara lain di sini. Apa yang saya perlu untuk menukar pada 21 baris pertama? >> [Sambutan pelajar didengar] [Malan] saya perlu sediakan x. Saya tidak boleh hanya memanggil kenaikan (x). Saya perlu ingat jawapan dengan menukar nilai x di sebelah kiri. Dan walaupun x kini di kiri dan kanan, yang benar-benar halus kerana sebelah kanan mendapat dilaksanakan terlebih dahulu kemudian mendapat plopped ke dalam perkara kiri - x dalam kes ini. Dan kemudian akhir sekali, ini adalah menetapkan yang mudah sekarang. Ini hanya perlu menandingi apa yang turun di bawah, beberapa int. Jadi sekumpulan keseluruhan perubahan untuk fungsi benar-benar bodoh tetapi wakil-wakil daripada perkara-perkara yang kita semakin akan mahu lakukan. Supaya membuat buggy4. Saya diskrukan sehingga suatu tempat. Oh, Tuhan saya. Lima kesilapan dalam program 6-line. Jadi apa yang salah on line 18, watak 5? Jadi saya perlu mengisytiharkan int, ini. Mari kita lihat. Terdapat sekumpulan keseluruhan kesilapan lain. Oh, Tuhan saya - 19, 18, 21 - tetapi sekali lagi, mari kita hanya mengosongkan skrin, L Kawalan di sini, dan memutarkan dilafaz. Jadi 5 masalah ini adalah sebenarnya hanya bahawa 1. Jadi sekarang mari kita menjalankan buggy4, Enter. Huh, x telah incremented betul. Semua hak. Sebarang pertanyaan mengenai bagaimana untuk menokokkan nombor? Yeah. [Soalan pelajar didengar] >> Soalan yang baik. Bagaimana ia bahawa saya hanya boleh menukar x ke nombor dan program akan tahu dengan serta-merta? Sekali lagi, fikirkan ia sebagai abstraksi ini. Jadi jika saya utama dan Ken adalah kenaikan, terus-terang, saya tidak peduli apa Ken panggilan iPad beliau. Saya tidak peduli apa yang dia memanggil apa-apa yang mempunyai kaitan dengan pelaksanaan fungsi ini. Ini adalah terperinci pelaksanaan bahawa, saya yang utama, tidak perlu mengambil berat tentang. Dan sebagainya hanya menukar secara konsisten dalam fungsi - nombor di sini dan nombor di sini - adalah semua ia mengambil masa begitu lama seperti yang saya susun semula. Ia adalah jenis seperti jika anda berfikir tentang ramai daripada kita, anda dengan lesen memandu yang telah didorong atau jika anda telah pun dipandu dalam kereta, kebanyakan kita tidak mempunyai idea bagaimana sebuah kereta berfungsi di bawah hood. Dan benar-benar, jika anda membuka hud, kebanyakan kita - termasuk saya sendiri - tidak akan benar-benar tahu apa yang kita sedang melihat, jenis seperti anda mungkin merasakan dengan barangan seperti hak ini sekarang. Tetapi kita tidak benar-benar perlu untuk menjaga bagaimana kereta itu berfungsi, kita tidak perlu peduli apa yang semua rod dan omboh dan kabel di dalam kereta sebenarnya lakukan. Jadi sesuatu seperti apa yang anda panggil omboh tidak kira di sini dalam kes ini. Idea yang sama. Yeah. >> [Soalan pelajar didengar] Jika terdapat lebih banyak kegunaan masa xa ubah yang lalu, anda, pengaturcara, akan mempunyai untuk menukar mereka di mana-mana. Atau anda benar-benar boleh melakukan File, Menu, dan kemudian Cari, Ganti - sesuatu seperti itu - tetapi anda akan perlu untuk membuat perubahan-perubahan sendiri. Anda perlu konsisten. >> [Pelajar] Jika terdapat pelbagai pembolehubah [didengar] Sesuatu perintah tertentu seperti sini, jika ini adalah int nombor lain? >> [Pelajar] yang betul. [Malan] Yeah. Perintah perkara apabila anda memanggil fungsi. Jadi, jika saya telah memanggil kenaikan di sini dengan sesuatu koma sesuatu, ada pemetaan langsung. Pembolehubah pertama, apa sahaja yang ia dipanggil, dibuat salinan hujah yang pertama di sini. Maaf. Ini tidak seharusnya kurungan. Hujah barisan kedua dengan satu kedua. Jadi perintah, ya, perkara-perkara. Semua hak. Maaf. Saya mengambil cara yang lama untuk sampai ke sana. Soalan-soalan lain? Semua hak. Jadi mari kita lihat jika kita tidak dapat gambaran apa yang sebenarnya berlaku di sini di bawah hood, jadi untuk bercakap. Ini ialah sebuah segiempat tepat yang mungkin mewakili memori komputer anda. Malah jika anda tidak mempunyai idea bagaimana memori berfungsi atau bagaimana kerja-kerja RAM, sekurang-kurangnya menganggap bahawa anda mempunyai tandan ia hari ini. Anda telah mendapat megabait, anda telah mendapat gigabait, dan kita tahu dari 0 minggu yang bait hanya apa? >> [Pelajar] 8 bit. 8 bit, bukan? Jadi 8 sifar dan 1. Jadi, jika komputer anda mempunyai persembahan RAM, 2 gig RAM pada hari ini, anda mempunyai bilion atau 2 bilion bait memori atau kira-kira 8000000000 atau 16 bilion bit di dalam komputer anda. Berbeza dengan contoh Willy sedikit tdk jelas, ia bukan zarah magnet biasanya lagi. Semakin dalam komputer riba sekurang-kurangnya - ia adalah pemacu keadaan pepejal, SSDs, yang hanya tidak mempunyai bahagian yang bergerak. Ia adalah semua elektronik. Ia adalah semua berasaskan elektrik. Jadi berfikir segi empat ini sebagai hanya mewakili 1 atau 2 gigabait memori yang anda ada. Jadi ia adalah sebahagian memori. Dunia sains komputer telah jenis dibahagikan ketulan ingatan untuk melakukan perkara-perkara yang berbeza. Sebagai contoh, jika ini adalah RAM komputer anda, seperti yang dicadangkan oleh segiempat tepat di sana, ia ternyata bahawa oleh konvensyen, di atas RAM anda, jadi untuk bercakap, secara umumnya apa yang dipanggil segmen teks. Mereka adalah 0 dan 1s bahawa anda telah kumpulkan. Jadi, apabila kita telah melihat di bawah hood pada apa yang a.out adalah, semua ini 0 dan 1s, apabila anda menjalankan program, mereka 0s dan 1s dimuatkan dari cakera keras anda ke dalam sesuatu yang dinamakan RAM, dan RAM mereka meletakkan di atas. Sementara itu, anda mempunyai perkara-perkara lain: memulakan data, uninitialize data. Mereka 2 swaths ingatan merujuk kepada pembolehubah global, yang anda tidak sering menggunakan tetapi kadang-kadang jika anda lakukan, mereka akhirnya di sana juga. Kemudian terdapat beberapa perkara lain: pembolehubah persekitaran, yang kita tidak akan banyak menghabiskan masa di, tetapi kemudian 2 perkara penting yang akan datang kembali sepanjang semester, timbunan dan longgokan. Jadi kebanyakan memori komputer anda dikhaskan apabila menjalankan program untuk sesuatu yang dipanggil timbunan dan sesuatu yang dipanggil timbunan itu. Kami tidak akan bercakap mengenai timbunan itu hari ini, tetapi kita akan bercakap tentang timbunan. Timbunan yang dimaksudkan untuk nampak visual dulang makan dewan makan di Mather House atau di mana-mana jua anda berada di mana kakitangan dewan makan membersihkan mereka setiap hari, mereka timbunan mereka dari lantai sehingga, dan begitu juga, dalam ingatan, terdapat idea ini meletakkan sesuatu pada timbunan, meletakkan sesuatu pada timbunan, meletakkan sesuatu pada timbunan. Dan apa yang kita maksudkan dengan ini? Mari kita zoom di atas hanya separuh lebih rendah daripada gambar ini, RAM komputer anda, untuk mencadangkan perkara-perkara berikut. Ia ternyata bahawa apabila anda menjalankan program seperti a.out atau hello - apa jua program yang anda telah ditulis - lagi, mereka 0 dan 1s dimuatkan dari cakera keras anda, yang merupakan storan jangka panjang, tetap ada walaupun apabila anda tarik plag, dimuatkan ke dalam RAM. RAM adalah lebih cepat daripada cakera keras - ia adalah lebih kecil daripada cakera keras - tetapi ia adalah di mana program-program hidup semasa anda menjalankan mereka. Jadi anda klik dua kali program pada Mac atau PC, ia dimuatkan dari cakera keras ke dalam RAM. Sebaik sahaja ia dimuatkan ke dalam RAM, pergi 0s dan 1s di atas jalan, segmen kononnya teks, tetapi kemudian secepat program anda sebenarnya bermula berjalan, Fungsi utama dipanggil, dan utama, seperti yang kita telah melihat, sering mempunyai pembolehubah tempatan, dan ia mempunyai ints dan rentetan dan aksara dan sebagainya. Jadi, jika program anda yang telah bertulis atau program yang anda telah mengklik dua kali digunakan beberapa pembolehubah dalam utama, mereka akhirnya pada bawah timbunan anda memori, jadi untuk bercakap. Lebih kukuh, apakah ini sebenarnya bermakna? Ini hanya bermaksud bahawa jika kita telah pergi ke nombor bait RAM dalam komputer anda, notis bahawa ini mungkin bilangan bait 0, ini mungkin bilangan bait 1, 2, 3, 4, 5, 6, semua jalan sehingga kepada 2 bilion akan semua cara sehingga ada di bahagian atas. Jadi, dalam erti kata lain, apabila kita bercakap tentang RAM atau ingatan dari segi bait, ia hanya bermaksud bahawa seseorang telah memutuskan apa yang bilangannya setiap mereka ketulan memori. Jadi apabila anda perlukan 32 bit untuk int atau anda memerlukan 8 bit untuk char, di mana mereka akhirnya dalam ingatan? Konsepnya, mereka hanya berakhir di bawah perkara ini dipanggil timbunan. Tetapi apa yang menarik sekarang ialah apabila utama panggilan fungsi - andaikan satu fungsi yang dipanggil foo, hanya nama arbitrari - apa yang berlaku yang utama adalah di bahagian bawah timbunan ini memori; foo kini diletakkan di atas utama dalam ingatan. Jadi mana-mana pembolehubah tempatan yang foo telah berakhir jenis konsep atas mereka yang utama. Jika foo panggilan lagi fungsi yang dipanggil bar, pembolehubah-pembolehubah berakhir di sini. Jika bar menyeru sesuatu yang lain, di sini, di sini, di sini. Jadi apa yang menarik tentang menjalankan program adalah bahawa anda memanggil fungsi dan sebagai fungsi panggilan fungsi dan seperti fungsi panggilan fungsi, anda membina ini timbunan fungsi dalam ingatan. Dan hanya sekali pulangan fungsi manakah anda mula mendapat memori yang kembali. Jadi salah satu cara paling mudah kehabisan memori dalam program komputer adalah untuk menulis fungsi yang tidak pernah kembali. Jadi, sebagai contoh, mari kita menunjukkan seberapa banyak dengan program yang sengaja kereta. Biar saya pergi ke hadapan dan # include , int utama (tidak sah), dan saya akan lakukan manakala (2> 1), yang mungkin akan tidak pernah berubah kepada kami, dan biarkan saya pergi ke hadapan sekarang dan melakukan printf. Sebenarnya, itu akan menjadi kurang menarik visual. Mari kita melakukan ini. Untuk int i = 0; i> 0 - mari kita membuat kesilapan ini - i + +. Dan jangan printf sini. Mari kita mengamalkan apa yang saya telah berkhotbah. Mari kita mempunyai kaedah di sini, korus terbatal, dan kami akan mengatakan int i, dan kemudian saya akan mengatakan printf - tidak, mari kita membuat ini lebih menarik. Mari kita sebenarnya tidak mencetak apa-apa pada semua. Mari kita hanya melakukan ini: korus (i). Semua hak. Jadi ini adalah kereta kerana mengapa? Saya membuat ini sebagai saya pergi kerana program sebenarnya tidak berbuat apa-apa kepentingan. Tetapi itu bukan matlamat. Matlamatnya adalah untuk menulis program yang utama fungsi melakukan apa, nampaknya? Memanggil sendiri. Dan sebenarnya, kita tidak perlu gelung. Mari kita walaupun memudahkan ini hanya supaya tidak kehilangan penglihatan benar-benar pepijat asas. Panggilan Utama korus untuk menyanyi beberapa korus, maka saya melakukan sesuatu yang bodoh dan saya mempunyai korus korus panggilan kerana saya menganggap orang lain telah pergi untuk melaksanakan ia mungkin, dan sekarang ini tidak akan untuk menyusun lagi. Saya perlu melakukan apa? Saya memerlukan prototaip, ingat. Jadi saya perlu mempunyai sehingga sini korus terbatal (int i); Jadi sekarang jika saya pergi ke sini - sebenarnya, mari kita gunakan tetingkap yang lebih besar. Mari kita pergi ke hadapan dan membuat korus. Mari kita pergi ke hadapan dan membuat korus. Penggunaan daripada pengecamnya tidak diisytiharkan i. Oh, yang bodoh. Kita tidak memerlukan hujah. Mari kita hanya melakukan ini. Saya ingin kita telah mula cara ini. Ia akan menjadi satu program yang lebih mudah untuk menulis. Di sana. Sekarang mari kita pergi ke tetingkap terminal saya, jalankan lagi dilafaz, dan di sini kita pergi. Itu adalah benar-benar berpuasa. Apa yang sebenarnya hanya berlaku, walaupun? Nah, sekarang saya akan menambah barisan cetak supaya kita boleh lihat. Biar saya katakan printf ("Saya di sini") - tiada pembolehubah. Kita akan meninggalkan ia seperti itu. Izinkan saya jalankan. Izinkan saya jalankan korus. Dan ... datang. Terus pergi. Sebagai mengetepikan, mengapa ia tidak terhempas lagi? Kesalahan segmentasi berlaku cepat super sebelum ini. [Sambutan pelajar didengar] >> Tepat sekali. Jadi ia mengambil masa untuk mencetak, kan? Ia hanya mengambil kerja lebih pada bahagian komputer. Dan ada ia adalah: Segmentasi bersalah. Jadi melihat betapa cepat program berjalan. Jika anda tidak mencetak apa-apa, puasa super. Tetapi kita masih mendapat ini kesilapan segmentasi kerana apa yang telah berlaku? Jika anda berfikir tentang bagaimana memori komputer anda dibentangkan, ini berlaku menjadi utama, tetapi di sini mari kita hanya memanggil korus ini, dan mari kita memanggil korus ini. Dan kini jika saya lakukan estetika saya, ini hanya akan mengatakan korus, korus, korus, korus, korus, korus, korus, iklan nauseum, dan akhirnya, apa yang akan berlaku? Jika gambar besar, secara literal, ini, apa yang hanya berlaku konsepnya? Timbunan lebihan longgokan itu. Atau lebih teruk, anda hanya ditakluki segala-galanya, termasuk segmen teks, yang adalah 0 dan 1s yang mewakili program anda. Secara ringkas, ini adalah hanya super, buruk super. Program anda telah melambung di luar kawalan. Anda menggunakan memori cara yang lebih daripada yang anda hendak semua kerana kesilapan bodoh dalam kes ini, atau dalam kes ini satu fungsi yang sangat sengaja dilakukan memanggil sendiri. Sekarang, ini tidak semua yang buruk. Fungsi yang menggelarkan diri mereka sebenarnya mempunyai kuasa yang besar apabila anda menggunakannya dengan betul. Saya telah tidak digunakan dengan betul di sini. Jadi ini bukan semua buruk, tetapi hakikat bahawa saya tidak pernah benar-benar berhenti memanggil diri adalah kelemahan asas di sini program ini. Jadi di mana kita akan pergi dengan semua ini? Apa yang benar-benar berlaku? Apabila saya memanggil fungsi kenaikan seperti yang kita telah lakukan pada mereka contoh, Saya mempunyai nilai seperti 1 yang saya lulus masuk Saya lulus dalam satu salinan nombor 1, jadi berikut berlaku. Mari kita pergi ke kenaikan contoh, lelaki ini betul-betul di sini. Berikut adalah apa yang sebenarnya berlaku. Apabila saya memanggil kenaikan dan saya lulus dalam x, bergambar, apa yang berlaku di sini adalah ini. Jika saya mempunyai nilai 1 disimpan di sini dan saya sebenarnya menyeru kenaikan, yang kini dikenali sebagai korus - iPad membaling saya di sini. Mari kita memanggil kenaikan ini, dan kita tidak tahu apa fungsi ini seterusnya akan menjadi. Jadi apa yang sebenarnya berlaku di sini tempat di utama saya mempunyai sebahagian memori yang menyimpan nombor 1. Apabila saya memanggil kenaikan, saya menggunakan satu lagi sebahagian memori, tetapi sekarang saya mempunyai salinan 1. Apabila saya kenaikan nilai itu, ini menjadi 2, tetapi apa yang berlaku secepat pulangan kenaikan? Memori ini hanya akan diserahkan kembali kepada sistem operasi, yang bermaksud semua yang anda telah melakukan apa-apa yang berguna. 1 yang pada asalnya terkandung dalam utama sebenarnya masih ada. Jadi di mana kita akan pergi dengan ini? Ia ternyata bahawa dalam ingatan anda mempunyai urutan ini kembali-ke-belakang bait bahawa anda boleh meletakkan barangan di dalam, dan ia ternyata bahawa kita sudah melihat sesuatu yang melibatkan meletakkan sesuatu kembali ke belakang untuk kembali ke belakang. Apakah rentetan yang berdasarkan 1 minggu dan kini minggu 2? Ia hanya satu koleksi aksara. Jadi ia ternyata hanya kerana anda boleh meletakkan nombor dalam ingatan, sama anda boleh meletakkan watak-watak dalam ingatan. Dan apabila kita mula meletakkan watak-watak dalam ingatan kembali ke belakang untuk kembali ke belakang, ia ternyata bahawa menggunakan mudah perkara seperti untuk gelung atau gelung sementara, kita boleh melelar dari kiri ke kanan ke atas watak-watak dalam rentetan dan mula mengurut mereka ke dalam watak yang berbeza sama sekali - boleh menjadi b, b boleh menjadi c - supaya akhirnya, kita boleh mengambil hukuman Bahasa Inggeris yang sebenarnya masuk akal dan menukar setiap mereka satu huruf pada satu masa dengan berjalan melalui memori komputer kita kiri ke kanan untuk benar-benar menyulitkan. Jadi mari kita rehat lima minit kami di sini, dan apabila kita kembali, kita akan memulakan proses ini bergegas maklumat. Semua hak. Sebelum kita menyelam ke dalam beberapa kripto dan perkara-perkara yang dipanggil array, izinkan saya berhenti untuk sebarang pertanyaan kerana saya rasa seperti saya benar-benar jenis kelam-kabut beberapa topik-topik. Jadi mari kita menetapkan sekarang jika kita boleh. Kami hanya bercakap tentang nilai-nilai kembali, kita bercakap tentang hujah-hujah, dan kita bercakap tentang idea ini, yang kita akan datang kembali ke dalam beberapa minggu akan datang, melihat memori sebagai sekumpulan keseluruhan ini dulang disusun, jadi untuk bercakap, dari bawah atas sehingga, bahawa setiap dulang yang mendapat meletakkan pada timbunan mewakili fungsi yang sedang dipanggil. Apa-apa soalan? Biar saya tanya soalan di sini. Biar saya memudahkan belakang ini kepada apa yang ia sebelum beberapa Q & A. awal kami Hakikat bahawa kenaikan mempunyai kurungan terbuka, beberapa int, ditutup kurung - apakah mewakili nombor int? [Pelajar] hujah Satu. >> Satu hujah. Okay. Tetapi apa hujah? [Pelajar tindak balas didengar] >> Apa itu? >> [Pelajar] Sesuatu yang anda lulus masuk Okay, jadi sesuatu yang anda lulus masuk Dan lebih amnya, ia hanya input. Jika anda telah menulis fungsi dan tujuan yang berfungsi dalam kehidupan adalah untuk melakukan sesuatu yang sedikit berbeza setiap kali anda menggunakannya, maka satu-satunya cara bagi yang berlaku benar-benar akan kelihatan untuk menyediakan ia dengan input supaya ia boleh melakukan sesuatu yang berbeza dengan input yang setiap masa. Jadi, anda perlu untuk menentukan dua perkara apabila fungsi mengambil input. Anda perlu nyatakan nama yang anda mahu untuk memberi input yang semata-mata untuk kemudahan anda sendiri supaya anda boleh merujuk kepada dalam fungsi yang anda sendiri menulis, seperti yang saya lakukan di sini dalam 32 baris. Tetapi anda juga perlu untuk menentukan jenis kerana C adalah bahasa pengaturcaraan yang hanya memerlukan bahawa jika anda mahu pembolehubah, anda perlu memberitahu komputer apa jenis data ia adalah, sebahagian besar supaya ia tahu berapa banyak bit untuk memperuntukkan bagi pembolehubah yang kerana ia boleh menjadi 6 - maaf, ia tidak akan menjadi 6. Ia boleh menjadi 16, ia boleh menjadi 8, ia boleh menjadi 32, walaupun 64, tetapi komputer perlu tahu. Sekarang, int pada sebelah kiri mewakili apa, sebaliknya? [Pelajar tindak balas didengar] >> Apa itu? >> [Pelajar] Jenis fungsi. Jenis fungsi dan, lebih khusus, jenis output. Betul. Jadi, manakala perkara dalam kurungan mewakili input, jika ada, perkara ke kiri mewakili output. Dan dalam kes ini, kenaikan nampaknya kembali int, dan sebagainya int adalah jenis pulangan fungsi ini. Apakah maknanya untuk pulangan? Secara harfiah, anda menggunakan pulangan kata kunci dan kemudian jika apa yang anda kembali hak kata kunci ialah integer, maka itu adalah memang konsisten dengan apa yang kita telah dijanjikan. Anda tidak dapat melakukan sesuatu seperti ini - hello, dunia - kerana itu adalah rentetan. Jelas sekali, ia bukan integer. Jadi dalam jangka pendek, beban adalah benar-benar kepada kami, pengaturcara, khusus apa yang kita sedang kembali dan kemudian sebenarnya pergi tentang kembali ia. Konteks di sini sekarang ialah bahawa memori komputer anda adalah gigabit, 2 gigabait - apa sahaja - mungkin ia lebih, mungkin ia adalah kurang, tetapi komputer memandang ia sebagai mempunyai bahagian yang berbeza. Sesuatu yang pergi ke sana, sesuatu yang lain naik sana, barangan yang berbeza berlaku di tengah-tengah, dan hari ini kita hanya mula bercerita, tetapi kita akan datang kembali ke masa ini lebih. Buat masa sekarang, hanya sekeping memori kita benar-benar mengambil berat tentang adalah segmen teks kerana yang hanya mewakili 0 dan 1s bahawa dilafaz telah outputted. Jadi apabila anda menjalankan arahan pada keyboard seperti a.out atau anda klik dua kali ikon pada Mac OS atau Windows, program anda dimuatkan dari cakera keras anda ke dalam RAM dan ia plopped di atas RAM komputer anda, jadi untuk bercakap. Sementara itu, sebagai program anda mula berjalan dan utama mendapat dipanggil dalam program ini anda menulis atau program Microsoft atau Apple menulis, mana-mana pembolehubah tempatan akhirnya di bawah sana di bahagian bawah memori komputer anda. Tetapi jika panggilan utama lagi fungsi itu sendiri mempunyai pembolehubah atau hujah, mereka akhirnya di atasnya. Dan jika fungsi yang menyeru sesuatu, mereka akhirnya atas, atas, atas ia. Dan hanya sekali fungsi dilakukan melaksanakan tidak timbunan dulang, jadi untuk bercakap, mula untuk mendapatkan lebih rendah dan lebih rendah. Dan ini adalah apa itu, secara ringkas, menjelaskan mengapa apabila anda memanggil kiub atau anda memanggil kenaikan, anda lulus dalam salinan nilai. Dan apa yang bermakna bergambar adalah bahawa anda benar-benar menulis nombor 1 dalam bahagian lain ingatan, perubahan yang 1 hingga 2 dalam kes kenaikan atau ke 8 dalam kes kiub dan kemudian membuang memori yang jauh secepat kenaikan atau pulangan fungsi kiub. Soalan. [Pelajar] mana pemboleh ubah sejagat yang disimpan? Pembolehubah global disimpan dalam apa yang kini dipanggil data dimulakan atau data yang tidak diisytiharkan, perbezaan jika anda mempunyai pembolehubah global dan anda mengatakan ia segera nilai dengan tanda sama, ia berakhir di atas sana, dan jika anda hanya berkata x int; dengan tiada nilai, ia berakhir sedikit lebih rendah dalam RAM hanya dengan konvensyen. Soalan-soalan lain? Semua hak. Jadi gambar ini akan kembali seperti yang kita mendapatkan lebih berkuasa dengan apa yang kita boleh lakukan dengan komputer, tapi sekarang, mari kita mempunyai intro ringkas kepada kriptografi, jenis tertentu kriptografi yang tidak menyelesaikan semua masalah di dunia tetapi tidak menyelesaikan sebahagian daripada mereka. Dalam kes ini di sini, kita mempunyai sesuatu yang dipanggil rahsia utama kriptografi. Rahsia utama kriptografi, seperti namanya, mendapat keselamatan dari rahsia. Sebagai contoh, jika anda telah kembali di sekolah gred dan anda telah lulus surat cinta rahsia sedikit untuk lelaki atau perempuan anda telah menghancurkan, jika anda mahu lulus nota bahawa melalui penonton, anda mungkin tidak akan menulis apa-apa nota dalam Bahasa Inggeris atau apa sahaja bahasa ibunda anda. Sebaliknya, anda mungkin menyulitkan atau anda mungkin hanya menghantar mereka mesej teks pada hari ini. Tetapi anda sebenarnya mungkin pas mereka nota sepanjang kelas. Dan untuk melakukan ini selamat dalam apa-apa cara yang anda rakan-rakan dan guru tidak tahu apa yang anda menulis, anda mungkin tampil dengan algoritma yang agak mudah, muda walaupun anda mungkin, hanya perebutan perkataan. Jadi bukannya menulis anda mungkin menulis b, bukannya b anda mungkin menulis c, bukan c anda mungkin menulis d, dan sebagainya. Atau anda boleh tampil dengan terjemahan yang lebih canggih surat surat yang berbeza. Tetapi tangkapan adalah lelaki atau perempuan kepada siapa anda menghantar nota ini keperluan untuk mengetahui sesuatu, yang adalah apa yang jelas? >> [Pelajar] Apa yang anda menghantar. Apa rahsia anda, seperti apa yang adalah bahawa pemetaan antara dan b dan c dan d 's. Adakah ia hanya menambah 1 kepada setiap huruf untuk pergi dari a hingga b, b c? Adakah ia lebih kompleks daripada itu? Jadi anda dan menghancurkan anda perlu mempunyai maklumat ini rahsia, tetapi terdapat jenis tangkapan-22 di sini. Jika ini adalah kali pertama anda menghantar surat cinta ini melalui kelas, bagaimana yang lelaki atau perempuan akan tahu apa rahsia walaupun? Begitu rahsia utama kripto tidak menyelesaikan semua masalah di dunia, dan sebenarnya terdapat hubungan di sini bahawa kita akan kembali ke arah akhir semester. Begitu juga adakah kebanyakan kita tidak tahu seseorang yang bekerja, misalnya, di Amazon.com, dan lagi ramai daripada kita mungkin telah membeli barangan di Amazon.com, dan kami telah diajar untuk menganggap bahawa transaksi e-dagang adalah selamat. URL mungkin mengatakan https, ada mungkin ikon mangga bodoh sedikit tempat, terdapat beberapa jenis kriptografi mendapatkan maklumat kad kredit anda antara anda dan Amazon.com. Dan lagi jika kriptografi melibatkan mengetahui beberapa rahsia tetapi saya tidak tahu sesiapa di Amazon dan saya pasti tidak disusun sebarang jenis rahsia dengan seseorang di Amazon, bagaimana komputer saya atau pelayar saya berbuat demikian? Ia ternyata terdapat lain-lain jenis kriptografi sama sekali yang menyelesaikan masalah itu. Tetapi hari ini, kita akan memberi tumpuan pada satu yang mudah di mana anda boleh menguruskan terlebih dahulu untuk mengetahui beberapa rahsia seperti +1 atau beberapa pemetaan antara a dan b. Dan proses kriptografi umumnya melibatkan ini. Anda mempunyai beberapa teks biasa, digambarkan di sini di sebelah kiri, anda menjalankan melalui beberapa jenis algoritma atau prosedur untuk menyulitkan - mungkin itu hanya menjadi b, b menjadi c - dan kemudian anda berakhir dengan tulisan rahsia. Sementara itu, sekali menghancurkan anda menerima nota ini rahsia, dia mempunyai kemudian menyahsulit oleh umumnya menterbalikkan algoritma yang supaya mendapatkan kembali teks biasa. Terdapat jelmaan fizikal ini. Sebagai contoh, ini adalah penyahkod rahsia cincin, dan ini adalah cincin dalam erti kata bahawa terdapat dua cepat di sini. Di pinggir luar perkara ini, ada huruf A hingga Z, walaupun mereka berada dalam susunan rawak, dan di bahagian dalam, terdapat sebenarnya beberapa nombor seperti dengan cincin ini anda jenis boleh bertukar luar tetapi tidak dalam untuk beratur nombor dengan huruf. Dari filem dipanggil A Story Krismas, anda akan melihat bahawa Ralphie sedikit begitu bersemangat untuk mengetahui apa mesej rahsia Anak-Anak Yatim Little Annie kepadanya yang telah disampaikan, saya fikir, dalam bentuk mesej angka pada kotak bijirin dan anda mempunyai untuk mengumpul semua kad kecil yang datang dalam kotak bijirin, anda terpaksa untuk mel mereka dalam, anda terpaksa untuk mendapatkan kembali cincin penyahkod rahsia supaya akhirnya, anda boleh memikirkan apa pemetaan adalah antara huruf dan nombor atau surat dan surat. Bagaimana dalam komputer kita boleh pergi tentang melaksanakan atau mewakili perkara-perkara seperti ini? Kita memerlukan cara menyatakan diri kita sedikit lebih fleksibel daripada pembolehubah kami setakat ini telah dibenarkan. Kami telah ints, kita telah aksara, kita telah terapung dan beregu dan beberapa yang lain, tetapi mereka adalah cebisan individu memori yang tidak benar-benar membenarkan kita untuk meluahkan perkara seperti perkataan dan ayat dan frasa. Malah, kita telah dipanggil rentetan perkara-perkara, tetapi kami berjanji bahawa ini adalah benar-benar hanya peringkasan di perpustakaan CS50 bahawa kita berniat untuk mengupas kembali. Dan jadi mari kita mulakan untuk berbuat demikian di sini. Biar saya pergi ke hadapan dan membuka fail - semua fail-fail ini boleh didapati, seperti biasa, dalam talian - array.c dipanggil untuk menyelesaikan masalah yang berkaitan dengan rentetan tetapi yang cat gambar di sini bagaimana kita mungkin menggunakan sesuatu yang dinamakan array. Pelbagai jenis data. Ia adalah satu jenis pembolehubah kejayaannya yang mempunyai pelbagai jenis data yang lebih kecil di dalamnya kembali ke belakang untuk kembali ke belakang. Jadi, sebagai contoh, jika kita mahu untuk menulis program kecil yang memberikan anda purata kuiz anda bagi kursus seperti 50 yang mempunyai 2 kuiz, anda sangat mudah boleh menulis program ini berasaskan walaupun pada beberapa bahan minggu lepas dengan menggunakan GetInt dan beberapa pembolehubah: int quiz1, int quiz2. Dan ia agak mudah. Ia mungkin 10, 20 baris kod maks untuk melaksanakan program yang meminta pengguna untuk 2 markah kuiz dan kemudian mengira purata mereka dengan menambah mereka bersama-sama, membahagikan dengan 2, dan kemudian mencetak keputusan. Kita mungkin boleh lakukan yang cukup mudah sekarang selepas beberapa beberapa minit. Tetapi masalahnya ialah yang mengandaikan bahawa 50 mempunyai 3 kuiz atau 4. Katakan bahawa anda mahu menggunakan program yang sama untuk kelas yang mempunyai mingguan kuiz. Fikirkan tentang kelas yang telah mingguan kuiz. Jika terdapat 16 atau jadi minggu dalam satu semester, sekarang anda mempunyai 16 pembolehubah: int quiz1, int quiz2, int quiz3, quiz4 int. Sebaik sahaja anda mula melihat lebihan ini, ini menyalin dan menampal kod, ia harus bermula untuk membuat anda ingin terdapat satu cara yang lebih baik. Dan bersyukur, kerana tatasusunan ada. Jadi mari kita buat ini. Pertama, izinkan saya memperkenalkan satu perkara yang sangat mudah bahawa kita telah tidak digunakan setakat ini, tetapi anda akan melihat ia kadang-kadang dalam kod. Ini adalah apa yang biasanya dipanggil pemalar. Jadi ia adalah berterusan dalam erti kata bahawa nilai ini tidak pernah berubah. Konvensyen manusia apabila mewujudkan pemalar adalah untuk menggunakan semua huruf besar hanya supaya ia benar-benar menonjol dalam kod anda, dan kata kunci khas yang anda gunakan dalam C # menentukan. Jadi kita katakan # menentukan, maka ruang, maka perkataan yang anda mahu gunakan untuk nama pemalar dan kemudian nilai pemalar. Perhatikan ini adalah berbeza daripada memberikan sesuatu kepada pembolehubah. Tiada sama menandatangani, terdapat tiada koma bernoktah. Ini adalah apa yang umumnya dikenali sebagai arahan prapemproses, tetapi lebih kepada bahawa masa yang lain. Buat masa sekarang, ini mewujudkan nilai yang tidak berubah dipanggil kuiz nilai sebenar yang bernombor 2. Jadi di mana-mana anda melihat kuiz, kuiz, kuiz seluruh fail ini, itu hanya nombor 2. Jika saya melihat utama sekarang, mari kita lihat bagaimana kerja-kerja ini. Pertama, ia kelihatan sedikit samar, tetapi ia adalah semua barangan dari 1 minggu. Tanya pengguna untuk gred. Bagaimana kita melakukan ini? Dalam 22 baris - ini adalah benar-benar bahagian yang berair - Saya mengaku apungan tetapi tidak hanya apungan tunggal. Saya mengisytiharkan, sebaliknya, pelbagai nilai-titik terapung. Itu ubah akan dipanggil gred, seperti yang tersirat di sini, tetapi sekeping hanya sintaks baru maka ini kurungan persegi. Hakikat bahawa saya telah berkata gred apungan dan kemudian kurungan terbuka dan kemudian nombor - notis jika ini adalah pemalar ini adalah sama seperti yang kita lakukan ini - ini bermakna, "Hei komputer, memberi saya 2 terapung dan mari kita secara kolektif memanggil mereka gred." Ini adalah Berbeza dengan proses yang lebih membosankan seperti ini: apungan grade1; terapung grade2; dan sebagainya. Jadi array membolehkan kita untuk melaksanakan idea ini tetapi lebih kurang messily, dalam apa-apa cara yang bahawa kita boleh menulis 1 baris kod dan bukannya, katakan, 16 untuk semester 16 minggu. Saya tidak mahu keras-kod 2 kerana jika anda berfikir tentang ini sekarang secara logik, andaikan tahun depan CS50 perubahan kepada 3 kuiz sebaliknya dan saya mempunyai nombor 2 di sini, saya mempunyai nombor 2 di sini, Saya mempunyai nombor 2 di sini, nombor 2 di sini. Ia menjadi sangat membosankan dan sangat mudah untuk skru sehingga dan sengaja menukar 1 nilai kepada 3 dan terlepas beberapa nilai lain 2. Jadi saya akan sebaliknya abstrak ini jauh dan menggunakan ini berterusan bahawa, seperti namanya, tidak pernah berubah. Dan kini tidak kira sama ada kita mempunyai berbeza kuiz tahun ini atau seterusnya, Saya hanya perlu untuk menukar ia di satu tempat di sini di atas. Jadi itulah semua pemalar adalah. Sementara itu, ciri konsep baru yang pelbagai. Jadi kurungan persegi memberikan saya ini terapung yang banyak dan membolehkan saya kolektif memanggil mereka gred sini. Jadi sekarang mari kita lihat apa yang saya akan lakukan. Di sini dalam 24 baris adalah permulaan untuk gelung. Ini adalah benar-benar mewah tiada. Ia hanya menggunakan kuiz bukannya beberapa berkod keras. Tetapi tiada apa-apa yang intelektual berbeza ada dari minggu lepas. Ini adalah hanya printf, jadi printf ("Kuiz #% d daripada% d:") kerana saya hanya ingin mencetak keluar memberi saya kuiz nombor 1 2 dan kemudian 2 of 2. Jadi ini adalah satu perkara semata-mata estetik. Tetapi bahagian yang menarik sekarang adalah dalam 27 baris. Dalam usaha untuk mengisi salah satu daripada dua ruang letak dengan nilai titik terapung, anda sekali lagi menggunakan kurungan persegi. Dalam kes ini, saya menggunakan i kerana ini untuk gelung telah bermula dengan i menyamai apa nilai, nampaknya? [Pelajar] 0. >> [Malan] 0. Jadi pada lelaran pertama gelung ini, ia seolah-olah saya menulis ini dalam kod, tetapi pada lelaran kedua gelung ini, ia seolah-olah saya menulis ini dalam kod saya. Tetapi hakikat bahawa saya menggunakan pembolehubah adalah sempurna kerana, seperti namanya, ia berbeza-beza nilainya pada setiap lelaran, jadi saya mengisi array ini satu tempat pada satu masa. Apakah array ini kelihatan seperti? Sebab saya menarik segi empat tepat super mudah pada skrin di sini sebelum ini adalah atas sebab ini. Pelbagai adalah hanya sebahagian memori yang diikuti oleh sebahagian yang lain memori diikuti oleh sebahagian yang lain memori dan sebagainya. Jadi, jika pelbagai saya adalah saiz 2 dalam kes ini di sini, semua saya akan melakukan dengan menaip dalam skor kuiz saya suka sini - Saya mendapat 100 pada satu ini dan kemudian saya mendapat 99 pada satu ini - maka memori ini mungkin tidak boleh digunakan kerana saya hanya meminta komputer untuk pelbagai saiz 2. Mereka dataran masih ada, kan? Anda masih mempunyai 2 gigabait RAM walaupun anda hanya meminta untuk 2 terapung. Jadi idea di sebalik tatasusunan adalah bahawa komputer hanya mengambil sebahagian memori dan kemudian apportions lebih kecil keping kembali ke belakang untuk kembali ke belakang. Dan supaya semua pelbagai. Ia adalah sebahagian yang berdampingan dalam ingatan yang anda boleh meletakkan perkara. Ini berlaku kemudian melakukan hanya beberapa aritmetik membosankan. Jika saya skrol ke bawah sini, ini adalah di mana saya kemudian melelar lebih array. Saya tampil dengan hasil tambah semua nilai dalam array, dan kemudian saya menggunakan fungsi bulat di sini untuk benar-benar melakukan jumlah dibahagikan dengan kuiz. Tetapi biarlah saya melambai tangan saya pada itu sebagai jenis aritmetik yang cukup untuk sekarang. Tetapi semua itu melakukan untuk saya akhirnya mengira purata. Jadi kuiz pertama ditambah kuiz kedua dibahagikan dengan 2 dan kemudian percetakan ia keluar sebagai int. Tetapi mari kita kini peralihan kepada contoh yang berbeza dipanggil string1, yang cat gambar yang sama tetapi menggunakan tali. Biar saya pergi ke hadapan dan memudahkan ini hanya seketika. Memaafkan lekukan sekarang. Notis dalam 19 barisan contoh ini, saya mendapat satu rentetan dari pengguna. Tetapi notis apa yang saya seterusnya melakukan dalam baris 22 dan seterusnya. Saya sebenarnya iterating i sehingga - dan ini adalah helah baru - strlen, tali panjang. Ini adalah fungsi yang datang dengan C bahawa jika anda lulus ia rentetan, ia memberitahu anda berapa banyak aksara dalam rentetan itu. Itu semua. Dan hakikat bahawa ia adalah strlen bukannya panjang rentetan adalah hanya kerana ia lebih ringkas. Tiga puluh tahun yang lalu, orang suka untuk menulis perkara yang ringkas yang mungkin, jadi kami telah disimpan konvensyen itu di sini. i + + hanya bermakna kenaikan i dalam setiap lelaran. Dan kini notis ini, yang benar-benar menarik. Dalam baris 24, saya katakan, "Komputer, memberikan saya watak, 8 bit, dan memanggil ia c." Tetapi apakah ini di sebelah kanan berkata? Dalam bahasa Inggeris, apakah yang mewakili? [Pelajar] watak pertama dalam array. Tepat sekali. Berikan saya watak pertama dalam array. Atau lebih amnya, memberikan saya watak engan dalam array. Dan menyedari ia adalah penting kini bahawa sebagai ahli-ahli sains komputer, kita sebenarnya mengira dari 0. Anda tidak mempunyai budi bicara sekarang untuk memulakan melakukan ini. Sekarang anda perlu berkelakuan selaras dengan jangkaan komputer dan mengira dari 0 kerana [0] akan menjadi watak pertama dalam rentetan, [1] akan menjadi yang kedua, [2] akan menjadi ketiga, dan sebagainya. Jadi program ini, jika saya menyusun, ini sekali lagi string1, jadi membuat string1, dan kini saya telah menjalankan string1 dalam tetingkap terminal saya. Ia menunggu untuk input, jadi saya akan menaip di David, Masukkan, dan kini ia mencetak Daud semua pada garisan yang berbeza kerana notis apa yang saya lakukan. Saya mencetak satu aksara pada satu masa. Kami tidak akan pergi ke terperinci hari ini mengenai perkara ini, tetapi saya dipadam seketika lalu semakan ini di sini. Ia ternyata bahawa jika pengguna itu berkelakuan tidak senonoh, pertentangan, atau hanya keliru, anda sebenarnya boleh gagal untuk memberi rentetan beberapa panjang. Jika anda memukul kunci yang salah pada papan kekunci, anda mungkin memberi rentetan tidak pada semua, atau jika anda berniat jahat, anda mungkin cuba untuk paste dalam bernilai gigabit esei untuk mengisi rentetan ini, dan jika komputer kehabisan memori, ia ternyata bahawa kita akan mendapatkan kembali nilai ini khas dipanggil NULL. Jadi untuk sekarang, hanya tahu bahawa terdapat nilai ini khas dipanggil NULL yang akan membolehkan kita untuk memeriksa apabila kita berada di luar ingatan, antara perkara-perkara lain. Tetapi jika saya membuka sehingga kini string2, notis satu perbezaan di sini. Notis satu perbezaan di sini dengan string2. Mempunyai Dengan string2, ini bagi gelung adalah sedikit berbeza. Biar saya memadam NULLs supaya kita boleh bercakap tentang mereka masa yang lain. Apa yang berbeza tentang gelung masa ini? Saya boleh kembali ke contoh sebelumnya. Jadi itulah versi 2, ini adalah versi 1. 1, 2. 1, 2. Panggilan strlen adalah di mana? Ia adalah di bahagian pertama untuk gelung. Mana-mana pemikiran tentang mengapa saya lakukan ini? Yeah. [Pelajar] Jadi anda tidak memanggil fungsi setiap kali tunggal. [Malan] Jadi kita tidak memanggil fungsi setiap kali tunggal. Tepat sekali. Ingat dari untuk gelung yang mereka mudah super sebaik sahaja anda jenis faham bahawa ini adalah pengawalan, keadaan, dan kemas kini. Masalahnya ialah bahawa keadaan yang berlaku pada setiap lelaran gelung. Dan sebagainya dalam contoh ini di sini, apa yang buruk tentang hakikat bahawa ini adalah keadaan saya? [Pelajar] Anda memanggil strlen. [Malan] Anda memanggil strlen lagi dan lagi dan lagi. Tetapi apabila saya telah ditaip di David, panjang tali itu adalah 5, dan ia tidak akan berubah pada setiap lelaran gelung kerana tali masih D-a-v-i-d. Jadi ini adalah satu petunjuk pada apa yang akan menjadi satu idea yang semakin penting dikenali sebagai keputusan reka bentuk di mana hanya tidak membuat komputer melakukan kerja-kerja yang tidak perlu. Sama seperti pratonton menyelinap daripada pset2, pset2 dalam edisi standard akan mencabar anda untuk benar-benar melaksanakan beberapa bilangan sifer, beberapa beberapa algoritma penyulitan, supaya anda kedua-duanya boleh menyulitkan dan menyahsulit mesej rahsia sama seperti satu Ralphie sana dinyahkod. Dalam edisi penggodam pset2, kami akan pergi sedikit lagi. Kami akan tangan anda fail dari sistem komputer sebenar yang mengandungi sekumpulan keseluruhan sebenar nama pengguna dan kata laluan disulitkan, dan cabaran untuk edisi penggodam akan menjadi retak mereka kata laluan dan memikirkan apa kriptografi atau apa rahsia telah digunakan untuk benar-benar menjana kata laluan mereka. Dan kita akan melakukan ini dengan menggunakan ciri baru di sini C bahawa saya akan memberikan anda hanya demo dikenali sebagai hujah baris arahan. Ternyata, sebagai sebahagian daripada anda mungkin telah dilihat dalam seksyen atau di dalam buku teks, utama tidak semestinya perlu menjadi tidak sah dalam kurungan. Ia ternyata bahawa utama juga boleh ditulis seperti ini, dengan dua hujah, argc dan argv, di mana argc bilangan perkataan bahawa anda menaip selepas nama program pada baris arahan anda dan argv adalah perkataan yang sebenar. Dan sebagai kurungan persegi di sana mencadangkan, argv nampaknya array. Ia akan menjadi rentetan selepas rentetan selepas rentetan dalam ingatan. Jadi apa yang kita akan dapat melakukan bermula dengan pset 2 adalah sesuatu seperti ini. Jika saya membuat argv1, yang merupakan satu contoh kita akan kembali pada hari Isnin, dan jalankan ia, melihat bahawa ia nampaknya tidak berbuat apa-apa lagi. Ia hanya mencetak namanya sendiri. Tetapi jika saya katakan kelas selamat tinggal, notis bahawa program ini nampaknya lelaran atas setiap perkataan yang telah ditaip di prompt. Dan dengan cara yang mana kita akan mendapat akses kepada perkataan yang pengguna telah ditaip di prompt adalah dengan menukar utama memulakan hujung minggu ini dari int utama (tidak sah) untuk int utama (argc, argv) dan dengan itu akan lahir hujah baris arahan. Dan apabila anda mendapat benar-benar canggih di ini, anda akan dapat untuk menulis program yang benar-benar trippy seperti yang satu ini di sini, yang pergi di atas dan di luar beberapa fungsi yang kita lakukan setakat ini tetapi semua agak kuat. Jadi kita akan meninggalkan ini dengan ini pada skrin, dan kita akan melihat anda pada hari Isnin. [CS50.TV]