[Powered by Google Translate] [Bagian 4] [Kurang Nyaman] [Nate Hardison] [Harvard University] [Ini adalah CS50.] [CS50.TV] Baiklah, selamat datang kembali ke bagian. Dalam bagian ini minggu kita akan melakukan beberapa hal. Kami akan Soal rekap Set pertama 2, yang merupakan sejumlah masalah Caesar dan Vigenère. Dan kemudian kita akan menyelam ke review 0 Quiz dan menghabiskan sedikit waktu recapping apa yang telah kita bicarakan di masing-masing kuliah sejauh ini, dan kami juga akan melakukan beberapa masalah kuis dari tahun sebelumnya. Dengan cara itu kalian memiliki cara yang baik untuk mempersiapkan untuk itu. Untuk memulai, saya boot up beberapa solusi yang baik untuk sejumlah masalah sebelumnya, Soal Set 2, ke dalam ruang ini. Jika kalian semua menekan link ini, dan jika Anda klik nama saya dan klik pada revisi pertama saya Anda akan melihat caesar.c, yang persis apa yang saya cari di. Mari kita bicara tentang ini benar-benar cepat. Ini hanya solusi sampel. Hal ini belum tentu solusi sempurna. Ada banyak cara yang berbeda untuk menulis ini, tetapi ada beberapa hal yang saya ingin menyoroti yang saya lihat ketika saya grading, kesalahan umum yang saya pikir solusi ini melakukan pekerjaan yang sangat baik penanganan. Yang pertama adalah memiliki semacam komentar header di atas. Pada baris 1 sampai 7 Anda melihat rincian, apa sebenarnya program ini lakukan. Sebuah praktek standar yang baik ketika Anda sedang menulis kode C terlepas jika program Anda yang terkandung dalam satu file atau apakah itu dibagi atas beberapa file adalah memiliki semacam berorientasi komentar di atas. Hal ini juga untuk orang-orang yang pergi keluar dan menulis kode di dunia nyata. Ini adalah di mana mereka akan menempatkan informasi hak cipta. Di bawah ini adalah # termasuk. On line 16 ada ini # define, yang kita akan kembali ke dalam hanya sedikit. Dan kemudian setelah fungsi dimulai, dimulai sekali main, karena program ini telah semua yang terkandung dalam sebuah fungsi tunggal hal pertama yang terjadi-dan ini sangat idiomatic dan khas dari program C yang mengambil di baris perintah argumen-adalah bahwa hal itu segera memeriksa untuk menghitung argumen, argc. Di sini kita melihat bahwa program ini mengharapkan 2 argumen tepat. Ingat bahwa ada argumen pertama itulah yang khusus yang selalu nama program yang sedang dijalankan, nama file executable. Dan jadi apa yang dilakukan adalah mencegah pengguna dari menjalankan program dengan argumen yang lebih atau kurang. Alasan kita ingin memeriksa ini segera karena kita tidak bisa benar-benar mengakses array argv sini andal sampai kita sudah diperiksa untuk melihat seberapa besar itu. Salah satu kesalahan umum yang saya lihat adalah orang-orang yang akan segera masuk dan ambil argv [1]. Mereka akan ambil argumen kunci dari array dan melakukan hal yang untuk saya memeriksa itu, dan kemudian mereka akan melakukan tes untuk argc serta tes berikutnya, apakah argumen pertama memang integer pada saat yang sama, dan yang tidak bekerja karena dalam kasus yang tidak ada argumen yang diberikan Anda akan meraih argumen yang tidak ada atau mencoba untuk mengambil salah satu yang tidak ada. Hal besar lainnya yang harus Anda perhatikan adalah bahwa Anda selalu ingin mencetak beberapa jenis pesan kesalahan membantu kepada pengguna untuk mengarahkan mereka. Saya yakin Anda sudah menjalankan program di mana semua tiba-tiba crash, dan Anda mendapatkan dialog ini sedikit konyol yang muncul dan mengatakan sesuatu yang mengerikan samar dan mungkin memberi Anda kode kesalahan atau sesuatu seperti itu yang tidak masuk akal. Ini adalah di mana Anda benar-benar ingin memberikan sesuatu yang berguna dan ditargetkan untuk pengguna sehingga ketika mereka menjalankannya mereka pergi "Oh," wajah sawit. "Saya tahu persis apa yang harus dilakukan saya tahu bagaimana memperbaikinya.." Jika Anda tidak mencetak pesan, maka Anda benar-benar berakhir meninggalkan pengguna untuk pergi memeriksa kode sumber Anda untuk mencari tahu apa yang salah. Ada juga beberapa kali bahwa Anda akan menggunakan kode kesalahan yang berbeda. Di sini kita hanya menggunakan satu mengatakan ada kesalahan, ada kesalahan, ada kesalahan. Bigger program, seringkali program yang dipanggil oleh program lain, akan kembali semacam kode kesalahan khusus dalam skenario yang berbeda untuk pemrograman mengkomunikasikan apa yang Anda mau hanya menggunakan pesan bahasa Inggris yang bagus untuk. Cool. Seperti kita bekerja ke bawah, Anda dapat melihat kami tarik keluar kunci. Kami menguji untuk melihat apakah kunci cocok. Kami mendapatkan pesan dari pengguna. Alasan kita melakukannya di lakukan sementara loop-dan ini adalah sesuatu yang kita akan menutupi dalam sedikit sedikit-tapi ternyata bahwa jika Anda ketik control D ketika Anda mendapatkan GetString yang cepat pada terminal apa yang sebenarnya adalah mengirimkan karakter khusus untuk program. Ini disebut ELF atau akhir karakter file. Dan dalam hal ini, string pesan kami akan null, jadi ini bukan sesuatu yang kita diperiksa dalam masalah, menetapkan. Tapi seperti yang kita pergi, sekarang kita sudah mulai berbicara tentang pointer dan alokasi memori dinamis di heap, memeriksa nol setiap kali Anda memiliki fungsi yang mungkin mengembalikan null sebagai nilai adalah sesuatu yang Anda akan ingin untuk membiasakan melakukan. Hal ini di sini terutama untuk ilustrasi. Tetapi ketika Anda melihat GetString di masa depan, sehingga dari Masalah Set 4, Anda akan ingin menyimpan ini dalam pikiran. Sekali lagi, ini bukan masalah bagi Masalah Set 3 baik karena kita tidak menutupinya belum. Akhirnya, kita sampai ke bagian di mana kita bisa loop enkripsi utama, dan ada beberapa hal yang terjadi di sini. Pertama, kita iterate atas string seluruh pesan itu sendiri. Di sini kita sudah menyimpan panggilan strlen dalam kondisi, yang beberapa dari Anda telah menunjukkan bukanlah cara yang bagus untuk pergi. Ternyata dalam hal ini juga tidak besar, sebagian karena kita memodifikasi isi dari pesan itu sendiri dalam untuk loop, jadi jika kita memiliki pesan yang 10 karakter, pertama kalinya kita mulai bahwa untuk loop strlen akan kembali apa? 10. Tetapi jika kita kemudian memodifikasi pesan, katakanlah kita memodifikasi karakter ke-5, dan kami melemparkan dalam karakter 0 \ di posisi ke-5, pada iterasi berikutnya strlen (message) tidak akan kembali apa yang dilakukannya pertama kalinya kami iterasi, tetapi sebaliknya akan kembali 5 karena kami melemparkan dalam null terminator, dan panjang string yang didefinisikan dengan posisi yang \ 0. Dalam kasus ini, ini adalah cara yang bagus untuk pergi karena kita modifikasi di tempat. Tapi Anda melihat bahwa ini adalah benar-benar mengejutkan sederhana untuk mengenkripsi jika Anda bisa mendapatkan matematika yang benar. Semua yang dibutuhkan adalah untuk memeriksa apakah atau tidak surat yang Anda cari di adalah huruf besar atau huruf kecil. Alasan kita hanya harus memeriksa untuk itu dan kami tidak perlu memeriksa kasus alpha adalah karena jika karakter adalah huruf besar atau huruf kecil jika maka itu pasti sebuah karakter alfabet, karena kita tidak memiliki digit huruf besar dan huruf kecil. Hal lain yang kami lakukan-dan ini adalah sedikit rumit- adalah kita telah memodifikasi Caesar cipher standar rumus yang kami berikan dalam spesifikasi sejumlah masalah. Apa yang berbeda di sini adalah bahwa kita dikurangi di ibukota kasus huruf A, dan kemudian kita menambahkan modal A kembali di di akhir. Saya tahu beberapa dari Anda telah melakukan ini dalam kode Anda. Apakah ada di antara kalian melakukan ini dalam kiriman Anda? Anda melakukan ini. Bisakah Anda menjelaskan apa hal ini, Sahb? Dengan mengurangkan keluar, karena Anda melakukan mod tepat setelah itu, Anda harus membawanya keluar, sehingga cara Anda mendapatkan [batuk] posisi. Dan kemudian dengan menambahkan kembali kemudian Anda bergeser di atas salah satu yang Anda inginkan. Ya, tepatnya. Apa Sahb katakan adalah bahwa ketika kita ingin menambahkan kami pesan dan kunci kami bersama-sama dan kemudian mod itu, mod bahwa dengan NUM_LETTERS, jika kita tidak skala pesan kami ke kisaran 0 sampai 25 pertama yang tepat, maka kita mungkin akhirnya mendapatkan nomor benar-benar aneh karena nilai-nilai yang kita cari pada saat kita melihat pesan [i], ketika kita melihat karakter i dari plain-text pesan kami, adalah nilai suatu tempat dalam kisaran 65-122 berdasarkan pada nilai-nilai ASCII untuk huruf A sampai z huruf kecil. Dan jadi ketika kita mod dengan 26 atau NUM_LETTERS, karena itu kami # menentukan di bagian kanan atas di sini, yang akan memberi kita nilai yang ada di kisaran 0 sampai 25, dan kita perlu cara untuk kemudian skala yang kembali dan mendapatkannya dalam kisaran ASCII yang sesuai. Cara termudah untuk melakukannya adalah untuk hanya skala semuanya turun ke kisaran 0 sampai 25 untuk memulai dengan, dan kemudian beralih semuanya kembali di akhir. Lain kesalahan umum yang saya melihat orang-orang berlari ke dalam adalah bahwa jika Anda tidak benar-benar melakukan skala ini segera dan Anda menambahkan pesan dan kunci bersama-sama dan Anda menambahkan mereka, katakanlah, ke dalam variabel char, masalah dengan itu adalah karena pesan [i] adalah angka yang relatif besar untuk memulai dengan- ingat itu setidaknya 65 jika itu sebuah huruf besar karakter- jika Anda memiliki kunci besar, katakanlah, sesuatu seperti 100, dan Anda menambahkan mereka bersama-sama ke 2 char ditandatangani Anda akan mendapatkan overflow. Anda akan mendapatkan nilai yang lebih besar dari 127, yang merupakan nilai terbesar bahwa variabel char bisa terus. Sekali lagi, itulah mengapa kau ingin melakukan hal seperti itu untuk memulai dengan. Beberapa orang mendapat sekitar kasus itu dengan melakukan jika lain dan pengujian untuk melihat apakah itu akan melimpah sebelum melakukan itu, tapi cara ini mendapat sekitar itu. Dan kemudian dalam solusi ini kita dicetak seluruh string di akhir. Orang lain dicetak karakter pada satu waktu. Keduanya mengagumkan. Pada titik ini, apakah kalian memiliki pertanyaan, komentar tentang ini? Hal yang Anda sukai, hal-hal yang tidak Anda sukai? Saya punya pertanyaan. Mungkin aku rindu selama penjelasan Anda, tapi bagaimana program ini melewatkan ruang untuk menghubungkan kunci dengan panjang teks? Ini hanya Caesar cipher. >> Oh, maaf, ya. Ya, kita akan melihat bahwa. Dalam cipher Caesar kami mendapat sekitar itu karena kita hanya membalik karakter. Kami hanya diputar mereka jika mereka besar atau kecil. Kalian merasa cukup baik tentang hal ini? Jangan ragu untuk menyalin rumah ini, bawa, bandingkan dengan apa yang kalian tulis. Pasti merasa bebas untuk mengirim pertanyaan tentang hal itu juga. Dan lagi, menyadari bahwa tujuan di sini dengan masalah Anda set bukan untuk mendapatkan kalian untuk menulis kode sempurna untuk set masalah Anda. Ini adalah pengalaman belajar. Ya. Kembali ke do sementara loop, jika sama dengan nol, jadi nol hanya berarti apa-apa, mereka hanya tekan enter? Null adalah nilai pointer khusus, dan kami menggunakan null ketika kita ingin mengatakan kita memiliki variabel pointer yang menunjuk ke apa-apa. Dan begitu biasanya itu berarti bahwa variabel ini, variabel pesan kosong, dan di sini, karena kita menggunakan tipe string CS50 khusus, apa tipe string CS50? Pernahkah Anda melihat apa itu ketika David ditarik kembali tenda di kuliah? Itu funky-itu adalah pointer, kan? Oke, yeah >> Ini. Adalah char *. Dan sehingga benar-benar kita bisa mengganti ini di sini dengan pesan * char, sehingga fungsi GetString, jika tidak berhasil mendapatkan string dari user, tidak dapat mengurai string, dan satu kasus di mana ia tidak dapat mengurai string adalah jika pengguna jenis karakter akhir file, D kontrol, yang bukan sesuatu yang Anda biasanya lakukan, tapi jika itu terjadi maka fungsi ini akan mengembalikan nilai null sebagai cara untuk mengatakan "Hei, saya tidak mendapatkan string." Apa yang akan terjadi jika kita tidak menaruh pesan = null, yang merupakan sesuatu yang kita belum melakukan belum? Mengapa hal itu menjadi masalah di sini? Karena aku tahu bahwa kita berbicara sedikit dalam kuliah tentang kebocoran memori. Ya, mari kita lakukan itu, dan mari kita lihat apa yang terjadi. Pertanyaan Basil adalah apa yang terjadi jika kita tidak benar-benar memiliki pesan ini test = null? Mari kita gulir ke atas. Kalian dapat komentar dari ini. Sebenarnya, saya akan menyimpannya dalam revisi. Ini akan menjadi Revisi 3. Apa yang Anda harus lakukan untuk menjalankan program ini adalah Anda harus mengklik ikon gigi di sini, dan Anda harus menambahkan argumen untuk itu. Anda harus memberikan argumen kunci karena kita ingin lulus dalam argumen baris perintah. Di sini saya akan memberikan nomor 3. Saya suka 3. Sekarang zooming kembali keluar, menjalankan program. Itu berjalan, kompilasi, membangun. Di sini kita pergi. Ini menunggu untuk diminta. Jika saya mengetik sesuatu seperti halo-mana itu pergi? Oh, program saya terlalu lama untuk menjalankan. Aku sih mengoceh seperti itu terlalu lama. Di sini ia pergi. Sekarang saya ketik halo. Kami melihat bahwa itu mengenkripsi tepat. Sekarang apa yang terjadi jika kita lakukan GetString prompt untuk mengembalikan null? Ingat, saya mengatakan bahwa kami melakukan itu dengan menekan control D pada saat yang sama. Saya akan gulir di sini. Kita akan jalankan lagi. Bangunan. Ada kelanjutannya. Sekarang ketika saya menekan tombol control D Aku punya baris yang mengatakan opt/sandbox50/bin/run.sh, Segmentation fault. Pernahkah kalian melihat itu sebelumnya? [Mahasiswa] Mengapa tidak ada >>-Maaf? [Mahasiswa] Mengapa tidak ada core dump dalam kasus ini? Dump inti-pertanyaan ini mengapa tidak ada core dump di sini? Pertanyaannya adalah bahwa mungkin ada, tetapi core dump adalah file yang akan disimpan pada hard drive. Dalam hal ini kami telah menonaktifkan core dumps pada server berjalan sehingga kita tidak memiliki orang-orang seg faulting dan membangun ton core dumps. Tapi Anda mungkin mendapatkan satu. Core dumps adalah semacam hal yang sering Anda dapat menonaktifkan, dan kadang-kadang Anda lakukan. Kesalahan segmentasi, untuk menjawab pertanyaan Anda, Basil, mengatakan bahwa kita mencoba untuk mengakses pointer yang tidak diatur untuk menunjukkan apa pun. Ingat Binky dalam video ketika mencoba untuk Binky pergi mengakses pointer yang tidak menunjuk apa-apa? Dalam hal ini saya kira secara teknis pointer menunjuk ke sesuatu. Ini menunjuk ke nol, yang secara teknis 0, tapi itu didefinisikan berada di segmen yang tidak dapat diakses oleh program Anda, sehingga Anda mendapatkan kesalahan segmentasi karena Anda tidak mengakses memori yang ada di segmen valid seperti segmen tumpukan atau stack segmen atau segmen data. Cool. Setiap pertanyaan lebih lanjut tentang Caesar? Mari kita lanjutkan. Mari kita lihat Revisi 2 benar-benar cepat. Itu Vigenère. Di sini, di Vigenère kita akan berjalan melalui satu ini cukup cepat karena, sekali lagi, Vigenère dan Caesar cukup mirip. Komentar header sebelumnya, # Define adalah sebelum untuk menghindari menggunakan angka-angka ajaib. Yang menyenangkan adalah mengatakan kita ingin pindah ke alfabet yang berbeda atau sesuatu seperti itu. Daripada harus pergi secara manual mengubah semua 26 dalam kode kita bisa mengubah ini ke 27 atau menjatuhkannya ke bawah jika kita menggunakan huruf yang berbeda, bahasa yang berbeda. Sekali lagi, kami punya cek ini dari jumlah argumen, dan benar-benar Anda hampir dapat mengambil ini sebagai template. Cukup banyak setiap program yang Anda tulis harus memiliki- jika itu membutuhkan baris perintah argumen-beberapa urutan baris yang berbunyi seperti ini di awal. Itulah salah satu tes kewarasan pertama yang ingin Anda lakukan. Berikut apa yang kita lakukan adalah kita memastikan bahwa kata kunci adalah sah, dan itu adalah cek kedua yang kita lakukan. Perhatikan lagi bahwa kami berpisah ini dari argc dan 2. Perhatikan bahwa dalam kasus ini satu hal yang kita harus lakukan adalah bukan menggunakan untuk i kami ingin memvalidasi seluruh string, dan untuk melakukan itu Anda benar-benar harus pergi karakter demi karakter atas tali. Tidak ada cara yang baik untuk memanggil sesuatu di atasnya karena bahkan, misalnya, untuk saya akan kembali 0 jika tidak dapat mengurai integer, sehingga bahkan tidak bekerja. Sekali lagi, pesan yang bagus memberitahu pengguna persis apa yang terjadi. Maka di sini, sekali lagi, kami juga menangani kasus di mana pengguna mengetik karakter D kontrol acak. Dan kemudian Charlotte memiliki pertanyaan sebelumnya tentang bagaimana kita mengelola untuk melewati ruang dalam string kami di sini. Ini adalah sama halnya dengan apa yang kita lakukan dengan program Myspace yang kita lakukan dalam bagian, dan cara ini bekerja adalah bahwa kita dilacak jumlah huruf yang kami telah melihat. Saat kami berjalan di atas string pesan, seperti yang kita berjalan karakter demi karakter, kita dilacak indeks sebagai bagian dari kami untuk loop, dan kemudian kita juga dilacak jumlah huruf, sehingga non-karakter khusus, non-digit, non-white space bahwa kami telah melihat dalam variabel yang terpisah. Dan kemudian solusi ini memodifikasi kunci untuk mendapatkan integer kunci yang sebenarnya, dan apakah itu on the fly, tepat sebelum kemudian pergi untuk mengenkripsi karakter pesan yang sebenarnya. Ada beberapa solusi yang sempurna besar juga yang akan memodifikasi kunci ketika pengujian validitas kunci itu. Selain memastikan bahwa karakter dan kata kunci adalah sebuah karakter alfabet itu juga berbalik yang menjadi integer dalam kisaran 0 sampai 25 untuk kemudian melompat harus melakukannya di kemudian hari dalam untuk loop. Sekali lagi, Anda lihat di sini ini benar-benar kode yang sama persis yang kita gunakan di Caesar pada saat ini. Anda melakukan hal yang sama persis, sehingga trik nyata adalah mencari tahu bagaimana mengubah kata kunci ke integer. Satu hal yang kita lakukan di sini yang sedikit padat adalah kami mengulangi kalimat ini, saya kira Anda bisa menyebutnya, 3 terpisah kali pada baris 58,, 59, dan 61. Dapatkah seseorang menjelaskan apa sebenarnya ungkapan ini tidak? Ini mengakses karakter, seperti yang Anda katakan. Ya, itu [tidak terdengar] karakter dalam kata kunci, dan jadi jumlah huruf terlihat karena Anda hanya bergerak sepanjang kata kunci setelah Anda melihat surat itu, sehingga akan efektif melewatkan ruang dan hal-hal seperti itu. Ya, tepatnya. Dan kemudian setelah Anda melihat kosong kata kunci Anda hanya mod sehingga Anda bergerak kembali sekitar. Tepat. Itu penjelasan yang sempurna. Apa Kevin mengatakan adalah bahwa kita ingin indeks ke kata kunci. Kami ingin mendapatkan karakter num_letters_seen, jika Anda mau, tetapi jika num_letters_seen melebihi panjang kata kunci, cara kita kembali ke kisaran yang tepat adalah kita menggunakan operator mod untuk secara efektif membungkus. Misalnya, seperti dalam jangka pendek, kata kunci kami adalah daging, dan itu 5 huruf. Tapi kita telah melihat 6 huruf dalam teks biasa kami pada saat ini dan dienkripsi 6. Kita akan berakhir mengakses num_letters_seen tersebut, yang 6, mod panjang kata kunci, 5, dan jadi kita akan mendapatkan 1, dan jadi apa yang akan kita lakukan adalah kita akan mengakses dalam karakter pertama dari kata kunci kami pada saat itu. Baiklah, pertanyaan pada Vigenère sebelum kita lanjutkan? Kalian merasa cukup baik tentang hal ini? Keren, bagus. Saya ingin memastikan bahwa kalian mendapatkan kesempatan untuk melihat kode yang menurut kami terlihat bagus dan memiliki kesempatan untuk belajar dari itu. Ini akan menjadi yang terakhir kita akan menggunakan ruang untuk sementara waktu, dan kita akan transisi sekarang, dan aku akan pergi ke cs50.net/lectures sehingga kami bisa melakukan sedikit review kuis. Cara terbaik yang saya berpikir untuk mulai melakukan kuis tinjauan adalah untuk datang ke halaman ini Kuliah, cs50.net/lectures, dan di bawah masing-masing judul minggu, jadi jika saya lihat di sini di Minggu 0, Saya melihat bahwa kita memiliki daftar topik yang kita bahas dalam Minggu 0. Jika salah satu topik tampak asing bagi Anda Anda pasti ingin kembali dan menjelajahi catatan kuliah dan mungkin Bahkan skim melalui ceramah, melihat mereka lagi jika Anda ingin untuk mendapatkan merasakan apa yang terjadi dengan masing-masing topik. Aku akan mengatakan ini satu tahun tambahan dari sumber daya dingin yang kita punya inilah celana pendek yang kami buat, dan jika Anda melihat Week 0, kita tidak memiliki semua topik yang dibahas, tapi kami punya beberapa dari mereka, beberapa yang rumit, jadi menonton celana pendek ini lagi adalah cara yang baik untuk mendapatkan Anda sampai dengan kecepatan. Secara khusus, aku akan dimasukkan ke dalam sebuah plug untuk 3 di bagian bawah, karena saya melakukan itu. Tetapi jika Anda sedang berjuang dengan biner, bit, hex, hal semacam itu, biner adalah tempat yang tepat untuk memulai. ASCII adalah satu itu bagus untuk melihat juga. Anda bahkan dapat menonton saya di kecepatan 1.5x apakah aku akan terlalu lambat untuk Anda. Karena itu review, merasa bebas untuk melakukan itu. Hanya untuk memulai sangat cepat, kita akan pergi melalui beberapa masalah kuis hanya untuk cepat churn melalui. Sebagai contoh, mari kita lihat masalah 16 yang saya punya hak di sini di papan. Kami telah mendapat perhitungan berikut dalam biner, dan kami ingin menunjukkan pekerjaan apapun. Oke, aku akan memberikan suntikan ini. Kalian harus mengikuti bersama dengan kertas, dan kami akan melakukan hal ini benar-benar cepat. Kami ingin melakukan perhitungan berikut dalam biner. Aku punya 00.110.010. Dan aku akan menambahnya 00.110.010. Untuk para jenius matematika mengikuti dari awal di rumah, ini efektif mengalikan dengan 2. Mari kita mulai. Kita akan mengikuti algoritma penambahan yang sama yang kita lakukan ketika kita menambahkan angka desimal bersama-sama. Benar-benar satu-satunya perbedaan di sini adalah bahwa kita loop kembali sekitar sekali kita memiliki 1 + 1 bukan sekali kita sampai 10. Jika kita mulai dari kanan, sangat cepat, apa digit pertama? [Mahasiswa] 0 >> [Nate H.]. 0. Besar, digit kedua? [Siswa] 1. [Nate H.] Apakah itu 1? 1 + 1 adalah? [Siswa] 10. [Nate H.] Tepat, jadi apa adalah digit yang saya tulis tepat di bawah 2 yang ditambahkan bersama-sama? [Siswa] 1, 0, atau 0 dan kemudian membawa 1. [Nate H.] 0 dan membawa 1, tepatnya. Satu Selanjutnya, Basil, kau sudah bangun. Apa yang ketiga? >> [Basil] 1. [Nate H.] 1, sempurna. Kevin? [Kevin] 0 >> [Nate H.]. 0, Charlotte? [Charlotte] 0 >> [Nate H.]. Ya, dan apa yang harus saya lakukan? [Mahasiswa] The 1. [Nate H.] Dan apa yang harus saya lakukan? Dan kemudian saya membawa 1. Sempurna, Sahb >>? [Sahb] Sekarang Anda memiliki 1. [Nate H.] Dan harus saya lakukan apa pun di sini? [Sahb] Kemudian untuk yang berikutnya Anda memiliki 1 karena Anda dibawa 1. [Nate H.] besar, jadi di sini kita bisa menyelesaikan itu. Cool. [Mahasiswa] Apakah 0 + 0 = 0? 0 + 0 = 0. 1 + 1, seperti yang kaukatakan, adalah 10, atau 1, 0, bukan. 10 adalah sebuah ironi karena bagi saya 10 berarti nomor 10, dan itu adalah permainan kata-kata tentang bagaimana kita mewakili ketika kita sedang menulis itu. Kami mewakili nomor 2 dengan 1, 0, dan nomor 10 sedikit berbeda. Apa jenis yang baik tentang biner adalah bahwa benar-benar ada tidak banyak kasus Anda perlu belajar. Ada 0 + 0 = 0, 0 + 1 = 1, 1 + 1 adalah 0, dan kemudian membawa 1, dan kemudian Anda bisa lihat di sini pada kolom ketiga dari kanan kita punya 1, 1, dan 1. Dan 1 + 1 + 1 adalah 1, dan Anda membawa lain 1. Ketika Anda melakukan penambahan biner, cukup sederhana. Saya akan melakukan beberapa lebih dari ini untuk kewarasan memeriksa dirimu sebelum Anda pergi karena ini adalah mungkin sesuatu yang kita akan melihat pada kuis. Sekarang mari kita lakukan satu ini berikutnya juga. Mari kita mengerjakan soal 17. Kita akan mengkonversi bilangan biner ke desimal berikut. Aku punya 10100111001. Ingat dalam video biner yang saya lakukan Aku berjalan melalui beberapa contoh, dan saya menunjukkan bagaimana semuanya bekerja ketika Anda melakukannya dalam desimal. Bila Anda bekerja dalam representasi desimal Saya pikir kita pada titik ini dalam hidup kita begitu fasih di dalamnya yang itu cukup mudah untuk mengabaikan mekanisme bagaimana sebenarnya bekerja. Tapi untuk melakukan rekap cepat, jika saya memiliki nomor 137 ini benar-benar berarti-dan sekali lagi, ini adalah dalam desimal representasi- angka 137 dalam desimal berarti bahwa saya memiliki 1 x 100 + 3 x 10 + 7 x 1. Ini semua tinggal di layar. Dan kemudian jika Anda melihat angka-angka di sini, 100, 10 dan 1, Anda melihat bahwa mereka benar-benar semua kekuatan dari 10. Saya memiliki 10 ², 10 ¹, dan 10 sampai nol. Kami memiliki semacam hal serupa dalam biner, kecuali bahwa basis kami, seperti yang kita menyebutnya, adalah 2 bukan 10. Ini 10s yang saya tulis di sini di bagian bawah, ini ² 10, 10 ¹, 10 ke nol, 10 adalah basis kami, dan eksponen, 0, 1, atau 2, tersirat oleh posisi digit dalam jumlah yang kita tulis. 1, jika kita melihatnya, ini 1 berada di posisi ke-2. 3 berada dalam posisi 1, dan 7 yang berada di posisi 0. Itulah cara kita mendapatkan berbagai eksponen di bawah ini untuk basis kami. Setelah semua ini Kita akan-sebenarnya, Anda tahu apa? Kami akan melakukan-mana tombol undo saya pergi? Ada kelanjutannya. Saya suka ini membatalkan hal. Setelah ini saya berpikir saya setidaknya cara termudah untuk mulai mengkonversi bilangan biner atau nomor heksadesimal di mana dasar adalah 16 dan bukan 10 atau 2 adalah untuk terus maju dan menulis dasar dan eksponen untuk semua angka dalam bilangan biner saya di atas. Jika kita mulai dari kiri ke kanan lagi, yang merupakan jenis berlawanan dengan intuisi, Saya akan mengubah kembali ke hitam di sini, kita memiliki 2 ke posisi 0, dan kemudian kita memiliki 2 ¹, ² 2, dan kemudian 2 ke 3, 2 ke 4, 2 ke 5, 6, 7, 8, 9, dan 10. Angka-angka ini saya sudah menulis keluar adalah semua eksponen. Saya hanya menulis dasar di sini di 3 pertama hanya untuk ruang. Pada titik ini aku akan pergi ke depan dan aku benar-benar akan menghapus hal-hal yang kita lakukan dalam desimal, jika tidak apa-apa. Anda semua punya itu. Bagi Anda menonton online saya yakin akan dapat memundurkan saya jika Anda ingin. Beralih kembali ke pena. Sekarang, apa yang bisa kita lakukan-jika kalian tidak benar-benar sampai dengan kecepatan pada kekuatan Anda dari 2, itu benar-benar keren. Ini terjadi. Saya mengerti. Saya pernah punya pekerjaan wawancara di mana saya diberitahu bahwa saya harus tahu semua kekuatan dari 2 up melalui 2 sampai 30 tersebut. Itu bukan pekerjaan aku. Lagi pula, kalian dapat pergi ke depan dan melakukan matematika di sini, tapi dengan biner tidak benar-benar masuk akal, dan juga tidak masuk akal dengan desimal atau heksadesimal baik, untuk melakukan matematika di mana Anda memiliki nol. Anda dapat melihat saya memiliki 0 di sini, di sini 0, 0 di sini, di sini 0, 0 di sini, di sini 0. Mengapa hal itu tidak masuk akal untuk melakukan matematika yang sebenarnya untuk menghitung kekuatan yang tepat dari 2 untuk posisi tersebut? Persis, seperti Charlotte mengatakan, itu akan menjadi 0. Mungkin juga menghemat waktu jika menghitung kekuatan dari 2 bukanlah kelebihanmu. Dalam hal ini kita hanya perlu menghitung untuk 2 ke 0 yang-? [Siswa] 1. [Nate H.] 1, 2 sampai 3 yang merupakan-? [Mahasiswa] 8 >> [Nate H.]. 8. 2 ke 4? [Siswa] 2. Maafkan aku, 1. [Nate H.] 2 sampai 4 adalah 16, tepatnya. 2 ke 5, Kevin >> 32.? [Nate H.] 32, 2 ke 8? [Siswa] 32 x 8, 256. [Nate H.] Sempurna. Dan 2 ke 10? [Mahasiswa] 1024. [Nate H.] Ya, 1024. Setelah kami punya angka-angka yang kita dapat menyimpulkan mereka semua. Dan ini adalah di mana itu benar-benar penting untuk melakukan beberapa hal. Salah satunya adalah pergi lambat dan memeriksa pekerjaan Anda. Anda dapat memberitahu bahwa ada 1 di akhir nomor ini, jadi saya pasti harus mendapatkan jumlah ganjil sebagai hasilnya saya, karena semua yang lain akan menjadi lebih nomor mengingat bahwa itu adalah bilangan biner. Hal lain yang harus dilakukan adalah jika Anda sampai ke titik ini pada tes dan Anda sudah menulis itu sejauh ini dan Anda kehabisan waktu melihat jumlah poin bahwa masalah ini layak. Masalah ini, karena Anda dapat melihat-jika saya flip kembali ke laptop saya benar-benar cepat- masalah ini bernilai 2 poin, jadi ini bukan jenis penambahan Anda harus pergi melalui jika Anda benar-benar terdesak waktu. Tapi kita akan beralih kembali ke iPad, dan kita akan pergi melalui itu benar-benar cepat. Saya suka melakukan sejumlah kecil pertama karena saya menemukan bahwa lebih mudah. Saya suka 32 dan 8 karena mereka pergi bersama-sama cukup mudah, dan kami mendapatkan 50. 16 dan 1 mendapat 17. Di sana kami mendapatkan 57, dan kemudian kita bisa melakukan sisa ini, sehingga kita dapat melakukan 57, 156. Ayo. Man, baik, mari kita lihat. Kami memiliki 57, 256, dan 1024. Pada titik ini, aku lebih suka pergi melalui. Saya tidak tahu. Saya jelas perlu untuk membaca tentang hal ini. 7, 6, dan 4, Anda mendapatkan 17. 1, 5, 5, 2, 13. Kemudian kita mendapatkan 3, dan kemudian kita mendapatkan 1. 1337. Easter egg, siapa? Siapa saja mengenali nomor ini? Chris mengakui nomor. Apa artinya, Chris? [Chris] Leet. Leet, jadi jika Anda melihat ini, sepertinya leet. Hacker hal. Watch out untuk hal semacam itu pada paruh waktu atau kuis, bukan. Jika Anda melihat hal semacam itu dan Anda bertanya-tanya "Huh," yang mungkin benar-benar berarti sesuatu. Saya tidak tahu. David likes menempatkan masuk Ini adalah cara yang baik untuk kewarasan memeriksa. Seperti oke, saya bisa melihat apa yang terjadi. Itulah Minggu 0/Week 1 hal. Jika kita beralih kembali ke laptop kami sekarang, zoom out, dan beberapa hal lainnya. Ada ASCII, yang kita sudah melakukan banyak dengan set masalah. Gagasan modal A. Apa yang benar-benar? Mengetahui itu adalah integer desimal. 65 adalah apa itu dipetakan ke dalam tabel ASCII, dan itu karena itu bagaimana komputer menulis itu, dan itulah bagaimana kami sudah lolos dengan benar-benar menulis ibukota karakter A dan karakter huruf kecil yang dalam beberapa solusi dan set masalah yang telah Anda lakukan. Beberapa hal-hal lain. Kami punya pernyataan, ekspresi boolean, kondisi, loop, variabel dan benang. Mereka semua tampaknya masuk akal untuk sebagian besar? Beberapa terminologi ini sedikit funky di kali. Saya suka berpikir tentang pernyataan seperti untuk sesuatu yang paling bagian yang berakhir dengan titik koma. Laporan seperti x = 7, yang menetapkan variabel, mungkin disebut x = 7. Agaknya x adalah juga merupakan tipe yang dapat menyimpan nomor 7, jadi itu adalah int atau mungkin pelampung atau pendek atau char, sesuatu seperti itu. Sebuah ekspresi boolean menggunakan ganda tersebut sama dan bang yang sama atau tidak sama, kurang dari, lebih besar dari, kurang dari atau sama dengan, semua hal semacam itu. Kondisi itu merupakan pernyataan jika yang lain. Saya akan ingat bahwa Anda tidak dapat memiliki sebuah lagi tanpa sesuai jika. Demikian juga, Anda tidak dapat memiliki lagi jika tanpa sesuai jika. Loops, mengingat 3 jenis loop kita sudah memalu ke Anda untuk terakhir beberapa bagian dan set masalah. Menggunakan lakukan sementara ketika Anda mendapatkan input pengguna, menggunakan sementara loop sampai kondisi tertentu adalah benar, dan kemudian menggunakan mereka untuk loop jika Anda perlu untuk tahu mana iterasi dari loop Anda saat ini adalah bagaimana saya berpikir tentang hal itu. Atau jika Anda melakukan untuk setiap karakter dalam string saya ingin melakukan sesuatu, untuk setiap elemen dalam array saya ingin melakukan sesuatu untuk elemen. Threads dan acara. Ini kami belum tertutup sehingga secara eksplisit dalam C, tapi ingat ini dari Scratch. Ini adalah gagasan memiliki skrip yang berbeda. Ini juga gagasan penyiaran acara. Beberapa orang tidak menggunakan siaran dalam proyek-proyek mereka pada awalnya, yang benar-benar keren, tetapi ini adalah 2 cara yang berbeda untuk menangani masalah ini lebih besar disebut concurrency, yang adalah bagaimana Anda mendapatkan program untuk mengeksekusi atau tampaknya mengeksekusi pada saat yang sama? Tugas yang berbeda berjalan sementara tugas-tugas lainnya juga berjalan. Ini adalah bagaimana sistem operasi Anda tampaknya bekerja. Inilah sebabnya mengapa meskipun, misalnya, Saya sudah punya browser saya berjalan, saya juga dapat mengaktifkan Spotify dan memutar lagu. Itu lebih dari hal yang konseptual untuk memahami. Saya akan mengambil melihat pada benang pendek jika Anda ingin mempelajari lebih lanjut tentang hal itu. Mari kita lihat, saya percaya mungkin ada masalah ini di salah satu. Sekali lagi, saya pikir benang dan peristiwa bukan sesuatu yang akan kita bahas pada C hanya karena secara signifikan lebih sulit daripada di Scratch. Anda tidak perlu khawatir tentang hal itu ada, tapi pasti memahami konsep, memahami apa yang terjadi. Sebelum kita melanjutkan, pertanyaan pada Minggu 0 materi? Semua orang merasa cukup baik? Memahami variabel dan apa variabel? Pindah. Minggu 1. Beberapa hal di sini yang tidak terlalu tertutup dalam review kuis tentu dan juga hal yang lebih konseptual untuk memikirkan. Yang pertama adalah gagasan dari apa yang kode sumber, compiler dan kode objek yang. Siapa saja? Basil. Apakah kode obyek-maksudku kode sumber adalah apa yang Anda masukkan ke dalam dentang, dan kode objek adalah apa dentang menempatkan keluar sehingga komputer Anda dapat membaca program. Tepat. Source code adalah kode C yang Anda benar-benar mengetik. Kode obyek adalah apa yang Anda keluar dari dentang. Ini adalah 0s dan 1s dalam format biner. Lalu apa yang terjadi adalah ketika Anda memiliki banyak file objek, mengatakan Anda kompilasi sebuah proyek atau program yang menggunakan file kode sumber beberapa, yang oleh konvensi diberi ekstensi file c.. Itulah mengapa kita memiliki caesar.c, vigenère.c. Jika Anda sedang menulis program Java Anda memberi mereka ekstensi. Java. Program Python memiliki ekstensi py sering.. Setelah Anda memiliki beberapa. File c, Anda kompilasi mereka. Clang meludah keluar semua sampah biner. Kemudian karena Anda hanya ingin 1 Program Anda memiliki link linker semua objek tersebut file bersama-sama ke dalam 1 file executable. Ini juga apa yang terjadi ketika Anda menggunakan perpustakaan CS50, misalnya. Perpustakaan CS50 adalah baik itu. H file header yang Anda baca, bahwa # includecs50.h. Dan maka itu juga merupakan file biner khusus perpustakaan yang telah dikompilasi yang 0s dan 1s, dan bahwa l-bendera, jadi jika kita kembali ke Spaces kami dan kami terlihat sangat cepat apa yang terjadi di sini ketika kita melihat perintah dentang kami, apa yang kita punya ini adalah sumber file kode kami di sini. Ini adalah sekelompok bendera compiler. Dan kemudian di akhir, ini-l bendera link di file biner yang sebenarnya untuk 2 perpustakaan, perpustakaan CS50 dan kemudian perpustakaan matematika. Memahami setiap jenis tujuan file ' dalam proses kompilasi adalah sesuatu yang Anda akan ingin untuk dapat memberikan setidaknya gambaran tingkat tinggi. Source code masuk kode Obyek keluar. Obyek file kode link bersama-sama, dan Anda mendapatkan file, executable yang indah. Cool. Ini juga di mana Anda bisa mendapatkan kesalahan pada beberapa titik dalam proses kompilasi. Di sinilah, misalnya, jika Anda mengambil bendera ini menghubungkan, bendera CS50, dan Anda menghilangkan dalam Spasi atau ketika Anda menjalankan kode Anda, ini adalah di mana Anda akan mendapatkan kesalahan dalam tahap menghubungkan, dan linker akan berkata, "Hei, kau disebut GetString fungsi itu di perpustakaan CS50. " "Kau bilang itu di perpustakaan CS50, dan saya tidak dapat menemukan kode untuk itu." Itulah di mana Anda harus menghubungkan dalam, dan itu terpisah dari kesalahan kompilator karena compiler adalah melihat sintaks dan hal semacam itu. Ada baiknya untuk mengetahui apa yang terjadi ketika. Hal-hal lain untuk mengetahui tentang. Aku akan mengatakan Anda pasti ingin untuk melihat di singkat pada typecasting dilakukan oleh Jordan untuk memahami apa ints berada di bawah tenda, apa karakter berada di bawah tenda. Ketika kita berbicara tentang ASCII dan kami benar-benar melihat tabel ASCII, apa yang lakukan adalah memberikan kami di bawah tampilan hood bagaimana komputer benar-benar mewakili ibukota A dan 7 digit dan koma dan tanda tanya. Komputer juga memiliki cara khusus untuk mewakili nomor 7 sebagai integer. Ini memiliki cara khusus untuk mewakili angka 7 sebagai angka floating point, dan mereka sangat berbeda. Typecasting adalah bagaimana Anda memberitahu komputer "Hei, saya ingin Anda untuk mengkonversi dari satu representasi ke representasi yang lain. " Mengapa kita tidak melihat itu. Saya juga akan melihat di singkat pada perpustakaan dan pendek pada kompiler. Mereka berbicara tentang proses kompilasi, apa perpustakaan adalah, dan pergi selama beberapa pertanyaan yang Anda mungkin akan diminta. Pertanyaan pada Minggu 1 materi? Apakah ada topik di sini yang tampak menakutkan Anda ingin untuk menutupi? Saya mencoba untuk meniup melalui sebagian besar topik sebelumnya sehingga kita bisa mendapatkan pointer dan melakukan sedikit rekursi. Pikiran? Apa pun untuk menutupi? Waktu untuk beberapa cokelat mungkin? Kalian bekerja melalui itu. Aku akan terus menghirup kopi. Minggu 2. Baik panggilan, panggilan yang baik. Dalam Minggu 2 kami berbicara sedikit lebih banyak tentang fungsi. Pada set masalah pertama yang kita tidak benar-benar menulis fungsi sama sekali selain yang berfungsi? [Mahasiswa] Main >> Main., Tepatnya. Dan jadi kita telah melihat kostum berbeda yang utama memakai. Ada satu yang dibutuhkan tanpa argumen, dan kita hanya mengatakan kekosongan di antara tanda kurung, dan kemudian ada yang lain di mana kita ingin mengambil argumen baris perintah, dan seperti yang kita lihat, di situlah Anda memiliki argc int dan string array yang argv atau sekarang bahwa kita sudah benar-benar terkena string untuk menjadi char * bahwa itu adalah kita akan mulai menulis sebagai char * argv dan kemudian kurung. Dalam Set Soal 3, kalian melihat sekelompok fungsi, dan Anda menerapkan sekelompok fungsi, menggambar, mencari, berebut. Prototipe semuanya ditulis di sana untuk Anda. Apa yang saya ingin bicarakan di sini dengan fungsi sangat cepat adalah bahwa ada 3 bagian untuk mereka setiap kali Anda menulis fungsi. Anda harus menentukan jenis kembalinya fungsi. Anda harus menentukan nama untuk fungsi, dan kemudian Anda harus menentukan daftar argumen atau daftar parameter. Sebagai contoh, jika saya adalah untuk menulis fungsi untuk meringkas sekelompok bilangan bulat dan kemudian kembali ke saya jumlah apa yang akan menjadi tipe saya kembali jika saya ingin menjumlahkan bilangan bulat dan kemudian kembali jumlahnya? Kemudian nama fungsi. Jika saya pergi ke depan dan menulis di hijau, bagian ini adalah jenis kembali. Bagian ini adalah nama. Dan kemudian di antara tanda kurung adalah di mana saya memberikan argumen, sering disingkat sebagai args, kadang-kadang disebut params untuk parameter. Dan jika Anda memiliki satu, Anda hanya menentukan satu. Jika Anda memiliki beberapa Anda memisahkan masing-masing dengan koma. Dan untuk setiap argumen Anda memberikan 2 hal-hal yang-Kevin? [Kevin] Anda harus memberikan jenis dan kemudian nama. Dan kemudian nama, dan nama adalah nama yang Anda akan menggunakan untuk merujuk pada argumen bahwa dalam fungsi penjumlahan, dalam fungsi yang Anda sedang menulis. Anda tidak perlu-misalnya, jika aku akan meringkas, mengatakan, sebuah array bilangan bulat-kita lakukan array int, dan aku akan memberikan diriku beberapa kurung kurawal ada- kemudian ketika saya melewati array ke fungsi penjumlahan Saya lulus di posisi pertama dari daftar argumen. Tapi array yang saya lulus dalam tidak harus memiliki nama arr. Arr akan menjadi bagaimana saya merujuk pada argumen bahwa dalam tubuh fungsi. Hal lain yang perlu kita mempertimbangkan, dan ini sedikit berbeda dari fungsi, tapi saya pikir itu poin penting, adalah bahwa dalam C ketika saya sedang menulis fungsi seperti ini bagaimana saya tahu berapa banyak elemen dalam array ini? Ini adalah sedikit dari pertanyaan jebakan. Kami berbicara tentang hal ini sedikit di bagian pekan lalu. Bagaimana saya tahu jumlah elemen dalam sebuah array di C? Apakah ada cara? Ternyata bahwa tidak ada cara untuk mengetahui. Anda harus lulus dalam secara terpisah. Ada trik yang dapat Anda lakukan jika Anda berada di fungsi yang sama di mana array telah dideklarasikan, dan Anda bekerja dengan array stack. Tapi itu hanya bekerja jika Anda berada di fungsi yang sama. Setelah Anda melewati array ke fungsi lain atau jika Anda sudah menyatakan array dan Anda menempatkan array di heap, Anda telah menggunakan malloc  dan hal semacam itu, maka semua taruhan dibatalkan. Kemudian Anda benar-benar harus lulus sekitar argumen khusus atau parameter lain memberitahu Anda seberapa besar array. Dalam kasus ini, saya ingin menggunakan koma-Maafkan aku, itu akan dari layar di sini- dan saya akan lulus dalam argumen lain  dan menyebutnya len int untuk panjang. Satu hal yang mungkin akan muncul pada kuis meminta Anda untuk menulis atau menerapkan fungsi tertentu disebut sesuatu. Jika kita tidak memberikan prototipe, jadi ini semuanya di sini, kekacauan ini disebut deklarasi fungsi atau prototipe fungsi, ini adalah salah satu hal pertama yang Anda akan ingin untuk memakukan jika tidak diberikan kepada Anda segera pada kuis. Trik lain yang saya pelajari adalah bahwa mengatakan kita lakukan memberikan prototipe untuk fungsi, dan kita katakan, "Hei, kau harus menuliskannya." Di dalam kurung kurawal yang Anda miliki di kuis jika Anda melihat bahwa ada tipe kembali dan Anda melihat bahwa jenis kembali adalah sesuatu yang lain dari kekosongan, yang berarti bahwa fungsi tidak kembali apa-apa, maka satu hal yang pasti ingin lakukan adalah menulis semacam pernyataan kembali di akhir fungsi. Kembali, dan dalam kasus ini, kami akan menempatkan kosong karena kita ingin mengisi bagian yang kosong. Tapi ini membuat Anda berpikir dengan cara yang benar tentang bagaimana saya akan mendekati masalah ini? Dan itu mengingatkan Anda Anda akan harus mengembalikan nilai ke pemanggil fungsi. Ya >> [Siswa]. Apakah gaya berlaku ketika kita sedang menulis kode pada kuis? Seperti indentasi dan hal semacam itu >> [Siswa]? Ya. Tidak, tidak sebanyak. Saya pikir banyak-ini adalah sesuatu yang kita akan mengklarifikasi pada kuis pada hari, tetapi biasanya khawatir tentang # mencakup dan hal semacam itu, itu semacam luar. [Siswa] Apakah Anda perlu untuk komentar kode tulisan tangan Anda? Apakah Anda perlu untuk komentar kode tulisan tangan Anda? Mengomentari selalu baik jika Anda khawatir tentang kredit parsial atau Anda ingin berkomunikasi niat Anda untuk grader tersebut. Tapi aku, sekali lagi, akan memperjelas pada kuis itu sendiri dan pada hari kuis, tapi saya tidak percaya bahwa Anda akan diminta untuk menulis komentar, no. Biasanya tidak, tapi itu pasti semacam hal mana Anda dapat berkomunikasi niat Anda, seperti "Hei, ini adalah di mana aku akan dengan itu." Dan kadang-kadang yang dapat membantu dengan kredit parsial. Cool. Basil. [Basil] Apa perbedaan antara menyatakan, katakanlah, int lang dalam argumen atau parameter dibandingkan mendeklarasikan variabel dalam fungsi? Wow, kopi turun tenggorokan. [Basil] Seperti yang hal yang kita inginkan untuk dimasukkan ke dalam argumen. Ya, itu pertanyaan yang bagus. Bagaimana Anda memilih hal-hal apa yang Anda inginkan untuk dimasukkan ke dalam argumen versus apa hal yang harus Anda lakukan dalam fungsi? Dalam hal ini kita termasuk kedua sebagai argumen karena mereka sesuatu yang siapa pun yang akan menggunakan fungsi penjumlahan perlu untuk menentukan hal-hal. Fungsi penjumlahan, seperti kita bicarakan, tidak memiliki cara untuk mengetahui seberapa besar array itu mendapat dari pemanggil atau siapa pun yang menggunakan fungsi penjumlahan. Ia tidak memiliki cara untuk mengetahui seberapa besar array yang. Alasan kami melewati panjang ini di sini sebagai argumen karena itu adalah sesuatu yang kita pada dasarnya memberitahu pemanggil fungsi, siapa pun yang akan menggunakan fungsi penjumlahan, "Hei, tidak hanya Anda harus memberikan kami sebuah array ints, Anda juga harus memberitahu kita seberapa besar array yang Anda telah diberikan kepada kita adalah. " [Basil] Mereka keduanya akan perintah argumen baris? Tidak, ini adalah argumen aktual yang Anda akan melewati ke fungsi. Biarkan aku melakukan sebuah halaman baru di sini. [Basil] Seperti nama akan berlalu- [Nate H.] Jika saya memiliki int main (void), dan aku akan dimasukkan ke dalam 0 saya kembali ke sini di bagian bawah, dan mengatakan saya ingin memanggil fungsi sum. Saya ingin mengatakan int x = sum (); Untuk menggunakan fungsi penjumlahan saya harus lulus di kedua array yang saya ingin meringkas dan panjang dari array, jadi ini adalah di mana asumsi saya memiliki sebuah array int, bilang aku punya int numbaz [] = 1, 2, 3, jenis penggunaan yang hacked sampai sintaks di sana, maka apa yang akan saya lakukan adalah dalam jumlah Saya ingin lulus dalam baik numbaz dan nomor 3 untuk memberitahu fungsi sum "Oke, inilah array saya ingin Anda untuk jumlah." "Ini ukurannya." Apakah itu masuk akal? Apakah itu menjawab pertanyaan Anda? Dalam banyak hal tidak paralel apa yang kita lakukan dengan utama ketika kita memiliki argumen pada baris perintah. Sebuah program seperti Caesar cipher, misalnya, yang membutuhkan argumen baris perintah tidak akan mampu berbuat apa-apa. Ini tidak akan tahu bagaimana untuk mengenkripsi jika Anda tidak mengatakan itu apa kunci untuk menggunakan atau jika Anda tidak tahu itu apa string yang Anda inginkan untuk mengenkripsi. Disuruh untuk masukan, ini adalah di mana kita punya 2 mekanisme yang berbeda untuk mengambil masukan dalam dari pengguna, untuk mengambil informasi dari pengguna. Untuk Soal Set 1 kita melihat GetInt ini, GetString, cara GetFloat dari disuruh untuk masukan, dan itu disebut dengan menggunakan masukan standar. Ini sedikit berbeda. Ini adalah sesuatu yang dapat Anda lakukan pada satu waktu sebagai lawan ketika Anda menjalankan program, ketika Anda memulai program berjalan. Argumen pada baris perintah semua ditentukan ketika Anda memulai menjalankan program. Kami telah mencampur dua dari mereka. Ketika kita menggunakan argumen ke fungsi, itu mirip argumen baris perintah untuk main. Justru ketika Anda memanggil fungsi yang Anda butuhkan untuk menceritakannya apa sebenarnya yang dibutuhkan untuk melakukan tugasnya. Satu hal yang baik untuk melihat-dan aku akan membiarkan Anda melihat itu di waktu luang Anda, dan itu telah dibahas dalam kuis-adalah gagasan dari lingkup dan variabel lokal versus variabel global. Apakah memperhatikan itu. Sekarang kita sudah ke ini hal-hal lain, dalam Minggu 3 kami mulai berbicara tentang pencarian dan menyortir. Pencarian dan menyortir, setidaknya pada CS50, sangat banyak pengenalan beberapa bagian yang lebih teoritis ilmu komputer. Masalah pencarian, masalah pemilahan besar, masalah kanonik. Bagaimana Anda menemukan nomor tertentu dalam array miliaran bilangan bulat? Bagaimana Anda menemukan nama tertentu di dalam buku telepon yang tersimpan di laptop Anda? Dan jadi kami memperkenalkan gagasan kali run asimtotik untuk benar-benar menghitung berapa lama, seberapa keras masalah ini adalah, berapa lama mereka ambil untuk memecahkan. Dalam, saya percaya, kuis, 2011 ada masalah yang saya pikir manfaat meliputi sangat cepat, yang merupakan satu ini, masalah 12. O tidak, itu Omega. Di sini kita berbicara tentang waktu berjalan tercepat mungkin untuk algoritma tertentu dan kemudian run time paling lambat mungkin. Ini Omega dan O adalah benar-benar hanya jalan pintas. Mereka pintas notasi untuk mengatakan seberapa cepat dalam kasus terbaik akan kami algoritma run, dan bagaimana lambat dalam kasus terburuk yang mungkin akan algoritma kita jalankan? Mari kita lakukan beberapa ini, dan ini juga dibahas dalam jangka pendek pada notasi asimtotik, yang saya sangat menyarankan. Jackson melakukan pekerjaan yang benar-benar baik. Dengan pencarian biner, kita berbicara tentang pencarian biner sebagai algoritma, dan biasanya kita berbicara tentang hal itu dalam hal yang big O. Apa O besar? Apa waktu berjalan lambat mungkin pencarian biner? [Mahasiswa] N ²? Dekat, saya kira mirip dengan itu. Ini jauh lebih cepat dari itu. [Mahasiswa] Binary >> Ya?, Pencarian biner. [Siswa] Ini log n. Log n, sehingga apa log n artinya? Hal itu membagi setiap iterasi. Tepat, sehingga dalam kasus paling lambat mungkin, mengatakan jika Anda memiliki array diurutkan dari satu juta bilangan bulat dan nomor yang Anda cari adalah salah elemen pertama dalam array atau elemen yang terakhir dalam array. Ingat, algoritma pencarian biner bekerja dengan melihat elemen tengah, melihat jika itu adalah pertandingan yang Anda cari. Jika ya, maka besar, Anda menemukannya. Dalam kasus terbaik, seberapa cepat tidak menjalankan pencarian biner? [Siswa] 1. 1, saatnya konstan, big O dari 1. Ya. [Mahasiswa] Saya punya pertanyaan. Ketika Anda mengatakan log n, yang Anda maksud sehubungan dengan basis 2, kan? Ya, jadi itu hal lain. Kita mengatakan n log, dan saya kira ketika saya masih di SMA Saya selalu beranggapan bahwa log adalah basis 10. Ya, jadi ya, log 2 dasar biasanya adalah apa yang kita gunakan. Sekali lagi, akan kembali ke pencarian biner, jika Anda sedang mencari baik elemen di akhir atau elemen di awal, karena Anda mulai di tengah dan kemudian Anda membuang mana setengah tidak memenuhi kriteria yang Anda cari, dan Anda pergi ke babak berikutnya dan berikutnya setengah dan setengah berikutnya. Jika saya mencari elemen terbesar dalam array integer juta Aku akan membagi dua itu di log sebagian dari 1 juta kali sebelum saya akhirnya menguji dan melihat bahwa elemen saya cari adalah yang terbesar atau dalam indeks tertinggi array, dan yang akan mengambil log n, log dari 1 juta kali. Bubble sort. Apakah kalian ingat algoritma bubble sort? Kevin, bisa Anda memberi saya rekap cepat dari apa yang terjadi dalam algoritma bubble sort? [Kevin] Pada dasarnya ia pergi melalui segala sesuatu dalam daftar. Ini terlihat pada dua yang pertama. Jika yang pertama adalah lebih besar dari yang kedua itu swap mereka. Kemudian membandingkan kedua dan ketiga, hal yang sama, swap, ketiga dan keempat, semua jalan ke bawah. Angka yang lebih besar akan menindaklanjuti sampai akhir. Dan setelah loop namun banyak Anda sudah selesai. Tepat, jadi apa Kevin mengatakan adalah bahwa kita akan melihat angka yang lebih besar gelembung sampai akhir array. Misalnya, apakah Anda keberatan berjalan kita melalui contoh ini jika ini adalah array kita? [Kevin] Anda akan mengambil 2 dan 3. 3 lebih besar dari 2, sehingga Anda swap mereka. [Nate H.] Benar, jadi kita tukar ini, sehingga kita mendapatkan 2, 3, 6, 4, dan 9. [Kevin] Kemudian Anda membandingkan 3 dan 6. 3 lebih kecil dari 6, sehingga Anda meninggalkan mereka, dan 6 dan 4, Anda akan swap mereka karena 4 lebih kecil dari 6. [Nate H.] Benar, jadi saya mendapatkan 2, 3, 4, 6, 9. [Kevin] Dan 9 lebih besar dari 6, sehingga Anda meninggalkannya. Dan Anda akan kembali melalui itu lagi. [Nate H.] Apakah saya lakukan pada saat ini? >> [Kevin] No Dan kenapa aku tidak dilakukan pada saat ini? Karena terlihat seperti array saya diurutkan. Aku sedang melihat itu. [Kevin] Pergi melalui itu lagi dan pastikan bahwa ada swap tidak lebih sebelum Anda benar-benar bisa berhenti. Tepat, sehingga Anda perlu untuk terus berjalan melalui dan pastikan bahwa tidak ada swap bahwa Anda dapat membuat pada saat ini. Itu benar-benar hanya beruntung, seperti yang Anda katakan, bahwa kita berakhir hanya harus membuat 1 melewati dan kami diurutkan. Tetapi untuk melakukan hal ini dalam kasus umum kita benar-benar harus melakukan hal ini berulang-ulang. Dan pada kenyataannya, ini adalah contoh kasus terbaik, seperti kita lihat dalam masalah. Kami melihat bahwa kasus terbaik mungkin adalah n. Kami pergi melalui waktu 1 array. Apa kasus terburuk mungkin untuk algoritma ini? [Kevin] N ². Dan apa tampilan yang seperti? Apa yang akan tampilan array seperti itu akan memakan waktu ² n? [Kevin] [tak terdengar] diurutkan. Tepat, jadi jika saya memiliki array 9, 7, 6, 5, 2, pertama 9 akan gelembung sepanjang jalan sampai. Setelah 1 iterasi kita akan memiliki 7, 6, 5, 2, 9. Kemudian 7 yang akan meluap, 6, 5, 2, 7, 9, dan seterusnya dan sebagainya. Kita harus pergi melalui seluruh array n kali, dan Anda benar-benar bisa mendapatkan sedikit lebih tepat daripada ini karena sekali kita sudah pindah 9 sepanjang jalan sampai ke posisi terakhir yang mungkin kita tahu bahwa kita tidak perlu membandingkan terhadap unsur itu lagi. Setelah kita mulai menggelegak dalam 7 sampai kita tahu bahwa kita bisa berhenti setelah 7 tepat sebelum 9 karena kita sudah membandingkan 9 untuk itu. Jika Anda melakukan ini dengan cara yang cerdas itu tidak benar-benar, saya kira, itu banyak waktu. Kau tidak akan membandingkan semua kemungkinan [tak terdengar] kombinasi setiap kali Anda pergi melalui setiap iterasi. Tapi tetap saja, ketika kita berbicara tentang hal ini batas atas kita mengatakan bahwa Anda mencari pada n ² perbandingan semua jalan melalui. Mari kita kembali, dan karena kita mulai mendapatkan sedikit pendek pada waktu Aku akan mengatakan Anda pasti harus pergi melalui sisa dari tabel ini, mengisi semuanya. Pikirkan contoh. Pikirkan contoh-contoh kongkrit. Itu benar-benar berguna dan bermanfaat yang dapat dilakukan. Menariknya keluar. Ini adalah semacam tabel bahwa ketika Anda pergi melalui dalam ilmu komputer Anda benar-benar harus mulai mengetahui ini jantung oleh. Ini adalah jenis pertanyaan yang Anda dapatkan dalam wawancara. Ini adalah macam hal yang baik untuk mengetahui, dan berpikir tentang orang-kasus tepi, benar-benar mencari tahu bagaimana berpikir tentang mengetahui bahwa untuk gelembung mengurutkan array kemungkinan terburuk untuk mengurutkan dengan itu adalah salah satu yang ada di urutan terbalik. Pointer. Mari kita bicara sedikit tentang pointer. Dalam beberapa menit terakhir kita miliki di sini Saya tahu ini adalah sesuatu bersama dengan file I / O yang agak baru. Ketika kita berbicara tentang pointer alasan kami ingin berbicara tentang pointer karena, satu, ketika kita sedang bekerja di C kita benar-benar pada tingkat yang cukup rendah dibandingkan dengan bahasa pemrograman yang paling modern. Kami sebenarnya mampu memanipulasi variabel dalam memori, mencari tahu di mana mereka benar-benar terletak di dalam RAM kita. Setelah Anda pergi untuk mengambil kelas sistem operasi Anda akan melihat bahwa itu, sekali lagi, jenis abstraksi. Itu tidak benar-benar terjadi. Kami punya memori virtual yang menyembunyikan detail-detail dari kami. Tapi untuk sekarang Anda dapat berasumsi bahwa ketika Anda memiliki program, Misalnya, ketika Anda mulai menjalankan program anda-cipher Caesar Aku akan beralih kembali ke iPad saya benar-benar cepat- bahwa pada program anda sangat awal, jika Anda memiliki, katakanlah, 4 gigabyte RAM pada laptop Anda, Anda bisa menyisihkan chunk ini, dan kami akan menelepon RAM ini. Dan itu dimulai di tempat yang kita akan menelepon 0, dan berakhir di tempat yang kita akan menelepon 4 gigabyte. Aku benar-benar tidak bisa menulis. Man, yang hacked. Ketika program Anda mengeksekusi sistem operasi mengukir RAM, dan menentukan segmen yang berbeda untuk bagian yang berbeda dari program Anda untuk hidup masuk Di sini daerah ini adalah jenis tanah tak bertuan. Ketika Anda naik sedikit lebih jauh di sini Anda punya benar-benar tempat di mana kode untuk hidup program anda. Itu kode biner yang sebenarnya, bahwa file executable sebenarnya akan dimuat ke memori ketika Anda menjalankan sebuah program, dan tinggal di segmen kode. Dan sebagai program Anda mengeksekusi prosesor terlihat pada segmen kode untuk mencari tahu apa adalah instruksi berikutnya? Apa baris berikutnya kode saya perlu untuk mengeksekusi? Ada juga segmen data, dan ini adalah di mana mereka konstanta string bisa disimpan bahwa Anda telah menggunakan. Dan kemudian lebih jauh sampai ada tempat ini disebut heap. Kami mengakses memori di sana dengan menggunakan malloc, dan kemudian menuju bagian paling atas program anda ada stack, dan itulah di mana kami telah bermain untuk sebagian besar awal. Ini bukan untuk skala atau apapun. Banyak hal seperti ini sangat tergantung mesin, sistem operasi bergantung, tapi ini relatif bagaimana hal-hal bisa chunked up. Ketika Anda menjalankan program dan Anda mendeklarasikan sebuah variabel yang disebut x- Aku akan menarik kotak lain di bawah, dan ini akan menjadi RAM juga. Dan aku akan terlihat. Kami akan menarik garis bergerigi untuk menunjukkan ini hanyalah bagian kecil dari RAM dan tidak semuanya seperti yang kita menarik di bagian atas. Jika saya mendeklarasikan variabel integer disebut x, maka apa yang saya benar-benar mendapatkan adalah pemetaan yang disimpan dalam tabel simbol program saya yang menghubungkan x nama untuk daerah ini memori yang saya sudah ditarik di sini antara bar vertikal. Jika saya memiliki baris kode dalam program saya yang mengatakan x = 7 prosesor tahu "Oh, oke, aku tahu bahwa x hidup di lokasi ini di memori." "Aku akan pergi ke depan dan menulis 7 di sana." Bagaimana tahu apa lokasi ini di memori? Nah, itu semua dilakukan pada waktu kompilasi. Compiler mengurus mengalokasikan mana masing-masing variabel yang akan pergi dan menciptakan pemetaan khusus atau lebih tepatnya menghubungkan titik-titik antara simbol dan di mana itu akan, nama variabel dan di mana itu akan hidup dalam memori. Tapi ternyata bahwa kita benar-benar dapat mengaksesnya dalam program kami juga. Ini akan penting ketika kita mulai berbicara tentang beberapa struktur data, yang merupakan konsep yang kita akan memperkenalkan nanti. Tapi untuk saat ini, apa yang dapat Anda ketahui adalah bahwa saya dapat membuat pointer ke lokasi ini, x. Sebagai contoh, saya bisa membuat sebuah variabel pointer. Ketika kita membuat sebuah variabel pointer kita menggunakan notasi bintang. Dalam kasus ini, ini mengatakan aku akan membuat pointer ke int. Ini adalah jenis sama seperti yang lain. Kami memberikan variabel seperti y, dan kemudian kita mengatur itu sama dengan alamat, ke alamat. Dalam kasus ini, kita dapat mengatur y untuk menunjuk ke x dengan mengambil alamat dari x, yang kita lakukan dengan ampersand ini, dan kemudian kita menetapkan y untuk menunjuk ke itu. Apa ini pada dasarnya tidak adalah jika kita melihat RAM kami ini menciptakan sebuah variabel yang terpisah. Ini akan menyebutnya y, dan ketika baris kode mengeksekusi itu benar-benar akan membuat pointer kecil yang kita biasanya menarik sebagai panah, dan set y untuk menunjuk ke x. Ya. [Mahasiswa] Jika x sudah pointer, akan Anda lakukan int * y = x daripada harus ampersand? Ya. Jika x sudah pointer, maka Anda dapat mengatur 2 pointer sama satu sama lain, dalam hal ini y tidak akan menunjuk ke x, tetapi akan menunjukkan apa x menunjuk ke. Sayangnya, kami kehabisan waktu. Apa yang akan saya katakan pada saat ini, kita bisa bicara tentang ini secara offline, tapi aku akan mengatakan mulai bekerja melalui masalah ini, # 14. Anda dapat melihat sudah ada sedikit diisi untuk Anda di sini. Anda dapat melihat bahwa ketika kita mendeklarasikan 2 pointer, int * x dan y *, dan perhatikan bahwa menunjuk * samping variabel adalah sesuatu yang dilakukan tahun lalu. Ternyata bahwa ini mirip dengan apa yang kita lakukan tahun ini. Tidak peduli di mana Anda menulis * ketika Anda menyatakan pointer. Tapi kami telah menulis * samping jenis karena yang membuatnya sangat jelas bahwa Anda mendeklarasikan variabel pointer. Anda dapat melihat bahwa mendeklarasikan 2 pointer memberi kita 2 kotak. Di sini ketika kita menetapkan x sama dengan malloc apa ini katakan adalah menyisihkan memori di heap. Ini kotak kecil di sini, lingkaran ini, terletak di heap. X menunjuk ke sana. Perhatikan bahwa y masih belum menunjuk apa pun. Untuk mendapatkan memori-untuk menyimpan nomor 42 ke x kita akan menggunakan notasi apa? [Mahasiswa] * x = 42. Tepat, * x = 42. Itu berarti mengikuti panah dan melemparkan 42 di sana. Di sini di mana kita menetapkan y dan x kita y menunjuk ke x. Sekali lagi, ini adalah seperti apa yang dikatakan Kevin mana kita menetapkan y sama dengan x. Y tidak menunjuk ke x. Sebaliknya, itu menunjuk ke apa x menunjuk ke juga. Dan akhirnya dalam kotak terakhir ada 2 hal kemungkinan yang bisa kami lakukan. Salah satunya adalah kita bisa mengatakan * x = 13. Hal lainnya adalah kita bisa mengatakan-Alex, kau tahu apa yang bisa kami lakukan di sini? Anda bisa mengatakan * x = 13 atau- [Siswa] Anda bisa mengatakan apapun int. [Nate H.] Jika ini yang disebut sebagai variabel int kita bisa melakukan itu. Kita juga bisa mengatakan * y = 13 karena mereka berdua menunjuk ke tempat yang sama, sehingga kita bisa menggunakan salah variabel untuk sampai ke sana. Ya >> [Siswa]. Apa yang akan terlihat seperti jika kita hanya mengatakan x int adalah 13? Itu akan mendeklarasikan variabel baru yang disebut x, yang tidak akan bekerja. Kami akan memiliki tabrakan karena kami menyatakan x menjadi pointer di sini. [Mahasiswa] Jika kita hanya memiliki pernyataan bahwa dengan sendirinya apa yang akan terlihat seperti dalam hal lingkaran? Jika kita memiliki x = 13 maka kita akan memiliki sebuah kotak, dan daripada harus panah keluar dari kotak kami akan menarik sebagai hanya 13. [Siswa] Dalam kotak. Oke. Terima kasih untuk menonton, dan semoga sukses pada Kuis 0. [CS50.TV]