JASON Hirschhorn: Selamat Datang ke A5, semua orang. Kami memiliki minggu menyenangkan di depan kita, terutama karena ada begitu banyak baru wajah di ruangan ini. Ini luar biasa. Banyak Anda berada di sini oleh kecelakaan, yang lebih baik. Jadi mudah-mudahan Anda akan tetap bergabung dengan kami. Minggu ini kita akan menghabiskan sebagian besar bagian mempersiapkan kuis. Jadi per agenda kita, kita akan berbicara sedikit tentang sumber daya untuk kelas, tetapi juga untuk kuis, dan kemudian, sekali lagi, menghabiskan sebagian besar kelas berbicara tentang pertanyaan. Setelah kami selesai menjawab Anda pertanyaan, atau jika pertanyaan Anda secara alami membawa kita ke beberapa coding, saya memiliki masalah sampel dari ujian tengah semester masa lalu bahwa kita akan hidup dalam bagian kode bersama-sama yang juga membawa beberapa lainnya topik yang baik untuk menutupi. Jadi pertama, seperti yang kita sudah melalui untuk beberapa minggu terakhir untuk mengingatkan Anda guys, ada satu ton sumber daya tersedia untuk kursus ini. Banyak dari mereka akan sangat membantu kepada Anda sebagai Anda terus belajar untuk kuis 0, karena itu Selasa sore. Jadi kalian semua telah belajar untuk sedikit. Ada catatan kuliah dan sumber kode yang Anda harus pasti memeriksa. Perhatikan celana pendek. Periksa study.cs50.net. Dan kemudian, tercantum di bawah ini, nomor sumber daya lainnya. Sekali lagi, kuis 0 besok pukul 1. Jika Anda belum melakukannya, periksa keluar Tentang Quiz 0 dokumen pada homepage kursus untuk mencari tahu di mana Anda mengambil kuis. Kuis dimulai pada 1:10 dan berakhir 70 menit kemudian. Jadi jika Anda muncul setelah 1:10, Anda akan mendapatkan bahwa banyak menit lebih sedikit dari 70 untuk mengambil kuis. Jadi, pastikan Anda berada di sana pada waktu. Jika Anda seorang mahasiswa ekstensi atau memiliki beberapa pertimbangan pengujian lain, mungkin tidak pada 1:00 besok. Tapi sekali lagi, periksa Tentang Quiz 0 dokumen untuk memastikan Anda tahu kapan Anda mengambil kuis. Saya menulis 75 menit di sini. Saya pikir itu benar, bukan 70. Ini mencakup semua materi dari minggu 0 ceramah minggu lalu pada hari Rabu. Dan sekali lagi, untuk kuis ini, per yang dokumen, Anda mendapatkan satu dua sisi dan 8 1/2 oleh 11 lembar kertas yang Anda dapatkan untuk digunakan sebagai catatan selama kuis. Banyak orang, jika tidak kebanyakan orang, memiliki menemukan bahwa satu cara yang paling bermanfaat belajar untuk kuis ini adalah untuk membuat lembar belajar, satu-Sider, mereka sendiri. Jadi melihat yang terakhir jika Anda telah melihat orang-orang masa lalu. Menjangkau teman-teman untuk melihat apa mereka meletakkan pada mereka. Tapi tangan-down, cara terbaik yang Anda bisa studi ini adalah untuk pergi melalui segala sesuatu dan meraut itu ke apa yang harus atau seharusnya bukan milik pada lembar dari kertas, karena itu hanya benar-benar cara membantu bagi Anda untuk memastikan Anda akan melalui segala sesuatu dan memiliki beberapa keakraban dengan itu. Kebanyakan orang, kita menemukan, meskipun mereka telah lembar kertas duduk tepat di samping mereka pada kuis, tidak mengaktifkan untuk itu, karena, sekali lagi, yang sangat proses melalui informasi telah membantu mereka mempelajarinya. Apakah Ada yang punya pertanyaan tentang kuis 0? Memiliki orang - Aku tidak akan melakukan unjuk tangan. Jangan pikiran. Saya akan bertanya siapa mulai belajar. Tapi aku tidak ingin membuat Anda semua tidak mengangkat tangan Anda. Jadi seperti saya katakan - ya, Avi, silakan. AVI: Apa yang akan menjadi hal yang berguna untuk menempatkan di satu-pager? MAHASISWA: Itu terserah Anda. JASON Hirschhorn: Anda mendapatkan menggunakan penilaian Anda. Hal yang berguna untuk menempatkan di satu-pager, jika Anda bingung tentang O besar runtime dari berbagai jenis pencarian dan macam, menempatkan bahwa di sana dalam grafik pesolek berguna. Dengan cara itu, jika Anda meminta agar pada kuis, Anda tidak perlu mencoba dan angka keluar atau alasan melalui runtime. Anda hanya dapat mencatatnya. Jika Anda melihat kuis masa lalu, banyak kali, ada pertanyaan berjalan waktu. Sehingga akan menjadi contoh yang baik hal untuk memakai satu-pager Anda. Hal baik lainnya untuk memakai, jika Anda bingung tentang bagaimana untuk mendeklarasikan fungsi atau apa bagian-bagian yang berbeda dari deklarasi fungsi adalah, menulis yang di sana, versi generik dan kemudian mungkin sebuah contoh. Jika Anda bingung tentang pointer, diagram tentang bagaimana pointer kerja mungkin benar-benar membantu. Jika Anda bingung tentang rekursi, a sampel fungsi rekursif di sana juga bisa membuktikan menjadi benar-benar membantu. Apakah itu memberi Anda beberapa ide? AVI: Anda perlu memahami Seluruh proses kompilasi, seperti bagaimana semuanya bekerja? JASON Hirschhorn: Semuanya yang telah dibahas dapat muncul di kuis. Pertanyaan - tapi sekali lagi, beberapa hal akan tertimbang berat daripada yang lain. Beberapa hal telah datang lagi dan lagi di kelas, di kuliah, dan bagian. Hal-hal lain belum datang yang sering. Kami telah berbicara banyak tentang # include dan -L sesuatu dan apa yang berarti dalam proses kompilasi. Kami telah berbicara banyak tentang GDB, cling, mereka bendera yang berbeda yang kita gunakan ketika kita mengkompilasi sesuatu, dan apa make15, misalnya, benar-benar berarti dan benar-benar. Kami belum bicara banyak tentang setiap langkah dalam proses kompilasi. Kami masih berbicara tentang hal itu. Jadi itu masih sesuatu yang Anda harus akrab dengan. Tapi sekali lagi, kita tidak akan - hal-hal yang muncul lebih sering di kelas lebih mungkin untuk datang lebih sering dan lebih berat tertimbang pada kuis. Keren. Setiap pertanyaan lain tentang kuis 0? OK, jadi aku meletakkan daftar topik di papan tulis. Aku pergi melalui silabus. Aku pergi melalui review bagian dari tadi malam dan slide tersebut untuk datang dengan daftar lengkap non-topik bahwa kita telah pelajari sejauh ini di CS50 dan hal-hal yang mungkin muncul di kuis. Jadi aku tidak akan pergi melalui setiap satu dari ini. Itu akan mengambil lebih banyak waktu daripada yang kita miliki sekarang. Tapi aku menempatkan ini di sini untuk mudah-mudahan jog memori Anda untuk hal-hal yang mungkin atau mungkin tidak akrab dengan Anda. Dan saya akan senang untuk menghabiskan sebagian besar Bagian menjawab pertanyaan Anda tentang topik, topik yang tidak dibahas di sini. Kita bisa menulis kode semu. Kita bisa menulis kode nyata untuk memastikan bahwa Anda - Saya bisa menjawab pertanyaan Anda dan membantu semua orang pada dasarnya memahami banyak topik ini sehingga Anda akan merasa siap dan nyaman pergi ke kuis besok. Jadi membaca atas daftar. Anda diharapkan telah datang ke bagian dengan beberapa pertanyaan juga. Bila Anda siap, angkat tangan dan kami akan memulai. Perlu diingat, pertanyaan-pertanyaan yang Anda miliki, tidak ada pertanyaan bodoh. Kami telah mendengar bahwa banyak. Dan pertanyaan yang Anda miliki, saya bersedia untuk bertaruh, banyak orang lain baik duduk di sini dan menonton online memiliki juga. Jadi Anda hanya dapat membantu orang dengan mengajukan pertanyaan. Marcus. MARCUS: Antara stack dan heap, apakah ada pra-dialokasikan persentase memori yang didefinisikan sebagai ini adalah untuk stack atau heap? Atau bagaimana yang bekerja, tepatnya? JASON Hirschhorn: Pertanyaan besar. Aku akan kembali melacak sedikit. Apakah semua orang - silahkan jujur ​​di sini. Aku tahu aku meminta Anda untuk meningkatkan Anda tangan di depan rekan-rekan Anda. Tapi apakah ada orang yang merasa tidak nyaman dengan tumpukan dan tumpukan dan ingin pergi lebih dari itu dan apa yang berarti? Angkat tangan Anda jika - OK. Terima kasih. Jadi kita akan pergi ke stack dan heap benar-benar cepat dan kemudian pindah ke menjawab pertanyaan Anda. Jadi jika kita menarik keluar kotak untuk mewakili memori pada komputer Anda, apa adalah beberapa hal-hal yang masuk dalam kotak ini? Main. Fungsi utama. Mana pergi main? SISWA: [Tak terdengar]. JASON Hirschhorn: Jadi kita akan menempatkan utama di sini. Apa lagi yang terjadi di dalam kotak ini? SISWA: Fungsi yang Anda menelepon. JASON Hirschhorn: Fungsi yang kita sebut. Dan di mana mereka pergi? MAHASISWA: Dalam stack. JASON Hirschhorn: Mereka pergi dalam stack. Jadi kita akan menyebutnya hal di sini stack. Dan di bagian atas, kita memiliki heap. Jadi memori tidak kotak seperti ini. Tetapi sebenarnya cukup mirip. Ini akan menjadi banyak lebih kotak dan lebih, tergantung pada seberapa besar Anda komputer atau seberapa besar memori Anda. Pada kutipan-tanda kutip "bottom" adalah stack. Dan ada beberapa hal yang pergi pada stack. Dan orang-orang tergantung pada fungsi Anda harus dalam kode Anda. Anda selalu memiliki satu fungsi dalam Anda kode yang disebut utama, sehingga selalu ada bagian di sini di tumpukan dikhususkan untuk utama. Bagian-bagian ini dalam tumpukan disebut tumpukan frame. Ketika Anda memanggil fungsi lain, katakanlah utama memanggil fungsi pencarian biner, kami menempatkan bingkai lain di stack. Lebih khusus lagi, kita akan menyumbangkan sepotong memori pada kita komputer untuk menyimpan biner pencari lokal variabel dan untuk menjalankan biner kode pencarian. Jadi kita sebut pencarian biner. Dalam potongan ini dari memori, kita akan untuk menyimpan variabel lokal. Kita akan menyimpan panggilan printf nya. Apapun yang terjadi, fungsi yang akan disimpan di sana. Pencarian biner akan mengeksekusi. Hal ini akan menyelesaikan eksekusi. Apa kata dalam C yang menandakan bahwa fungsi harus menyelesaikan eksekusinya? MAHASISWA: Kembali. JASON Hirschhorn: Kembali. Jadi, setiap kali Anda melihat pernyataan kembali, fungsi ujung ketika hits itu. Jadi pencarian biner akan memukul kembalinya. Ini bagian dari memori pada dasarnya akan dibebaskan up. Dan utama akan kembali ke eksekusi. Jadi utama akan berhenti di mana pun itu, panggilan pencarian biner, mendapatkan beberapa nilai kembali, dan melanjutkan eksekusi. Stack frame ini akan hilang. Jika kita memanggil fungsi rekursif, yang adalah fungsi yang memanggil dirinya sendiri atas dan lebih, kita mungkin bisa - mengatakan kita melakukan pencarian biner rekursif. Kita mungkin mendapatkan biner pencarian versi satu, pencarian biner dua, pencarian biner tiga, pencarian biner empat, pencarian biner lima. Dan kemudian pencarian biner ini akhir lima akan memukul kasus dasar, dan stack frame akan kembali dan menjaga penutupan sampai kita kembali ke utama. Kita bisa pergi ke rekursi dalam sedikit. Tapi semua ini adalah untuk mengatakan, jika Anda memanggil beberapa fungsi sekaligus, akan ada beberapa tumpukan frame pada stack. Heap, di sisi lain, sampai di sini, bukan untuk fungsi, bukan untuk variabel lokal. Ini untuk dialokasikan secara dinamis variabel. Jadi ini adalah variabel yang dapat diinisialisasi baik utama atau berfungsi bahwa panggilan utama. Manapun dalam kode Anda, mereka dapat diinisialisasi. Dan untuk menginisialisasi secara dinamis variabel yang dialokasikan. Apa fungsi dalam C yang kita gunakan? MAHASISWA: Malloc. JASON Hirschhorn: Malloc. Kamu menyebut malloc. Anda mendapatkan ruang memori. Dan bahwa ruang memori adalah di heap. Dan bahwa ruang memori tetap di sana sampai Anda menelepon gratis. Jadi variabel yang dialokasikan secara dinamis dalam heap akan ada untuk selama Anda ingin mereka ada, dan mereka tidak akan pergi sampai Anda secara eksplisit memberitahu mereka untuk pergi. Anda dapat membuat mereka dalam satu fungsi. Tumpukan bahwa fungsi ini bingkai akan pergi. Tapi variabel yang akan tetap ada dalam tumpukan sampai dibebaskan, berpotensi dengan fungsi yang disebut pencarian biner atau apa pun. Jadi variabel tumpukan tinggal di sana selama yang Anda inginkan mereka untuk tinggal di sana. Dan mereka mendapatkan dimasukkan di sini. Dan kemudian yang berikutnya akan diletakkan di sana. Mereka terus mendapatkan diisi, dan mereka tinggal di sana sampai Anda menelepon gratis. Dan pada dasarnya, tumpukan dan tumpukan, mendapatkan pertanyaan Marcus, tumbuh terhadap satu sama lain. Dan jika mereka lari ke satu sama lain, Anda sudah digunakan semua memori dalam Anda komputer, dan program anda akan berhenti karena Anda tidak memiliki memori yang lebih kiri untuk menggunakan. Di antara mereka, ada hal-hal yang berpotensi lainnya. Namun untuk lingkup kursus ini, Anda tidak perlu khawatir tentang itu. Jadi itu jawabannya untuk pertanyaan Anda. Jangan dipikirkan. Tapi itu jawaban yang panjang. Semua yang perlu Anda ketahui adalah tumpukan dan tumpukan akan - seseorang mulai di bagian bawah. Tumpukan tidak. Tumpukan di atas sana. Mereka akan tumbuh lebih dekat satu sama lain. Dan jika mereka menyentuh, itu adalah masalah. Anda kehabisan memori. Tapi juga, selain mengetahui di mana mereka, apa yang disimpan di kedua stack dan heap. Curtis. CURTIS: Ketika mereka bertabrakan, adalah bahwa stack overflow? JASON Hirschhorn: Ketika mereka bertabrakan, itu bukan stack overflow. Sebuah stack overflow adalah daerah yang berbeda bahwa kita dapat pergi jika Anda ingin. OK, kami akan datang kembali ke dalam sedikit. SISWA: Apa kata yang disebut ketika mereka memukul satu sama lain, stack dan heap? JASON Hirschhorn: Untuk saat ini, jangan khawatir tentang. Hanya tahu - Saya akan menjawab pertanyaan itu setelah kelas. Jika mereka mengalami satu sama lain, Anda kehabisan memori, karena tidak ada lagi ruang yang ada. MAHASISWA: Maaf, apa kesalahan seg? JASON Hirschhorn: segmen A kesalahan bisa disebut untuk - itu tergantung mengapa seg kesalahan disebut. Kadang-kadang, stack overflow Anda, itu akan mengatakan seg kesalahan sebagai kesalahan. MAHASISWA: Bagaimana dereferencing variabel nol? Apakah itu kesalahan seg? JASON Hirschhorn: Dereferencing pointer nol - OK, jadi jika Anda memiliki pointer yang ditetapkan sama dengan nol, pointer, ingat, alamat memori store sebagai nilai-nilai mereka. Dan pointer nol pada dasarnya menyimpan 0, 0-th alamat di variabel tersebut. Jadi 0x, 0, 0, 0, 0, dan sebagainya. Alamat 0-th dalam memori yang tidak dalam gambar kita, itu terserah ada di suatu tempat, yang dicadangkan untuk komputer. Kami tidak diizinkan untuk menyentuhnya. Jadi, ketika program anda yang mengeksekusi, jika sesuatu sedang mencoba untuk pergi ke memori alamat 0, ia tahu bahwa yang merupakan nilai kosong. Ia tahu apa-apa harus ada. Jadi jika Anda mencoba dan menggunakan sesuatu di sana dan memperlakukan sesuatu seperti ada atau mencoba untuk pergi ke lokasi tersebut, Anda akan mendapatkan kesalahan seg atau kesalahan. Apakah itu menjawab pertanyaan Anda? Dan sekarang kita akan kembali stack overflow. Hal-hal di stack, seperti yang kalian punya lihat sebelumnya, di - mari kita mendekat a up dari bingkai stack. Dapatkah orang melihat itu? Jadi kita memiliki stack frame kami. Kami menyimpan array dalam sebagai lokal variabel dalam fungsi ini. Jadi katakan array kita memiliki lima tempat. Semua lima dari mereka akan disimpan dalam stack frame. Jika kita mulai menulis di luar batas-batas array ini - jadi jika kita mulai menulis ke dalam, katakanlah itu 0. Mereka adalah lima indeks array kami. Jika kita mulai menulis ke dalam indeks 5, yang kita tidak punya ketika kita memiliki array ukuran 5, kita mulai menulis ke Indeks 6, 7, 8, 9, kita bisa mendapatkan sebuah Stack Overflow error. Umumnya ini tidak - Anda mungkin akan mendapatkan masalah jika Anda pergi ke per satu. Tapi pada umumnya, Anda akan masuk ke kebanyakan masalah jika Anda pergi oleh banyak dan Anda pergi sejauh lebih dari yang Anda tulis atas alamat pengirim yang fungsi, yang terletak di bawah stack frame. Karena, kan? Anda - dalam - maaf. Bukan "karena benar." Dalam stack frame, Anda harus variabel lokal Anda. Di bagian paling bawah dari tumpukan bingkai adalah alamat pengirim. Di situlah fungsi pergi kalau sudah selesai. Dan jika Anda menimpa pengembalian yang alamat, maka ketika tumpukan bingkai ini, ketika Anda akan melalui stack frame dan mengeksekusi setiap baris, Anda akan pergi ke alamat pengirim baru Anda yang tertulis di sana bukan salah satu yang sebenarnya. Dan itulah bagaimana kita telah melihat beberapa pelanggaran keamanan dapat terjadi dengan komputer. Jadi stack overflow, singkatnya, adalah ketika Anda menimpa bagian dalam tumpukan Anda seharusnya menggunakan, lokal variabel Anda seharusnya menggunakan, dan khususnya ketika Anda mulai Timpa hal-hal penting seperti kembali alamat. Dan di situlah Anda akan mendapatkan error. Atau bahkan mungkin Anda bisa mulai bahkan menulis ke - mengatakan pencarian biner adalah tepat di atas utama. Jika Anda menimpa banyak, Anda bisa menulis menjadi utama. Tapi pada umumnya, Anda mendapatkan error sebelum kemudian, karena komputer tahu Anda melakukan sesuatu yang Anda tidak harus melakukan. Ya. SISWA: Apa bedanya antara stack overflow dan buffer overflow? JASON Hirschhorn: Buffer overflow adalah jenis yang lebih umum dari apa yang saya baru saja dijelaskan. MAHASISWA: Jadi stack overflow adalah contoh buffer overflow. JASON Hirschhorn: Tepat. Ini adalah sebuah array yang bisa kita pikirkan sebagai penyangga, ruang untuk hal-hal untuk masuk Ini adalah stack buffer overflow. Kita bisa memiliki tumpukan buffer overflow. Jika ada buffer, yang ada sering adalah array heap, dan kami menimpa batas-batas tersebut, maka kita akan memiliki tumpukan buffer overflow. Dan di luar ruang lingkup matakuliah ini, mereka terdeteksi sedikit berbeda. Compiler memiliki khusus cara untuk mendeteksi setiap. Tapi buffer overflow adalah lebih generik jenis apa yang saya jelaskan, yang merupakan tumpukan buffer overflow. Apakah itu menjawab pertanyaan Anda? Manis. Apakah ada pertanyaan lain terkait ke stack atau heap? Ya. SISWA: Aku tahu kau harus string gratis karena mereka berada di tumpukan dan Anda tidak ingin bocor memori. Tapi apakah Anda harus membebaskan variabel global dan hal-hal seperti itu? Atau apakah mereka secara otomatis dibebaskan? JASON Hirschhorn: Pertanyaan yang bagus. Jadi di CS50.H, kita menciptakan hal ini untuk Anda disebut string. Sebuah string benar-benar apa? MAHASISWA: Bintang Char. JASON Hirschhorn: Sebuah bintang char, pointer untuk karakter, pointer ke array karakter. Itulah yang string. Jadi kita perlu untuk membebaskan, karena GetString, yang kita gunakan banyak - string name sama GetString - yang mallocs bagi kita beberapa memori pada tumpukan dan kemudian kembali pointer ke karakter pertama dari String, bintang arang. Jadi seolah-olah, jika Anda belum menulis bebas pada salah satu string Anda bahwa Anda telah disebut sejauh ini, Anda memiliki telah bocor beberapa memori. Tentu saja kita belum berbicara tentang , jadi tidak ada yang mendapat di kesulitan untuk melakukannya. Tapi ke depan, ya. Ketika Anda menelepon GetString, Anda mallocing beberapa ruang di heap. Dan jika Anda tidak menelepon gratis di kemudian hari bahwa String, Anda memiliki kebocoran memori. Itu menjawab pertanyaan Anda? Ya MAHASISWA: Jadi untuk melakukan itu, kita menggunakan hak bebas sebelum kembali? Seperti, dalam lingkup, saya kira jika kita katakan, seperti, int main, dalam lingkup kode yang ada di dalam mereka kurung kurawal, tepat sebelum - Anda tahu di mana kau lebih biasanya menempatkan kembali. Apakah Anda menempatkan bebas sebelum itu? JASON Hirschhorn: Sehingga Anda dapat menempatkan gratis mana pun Anda ingin menempatkan gratis. Karena ini dialokasikan secara dinamis variabel, karena mereka dapat hidup di luar lingkup tertentu fungsi, jika Anda memanggil malloc dalam fungsi yang terpisah, misalnya, GetString, Anda dapat menghubungi gratis dalam utama. Anda tidak perlu menyebutnya dalam fungsi spesifik dimana malloc disebut. Tapi Anda perlu menyebutnya sebelum kembali utama. Dan itu benar-benar tergantung. Hal ini tergantung pada mengapa Anda malloced bahwa ruang di tempat pertama. Beberapa orang akan menyebutnya membebaskan cukup cepat. Beberapa orang tidak akan menelepon gratis sampai akhir program mereka. Dan mereka akan pergi melalui dan bebas segalanya. Hal ini tergantung pada mengapa Anda disebut malloc. MAHASISWA: Dan apa yang akan Anda katakan jika Anda menelepon menggunakan GetString? Anda akan mengatakan gratis apa? JASON Hirschhorn: Jadi sintaks gratis hanya gratis, paren terbuka, tutup paren, dan nama pointer. Jadi jika Anda menulis nama string yang sama dengan GetString, Anda memasukkan nama di sini. Itulah nama pointer. Dan ia tahu untuk membebaskan memori itu. MAHASISWA: Jadi ketika membebaskan bahwa memori, pointer masih menunjuk ke tempat itu dalam memori? Atau pointer juga dikosongkan dari alamat yang menunjuk ke. JASON Hirschhorn: Kita harus mencoba itu. Kita harus kode itu. Mari kita kembali ketika kita sampai coding, dan mari kita kode itu. Dan jika Anda ingin mencari tahu jawabannya untuk itu, Anda juga dapat kode yang sementara itu. Tapi itu pertanyaan yang bagus. MAHASISWA: Apakah mungkin untuk sesuatu yang gratis terlalu cepat? Jadi, Anda masih perlu untuk program anda, dan Anda membebaskan bahwa ruang memori? JASON Hirschhorn: Ya. Hal ini dimungkinkan, jika Anda gratis sesuatu dan kemudian Anda menggunakannya lagi, Anda akan mengalami kesalahan. Tapi itu pada Anda, karena Anda dibebaskan sesuatu dan kemudian disebut nanti. Jadi itu adalah kesalahan programmer. Tapi ya. Anda bisa menulis itu. Setiap pertanyaan lebih lanjut tentang - ya. MAHASISWA: Jadi, jika Anda seharusnya hanya bebas itu secara umum sebelum Program berakhir, artinya jika Program berakhir dan Anda tidak bebas itu, memori yang masih dialokasikan? JASON Hirschhorn: Jika program Anda berakhir dan Anda lupa untuk membebaskan sesuatu, maka memori yang dialokasikan sepanjang masa program Anda. Ketika program Anda menutup sepenuhnya, memori yang tidak akan untuk tinggal di sana selamanya. Komputer cukup pintar untuk mengetahui bahwa ketika program ditutup, itu harus menyingkirkan semua memori yang dikaitkan dengan program itu. Namun, ada alat yang Anda dapat menjalankan pada program untuk mendeteksi jika, ketika Program selesai, Anda lupa untuk membebaskan beberapa memori. Dan untuk masalah Anda berikutnya diatur di mana Anda akan menggunakan malloc dan menggunakan pointer, Anda akan menjalankan ini program pada program Anda untuk melihat apakah, ketika kembali utama, Anda memiliki beberapa hal-hal yang ditinggalkan unfreed. Jadi mereka tidak akan tinggal malloced selamanya di komputer Anda. Itu akan sia-sia, karena sangat cepat, komputer akan kehabisan memori. Tetapi jika mereka berjalan sampai akhir Anda program dan mereka tidak dibebaskan dan Anda Program keluar, itu masih masalah bahwa alat ini akan membantu Anda mengatasi. MAHASISWA: Apakah itu Valgrind? JASON Hirschhorn: Ini disebut Valgrind. Dan Anda akan - MAHASISWA: Tapi kita tidak perlu tahu bahwa untuk kuis, meskipun? Maksudku, itu berbicara tentang sedikit dalam kuliah. JASON Hirschhorn: So Valgrind adalah nama dari alat yang. Mengetahui apa yang dilakukannya adalah cukup untuk kuis. Tapi Anda belum pernah menggunakan it yet pada Anda permasalahan yang karena kita belum memiliki masalah set yang telah secara eksplisit ditangani dengan malloc atau Anda menggunakan malloc. Jadi Anda belum pernah menggunakan Valgrind belum. Tapi Anda akan menggunakannya lebih cepat daripada nanti. MAHASISWA: Bisakah Anda mengulangi apa Valgrind adalah? JASON Hirschhorn: Maaf? MAHASISWA: Bisakah Anda mengulangi apa tujuan Valgring adalah? JASON Hirschhorn: Valgrind adalah nama - seperti GDB membantu Anda men-debug program anda, Valgrind membantu Anda mengetahui apakah hal belum dibebaskan ketika program Anda menutup. Jadi, Anda akan menjalankannya pada program Anda. Dan program anda keluar, dan itu akan mengatakan program anda disebut malloc ini banyak kali untuk ini banyak byte, dan Anda hanya dipanggil gratis ini berkali-kali. Dan sehingga Anda meninggalkan ini banyak byte tanpa dibebaskan. Atau akan mengatakan Anda telah dibebaskan semuanya. Good job. MAHASISWA: OK. Dan itu disebut Valgring? JASON Hirschhorn: V-A-L-G-R-I-N-D. SISWA: Sebuah pertanyaan tentang pointer. Jadi mengatakan Anda telah n membintangi x sama dengan sesuatu. Itu sama, apa pun yang Anda menempatkan ada, adalah bahwa apa yang sedang dimasukkan ke dalam apa x menunjuk ke, atau pointer x? JASON Hirschhorn: Dapatkah Anda ulangi pertanyaannya? Bisakah kita menarik saat Anda mengatakan itu? MAHASISWA: Dalam kuis, sebenarnya, yang Anda kirimkan kepada kami, itu seperti, char kebenaran star sama dengan batu CS50, kan? Jadi, apakah itu berarti bahwa batuan CS50 adalah apa yang sebenarnya menunjuk ke? JASON Hirschhorn: Jadi Anda sedang berbicara tentang bintang arang dalam sebuah string, bagaimana yang bekerja? Ya. OK. Mari kita menggambar ini di sini. [SIDE PERCAKAPAN] JASON Hirschhorn: Jadi variabel ini akan menjadi tipe bintang arang. Seberapa besar adalah variabel dari bintang tipe char? Berapa banyak byte? MAHASISWA: Empat. JASON Hirschhorn: Ini empat byte. Berapa banyak hak-hak adalah variabel tipe int bintang? MAHASISWA: Empat. JASON Hirschhorn: Empat byte. Jika itu pointer, maka selalu empat byte, karena pointer, mereka Nilai adalah alamat memori. Dan alamat memori pada CS50 alat empat byte panjang. Jadi ketika kita sebut GetString, atau ketika kita mengatakan, stringname sama, dan kemudian di tanda kutip ganda menempatkan string, kita menempatkan - well, itu sedikit berbeda. Kami akan melakukan GetString sebagai contoh. Atau bintang arang sesuatu sama dengan string. Maaf, beri saya contoh yang Anda baca? MAHASISWA: Bintang kebenaran arang sama "CS50 batu" dalam tanda kutip ganda. JASON Hirschhorn: Jadi bintang ini, ini kita akan menyebutnya variabel ini x untuk kami tujuan generik. Kami telah menciptakan sebuah variabel yang disebut x. Ini tipe star arang. Ini adalah pointer untuk seri karakter. Jadi di sini - Jadi ini adalah bagaimana hal ini akan bekerja dalam memori. Ini akan menyimpan alamat memori. Ini akan menyimpan alamat memori dari karakter pertama dalam array. Dan kemudian ketika Anda mengikuti pointer, Anda akan mendapatkan karakter pertama. Dan jika Anda membaca hal ini seperti string, komputer Anda pintar cukup untuk mengetahui, membaca semua ini sampai mencapai reaksi 0. Tapi jika Anda membaca karakter di waktu, sehingga Anda iterasi melalui string ini, maka Anda hanya akan membaca karakter pada satu waktu sampai Anda mendapatkan backslash 0. Yang mungkin tidak menjawab Anda pertanyaan, meskipun. MAHASISWA: Ya, tapi Anda belum malloced ruang yang namun untuk pointer itu. JASON Hirschhorn: Jadi saya tidak yakin persis apa yang Anda lihat, karena saya tidak membuat kuis itu. Yang seharusnya membantu sumber daya dari TF lain. Jika Anda membuat string pada stack atau sebagai variabel lokal, itu akan hanya menjadi array biaya daripada umumnya bintang arang menunjuk ke string lain. Tapi aku tidak tahu. Itu bisa menjadi pointer yang lain string pada stack juga. Ya. SISWA: Saya tahu bahwa Anda perlu mengalokasikan memori jika pointer mendapatkan dideklarasikan di dalam fungsi lain. Apakah Anda perlu melakukan hal yang sama jika dinyatakan dalam utama, Anda menggunakannya dalam utama? JASON Hirschhorn: Jadi ya. Anda dapat mendeklarasikan pointer ke setiap alamat memori dalam memori. Hal ini dapat menjadi alamat memori lokal variabel, meskipun seringkali, orang tidak menyatakan alamat memori untuk variabel lokal karena mereka pergi jauh sekali fungsi yang mengembalikan, yang mengapa kita umumnya malloc hal. Tapi ya, Anda bisa menyatakan pointer ke variabel lokal lain. Hanya saja umumnya tidak dilakukan. Tapi aku bisa melihat pada saat itu hal tertentu setelah kelas. Ya. SISWA: Saya pikir ini adalah semacam dari apa yang diminta. Kelihatannya aneh untuk menginisialisasi pointer bukan sebagai alamat, tetapi karena apa yang Sepertinya nilai. Sepertinya CS50 adalah apa yang ada di dalamnya hal yang sedang menunjuk dan bukan alamat yang sebenarnya, kan? JASON Hirschhorn: Jadi itu tidak terjadi, meskipun. Itu bukan apa yang terjadi. Ketika Anda mendeklarasikan bintang char, itu adalah alamat memori. Pointer adalah semua alamat memori menunjuk ke sesuatu yang lain. Itu sesuatu yang lain bisa berada di stack, tetapi hampir selalu ada di tumpukan dalam cara kita akan melihat dulu. Tapi stringname sama dengan double-quote "GetString," kita dapat melihat itu dan kami dapat melihat melalui itu dan kode itu. GetString string tidak disimpan di bahwa variabel, atau apa pun string Nama ini tidak disimpan dalam variabel, karena itu bukan cara pointer bekerja. Apakah itu masuk akal? MAHASISWA: Ya. JASON Hirschhorn: OK. Mudah-mudahan, itu tidak membingungkan kepada siapa pun. Tapi kalau itu, kita dapat melihat lagi dalam sedikit, karena kami benar-benar akan kode sesuatu yang akan mudah-mudahan bekerja dengan string dan membantu Anda merasa lebih nyaman dengan mereka. Ada pertanyaan lain yang berkaitan dengan ini topik atau topik lain yang Aku akan menaruh kembali? Dan - sekarang. Ya, Alden. ALDEN: Jadi ini sama sekali tidak berhubungan, tapi bisakah kita pergi ke sangat cepat apa yang kita perlu tahu tentang perbedaan antara 32 dan Mesin 64-bit? JASON Hirschhorn: Ya. Jadi 32 bit adalah berapa banyak byte? ALDEN: Ini empat byte. JASON Hirschhorn: Ini empat byte. Dan 64 bit adalah berapa banyak byte? MAHASISWA: Delapan. JASON Hirschhorn: Delapan byte. Jadi sekali lagi, delapan bit adalah satu byte. Alat CS50 Anda mesin 32-bit. Jadi alamat memori empat byte panjang. Ada 2 ke 32 alamat memori. 0 sampai 2 dengan 32 dikurangi 1. Dan aku tidak positif, tapi itu mungkin ruang lingkup apa yang Anda butuhkan untuk tahu mesin 32-bit, memori alamat, sekali lagi, empat byte panjang, dan itulah jumlah maksimum alamat memori. Selain itu, tipe data - ini mungkin sesuatu yang baik itu perlu diperhatikan. Ukuran tipe data tergantung pada mesin Anda bekerja dengan. Jadi char, karakter tunggal, adalah bagaimana banyak byte pada alat CS50 kami? Satu byte. Dan itu benar-benar satu byte sebagai baik pada mesin 64-bit. Dan sebagian besar jenis data nomor yang sama dari byte pada kedua mesin. Tetapi beberapa tipe data akan berbeda pada kedua mesin. Sehingga akan berpotensi Satu-satunya hal yang perlu Anda ketahui. Tetapi bahkan itu, saya pikir, berada di luar batas - Aku hampir yakin, jika Anda melihat kembali di kuis tua, ia mengatakan, berasumsi untuk coding masalah Anda menggunakan mesin 32-bit. Tapi ada, untuk pergi bersama dengan itu dalam Jika Anda tertarik, ada tipe data yang sama ukuran pada semua mesin. Jika Anda pernah melihat sesuatu seperti uint32_t, Anda mungkin atau mungkin tidak melihat itu. Itu tipe data. Itu mengatakan, menjadi 32 bit tidak peduli apa mesin ini adalah pada. Jadi, ketika orang menulis portable kode, mereka mungkin tidak akan menggunakan ints. Mereka bukannya akan menggunakan data-data lainnya jenis yang mereka tahu akan sama ukuran pada setiap mesin tunggal. Madhu. MADHU: Saya punya pertanyaan tentang proses kompilasi. Jadi jika Anda sedang menulis sebuah program yang menggunakan perpustakaan seperti CS50 atau sesuatu seperti itu, saya tahu bahwa perpustakaan yang harus, di beberapa titik, menjadi dikompilasi dan dihubungkan masuk Tapi berapa banyak yang terjadi selama penyusunan program anda? Apa bagian dari proses perpustakaan terjadi ketika Anda kompilasi program Anda sendiri? JASON Hirschhorn: Jadi mari kita pergi ke umumnya langkah-langkah dari proses ini. Anda menulis file c. Anda. Dalam file c., Anda # include Anda Header perpustakaan, misalnya, cs50.h. Apa yang mencakup tajam baris lakukan untuk program anda? Akchar. AKCHAR: Ia menambahkan prototipe fungsi dari header file dalam perpustakaan. JASON Hirschhorn: Tepat. Ia menambahkan fungsi tersebut prototipe ke kode Anda. Jadi, ketika kode Anda sedang disusun dalam tahap awal, compiler tahu bahwa fungsi-fungsi ini benar-benar ada, dan bahwa di suatu tempat mereka telah didefinisikan. File-file. H tidak termasuk definisi untuk fungsi-fungsi ini atau bagaimana mereka benar-benar bekerja. Cs50.h hanya mencakup sesuatu yang mengatakan GetString adalah hal nyata yang bisa terjadi. Dan standardio.h mengatakan printf adalah sebuah hal yang nyata yang bisa terjadi. Header Jadi bahasa c Anda dengan ini. file akan berubah menjadi beberapa kode mesin yang dapat dibaca, yang akhirnya akan berubah menjadi biner kode, 0 dan 1. Dan itulah kode yang pada akhirnya dijalankan. The-l CS50 line - misalnya, ketika Anda sedang menulis dentang - dan kemudian Anda termasuk-l CS50, Anda mengetik itu masuk Dan Anda melihat bahwa. Ketika Anda menulis membuat, Anda akan melihat baris yang di sini. Dan kita akan melihat bahwa dalam satu detik ketika kita kode atau nanti pada saat kita kode. Tapi itu-l garis CS50 melakukan sesuatu sedikit berbeda dari # include cs50.h. Apa garis itu-l CS50 lakukan? Avi? AVI: Saya ingin mengatakan bahwa itu link perpustakaan ke fungsi panggilan, seperti file o.. JASON Hirschhorn: Jadi sangat dekat, jika tidak spot-on. The-l CS50 mengambil file biner dan menyatu dengan file biner Anda. Jadi cs50.h, tidak ada gunanya dalam mengubah cs50.h dari bahasa C ke biner setiap waktu tunggal itu digunakan. Itu akan konyol, karena akan membuang banyak waktu. Jadi telah disusun dan berubah menjadi executable. Dan sekarang itu akan digabung dengan file Anda di akhir. Jadi mereka 1 dan 0 akan untuk bergabung dengan orang yang Anda dan 0 pada akhir. Jadi sekarang Anda benar-benar akan memiliki sebenarnya 1 dan 0 yang menentukan bagaimana GetString, misalnya, bekerja, atau bagaimana printf, misalnya, bekerja. Dan untuk informasi lebih lanjut, ada compiler pendek yang memberikan Nate bahwa Anda harus memeriksa yang berlangsung melalui langkah-langkah ini. Tapi - ya. MAHASISWA: Apakah mereka selalu dalam file o. ketika mereka sedang dalam bentuk perpustakaan, siap untuk digabung, terkait - seperti mereka dalam kode biner? JASON Hirschhorn: OK. Apa - MAHASISWA: Apakah itu selalu terjadi untuk perpustakaan ketika Anda menghubungkan mereka? JASON Hirschhorn: Ya. Jadi ada. S file, yang akan kode mesin, yang juga akan samar bagi Anda. Anda tidak perlu khawatir tentang mereka. Tapi pada umumnya, yeah, mereka akan berada di. o file siap untuk pergi. MAHASISWA: Jadi, ketika Anda mengirim ke perpustakaan, apakah Anda hanya kapal h. dan. o? Anda tidak kapal c. Atau. S. JASON Hirschhorn: So - dan ini adalah singkatnya ini juga, jika Informasi ini tampaknya datang suatu sedikit cepat. Tapi pendek pada kompiler berbicara tentang ini juga. Ketika Anda mengirimkan perpustakaan, jika Anda kapal h., file header, mereka prototipe fungsi, dan 1 dan 0 itu, itu semua yang Anda butuhkan untuk memberikan. Anda tidak perlu memberikan bagaimana fungsi bekerja, file c.. Karena titik abstraksi, atau titik API, titik di SPL ini, Stanford perpustakaan portabel, itu bagi Anda untuk tidak khawatir tentang bagaimana baru GRect bekerja, atau bagaimana memindahkan karya, atau bagaimana menambah bekerja. Semua yang perlu Anda ketahui adalah bahwa add adalah fungsi yang dapat Anda gunakan, dan hal ini. Jadi Anda benar-benar tidak perlu tahu bagaimana itu ditulis di C. Anda hanya perlu tahu, di sini adalah fungsi, apa yang mereka lakukan, dan di sini adalah 1 dan 0 ketika Anda benar-benar ingin menggunakannya. Keren. Setiap pertanyaan lebih lanjut tentang compiler atau topik lainnya di papan? SISWA: Saya punya pertanyaan dari melaksanakan fungsi rekursif. Sebuah pertanyaan tentang rekursi. Aku punya perasaan yang akan datang. Jadi mari kita cepat pergi melalui rekursi dengan spesifik Misalnya, fungsi faktorial. Karena ini adalah sebuah contoh yang sering muncul atau digunakan untuk menggambarkan rekursi. Jadi "4!" dibaca sebagai 4 faktorial. Dan apa artinya 4 faktorial? Apa artinya itu lakukan? Bagaimana Anda menghitung faktorial 4? 4 kali 3 kali 2 kali 1. Jadi cara lain untuk menulis 4 faktorial adalah untuk menulis ini. 4 kali 3 faktorial. Karena 3 faktorial adalah 3 kali 2 kali 1. Jadi 4 kali 3 faktorial adalah 4 kali 3 kali 2 kali 1. Inilah sebabnya mengapa faktorial adalah besar calon rekursi, karena itu jelas bahwa ada sesuatu yang terjadi berulang-ulang pada sejumlah kecil hal-hal sampai Anda mencapai akhir. Ketika Anda mencapai 1, 1 faktorial adalah 1. Anda tidak bisa pergi lebih jauh. 0 faktorial juga didefinisikan sebagai 1. Jadi, ketika Anda sampai ke 1 atau 0, Anda di akhir, dan Anda dapat mulai naik kembali. Jadi jika kita ingin menulis sebuah rekursif fungsi untuk menghitung faktorial, kita akan menulis beberapa pseudocode untuk itu sekarang. Sebelum kita menulis pseudocode itu - Aku akan memberikan kalian beberapa menit untuk menulis kode semu atau hanya berpikir tentang hal ini - ada dua hal setiap fungsi rekursif kebutuhan. Apa kedua hal itu? JACK: Hal ini untuk menyebut dirinya. JASON Hirschhorn: Noah? Oh, Jack. Silakan. JACK: Hal ini untuk menyebut dirinya. JASON Hirschhorn: Jadi rekursif fungsi membutuhkan panggilan rekursif, a panggilan untuk dirinya sendiri. Itu salah satu. Dan apa hal lain? JACK: Sebuah kasus dasar. JASON Hirschhorn: Sebuah kasus dasar. Sebuah kasus dasar adalah, di sini adalah ketika kita berhenti. Jadi fungsi Anda dipanggil. Kasus dasar datang pertama. Anda ingin tahu apakah Anda berada di akhir. Dan jika Anda tidak di akhir, Anda membuat panggilan rekursif Anda. Dan Anda pergi melalui fungsi ini lagi, memeriksa kasus dasar Anda lagi. Jika Anda tidak akhirnya, Anda membuat panggilan rekursif lain, et cetera, et cetera. Itulah mengapa fungsi rekursif selalu perlu kasus-kasus dasar dan mereka panggilan rekursif. Jika Anda tidak memiliki panggilan rekursif, itu tidak akan menjadi fungsi rekursif. Jika Anda tidak memiliki kasus dasar, Anda akan pergi selamanya dan tidak akan ada akhir. Dan kasus dasar selalu datang pertama, karena Anda akan selalu ingin memeriksa jika Anda di akhir pertama. Jadi sebelum kita melakukan beberapa pseudocode, mengapa Anda tidak luangkan waktu sebentar untuk berpikir tentang bagaimana fungsi faktorial rekursif akan ditulis? Selain itu, sebanyak yang Anda lakukan, menulis itu pada selembar kertas apa yang Anda akan harus lakukan pada kuis besok. Praktek jadi mungkin baik untuk membuat Pastikan kode Anda sedang menulis di atas selembar kertas - atau Anda bisa melakukan itu. Anda tahu di mana titik koma adalah. Kau ingat sintaks. Karena Anda tidak dapat memiliki compiler memberitahu Anda membuat kesalahan. Juga, di sepanjang jalur tersebut, besok, ketika Anda telah coding masalah, jika Anda bergegas untuk waktu, atau jika Anda sangat bingung bagaimana Anda seharusnya menulis hal tertentu dalam c, itu akan behoove Anda untuk menulis pseudo-code atau menulis komentar di juga. Karena ada kredit parsial untuk banyak pertanyaan pada kuis. Jadi Anda mungkin terburu-buru, atau Anda mungkin saja bingung. Menulis dalam komentar atau pseudo-code sering cara yang Anda bisa mendapatkan kredit parsial. Jadi jangan meninggalkan sesuatu kosong di kuis. Tidak ada hukuman untuk menempatkan hal-hal masuk Bahkan, menempatkan dalam pseudo-code atau Komentar akan membantu grader yang mencari tahu apakah Anda benar-benar tahu apa yang Anda bicarakan, dan mungkin penghargaan Anda beberapa kredit parsial untuk itu. Juga di sepanjang jalur tersebut, menulis dengan jelas. Jika kita tidak bisa benar-benar apa yang Anda tulis, kita tidak akan menelepon Anda pada tengah malam besok untuk angka apa yang Anda tulis. Kami hanya akan melepas poin. Menulis dengan jelas sehingga kita bisa mendengar, atau lebih tepatnya, kita dapat membaca apa yang Anda tulis. Dan jika ia mengatakan dua kalimat, tidak menulis sebuah paragraf. Ikuti petunjuk. Menulis dengan jelas. Dan menulis pada mereka komentar atau pseudocode untuk pertanyaan-pertanyaan yang bisa penghargaan kredit parsial. OK, mari kita pergi ke faktorial. Jadi kita memiliki fungsi faktorial. Jika saya benar-benar menulis ini di C, apa yang harus saya harus menempatkan sebelum nama fungsi? Jenis kembali, yang, dalam hal ini kasus, kami akan memberikan int. Dan kemudian di dalam kurung kurawal, adalah apa yang terjadi di dalam kurung kurawal untuk fungsi? MAHASISWA: Jenis Argumen. JASON Hirschhorn: argumen Its. Jadi faktorial mungkin akan mengambil argumen. Ini akan mungkin hanya mengambil satu argumen. Dan kami akan mengatakan itu akan mengambil integer disebut x. Dan lagi, ketika menulis prototipe fungsi atau menulis fungsi dalam kode Anda sebelum menentukan itu, Anda menulis tipe data dan nama bahwa variabel untuk fungsi itu saja. Sehingga Anda dapat melewati beberapa nomor ke ini fungsi, itu akan disebut sebagai x internal. Kami memiliki fungsi faktorial kami. Kita perlu dua hal, kasus dasar dan panggilan rekursif. Apa kasus dasar untuk faktorial? Seseorang yang menulis itu dan siapa yang tidak berbicara lagi, apa dasar kasus untuk faktorial? MAHASISWA: Jika n kurang dari 2, kembali 1. JASON Hirschhorn: Jika n adalah kurang dari 2, kembali 1. Saya suka itu, karena itu mengurus 0 dan 1. Jadi kita akan lakukan x <2, kembali 1. Jika kita bisa melewati 0, jika kita mendapatkan berlalu 1, fungsi ini akan segera mengembalikan 1. Jika kita bisa melewati beberapa nomor lebih besar dari atau sama dengan 2, kita akan memiliki panggilan rekursif kami. Dan bagaimana yang akan bekerja? Dapatkah orang lain yang bekerja pada ini yang belum berbicara memberi saya panggilan rekursif untuk fungsi ini dalam pseudocode? Jika kita bisa diteruskan di sejumlah x dan itu lebih besar dari 2, apa yang ingin kita lakukan? Kami juga telah contoh ditulis pada samping yang mungkin memberikan petunjuk. MAHASISWA: Call x kali faktorial x dikurangi 1? JASON Hirschhorn: Tepat. Kita akan kembali x kali faktorial dari x dikurangi 1. Dan itu, meskipun aku menulis, Pada dasarnya, apa yang Anda katakan dalam bahasa Inggris, fungsi faktorial ini akan dipanggil lagi. Ini akan mengeksekusi pada x dikurangi 1. Ini akan kembali dengan beberapa integer, dan maka akan kalikan kedua bersama-sama, dan nilai yang akan kembali ke apa yang disebut ini fungsi faktorial, kekuatan yang menjadi contoh lain dari fungsi faktorial ini. Jadi itu adalah contoh dari sebuah rekursif fungsi, sangat fungsi rekursif sederhana. Tapi kebanyakan dari mereka akan menjadi seperti ini. Jika Anda ingin rekursif baik menantang untuk kuis, coba coding pencarian biner rekursif. Karena jika Anda melakukan pencarian biner untuk masalah menetapkan tiga, Anda mungkin melakukannya iteratif dalam loop sementara. Tetapi juga dapat ditulis rekursif. Anda akan perlu untuk menulis sendiri fungsi yang terpisah yang mengambil beberapa berbeda argumen baris perintah - atau bukan baris perintah argumen, beberapa argumen hanya biasa yang berbeda. Tapi Anda bisa menulis pencarian biner rekursif juga. MAHASISWA: Jadi Anda bisa juga menulis, bukan x dikurangi 1, Anda bisa juga menulis x dikurangi dikurangi, atau Anda bisa memiliki ditulis dikurangi dikurangi x. Dapatkah Anda hanya menjelaskan mengapa sangat cepat mereka akan hal-hal yang berbeda, seperti apa perbedaan antara x dikurangi dikurangi dan dikurangi dikurangi x? JASON Hirschhorn: Tidak, aku tidak akan masuk ke itu. Tapi saya akan berbicara dengan Anda tentang hal itu setelah kelas. x dikurangi dikurangi, dikurangi dikurangi x pengurangan x dengan 1. Tapi mereka melakukannya sedikit berbeda. Tapi aku tidak ingin pergi ke dalam. Pertanyaan lain tentang rekursi atau fungsi ini? Itu tidak benar-benar bahkan pseudocode. Itu pada dasarnya kode C Anda akan menulis untuk ini. OK, pertanyaan lain tentang topik di sini? Ya. SISWA: Saya memiliki ikhtisar singkat dari floating point dan presisi. JASON Hirschhorn: Mengambang titik dan presisi. Dapatkah seseorang benar-benar cepat memberikan ikhtisar dari floating point dan presisi? Anda semua harus melakukan ini untuk Anda masalah ditetapkan, sehingga Anda semua akrab dengannya. Atau mungkin tidak semua dari Anda. Siapa saja? Beri aku tempat dimulai. Floating point dan presisi. Apa masalahnya? Ya. Victoria? VANESSA: Vanessa. JASON Hirschhorn: Vanessa. Maaf. VANESSA: Hanya ada jumlah terbatas angka yang dapat diwakili karena Anda berada di dalam kita kasus, sistem 32-bit. Jadi, Anda semacam harus membuat beberapa angka. JASON Hirschhorn: Jadi itu tepat. Hanya ada sejumlah angka yang dapat diwakili. Jika Anda mengalikan dua angka yang sangat besar, mungkin meluap jumlah ruang yang Anda miliki untuk mewakili integer. Itulah mengapa terkadang kita menggunakan lama bukan sebuah int. Itu memiliki lebih banyak ruang. Yang dapat menampung jumlah yang lebih besar. Floating point presisi harus dilakukan dengan itu, tetapi juga berkaitan dengan fakta bahwa angka desimal yang tidak selalu terwakili. Maaf. Biarkan aku kembali hal ini. Angka desimal 1.0 tidak selalu diwakili seperti yang Anda harapkan, 1,000000000. Hal ini kadang-kadang direpresentasikan sebagai 1,000000001 0,999999999 atau. Mungkin bahkan 89 dilempar di sana di suatu tempat. Jadi angka-angka desimal tidak diwakili persis seperti Anda akan mengharapkan mereka untuk diwakili. Jadi dalam masalah set - apakah itu dua? - masalah mengatur dua, di mana kita berurusan dengan angka floating point, ketika kita ingin mereka mewakili apa yang kita inginkan mereka untuk mewakili, jumlah sen, atau jumlah sen, kita kalikan mereka dengan 100. Kami mengitari mereka. Dan kemudian kita memotong segala sesuatu di belakang titik desimal. Ini untuk memastikan bahwa mereka akan sebenarnya sama apa yang kita inginkan mereka sama. Karena ketika Anda mengambil sesuatu yang a mengambang dan mengubahnya menjadi sebuah int, Anda memotong segala sesuatu ke kanan titik desimal. Karena ada beberapa floating point ketidaktepatan, 100.000 mungkin direpresentasikan sebagai 99,999999999. Dan jika Anda hanya memotong segala sesuatu untuk hak segera, Anda akan mendapatkan nomor yang salah. Ya. SISWA: aku punya pertanyaan tentang pengecoran. Agar Apa terjadi pada? Jika Anda akan melakukan float, kurung, 1 dibagi 10, apakah itu yang 1 dibagi dengan 10, kemudian mendapatkan 0,1, kemudian hidupkan ke pelampung? JASON Hirschhorn: Jika Anda mengapung 1 dibagi dengan 10 - MAHASISWA: Ya, dan kemudian sama - baik, itu akan normal memilikinya sama dalam - Ya. Anda ingin membuat pelampung, kan? JASON Hirschhorn: OK, jadi kita akan menggunakannya untuk Segue ke Warnet jawaban atas pertanyaan-pertanyaan ini melalui coding. Karena Anda mungkin akan memiliki banyak pertanyaan kecil ini, dan cara yang baik untuk menyelesaikannya adalah melalui coding. Jadi kita akan kode ini sekarang, dan kemudian kita akan kembali dan kode pertanyaan yang Anda miliki. Jadi baris pertama - Saya tidak seharusnya menulis itu - apa yang hal pertama yang ingin kita lakukan ketika kita membuka file baru di gedit? MAHASISWA: Sertakan. JASON Hirschhorn: Sertakan apa? MAHASISWA: perpustakaan CS50. JASON Hirschhorn: OK. Apa lagi yang harus kita termasuk? Kami hanya akan memeriksa apa yang terjadi ketika Anda melemparkan sesuatu ke pelampung. Tapi apa yang kita perlu menyertakan jika kita akan menulis sebuah program C? SISWA: Standard I / O. JASON Hirschhorn: stdio.h. Kami benar-benar tidak perlu, untuk ini Program, cs50.h, meskipun itu selalu membantu untuk memasukkannya. Tapi kita selalu membutuhkan stdio.h. MAHASISWA: Ketika coding di C? JASON Hirschhorn: Ketika coding di C. Jadi saya simpan sebagai berkas ini c.. Saya mendapatkan beberapa nice sintaks. Saya menulis kekosongan dalam utama. Apa artinya batal? MAHASISWA: Tidak mengambil argumen baris perintah. JASON Hirschhorn: berarti Void, dalam hal ini kasus, utama tidak mengambil argumen baris perintah. Dalam kasus lain, itu berarti fungsi tidak mengambil argumen baris perintah. Atau fungsi, jika saya harus menulis batal main (void), yang akan mengatakan itu utama tidak mengembalikan apa-apa. Jadi batal hanya berarti apa-apa. Apa yang akan saya tulis jika saya mengambil argumen command-line? MAHASISWA: int busur string c busur v JASON Hirschhorn: int argc String argv. Apakah itu benar? SISWA: Ini Char kurung bintang argv. JASON Hirschhorn: Jadi Anda bisa menulis kurung String argv atau bintang arang argv kurung, tetapi Anda membutuhkan tanda kurung. Karena argv adalah array string, ingat. Ini bukan hanya satu string. Jadi String argv adalah, inilah satu string disebut argv. Kurung String argv adalah, inilah array dari string. Jadi int argc kurung String argv akan menjadi sesuatu yang saya mungkin akan menulis. Jadi, Anda ingin menyimpan dalam integer? MAHASISWA: Ya, integer. Atau pelampung. JASON Hirschhorn: Dalam pelampung? Seperti, float x sama dengan 1 dibagi dengan 10. JASON Hirschhorn: OK. Bagaimana cara mencetak pelampung di printf? Apa? MAHASISWA:% f. JASON Hirschhorn:% f. Apa integer? d atau i. Apa string? MAHASISWA: s. JASON Hirschhorn: s. Bagaimana cara mendapatkan baris baru? MAHASISWA: Backslash n. JASON Hirschhorn: Apa yang harus saya kembali jika berjalan utama dengan benar? MAHASISWA: 0. Apakah saya perlu menulis baris tersebut, meskipun? MAHASISWA: No OK, kita tidak akan menuliskannya, lalu. Dapatkah semua orang membaca itu? Ini terlihat agak kecil. Dapatkah orang melihat, atau harus Saya membuatnya lebih besar? Saya pikir untuk kamera, kita akan membuat itu sedikit lebih besar, meskipun. JASON Hirschhorn: Jika saya ingin mengubah ini . C file ke dalam executable, apa aku menulis? MAHASISWA: Membuat test. JASON Hirschhorn: Maaf? MAHASISWA: Membuat test. JASON Hirschhorn: Membuat test. Kami sedang membicarakan baris ini sebelumnya. Dentang. Apa dentang? Nama compiler. Apa baris ini? MAHASISWA: Mengatur itu untuk penggunaan GDB. JASON Hirschhorn: Set itu untuk penggunaan GDB. Baris ini, apa itu? MAHASISWA: Source code. JASON Hirschhorn: Itulah file sumber, file c.. Apa yang dua baris ini lakukan? Atau dua baris ini tidak. SISWA: Ini nama itu menguji. JASON Hirschhorn: Jadi dasbor o mengatakan, nama itu sesuatu yang berbeda. Dan di sini Anda menyebutnya tes. Jika aku tidak memiliki itu di, apakah itu nama ini? MAHASISWA: a.out. JASON Hirschhorn: a.out. Apa yang dilakukan ini? MAHASISWA: Link perpustakaan matematika. JASON Hirschhorn: Ini link di perpustakaan matematika. Kami tidak termasuk perpustakaan matematika, tetapi karena itulah begitu umum, mereka sudah make tertulis untuk selalu menyertakan perpustakaan matematika. Dan juga, ini termasuk perpustakaan CS50. OK, jadi jika kita daftar, kita sekarang memiliki perintah yang disebut tes. Untuk menjalankannya, saya menulis tes. Saya melihat bahwa floating point saya, seperti yang diharapkan, sama dengan 0. Apakah itu - jadi - MAHASISWA: Kemudian jika Anda menempatkan mengapung sekarang, seperti Anda dilemparkan sebagai pelampung - JASON Hirschhorn: Cast 1 sampai pelampung? MAHASISWA: Tidak, melemparkan hal penuh - ya. Jika Anda hanya melakukan itu, akan yang membuatnya 0.1? JASON Hirschhorn: OK, sehingga benar-benar cepat, 1 dibagi dengan 10, yaitu bilangan bulat yang dibagi. Jadi, ketika Anda membagi bilangan bulat, mereka 0, dan Anda menghemat bahwa 0 dalam mengapung, karena slash adalah hanya pembagian integer. Jadi sekarang kita mengubah sesuatu menjadi pelampung. Mari kita lihat apa yang terjadi. Kami akan membuat tes. Jadi sekarang kita melihat bahwa slash itu tidak pembagian integer, itu mengambang pembagian titik. Karena salah satu argumen telah dilemparkan ke float. Jadi sekarang itu mengatakan, memperlakukan ini divisi seperti kita sedang berhadapan dengan poin mengambang, bukan dengan bilangan bulat. Dan jadi kami mendapatkan jawaban yang kita harapkan. Mari kita lihat apa yang terjadi - oops. Jika saya ingin mencetak lebih banyak desimal bintik-bintik, bagaimana saya bisa melakukan itu? MAHASISWA: Point dot f, atau sebanyak desimal yang Anda inginkan. JASON Hirschhorn: Jadi saya mencetak 10 tempat desimal. Dan kita sekarang melihat kita mendapatkan beberapa hal aneh. Dan yang akan kembali ke pertanyaan Anda tentang floating point ketidaktepatan. Ada hal-hal aneh yang tersimpan di sini. OK, apakah itu menjawab pertanyaan Anda? Apa lagi yang Anda inginkan kode cepat? SISWA: Aku hanya ingin melihat apakah tidak, jika Anda membebaskan beberapa pointer, apakah pointer yang masih telah disimpan dalam itu alamat apa yang telah menunjuk ke sebelumnya. JASON Hirschhorn: OK, jadi mari kita melakukan itu. Ptr star Char, ini menciptakan sebuah variabel disebut ptr tipe bintang arang. Bagaimana cara menulis malloc? Alden? ALDEN: Just malloc. Tapi kemudian itu harus ukuran, dan dalam hal ini, saya kira kau lebih menunjuk ke char. Jadi itu akan menjadi arang. JASON Hirschhorn: OK, jadi lebih umum, Inside - mari kita edit. Di dalam malloc, Anda ingin nomor dari byte di heap. Secara umum, apa yang kita telah melihat bahwa kita lakukan adalah kita akan malloc string, misalnya, atau array bilangan bulat. Jadi jika kita ingin 10 bilangan bulat, atau 10 chars, 10 akan memberi kita 10. Dan kemudian ukuran karakter akan memberikan kita bahwa ukuran karakter, yang pada kasus ini adalah 1 byte. Kami mendapatkan 10 byte. Jika kita menulis ukuran int, yang akan memberi kita 40 byte. Jadi lebih umum, dalam malloc adalah jumlah byte yang Anda inginkan. Dalam hal ini, kita mendapatkan 1 byte. Yang tampaknya seperti penggunaan aneh malloc, tapi untuk kami tujuan masuk akal. Jadi ada itu. Kita akan menelepon gratis. Kami menyingkirkan itu dan kami menggunakan ptr lagi. Dan apa yang Anda ingin memeriksa? SISWA: Aku hanya ingin memeriksa apakah atau tidak ada apa-apa di dalamnya. JASON Hirschhorn: Jadi apakah itu menunjuk sesuatu? MAHASISWA: Ya, tepatnya, apakah itu masih memiliki alamat memori. JASON Hirschhorn: Jadi, Anda ingin untuk memeriksa nilai ptr? MAHASISWA: Ya, persis. JASON Hirschhorn: Apa yang saya tulis di sini jika saya ingin memeriksa nilai dari Titik - apa, Jordan mengatakan, nilai? Atau apa yang disimpan dalam ptr? SISWA: Sebuah alamat memori. JASON Hirschhorn: Sebuah alamat memori. Jadi jika saya menulis ini saja, itu akan memberikan nilai ptr. Dan bagaimana cara mencetak alamat memori? Apa format string untuk alamat memori? MAHASISWA:% p. JASON Hirschhorn:% p. % S adalah string. % P untuk pointer. Apakah itu benar? Itu benar. Jadi ptr sama - masih memiliki sesuatu di dalamnya. Ini mungkin lebih pertanyaan yang menarik. Apa garis yang melakukan? MAHASISWA: Seg kesalahan. JASON Hirschhorn: Apa? SISWA: Saya pikir itu seg kesalahan. JASON Hirschhorn: Hm? SISWA: Saya pikir itu akan seg kesalahan. JASON Hirschhorn: Jadi baris ini kode, bintang ptr, apa berarti bintang itu? STUDENT: Isi. JASON Hirschhorn: Ya. Pergi untuk mendapatkan isi. Jadi ini akan pergi ke memori alamat di sana dan memberi saya itu. Saya menggunakan% c di sini karena ada adalah karakter yang tersimpan di sana. Jadi kita akan pergi ke alamat kita hanya melihat - atau mungkin akan menjadi sedikit ini berbeda waktu kita menjalankan program. Tapi kita akan pergi ke alamat tersebut yang kita tahu masih ada dan melihat apa yang ada. Jadi tidak seg kesalahan. Itu hanya tidak memberi kami apa-apa. Mungkin benar-benar memberi kita sesuatu, kita tidak bisa melihatnya. Dan yang akan kembali ke ide ini - dan kita tidak akan mendapatkan terlalu banyak ke ini, karena itulah di luar ruang lingkup matakuliah ini. Tapi kita bicarakan di sini, jika kita melampaui batas-batas array dengan 1, kita mungkin tidak mendapat masalah. Kadang-kadang, ketika Anda hanya pergi dengan 1, Anda melakukan sesuatu yang salah, dan Anda bisa mendapat masalah. Tapi Anda tidak selalu mendapat masalah. Itu tergantung berapa banyak hal yang buruk Anda lakukan, Anda akan mendapat masalah. Yang bukan untuk mengatakan, ceroboh dengan kode Anda. Tapi itu mengatakan, program ini tidak akan selalu berhenti, bahkan jika Anda pergi ke suatu tempat Anda tidak harus pergi. Sebuah contoh yang baik dari itu adalah, banyak orang dalam masalah mereka set 3, yang adalah 15, tidak memeriksa batas-batas papan. Jadi Anda melihat ke kiri, melihat ke kanan, tampak atas, tampak ke bawah. Tapi kau tidak memeriksa untuk melihat apakah atas benar-benar akan berada di papan. Dan banyak orang yang melakukan itu dan ternyata bahwa dalam program mereka bekerja sempurna, karena di mana papan itu disimpan dalam memori, jika Anda pergi satu di atas atau memeriksa bahwa memori alamat, tidak ada apa-apa sangat mengerikan tentang itu, sehingga program Anda tidak akan berteriak pada Anda. Tapi kita masih akan melepas poin jika Anda tidak memeriksa itu, karena Anda melakukan sesuatu yang Anda tidak seharusnya dilakukan, dan Anda bisa memiliki mendapatkan dalam kesulitan. Kemungkinannya, meskipun, Anda mungkin tidak. Jadi ini adalah untuk menunjukkan bahwa, ya, kita masih bisa pergi ke sana. Dan kita tidak mendapatkan di kesulitan dalam hal ini. Jika kita mencoba untuk melakukan membaca selanjutnya 100 karakter, kita akan mungkin mendapatkan dalam kesulitan. Dan Anda dapat membaca kode 100 berikutnya karakter jika Anda inginkan dengan melakukan beberapa semacam untuk loop. Ya. MAHASISWA: Karena kami ditugaskan bahwa ruang nilai yang sebenarnya, kita tidak akan benar-benar dapat melihat apa-apa. Haruskah kita mencobanya dengan pengaturan yang sama seperti c atau sesuatu? JASON Hirschhorn: Pertanyaan besar. Bagaimana cara menetapkan bahwa nilai - apa baris kode yang saya tulis pada baris tujuh untuk melakukan apa yang Anda katakan? MAHASISWA: Star ptr sama tunggal quote c mengakhiri kutip tunggal. JASON Hirschhorn: Jadi yang menempatkan karakter, c, di lokasi itu, karena lagi-lagi, bintang yang berarti pergi ke sana. Dan bila digunakan di sisi kiri operator penugasan, yang sama dengan menandatangani, kita tidak akan mendapatkan bahwa nilai begitu banyak seperti menetapkan nilai tersebut. Sekarang mari kita lihat apa yang terjadi. Kami menempatkan sesuatu di sana dan itu ada di sana. Kami disebut gratis. Beberapa hal mungkin terjadi di heap. Jadi tidak ada lagi. Tapi sekali lagi, kita tidak mendapatkan dalam kesulitan untuk pergi ke sana. Aku melakukan ini dalam kode untuk menggambarkan yang banyak ini pertanyaan yang Anda miliki, mereka benar-benar menarik menjawab banyak waktu. Dan mereka benar-benar baik pertanyaan. Dan Anda dapat mencari mereka di Anda sendiri jika, misalnya, kita tidak dalam bagian. Ya. MAHASISWA: Karena Anda tidak mengirim pointer di mana saja, yang perlu Anda menggunakan malloc? JASON Hirschhorn: Jadi ini kembali untuk pertanyaan awal Anda. [? ?] Apakah hanya variabel lokal? Malloc sini bukanlah bahwa menarik. Penggunaan malloc sini tidak yang menarik karena hanya variabel lokal. MAHASISWA: Jadi bisa Anda lakukan arang star ptr sama halo? JASON Hirschhorn: Oh. Jadi kita akan sekarang kembali untuk pertanyaan awal Anda. Saya pikir Anda tidak puas dengan jawaban saya. OK? Seperti itu? MAHASISWA: Ya. Tunggu. JASON Hirschhorn: Dan di mana Anda ingin mencetak? Jadi kita akan mencetak string seperti itu? MAHASISWA: Interesting. JASON Hirschhorn: Jadi ini mengatakan ini argumen memiliki tipe karakter. Jadi ini harus menjadi karakter. MAHASISWA: Hanya mengambil yang pertama. JASON Hirschhorn: Jadi ini adalah apa yang saya katakan sebelumnya. Seperti saya katakan, itu tidak menyimpan String dalam pointer variabel. Ini menyimpan - SISWA: Nilai pertama string. JASON Hirschhorn: Alamat nilai pertama dari string. Jika kita mencetak ini, kami mendapatkan nilai di dalam pointer. Dan kita akan melihat itu, memang, alamat memori. Apakah itu masuk akal? Maaf. Tunggu, apakah itu menjawab Anda pertanyaan, meskipun? MAHASISWA: Ya. JASON Hirschhorn: Baris kode ini adalah menciptakan string dan kemudian lain pointer variabel yang menunjuk string itu, array itu. Ya. MAHASISWA: Jadi jika kita pergi satu memori alamat lebih jauh, akan kita h? Apakah itu telah disimpan sebagai string? JASON Hirschhorn: Seperti, kita lakukan - jadi ini sangat berharga untuk melakukan. Ini adalah titik aritmatika, yang kalian telah terlihat sebelumnya dan harus relatif nyaman dengan. Hal ini mirip dengan menulis - jika kita menulis baris kode, kami telah melihat notasi array sebelumnya. Ini akan memberikan kita yang kedua nilai dalam array ini, h. Jika kita melakukan ini, ini juga harus memberikan kami nilai kedua dalam array itu. Karena itu akan tidak memori alamat hal pertama, tetapi alamat memori dari hal yang satu atas. Dan kemudian dereferences Operator star bahwa pointer. Dan lagi, mari kita lihat. Kami mendapatkan h lagi. SISWA: Apa sebenarnya yang dereference artinya? JASON Hirschhorn: Dereference adalah kata mewah untuk pergi ke. Pergi ke itu dan mendapatkan apa yang ada adalah untuk dereference pointer. Itu hanya kata keren untuk itu. MAHASISWA: Jika kita ingin print seluruh string, bisa kita melakukan pointer ampersand? JASON Hirschhorn: OK, kita akan berhenti di sini. Kita akan berakhir di sini. Ampersand memberi Anda alamat lokasi, sehingga ketika Anda melakukan ampersand dari variabel, memberikan Anda alamat dimana variabel yang disimpan. Pointer ampersand akan memberikan alamat ptr mana ptr dalam memori. Kami tidak akan pergi dengan contoh ini. Anda dapat mengetahui ini hal-hal pada Anda sendiri. Tetapi sekali lagi, ini bahkan mungkin verging a sedikit di luar apa yang perlu Anda ketahui untuk lingkup jangka menengah ini - atau kuis ini, bukan. Maaf. Kita akan pindah, karena saya akan ingin melakukan satu coding masalah sebelum waktu habis. Dan kami akan kode apa yang saya pikir adalah yang paling menarik dari ini contoh, atoi. Jadi ini adalah pertanyaan tentang kuis dua tahun lalu. Dan aku punya di papan di sini. Orang-orang bertanya pada kuis - mereka diberi sedikit lebih tesxt di pertanyaan, tapi aku menghilangkan teks karena itu tidak perlu untuk tujuan kita sekarang. Itu hanya beberapa latar belakang apa atoi lakukan. Tapi Anda semua tahu dan sangat akrab dengan atoi. Saya sarankan Anda kode ini pada selembar kertas. Saya juga menyarankan Anda menggunakan strategi bahwa kita sudah lebih banyak di bagian kami. Pertama, pastikan Anda memahami apa atoi yang melakukan. Buatlah gambar atau datang dengan beberapa gambaran mental itu di kepala Anda. Selanjutnya, menulis pseudocode untuk ini. Pada kuis, jika semua yang Anda dapatkan adalah pseudocode, setidaknya Anda meletakkan sesuatu. Dan kemudian peta pseudocode yang ke C. Jika Anda memiliki cek di Anda pseudocode, seperti memeriksa apakah sesuatu adalah 1, yang memetakan ke sebuah jika kondisi dan sebagainya. Dan akhirnya, kode program di C. Jadi kembali ke atoi dan mengambil lima menit kode ini pada selembar kertas, yang mungkin tentang jumlah waktu Anda akan mengambil pada kuis untuk atoi kode. Lima sampai 15 menit, lima sampai 12, lima sampai 10 menit, adalah tentang jumlah waktu Anda akan menghabiskan ini pertanyaan dalam kuis. Jadi mengambil lima menit sekarang, silakan. Dan jika Anda memiliki pertanyaan, meningkatkan tangan Anda dan saya akan datang sekitar. [SIDE PERCAKAPAN] JASON Hirschhorn: OK, jadi yang lima menit. Itu mungkin tentang jumlah waktu yang Anda habiskan untuk itu pada kuis, mungkin akhir rendah saat itu. Kita akan rekap dalam sedikit. Mari kita mulai coding ini. Dan jika kita tidak mendapatkan semua jalan melalui, jawaban untuk ini dan ini pertanyaan kuis yang tersedia, sekali lagi, Musim gugur 2011 adalah ketika pertanyaan ini muncul di kuis. Dan itu layak delapan poin pada kuis kemudian. Delapan poin adalah pada ujung yang tinggi dari jumlah poin sesuatu yang bernilai. Sebagian besar pertanyaan adalah dalam kisaran satu sampai enam poin. Jadi ini adalah lebih menantang pertanyaan, pasti. Ada yang bisa mendapatkan saya mulai? Secara umum, apa yang akan kita ingin lakukan dengan ini fungsi atoi, secara logis? Apa yang ingin kita lakukan? Jadi kita akan menulis beberapa pseudocode. MAHASISWA: Mengkonversi karakter menjadi bilangan bulat. JASON Hirschhorn: Mengkonversi karakter menjadi bilangan bulat. OK. Jadi berapa banyak karakter kita akan harus melewati? STUDENT: Semua dari mereka. MAHASISWA: Semua karakter dalam string. JASON Hirschhorn: Semua karakter dalam string. Jadi jika kita ingin pergi melalui setiap karakter dalam string, apa hal di C kita telah melihat bahwa telah memungkinkan kita untuk pergi melalui setiap karakter dalam sebuah string? MAHASISWA: A untuk loop. JASON Hirschhorn: A untuk loop. Jadi kita akan loop melalui setiap karakter dalam s. Lalu apa yang akan kita ingin lakukan ketika kita mendapatkan karakter tertentu? Katakanlah kita mendapatkan melewati 90. Kami mendapatkan 9. Ini karakter. Apa yang ingin kita lakukan dengan bahwa karakter 9? MAHASISWA: Kurangi dari karakter 0? MAHASISWA: Tambahkan 0? JASON Hirschhorn: Kurangi dari karakter 0? MAHASISWA: Ya. JASON Hirschhorn: Mengapa Anda ingin melakukan itu? SISWA: [Tak terdengar] nilai. Nilai int nya. JASON Hirschhorn: OK, jadi kami mengambil karakter 9, kurangi dari karakter 0 untuk mendapatkan bilangan bulat yang sebenarnya 9. Manis. Dan bagaimana Anda tahu bahwa karakter 9 dikurangi 0 karakter adalah 9? Bagan Apa yang Anda lihat? MAHASISWA: Ada logis sembilan tempat antara 9 dan 0. Atau Anda bisa melihat pada tabel ASCII. JASON Hirschhorn: table ASCII. Tapi ya, kau benar juga. Jadi kita kurangi 0. Jadi sekarang kita memiliki bilangan bulat 9. Dan apa yang kita ingin lakukan dengan itu? Jika kita memiliki 90, itu adalah bilangan bulat pertama kita, apa yang ingin kita lakukan? SISWA: Aku akan dimasukkan ke dalam integer sementara array, kemudian melakukan matematika untuk itu kemudian untuk membuatnya menjadi berakhir. JASON Hirschhorn: OK. STUDENT: Anda dapat mulai pada akhir array dan kemudian bergerak maju begitu bahwa setiap kali Anda bergerak maju, Anda kalikan dengan 10. JASON Hirschhorn: OK. Kedengarannya seperti cantik Ide yang menarik. Kita bisa mulai pada akhir array kita, dan kita dapat menggunakan strleng. Kita dapat menggunakan strleng di sini. Kita akan mendapatkan panjang string kita. Kita mulai di akhir. Dan + yang pertama, kita hanya mengambil bahwa integer, dan mungkin kita buat seperti variabel integer baru di bagian atas di mana kita menyimpan segalanya. Jadi kita loop melalui setiap karakter di s dari kembali ke depan, kita kurangi 0, dan maka kita bawa, dan tergantung pada di mana itu, kita kalikan oleh kekuatan dari 10. Karena pertama, apa yang kita kalikan karakter paling kanan oleh? MAHASISWA: 10 ke 0. JASON Hirschhorn: 10 ke 0. Apa yang kita kalikan kedua Karakter paling kanan oleh? SISWA: [Tak terdengar]. JASON Hirschhorn: Apa? MAHASISWA: 10 ke 1. JASON Hirschhorn: 10 ke 1. Karakter ketiga paling kanan? MAHASISWA: 10 ke 2. JASON Hirschhorn: 10 ke 2. MAHASISWA: Maaf, saya tidak mengerti apa yang kita lakukan di sini. JASON Hirschhorn: OK, mari kita kembali, lalu. Jadi kita akan mendapatkan lulus dalam sebuah string. Karena kita sedang menulis atoi. Jadi kita bisa melewati dalam string. Katakanlah kita mendapatkan berlalu dalam string 90. Hal pertama yang kita akan lakukan adalah mengatur sebuah variabel integer baru yang kita hanya akan membuat sebagai integer baru kami. Itulah yang akan kita untuk kembali di akhir. Kita harus pergi melalui setiap karakter dalam string karena kita telah menentukan bahwa kita perlu menyentuh masing-masing dan kemudian menambahkannya ke bilangan bulat baru kami. Tapi kita tidak bisa hanya menambahkannya sebagai angka. Kita tidak bisa hanya mengambil 9 dan tambahkan 9 sampai bilangan bulat kami. Itu tergantung pada apa tempat itu adalah dalam string. Kita akan perlu mengalikan dengan kekuatan 10. Karena itulah basis 10 karya. Jadi kita akan mendapatkan yang sebenarnya karakter, atau bilangan bulat yang sebenarnya nomor, dengan mengurangi karakter 0 dari karakter 9 seperti yang kami lakukan dengan mengurangkan karakter capital A dari karakter apa pun yang kita punya di salah satu masalah-masalah. Jadi kita benar-benar akan mendapatkan nomor dari 0 sampai 9 disimpan sebagai bilangan real, dan kita akan kalikan dengan kekuatan 10 tergantung di mana kita berada dalam string. Dan kemudian kita akan menambahkan kembali ke variabel integer baru kami. Jadi apa ini akan terlihat seperti akan akan - kita akan menarik di sini. Jika kita bisa melewati dalam string 90 - SISWA: [Tak terdengar]. JASON Hirschhorn: Tapi atoi mengambil string. Jadi kita akan pergi melalui penyelenggaraan. Kita akan mendapatkan disahkan pada 90. Kami pergi dari belakang ke depan. Kami mengambil 0. SISWA: Maafkan aku. Mungkin ini adalah bodoh. Jika kita mendapatkan berlalu dalam sebuah string, mengapa 90 apa yang kita mendapatkan berlalu dalam? Karena 90 adalah bilangan bulat. JASON Hirschhorn: Karena atoi mengambil String dan mengubahnya menjadi integer representasi string tersebut. Tapi string 90 tidak integer 90 atau nomor 90. String 90 adalah array dari dua, atau tiga karakter, lebih tepatnya, 9 karakter, 0 karakter, dan backslash 0 karakter. Dan kami sedang menulis atoi karena, untuk Misalnya, ketika Anda mengambil perintah argumen baris, dan itu disimpan dalam argv, itu disimpan sebagai string. Tetapi jika Anda ingin memperlakukannya sebagai angka, Anda perlu mengubahnya ke bilangan bulat yang sebenarnya. Yang kami lakukan satu set masalah kita. Yang kita lakukan di nomor set masalah kita. Setiap orang yang mengambil integer sebagai argumen baris perintah. Jadi itulah mengapa fungsi atoi kami mengambil string. Jadi sekali lagi, dalam contoh kita di sini, kami akan mengambil yang terakhir. Kita akan mengurangi karakter 0 dari itu, karena karakter 0 dikurangi oleh karakter 0 memberi Anda sebenarnya angka 0, menurut matematika ASCII yang kita lakukan. Karena karakter yang direpresentasikan sebagai berbeda dari yang sebenarnya mereka - karakter, misalnya, huruf kecil adalah 97. Ini bukan - oops! Ini bukan apa yang Anda harapkan hal itu terjadi, 0, misalnya. Jadi, Anda harus kurangi karakter untuk mendapatkan 0. Jadi kita akan melakukannya di sini untuk mendapatkan jumlah sebenarnya. Dan kemudian kita akan kalikan dengan kekuatan 10 tergantung di mana itu adalah dalam string, dan kemudian mengambil dan menambahkannya ke tempat dudukan kami variabel sehingga kami bisa datang dengan bilangan bulat baru akhir kami. Apakah itu masuk akal untuk semua orang? Jadi kita tidak akan kode ini sekarang, karena kita semakin kekurangan waktu. Saya minta maaf untuk waktu itu. Tapi ini adalah apa, mudah-mudahan, Anda akan dapat dilakukan pada kuis - di Paling tidak, mendapatkan pseudocode ini ditulis. Dan kemudian, jika kita menulis pseudocode, sebenarnya, kita bisa melakukan ini cukup cepat. Setiap baris dari komentar kita kita menulis di sini diterjemahkan menjadi sekitar satu baris kode C. Mendeklarasikan variabel baru, menulis loop, beberapa pengurangan, beberapa perkalian, dan beberapa tugas. Kami akan mungkin juga ingin menulis baris kembali. Kami juga mungkin ingin menempatkan beberapa pemeriksaan di sini. Ya. MAHASISWA: Jadi dapat kita memperlakukan s sebagai string yang sebenarnya? Karena aku tahu itu hanya sebuah alamat. Seperti, bagaimana Anda akan mendapatkan panjang string yang melewati? JASON Hirschhorn: Jadi bagaimana panjang string? Strlen. MAHASISWA: strlen, yeah. Tapi Anda dapat menempatkan s sebagai Argumen untuk itu? JASON Hirschhorn: Jadi strlen mengambil star arang. Dan berikut bahwa bintang char, dan terus menghitung hingga sampai ke sebuah backslash 0. strlen sebenarnya salah satu program lain yang kita akan kode. Itu satu lagi yang baik untuk kode. Satu yang sedikit lebih mudah, karena jika Anda akan berpikir tentang hal itu konseptual - Aku hanya berkata dengan keras - strlen berikut pointer dan terus terjadi dan menghitung dan melacak sampai Anda mencapai backslash 0. MAHASISWA: OK, mendapatkannya. JASON Hirschhorn: Jadi terbaik keberuntungan di kuis 0 besok. Jika Anda memiliki pertanyaan, saya akan berada di luar setelah ini. Jangan ragu untuk email saya. Menjangkau TF Anda sendiri jika Anda tidak dalam bagian saya, atau mendapatkan saya email jika Anda menginginkannya. Jika Anda ingin panik dan hanya mengirim saya email, email freakout, aku akan mengirimkan kembali, seperti, wajah tersenyum, atau, seperti, lelucon atau sesuatu. Jadi jangan ragu untuk melakukan itu juga. Good luck lagi, dan aku akan melihat Anda semua minggu depan.