JASON Hirschhorn: Selamat Datang untuk A5, semua orang. Kami mempunyai minggu yang menarik di hadapan kita, kebanyakannya kerana terdapat banyak baru menghadapi di dalam bilik ini. Ia indah. Banyak anda berada di sini oleh kemalangan, yang adalah lebih baik. Jadi mudah-mudahan anda akan terus menyertai kami. Minggu ini kita akan menghabiskan sebahagian besar daripada seksyen persediaan untuk kuiz. Jadi setiap agenda kita, kita akan bercakap serba sedikit tentang sumber untuk kelas, tetapi juga untuk kuiz, dan kemudian, sekali lagi, membelanjakan sebahagian besar daripada kelas bercakap mengenai soalan. Setelah kami selesai menjawab anda soalan, atau jika soalan-soalan anda secara semula jadi membawa kita kepada beberapa coding, saya mempunyai masalah sampel dari ujian tengah semester lalu bahawa kita akan memberi kod kepada hidup dalam seksyen bersama-sama yang juga membawa beberapa lain topik yang baik untuk melindungi. Jadi pertama, seperti yang kita telah melalui untuk pasangan minggu lalu untuk mengingatkan anda guys, terdapat satu tan sumber disediakan untuk kursus ini. Ramai daripada mereka akan menjadi sangat membantu kepada anda kerana anda terus belajar untuk kuiz 0, kerana ia petang Selasa. Jadi anda semua telah belajar untuk sedikit. Terdapat nota kuliah dan sumber kod yang anda perlu pasti menyemak. Menonton seluar pendek. Semak study.cs50.net. Dan kemudian, yang disenaraikan di bawah, sebilangan sumber-sumber lain. Sekali lagi, kuiz 0 adalah esok di 01:00. Jika anda tidak berbuat demikian sudah, daftar keluar Mengenai Kuiz 0 dokumen berkenaan laman utama kursus ini untuk memikirkan di mana anda mengambil kuiz. Kuiz bermula pada 1:10 dan berakhir 70 minit kemudian. Jadi, jika anda muncul selepas 1:10, anda akan mendapat yang banyak beberapa minit daripada 70 untuk mengambil kuiz. Jadi pastikan anda berada di sana pada masa. Jika anda seorang pelajar lanjutan atau mempunyai beberapa pertimbangan ujian lain, ia mungkin tidak di 01:00 esok. Tetapi sekali lagi, periksa Kuiz Mengenai 0 dokumen untuk memastikan anda tahu apabila anda mengambil kuiz. Saya menulis 75 minit di sini. Saya berfikir bahawa yang betul, bukan 70. Ia meliputi semua bahan dari seminggu 0 kuliah minggu lepas pada hari Rabu. Dan sekali lagi, untuk kuiz ini, setiap yang dokumen, anda akan mendapat satu dua belah bahagian dan 8 1/2 sebanyak 11 lembaran kertas yang anda mendapat untuk digunakan sebagai nota semasa kuiz. Ramai orang, jika tidak kebanyakan orang, mempunyai mendapati bahawa cara yang paling berguna tunggal belajar untuk kuiz ini adalah untuk membuat lembaran kajian, satu satu-Sider, mereka sendiri. Jadi melihat orang-orang yang lalu jika anda telah melihat orang-orang yang lalu. Mencapai rakan-rakan untuk melihat apa yang mereka memakai mereka. Tetapi tangan-down, cara terbaik yang anda boleh pengajian adalah untuk pergi melalui segala-galanya dan meraut ke bawah untuk apa yang patut atau perlu bukan milik pada yang selembar kertas, kerana itulah yang benar-benar cara membantu bagi anda untuk memastikan anda akan melalui segala-galanya dan mempunyai beberapa kebiasaan dengannya. Kebanyakan orang, kita dapati, walaupun mereka telah lembaran kertas duduk betul seterusnya kepada mereka pada kuiz, tidak berpaling kepadanya, kerana, sekali lagi, yang sangat proses melalui maklumat telah membantu mereka belajar. Adakah sesiapa mempunyai apa-apa soalan kira-kira kuiz 0? Mempunyai semua orang - Saya tidak akan melakukan mengangkat tangan. Jangan sekali-kali fikiran. Saya akan meminta yang mula belajar. Tetapi saya tidak mahu membuat anda semua tidak mengangkat tangan anda. Jadi seperti yang saya kata - ya, Avi, teruskan. AVI: Apa yang akan menjadi satu perkara yang berguna memakai satu-pager? PELAJAR: Itu terpulang kepada anda. JASON Hirschhorn: Anda mendapat menggunakan pertimbangan anda. Perkara yang berguna untuk meletakkan di satu alat kelui, jika anda keliru tentang O besar runtime jenis-jenis carian dan macam, meletakkan bahawa di sana dalam carta bagus berguna. Dengan cara itu, jika anda meminta kepada kuiz, anda tidak perlu untuk cuba dan angka ia keluar atau sebab melalui runtime. Anda hanya boleh menyalin ke bawah. Jika anda melihat kuiz yang lalu, banyak kali, ada berjalan soalan masa. Jadi yang akan menjadi contoh yang baik perkara memakai satu alat kelui anda. Lain-lain perkara yang baik untuk memakai, jika anda keliru tentang bagaimana untuk mengisytiharkan fungsi atau apa yang bahagian yang berlainan di pengisytiharan fungsi adalah, menulis yang di sana, versi generik dan maka mungkin satu contoh. Jika anda keliru tentang petunjuk, gambarajah bagaimana petunjuk kerja mungkin benar-benar membantu. Jika anda keliru tentang rekursi, yang mencuba fungsi rekursif di sana juga boleh menjadi benar-benar membantu. Adakah ini memberikan anda beberapa idea? AVI: Anda perlu memahami proses Himpun keseluruhan, seperti bagaimana semua kerja? JASON Hirschhorn: Semua yang telah dibincangkan boleh muncul pada kuiz. Soalan - tetapi sekali lagi, beberapa perkara akan wajaran berat daripada yang lain. Beberapa perkara yang telah datang lagi dan sekali lagi dalam kelas, dalam kuliah, dan seksyen. Perkara-perkara lain tidak mempunyai datang yang kerap. Kami telah berbincang banyak tentang # termasuk dan -L sesuatu dan apa yang mereka bermakna dalam proses penyusunan. Kami telah berbincang banyak tentang GDB, berpaut, mereka bendera yang berbeza yang kita gunakan apabila kita menyusun sesuatu, dan apa yang make15, sebagai contoh, benar-benar bermakna dan benar-benar tidak. Kami tidak bercakap sebanyak kira-kira setiap langkah tunggal dalam proses penyusunan. Kami masih bercakap mengenainya. Jadi ia masih sesuatu yang anda perlu biasa dengan. Apapun, kita tidak akan menjadi - perkara-perkara yang datang lebih kerap di dalam kelas lebih cenderung untuk datang lebih sering dan lebih banyak wajaran kuiz. Sejuk. Apa-apa soalan lain tentang kuiz 0? OK, jadi saya meletakkan senarai topik di papan. Saya telah melalui sukatan pelajaran. Saya telah melalui seksyen kajian daripada malam tadi dan mereka slaid untuk datang dengan senarai tidak lengkap topik yang kami telah meliputi setakat ini dalam CS50 dan perkara-perkara yang mungkin muncul di kuiz. Jadi, saya tidak akan pergi melalui setiap satu tunggal ini. Yang akan mengambil masa yang lebih masa daripada yang kami ada sekarang. Tetapi saya meletakkan ini di sini untuk diharapkan berjoging memori anda tentang perkara-perkara yang boleh atau mungkin tidak biasa dengan anda. Dan saya suka membelanjakan sebahagian besar daripada seksyen menjawab soalan anda tentang topik-topik ini, topik yang tidak dilindungi di sini. Kita boleh menulis kod pseudo. Kita boleh menulis kod sebenar untuk memastikan bahawa anda - Saya boleh menjawab soalan anda dan membantu semua orang asasnya memahami banyak topik-topik ini supaya anda akan berasa bersedia dan selesa pergi ke kuiz esok. Jadi dibacakan senarai. Anda diharapkan telah datang ke seksyen dengan beberapa soalan juga. Apabila anda sedia, mengangkat tangan anda dan kami akan memulakan. Perlu diingat, soalan-soalan yang anda ada, tidak ada soalan bodoh. Kami telah mendengar bahawa banyak. Dan soalan-soalan yang anda ada, saya sanggup membuat taruhan, ramai orang lain kedua-dua duduk di sini dan menonton dalam talian mempunyai juga. Jadi, anda hanya boleh membantu orang ramai dengan bertanya soalan. Marcus. Marcus: Antara timbunan dan timbunan, ada yang telah diperuntukkan peratusan memori ditakrifkan sebagai ini adalah untuk tindanan atau untuk timbunan itu? Atau bagaimana bahawa kerja, sebenarnya? JASON Hirschhorn: Soalan Besar. Saya akan menyokong mengesan sedikit. Adakah semua orang - sila jujur ​​di sini. Saya tahu saya meminta anda untuk meningkatkan anda tangan di hadapan rakan-rakan anda. Tetapi adakah terdapat orang yang merasa tidak selesa dengan timbunan dan longgokan dan ingin pergi ke yang dan apa yang mereka maksudkan? Mengangkat tangan anda jika - OK. Terima kasih. Jadi, kita akan pergi ke atas tindanan dan timbunan itu benar-benar cepat dan kemudian bergerak ke menjawab soalan anda. Jadi, jika kita menarik keluar kotak untuk mewakili memori pada komputer anda, apakah beberapa perkara-perkara yang pergi di dalam kotak ini? Utama. Fungsi utama. Di manakah pergi utama? PELAJAR: [didengar]. JASON Hirschhorn: Jadi kita akan meletakkan utama di sini. Apa lagi yang pergi di dalam kotak ini? PELAJAR: Fungsi yang anda memanggil. JASON Hirschhorn: Fungsi yang kita panggil. Dan di mana mereka pergi? PELAJAR: Dalam timbunan. JASON Hirschhorn: Mereka pergi dalam tindanan. Jadi, kita akan memanggil ini perkara ke bawah sini tindanan. Dan sehingga atas, kami mempunyai timbunan itu. Jadi memori bukan kotak seperti ini. Tetapi ia sebenarnya cukup sama. Ia akan menjadi banyak kotak ke atas dan lebih, bergantung kepada berapa besar anda komputer adalah atau bagaimana besar memori anda. Pada quote-unquote "bawah" adalah timbunan. Dan terdapat pelbagai perkara yang pergi pada timbunan. Dan orang-orang bergantung kepada fungsi anda ada di dalam kod anda. Anda sentiasa mempunyai satu fungsi dalam anda kod yang disebut utama, jadi selalu ada satu seksyen turun di sini dalam stack dikhaskan untuk utama. Bahagian-bahagian dalam tindanan dipanggil bingkai tindanan. Apabila anda memanggil fungsi yang lain, mengatakan utama panggilan fungsi carian binari, kita meletakkan bingkai lain dalam timbunan. Lebih khusus lagi, kita akan menderma sebahagian daripada memori pada kami komputer untuk menyimpan carian binari ini tempatan pembolehubah dan untuk menjalankan perduaan kod carian. Jadi kita panggil carian binari. Dalam sebahagian ini ingatan, kita akan untuk menyimpan pembolehubah tempatan. Kami akan menyimpan panggilan printf itu. Apa pun yang berlaku, fungsi yang akan disimpan di sana. Carian binari akan melaksanakan. Ia akan melengkapkan pelaksanaan. Apakah perkataan dalam C yang menandakan fungsi yang perlu melengkapkan pelaksanaannya? PELAJAR: Pulang. JASON Hirschhorn: Kembali. Jadi setiap kali anda melihat kenyataan balasan, hujung fungsi apabila ia mencecah itu. Jadi carian binari akan melanda kembali. Ini sebahagian daripada memori akan dasarnya dibebaskan atas. Dan utama akan kembali ke pelaksanaan. Jadi utama akan berhenti seketika di mana-mana adalah, panggilan carian binari, mendapatkan beberapa nilai balasan, dan terus pelaksanaan. Tempoh timbunan akan hilang. Jika kita memanggil fungsi rekursif, yang adalah satu fungsi yang memanggil dirinya lebih kali, kita mungkin akan mendapat - katakan kita lakukan carian binari secara rekursif. Kami mungkin akan mendapat carian binari versi satu, carian binari dua, carian binari tiga, carian binari empat, binari carian lima. Kemudian pada carian binari akhir lima akan melanda kes asas, dan tindanan bingkai akan kembali dan menyimpan penutup sehingga kita kembali kepada utama. Kami boleh pergi ke rekursi dalam sedikit. Tetapi semua ini adalah untuk mengatakan, jika anda memanggil fungsi berganda pada satu masa, akan ada susunan berganda bingkai dalam timbunan. Timbunan itu, di sisi lain, sehingga di sini, bukan untuk fungsi, bukan untuk pembolehubah tempatan. Ia untuk dinamik diperuntukkan pembolehubah. Jadi ini adalah pembolehubah yang boleh dimulakan sama ada utama atau berfungsi bahawa panggilan utama. Di mana-mana dalam kod anda, mereka boleh dimulakan. Dan untuk memulakan dinamik yang ubah diperuntukkan. Apa fungsi dalam C kita digunakan? PELAJAR: Malloc. JASON Hirschhorn: Malloc. Anda memanggil malloc. Anda mendapat ruang memori. Dan bahawa ruang memori adalah pada timbunan itu. Dan bahawa ruang memori kekal di sana sehingga anda memanggil percuma. Pembolehubah Jadi dinamik diperuntukkan dalam timbunan akan wujud selagi anda mahu mereka wujud, dan mereka tidak akan hilang sehingga anda dengan jelas memberitahu mereka untuk pergi. Anda boleh membuat mereka dalam satu fungsi. Timbunan bahawa fungsi ini bingkai akan hilang. Tetapi berubah-ubah yang masih akan wujud dalam timbunan itu sehingga ia dibebaskan, berpotensi dengan fungsi yang dipanggil carian binari atau apa sahaja. Maka orang-orang pembolehubah timbunan tinggal di sana selama yang anda mahu mereka tinggal di sana. Dan mereka akan diletakkan di sini. Dan kemudian yang seterusnya mendapat diletakkan di sana. Mereka terus mendapat diisi, dan mereka tinggal di sana sehingga anda memanggil percuma. Dan pada dasarnya, timbunan dan tindanan, mendapat soalan Marcus ini, berkembang ke arah satu sama lain. Dan jika mereka menghadapi satu sama lain, anda telah menggunakan kesemua memori yang anda komputer, dan program anda akan berhenti kerana anda tidak mempunyai apa-apa memori lebih meninggalkan untuk digunakan. Di antara mereka, terdapat perkara yang berpotensi lain. Tetapi bagi skop kursus ini, anda tidak perlu bimbang tentang itu. Sehingga adalah jawapan kepada soalan anda. Jangan bimbang mengenainya. Tetapi itu adalah jawapan yang panjang. Semua yang anda perlu tahu adalah timbunan dan tindanan akan - pertama bermula di bahagian bawah. Tindanan tidak. Timbunan itu terpulang sana. Mereka akan berkembang lebih dekat dengan satu sama lain. Dan jika mereka menyentuh, itu masalah. Anda kehabisan memori. Tetapi juga, di samping mengetahui di mana mereka, apa yang disimpan dalam kedua-dua stack dan timbunan. Curtis. CURTIS: Apabila mereka berlanggar, ialah limpahan timbunan? JASON Hirschhorn: Apabila mereka berlanggar, itu bukan satu limpahan timbunan. A limpahan timbunan adalah kawasan yang berbeza yang kita boleh pergi lebih jika anda mahu. OK, kita akan kembali kepada yang dalam sedikit. PELAJAR: Apakah perkataan yang dipanggil apabila mereka memukul satu sama lain, stack dan timbunan itu? JASON Hirschhorn: Buat masa ini, jangan bimbang tentang. Hanya tahu - Saya akan menjawab soalan itu selepas kelas. Jika mereka berjalan ke dalam satu sama lain, anda kehabisan ingatan, kerana tidak ada yang lebih ruang di sana. PELAJAR: Maaf, apa yang kesilapan seg? JASON Hirschhorn: Segmen kesalahan boleh dipanggil untuk - ia bergantung mengapa dipanggil bersalah seg ini. Kadang-kadang, limpahan timbunan anda, ia akan mengatakan seg kesalahan sebagai ralat. PELAJAR: Bagaimana pula penyahrujukan pembolehubah null? Adakah itu satu kesalahan seg? JASON Hirschhorn: penyahrujukan penunjuk batal - OK, jadi jika anda mempunyai penunjuk bahawa anda ditetapkan sama dengan nol, petunjuk, ingat, alamat kedai memori sebagai nilai-nilai mereka. Dan penunjuk null asasnya menyimpan 0, 0-ke- menangani dalam pembolehubah itu. Jadi 0x, 0, 0, 0, 0, dan sebagainya. Alamat 0-ke-dalam ingatan itu bukan dalam gambar kita, itu di sana di suatu tempat, itu terpelihara untuk komputer. Kami tidak dibenarkan untuk disentuh. Oleh itu, apabila program anda melaksanakan, jika ada sesuatu yang cuba untuk pergi ke memori alamat 0, ia tahu bahawa yang merupakan nilai kosong. Ia tahu apa-apa perlu berada di sana. Jadi, jika anda mencuba dan menggunakan sesuatu yang ada dan merawat sesuatu seperti ada atau cuba untuk pergi ke lokasi tersebut, anda akan mendapat kesalahan seg atau ralat. Adakah yang menjawab soalan anda? Dan sekarang kita akan kembali untuk timbunan limpahan. Perkara dalam tindanan, kerana anda lelaki itu mempunyai dilihat sebelum ini, di - mari kita menarik menutup daripada bingkai tindanan. Bolehkah semua orang melihat bahawa? Oleh itu, kita mempunyai kerangka timbunan kami. Kami menyimpan array dalam sebagai tempatan pembolehubah dalam fungsi ini. Supaya berkata pelbagai kami mempunyai lima tempat. Semua lima daripada akan disimpan dalam kerangka timbunan. Jika kita mula menulis di luar batas array ini - jadi jika kita mula menulis ke dalam, mari kita mengatakan yang 0. Mereka adalah lima indeks array kami. Jika kita mula menulis ke dalam indeks 5, yang kita tidak mempunyai apabila kita mempunyai pelbagai saiz 5, kami mula menulis ke dalam indeks 6, 7, 8, 9, kita boleh mendapatkan Stack a Ralat limpahan. Secara umumnya ia tidak - anda mungkin akan mendapat masalah jika anda pergi alih oleh satu. Tetapi secara amnya, anda akan masuk ke dalam masalah yang paling jika anda pergi alih oleh banyak dan anda pergi setakat ini lebih yang anda menulis lebih alamat kembali itu fungsi, yang terletak di bawah bingkai tindanan. Kerana, bukan? Anda - dalam - maaf. Tidak "kerana betul." Dalam bingkai tindanan, anda perlu pembolehubah tempatan anda. Pada bahagian paling bawah tindanan bingkai adalah alamat kembali. Itulah di mana fungsi pergi apabila ia berakhir. Dan jika anda menulis ganti pulangan yang alamat, kemudian apabila bingkai tindanan ini, apabila anda akan melalui tindanan bingkai dan melaksanakan setiap baris, anda akan pergi ke alamat kembali baru anda yang ditulis ada dan bukannya satu sebenar. Dan itulah bagaimana kita telah melihat beberapa pelanggaran peraturan keselamatan boleh berlaku dengan komputer. Limpahan Jadi timbunan, pendek, adalah apabila anda menulis ganti bahagian dalam tindanan anda sepatutnya menggunakan, tempatan pembolehubah anda sepatutnya untuk digunakan, dan khususnya apabila anda mula menulis ganti perkara-perkara penting seperti kembali alamat. Dan di mana anda akan mendapat ralat. Atau mungkin juga anda boleh memulakan walaupun menulis ke - mengatakan carian binari adalah kanan di atas utama. Jika anda overwrote banyak, anda boleh menulis ke dalam utama. Tetapi secara amnya, anda mendapat ralat sebelum maka, kerana komputer tahu anda melakukan sesuatu yang anda tidak boleh lakukan. Yeah. PELAJAR: Apakah perbezaan di antara limpahan timbunan dan suatu buffer overflow? JASON Hirschhorn: Penimbal limpahan adalah jenis yang lebih generik apa yang saya baru diterangkan. PELAJAR: Jadi limpahan timbunan adalah contoh suatu buffer overflow. JASON Hirschhorn: Tepat sekali. Ini adalah pelbagai yang kita boleh berfikir sebagai penampan, ruang untuk perkara-perkara untuk pergi masuk Ini adalah buffer overflow timbunan. Kita boleh mempunyai suatu buffer overflow timbunan. Jika ada penampan, yang ada sering adalah satu pameran timbunan itu, dan kami overwrote mereka batas, maka kita akan mempunyai suatu buffer overflow timbunan. Dan di luar skop kursus ini, mereka dikesan sedikit berbeza. Pengkompil mempunyai khas cara-cara mengesan setiap. Tetapi suatu buffer overflow adalah lebih generik jenis apa yang saya diterangkan, yang merupakan satu buffer overflow timbunan. Adakah yang menjawab soalan anda? Manis. Adakah terdapat apa-apa soalan lain yang berkaitan kepada tindanan atau timbunan itu? Yeah. PELAJAR: Saya tahu anda perlu tali percuma kerana mereka dalam timbunan itu dan anda tidak mahu bocor ingatan. Tetapi adakah anda mempunyai untuk membebaskan pembolehubah global dan barangan seperti itu? Atau adakah mereka secara automatik dibebaskan? JASON Hirschhorn: Soalan yang baik. Jadi dalam CS50.H, kita mewujudkan perkara ini untuk anda dipanggil rentetan. String A adalah benar-benar apa? PELAJAR: Char bintang. JASON Hirschhorn: Bintang char, penunjuk untuk aksara, penunjuk untuk pelbagai aksara. Itulah yang tali itu. Oleh itu, kita perlu untuk membebaskannya, kerana getstring, yang kita digunakan banyak - Nama tali sama getstring - yang mallocs bagi kami sebahagian memori pada ditimbunkannya dan kemudian kembali penunjuk kepada watak pertama yang tali, bintang char. Jadi kononnya, jika anda tidak menulis percuma di mana-mana rentetan anda bahawa anda telah dipanggil setakat ini, anda mempunyai telah bocor beberapa ingatan. Sudah tentu kita tidak bercakap tentang , jadi tiada siapa yang mendapat dalam masalah untuk melakukannya. Tetapi pada masa akan datang, ya. Apabila anda memanggil getstring, anda mallocing sedikit ruang pada timbunan itu. Dan jika anda tidak memanggil percuma kemudian bahawa tali, anda mempunyai kebocoran memori. Yang menjawab soalan anda? Yeah PELAJAR: Jadi untuk melakukan itu, kita menggunakan betul percuma sebelum kembali? Seperti, dalam skop, saya rasa jika kita katakan, seperti, int utama, dalam skop kod itu dalam masa yang pendakap kerinting, betul sebelum - anda tahu di mana anda akan biasanya meletakkan kembali. Adakah anda meletakkan percuma sebelum itu? JASON Hirschhorn: Jadi anda boleh meletakkan percuma di mana sahaja anda mahu meletakkan percuma. Oleh kerana ini adalah dinamik diperuntukkan pembolehubah, kerana mereka boleh hidup di luar skop tertentu fungsi, jika anda memanggil malloc dalam fungsi yang berasingan, sebagai contoh, getstring, anda boleh menghubungi percuma di utama. Anda tidak perlu untuk memanggil ia dalam fungsi tertentu mana malloc dipanggil. Tetapi anda perlu memanggilnya sebelum pulangan utama. Dan ia benar-benar bergantung. Ia bergantung kepada mengapa anda malloced yang ruang di tempat pertama. Sesetengah orang akan memanggil membebaskan cukup cepat. Sesetengah orang tidak akan memanggil bebas sehingga akhir program mereka. Dan mereka akan melalui dan segala-galanya percuma. Ia bergantung kepada mengapa anda dipanggil malloc. PELAJAR: Dan apa yang anda akan berkata jika anda dipanggil penggunaan getstring? Anda akan katakan percuma apa? JASON Hirschhorn: Jadi sintaks secara percuma adalah semata-mata bebas, paren terbuka, berhampiran paren, dan nama penunjuk. Jadi, jika anda menulis nama setaraf tali getstring, anda meletakkan nama di sini. Itulah nama penunjuk. Dan ia tahu untuk bebaskan ingatan itu. PELAJAR: Oleh itu, apabila ia membebaskan memori, penunjuk masih menunjukkan ke tempat itu dalam memori? Atau adalah penunjuk juga dikosongkan alamat yang ia menjurus kepada. JASON Hirschhorn: Kita harus cuba itu. Kita perlu memberi kod itu. Mari kita kembali apabila kita dapat pengekodan, dan mari kita kod itu. Dan jika anda mahu untuk memikirkan jawapannya itu, anda juga boleh kod yang dalam masa yang sama. Tetapi itu adalah satu persoalan yang besar. PELAJAR: Adakah mungkin untuk sesuatu yang percuma juga tidak lama lagi? Jadi anda masih memerlukannya untuk program anda, dan anda dibebaskan ruang memori? JASON Hirschhorn: Ya. Ia adalah mungkin, jika anda sesuatu yang percuma dan kemudian anda menggunakannya semula, anda akan menghadapi ralat. Tetapi itu pada anda, kerana anda dibebaskan sesuatu dan kemudian dipanggil kemudian. Jadi bahawa adalah satu kesilapan pengaturcara. Tetapi ya. Anda boleh menulis itu. Sebarang pertanyaan lanjut mengenai - ya. PELAJAR: Jadi, jika anda sepatutnya hanya membebaskannya secara umum sebelum program berakhir, adakah itu bermakna jika program berakhir dan anda tidak membebaskannya, memori yang masih diperuntukkan? JASON Hirschhorn: Jika program anda berakhir dan anda terlupa untuk membebaskan sesuatu, maka memori yang telah diperuntukkan di seluruh hayat program anda. Apabila program anda menutup sepenuhnya, memori yang tidak akan untuk tinggal di sana selama-lamanya. Komputer ini cukup pintar untuk mengetahui bahawa apabila program ditutup, ia perlu menghilangkan semua memori yang dikaitkan dengan program itu. Walau bagaimanapun, terdapat alat anda boleh menjalankan satu program untuk mengesan jika, apabila program selesai, anda terlupa untuk membebaskan beberapa memori. Dan untuk masalah seterusnya menetapkan ke mana anda akan menggunakan malloc dan menggunakan petunjuk, anda akan menjalankan ini program program anda untuk melihat jika, apabila pulangan utama, anda mempunyai beberapa perkara-perkara yang dibiarkan unfreed. Jadi mereka tidak akan tinggal malloced selama-lamanya dalam komputer anda. Yang akan membazir, kerana dengan cepat, komputer akan kehabisan ingatan. Tetapi jika mereka berjalan sehingga akhir anda program dan mereka tidak dibebaskan dan anda program keluar, itu masih masalah bahawa alat ini akan membantu anda menangani. PELAJAR: Adakah itu Valgrind? JASON Hirschhorn: Ia dipanggil Valgrind. Dan anda akan menjadi - PELAJAR: Tetapi kita tidak perlu tahu bahawa untuk kuiz, walaupun? Maksud saya, ia bercakap tentang sedikit dalam kuliah. JASON Hirschhorn: Jadi Valgrind adalah nama alat itu. Mengetahui apa yang ia adalah cukup untuk kuiz. Tetapi anda tidak menggunakan lagi pada anda masalah ditetapkan kerana kita tidak mempunyai set masalah yang telah diuruskan dengan jelas dengan malloc atau anda menggunakan malloc. Jadi anda tidak menggunakan Valgrind yet. Tetapi anda akan menggunakannya lebih awal daripada kemudian. PELAJAR: Bolehkah anda mengulangi apa Valgrind adalah? JASON Hirschhorn: Maaf? PELAJAR: Bolehkah anda mengulangi apa yang tujuan Valgring adalah? JASON Hirschhorn: Valgrind adalah nama yang - seperti GDB membantu anda debug program anda, Valgrind membantu anda memahami jika perkara yang tidak dibebaskan apabila program anda menutup. Jadi, anda akan berjalan pada program anda. Dan program anda keluar, dan ia akan mengatakan program anda dipanggil malloc banyak ini kali untuk banyak bait ini, dan anda hanya dipanggil percuma banyak kali ini. Dan supaya anda meninggalkan ini bytes banyak tanpa dibebaskan. Atau ia akan mengatakan anda telah dibebaskan segala-galanya. Kerja yang baik. PELAJAR: OK. Dan ia dipanggil Valgring? JASON Hirschhorn: V-A-L-G-R-I-N-D. PELAJAR: Satu soalan mengenai petunjuk. Jadi mengatakan anda n bintang x sama sesuatu. Yang sama, apa sahaja yang anda meletakkan ada, adalah bahawa apa yang sedang diletakkan di dalam apa x menuding kepada, atau penunjuk x? JASON Hirschhorn: Bolehkah anda mengulangi soalan? Bolehkah kita menarik semasa anda mengatakan ia? PELAJAR: Dalam kuiz, sebenarnya, yang anda menghantar kami, ia adalah seperti, char kebenaran bintang sama batu CS50, bukan? Jadi adakah ini bermakna bahawa batu CS50 adalah apa yang benar itu menunjuk ke? JASON Hirschhorn: Jadi anda bercakap kira-kira bintang char dalam tali, bagaimana yang bekerja? Yeah. OK. Mari kita menarik ini di sini. [SAMPINGAN PERBUALAN] JASON Hirschhorn: Jadi ubah ini akan menjadi jenis char bintang. Bagaimana besar adalah pembolehubah jenis char bintang? Berapa banyak bait? PELAJAR: Empat. JASON Hirschhorn: Ia empat bait. Berapa banyak hak dijadikan pemboleh ubah jenis int bintang? PELAJAR: Empat. JASON Hirschhorn: Empat bait. Jika ia penunjuk, maka ia sentiasa empat bait, kerana petunjuk, mereka nilai adalah alamat ingatan. Dan alamat-alamat ingatan di CS50 perkakas empat bait. Oleh itu, apabila kita panggil getstring, atau apabila kita katakan, stringname sama, dan kemudian di petikan berganda meletakkan tali, kami meletakkan - baik, itu sedikit berbeza. Kami akan jangan getstring sebagai contoh. Atau char bintang sesuatu sama tali. Maaf, beri saya contoh yang yang anda baca? PELAJAR: char kebenaran bintang sama "Batu-batu cs50" dalam tanda petik. JASON Hirschhorn: Jadi bintang ini, ini kami akan memanggil ubah ini x untuk kami tujuan generik. Kami telah membuat dalam pembolehubah x. Ia jenis char bintang. Ia adalah penunjuk kepada satu siri aksara. Jadi turun di sini - Jadi ini adalah bagaimana ini akan bekerja dalam ingatan. Ini akan menyimpan alamat memori. Ia akan menyimpan alamat memori aksara pertama dalam tatasusunan. Dan kemudian apabila anda diikuti penunjuk, anda akan mendapatkan watak pertama. Dan jika anda membaca perkara ini seperti tali, komputer anda adalah pintar cukup untuk mengetahui, membaca perkara ini sehingga ia sampai ke serangan balas 0. Tetapi jika anda membaca ia watak di satu masa, jadi anda iterating melalui tali ini, maka anda hanya akan membaca aksara pada satu masa sehingga anda sampai ke garis sendeng terbalik 0. Yang mungkin tidak menjawab anda soalan, walaupun. PELAJAR: Ya, tetapi anda tidak mempunyai malloced ruang yang namun bagi penunjuk itu. JASON Hirschhorn: Jadi saya tidak pasti betul-betul apa yang anda cari di, kerana saya tidak membuat kuiz itu. Yang sepatutnya menjadi berguna sumber dari TF yang lain. Jika anda membuat tali pada stack atau sebagai pembolehubah tempatan, ia akan hanya menjadi pelbagai caj dan bukan umumnya bintang char menunjuk ke tali yang lain. Tetapi saya tidak tahu. Yang boleh menjadi penunjuk yang lain tali pada timbunan juga. Yeah. PELAJAR: Saya tahu bahawa anda perlu memperuntukkan memori jika penunjuk berada mendapat diisytiharkan di dalam fungsi lain. Adakah anda perlu melakukan perkara yang sama jika ia diisytiharkan dalam utama, anda menggunakannya di dalam utama? JASON Hirschhorn: Jadi ya. Anda boleh mengisytiharkan penunjuk kepada mana-mana alamat ingatan dalam ingatan. Ia boleh menjadi alamat memori tempatan berubah-ubah, walaupun sering kali, orang tidak mengisytiharkan alamat-alamat ingatan kepada pembolehubah tempatan kerana mereka pergi jauh sekali fungsi yang mengembalikan, yang sebabnya kita biasanya malloc sesuatu. Tetapi ya, anda boleh mengisytiharkan penunjuk yang lain pembolehubah tempatan. Ia hanya umumnya tidak dilakukan. Tetapi saya boleh lihat bahawa perkara tertentu selepas kelas. Yeah. PELAJAR: Saya rasa ini adalah jenis daripada apa yang diminta. Ia seolah-olah pelik untuk Memulakan penunjuk bukan sebagai alamat, tetapi seperti apa seolah-olah seperti nilai. Ia seolah-olah seperti CS50 adalah apa yang di dalam perkara yang sedang menunjuk kepada dan bukan alamat sebenar, bukan? JASON Hirschhorn: Jadi, itu tidak kes itu, walaupun. Itu bukan apa yang berlaku. Apabila anda mengisytiharkan bintang char, ia adalah alamat ingatan. Penunjuk semua alamat-alamat ingatan menunjuk kepada sesuatu yang lain. Bahawa sesuatu lagi yang berada di timbunan, tetapi selalunya adalah pada ditimbunkannya dalam cara kita akan melihat ia digunakan. Tetapi stringname sama dua quote "Getstring," kita dapat melihat bahawa dan kita boleh melihat melalui itu dan kod itu. getstring rentetan adalah tidak disimpan di dalam yang berubah-ubah, atau apa sahaja tali namanya adalah tidak disimpan dalam yang berubah-ubah, kerana itu bukan bagaimana petunjuk bekerja. Adakah ini masuk akal? PELAJAR: Yeah. JASON Hirschhorn: OK. Mudah-mudahan, yang tidak mengelirukan kepada sesiapa. Tetapi jika ia adalah, kita boleh melihat pada sekali lagi dalam sedikit, kerana sedang kita sebenarnya akan kod sesuatu yang akan diharapkan bekerja dengan tali dan membantu anda berasa lebih selesa dengan mereka. Apa-apa soalan lain yang berkaitan dengan ini topik atau topik lain yang Saya akan meletakkan kembali ke atas? Dan - sekarang. Ya, Alden. Alden: Jadi ini adalah benar-benar tidak berkaitan, tetapi boleh kita hanya pergi ke atas benar-benar cepat apa yang kita perlu tahu tentang perbezaan antara 32 dan Mesin 64-bit? JASON Hirschhorn: Ya. Jadi 32 bit adalah berapa banyak bait? Alden: Ia empat bait. JASON Hirschhorn: Ia empat bait. Dan 64 bit adalah berapa banyak bait? PELAJAR: Lapan. JASON Hirschhorn: Lapan bait. Jadi sekali lagi, lapan bit adalah salah satu bait. Perkakas CS50 anda mesin 32-bit. Jadi alamat ingatan yang empat bait panjang. Terdapat 2 kepada 32 alamat ingatan. 0-2 kepada 32 tolak 1. Dan saya tidak positif, tetapi itu mungkin skop apa yang anda perlu tahu untuk mesin 32-bit, bahawa memori alamat, sekali lagi, empat bait panjang, dan itulah jumlah maksimum alamat ingatan. Selain itu, jenis data - ini mungkin menjadi sesuatu yang baik itu diperhatikan. Saiz jenis data bergantung kepada mesin yang anda bekerja dengan. Jadi char, watak tunggal, ialah bagaimana banyak bait perkakas CS50 kita? Satu bait. Dan ia sebenarnya satu bait sebagai baik pada mesin 64-bit. Dan kebanyakan jenis data adalah nombor yang sama daripada bait di kedua-dua mesin. Tetapi beberapa jenis data akan berbeza di kedua-dua mesin. Jadi yang akan berpotensi Satu-satunya perkara yang anda perlu tahu. Tetapi itu, saya fikir, adalah di luar batas - Saya hampir positif, jika anda melihat kembali di kuiz lama, ia berkata, menganggap untuk pengekodan masalah anda menggunakan mesin 32-bit. Tetapi ada, untuk pergi bersama-sama dengan yang di dalam sekiranya anda berminat, terdapat jenis data yang sama saiz pada semua mesin. Jika anda telah melihat sesuatu seperti uint32_t, anda mungkin atau mungkin tidak telah melihat bahawa. Itu merupakan jenis data. Yang berkata, menjadi 32 bit tidak kira apa mesin ini dihidupkan. Oleh itu, apabila orang menulis mudah alih kod, mereka mungkin tidak akan menggunakan Ints. Mereka sebaliknya akan menggunakan data lain jenis yang mereka tahu akan sama saiz pada setiap mesin tunggal. Madhu. Madhu: Saya mempunyai soalan mengenai proses penyusunan. Jadi, jika anda menulis satu program yang menggunakan perpustakaan seperti CS50 atau sesuatu seperti itu, saya tahu bahawa perpustakaan yang perlu, pada satu ketika, menjadi disusun dan dikaitkan masuk Tetapi berapa banyak yang berlaku semasa penyusunan program anda? Apa yang sebahagian daripada proses perpustakaan berlaku apabila anda menyusun program anda sendiri? JASON Hirschhorn: Jadi mari kita pergi ke umumnya langkah-langkah proses ini. Anda menulis. C fail anda. Dalam. C fail anda, anda # include anda perpustakaan header, sebagai contoh, cs50.h. Apakah yang tajam termasuk talian lakukan untuk program anda? Akchar. AKCHAR: Ia menambah prototaip fungsi dari pengepala fail dalam perpustakaan. JASON Hirschhorn: Tepat sekali. Ia menambah mereka fungsi prototaip kepada kod anda. Oleh itu, apabila kod anda sedang dikumpul dalam peringkat awal, pengkompil tahu bahawa fungsi-fungsi ini benar-benar wujud, dan bahawa di suatu tempat mereka telah ditentukan. Yang. H fail tidak termasuk takrif bagi fungsi-fungsi ini atau bagaimana mereka benar-benar bekerja. Cs50.h hanya termasuk sesuatu yang berkata getstring adalah satu perkara yang sebenar yang boleh berlaku. Dan standardio.h kata printf adalah satu perkara sebenar yang boleh berlaku. Header Jadi c Bahasa dengan ini. fail mendapat bertukar menjadi beberapa kod mesin yang boleh dibaca, yang akhirnya mendapat bertukar menjadi binari kod, 0 dan 1 ini. Dan itu kod yang akhirnya mendapat dilaksanakan. The-l cs50 talian - sebagai contoh, bila anda menulis dentang - dan kemudian anda termasuk-l cs50, anda taip yang masuk Dan anda melihat bahawa. Apabila anda menulis membuat, anda akan melihat baris yang menyatakan di sini. Dan kita akan melihat bahawa dalam kedua apabila kita kod atau kemudian apabila kita kod. Tetapi itu-l talian cs50 melakukan sesuatu agak berbeza daripada yang # include cs50.h. Apakah garis yang-l cs50 lakukan? Avi? AVI: Saya ingin mengatakan bahawa ia menghubungkan perpustakaan untuk fungsi memanggil, seperti. fail o. JASON Hirschhorn: Jadi sangat rapat, jika tidak melihat-on. The-l cs50 mengambil fail binari dan memasukkan ia dengan fail binari anda. Jadi cs50.h, tidak ada gunanya dalam mengubah cs50.h dari bahasa C kepada perduaan setiap kali tunggal ia sedang digunakan. Itu akan menjadi bodoh, kerana yang akan membazirkan banyak masa. Jadi ia telah disusun dan bertukar menjadi laksana. Dan kini ia akan digabungkan dengan fail anda pada akhir. Maka orang-orang 1 dan 0 ini akan untuk bergabung dengan orang yang anda dan 0 ini pada akhir. Jadi sekarang anda benar-benar akan mempunyai sebenar 1 dan 0 yang menentukan cara getstring, sebagai contoh, kerja-kerja, atau bagaimana printf, sebagai contoh, kerja-kerja. Dan untuk maklumat lanjut, ada penyusun pendek yang Nate memberikan yang anda perlu menyemak yang pergi melalui langkah-langkah ini. Tetapi - ya. PELAJAR: Adakah mereka sentiasa dalam o fail. apabila mereka dalam bentuk perpustakaan, sedia untuk bergabung, yang dikaitkan - seperti mereka dalam kod binari? JASON Hirschhorn: OK. Apa - PELAJAR: Adakah itu semestinya untuk perpustakaan apabila anda menghubungkan mereka? JASON Hirschhorn: Ya. Jadi tidak. S fail, yang akan menjadi kod mesin, yang juga akan menjadi samar kepada anda. Anda tidak perlu bimbang tentang mereka. Tetapi secara amnya, yeah, mereka akan berada di dalam. o fail bersedia untuk pergi. PELAJAR: Oleh itu, apabila anda menghantar kepada perpustakaan, adakah anda hanya kapal yang. h dan. o? Anda tidak kapal itu. C atau. S. JASON Hirschhorn: Jadi - dan ini adalah pendek ini juga, jika maklumat ini seolah-olah datang yang sedikit cepat. Tetapi pendek pada penyusun perbincangan tentang ini juga. Apabila anda kapal perpustakaan, jika anda kapal yang. h, Fail pengepala, orang-orang prototaip fungsi, dan 1 dan 0 ini, itu sahaja yang anda perlukan untuk memberi. Anda tidak perlu untuk memberi bagaimana fungsi berfungsi,. c fail. Kerana titik pengambilan, atau menunjukkan API, titik di SPL ini, perpustakaan mudah alih Stanford, ia untuk anda bimbang tentang bagaimana baru GRect kerja-kerja, atau bagaimana bergerak kerja-kerja, atau bagaimana menambah kerja-kerja. Semua yang anda perlu tahu ialah bahawa add adalah fungsi yang anda boleh digunakan, dan ia ini. Jadi anda benar-benar tidak perlu tahu bagaimana ia ditulis dalam C. Anda hanya perlu tahu, berikut adalah fungsi, apa yang mereka lakukan, dan di sini adalah ini 1 dan 0 apabila anda benar-benar mahu menggunakan mereka. Sejuk. Sebarang pertanyaan lanjut mengenai penyusun topik-topik yang lain di atas kapal? PELAJAR: Saya mempunyai persoalan melaksanakan fungsi rekursif. Satu soalan mengenai rekursi. Saya mempunyai perasaan yang akan datang. Jadi mari kita cepat melalui rekursi dengan tertentu Sebagai contoh, fungsi faktorial. Kerana ini adalah satu contoh yang sering datang ke atas atau digunakan untuk menggambarkan rekursi. Jadi "4!" dibaca sebagai 4 faktor. Dan apakah 4 faktorial bermakna? Apakah yang lakukan? Bagaimana anda mengira 4 faktorial? 4 kali 3 kali 2 kali 1. Jadi satu lagi cara untuk menulis 4 faktorial adalah untuk menulis ini. 4 kali 3 faktor. Kerana 3 faktorial 3 kali 2 kali 1. Jadi 4 kali 3 faktorial 4 kali 3 kali 2 kali 1. Inilah sebabnya mengapa faktorial adalah besar calon untuk rekursi, kerana ia jelas bahawa ada sesuatu yang berlaku berulang-ulang pada bilangan yang lebih kecil perkara sehingga anda mencapai akhir. Apabila anda mencapai 1, 1 faktorial ialah 1. Anda tidak boleh pergi lebih jauh. 0 faktorial juga ditakrifkan sebagai 1. Oleh itu, apabila anda dapat 1 atau 0, anda pada akhirnya, dan anda boleh mula pergi kembali. Jadi, jika kita mahu menulis rekursif yang fungsi untuk mengira Faktorial, kita akan menulis beberapa kod pseudo untuk itu sekarang. Sebelum kita menulis kod pseudo yang - Saya akan memberikan anda semua beberapa minit untuk menulis kod pseudo atau hanya berfikir mengenainya - terdapat dua perkara setiap fungsi rekursif memerlukan. Apakah kedua-dua perkara? JACK: Ia mempunyai untuk memanggil sendiri. JASON Hirschhorn: Nuh? Oh, Jack. Teruskan. JACK: Ia mempunyai untuk memanggil sendiri. JASON Hirschhorn: Jadi rekursi fungsi memerlukan panggilan rekursif, yang panggilan kepada dirinya sendiri. Itulah satu. Dan apa yang perkara yang lain? JACK: Kes asas. JASON Hirschhorn: Kes asas. Kes asas adalah, di sini apabila kita berhenti. Jadi fungsi anda mendapat dipanggil. Kes asas diutamakan. Adakah anda ingin tahu jika anda pada akhir. Dan jika anda tidak berada di hujung, anda membuat panggilan rekursif anda. Dan anda melalui fungsi ini sekali lagi, menyemak kes asas anda lagi. Jika anda tidak akhirnya, anda membuat satu lagi panggilan rekursif, dan sebagainya, dan sebagainya. Itulah sebabnya fungsi rekursif sentiasa perlu kes-kes asas dan orang-orang panggilan rekursif. Jika anda tidak mempunyai panggilan rekursif, ia tidak akan menjadi fungsi rekursif. Jika anda tidak mempunyai kes asas, anda akan pergi selama-lamanya dan tidak akan ada pengakhiran. Dan kes asas yang sentiasa datang pertama, kerana anda akan sentiasa mahu untuk memeriksa jika anda berada di hujung yang pertama. Jadi sebelum kita melakukan kod pseudo, mengapa anda tidak mengambil satu minit untuk berfikir tentang bagaimana fungsi faktorial rekursi akan ditulis? Juga, seperti yang banyak yang anda lakukan, penulisan ia keluar pada sehelai kertas adalah apa yang anda akan perlu lakukan pada kuiz esok. Amalan Jadi mungkin baik untuk membuat memastikan kod yang anda menulis dalam helaian kertas - atau anda boleh berbuat demikian. Anda tahu di mana koma bertitik adalah. Anda ingat sintaks. Kerana anda tidak sedang dapat mempunyai pengkompil memberitahu anda membuat kesilapan. Selain itu, di sepanjang garis, esok, apabila anda pengekodan masalah, jika anda sedang bergegas untuk masa, atau jika anda sangat keliru dengan bagaimana anda sepatutnya menulis perkara yang tertentu dalam c, ia akan behoove anda untuk menulis kod pseudo- atau menulis komen dalam juga. Kerana ada kredit separa untuk banyak soalan kuiz ini. Jadi anda mungkin bergegas, atau anda mungkin hanya keliru. Penulisan dalam komen atau pseudo-kod sering cara yang anda boleh mendapatkan kredit separa. Jadi jangan meninggalkan sesuatu kosong di kuiz. Tidak ada hukuman bagi meletakkan sesuatu masuk Malah, meletakkan dalam pseudo-kod atau komen akan membantu murid kelas yang memikirkan jika anda benar-benar tahu apa yang anda bercakap tentang, dan mungkin anugerah anda beberapa kredit separa untuk itu. Juga bersama-sama orang-orang garisan, menulis dengan jelas. Jika kita tidak boleh benar-benar apa yang anda menulis, kita tidak akan memanggil anda pada tengah malam esok untuk angka apa yang anda menulis. Kami hanya akan mengambil kira mata. Tulis dengan jelas supaya kita boleh mendengar, atau sebaliknya, kita boleh membaca apa yang anda tulis. Dan jika ia berkata dua ayat, tidak menulis perenggan. Ikut arahan. Tulis dengan jelas. Dan menulis dalam orang komen atau kod pseudo untuk soalan-soalan yang boleh anugerah kredit separa. OK, mari kita pergi ke faktor. Oleh itu, kita mempunyai fungsi faktorial. Jika saya untuk benar-benar menulis ini dalam C, apa yang saya perlu meletakkan sebelum nama fungsi? Jenis balasan, yang, pada ini kes, kami akan memberikan int. Dan kemudian di dalam pendakap kerinting, adalah apa yang berlaku di dalam pendakap kerinting untuk fungsi? PELAJAR: Jenis Hujah. JASON Hirschhorn: hujah dananya. Jadi faktorial mungkin akan mengambil pertengkaran. Ia akan mungkin hanya mengambil satu hujah. Dan kita akan berkata ia akan mengambil integer dipanggil x. Dan sekali lagi, semasa menulis prototaip fungsi atau menulis fungsi dalam kod anda sebelum menentukan ia, anda menulis jenis data dan nama yang berubah-ubah bagi fungsi itu sahaja. Jadi, anda boleh lulus beberapa nombor ke dalam ini fungsi, ia akan dirujuk sebagai x dalaman. Kami mempunyai fungsi faktorial kami. Kita perlu dua perkara, satu kes asas dan panggilan rekursif. Apakah kes asas untuk faktorial? Seseorang yang menulis ia keluar dan yang tidak mempunyai bercakap lagi, apa yang asas kes bagi faktorial? PELAJAR: Jika n adalah kurang daripada 2, kembali 1. JASON Hirschhorn: Jika n adalah kurang daripada 2, kembali 1. Saya suka bahawa, kerana itu menjaga 0 dan 1. Oleh itu, kita akan melakukan x <2, kembali 1. Jika kita mendapat lulus 0, jika kita mendapat lulus 1, fungsi ini akan segera kembali 1. Jika kita mendapat lulus beberapa nombor yang lebih besar daripada atau sama dengan 2, kita akan mempunyai panggilan rekursif kami. Dan sebagainya bagaimana yang akan bekerja? Bolehkah orang lain yang bekerja di ini yang tidak bercakap belum memberi saya panggilan rekursif untuk fungsi ini dalam kod pseudo? Jika kita mendapat lulus dalam beberapa x dan ia lebih daripada 2, apa yang kita mahu lakukan? Kami juga telah contoh bertulis mengenai sampingan yang mungkin memberi anda petunjuk. PELAJAR: Hubungi x kali faktorial x tolak 1? JASON Hirschhorn: Tepat betul. Kita akan kembali x kali faktorial x tolak 1. Dan itu, walaupun saya telah menulis sehingga, pada dasarnya, apa yang anda berkata dalam bahasa Inggeris, fungsi faktorial ini akan mendapat dipanggil lagi. Ia akan melaksanakan pada x tolak 1. Ia akan kembali dengan beberapa integer, dan maka ia akan membiak kedua-dua bersama-sama, dan nilai yang akan menjadi kembali kepada apa sahaja yang dipanggil ini fungsi faktorial, yang mungkin menjadi satu lagi contoh fungsi faktorial ini. Jadi itulah satu contoh rekursif yang fungsi, yang sangat fungsi rekursif mudah. Tetapi kebanyakan mereka akan menjadi seperti ini. Jika anda ingin rekursif yang baik mencabar untuk kuiz, cuba pengekodan carian binari secara rekursif. Kerana jika anda lakukan carian binari untuk masalah menetapkan tiga, anda mungkin melakukannya iterative dalam gelung sementara. Tetapi ia juga boleh ditulis secara rekursif. Anda akan perlu untuk menulis sendiri fungsi berasingan yang mengambil beberapa hujah baris arahan yang berbeza - atau tidak hujah baris arahan, beberapa berbeza hujah hanya biasa. Tetapi anda boleh menulis carian binari secara rekursif juga. PELAJAR: Jadi anda boleh juga ditulis, bukannya x tolak 1, anda boleh juga telah menulis x tolak tolak, atau anda boleh mempunyai ditulis tolak tolak x. Bolehkah anda hanya menjelaskan benar-benar cepat mengapa mereka akan menjadi perkara yang berbeza, seperti apa perbezaan antara x tolak tolak dan tolak tolak x? JASON Hirschhorn: Tidak, saya tidak akan pergi ke dalam itu. Tetapi saya akan bercakap kepada anda mengenainya selepas kelas. x tolak tolak, tolak tolak x SUSUTAN x oleh 1. Tetapi mereka melakukannya agak berbeza. Tetapi saya tidak mahu pergi ke dalam itu. Soalan-soalan lain mengenai rekursi atau fungsi ini? Yang tidak benar-benar walaupun kod pseudo. Yang pada dasarnya kod di dalam C anda akan menulis untuk ini. OK, mana-mana soalan-soalan lain tentang topik di sini? Yeah. PELAJAR: Saya mempunyai buruk cepat titik terapung dan tepat. JASON Hirschhorn: Terapung titik dan tepat. Bolehkah seseorang benar-benar cepat memberi saya buruk daripada titik terapung dan tepat? Anda semua terpaksa melakukan ini untuk anda masalah ditetapkan, jadi anda semua biasa dengannya. Atau mungkin tidak semua. Sesiapa sahaja? Berikan saya tempat yang bermula. Terapung titik dan tepat. Apa masalahnya? Ya. Victoria? Vanessa: Vanessa. JASON Hirschhorn: Vanessa. Maaf. Vanessa: Terdapat hanya beberapa terhingga nombor yang boleh diwakili kerana anda pada, dalam kita kes, sistem 32-bit. Jadi anda jenis perlu membuat beberapa nombor. JASON Hirschhorn: Jadi, itu betul-betul betul. Terdapat hanya sejumlah nombor yang boleh diwakili. Jika anda membiak dua nombor yang sangat besar, ia mungkin melimpah jumlah yang ruang anda perlu mewakili integer. Itulah sebabnya kadang-kadang kita menggunakan panjang panjang dan bukan int satu. Yang mempunyai lebih ruang. Yang boleh menampung bilangan yang lebih besar. Titik terapung ketepatan mempunyai kaitan dengan itu, tetapi juga mempunyai kaitan dengan Hakikat bahawa nombor perpuluhan tidak sentiasa diwakili. Maaf. Izinkan saya meletakkan kembali ini ke atas. Perpuluhan bilangan 1.0 tidak selalunya diwakili seperti yang anda jangkakan, 1,000000000. Ia kadang-kadang digambarkan sebagai 1,000000001 atau ,999999999. Ia mungkin juga 89 dibuang di sana. Jadi nombor-nombor perpuluhan tidak diwakili sama seperti yang anda lakukan mengharapkan mereka diwakili. Jadi dalam masalah set - adalah ia dua? - masalah menetapkan dua, di mana kita diuruskan nombor titik apung, apabila kita mahu mereka untuk mewakili apa yang kita mahu mereka untuk mewakili, bilangan daripada beberapa sen, atau bilangan sen, kita menggandakan mereka dengan 100. Kami bulat mereka. Dan kemudian kita terputus segala-galanya di belakang titik perpuluhan. Itu adalah untuk memastikan bahawa mereka akan sebenarnya sama betul-betul apa yang kita mahu mereka sama. Kerana apabila anda mengambil sesuatu yang yang terapung dan mengubahnya menjadi int, anda memotong semuanya ke kanan titik perpuluhan. Oleh kerana ada beberapa titik terapung ketakpersisan, 100.000 mungkin diwakili sebagai 99,999999999. Dan jika anda hanya memotong segala-galanya kepada merta yang betul, anda akan mendapatkan nombor yang salah. Yeah. PELAJAR: Saya mempunyai soalan mengenai pemutus. Apakah perintah ia berlaku dalam? Jika anda akan melakukan terapung, kurungan, 1 dibahagikan dengan 10, ia jangan 1 dibahagikan dengan 10, kemudian mendapatkan 0.1, kemudian ke dalam apungan? JASON Hirschhorn: Jika anda melakukan terapung 1 dibahagikan dengan 10 - PELAJAR: Ya, dan kemudian sama - dengan baik, ia akan biasanya mempunyai ia sama dalam - Yeah. Anda ingin ia apungan, bukan? JASON Hirschhorn: OK, jadi kita akan menggunakannya untuk Segue ke dalam memikirkan jawapan kepada soalan-soalan melalui pengkodan. Kerana anda mungkin akan mempunyai banyak soalan-soalan ini minit, dan cara yang baik untuk menyelesaikannya adalah melalui pengkodan. Jadi, kita akan kod hak ini sekarang, dan kemudian kita akan kembali dan kod soalan anda telah. Jadi baris pertama - Aku tidak bertulis itu - apa yang perkara pertama yang kami mahu lakukan apabila kita membuka fail baru dalam gedit? PELAJAR: Termasuk. JASON Hirschhorn: Termasuk apa? PELAJAR: perpustakaan CS50. JASON Hirschhorn: OK. Apa lagi yang perlu kita termasuk? Kami hanya akan menyemak apa yang berlaku apabila anda membuang sesuatu kepada apungan. Tetapi apa yang kita perlu termasuk jika kita akan menulis program C? PELAJAR: Standard I / O. JASON Hirschhorn: stdio.h. Kita sebenarnya tidak perlu, kerana ini program, cs50.h, walaupun ia sentiasa membantu untuk memasukkannya ke. Tetapi kita sentiasa perlu stdio.h. PELAJAR: Apabila pengekodan dalam C? JASON Hirschhorn: Apabila pengekodan di C. Jadi saya simpan sebagai ini. C fail. Saya mendapat beberapa sintaks penonjolan bagus. Saya menulis di dalam tidak sah utama. Apa yang tidak sah bermakna? PELAJAR: Tidak mengambil apa-apa hujah baris arahan. JASON Hirschhorn: cara Void, dalam ini kes, utama tidak mengambil apa-apa hujah baris arahan. Dalam kes-kes lain, ia bermakna fungsi tersebut tidak mengambil hujah baris arahan. Atau majlis itu, jika saya menulis tidak sah utama (tidak sah), yang akan berkata ini utama tidak kembali apa-apa. Jadi tidak sah hanya bermakna apa-apa. Apa yang saya akan menulis jika saya mengambil hujah baris arahan? PELAJAR: int arka c string arka v JASON Hirschhorn: int argc tali argv. Yang tepat itu? PELAJAR: Ia char kurungan argv bintang. JASON Hirschhorn: Jadi, anda boleh menulis kurungan tali argv atau argv char bintang kurungan, tetapi anda perlu kurungan. Kerana argv adalah satu pameran tali, ingat. Ia bukan hanya satu rentetan. Jadi tali argv adalah, inilah satu tali dipanggil argv. Kurungan String argv adalah, di sini pelbagai tali. Jadi int kurungan argc tali argv akan menjadi sesuatu yang saya mungkin akan menulis. Jadi anda mahu simpan dalam integer? PELAJAR: Ya, integer. Atau dalam apungan. JASON Hirschhorn: Dalam apungan? Seperti, apungan x sama 1 dibahagikan dengan 10. JASON Hirschhorn: OK. Bagaimana saya mencetak apungan dalam printf? Apa? PELAJAR:% f. JASON Hirschhorn:% f. Apakah integer? d atau i. Apakah rentetan? PELAJAR: s. JASON Hirschhorn: s. Bagaimana saya mendapat barisan baru? PELAJAR: garis sendeng terbalik n. JASON Hirschhorn: Apa saya kembali jika berjalan utama dengan betul? PELAJAR: 0. Adakah saya perlu untuk menulis baris itu, walaupun? PELAJAR: No OK, kita tidak akan menulisnya, kemudian. Bolehkah semua orang membaca bahawa? Ia kelihatan agak kecil. Bolehkah semua orang melihat, atau jika Saya membuat ia lebih besar? Saya berfikir untuk kamera, kami akan membuat ia agak besar, walaupun. JASON Hirschhorn: Jika saya ingin menjadikan ini . C memfailkan ke dalam laku, apa saya menulis? PELAJAR: Buat ujian. JASON Hirschhorn: Maaf? PELAJAR: Buat ujian. JASON Hirschhorn: Buat ujian. Kami bercakap mengenai garis ini lebih awal. Dentang. Apa yang dilafaz? Nama pengkompil. Apa garis ini? PELAJAR: Menetapkan ia untuk penggunaan GDB. JASON Hirschhorn: Set ia untuk penggunaan GDB. Keturunan ini, apa itu? PELAJAR: Kod sumber. JASON Hirschhorn: Itulah fail sumber,. c fail. Apa yang kedua-dua baris lakukan? Atau kedua-dua tidak baris. PELAJAR: Ia nama ia menguji. JASON Hirschhorn: Jadi dash o berkata, nama itu sesuatu yang berbeza. Dan di sini anda memanggil ia ujian. Jika saya tidak mempunyai bahawa dalam, apa yang ia akan menamakan ini? PELAJAR: A.out. JASON Hirschhorn: A.out. Apakah ini lakukan? PELAJAR: Pautan perpustakaan matematik. JASON Hirschhorn: Ia menghubungkan di perpustakaan matematik. Kami tidak termasuk perpustakaan matematik, tetapi kerana itulah begitu biasa, mereka telah make bertulis kepada sentiasa termasuk perpustakaan matematik. Dan begitu juga, ini termasuk perpustakaan CS50. OK, jadi jika kita senarai, kami kini mempunyai boleh laku dipanggil ujian. Untuk melaksanakannya, saya menulis ujian. Saya melihat bahawa titik terapung saya, seperti yang dijangkakan, sama dengan 0. Adakah ini - jadi - PELAJAR: Kemudian jika anda meletakkan terapung sekarang, seperti anda membuang sebagai apungan - JASON Hirschhorn: Cast 1 kepada apungan? PELAJAR: Tidak, membuang perkara yang penuh - yeah. Jika anda hanya melakukan itu, akan yang menjadikannya 0.1? JASON Hirschhorn: OK, jadi benar-benar cepat, 1 dibahagikan dengan 10, mereka adalah integer yang dibahagikan. Oleh itu, apabila anda membahagikan integer, mereka 0, dan anda menyimpan bahawa 0 dalam terapung, kerana tanda palang adalah hanya bahagian integer. Jadi sekarang kita membelok sesuatu ke dalam apungan. Mari kita lihat apa yang berlaku. Kami akan membuat ujian. Jadi sekarang kita melihat bahawa palang yang tidak bahagian integer, ia terapung bahagian mata. Kerana salah satu hujah-hujah telah dibuang kepada apungan. Jadi sekarang ia telah berkata, merawat ini bahagian seperti kita berurusan dengan titik terapung, bukan dengan integer. Dan jadi kita mendapat jawapan yang kita harapkan. Mari kita lihat apa yang berlaku - oops. Jika saya mahu mencetak lebih perpuluhan tempat, bagaimana saya boleh melakukannya? PELAJAR: Point f dot, atau kerana ramai tempat perpuluhan yang anda mahu. JASON Hirschhorn: Jadi saya mencetak 10 tempat perpuluhan. Dan kita lihat sekarang kami mendapat beberapa barangan pelik. Dan yang kembali kepada soalan anda mengenai terapung titik ketakpersisan. Ada barangan pelik disimpan di sini. OK, adakah itu menjawab soalan anda? Apa lagi yang anda mahu kod dengan cepat? PELAJAR: Saya hanya mahu melihat sama ada atau tidak, jika anda dibebaskan beberapa penunjuk, sama ada penunjuk yang masih telah disimpan di dalam ia alamat apa yang ia telah menunjuk ke sebelum ini. JASON Hirschhorn: OK, jadi mari kita melakukannya. Ptr bintang Char, ini mewujudkan pembolehubah dipanggil ptr jenis char bintang. Bagaimana untuk menulis malloc? Alden? Alden: Hanya malloc. Tetapi ia telah menjadi saiz, dan dalam kes ini, saya rasa boleh akan menunjuk ke char. Jadi ia akan menjadi char. JASON Hirschhorn: OK, jadi lebih secara umum, dalam - mari kita mengedit. Di dalam malloc, anda mahu bilangan daripada bait pada timbunan itu. Secara umumnya, apa yang kita lihat bahawa kita lakukan adalah kita akan malloc tali, sebagai contoh, atau tatasusunan integer. Jadi, jika kita mahu 10 integer, atau 10 aksara, 10 akan memberikan kami 10. Dan kemudian saiz aksara akan memberikan kami saiz yang daripada aksara, yang pada hal ini adalah 1 bait. Kami mendapat 10 bait. Jika kita menulis saiz int, yang akan memberi kita 40 bait. Jadi lebih umum, di dalam malloc adalah bilangan bait yang anda mahu. Dalam kes ini, kami mendapat 1 bait. Yang seolah-olah seperti penggunaan pelik daripada malloc, tetapi untuk kita tujuan masuk akal. Jadi ada itu. Kami akan memanggil percuma. Kami membuangnya dan kami menggunakan ptr lagi. Dan apa yang anda mahu untuk memeriksa? PELAJAR: Saya hanya mahu untuk memeriksa sama ada atau tidak ada apa-apa di dalamnya. JASON Hirschhorn: Jadi, sama ada ia menunjuk kepada apa-apa? PELAJAR: Ya, betul-betul, sama ada ia masih mempunyai alamat ingatan. JASON Hirschhorn: Jadi anda mahu untuk memeriksa nilai ptr? PELAJAR: Ya, betul-betul. JASON Hirschhorn: Apa yang saya tulis di sini jika saya ingin menyemak nilai titik - apa yang, Jordan berkata, nilai? Atau apa yang disimpan di dalam ptr? PELAJAR: Satu alamat ingatan. JASON Hirschhorn: Satu alamat ingatan. Jadi, jika saya menulis hanya ini, ia akan memberi saya nilai ptr. Dan bagaimana saya mencetak alamat memori? Apakah rentetan format untuk alamat ingatan? PELAJAR:% p. JASON Hirschhorn:% p. % S adalah rentetan. % P untuk penunjuk. Yang tepat itu? Yang betul. Jadi ptr sama - ia masih mempunyai sesuatu di dalamnya. Ini mungkin yang lebih soalan yang menarik. Apakah garis yang lakukan? PELAJAR: dosa Seg. JASON Hirschhorn: Apa? PELAJAR: Saya rasa ia seg kesalahan. JASON Hirschhorn: Hm? PELAJAR: Saya rasa ia akan seg bersalah. JASON Hirschhorn: Jadi baris ini daripada ptr kod, bintang, apa yang adakah bintang bermakna? PELAJAR: Kandungan. JASON Hirschhorn: Yeah. Pergi untuk mendapatkan kandungan. Jadi ini akan pergi kepada memori yang menangani disana dan memberikan saya itu. Saya menggunakan% c betul di sini kerana terdapat adalah watak-watak yang disimpan di sana. Jadi, kita akan pergi ke alamat kami hanya melihat - atau ia mungkin akan menjadi sedikit ini berbeza kali kita menjalankan program. Tetapi kita akan pergi ke alamat yang yang kita tahu masih wujud dan melihat apa yang ada. Jadi ia tidak seg bersalah. Ia hanya tidak memberikan kita apa-apa. Ia mungkin sebenarnya memberikan kita sesuatu, kita tidak dapat melihatnya. Dan yang kembali kepada idea ini - dan kami tidak akan mendapat terlalu banyak ke dalam ini, kerana itulah di luar skop kursus ini. Tetapi kita bercakap tentang di sini, jika kita telah melampaui batas array oleh 1, kita tidak mungkin akan mendapat dalam kesusahan. Kadang-kadang, apabila anda hanya pergi sebanyak 1, anda melakukan sesuatu yang salah, dan anda akan berada dalam masalah. Tetapi anda tidak sentiasa mendapat dalam kesusahan. Ia bergantung berapa banyak perkara yang tidak baik anda lakukan, anda akan mendapat dalam kesusahan. Yang tidak bermakna, menjadi ceroboh dengan kod anda. Tetapi ia adalah untuk mengatakan, program ini tidak akan sentiasa berhenti, walaupun anda pergi ke suatu tempat anda tidak sepatutnya pergi. Satu contoh yang baik iaitu, banyak orang dalam masalah mereka menetapkan 3, yang telah 15, tidak menyemak batas lembaga. Jadi anda melihat ke kiri, memandang kepada betul, memandang ke atas, memandang ke bawah. Tetapi anda tidak menyemak untuk melihat jika atas sebenarnya akan berada di papan. Dan ramai orang yang melakukan itu dan bertukar yang dalam, program mereka bekerja dengan sempurna, kerana di mana lembaga yang disimpan dalam memori, jika anda pergi satu di atas atau diperiksa bahawa memori alamat, tidak ada apa-apa terutamanya dahsyat tentang itu, supaya program anda tidak akan menjerit pada anda. Tetapi kita masih akan berlepas mata jika anda tidak menyemak itu, kerana anda telah melakukan sesuatu yang anda tidak sepatutnya lakukan, dan anda boleh mempunyai mendapat dalam kesusahan. Kemungkinan adalah, walaupun, anda mungkin tidak. Jadi ini adalah untuk menunjukkan bahawa, ya, kita masih boleh pergi kepadanya. Dan kami tidak mendapat dalam masalah dalam kes ini. Jika kita cuba untuk berbuat membaca 100 aksara seterusnya, kita akan mungkin mendapat dalam kesusahan. Dan anda boleh membaca kod 100 seterusnya watak-watak jika anda mahu dengan melakukan beberapa jenis untuk gelung. Yeah. PELAJAR: Oleh kerana kita telah diberikan bahawa ruang yang nilai sebenar, kita tidak akan sebenarnya dapat melihat apa-apa. Sekiranya kita cuba dengan menetapkan bahawa sama dengan suka c atau sesuatu? JASON Hirschhorn: Soalan Besar. Bagaimana saya menetapkan nilai yang - apa baris kod saya menulis di atas talian tujuh melakukan apa yang anda berkata? PELAJAR: Bintang ptr sama tunggal quote c berakhir petikan tunggal. JASON Hirschhorn: Jadi yang yang meletakkan aksara, c, di lokasi itu, kerana sekali lagi, bintang yang bermakna pergi ke sana. Dan apabila digunakan di sebelah kiri pengendali tugasan, yang sama menandatangani, kita tidak akan mendapat bahawa nilai yang begitu banyak seperti yang nilai itu. Sekarang mari kita lihat apa yang berlaku. Kami meletakkan sesuatu di sana dan ia adalah di sana. Kami dipanggil percuma. Beberapa perkara mungkin berlaku pada timbunan itu. Jadi ia bukan di sana lagi. Apapun, kita tidak mendapat dalam kesusahan untuk pergi ke sana. Saya lakukan ini dalam kod untuk menggambarkan yang banyak ini soalan-soalan yang anda ada, mereka benar-benar menarik menjawab banyak masa. Dan mereka soalan benar-benar baik. Dan anda boleh memikirkan mereka keluar di anda sendiri sekiranya, sebagai contoh, kita tidak di bahagian. Yeah. PELAJAR: Oleh kerana anda tidak menghantar penunjuk mana-mana, anda perlu menggunakan malloc? JASON Hirschhorn: Jadi ini kembali kepada soalan awal anda. [? ?] Adakah ia hanya satu pemboleh ubah tempatan? Malloc sini bukanlah bahawa menarik. Penggunaan malloc di sini tidak yang menarik kerana ia hanya pembolehubah tempatan. PELAJAR: Jadi boleh anda lakukan char ptr bintang sama hello? JASON Hirschhorn: Oh. Jadi kita akan kini kembali kepada soalan awal anda. Saya rasa anda tidak berpuas hati dengan jawapan saya. OK? Seperti itu? PELAJAR: Yeah. Tunggu. JASON Hirschhorn: Dan di mana yang anda mahu untuk mencetak? Oleh itu, kita akan mencetak rentetan seperti itu? PELAJAR: Menarik. JASON Hirschhorn: Jadi ini mengatakan ini hujah mempunyai jenis watak. Jadi ini harus bersifat. PELAJAR: Hanya mengambil yang pertama. JASON Hirschhorn: Jadi ini adalah apa yang saya katakan sebelum ini. Seperti saya katakan, ia tidak menyimpan tali di dalam penunjuk berubah-ubah. Ia menyimpan - PELAJAR: Nilai pertama tali. JASON Hirschhorn: Alamat nilai pertama rentetan. Jika kita untuk mencetak ini, kami mendapat nilai di dalam penunjuk. Dan kita akan melihat ia adalah, sememangnya, alamat ingatan. Adakah ini masuk akal? Maaf. Tunggu, adakah itu menjawab anda soalan, walaupun? PELAJAR: Yeah. JASON Hirschhorn: Ini baris kod adalah mewujudkan rentetan dan yang lain penunjuk berubah-ubah itu menunjuk kepada rentetan itu, array yang. Yeah. PELAJAR: Jadi, jika kita pergi satu memori menangani lanjut, akan kita h? Adakah ia telah disimpan sebagai rentetan? JASON Hirschhorn: Seperti, kita lakukan - jadi ini adalah berharga untuk dilakukan. Ini adalah titik aritmetik, yang anda semua lihat sebelum dan harus agak selesa dengan. Ini adalah serupa dengan menulis - jika kita menulis baris ini kod, kita telah melihat pelbagai notasi sebelum ini. Ini akan memberikan kita kedua nilai dalam ini pelbagai, h. Jika kita melakukan ini, ini juga harus memberi kita nilai kedua dalam array yang. Kerana ia akan tidak kepada memori yang alamat perkara yang pertama, tetapi alamat ingatan perkara yang lebih. Dan kemudian dereferences pengendali bintang penunjuk itu. Dan sekali lagi, mari kita lihat. Kita mendapat h lagi. PELAJAR: Apa sebenarnya tidak dereference bermakna? JASON Hirschhorn: Dereference adalah perkataan mewah untuk pergi ke. Pergi ke itu dan mendapatkan apa yang ada adalah untuk dereference penunjuk. Ia hanya satu perkataan mewah untuk itu. PELAJAR: Jika kita mahu cetak keseluruhan tali tersebut, boleh kita melakukan penunjuk Ampersand? JASON Hirschhorn: OK, kita akan berhenti seketika di sini. Kami akan berakhir di sini. Ampersand memberi anda alamat yang lokasi, jadi apabila anda Ampersand daripada pembolehubah, ia memberi anda alamat di mana pembolehubah yang disimpan. Penunjuk Ampersand akan memberi anda alamat ptr mana ptr adalah dalam ingatan. Kami tidak akan pergi dengan contoh ini. Anda boleh memikirkan ini perkara sendiri. Tetapi sekali lagi, ini akan dijadikan bahan verging yang sedikit di luar apa yang anda perlu tahu untuk skop jangka pertengahan ini - atau kuiz ini, bukan. Maaf. Kami akan bergerak ke atas, kerana saya akan suka lakukan satu masalah pengekodan sebelum masa terpulang. Dan kita akan memberi kod kepada apa yang saya fikir adalah yang paling menarik ini contoh, atoi. Jadi ini adalah satu soalan mengenai kuiz dua tahun lalu. Dan saya mempunyai ke atas pesawat di sini. Orang ditanya kuiz - mereka diberi lebih sedikit tesxt dalam soalan, tetapi saya dihapuskan teks kerana ia adalah tidak perlu untuk tujuan kita sekarang. Ia hanya beberapa latar belakang kepada apa atoi lakukan. Tetapi anda semua tahu dan sangat biasa dengan atoi. Saya cadangkan anda kod ini di atas sekeping kertas. Saya juga mencadangkan anda menggunakan strategi yang bahawa kami telah pergi ke atas banyak dalam seksyen kami. Pertama, pastikan anda memahami apa atoi ini lakukan. Lukiskan gambar atau datang dengan beberapa imej mental dalam kepala anda. Seterusnya, menulis kod pseudo untuk ini. Kuiz, jika semua yang anda dapatkan adalah kod pseudo, sekurang-kurangnya anda meletakkan sesuatu ke bawah. Dan kemudian map kod pseudo yang ke C. Jika anda mempunyai cek di anda kod pseudo, seperti memeriksa jika sesuatu adalah 1, yang dipetakan jika keadaan dan sebagainya. Dan akhirnya, kod program di C. Oleh itu, pergilah kembali ke atoi dan mengambil masa lima minit kod ini di atas sekeping kertas, yang mungkin kira-kira yang jumlah masa yang anda akan mengambil masa pada kuiz untuk atoi kod. Lima hingga 15 minit, lima kepada 12, lima hingga 10 minit, kira-kira jumlah masa anda akan menghabiskan pada ini soalan dalam kuiz. Jadi mengambil masa lima minit sekarang, sila. Dan jika anda mempunyai sebarang soalan, meningkatkan tangan anda dan saya akan datang sekitar. [PERBUALAN SAMPINGAN] JASON Hirschhorn: OK, jadi yang lima minit. Itu adalah mungkin kira-kira jumlah masa anda akan menghabiskan pada bahawa pada kuiz, mungkin akhir rendah pada masa itu. Kami akan menggulung dalam sedikit. Marilah kita memulakan pengekodan ini. Dan jika kita tidak mendapat semua jalan melalui, jawapan untuk ini dan ini soalan kuiz boleh didapati, sekali lagi, Musim gugur 2011 adalah apabila soalan ini muncul di kuiz. Dan ia bernilai lapan mata kuiz kemudian. Lapan mata adalah di hujung yang tinggi jumlah yang mata sesuatu yang bernilai. Kebanyakan soalan adalah dalam julat satu hingga enam mata. Jadi ini adalah lebih mencabar soalan, pasti. Bolehkah sesiapa mendapatkan saya bermula? Secara amnya, apa yang kita akan mahu melakukan dengan ini berfungsi atoi, secara logik? Apa yang kita mahu lakukan? Jadi, kita akan menulis beberapa kod pseudo. PELAJAR: Tukar aksara kepada integer. JASON Hirschhorn: Tukar aksara kepada integer. OK. Jadi berapa banyak watak-watak yang kita akan perlu dilakukan? PELAJAR: Kesemua mereka. PELAJAR: Semua watak-watak dalam string. JASON Hirschhorn: Semua watak-watak dalam string. Jadi, jika kita mahu pergi melalui setiap watak dalam tali, apakah perkara yang dalam C yang kita lihat yang telah dibenarkan kita melalui setiap watak dalam rentetan? PELAJAR: A untuk gelung. JASON Hirschhorn: A untuk gelung. Oleh itu, kita akan melalui gelung setiap watak dalam s. Maka apa yang kita akan mahu melakukan apabila kita sesuatu yang tertentu? Katakanlah kita sudah mula meluluskan 90. Kita mendapat 9. Ia bersifat. Apa yang kita mahu lakukan dengan bahawa watak 9? PELAJAR: Tolakkan dari watak 0? PELAJAR: Tambah 0? JASON Hirschhorn: Tolakkan ia dari watak 0? PELAJAR: Yeah. JASON Hirschhorn: Mengapa anda mahu berbuat demikian? PELAJAR: [didengar] nilai. Nilai int itu. JASON Hirschhorn: OK, jadi kita mengambil watak 9, tolak daripada watak 0 untuk mendapatkan integer sebenar 9. Manis. Dan bagaimana anda tahu watak yang 9 tolak 0 watak adalah 9? Apa carta adakah anda melihat? PELAJAR: Terdapat logik sembilan tempat-tempat di antara 9 dan 0. Atau anda boleh melihat jadual ASCII. JASON Hirschhorn: Jadual ASCII. Tetapi ya, anda betul juga. Oleh itu, kita tolak 0. Jadi sekarang kita mempunyai integer 9. Dan apa yang kita mahu lakukan dengan itu? Jika kita mempunyai 90, ia integer yang pertama kita, apa yang kita mahu lakukan? PELAJAR: Saya dimasukkan ke dalam integer sementara pelbagai, kemudian melakukan matematik kepadanya kemudian untuk menjadikannya berakhir. JASON Hirschhorn: OK. PELAJAR: Anda boleh mula pada akhir array dan kemudian bergerak ke hadapan supaya bahawa setiap kali anda bergerak ke hadapan, anda kalikan dengan 10. JASON Hirschhorn: OK. Yang berbunyi seperti yang cukup idea menarik. Kita boleh mula pada akhir pelbagai kami, dan kita boleh menggunakan strleng. Kita boleh menggunakan strleng di sini. Kami akan panjang tali kami. Kami bermula pada akhir. Dan + yang pertama, kita hanya mengambil yang integer, dan mungkin kita mewujudkan seperti integer pembolehubah baru sehingga atas mana kita menyimpan segala-galanya. Oleh itu, kita gelung melalui setiap char dalam s dari belakang ke depan, kita tolak 0, dan maka kita menerimanya, dan bergantung kepada di mana ia adalah, kita kali ia oleh kuasa 10. Kerana yang pertama, apa yang kita membiak watak paling kanan oleh? PELAJAR: 10 kepada 0. JASON Hirschhorn: 10 kepada 0. Apa yang kita kali kedua watak paling kanan oleh? PELAJAR: [didengar]. JASON Hirschhorn: Apa? PELAJAR: 10 kepada 1. JASON Hirschhorn: 10 kepada 1. Watak ketiga paling kanan? PELAJAR: 10 kepada 2. JASON Hirschhorn: 10 kepada 2. PELAJAR: Maaf, saya tidak faham apa yang kami lakukan di sini. JASON Hirschhorn: OK, mari kita pergi ke belakang, maka. Oleh itu, kita akan mendapat diluluskan pada rentetan. Kerana kita menulis atoi. Oleh itu, kita mendapat lulus dalam rentetan. Katakanlah kita sudah mula berlalu dalam rentetan 90. Perkara pertama yang kita akan lakukan ialah menyediakan pembolehubah integer baru yang kami hanya akan mewujudkan sebagai integer baru kami. Itulah apa yang kita akan untuk kembali pada akhir. Kita perlu melalui setiap watak dalam tali kerana kita telah menentukan bahawa kita perlu untuk menyentuh satu sama satu dan kemudian menambah kepada integer baru kami. Tetapi kita tidak boleh hanya menambah ia sebagai nombor. Kita tidak boleh hanya mengambil 9 dan menambah 9 untuk integer kami. Ia bergantung kepada apa yang berlaku ia adalah dalam string. Kami akan perlu melipatgandakan ia oleh kuasa 10. Oleh kerana itu bagaimana 10 kerja-kerja asas. Oleh itu, kita akan mendapat sebenar watak, atau integer sebenar nombor, dengan menolak watak 0 dari watak 9 seperti yang kami lakukan dengan menolak watak modal A daripada apa sahaja watak kita telah di salah satu masalah itu. Oleh itu, kita benar-benar akan mendapat nombor dari 0 ke 9 disimpan sebagai nombor nyata, dan kita akan kalikan dengan kuasa 10 bergantung di mana kita berada dalam string. Dan kemudian kita akan menambahkan kembali ke dalam integer pembolehubah baru kami. Jadi apa ini akan kelihatan seperti akan akan - kita akan menarik di sini. Jika kita mendapat lulus dalam rentetan 90 - PELAJAR: [didengar]. JASON Hirschhorn: Tetapi atoi mengambil rentetan. Jadi, kita akan melalui pegangan. Kami akan mendapatkan diluluskan pada 90. Kami pergi dari belakang ke hadapan. Kami mengambil 0. PELAJAR: Saya minta maaf. Mungkin ini adalah bodoh. Jika kita mendapat diluluskan pada tali, mengapa 90 apa yang kita mendapat diluluskan pada? Oleh kerana 90 adalah integer. JASON Hirschhorn: Kerana atoi mengambil tali dan bertukar ke dalam integer perwakilan tali itu. Tetapi tali 90 bukan integer 90 atau nombor 90. Rentetan 90 adalah pelbagai dua, atau tiga watak, sebaliknya, 9 watak, 0, dan backslash 0 watak. Dan kita menulis atoi kerana, Sebagai contoh, apabila anda mengambil arahan hujah baris, dan ia disimpan di dalam argv, ia disimpan sebagai rentetan. Tetapi jika anda mahu merawat ia sebagai nombor, anda perlu menukarkannya kepada integer sebenar. Yang kita lakukan salah satu set masalah kita. Yang kita lakukan dalam jumlah yang set masalah kita. Semua orang yang mengambil integer sebagai hujah baris arahan. Jadi itulah sebabnya fungsi atoi kami mengambil rentetan. Jadi sekali lagi, dalam contoh kita di sini, kami akan mengambil yang terakhir. Kita akan tolak watak 0 daripadanya, kerana watak-watak 0 ditolak oleh watak 0 memberikan anda nombor sebenar 0, mengikut matematik ASCII yang kita lakukan. Oleh kerana watak-watak yang digambarkan sebagai berbeza daripada sebenar mereka - aksara, sebagai contoh, huruf kecil adalah 97. Ia bukan - oops! Ia bukan apa sahaja yang anda inginkan ia akan menjadi, 0, sebagai contoh. Jadi, anda perlu tolak watak untuk mendapatkan 0. Jadi, kita akan berbuat demikian di sini untuk mendapatkan jumlah sebenar. Dan kemudian kita akan kalikan dengan kuasa 10 bergantung di mana ia adalah dalam tali, dan kemudian mengambil yang dan menambah kepada pemegang tempat kita berubah-ubah supaya kita boleh datang dengan integer baru akhir kami. Adakah yang masuk akal untuk semua orang? Oleh itu, kita tidak akan memberi kod ini sekarang, kerana kita semakin kesuntukan masa. Saya memohon maaf kerana masa itu. Tetapi ini adalah apa, mudah-mudahan, anda akan dapat melakukan kuiz - pada kurangnya, mendapatkan kod pseudo ini ditulis keluar. Dan kemudian, jika kita menulis yang kod pseudo, sebenarnya, kita boleh melakukan ini agak cepat. Setiap baris komen kita kita menulis di sini diterjemahkan kepada kira-kira satu baris kod C. Mengisytiharkan pembolehubah baru, penulisan gelung, ada penolakan, ada darab, dan beberapa tugasan. Kita akan mungkin juga mahu menulis talian kembali. Kami juga mungkin mahu meletakkan beberapa cek di sini. Yeah. PELAJAR: Jadi boleh kita merawat s sebagai rentetan sebenar? Kerana saya tahu ia hanya alamat. Seperti, bagaimana anda akan mendapat panjang tali yang dihulurkan melalui? JASON Hirschhorn: Jadi bagaimanakah panjang tali? Strlen. PELAJAR: strlen, yeah. Tetapi anda boleh meletakkan s sebagai hujah untuk itu? JASON Hirschhorn: Jadi strlen mengambil bintang char. Dan ia mengikuti bahawa bintang char, dan ia menyimpan mengira sehingga ia sampai ke satu garis sendeng terbalik 0. strlen sebenarnya salah satu program lain yang kami telah pergi ke kod. Itu satu lagi satu yang baik untuk kod. Satu yang lebih mudah, kerana jika anda akan berfikir tentang itu konsep - Saya hanya berkata ia dengan kuat - strlen berikut penunjuk dan menyimpan berterusan dan mengira dan mengesan sehingga anda mencapai garis sendeng terbalik 0. PELAJAR: OK, faham. JASON Hirschhorn: Jadi terbaik nasib kuiz 0 esok. Jika anda mempunyai sebarang soalan, saya akan berada di luar selepas ini. Jangan ragu untuk e-mel saya. Mendekati TF anda sendiri jika anda tidak dalam seksyen saya, atau mendapatkan saya e-mel jika anda mahu ia. Jika anda ingin dimarahi oleh dan hanya menghantar saya e-mel, e-mel freakout, saya akan mengembalikan kamu, seperti, muka senyum, atau, seperti, satu jenaka atau sesuatu. Jadi berasa bebas untuk berbuat demikian juga. Nasib baik lagi, dan saya akan lihat anda semua minggu depan.