[MUSIC PLAYING] DAVID J. Malan: Ini seperti seminar mahasiswa hari ini. OKE. Jadi sangat hujan keluar. Hal ini cenderung terjadi pada hari Rabu, tapi semua lebih banyak kesempatan untuk pertanyaan hari ini. Jadi mari kita mulai benar-benar dengan film hanya dalam beberapa saat. Tapi kita akan mulai anggun seperti biasa. Ini CS50, dan ini adalah akhir minggu 4. Jadi, jika Anda pernah melihat TV atau film dimana ada beberapa ahli komputer dan polisi, atau FBI, atau lembaga sedang mencoba untuk menangkap beberapa musuh, baik, Anda sudah mungkin pernah mendengar ungkapan "meningkatkan," dimana teknisi yang entah bagaimana ajaib memperbesar jauh jauh untuk melihat penjahat identitas atau nomor plat bahkan kilau cermin atau kilatan mata seseorang. Jadi memang, mari kita lihat adegan seperti beberapa dari Hollywood. [VIDEO PLAYBACK] -OK, Sekarang mari kita lihat baik pada Anda. -Tahan. Jalankan itu kembali. -Tunggu sebentar. Belok kanan. -Ada, Membekukan itu. -Layar penuh. -OK, Membekukan itu. -Tighten Pada itu, akan Anda? -Vector Di atas yang pria dengan roda belakang. -Zoom Di sini di tempat ini. -Dengan Peralatan yang tepat, gambar bisa diperbesar dan dipertajam. -Apa itu? -Ini Merupakan program peningkatan. -Bisa Anda jelas bahwa apa pun? -Aku Tidak tahu. Mari kita meningkatkan itu. Bagian -Enhance A6. -I Ditingkatkan detail, dan-- Saya pikir ada cukup untuk meningkatkan, melepaskannya ke layar saya. -I Ditingkatkan refleksi di matanya. -Biarkan Dijalankan melalui peningkatan video. -Edgar, Dapat menyempurnakan ini? -Tahan. -aku Telah bekerja pada refleksi ini. Refleksi -seseorang itu. -Reflection. -Ada Adalah refleksi dari wajah pria itu. Refleksi -The. -Ada Refleksi. -Zoom Di atas cermin. -Anda Bisa melihat refleksi. -Bisa Menyempurnakan gambar dari sini? -Bisa Menyempurnakan dia di sini? -Bisa Menyempurnakan itu? Dapat menyempurnakan itu? -Bisa Kita meningkatkan ini? -Bisa Menyempurnakan itu? -Hold Pada kedua, saya akan meningkatkan. -Zoom Di pintu. -Times 10. -Zoom. -Pindah. -Lebih. -Tunggu, Berhenti. Stop. -Pause Itu. -Rotate Kita 75 derajat sekitar vertikal, silakan. Stop. Kembali ke bagian tersebut tentang pintu, lagi. -Got Penambah gambar yang dapat bitmap? Hei, mungkin kita bisa menggunakan Pradeep Metode Sen untuk melihat ke jendela. Software -Ini adalah keadaan seni. Eigenvalue -The dimatikan. -Dengan Kanan Kombinasi algorithm-- -Dia Diambil eliminasi algoritma ke tingkat berikutnya, dan saya dapat menggunakannya untuk meningkatkan foto ini. -Lock Dan memperbesar z-axis. -Enhance. -Enhance. -Enhance. -Freeze Dan meningkatkan. [END PLAYBACK] DAVID J. Malan: Baiklah, jadi semua orang sebenarnya kata-kata. Mereka hanya dirangkai dalam cara yang tidak benar-benar masuk akal. Dan, pada kenyataannya, CS50 dan program seperti itu cenderung merusak banyak TV dan film untuk kamu. Karena ketika orang-orang ahli komputer yang berderak dari syarat dan mengatakan hal mewah seperti vektor eigen, dan sumbu z, dan sejumlah lainnya sebenarnya istilah yang lebih teknis, mereka benar-benar hanya merangkai kata bersama-sama terlalu sering. Apakah itu salah satu harapan kami adalah bahwa, sebagai efek samping dari mengambil kursus seperti ini, akan lebih banyak orang di dunia benar-benar dapat menimbang dalam dan hanya pernah jadi sedikit mempengaruhi kualitas dan ketepatan film-film? Bahkan, mari kita lihat kenyataan. Jadi di sini adalah staf foto Maria, salah satu rekan mengajar kami. Dan kira dia dicurigai sesuatu. Namun, ada secercah beberapa bagian dari bukti di matanya, atau dalam refleksi kacamatanya. Nah, jika kita melakukan persis seperti film mengusulkan, dimana kita tampilannya dan "meningkatkan", ini adalah berapa banyak informasi adalah wajah Maria ketika Anda mengambil foto dengan resolusi asli. Dan, pada kenyataannya, Anda dapat melihat titik-titik ini. Dan ini adalah apa yang disebut piksel, P-I-X-E-L-S, yang hanya persegi biasanya yang merupakan titik yang membentuk sebuah gambar. Dan kembali pada hari, dan benar-benar bahkan hari ini dengan beberapa TV LED hari ini atau TV LCD, jika Anda punya satu di kamar Anda atau di rumah, jika Anda pergi super dekat dengan itu, dan terutama jika itu adalah TV agak tua, Anda mungkin bahkan dapat melihat titik-titik ini dan itulah yang membentuk sebuah gambar. Dan tidak ada lagi informasi dari ini. Kita bisa "meningkatkan", dalam arti smoothing hal lebih dan semacam menyimpulkan jenis, jenis apa Warna harus sebelah mata Mary sehingga tidak benar-benar begitu pixelated. Tetapi jika saya terus zoom, ada adalah orang jahat di matanya. Seperti itu adalah semua informasi yang kami miliki. Anda tidak dapat membuat Informasi dari ketiadaan. Ada hanya terbatas jumlah bit ada. Jadi pada Soal Set 4, di mana Anda memiliki kesempatan bermain dengan semacam ini dunia. Pada Soal Set 4, Anda akan menjelajahi dunia grafis, dan forensik, dan benar-benar menulis kode yang hilang pulih gambar. Anda akan menulis kode yang memanipulasi gambar yang ada dan akhirnya memahami apa terjadi di bawah tenda. Dan, ternyata, itu sebenarnya tidak semua yang rumit. Misalnya, jika kita ingin mewakili wajah tersenyum di mana dengan ini piksel hitam, atau ini titik-titik hitam, baik, kita hanya bisa mewakili mereka sebagai benar-benar bitmap. Dan jika Anda pernah mendengar bahwa ekspresi bitmap, mungkin sekarang mulai membuat akal lagi hari ini. Kita sudah tahu apa yang sedikit ini. Ini 0 atau 1. Dan peta hanya sesuatu seperti sepotong kertas yang memberikan arah dan memiliki mungkin grid x dan y-koordinat. Jadi di sini adalah bitmap. Ini peta bit dimana 1 tampaknya akan mewakili piksel putih, dan 0 akan mewakili pixel hitam. Tapi kita pasti bisa flip itu sekitar. Itu tidak terlalu penting sehingga Selama kami konsisten. Dan di sini adalah bagaimana, di dalam binary-- memori komputer, atau bahkan di dalam dari sebuah file pada hard Anda drive-- bisa Anda menyimpan yang paling sederhana dari gambar wajah tersenyum. Tapi apa yang kita, tentu saja, kurang dalam gambar ini? Warna, kan? Ini adalah langkah berikutnya yang jelas atau perangkat tambahan untuk meningkatkan ini dengan warna. Jadi sayangnya dengan hanya satu bit, 0 atau 1, kita bisa mewakili warna. Itu bisa menjadi merah, atau biru, atau hitam, atau putih, atau hijau, atau pink, atau pasang warna. Tapi untuk mudahnya, kami akan hanya berasumsi hitam dan putih. Jadi apa yang logis kita perlu jika kita ingin menerapkan warna dalam gambar? Apa yang harus kita lakukan? Seperti jika faktor pembatas sini adalah bahwa dengan satu bit Anda hanya bisa mewakili dua negara, 0 atau 1, putih atau hitam, apa yang Anda ingin lakukan? AUDIENCE: Lebih data. DAVID J. Malan: Lebih bit, ya lebih banyak data, lebih banyak bit. Dan, memang, itulah bagaimana gambar berwarna diwakili. Daripada menggunakan sedikit tunggal, 0 atau 1 untuk setiap pixel, masing-masing titik, Anda hanya menggunakan beberapa. Mungkin menggunakan 8, mungkin, lebih sering menggunakan 24, dan memang, pada Soal Set 4, akan Anda bermain dengan file Format yang menggunakan 24 bit biasanya. Tapi sebagian besar dari Anda mungkin akrab dengan JPEG. Jika Anda pernah diambil foto di ponsel Anda, atau upload atau melihat sesuatu di Facebook, Flickr atau, sejumlah website-foto berbasis, Anda sudah mungkin melihat gambar JPEG sebelumnya. Dan ternyata, ini adalah file Format kita akan gunakan dalam PSet 4, dimana Anda akan harus memulihkan gambar bahwa saya telah sengaja dihapus dari kartu memori rusak dalam kamera, jika Anda mau. Dan ternyata bahwa meskipun JPEG cukup sophisticated-- itu jauh lebih canggih dari titik-titik hitam dan putih kami melihat beberapa saat yang lalu, karena ada algoritma sebenarnya mewah yang digunakan untuk kompres JPEG, jadi Anda dapat memiliki benar-benar baik, kualitas gambar tetapi menggunakan relatif sedikit bit. Dan kami akan kembali ke kompresi sebelum lama. Ternyata bahwa yang pertama tiga byte dalam image-- JPEG tidak peduli apa yang telah Anda diambil sebuah foto of-- adalah nilai-nilai 255, 216, 255. Dengan kata lain, jika Anda hanya melihat bahwa pola bit, diwakili di sini tiga byte, atau 24 bit total, dengan probabilitas tinggi Anda dapat menyimpulkan bahwa Anda melihat itu ini pertama tiga byte dari JPEG. Dan ini adalah apa yang diketahui sebagai tanda tangan dari JPEG. Banyak format file di luar sana cenderung mulai dengan pola tertentu 0s dan 1s, sehingga Windows, dan Mac OS, dan iOS, dan Android tahu apa jenis file mereka adalah, selain yang disebut berkas ekstensi yang banyak file memiliki. Jika Anda telah .jpg, itu petunjuk lain ke komputer. Jadi mari kita sekarang melihat ini sedikit lebih teknis. Kita tahu desimal Sistem adalah 0 sampai 9. Kita tahu biner adalah 0 dan 1. Dan jika Anda berpikir kembali ke PSet 0, kami memiliki Anda bergulat dengan, untuk sedikit, sesuatu disebut heksadesimal, di mana Anda memiliki 16 digit, bukan 10 atau bukan 2. Dan orang-orang digit, dengan konvensi, adalah 0 sampai 9 dan kemudian melalui f, dimana f mewakili apa angka desimal, hanya sebagai kewarasan cepat memeriksa? Jadi, 15. Dan harus mewakili 10, hanya dengan sifat pemesanan yang saya berikan. Ini hanya sebuah konvensi sewenang-wenang, tapi itu cukup standar. Jadi jika kita melihat pola ini tiga bytes-- mari hanya mulai untuk melihat itu di secara konsisten dengan bagaimana ilmuwan komputer umumnya melihat dan berpikir tentang file. Anda pasti bisa berpikir tentang file dalam 0s, dan 1s, dan desimal, namun pada kenyataannya, kita cenderung menggunakan biner atau lebih biasanya hexadecimal-- kembali dari PSet 0. Jadi biarkan aku mengusulkan bahwa 255, 216, dan 255 hanya pola-pola 0s dan 1s. Dan Anda dapat memeriksa ini jika Anda ingin melakukan matematika dari minggu 0. Tapi, untuk saat ini, hanya berasumsi bahwa ini memang benar. Saya baru saja ditulis ulang tiga desimal nomor tiga nilai biner. Sekarang apa yang akan saya lakukan adalah hanya menambahkan beberapa ruang putih, hanya demi dibaca itu. Dan pemberitahuan, aku hanya akan untuk memindahkan hal-hal terpisah. Jadi sebelum, sesudah, sebelum, sesudah. Saya melakukan apa-apa yang menarik lainnya dari sekedar menyebarkan hal-hal begitu bahwa pemberitahuan setiap set delapan bit sekarang dua set empat bit. Hal ini berguna karena heksadesimal sangat modis karena setiap heksadesimal digit 0 melalui f, atau lebih khusus 0 sampai 15, dapat direpresentasikan dengan tepat empat bit. Dengan kata lain, dalam heksadesimal jika Anda ingin mewakili 0, itu hanya 0000, empat angka nol. Dan jika Anda ingin mewakili 15, itu 1111, yang merupakan empat bit. Dan jika Anda melakukan matematika, jika ini adalah tempat yang, ini adalah tempat 16s, yang akan memberikan you-- bukan yang akan to-- maaf, dalam biner, yang akan memberi Anda 15, yang tempat, berpasangan tempat, merangkak dan delapan tempat. Jadi biarkan aku mengusulkan bahwa yang set empat bit di sebelah kiri adalah apa yang kita akan menelepon f. Ini jumlah terbesar Anda dapat mewakili dengan empat bit. Dan kita sudah tahu dari heksadesimal, f adalah digit terbesar di heksadesimal. Kami punya f lain di sana, dua lagi di sana. Dan untuk saat ini, hanya mengambil pada iman bahwa saya telah melakukan matematika yang tepat dan yang kiri setengah dari mereka bit, 1101, adalah hal yang sama seperti d dalam heksadesimal. Dan tangan kanan, 1000, hanya 8. Dan bahwa seseorang mudah untuk melihat, kan? 8 represents-- tepat di bawah tempat delapan. Jadi kita memiliki satu di kolom delapan dan tidak ada di merangkak, berpasangan atau yang. Jadi sekarang lebih konvensional, manusia cenderung menulis digit heksadesimal seperti ini, Anda hanya squish mereka bersama-sama, dan kemudian Anda awalan mereka dengan 0x. Ini berarti apa-apa selain petunjuk visual untuk human-- sebuah di sini datang value-- heksadesimal karena mungkin tidak dinyatakan jelas. Yang mengatakan, pada akhirnya, yang pola nol dan satu, atau pola heksadesimal Angka ekuivalen bahwa Anda akan mulai mencari Soal Set 4 adalah this-- dan Masalah Set 4 spek akan berjalan Anda melalui ini lebih detail-- tapi menyadari sebagai semacam misterius sebagai ini mungkin terlihat pada pandangan pertama, Anda akan mulai melihat ini banyak. Dan pada kenyataannya, bahkan dalam GDB, yang debugger kami memperkenalkan Senin dan Dan memperkenalkan di PSet 3, akan sering menunjukkan nilai-nilai heksadesimal hanya karena mereka cenderung lebih konvensional dari desimal atau biner di dunia komputer. Sekarang mari kita menempatkan ini dalam konteks. Banyak dari Anda mungkin ingat ini gambar di sini, yang berasal dari apa? Vista, bahkan lebih awal dari itu, Windows XP melakukan debutnya ini. Jadi ini adalah pemandangan yang indah. Dan pada kenyataannya, jika Anda melihat-online-- Saya pikir itu sebuah artikel Wikipedia, dimana seseorang yang sangat luar biasa keluar menemukan lokasi ini di dunia diatur atau kameranya di justru place-- tepat dan hari ini ini terlihat like-- tapi itu persis pengaturan yang sama. Gambar ini, meskipun, adalah dalam file format yang disebut bitmap, b-m-p. Dan kita akan mengambil super sekilas apa artinya. Tapi bitmap hanyalah sebuah cara yang berbeda gambar mewakili masih menggunakan piksel di 0s dan 1s, akhirnya. Tapi sekilas cepat, memiliki tanda tangan lebih menarik pada awal file. Ini bukan hanya tiga byte, bukan ada sejumlah besar pola byte yang telah ditentukan sebelumnya makna. Misalnya, di suatu tempat di beberapa byte pertama dari gambar bitmap akan menjadi ukuran gambar, lebar gambar, ketinggian gambar, sehingga metadata berguna, jika Anda mau. Informasi yang berguna yang Photoshop atau grafis memprogram Anda menggunakan mungkin benar-benar peduli. Jadi lebih lanjut tentang ini di Soal Set 4, tapi ini hanya untuk mengatakan bahwa pada akhir hari semua format file yang Anda telah menggunakan untuk years-- file Microsoft Word, File nomor, file Excel, sejumlah format file yang mungkin memiliki beberapa ekstensi file yang dikenal hanya 0 dan 1 di bawah tenda. Dan manusia telah memutuskan apa konvensi, apa pola 0s dan 1s mewakili Word mengajukan versus file Excel, dibandingkan sejumlah format file lainnya. Jadi di PSet 4, Anda akan memiliki kesempatan untuk bermain dengan itu. Tapi apa artinya memiliki struct. Ini sebenarnya adalah Shalawat bagus sekarang ke C, yang memiliki hanya beberapa fitur tambahan yang kami belum melihat belum. Ini adalah bahasa yang cukup kecil dan salah satu fitur bagus tentang C adalah struct. Misalnya, jika Anda ingin represent-- mari mengatakan Anda ingin memiliki variabel yang merupakan mahasiswa pada beberapa program. Mungkin Anda sedang menulis kursus Program pendaftaran, atau belanja inti alat, atau sesuatu seperti itu. Apa potongan data yang terkait untuk mahasiswa yang datang ke pikiran? Seperti mahasiswa adalah diwakili dengan nilai-nilai apa? Ya? Anda memiliki nama sebagai mahasiswa. Apa lagi yang seorang mahasiswa khas memiliki? AUDIENCE: [tidak terdengar] DAVID J. Malan: Jadi, maaf. AUDIENCE: Umur. DAVID J. Malan: Sebuah usia atau ulang tahun ekuivalen, ya. Apa lagi? AUDIENCE: nomor ID? DAVID J. Malan: Jadi nomor ID, mungkin nomor telepon, mungkin asrama, atau rumah, atau perguruan tinggi, atau sesuatu seperti itu. Sejumlah potongan data yang Anda mungkin memiliki dalam daftar kontak Anda adalah apa yang mungkin mendefinisikan mahasiswa. Jadi jika kita ingin melakukan hal ini, dalam kode, kita mungkin melakukan sesuatu yang sederhana seperti ini. Kita mungkin memiliki program sehingga memiliki katakanlah, int main (void). Dan jika saya ingin mewakili mahasiswa saya mungkin harus, misalnya, string disebut nama untuk mahasiswa itu, string disebut asrama untuk mahasiswa itu, mungkin int disebut ID bagi siswa itu. Dan karena aku menggunakan tali, saya harus kembali dan memasang CS50.h. Mungkin aku akan membutuhkan stdio.h. Jadi biarkan aku Terlebih Dahulu melakukan hal-dan aku akan memanggil student.c ini untuk saat ini dan menyimpan ini. Dan sekarang saya bisa melakukan sesuatu dengan variabel-variabel ini. Dan kami hanya akan menulis bahwa sebagai komentar dalam kode semu, karena itu tidak menarik apa yang kita lakukan untuk saat ini. OK, jadi ini adalah sebuah program yang entah bagaimana menyimpan mahasiswa. Apa yang ingin saya lakukan jika saya ingin menyimpan dua siswa? Jadi insting pertama saya akan baik-baik saja, tunggu sebentar, jika saya memiliki siswa lain mengapa tidak melakukan I hanya melakukan string name 2, tali asrama 2, int ID2. Dan kami sudah melakukan pergi jalan ini sebelum dan apa solusi kami untuk apa yang tampaknya menjadi semacam copy paste hackish pekerjaan di sini? AUDIENCE: Sebuah array. DAVID J. Malan: Ya, kita bisa menggunakan array. Hak ini sangat cepat menjadi berat. Anda harus memilah dari sewenang-wenang mulai penamaan semua variabel. Dan Anda, manusia, harus tetap melacak yang berkoresponden OK name2 dengan dorm2 sesuai dengan ID2. Itu hanya menjadi berantakan. Jadi jauh lebih mudah, ingat dari beberapa minggu yang lalu, hanya harus disebut nama string dan mungkin memberi kita tiga dari mereka. Dan kemudian mungkin kita memiliki tali asrama dan memiliki tiga dari mereka, atau dengan konstan, int id dan memiliki tiga dari mereka. Tapi bahkan sekarang ini terasa sedikit ceroboh, benar. Kita bicara tentang siswa dan belum Aku benar-benar tinggal di tingkat rendah rincian implementasi. Mahasiswa adalah nama dan asrama dan ID. Mengapa saya tidak bisa hanya menyatakan variabel disebut mahasiswa dan menyebutnya s. Dan jika saya ingin siswa lain, kenapa tidak saya sebut saja t. Atau jika saya ingin seluruh sekelompok siswa, mengapa tidak melakukan saya hanya mengatakan bahwa saya memiliki seluruh kelas siswa, dan itu tiga dari mereka. Dengan kata lain, mengapa saya tidak bisa datang dengan tipe data saya sendiri, yang disebut Mahasiswa, dalam yang nama, adalah ID, adalah asrama, adalah sejumlah bidang lainnya. Dan ternyata Anda dapat melakukan hal itu. Jadi C memiliki fitur ini disebut struct. Itu fitur bahasa yang memungkinkan kita untuk melakukan hal ini. Aku akan pergi ke depan dan membuka structs.h di mana kita akan melihat Berikut definisi mahasiswa. Ternyata - dan yang satu ini bahkan sederhana daripada yang melibatkan ID beberapa saat. Jika Anda ingin datang dengan tipe data buatan sendiri, dan selain int, dan char dan mengapung dan semua orang lain ini yang ada, Anda dapat melakukannya dengan benar menulis typedef struct, kemudian beberapa kurung kurawal, dalam yang Anda daftar variabel yang ingin Anda kaitkan dengan data ini kustom baru ketik seperti nama dan asrama, dan kemudian setelah kurung kurawal Anda memberikan nama untuk tipe data baru. Jadi, misalnya, mahasiswa. Dan apa yang baik tentang ini sekarang adalah bahwa jika kita melihat kode yang sesuai, konvensi, pertama dari semua, adalah untuk menempatkan ini dalam sebuah file bernama sesuatu dot h, file header, yang kita belum mulai menggunakan diri kita terlalu banyak. Tapi kita akan memulai menggunakan sedikit sekarang. Dan apa yang bisa kita lakukan dengan ini, akhirnya, dalam beberapa baris kode adalah menyatakan hal itu tipe data, mahasiswa. Dan sekarang mari kita menggunakannya. Aku akan sekarang masuk ke file disebut structs1.c. Dan mari kita lihat sebuah beberapa karakteristik sini. Jadi hal-hal di sini adalah kebanyakan akrab, dan kami akan kembali ke apa yang tidak akrab hanya dalam beberapa saat. Hal ini tentu saja adalah termasuk saya sendiri file header, yang baru juga, kecuali untuk PSet 3 di mana, ingat, kita memiliki helpers.h. Jadi Anda mungkin ingat helpers.h #include. Mengapa meskipun saya menggunakan tanda kutip bukannya kurung siku? Ketika saya memilih di antara mereka? Hampir selalu saya tampak menggunakan tanda kurung siku. Dan kemudian, tiba-tiba pada baris enam Saya menggunakan tanda kutip ganda. Mengapa itu? Ya? AUDIENCE: [tidak terdengar] DAVID J. Malan: Itu aktual, apa? AUDIENCE: Itu di IDE Anda. DAVID J. Malan: Ya, yang ada di IDE yang sebenarnya. Dan jangan berkutat pada IDE, karena itu hanya alat yang saya gunakan. Itu di saat saya direktori, secara khusus. Jadi structs.h adalah file saya sendiri tidak dipasang di IDE, dalam sistem operasi itu sendiri, bukan itu dalam direktori saya saat ini. Jadi konvensi adalah jika Anda ingin untuk menyertakan file header Anda sendiri, Anda hanya menggunakan tanda kutip ganda. Apa yang kita sebut hal ini di baris 8, secara umum? Ini adalah apa? sesuatu #define. Ini merupakan konstanta, kan? Jika Anda ingin memiliki nilai dalam program Anda Anda menggunakan seluruh beberapa kali, itu baik konvensi untuk faktor itu, mendeklarasikan, dengan simbol hash mendefinisikan, kemudian, dengan konvensi, dalam semua huruf besar word-- meskipun tidak benar-benar diperlukan, tetapi itu konvensi manusia untuk memanfaatkan konstanta sehingga mereka melompat keluar pada Anda visually-- ruang dan maka nilai Anda ingin menjadi setara dengan nama yang konstan itu. Tidak ada titik koma, tapi Anda hanya mengikuti pola yang ada. Jadi apa yang aku lakukan di kode aktual ini. Jadi mari kita lihat program utama di sini. Sejalan 12 karena saya telah memasukkan structs.h, Saya sekarang memiliki ajaib di saya pembuangan tipe data baru. Saya tidak hanya memiliki akses ke int, dan char, dan float, dan tali, dan biru dan lain-lain. Saya sekarang memiliki akses ke tipe data siswa. Jadi sejalan 12, saya menggabungkan dua ideas-- satu tipe data kustom dan dua, menggunakan array. Dan dalam program ini jika Saya ingin benar-benar mendukung tiga siswa yang berbeda dalam program saya, saya hanya bisa mengatakan memberi saya sebuah variabel siswa disebut, yang masing-masing adalah mahasiswa jenis, yang adalah tipe data kebiasaan saya. Dan, khususnya, memberi saya tiga dari mereka dalam array saya. Jadi sekarang apa yang kita lakukan dalam program ini? Berikut ini hanya untuk loop iterasi 0-3, karena itulah apa nilai siswa adalah. Aku hanya mendorong pengguna memberi saya nama siswa. Dan kemudian sejalan 17, kami memiliki garis besar yang akrab. Kami memiliki teman lama kami GetString di sebelah kanan. Dan sepotong apa sintaks tampaknya baru, jika Anda belum pernah diprogram dalam C sebelumnya, dan tidak pernah menggunakan struct? Ya? AUDIENCE: .name The. DAVID J. Malan: .name The. Tapi ini tidak terlalu banyak lompatan, karena sekarang siswa braket i memberi Anda-i mahasiswa. Dan jika Anda ingin menyelam dalam struktur itu, Anda hanya menggunakan satu periode dan maka nama variabel dalam, atau properti dalam yang Anda ingin mendapatkan akses ke. Demikian pula kemudian, jika saya kemudian meminta pengguna, memberikan asrama siswa, Anda sama dapat menyimpan bahwa string dalam variabel asrama di dalam dari struktur siswa. Dan sekarang hal mendapatkan sedikit mewah. Dan ini akan terlihat di mungkin banyak cukup segera. Tetapi Anda akan melihat ini jauh lebih dalam PSet 4, jadi mari kita melirik sekarang. Ternyata sejalan 23 melalui 38, apa yang Anda pikir saya mungkin lakukan? Aku telah menghapus komentar untuk hari ini, tapi versi kode online untuk referensi memiliki semua komentar. Apa yang harus saya tampaknya akan melakukan? AUDIENCE: Menyimpan file dengan semua informasi bahwa pengguna masuk. DAVID J. Malan: Ya, persis, ini adalah cara baru yang kita lihat dua, Fitur lain dari C, dimana saya bisa membuat file saya sendiri. Sejauh ini, hampir setiap program Anda telah menulis adalah stateless. Begitu hal itu dilakukan berjalan, itu saja. Tidak ada memori atau ingatan itu. Tidak ada file yang disimpan. Tapi jika Anda ingin menyimpan masukan yang memiliki terjadi, seperti pada permainan atau program seperti ini, ternyata kita bisa melakukannya. Dan Anda akan melihat ini lebih di PSet 4 dan Bagian. Tapi garis ini 23 pada dasarnya menciptakan sebuah file bernama students.csv. Dan Anda mungkin telah melihat ini sebelumnya. Bahkan jika Anda tidak pernah belajar CS sebelumnya, CSV adalah variabel dipisahkan dengan koma. Ini seperti orang yang sangat miskin versi dari file Excel, yang berarti bahwa itu bisa dibuka di Excel dan di Bilangan Apple, dan memiliki baris dan kolom. Tapi itu bukan milik Format seperti Microsoft atau Apple. Itu hanya koma memisahkan nilai-nilai yang akan kita lihat sebentar lagi. Dan hanya mengambil menebak. Sejalan 23, di bagian paling akhir, argumen kedua saya untuk fungsi baru ini disebut f terbuka untuk file yang terbuka adalah w. Apa yang mungkin w menunjukkan? Ya? AUDIENCE: Ini memungkinkan Anda menulis ke file? DAVID J. Malan: Ini memungkinkan Anda menulis ke file. Jadi ada beberapa varian bahwa kita bisa pasang di sini. Tetapi jika Anda hanya ingin membaca file, yang melihat itu dan membacanya ke dalam memori, Anda hanya menggunakan kutipan tanda kutip "r". Jika Anda ingin menulis ke File, Anda menggunakan kutipan tanda kutip "w". Ada juga menambahkan dan beberapa hal-hal lain jika Anda ingin memodifikasi file yang ada. Sekarang kita akan terus melihat ini hal, maka kita akan kembali ke garis 24. NULL, ternyata, adalah nilai khusus yang dapat dikembalikan oleh fungsi-fungsi tertentu jika ada sesuatu yang SALAH jika file tidak ada, jika Anda sudah kehabisan memori, atau sekelompok kesalahan lainnya. Tapi untuk saat ini, mari kita berasumsi bahwa ini adalah pengecekan error hanya konvensional. Berikut sejalan 26, aku iterasi 0-3 atas semua siswa saya. Dan ini adalah jenis semacam dari fungsi baru, fprintf, tapi hanya mengambil menebak. Jika printf hanya cetak string diformat, apa fprintf mungkin berarti? AUDIENCE: Cetak ke file. DAVID J. Malan: Cetak string yang diformat ke file. Itulah yang tambahan f berarti adalah file yang. Dan baru pertama argumen harus variabel yang mewakili file Anda. Maka kita hanya memiliki format string yang seperti printf. Dan meskipun ini sintaks baru, ini hanya berarti pasang di nama siswa, plug-dalam asrama mahasiswa, dan kemudian dengan fclose, menutup file. Dan kemudian lastly-- ini baru dan kami akan kembali ke ini sebelum long-- aku membebaskan siswa untuk alasan yang terjadi di atas sana. Tapi kami akan kembali untuk itu sebelum long-- itu karena cara GetString adalah benar-benar bekerja di bawah tenda. Jadi mari kita lihat di sini. Jika saya ketik ls di direktori saya, melihat bahwa saya tidak memiliki file bernama students.csv, hanya tidak ada, tidak ada. Jadi jika sekarang saya mengkompilasi program ini, membuat struct-1,. / struct-1, dan aku akan pergi ke depan dan ketik Andi, yang tinggal di Berkeley di Yale. Kita akan memiliki Rob yang tinggal di Thayer hari ini. Dan mari kita datang dengan mana adalah, saya pikir, Maria adalah di Mather, jika saya ingat dengan benar. Jadi sepertinya tidak ada yang terjadi. Tetapi jika saya ketik ls sekarang, ada students.csv. Mari kita pergi ke depan dan students.csv terbuka. Ini lagi sangat format file ringan. Tapi aku hanya mengadopsi konvensi bahwa saya memiliki dua baris dan kolom sini. Kolom pertama adalah nama pertama orang. Kolom kedua adalah siswa asrama, atau perguruan tinggi, atau rumah, atau entah apa lagi. Dan sekarang aku sudah disimpan ini permanen dalam file. Sehingga tidak semua yang menarik. Tapi ini hanya batu loncatan sekarang untuk dapat bertahan informasi permanen. Jadi mari kita lihat sekarang apa lagi yang kita bisa lakukan dengan fitur ini dan lainnya. Tapi pertama, pertanyaan? Itu banyak, dan itu cepat. Tetapi Anda akan melihat banyak lebih PSet 4, juga. Ya? AUDIENCE: Apakah ada cara untuk terus menambahkan nama ke file itu? DAVID J. Malan: Pertanyaan yang bagus. Apakah ada cara untuk melanjutkan menambahkan nama ke file itu? Iya nih. Dan, pada kenyataannya, jika Anda berakhir up re-membuka file, Anda akan menggunakan kutipan tanda kutip "a" untuk append, yang hanya akan menambah baris baru, baris baru lagi dan lagi, persis. Pertanyaan bagus. Pertanyaan lain? Ya? AUDIENCE: Jika Anda berlari Program lagi sekarang, akan hal itu terus menambahkan nama ke mengajukan atau akan membuka file baru? DAVID J. Malan: Ah, pertanyaan yang bagus. Jika Anda menjalankan program lagi yang tepat sekarang, mungkin mengetik nama baru, akan hal itu menambah file atau menimpa file? Yang terakhir, karena aku tidak menggunakan modus append. Dan karena aku hanya membabi buta membuka file untuk menulis, itu hanya akan menimpa file. Jadi saya memang akan perlu lakukan adalah menambahkan, jika saya ingin benar-benar memiliki jangka panjang Database. Sekarang CSV berguna, terang, bahkan untuk seperti jika Anda writing-- dan kami akhirnya akan melihat ini kemudian di semester ketika kita menggunakan CSVs untuk tujuan lain. Jika Anda ingin menyimpan semua orang yang telah terdaftar untuk beberapa acara, atau mendaftar untuk siswa Anda kelompok, atau sesuatu seperti itu, menyimpan data dalam jenis format super nyaman. Karena secara harfiah, jika saya adalah untuk men-download file ini. Aku bisa double-- dan mari kita benar-benar mencoba ini jika saya memiliki Excel atau Nomor di sini. Aku akan klik kanan atau kontrol-klik file saya. Whoops. Klik kanan atau kontrol-klik file saya. Ayo, mouse saya tidak bekerja sama. Download-- Aku akan download semua file di sini jadi hanya jadi saya bisa ambil satu ini. Dan mari kita lihat apakah ini bekerja students.csv-- pertama kalinya Aku sudah diaktifkan. Sekarang mereka ingin melihat kontak saya. Sekarang, saya harus mendaftar. Lihat betapa mudahnya adalah dengan menggunakan CSVs? Ya, tetap up to date. OK, sekarang kita siap untuk kelas. OK, oh, apa yang baru? OK, dekat. Itu ajaib. OK, sekarang kita harus memperbarui. Dan sekarang, lupa apa mengajukan Saya awalnya dibuka, tapi apa a-- ada kita pergi. OK, jadi sekarang kita memiliki sebuah file Excel. Terima kasih. OK, jadi apa yang saya lakukan adalah bagian yang mudah. Tentu saja aku bisa pra-instal Program excel, atau Bilangan, atau apa pun. Tapi ini bagus, karena sekarang saya bisa memanipulasi data dalam format standar. Jadi sekarang mari konteks beralih ke tempat kami tinggalkan Terakhir kali, yang mulai untuk lepas landas roda pelatihan. Tapi pertama, Anda tidak lihat siang tadi ini sekali lagi terjadi di sini di Fire dan Es di Cambridge, Sitar di New Haven. Mendaftar di website CS50s secepatnya untuk bergabung siswa CS50 dan staf. Jadi kami mengambil roda pelatihan off pada Senin karena follows-- string yang telah dinyatakan di CS50s perpustakaan untuk beberapa waktu. Dan itu bagus, karena memungkinkan kita berbicara tentang variabel sebagai kata lengkap dan kalimat dan banyak lagi. Tapi ternyata string tidak ada. Itu hanya sinonim, atau alias, bahwa kita telah diciptakan untuk sesuatu yang sebenarnya sedikit lebih teknis disebut char *. Dan memang, kita melihat contoh program, Senin yang tidak berperilaku cukup seperti yang kami harapkan. Ini adalah file, membandingkan-0. Dan ingat bahwa membandingkan-0, jika Aku mengkompilasi ulang program yang Senin dan menjalankan membandingkan-0 dan ketik ibu di huruf kecil, dan ibu dalam huruf kecil lagi. Program ini bersikeras saya ketik hal yang berbeda, meskipun ibu, semua dalam huruf kecil, identik visual. Jadi apa jawaban singkat mengapa komputer berpikir dua string yang berbeda? Ya? AUDIENCE: [tidak terdengar] DAVID J. Malan: Benar. Jadi, ibu, pertama kalinya Saya ketik dalam, sedang disimpan di suatu tempat di komputer saya memori, tetapi di lokasi yang berbeda dari kedua kalinya saya ketik ibu. Sekarang tentu dapat dioptimalkan. Komputer bisa menjadi cerdas dan menyadari dua string ini, hey, mereka identik. Biar tidak berlebihan menyimpannya. Tetapi komputer tidak melakukan itu optimasi kecuali Anda memberitahu mereka untuk. Jadi, secara default, mereka hanya akan berakhir di dua tempat yang berbeda di memori. Dan untuk lebih jelas, ketika kami membandingkan dua string, pertama disebut s, kedua disebut t, apa yang secara khusus adalah saya membandingkan sini on line 13? Ya. AUDIENCE: Ini adalah tempat di memori bahwa variabel akan mengarah ke. DAVID J. Malan: Tepat, saya membandingkan tempat di memori bahwa variabel menunjuk. Jadi khusus, jika ibu berada di byte nomor 1, dan 2, dan 3, dan 4-- karena ingat backslash 0 perlu semua jalan di akhir. Dan contoh lain dari ibu, m-o-m, adalah di alamat 10, 11, 12, dan 13. Saya membandingkan 1, alamat itu, bahwa lokasi dalam memori, terhadap 10, yang merupakan jelas tidak sama. 1 tidak 10. Jadi ini bagus dalam itu cukup sederhana. Tapi itu bermasalah sejauh kita tidak bisa membandingkan string. Jadi fundamentally-- dan pada tingkat rendah ini, jika Anda ingin menerapkan program untuk membandingkan dua kata yang terpisah bahwa pengguna telah diketik di untuk kualitas, apakah mereka berbaris arang untuk char, hanya secara umum, apa yang perlu kita lakukan, ternyata? Ini tidak cukup hanya untuk melihat dua alamat. Apa yang perlu kita lakukan? Ya? AUDIENCE: Iterate melalui string [tidak terdengar]. DAVID J. Malan: Ya, mari kita iterate melalui string. Mari kita gunakan untuk loop, loop sementara, atau apa pun yang Anda paling nyaman dengan. Dan jika kita punya dua string di suatu tempat dalam memori, mari kita lihat masing-masing ini karakter pertama, kemudian masing-masing adalah kedua karakter, maka ketiga, dan keempat, dan kelima, sampai kita memukul apa nilai sentinel khusus? AUDIENCE: [tidak terdengar] DAVID J. Malan: Ya, backslash nol, di mana titik baik tali kita bisa memutuskan itu saja. Apakah kita cocok setiap karakter tunggal? Jika tidak, kembali palsu. Jika demikian, kembali benar. Dan itulah yang versi ini program bandingkan-1.c tidak. Hal ini identik dengan apa yang kita memandang Senin kecuali bahwa saya telah gotten menyingkirkan string-- kata meskipun yang tidak memiliki impact-- fungsional semua Saya lakukan sekarang adalah menghapus beberapa roda pelatihan visual, tapi untuk melihat dengan jelas bahwa s dan t adalah alamat. Dan itulah yang bintang, tanda bintang, merupakan adalah alamat, atau dikenal lebih teknis sebagai pointer. Jadi ketika saya menyatakan s pada baris 9 dan mengatakan char * s, itu tidak berarti memberikan string. Itu berarti memberi saya variabel yang tujuan dalam hidup adalah untuk menyimpan alamat. Karena Aku akan menempatkan alamat string ke dalamnya. Dan memang, GetString, menjadi jelas, tidak kembali string. Tidak kembali ibu backslash nol, per se. Apa GetString khusus dan tepat kembali? AUDIENCE: [tidak terdengar] DAVID J. Malan: Sebuah alamat, yang alamat karakter pertama di beberapa string itu telah mendapat. Dan sekarang kita melihat kata kunci khusus lagi. Dan, saya singgung ini sebelumnya. Ini akan menjadi konvensi yang baik bahwa kita akan melihat lagi dan lagi sekarang. Aku memeriksa untuk memastikan bahwa s tidak nol dan t tidak null. Karena berdasarkan saya benar-benar menyebutkan cepat sebelumnya, apa mungkin berarti jika GetString mengembalikan tidak alamat tapi N-U-L-L, yang lagi, beberapa nilai khusus? AUDIENCE: Kesalahan. DAVID J. Malan: Ini kesalahan. Ada yang salah. Dan apa yang biasanya mungkin terjadi, terutama dengan strings-- yang mungkin panjang tidak diketahui di advance-- mungkin komputer ' dari memori, mungkin Anda mengetik dalam seperti kata atau kalimat yang panjang atau disisipkan seperti esai besar ada hanya tidak cukup memori. Dan sehingga GetString tidak dapat kembali alamat seluruh hal, sehingga hanya mengembalikan apa-apa. Dan ia mengatakan kesalahan yang telah terjadi dengan kembali nilai NULL khusus. Ini alamat nol, sehingga untuk berbicara. Sekarang ternyata C dilengkapi dengan fungsi yang melakukan iterasi itu. Kami tidak harus melaksanakan ini dengan untuk loop atau while loop diri kita sendiri. Kita dapat menggunakan fungsi, disebut ringkas, aduk comp, atau tali membandingkan, yang tujuan dalam hidup adalah untuk melakukan hal itu. Anda memberikan dua pointer, dua alamat, dan itu akan pergi ke alamat tersebut dan kemudian membandingkan surat untuk surat untuk surat untuk kualitas, berhenti hanya ketika apa yang benar? Ketika intuitif harus aduk comp berhenti iterasi, hanya harus jelas? Ketika hits backslash 0 baik tali, di mana titik itu dapat memutuskan telah segalanya cocok, atau telah ada menjadi ketidaksesuaian? Jadi, jika kita menjalankan ini sekarang dan mencoba permainan kapitalisasi kecil kami, sehingga membuat membandingkan-1, ./compare-1, dan ketik ibu dalam huruf kecil kedua kali. Sekarang hal yang sama. Dan jika saya melakukannya lagi dengan huruf kecil dan kemudian mungkin huruf besar. Sekarang memang membedakan antara atas dan huruf kecil. Jadi tidak semua yang keras atau ajaib, tetapi sekarang menjelaskan apa yang terjadi di bawah tenda. Jadi apa lagi yang bisa kita ekstrak dari jenis pelajaran? Jadi mari kita lihat ini. Aku akan pergi ke depan dan menulis Program cepat di sini disebut copy-0. Dan sekarang mari kita pergi ke depan dan benar-benar mari kita lakukan this-- dengan copy-0, lihatlah apa yang aku punya di sini. Saya pertama kali memberitahu pengguna, mengatakan sesuatu. Kemudian saya mendapatkan sebuah string dan saya disimpan dalam s. Lalu aku memeriksa apakah s sama sama NULL, hanya kembali 1. Jadi ini hanya standar pengecekan error. Tidak ada yang menarik yang terjadi. Dan pada kenyataannya, jika kita menyingkirkan kesalahan memeriksa, ini tampak seperti minggu 1 kode saat ini. Tapi aku sudah mulai mendapatkan sedikit lebih baik tentang itu. Sekarang sejalan 16, seminggu yang lalu, mungkin bahkan beberapa hari atau menit yang lalu, Anda mungkin mengatakan garis 16 adalah menciptakan sebuah variabel yang disebut t dan menyalin s ke dalamnya. Dan itu sempurna takeaway wajar. Tapi lebih tepat sekarang. Apa yang terjadi di jalur 16? Apa yang mendapatkan disalin dari kanan ke kiri? Ya? AUDIENCE: Apakah t mendapatkan alamat s? DAVID J. Malan: Tepat, t adalah mendapatkan alamat s. Jadi harus jelas sekarang, jika saya pergi kembali ke contoh sebelumnya dan aku menarik keluar hal yang saya mengetik di. Dan apa yang saya mengetik in-- inilah s, dan di sini adalah apa yang saya mengetik di suatu tempat di memori, ibu dan kemudian garis miring terbalik 0 yang ditambahkan untuk saya. Apa yang saya disimpan dalam sini, mengingat, ini di lokasi 1, 2, 3, 4, ini apa yang saat ini di s. Jadi jika pada baris 16, saya mengatakan memberi saya variabel disebut t dan toko lain in di nilai s, apa akan disimpan di sini tidak akan mom melainkan hanya nomor 1. Jadi jika kita melihat ke depan dalam program ini sekarang, apa yang akan terjadi? Jadi melihat bahwa ada fungsi ini Anda mungkin telah menggunakan ini beberapa waktu lalu untuk Caesar, atau Vigenere, atau mungkin tidak sama sekali. Saya mengklaim dengan printf saya, saya akan memanfaatkan t copy. Di baris pertama 19, kewarasan cepat periksa, pemeriksaan strlen panjang t. Karena saya tidak ingin mencoba untuk memanfaatkan sesuatu jika tidak ada tali ada. Jika pengguna hanya tekan Enter, tidak ada yang memanfaatkan. Jadi saya tidak ingin melakukan line 21. Jadi line 21 adalah memanfaatkan yang surat, tampaknya, di t? AUDIENCE: m? DAVID J. Malan: Kelihatannya seperti itu menyalin yang mana? AUDIENCE: m. DAVID J. Malan: Uh, m. OK, jadi m pertama, karena pemberitahuan bahwa aku lewat untuk toupper, yang jika Anda belum pernah melihatnya itu hanya fungsi untuk memanfaatkan sebagai input. t braket nol berarti memberikan saya nol karakter t. Dan bagaimana ini perubahan gambar, harus jelas? Apa yang perlu mendapatkan ditulis ulang atau diubah sehubungan dengan s dan t dan ibu nol backslash. AUDIENCE: [tidak terdengar] DAVID J. Malan: Ya, jadi yang satu ini di sini hanya kebutuhan untuk bisa berubah to-- memperbaiki this-- perlu mendapatkan berubah ke m modal. Tapi sekarang, melihat nanti di Program, jika saya mencetak s dan t seperti yang saya membersihkan sini, menonton apa akan terjadi mencetak dan t. Jadi membuat copy-0, ./copy-0. Biarkan aku pergi ke depan dan ketik di ibu dalam semua huruf kecil. Perhatikan baik asli dan copy telah dikapitalisasi. Mengapa? Nah, s dan t keduanya menunjuk ke, jika Anda mau, potongan memori yang sama. Dan terus terang, ini semakin benar-benar uninteresting-- fakta bahwa kita menggunakan alamat nol di sini. Maksudku, aku tidak benar-benar peduli di mana hal ini dalam memori. Maaf saya menghapus sedikit terlalu banyak. Tapi aku tidak benar-benar peduli di mana hal-hal yang di memori. Dan, memang apa programmer cenderung berpikir tentang adalah bahwa ketika Anda berbicara tentang alamat, atau pointer, siapa yang peduli di mana itu dalam memori. Saya tidak peduli apakah itu di byte satu atau satu miliar. Aku hanya peduli bahwa ini variabel secara efektif menunjuk bahwa sepotong memori. Dan, selanjutnya, daripada berdalih lebih alamat memori yang sewenang-wenang, mari kita hanya mulai menggambar pointer sebagai pointer, seperti panah. Jadi apa s dan t benar-benar, sesuai dengan program ini, karena bagaimana saya membuat t, itu hanya dua variabel yang terpisah menunjuk pada sepotong memori yang sama. Dan kita tidak peduli di mana mereka berada. Jadi kita bisa abstrak pergi detail yang. Jadi bagaimana cara mengatasinya? Jika saya ingin menulis versi salinan program yang benar-benar salinan string dan mengkapitalisasi hanya copy, hanya intuitif, apa yang harus menjadi bahan untuk solusi kami? AUDIENCE: [tidak terdengar] DAVID J. Malan: Kami membutuhkan apa? AUDIENCE: Chunk memori. DAVID J. Malan: Kita perlu potongan lain dari memori, kan? Kita tidak tahu bagaimana melakukannya belum, tentu. Tapi aku agak mau ini terjadi begitu bahwa ibu asli dalam huruf kecil berakhir dalam potongan tambahan memori. Dan kemudian ketika saya mengubah salin, saya tidak ingin mengubah salinan ini di sini. Saya bukannya ingin mengubah hanya ini copy sehingga aslinya tidak berubah. Jadi, mari kita lihat bagaimana kita bisa melakukan ini. Dalam copy-1, yang telah dilucuti dari komentar, tetapi berkomentar online. Kami bukannya melakukan following-- ini baris identik, mendapatkan saya string dan menyebutnya s. Tapi sekarang mari kita lihat di salah satu yang paling kami kompleks tetapi yang terakhir dari kompleksitas untuk sementara, garis 16 tidak tepat ini. Jadi jika Anda nyaman dengan gambar kita hanya drew-- memberi saya sepotong baru memori, menyalin semua ke dalamnya, mari kita lihat bagaimana kita menerjemahkan bahwa untuk kode. Jadi baris 16, di sisi kiri, char * t memberi saya kotak ini di sini. Itu semua hal ini. Di sisi kanan, m alloc, atau malloc, adalah alokasi memori, super mewah, cara samar hanya mengatakan memberi saya sepotong memori. Berapa banyak memori yang kita butuhkan? Nah, adalah jenis ekspresi besar. Tapi mari kita lihat apa yang dikatakan di sini. Jadi ini, tentu saja, adalah memberikan saya panjang string s. Jadi, ibu harus apa? Jadi hanya tiga, kan? Ibu tiga karakter. Anda tidak menghitung backslash nol ketika Anda berbicara tentang panjang string itu sebenarnya huruf terlihat manusia. Jadi ibu, jadi ini memberi saya 3. Tapi tunggu dulu, saya sekarang menambahkan 1. Mengapa saya benar-benar ingin mengalokasikan 4 byte dan bukan hanya 3? Ya? AUDIENCE: Untuk nilai sentinel? DAVID J. Malan: Tepat, untuk itu nilai sentinel. Untuk backslash nol, Aku butuh 4 total byte. Jadi saya perlu panjang dari string ditambah 1. Dan kemudian hanya untuk measure-- baik meskipun pada sistem ini, itu selalu akan menjadi 1-- saya katakan kalikan ini dengan ukuran char. Ternyata sizeof adalah operator di C yang hanya memberitahu Anda jumlah byte yang diperlukan untuk tipe data tertentu. Ini tidak bekerja untuk array, biasanya, kadang-kadang tidak. Tapi dalam kasus umum, tidak ada. Tapi itu akan memberitahu saya berapa banyak byte yang char, yang ternyata selalu 1. Jadi ini seperti mengalikan dengan 1. Jadi super samar mencari baris kode. Tapi semua hal ini adalah memberi saya sepotong memori. Tapi apakah itu tampaknya akan menyalin sesuatu ke memori itu? Belum. Dan jadi apa yang saya on line 22, dan 23, 24, 25, juga, saya hanya melakukan ini. Dan ini adalah semacam hal sekolah tua sekarang. Ini seperti PSet 2, di mana Anda hanya memindahkan barang di dalam memori, atau lebih tepatnya di string. Jadi aku iterasi dari 0 ke panjang string s. Dan aku menyalin ke-i karakter di s ke-i karakter di t. Dan karena saya, programmer, membuat Pastikan untuk mengalokasikan persis seperti banyak byte seperti yang saya butuhkan, itu sempurna satu-ke-satu hubungan. Dan saya copy ibu di huruf kecil ke yang baru. Dan kemudian terakhir, saya lakukan baris ini. Dan efeknya hanya untuk memanfaatkan t ini di sini. Jadi banyak untuk menyerap, tapi jika Anda hanya mempertimbangkan apa yang sebenarnya terjadi di bawah tenda hanya bergerak ini byte sekitar, semua yang diperlukan untuk memecahkan masalah ini adalah hanya untuk memberi kita potongan ini memori. Sekarang di risiko luar biasa, saya menunjukkan salah satu contoh lain yang hampir identik, kecuali untuk yang satu ini baris kode. Jadi ini adalah versi hacker program ini, jika Anda mau. Tapi mari kita menyaring menjadi apa yang terjadi. Baris 24 digunakan untuk menjadi t ini braket saya mendapat s braket i. Sekarang, aku mengubah ini untuk t star jauh lebih samar ditambah 1 sama dengan star s ditambah 1. Jadi apa yang terjadi dan mengapa kita memiliki karakter bintang? Kami telah melihat bintang sebelumnya, dan itu digunakan berbeda di sini. Sebelumnya kita melihat char *, sekarang aku melihat sebuah bintang di awal, dan itu OK. Karena ternyata kami jenis dapat menyimpulkan hanya dari dari orang-orang pertama prinsip apa yang terjadi. Jadi hanya harus jelas, apa yang s? Pekan lalu, itu string. Itu tidak cukup lagi. Apa s, khususnya? AUDIENCE: [tidak terdengar] DAVID J. Malan: Ini pointer. Ini alamat karakter pertama kita mengetik di. OK, apa yang t? AUDIENCE: [tidak terdengar] DAVID J. Malan: The alamat byte pertama di t, bahwa sepotong memori dialokasikan kembali. Jadi ternyata bahwa ketika kita iterate dari 0 pada hingga string length-- pertama-tama, saya dimulai pada 0, karena sekolah tua ini untuk loop hal. Jadi hanya untuk kesederhanaan, mari kita berasumsi bahwa baris pertama kode benar-benar hanya ini, benar. Jika saya adalah nol, menambahkan nol untuk sesuatu yang mungkin tidak akan memiliki efek. Jadi apa kata ini? Ternyata bahwa bintang operator dalam konteks ini adalah dereference operator, yang hanya cara mewah mengatakan pergi ke alamat berikut. Jadi jika s adalah alamat pertama karakter dalam potongan ini memori, * s cara pergi ke sana. Dan karena kita sudah ditarik gambar dengan cara ini, Anda dapat mengadopsi berikut model mental. Jika ini adalah s, dan Anda katakan * s, * s jenis seperti peluncuran dan tangga, jika Anda ingat permainan dari masa kanak-kanak, seperti mengikuti panah itu dan pergi ke alamat. * t adalah hal yang sama. Jadi mulai di sini, pergi ke potongan nya. Aku tidak bisa hanya menarik layar ini dengan cara itu. * t berarti untuk pergi di sini. Dan kemudian, untuk loop hanya mengatakan memindahkan karakter ini di sini, memindahkan karakter ini di sini, memindahkan karakter ini di sini. Tapi bagaimana saya melakukannya incrementation itu? Aku harus membatalkan apa yang aku hanya dihapus. Ini adalah apa yang umumnya disebut pointer aritmatika, yang berarti matematika dengan alamat. Jika, dalam hal ini untuk loop, Aku terus incrementing i, dan s adalah alamat dan t adalah alamat, jika saya hanya terus menambahkan 1, itu hanya berarti terus bergerak maju, dan maju, dan maju dalam memori. Ini seperti Oxford Street, yang jalan bahwa bangunan CS aktif. Bangunan CS di 33 Oxford Street. Jadi jika anda melakukannya 33 Oxford Street ditambah 1, yang membawa Anda ke 34 Oxford Jalan, kemudian 35 Oxford Street, kemudian 36 Oxford Street, apa pun mereka bangunan sebenarnya - jika mereka ada. Dan, itu semua kita lakukan di sini dengan pointer aritmetika. Jadi itu adalah cara super misterius mengekspresikan diri kita sendiri. Tapi semua itu terjadi di bawah tenda hanya mengikuti alamat ini, seperti berikut peta, jika Anda mau, atau mengikuti panah seperti kami telah ditarik pada layar. OK, banyak untuk dicerna. Setiap pertanyaan tentang sintaks, konsep, pointer, malloc, atau sejenisnya. Ya, di sini pertama. AUDIENCE: Jadi mana yang kata * t * t sama toupper, adalah bahwa akan memanfaatkan semua surat atau hanya-- DAVID J. Malan: Ah, Pertanyaan benar-benar baik. Jadi di baris ini di sini, 31, apakah ini akan memanfaatkan huruf pertama atau semua huruf. Jadi mari kita menjawab bahwa dengan pergi kembali ke prinsip-prinsip pertama. Dan prinsip-prinsip pertama di sini saya maksud hanya pergi ke definisi dasar dari apa yang terlibat. Jadi toupper ini fungsi yang mengkapitalisasi char. Itu saja. * t berarti pergi ke first-- pergi ke alamat di t. Jadi, dalam gambar, jika ini adalah potongan yang memori kita dialokasikan dengan malloc, dan ini adalah t, * t berarti pergi di sini. Sementara itu, Anda melewati bahwa nilai, huruf kecil m untuk toupper, Anda mendapatkan kembali Modal M, di mana Anda meletakkan? Anda memasukkannya dalam lokasi yang sama. Dan dengan itu logika mereka definisi dasar itu hanya memanfaatkan huruf pertama kecuali jika Anda iterate dengan saya atau untuk loop atau saat loop, itu tidak akan untuk melakukan sesuatu yang lebih dari yang Anda minta itu. Pertanyaan bagus. Ya? AUDIENCE: Mengapa Anda menggunakan dereference metode daripada array? DAVID J. Malan: Ah, pertanyaan yang bagus. Mengapa Anda menggunakan dereference Metode bukan metode array yang? Tidak ada alasan khusus, jujur. Dan, pada kenyataannya, untuk ini jenis contoh, tepat, Aku hanya berdebat membuat program yang lebih rumit, lebih mata kaca lebih, orang memeriksa karena ini terlihat super misterius, tapi meskipun itu melakukan hal yang sama. Dan, terus terang, ini adalah solusi tidak perlu visual yang kompleks untuk masalah ini. Ini masih desain yang baik, lima dari lima untuk desain, apakah itu di braket notasi atau notasi pointer. Tapi-- terutama ketika kita mendapatkan kemudian di kursus di PSet 5 ketika kita menerapkan kamus bahwa Saya telah menyebutkan beberapa times-- kita akan benar-benar peduli tentang alamat memori tingkat rendah bahwa kita benar-benar memahami apa yang sedang terjadi. Tapi, untuk saat ini, ternyata ini baris kode kurung sini persegi tidak benar-benar ada. Mereka adalah apa yang disebut sintaksis gula, yang adalah cara ganjil dingin mengatakan compiler mengubah kurung menjadi ekspresi matematika. Jadi itu adalah konvensi manusia untuk dapat hanya menulis kurung sangat user-friendly ini. Tapi apa compiler, dentang, benar-benar melakukan setiap saat Anda menulis apa yang disorot sejalan 24, di bawah tenda itu benar-benar mengubahnya menjadi ini. Itu hanya lebih menyenangkan sebagai manusia membaca dan menulis kode seperti garis 24. Tapi akhirnya mereka roda pelatihan juga datang dari ketika kenyamanan sendiri semakin kuat. Baiklah, jadi ingat kemudian bahwa ini adalah semacam masalah terbesar kami berlari ke dalam. Dan itulah yang memicu seluruh ini sialan percakapan tentang pointer, dan alamat, dan hal menyalin. Itu karena kita tersandung bodoh, masalah ini bodoh, dimana Saya menerapkan logically-- dengan Lauren di sini di demo dan jus jeruk di milk-- sempurna Fungsi algorithmically benar untuk swapping dua variabel ' nilai-nilai, tapi sialan tidak memiliki persisten, atau permanen, efek pada kode saya. Dan mengapa itu? Singkatnya, mengapa ini implementasi swap logis benar, tetapi tidak memiliki dampak pada variabel yang dilewati, seperti x dan y untuk utama? Apa inti dari masalah ini? Ya? AUDIENCE: Karena variabel dibuat salinan variabel di pass melalui fungsi. DAVID J. Malan: Tepat, ketika Anda melewati variabel ke dalam fungsi, atau argumen ke fungsi, mereka melewati copy, yang berarti Anda mendapatkan identik mencari Pola bit untuk kedua x dan y, disebut di sini a dan b. Dan Anda dapat melakukan apapun Anda ingin dengan mereka salinan, tapi mereka akan memiliki efek pada fungsi panggilan. Dan, pada kenyataannya, kita menarik bahwa gambar pada layar, ingat terakhir kali, dimana jika Anda benar-benar berpikir tentang apa yang terjadi di bawah hood-- jika ini adalah memori komputer Anda, dan di sini adalah sepotong memori yang digunakan untuk utama, ini adalah sepotong memori yang digunakan untuk swap, dan bahkan jika utama memiliki dua variabel, x dan y, Swap mungkin identik mencari nilai-nilai, yang keduanya 1 dan 2, tapi mereka benar-benar potongan yang berbeda dari memori. Jadi kita perlu solusi untuk ini. Dan terus terang, akan terlihat bahwa kita sekarang memiliki solusi untuk masalah ini, benar. Jika kita sekarang memiliki kemampuan untuk memanipulasi hal dengan cara alamat dan, semacam peluncuran dan tangga gaya, ikuti panah ini dan pergi ke mana pun kita ingin dalam memori, tidak bisa kita memecahkan masalah ini dengan lewat dari utama untuk swap bukan nilai-nilai yang ingin kita swap, tetapi hanya secara intuitif apa yang bisa kita lulus untuk swap bukan? [Interposing SUARA] DAVID J. Malan: Mengapa tidak kita hanya lulus alamat, kan? Mengapa kita tidak memberikan swap peta harta karun, jika Anda mau, yang mengarah ke nilai yang sebenarnya x dan y. Mari kita swap, benar-benar mengubah mereka bit asli, bukan hanya lewat salinan bit. Dan, pada kenyataannya, itulah yang akan menjadi solusi. Versi ini di sini adalah jelas buruk dan cacat. Dan sekarang, pada pandangan pertama, itu hanya tampak seperti kita menambahkan sekelompok bintang secara acak dan menyeberangi jari-jari kita bahwa itu akan mengkompilasi. Tapi, sekarang akan mengkompilasi. Tapi mari kita lihat apa hal ini berarti. Dan, sayangnya, penulis C bisa memilih simbol lain untuk membuat ini sedikit jelas, namun operator Bintang memiliki arti yang berbeda dalam dua konteks yang berbeda. Dan kami telah melihat keduanya, tapi mari kita membedakan. Jadi di atas sana, ketika saya telah berubah dan b dari yang int dalam buruk Versi ke int bintang, a dan b, sebelumnya, yang bilangan bulat. Apa a dan b sekarang di baik, versi hijau? Mereka alamat. Alamat apa, menjadi jelas? Alamat bilangan bulat. Jadi fakta bahwa aku mengatakan int bintang sarana ini adalah alamat integer, khusus. Jadi sekarang melihat di baris kode, sesuatu yang lain telah berubah juga. tmp tetap sama, karena itu hanya integer sementara, ada memori sihir di sana. Tapi sekarang membutuhkan sebuah bintang. Dan, pada kenyataannya, setiap menyebutkan lainnya dari a dan b, melihat bahwa semua itu berubah dari merah ke hijau adalah bahwa aku awalan variabel dengan bintang-bintang. Karena saya tidak ingin menyalin dan b. Karena jika saya hanya menyalin a dan b dan pertukaran a dan b, apa yang saya benar-benar swapping? Hanya alamat, saya ingin menukar apa yang di alamat tersebut. Aku ingin pergi ke sana. Dan operator Bintang dalam fungsi saya, tidak dalam daftar parameter, berarti Anda pergi ke alamat tersebut dan benar-benar mengubah nilai-nilai. Jadi, apa gambar sekarang terlihat seperti bukan. Nah, jika bukan aku melewati dalam untuk dan b tidak 1 dan 2-- Aku benar-benar perlu menambahkan satu definisi lain di sini. Jadi misalkan potongan ini memori di lokasi 10. Ini adalah di lokasi 11, tapi ini adalah sedikit penyederhanaan, Saya sekarang memiliki dua pilihan apakah saya lulus x dan y atau apakah saya lulus alamat mereka? Jika saya lulus alamat mereka seperti ini, saya hanya sekarang perlu untuk mengimplementasikan Swap per kode hijau sehingga ketika melihat dan ketika dilihatnya b, itu tidak hanya menyalin dan b dan memindahkan susu dan jus jeruk. Susu dan jus jeruk metafora sekarang rusak, karena mereka adalah cangkir peta cair dan tidak. Kami bukannya harus pergi untuk mengatasi 10 dan kami harus pergi untuk mengatasi 11, dan kemudian melakukan bahwa logika swapping. Jadi logika adalah sama, tetapi kita perlu cara yang sedikit berbeda mengakses variabel tersebut. Dan pada akhirnya, apa yang Program harus terlihat seperti ini ini. Dalam swap.c harfiah disalin dan disisipkan versi hijau. Tapi saya perlu membuat satu perubahan. Ini tidak cukup hanya untuk mengubah swap. Apa baris lain dari kode apakah saya perlu mengubah? Ya? AUDIENCE: Dimana dibutuhkan argumen. DAVID J. Malan: Dimana dibutuhkan argumen. Jadi jika saya gulir ke utama, saya tidak bisa hanya lulus dalam x dan y, dan, aku janji, yang terakhir sepotong sintaks baru hari ini. Saya harus lulus dalam tidak x dan y tapi alamat x dan y. Dan ternyata, simbol bahwa penulis C memilih adalah jika Anda menggunakan ampersand sini, tidak bingung dengan ampersand bitwise, jika Anda menggunakan ampersand di sini dan ampersand sini, ini angka keluar untuk Anda, apa alamat x, mungkin itu 10, apa alamat y, mungkin itu 11, dan melewati mereka di sebaliknya. Jadi banyak untuk menyerap sekaligus. Tapi mari kita lihat sekarang cepat di kami sisa empat menit di mana hal bisa salah. Dan sebagai samping, sebenarnya Saya mengambil gambar ini, TF mengambil gambar ini satu atau dua tahun lalu. Jadi ini adalah sudut belakang dari Eliot Dining Hall. Pointer mungkin adalah yang paling sulit topik yang kita bahas di CS50. Jadi jika Anda khawatir semacam itu lereng seperti mungkin itu lebih dari tongkat hoki seperti ini, menyadari kita jenis mendekati puncaknya pada hal kompleksitas konseptual. Dan aku membawa ini foto, karena aku bersumpah untuk tuhan, pada musim gugur tahun 1996, ketika saya mengambil CS50 dengan mengajar sesama, Nishat Mehta, dia menyuruhku duduk di sudut Eliot D. Hall makan siang, atau makan malam, atau sesuatu untuk mencoba untuk membantu saya memahami pointer. Dan ini adalah di mana saya minggu setelah diperkenalkan di kuliah saat Saya akhirnya mengerti pointer. Dan aku berharap bahwa ini akan klik jauh lebih cepat untuk Anda. Tapi menyadari hal ini benar-benar di antara topik yang lebih canggih kita telah melihat. Tapi itu salah satu yang paling kuat. Dan ketika Anda mendapatkannya, itu benar-benar semua hanya akan akhirnya datang bersama-sama. Jadi yakinlah itu tidak perlu semua tenggelam di hari ini. Jadi, inilah program terakhir kita akan melihat. Dan kita akan berakhir dengan cepat tiga menit claymation dibuat oleh teman kita, Nick Parlante. Berikut program, yang pada dua atas garis menyatakan sebuah variabel x dan y. Keduanya merupakan alamat bilangan bulat, AKA pointer. Kami kemudian mengalokasikan cukup memori untuk menyimpan sebuah int dan menyimpan alamat itu memori di x. Jadi, itu bahkan lebih sederhana dari contoh sebelumnya. Beri aku empat byte memori, itu ukuran sebuah int, dan memasukkan alamat yang di x. Baris ini di sini berarti pergi ke alamat di x dan menempatkan arti hidup, jumlah 42 ada. Tapi garis ini membuatku khawatir. Membintangi y berarti pergi ke alamat di y, dan menempatkan beruntung nomor 13 ada. Mengapa berbahaya, pada saat ini di story-- meskipun cepat mengatakan di menit memudarnya kami sini-mengapa itu buruk bagi saya untuk mengatakan, pergi ke alamat di y? AUDIENCE: Anda belum [tidak terdengar]. DAVID J. Malan: Saya belum memasukkan apa pun di y. Jadi apa adalah nilai y, pada saat ini dalam cerita? Kami tidak tahu. Ini beberapa nilai sampah dan juga tidak Binky tahu. Jika kita bisa berakhir pada catatan ini. [VIDEO PLAYBACK] Hei, Binky, bangun. Sudah waktunya untuk pointer menyenangkan. -Apa itu? Belajar tentang pointer? Oh, goody. -Nah, Untuk memulai, saya kira kami akan membutuhkan beberapa petunjuk. -OKE. Kode ini mengalokasikan dua pointer yang dapat menunjukkan bilangan bulat. -OK, Baik saya melihat dua pointer, tetapi mereka tampaknya tidak menjadi menunjuk ke sesuatu. -Betul. Awalnya pointer tidak menunjuk ke apapun. Hal-hal yang mereka menunjuk ke yang disebut pointees dan pengaturan mereka adalah langkah yang terpisah. Oh, benar, benar. Aku tahu itu. The pointees terpisah. Jadi bagaimana Anda mengalokasikan pointee sebuah? -OK, Baik ini kode mengalokasikan sebuah pointee bilangan bulat baru, dan ini bagian set x untuk menunjuk ke itu. Hei, yang terlihat lebih baik. Jadi membuatnya melakukan sesuatu. -OK, Aku akan dereference pointer x untuk menyimpan nomor 42 ke pointee nya. Untuk trik ini, saya harus saya tongkat ajaib dari dereferencing. -Anda Tongkat sihir dari dereferencing? Eh, itu, itu hebat. -Ini Adalah apa kode terlihat seperti. Aku hanya akan mengatur nomor dan-- [POP SUARA] Hei, lihat ada kelanjutannya. Jadi, melakukan dereference pada x berikut panah untuk mengakses pointee nya. Dalam hal ini, untuk menyimpan 42 di sana. Hei, coba gunakan untuk menyimpan nomor 13 melalui pointer lain, y. -OKE. Aku akan pergi ke sini untuk y, dan mendapatkan nomor 13 set up. Dan kemudian mengambil tongkat dereferencing dan hanya-- [BUZZER SUARA] Oh, hey itu tidak berhasil. Mengatakan, uh, Binky, saya tidak berpikir dereferencing y adalah ide yang baik, karena pengaturan up pointee merupakan langkah terpisah. Dan saya tidak berpikir kita pernah melakukannya. -Hmm, Titik yang baik. Yeah, kami mengalokasikan pointer, y, tapi kita tidak pernah mengaturnya untuk menunjuk ke sebuah pointee. -Hmm, Sangat jeli. Hei, Anda sedang mencari yang baik di sana, Binky. Anda dapat memperbaikinya sehingga y poin ke pointee sama x. -Tentu, Saya menggunakan tongkat sihir saya pointer tugas. -adalah Yang akan menjadi masalah, seperti sebelumnya? -Tidak, Ini tidak menyentuh pointees. Hanya mengubah satu pointer untuk menunjuk ke sama thing-- [Popping SUARA] --as lain. -Oh begitu. Sekarang y poin ke tempat yang sama seperti x. Jadi, tunggu, sekarang y adalah tetap. Memiliki pointee a. Jadi Anda dapat mencoba tongkat dereferencing lagi untuk mengirim 13 lebih. Oh, OK, here goes. Hei, lihat itu. Sekarang dereferencing bekerja pada y. Dan karena pointer berbagi bahwa salah satu pointee, mereka berdua melihat 13. Yeah, berbagi, eh, apa pun. Jadi, kita akan beralih tempat sekarang? Oh, melihat kami dari waktu ke waktu. -But-- -Hanya Ingat tiga aturan pointer. Nomor 1, struktur dasar adalah bahwa Anda memiliki pointer, dan menunjuk ke sebuah pointee. Tapi pointer dan pointee terpisah. Dan kesalahan umum adalah untuk mengatur pointer tapi lupa untuk memberikan pointee a. Nomor 2, pointer dereferencing dimulai pada pointer dan mengikuti panah yang lebih untuk mengakses pointee nya. Seperti kita semua tahu, ini hanya bekerja jika ada adalah pointee, yang jenis akan kembali untuk memerintah nomor 1. Nomor 3, pointer tugas mengambil satu pointer dan perubahan itu untuk menunjuk ke pointee sama seperti pointer lain. Jadi setelah penugasan, dua pointer akan menunjuk ke pointee yang sama, kadang-kadang disebut berbagi. Dan itu semua ada untuk itu, benar-benar. Bye-bye sekarang. [END PLAYBACK] DAVID J. Malan: Itu saja untuk CS50. Berkat Profesor Nick Parlante. Kita akan melihat Anda minggu depan. [MUSIK ELEKTRONIK PLAYING]