[Powered by Google Translate] [Walkthrough - Masalah Set 4]
[Zamyla Chan - Universiti Harvard]
[Ini adalah CS50. - CS50.TV]
Semua hak. Hello, semua orang, dan mengalu-alukan kepada 4 Walkthrough.
>> Hari ini pset kami adalah Forensik.
Forensik adalah pset benar-benar menyeronokkan yang melibatkan berurusan dengan fail bitmap
untuk mencari yang melakukan jenayah.
Kemudian kita pergi untuk mengubah saiz beberapa fail bitmap,
maka kita juga akan berurusan dengan sebahagian benar-benar menyeronokkan dipanggil pulihkan,
di mana kita pada dasarnya menyerahkan kad memori
di mana seseorang telah sengaja dihapuskan semua fail mereka,
dan kita diminta untuk mendapatkan kembali fail-fail.
>> Tetapi pertama, sebelum kita masuk ke dalam pset itu, saya benar-benar hanya mahu mengucapkan tahniah kepada semua.
Kami kira-kira pada titik tengah kursus ini.
Kuiz 0 adalah di belakang kita, dan kita berada di pset4, jadi pada dasarnya, kita berada di tengah-tengah.
Kami telah datang jauh jika anda melihat kembali kepada psets anda, pset0 dan pset1,
maka mengucapkan tahniah kepada diri sendiri tentang itu,
dan kita akan masuk ke dalam beberapa perkara yang benar-benar menyeronokkan.
>> Jadi toolbox kami untuk pset ini, sekali lagi, bukannya berjalan sudo yum-y update,
kami dapat hanya menjalankan update50 jika anda berada di 17,3 versi dan atas perkakas.
Jadi pastikan untuk menjalankan update50 - ia adalah mudah banyak, beberapa watak-watak yang kurang -
untuk memastikan bahawa anda berada di versi terbaru perkakas.
Terutamanya ia adalah penting untuk update50 apabila kita mula menggunakan CS50 Semak.
Jadi pastikan yang anda lakukan bahawa.
>> Bagi semua bahagian untuk pset ini,
kita akan berurusan dengan input dan output fail, memfailkan I / O.
Kami akan akan lebih banyak program-program yang berurusan dengan tatasusunan
menunjuk ke fail dan hal-hal seperti itu,
jadi kami mahu memastikan bahawa kita benar-benar biasa dan selesa
berurusan dengan bagaimana untuk input dan output ke fail.
>> Dalam kod pengagihan untuk pset ini adalah fail yang dipanggil copy.c,
dan itulah apa yang kita pergi untuk mencari akan menjadi benar-benar berguna kepada kita
kerana kita akan berakhir sebenarnya menyalin fail copy.c
dan hanya mengubah sedikit untuk dapat mencapai 2 bahagian pertama set masalah.
>> Dan demikian maka seperti yang saya nyatakan sebelum ini, kita sedang berurusan dengan bitmap serta JPEG.
Jadi benar-benar memahami struktur bagaimana fail-fail yang dianjurkan,
bagaimana kita benar-benar boleh menterjemah 0 dan 1s ke structs
dan perkara-perkara yang kita sebenarnya boleh memahami dan mentafsir dan mengedit,
yang akan menjadi benar-benar penting,
jadi pergi ke JPEG dan fail bitmap dan memahami struktur mereka.
>> Pset4, seperti biasa, bermula dengan bahagian soalan.
Mereka akan berurusan dengan fail I / O dan mendapatkan anda biasa itu.
Kemudian bahagian 1 Kisah penyiasatan, di mana anda diberi fail bitmap
yang kelihatan semacam titik merah di seluruh.
Dan kemudian pada asasnya apa yang kita akan lakukan adalah mengambil fail ini dan hanya mengedit ia sedikit
ke dalam versi yang kita boleh membaca.
Pada asasnya, apabila kita selesai, kita akan mempunyai fail yang sama,
kecuali kita akan dapat melihat mesej tersembunyi yang disembunyikan oleh semua orang titik merah.
Kemudian Resize adalah program bahawa, memandangkan fail
dan kemudian diberi nama fail bahawa ia output dan kemudian diberi nombor serta,
sebenarnya akan mengubah saiz bitmap bahawa dengan nilai yang integer.
Kemudian akhir sekali, kita mempunyai pset RECOVER.
Kami diberi kad memori dan kemudian perlu untuk pulih semua gambar
yang telah sengaja dihapuskan,
tetapi, seperti yang kita akan belajar, sebenarnya tidak dipadam dan dikeluarkan dari fail;
kita hanya jenis hilang di mana mereka berada dalam fail, tetapi kita akan pulih bahawa.
>> Besar. Jadi pergi ke fail I / O khusus, ini adalah senarai keseluruhan fungsi yang anda akan menggunakan.
Anda telah melihat sedikit asas fopen, fread, dan fwrite,
tetapi kita akan melihat lebih jauh ke dalam fail beberapa I / O fungsi seperti fputc,
di mana anda hanya menulis satu aksara pada satu masa,
fseek, di mana anda jenis menggerakkan penunjuk fail kedudukan ke hadapan dan ke belakang,
dan kemudian beberapa orang lain. Tetapi kita akan pergi ke yang sedikit kemudian semasa pset.
>> Jadi pertama, hanya untuk mendapatkan ke dalam fail I / O sebelum kita pergi ke pset,
untuk membuka fail, sebagai contoh, apa yang anda perlu lakukan sebenarnya menetapkan penunjuk kepada fail tersebut.
Jadi kita mempunyai penunjuk FILE *.
Dalam kes ini, saya memanggil ia dalam penunjuk kerana itu akan menjadi infile saya.
Dan jadi saya akan menggunakan fungsi fopen dan maka nama fail
dan kemudian mod di mana saya akan perlu berurusan dengan fail.
Jadi ada "r" dalam kes ini untuk membaca, "w" untuk menulis, dan kemudian "a" untuk appending.
Sebagai contoh, apabila anda berurusan dengan infile
dan semua yang anda mahu lakukan adalah membaca bit dan bait yang disimpan di sana,
maka anda mungkin akan mahu menggunakan "r" sebagai mod anda.
Apabila anda mahu untuk benar-benar menulis, jenis membuat fail baru,
maka apa yang kita akan lakukan ialah kita akan membuka fail baru
dan menggunakan "w" mod untuk menulis.
>> Jadi kemudian apabila anda sebenarnya membaca ke dalam fail, struktur adalah seperti berikut.
Pertama anda termasuk penunjuk kepada struct yang akan mengandungi bait bahawa anda membaca.
Jadi yang akan menjadi lokasi akhir bait bahawa anda membaca.
Anda kemudian akan menunjukkan saiz, seperti pada dasarnya berapa banyak bait
program anda untuk membaca dalam ke fail, saiz pada dasarnya satu elemen,
dan kemudian anda akan menentukan berapa banyak elemen yang anda mahu membaca.
Dan kemudian akhirnya, anda perlu tahu di mana anda sedang membaca dari,
supaya akan menjadi penunjuk dalam anda.
Saya warna berkod ini kerana fread juga sangat serupa dengan fwrite,
kecuali anda ingin memastikan bahawa anda menggunakan perintah yang betul,
pastikan bahawa anda sebenarnya bertulis kepada atau membaca dari fail yang betul.
>> Jadi maka seperti sebelum ini, jika kita mempunyai saiz unsur serta beberapa elemen,
maka kita boleh bermain-main di sini sedikit.
Katakan saya mempunyai struct ANJING dan demikian maka saya mahu membaca dua anjing pada satu masa.
Apa yang saya boleh lakukan adalah mengatakan saiz satu elemen akan menjadi saiz satu ANJING
dan saya akan benar-benar membaca kedua-dua mereka.
Selain itu, apa yang saya boleh lakukan adalah mengatakan saya hanya akan membaca satu elemen
dan bahawa satu elemen akan menjadi saiz dua anjing.
Jadi itulah analogi bagaimana anda boleh jenis bermain sekitar dengan saiz dan bilangan
bergantung pada apa yang lebih intuitif untuk anda.
>> Semua hak. Jadi sekarang kita sampai kepada fail penulisan.
Apabila anda mahu menulis fail, hujah pertama adalah sebenarnya di mana anda sedang membaca dari.
Jadi itulah pada dasarnya data yang anda akan menulis ke dalam fail,
yang merupakan penunjuk keluar pada akhir.
Jadi, apabila anda berurusan dengan pset, pastikan anda tidak terkeliru.
Mungkin mempunyai sisi takrif menyebelah.
Anda boleh tarik definisi di manual dengan menaip lelaki dan kemudian fwrite, misalnya,
di terminal, atau anda boleh merujuk kembali ke slaid ini
dan pastikan bahawa anda menggunakan yang betul.
Jadi sekali lagi, fwrite, apabila anda mempunyai fail yang anda mahu untuk menulis ke dalam,
yang akan menjadi hujah terakhir dan itu akan menjadi penunjuk kepada fail tersebut.
Jadi maka itulah bagaimana kita berurusan dengan menulis mungkin bytes beberapa pada satu-satu masa,
tetapi mengatakan anda hanya mahu menulis hanya dalam watak satu.
Seperti yang kita akan lihat nanti dalam contoh ini, dalam bitmap kita akan perlu untuk menggunakan bahawa.
Itulah apabila kita boleh menggunakan fputc, dasarnya hanya meletakkan satu watak pada satu masa, Chr,
ke penunjuk fail, dan bahawa penunjuk keluar kami di sana.
Jadi maka apabila kita mencari atau menulis dalam fail,
fail mengesan di mana kita berada.
Jadi ia adalah satu jenis kursor, penunjuk fail kedudukan.
Dan sebagainya apabila kita menulis atau membaca semula ke dalam fail,
fail sebenarnya ingat di mana ia adalah,
dan sebagainya ia terus dari mana kursor berada.
Ini boleh menjadi bermanfaat apabila anda mahu, katakan, membaca dalam jumlah tertentu untuk melakukan sesuatu
dan kemudian membaca dalam jumlah yang berikut,
tetapi kadang-kadang kita mungkin mahu untuk kembali atau sebenarnya bermula dari nilai rujukan tertentu.
Jadi maka fungsi fseek, apa yang ia adalah membolehkan kita untuk menggerakkan kursor dalam fail tertentu
sebilangan bait.
Dan kemudian apa yang perlu kita lakukan adalah menentukan di mana nilai rujukan.
Jadi, sama ada ia bergerak ke hadapan atau ke belakang dari mana kursor pada masa ini,
atau kita boleh menentukan bahawa ia hanya perlu bergerak masuk dari awal fail
atau dari akhir fail.
Dan sebagainya anda boleh lulus dalam nilai-nilai positif atau negatif kepada jumlah,
dan yang jenis akan menggerakkan kursor sama ada ke hadapan atau ke belakang.
>> Sebelum kita mendapat ke psets lain, apa-apa soalan mengenai fail I / O?
Okay. Seperti yang kita masuk ke dalam contoh yang lebih, berasa bebas untuk menghentikan saya untuk soalan.
>> Jadi dalam Kisah penyiasatan, anda menyerahkan fail bitmap yang serupa dengan yang satu ini merah pada slaid,
dan ia kelihatan seperti ini - sekumpulan titik merah - dan anda tidak benar-benar tahu apa yang ditulis.
Jika anda juling, anda mungkin dapat melihat sedikit warna kebiruan di dalam tengah-tengah.
Pada asasnya, yang mana teks disimpan.
Terdapat adalah satu pembunuhan yang berlaku, dan kita perlu untuk mengetahui siapa yang melakukannya.
Dalam usaha untuk berbuat demikian, kita perlu jenis menukar imej ini ke dalam format yang boleh dibaca.
Jika anda lelaki yang pernah dihadapi ini, kadang-kadang ada akan menjadi kit kecil
di mana anda akan mempunyai kaca pembesar dengan filem merah. Sesiapa sahaja? Yeah.
Jadi, anda akan menjadi sesuatu yang tangan seperti ini, anda akan mempunyai kaca pembesar
dengan filem merah di atasnya, anda akan meletakkan ia atas imej,
dan anda akan dapat melihat mesej tersembunyi di dalamnya.
Kami tidak mempunyai kaca pembesar dengan filem merah, jadi sebaliknya kita pergi kepada jenis buat kita sendiri
dalam pset ini.
Dan supaya pengguna akan Kisah penyiasatan input, maka petunjuk, bmp,
supaya adalah infile, itulah mesej titik merah,
dan kemudian mereka mengatakan verdict.bmp akan menjadi outfile kami.
Jadi ia akan mewujudkan imej bitmap baru serupa dengan satu petunjuk
kecuali dalam format yang boleh dibaca di mana kita boleh melihat mesej yang tersembunyi.
>> Sejak kita akan perlu berurusan dengan menyunting dan memanipulasi bitmap sejenis,
kita akan jenis menyelam ke dalam struktur fail-fail bitmap.
Kami pergi lebih sedikit-sedikit dalam kuliah, tetapi mari kita lihat ke dalam mereka beberapa lagi.
Bitmap dasarnya hanya susunan bait
di mana kita telah dinyatakan yang bait bermakna apa.
Jadi di sini adalah jenis seperti peta imej bitmap
mengatakan bahawa ia bermula dengan beberapa fail header, bermula dengan beberapa maklumat di sana.
Anda lihat bahawa di beberapa kira-kira 14 bait saiz ditunjukkan imej bitmap,
dan ia terus.
Tetapi kemudian apa yang kita benar-benar berminat di sini bermula sekitar beberapa bait 54.
Kami mempunyai tiga kali ganda RGB.
Apa yang akan lakukan adalah mengandungi piksel sebenar, nilai warna.
Segalanya atas bahawa dalam pengepala adalah beberapa maklumat
sepadan dengan saiz imej, lebar imej, dan ketinggian.
Apabila kita pergi ke padding kemudian, kita akan lihat kenapa saiz imej
mungkin berbeza daripada lebar atau ketinggian.
Demikian maka untuk mewakili ini - imej-imej bitmap adalah jujukan bait -
apa yang kita boleh lakukan berkata okay, saya akan ingat bahawa pada indeks 14,
yang mana saiz, misalnya, tetapi sebaliknya apa yang kita akan lakukan untuk membuat ini lebih mudah
adalah merangkumi ia dalam struct.
Dan maka kita mempunyai dua structs dibuat untuk kita, BITMAPFILEHEADER
dan BITMAPINFOHEADER,
dan sebagainya apabila kita baca di dalam fail itu, secara lalai ia akan pergi dalam perintah,
dan sebagainya dalam usaha ia juga akan mengisi ke dalam pembolehubah seperti biWidth dan biSize.
Dan kemudian akhirnya, setiap piksel diwakili oleh tiga bait.
Yang pertama adalah jumlah biru dalam piksel, yang kedua ialah jumlah hijau,
dan akhirnya, jumlah merah, di mana 0 adalah asasnya tiada hijau biru atau tiada atau tidak merah
dan kemudian seterusnya adalah nilai maksimum.
Ini adalah nilai perenambelasan.
Jadi, maka jika kita mempunyai FF0000, maka yang sepadan dengan jumlah maksimum biru
dan kemudian tiada hijau dan tiada merah, maka yang akan memberi kita pixel biru.
Kemudian jika kita mempunyai semua ff yang menyeluruh, maka itu bermakna bahawa kita mempunyai piksel putih.
Ini adalah jenis bertentangan dengan biasanya apabila kita katakan RGB. Ia sebenarnya akan BGR.
>> Jadi, jika kita benar-benar melihat ke dalam contoh imej bitmap - izinkan saya tarik satu di sini.
Ia adalah sedikit kecil.
Saya zoom di, dan kita boleh melihat ia pixelated. Ia kelihatan seperti blok warna.
Anda mempunyai blok putih dan kemudian blok merah.
Jika anda bermain dalam cat Microsoft, misalnya, anda boleh membuat sesuatu seperti itu
oleh pada dasarnya hanya lukisan dataran tertentu dalam susunan yang tertentu.
Demikian maka apa yang ini diterjemahkan dalam bitmap yang adalah seperti berikut.
Di sini kita mempunyai piksel putih pertama, bahawa semua 6 adalah f itu, dan kemudian kita mempunyai piksel merah,
ditunjukkan oleh 0000ff.
Dan sebagainya urutan bait yang kita ada menunjukkan bagaimana imej bitmap akan kelihatan.
Jadi apa yang saya lakukan di sini hanya ditulis semua orang bait dan kemudian berwarna merah
supaya anda jenis boleh lihat, jika anda juling sedikit, bagaimana yang jenis menunjukkan muka senyum.
>> Cara yang bitmap imej adalah kerja saya membayangkan ia pada dasarnya sebagai grid.
Dan demikian dengan lalai, setiap baris grid mempunyai untuk menjadi dibahagikan dengan 4 bait.
Jika kita melihat imej bitmap, anda mengisi setiap nilai.
Sebagai contoh, anda mungkin mempunyai merah di sini, hijau di sini, biru di sini,
tetapi anda perlu pastikan bahawa imej diisi dengan pelbagai empat bait.
Jadi jika saya mahu imej saya untuk menjadi tiga blok lebar, maka saya akan perlu untuk meletakkan nilai kosong
dalam salah satu yang terakhir untuk membuat ia satu gandaan empat.
Jadi, maka saya akan menambah sesuatu yang kita memanggil padding.
Saya hanya akan menunjukkan bahawa terdapat dengan x.
Sekarang katakan kita mahu imej yang 7 piksel panjang, misalnya.
Kami mempunyai 1, 2, 3, 4, 5, 6, 7,
dan semua yang dipenuhi dengan warna.
Cara bahawa imej bitmap bekerja adalah bahawa kita perlu 8.
Sekarang kita mempunyai 1, 2, 3, 4, 5, 6, 7.
Kita perlu 8 ruangan untuk imej bitmap untuk membaca dengan betul.
Jadi maka apa yang perlu kita lakukan adalah menambah hanya sedikit padding
untuk memastikan bahawa semua lebar adalah seragam
dan bahawa semua lebar adalah gandaan 4.
Dan jadi saya sebelum ini menunjukkan, padding sebagai x atau garis berlekuk-lekuk,
tetapi dalam bitmap imej sebenar padding ditunjukkan oleh perenambelasan 0.
Jadi yang akan menjadi watak tunggal, 0.
Apa yang mungkin datang dalam berguna adalah arahan xxd.
Apa yang ia adalah sebenarnya menunjukkan anda, seperti yang serupa dengan apa yang saya lakukan sebelum ini dengan smiley
apabila saya sebenarnya dicetak apa warna masing-masing akan bagi piksel
dan kemudian warna berkod, apabila anda menjalankan xxd dengan arahan berikut,
maka ia sebenarnya akan mencetak apa warna bagi mereka piksel.
Apa yang anda perlu lakukan adalah di sini saya menunjukkan, seperti s-54
mengatakan bahawa saya akan bermula pada bait ke-54
kerana sebelum itu, ingat jika kita melihat kembali ke peta daripada bitmap,
itulah semua maklumat header dan perkara-perkara seperti itu.
Tetapi apa yang kita benar-benar mengambil berat tentang adalah piksel sebenar yang menunjukkan warna.
Jadi dengan menambah dalam bendera yang-s 54, maka kita dapat melihat nilai warna.
Dan jangan bimbang tentang bendera dan perkara-perkara rumit seperti itu.
Dalam spec set masalah, anda akan mempunyai arahan bagaimana untuk menggunakan xxd untuk memaparkan piksel.
Jadi, jika anda lihat di sini, ia jenis kelihatan seperti kotak hijau, ini perkara kecil.
Saya telah dikod warna 00ff00 sebagai pada dasarnya mengatakan tidak biru, banyak hijau, dan tiada merah.
Jadi yang sepadan kepada hijau.
Seperti yang anda lihat di sini, kita lihat sebuah segiempat tepat yang hijau.
Ini segi empat tepat hijau adalah hanya 3 piksel lebar, maka apa yang perlu kita lakukan
untuk memastikan bahawa imej adalah pelbagai daripada 4 lebar adalah menambah padding tambahan.
Dan sebagainya maka itulah bagaimana anda melihat 0s ini di sini.
Ini sebenarnya akan hasil daripada pset Resize anda,
dasarnya mengambil bitmap kecil dan kemudian membesarkan dengan 4.
Dan supaya apa yang kita lihat ialah bahawa sebenarnya imej ini adalah 12 piksel lebar, tetapi 12 adalah gandaan 4,
dan sebagainya kita sebenarnya tidak melihat apa-apa 0s pada akhir kerana kita tidak perlu menambah sebarang
kerana ia sepenuhnya berpad. Ia tidak mempunyai mana-mana bilik lebih.
>> Okay. Sebarang pertanyaan tentang padding?
Okay. Sejuk.
>> Seperti yang saya nyatakan sebelum ini, bitmap hanya jujukan bait.
Dan supaya apa yang kita ada adalah sebaliknya perlu menjejaki tepat nombor yang bait
sepadan dengan elemen tertentu, kita sebenarnya telah mencipta satu struct untuk mewakili bahawa.
Jadi apa yang kita ada adalah struct RGBTRIPLE.
Apabila anda mempunyai contoh tiga RGB,
kerana ini adalah jenis menentukan struct, maka anda boleh mengakses pembolehubah rgbtBlue,
begitu pembolehubah Hijau dan Merah, yang akan menunjukkan berapa banyak biru, hijau, dan merah,
masing-masing, anda perlu.
>> Jadi, jika kita mempunyai set pembolehubah biru kepada 0, set hijau ff,
yang merupakan nilai maksimum yang anda boleh mempunyai, dan kemudian pembolehubah merah disetkan kepada 0,
maka apa warna ini RGB tiga tertentu akan mewakili? >> [Pelajar] Hijau.
Hijau. Tepat sekali.
Ia akan menjadi berguna untuk mengetahui bahawa apabila anda mempunyai contoh tiga RGB,
anda sebenarnya boleh mengakses jumlah warna - biru, hijau, dan merah - berasingan.
>> Sekarang kita telah bercakap tentang struktur itu, mari kita lihat di fail BMP.
Ini adalah structs yang dibuat untuk anda.
Di sini kita mempunyai struct BITMAPFILEHEADER.
Faedah adalah saiz.
Kemudian, kita mempunyai header info, yang mempunyai beberapa perkara yang menarik untuk kami,
iaitu saiz, lebar, dan ketinggian.
Seperti yang kita akan pergi ke kemudian, apabila anda membaca dalam ke fail,
ia secara automatik membaca kerana kita telah menetapkan perintah itu untuk menjadi sama.
Jadi biSize akan mengandungi bait hak yang sesuai dengan saiz sebenar imej.
Dan kemudian di sini, akhirnya, seperti yang kita telah bercakap tentang, kita mempunyai struct typedef RGBTRIPLE.
Kami mempunyai satu rgbtBlue, Hijau, dan Red dikaitkan dengannya.
>> Besar. Okay.
Sekarang kita memahami bitmap sedikit, faham bahawa kita mempunyai tandukan fail
dan header info yang dikaitkan dengan ia dan kemudian selepas itu, kita mempunyai barangan yang menarik
warna, dan orang-orang warna yang diwakili oleh structs RGBTRIPLE,
dan mereka, sebaliknya, mempunyai tiga nilai-nilai yang berkaitan kepada biru, hijau, dan merah.
>> Jadi sekarang, kita boleh jenis berfikir tentang pulihkan sedikit.
Maaf. Fikirkan tentang Kisah penyiasatan.
Apabila kita mempunyai fail petunjuk kami, maka apa yang kita mahu lakukan adalah membaca dalam ia piksel oleh piksel
dan kemudian entah bagaimana menukar mereka piksel supaya kita boleh mengeluarkan ia ke dalam format yang boleh dibaca.
Dan sebagainya untuk menayangkan, kita pergi untuk menulis piksel oleh piksel ke dalam fail verdict.bmp.
Itulah jenis banyak lakukan. Kami sedar bahawa.
Jadi apa yang kami lakukan adalah kita telah benar-benar menyediakan anda dengan copy.c.
Apa copy.c tidak hanya membuat salinan tepat sesuatu fail bitmap yang diberikan dan kemudian output.
Jadi ini sudah membuka fail untuk anda, membaca piksel oleh piksel,
dan kemudian menulis ke dalam fail output.
>> Mari kita lihat pada itu.
Ini memastikan penggunaan yang betul,
mendapatkan nama fail di sini.
Apakah ini tidak adalah ia menetapkan fail input untuk menjadi apa yang kita telah meninggal di dalam infile di sini,
yang merupakan hujah baris arahan kedua kami.
Memeriksa untuk memastikan bahawa kita boleh membuka fail tersebut.
Pemeriksaan untuk memastikan kita boleh membuat outfile baru di sini.
Kemudian apa ini tidak di sini, ia hanya pada dasarnya mula membaca masuk ke fail bitmap dari awal.
Permulaan, seperti yang kita tahu, mengandungi BITMAPFILEHEADER,
dan supaya orang-orang jujukan bit langsung akan mengisi dalam BITMAPFILEHEADER.
Jadi apa yang kita ada di sini mengatakan bahawa bf BITMAPFILEHEADER -
itulah pembolehubah baru kami BITMAPFILEHEADER jenis -
kita akan diletakkan di dalam bf apa yang kita baca dari dalam penunjuk, yang infile kami.
Berapa banyak yang kita baca?
Kita membaca dalam berapa banyak bait kita perlu mengandungi BITMAPFILEHEADER keseluruhan.
Begitu juga, bahawa apa yang kita lakukan untuk header info.
Jadi kita sedang berterusan sepanjang fail kami di infile,
dan kami membaca mereka bit dan bait, dan kami sedang memasang mereka secara langsung dalam
ke contoh pembolehubah bahawa kita sedang membuat.
Di sini kita hanya membuat pasti bahawa bitmap adalah bitmap.
>> Sekarang kita mempunyai outfile satu, kan?
Jadi kerana ia bermaksud apabila kita buat, ia adalah pada dasarnya kosong.
Jadi kita perlu pada dasarnya mewujudkan bitmap yang baru dari awal.
Apa yang kita lakukan ialah kita perlu memastikan bahawa kita menyalin dalam pengepala fail
dan header info seperti infile mempunyai.
Apa yang kita lakukan ialah kita menulis - dan ingat bahawa bf adalah pembolehubah
BITMAPFILEHEADER jenis, jadi apa yang kita lakukan ialah kita hanya menggunakan kandungan yang
untuk menulis ke outfile.
Di sini, ingat kita bercakap tentang padding,
bagaimana ia adalah penting untuk memastikan bahawa jumlah piksel yang kita ada adalah gandaan 4.
Ini adalah formula yang cukup berguna untuk mengira berapa banyak padding anda mempunyai
diberikan lebar fail anda.
Saya mahu anda semua untuk ingat bahawa di copy.c kita mempunyai formula untuk mengira padding.
Okey? Jadi semua orang ingat bahawa. Besar.
Demikian maka apa copy.c seterusnya adalah lelaran ke atas semua daripada scanlines.
Ia pergi melalui baris pertama dan kemudian menyimpan setiap triple bahawa ia membaca
dan kemudian menulis ke outfile.
Jadi maka di sini kita membaca hanya satu RGB tiga pada satu masa
dan kemudian meletakkan bahawa triple sama ke outfile.
Bahagian yang agak rumit adalah bahawa padding tidak merupakan tiga RGB,
dan sebagainya kita tidak boleh hanya membaca bahawa jumlah padding triple RGB.
Apa yang perlu kita lakukan adalah sebenarnya hanya bergerak penunjuk kedudukan fail kami, menggerakkan kursor kami,
kepada jenis skip ke atas semua padding supaya kita berada di barisan seterusnya.
Dan kemudian apa ini tidak adalah salinan menunjukkan bagaimana anda mungkin mahu untuk menambah padding.
Jadi kita telah dikira berapa banyak padding yang kita perlu,
supaya bermakna bahawa kita perlu nombor padding daripada 0s.
Apakah ini tidak adalah untuk gelung yang meletakkan nombor padding-0s ke outfile kami.
Dan kemudian akhirnya, anda menutup kedua-dua fail. Anda menutup infile serta outfile.
>> Jadi itulah bagaimana copy.c kerja,
dan itulah akan menjadi agak berguna.
Sebaliknya hanya sebenarnya langsung menyalin dan menampal
atau hanya melihat dan menaip apa sahaja yang anda mahu,
anda hanya mungkin mahu untuk melaksanakan arahan ini di terminal,
cp copy.c whodunit.c, yang akan mencipta fail baru, whodunit.c,
yang mengandungi kandungan yang tepat sama sebagai salinan tidak.
Jadi maka apa yang kita boleh lakukan menggunakan bahawa sebagai rangka kerja di mana untuk membina dan mengedit
untuk fail Kisah penyiasatan kami.
>> Ini adalah kami untuk tugasan untuk melakukan Kisah penyiasatan, tetapi apa copy.c tidak
sebenarnya menjaga kebanyakan daripada mereka untuk kita.
Jadi semua yang kita perlu lakukan seterusnya ialah menukar piksel seperti yang diperlukan
untuk benar-benar membuat fail yang boleh dibaca.
Ingatlah bahawa untuk piksel triple diberikan, jadi pembolehubah diberikan RGBTRIPLE jenis,
anda boleh mengakses nilai biru, hijau, dan merah.
Itu akan datang dalam berguna kerana jika anda boleh mengakses mereka,
yang bermaksud bahawa anda juga boleh menyemak mereka,
dan ini bermakna bahawa anda juga boleh menukar mereka.
>> Jadi, apabila kita kembali kepada kaca pembesar contoh merah kami,
pada dasarnya, yang telah bertindak sebagai sejenis penapis untuk kita.
Jadi apa yang kita mahu lakukan ialah kita mahu untuk menapis semua tiga kali ganda yang datang masuk
Terdapat beberapa cara yang berbeza untuk melakukan ini.
Pada asasnya, anda boleh mempunyai apa jua jenis penapis yang anda mahu.
Mungkin anda mahu mengubah semua piksel merah
atau mungkin anda mahu untuk menukar piksel warna yang berbeza dengan warna yang berbeza.
Itu terpulang kepada anda.
Ingatlah bahawa anda boleh menyemak apa warna piksel adalah
dan kemudian anda juga boleh menukar ia sebagai anda pergi melalui.
>> Okay. Jadi itulah Kisah penyiasatan.
Sebaik sahaja anda menjalankan Kisah penyiasatan, anda akan tahu yang punca jenayah.
>> Sekarang kita akan pergi ke Saiz semula.
Kami akan masih boleh berurusan dengan bitmap.
Apa yang kita akan lakukan adalah kita akan mempunyai bitmap input
dan kemudian kita pergi untuk lulus dalam nombor dan kemudian mendapatkan bitmap outfile
mana yang pada dasarnya infile kami diskalakan oleh n.
Katakanlah fail saya adalah hanya satu piksel besar.
Kemudian jika n saya adalah 3, bersisik dengan 3, maka saya akan mengulangi bahawa piksel n beberapa kali,
jadi 3 kali, dan kemudian juga skala ia ke 3 kali juga.
Jadi anda lihat Saya mendaki ia menegak serta mendatar.
>> Dan kemudian di sini adalah satu contoh.
Jika anda mempunyai n 2 =, anda lihat bahawa piksel biru pertama terdapat diulangi dua kali
mendatar seperti yang baik sebagai dua kali menegak.
Dan kemudian yang terus, dan supaya anda mempunyai bersisik langsung imej asal anda dengan dua.
>> Jadi maka jika kita kepada perincian pseudokod untuk ini, kita mahu untuk membuka fail.
Dan kemudian mengetahui bahawa jika kita kembali di sini,
kita lihat bahawa lebar untuk outfile yang akan menjadi berbeza daripada lebar untuk infile.
Apa maksudnya?
Ini bermakna bahawa maklumat header kami akan berubah.
Dan supaya apa yang kita akan mahu lakukan adalah mengemaskini maklumat header,
mengetahui bahawa apabila kita membaca dalam fail jika anda beroperasi pada rangka copy.c,
kita sudah mempunyai satu pemboleh ubah yang menunjukkan apa saiz dan perkara-perkara seperti itu.
Jadi apabila anda mempunyai bahawa, apa yang anda mungkin mahu lakukan adalah menukar pembolehubah tertentu.
Ingat, jika anda mempunyai struct, bagaimana anda mengakses pembolehubah dalam tempoh itu.
Anda menggunakan operator dot, bukan?
Jadi kemudian menggunakan bahawa, anda tahu bahawa anda akan perlu untuk menukar maklumat pengepala.
Jadi di sini adalah hanya satu senarai elemen-elemen sebenar yang akan berubah dalam fail anda.
Saiz fail akan berubah, imej, serta lebar dan ketinggian.
Demikian maka akan kembali ke peta daripada bitmap,
melihat sama ada ia adalah pengepala fail atau header info yang mengandungi maklumat yang
dan kemudian berubah seperti yang diperlukan.
Sekali lagi, katakan cp copy.c resize.c.
Ini bermakna bahawa resize.c kini mengandungi segala yang terkandung di dalam salinan
kerana salinan memberikan kita cara membaca dalam setiap piksel scanline oleh piksel.
Kecuali kini, bukan hanya mengubah nilai seperti yang kita lakukan dalam Kisah penyiasatan,
apa yang kita mahu lakukan ialah kita mahu menulis dalam piksel berganda
selagi n kami adalah lebih daripada 1.
>> Kemudian apa yang kita mahu lakukan ialah kita mahu menghulurkan melintang oleh n,
serta menghulurkan menegak oleh n.
Bagaimana kita mungkin melakukan ini?
Katakanlah n anda ialah 2 dan anda mempunyai ini infile diberikan.
Kursor anda akan bermula pada yang pertama,
dan apa yang anda mahu lakukan jika n ialah 2, anda mahu untuk mencetak dalam 2 daripada mereka.
Jadi anda mencetak dalam 2 daripada mereka.
Kemudian kursor anda akan bergerak ke piksel yang seterusnya, yang merupakan satu merah,
dan ia akan mencetak 2 orang-orang yang merah, appending ke apa ia dilakukan sebelum.
Kemudian kursor akan bergerak ke piksel yang seterusnya dan menarik dalam 2 daripada mereka.
Jika anda melihat kembali kepada rangka kerja copy.c, apakah ini tidak betul di sini
ia mewujudkan contoh baru triple RGB, pembolehubah baru yang dipanggil triple.
Dan di sini apabila ia berbunyi ke dalamnya, ia membaca dari infile 1 RGBTRIPLE
dan menyimpan ia di dalam pembolehubah yang triple.
Jadi maka anda sebenarnya mempunyai pembolehubah yang mewakili bahawa piksel tertentu.
Kemudian apabila anda menulis, apa yang anda mungkin mahu lakukan adalah menyarungi penyata fwrite ke dalam untuk gelung
yang menulis ke outfile anda sebagai banyak kali seperti yang diperlukan.
Itu cukup mudah.
Hanya pada dasarnya mengulangi proses penulisan n beberapa kali untuk skala ia melintang.
>> Tetapi kita perlu ingat bahawa padding kami akan berubah.
Sebelum ini, mengatakan kita mempunyai sesuatu yang panjang 3.
Kemudian kita hanya akan menambah dalam berapa banyak padding? Hanya satu lagi untuk membuat ia gandaan 4.
Tetapi mengatakan bahawa kita sedang mendaki imej ini tertentu dengan n = 2.
Demikian maka berapa banyak piksel biru kita akan mempunyai pada akhir? Kita akan mempunyai 6.
1, 2, 3, 4, 5, 6. Semua hak.
6 tidak gandaan 4. Apakah gandaan terdekat daripada 4? Itu akan menjadi 8.
Jadi, kita sebenarnya akan mempunyai 2 watak-watak padding di sana.
>> Adakah sesiapa ingat jika kita mempunyai formula untuk mengira padding
dan di mana yang mungkin?
[Sambutan pelajar didengar] >> Ya, copy.c. Betul.
Terdapat formula di copy.c untuk mengira berapa banyak padding anda mempunyai
diberi lebar tertentu imej bitmap.
Demikian maka itu akan menjadi berguna apabila anda perlu untuk menambah jumlah tertentu padding
sebenarnya memikirkan berapa banyak padding yang anda perlu menambah.
Tetapi satu nota, walaupun, adalah bahawa anda ingin memastikan bahawa anda menggunakan saiz yang betul.
Hanya berhati-hati kerana anda pada dasarnya akan berurusan dengan dua imej bitmap.
Anda ingin memastikan bahawa anda menggunakan yang betul.
Apabila anda mengira padding untuk outfile, anda mahu menggunakan lebar daripada outfile
dan tidak lebar yang sebelumnya.
>> Besar. Yang jenis mengambil menjaga regangan keseluruhan imej bitmap melintang.
Tetapi apa yang kita mahu lakukan sebenarnya menghulurkan menegak serta.
Ini akan menjadi sedikit sukar kerana apabila kita telah selesai menyalin berturut-turut
dan menulis baris tersebut, kursor kita akan menjadi pada akhir.
Jadi, jika kita membaca sekali lagi, maka ia hanya akan membaca dalam ke baris seterusnya.
Jadi apa yang kita mahu lakukan adalah jenis mencari beberapa cara menyalin mereka baris lagi
atau hanya jenis mengambil baris tersebut dan kemudian menulis semula lagi.
Seperti yang saya jenis dirujuk kepada, terdapat beberapa cara yang berbeza untuk melakukan ini.
Apa yang anda boleh lakukan adalah seperti anda pergi melalui dan membaca melalui scanline tertentu
dan berubah ia seperti yang diperlukan, maka jenis kedai semua orang-orang piksel dalam array.
Kemudian kemudian anda tahu bahawa anda akan perlu untuk mencetak pelbagai itu lagi,
dan supaya anda hanya boleh menggunakan pelbagai bahawa untuk berbuat demikian.
Satu lagi cara untuk melakukannya adalah anda boleh tulis satu barisan,
memahami bahawa anda perlu untuk menyalin bahawa sekali lagi, jadi sebenarnya menggerakkan kursor anda,
dan itu akan menggunakan kaedah fseek.
Anda boleh menggerakkan kursor anda sepanjang jalan ke belakang dan kemudian mengulangi proses salinan lagi.
>> Jadi jika nombor bersisik kami adalah n, maka berapa kali kita akan perlu kembali
dan menulis semula garis? >> [Pelajar] n - 1. >> Yeah, sempurna. n - 1.
Kami telah melakukannya sekali pun, maka kita akan mahu mengulangi kembali proses yang berterusan
n - 1 jumlah kali.
Okay. Jadi ada anda mempunyai fungsi saiz semula anda.
>> Sekarang kita boleh sampai ke bahagian yang benar-benar menyeronokkan, pset kegemaran saya, yang merupakan pulihkan.
Sebaliknya bitmap, masa ini kita sedang berurusan dengan JPEG.
Kami sebenarnya tidak diberi fail hanya JPEG,
kita diberi pada dasarnya kad memori format mentah.
Dan sebagainya ini mengandungi sedikit info dan nilai-nilai sampah pada mulanya,
dan kemudian ia bermula dan ia mempunyai sekumpulan fail JPEG.
Walau bagaimanapun, kami menyerahkan kad di mana kita telah dipadam gambar;
pada asasnya, kita terlupa mana gambar yang terletak di dalam kad.
Jadi maka tugas kita di pulihkan adalah untuk pergi melalui format kad ini
dan mencari orang-orang gambar lagi.
>> Nasib baik, struktur fail JPEG dan fail kad adalah sedikit membantu.
Ia pasti boleh menjadi agak sukar jika ia tidak berada dalam format ini tertentu.
Setiap fail JPEG sebenarnya bermula dengan dua jujukan mungkin, yang disenaraikan di atas.
Pada asasnya, apabila anda mempunyai fail JPEG baru,
ia bermula dengan sama ada urutan ffd8 ffe0 atau satu lagi, ffd8 ffe1.
Satu lagi perkara yang membantu untuk mengetahui adalah JPEG disimpan contiguously.
Jadi, apabila salah satu fail JPEG berakhir, satu lagi bermula.
Jadi tidak ada apa-apa jenis di antara nilai sana.
Sebaik sahaja anda memukul permulaan JPEG, jika anda sudah membaca JPEG,
anda tahu bahawa anda telah melanda akhir yang sebelumnya dan permulaan yang seterusnya.
>> Untuk jenis menggambarkan ini, saya membuat skematik.
Satu lagi perkara mengenai JPEG adalah bahawa kita boleh membaca mereka di urutan 512 bait pada satu masa,
begitu juga dengan permulaan kad.
Kita tidak perlu untuk memeriksa setiap bait tunggal kerana itu akan menghisap.
Jadi sebaliknya, apa yang boleh kita lakukan adalah sebenarnya hanya membaca dalam 512 bait pada satu masa
dan kemudian, bukannya memeriksa di antara mereka dalam orang-orang keping kecil sedikit,
kita hanya boleh memeriksa permulaan 512 bait.
Pada asasnya, dalam gambar ini, apa yang anda lihat adalah dalam permulaan kad,
anda mempunyai nilai-nilai yang tidak benar-benar relevan kepada JPEG sebenar diri mereka sendiri.
Tetapi kemudian apa yang saya ada adalah bintang untuk menunjukkan salah satu daripada dua urutan bermula untuk JPEG.
Jadi, apabila anda melihat bintang, anda tahu bahawa anda mempunyai fail JPEG.
Dan kemudian setiap fail JPEG akan menjadi beberapa gandaan 512 bait
tetapi tidak semestinya gandaan yang sama.
Cara yang anda tahu bahawa anda telah melanda satu lagi JPEG adalah jika anda memukul bintang lain,
satu lagi urutan bermula bait.
Kemudian apa yang anda ada di sini adalah anda mempunyai fail merah JPEG berterusan sehingga anda menekan bintang,
yang ditunjukkan oleh warna baru.
Anda terus dan maka anda memukul bintang lain, anda memukul lagi JPEG,
anda terus sepanjang jalan sehingga akhir.
Anda berada di gambar terakhir di sini, satu merah jambu.
Anda pergi ke akhir sehingga anda memukul akhir watak fail.
Ini akan menjadi benar-benar berguna.
>> A takeaways beberapa utama di sini:
Fail kad tidak bermula dengan JPEG,
tetapi sekali JPEG bermula, semua yang JPEG disimpan sebelah menyebelah untuk satu sama lain.
>> Sesetengah pseudokod untuk pulihkan.
Pertama, kita pergi untuk membuka fail kad kami,
dan itu akan menggunakan fail I / O fungsi kami.
Kami akan mengulangi proses berikut sehingga kita telah sampai ke penghujung fail.
Kami akan membaca 512 bait pada satu masa.
Dan apa yang saya katakan di sini adalah kita akan menyimpannya dalam buffer,
jadi pada asasnya berpegang kepada mereka 512 bait sehingga kita tahu apa yang perlu dilakukan dengan mereka.
Kemudian apa yang kita mahu lakukan ialah kita mahu untuk memeriksa sama ada kita telah melanda bintang atau tidak.
Jika kita telah melanda bintang, jika kita telah melanda salah satu urutan bermula,
maka kita tahu bahawa kita telah melanda fail JPEG baru.
Apa yang kita akan mahu lakukan adalah kita akan mahu mencipta fail baru dalam direktori pset4 kami
untuk terus membuat fail tersebut.
Tetapi juga, jika kita sudah dibuat JPEG sebelum ini,
maka kita ingin menamatkan fail tersebut dan menolak ia ke folder pset4,
di mana kita akan mempunyai fail yang disimpan kerana jika kita tidak menyatakan bahawa kita telah berakhir bahawa fail JPEG,
maka kita pada dasarnya akan mempunyai satu jumlah yang tidak dapat ditentukan. JPEG tidak akan berakhir.
Jadi, kita mahu memastikan bahawa apabila kita membaca dalam fail JPEG dan menulis bahawa,
kita mahu khusus untuk menutup bahawa dalam usaha untuk membuka satu seterusnya.
Kami akan mahu untuk memeriksa beberapa perkara.
Kami ingin untuk memeriksa sama ada kita berada di permulaan JPEG baru dengan penampan kami
dan juga jika kita sudah telah menemui JPEG sebelum
kerana yang akan mengubah proses anda sedikit.
Jadi kemudian selepas anda pergi melalui semua cara dan anda melanda akhir fail,
maka apa yang anda akan mahu lakukan adalah anda akan mahu untuk menutup semua fail yang sedang terbuka.
Itu mungkin akan menjadi fail JPEG lepas bahawa anda mempunyai,
serta fail kad yang anda telah berurusan dengan.
>> Halangan terakhir yang kita perlukan untuk menangani adalah bagaimana untuk benar-benar membuat fail JPEG
dan bagaimana untuk benar-benar menolak ke folder.
Pset memerlukan bahawa setiap JPEG yang anda dapati berada dalam format berikut,
di mana anda mempunyai nombor jpg.
Nombor, walaupun ia adalah 0, kita panggil ia 000.jpg.
Apabila anda mencari JPEG dalam program anda,
anda akan mahu untuk menamakan ia dalam perintah itu bahawa ia dijumpai.
Apa maknanya?
Kita perlu jenis menjejaki berapa banyak kita dapati
dan apa bilangan setiap JPEG sepatutnya.
Di sini kita pergi untuk mengambil kesempatan daripada fungsi sprintf.
Sama seperti printf, yang hanya jenis cetakan nilai keluar ke terminal,
sprintf mencetak fail ke dalam folder.
Dan jadi apa ini akan lakukan sekiranya saya mempunyai sprintf, tajuk, dan kemudian rentetan di sana,
ia akan mencetak 2.jpg.
Mengandaikan bahawa saya telah ditutup fail-fail saya dengan betul,
yang akan mengandungi fail bahawa saya telah menulis.
Tetapi satu perkara yang bahawa kod yang saya ada di sini
tidak cukup memenuhi apa pset memerlukan.
Pset memerlukan bahawa fail JPEG kedua harus dinamakan 002 bukannya hanya 2.
Jadi, apabila anda mencetak nama, maka mungkin anda mungkin mahu untuk mengubah placeholder sedikit.
>> Adakah sesiapa masih ingat bagaimana kita membolehkan untuk ruang tambahan apabila kita mencetak sesuatu?
Yeah. >> [Pelajar] Anda meletakkan 3 antara tanda peratus dan 2. >> Yeah, sempurna.
Anda akan meletakkan 3 dalam kes ini kerana kita mahu ruang untuk 3.
3d% mungkin akan memberikan anda 002.jpg bukannya 2.
Hujah pertama ke fungsi sprintf adalah sebenarnya pelbagai char,
yang kita pernah tahu sebagai rentetan.
Mereka wasiat, jenis lebih seperti penyimpanan sementara, hanya menyimpan rentetan yang terhasil.
Anda tidak akan benar-benar akan berurusan dengan ini, tetapi anda perlu untuk memasukkan.
>> Mengetahui bahawa setiap nama fail mempunyai bilangan, yang mengambil masa sehingga tiga watak,
dan kemudian. jpg, berapa lama pelbagai ini perlu?
Membuang nombor. Berapa banyak watak-watak dalam tajuk, dalam nama?
Jadi ada 3 hashtags, tempoh, jpg. >> [Pelajar] 7. >> 7. Tidak cukup.
Kami akan mahu 8 kerana kita mahu untuk membolehkan null serta.
>> Akhirnya, hanya untuk menarik keluar proses yang anda akan lakukan untuk pulihkan,
anda mempunyai beberapa maklumat awal.
Anda terus sehingga anda menjumpai permulaan fail JPEG,
dan yang boleh menjadi salah satu daripada dua urutan bermula.
Anda terus membaca. Setiap slash di sini mewakili 512 bait.
Anda terus membaca, terus membaca sehingga anda bertemu dengan satu lagi urutan permulaan.
Sebaik sahaja anda mempunyai, anda berakhir JPEG semasa - dalam kes ini, ia adalah satu merah,
jadi anda mahu menamatkan bahawa.
Anda mahu sprintf nama itu ke dalam folder pset4 anda,
maka anda ingin membuka JPEG baru dan kemudian terus membaca
sehingga anda menghadapi seterusnya.
Teruskan membaca, menyimpan membaca,
dan akhirnya, akhirnya, anda akan sampai ke akhir fail,
dan supaya anda akan mahu untuk menutup JPEG terakhir yang anda telah bekerja dengan,
sprintf bahawa ke dalam folder pset4 anda, dan kemudian melihat semua gambar-gambar yang anda telah mendapat.
Mereka gambar sebenarnya gambar CS50 kakitangan,
dan sebagainya ini adalah di mana bahagian bonus keseronokan pset yang datang dalam
adalah bahawa anda bersaing dalam seksyen anda untuk mencari TFS dalam gambar
dan mengambil gambar dengan mereka untuk membuktikan bahawa anda telah melakukan pset
dan supaya anda boleh melihat yang staf dalam gambar.
Jadi maka anda mengambil gambar dengan kakitangan. Kadang-kadang anda akan mempunyai untuk mengejar mereka ke bawah.
Mungkin sesetengah daripada mereka akan cuba untuk melarikan diri dari anda.
Anda mengambil gambar dengan mereka.
Ini adalah berterusan. Ia bukan disebabkan apabila pset adalah disebabkan.
Tarikh tutup akan diumumkan dalam spesifikasi.
Kemudian bersama-sama dengan bahagian anda, mana-mana seksyen mengambil gambar-gambar yang paling
dengan kakitangan yang paling akan memenangi hadiah yang cukup menggerunkan.
Itulah jenis insentif untuk mendapatkan pset4 anda selesai secepat mungkin
kerana maka anda boleh pergi ke perniagaan
memburu semua kakitangan yang berbeza ahli CS50.
Itu bukan wajib, walaupun, jadi apabila anda mendapatkan gambar,
maka anda selesai dengan pset4.
>> Dan saya selesai dengan 4 Walkthrough, jadi terima kasih semua kerana datang.
Nasib baik dengan Forensik. [Tepukan]
[CS50.TV]