>> [MUSIC PLAYING]
DAVID J. Malan: Baiklah.
Ini adalah CS50, dan ini adalah akhir dari Minggu 2.
Jadi hari ini, kita akan untuk melanjutkan melihat kami
bagaimana kita mewakili hal-hal bawah hood-- bergerak menjauh
dari nomor seperti bilangan bulat dan nilai floating point
dan berfokus pada string dan program akhirnya lebih menarik.
Tapi kita juga akan melihat pada beberapa domain spesifik problems--
yang pertama akan menjadi yang melibatkan kriptografi,
seni berebut informasi, di mana Anda lihat di atas sini
adalah gambar Radio Orphan Annie cincin decoder rahasia dari masa lampau.
>> Ini sebenarnya bentuk yang sangat primitif dan bentuk ramah-anak cryptopgraphy
dimana cincin ini memiliki dua disks-- satu di dalam dan satu di luar.
Dan dengan memutar salah satu dari mereka, Anda dapat dasarnya berbaris huruf seperti A
melalui Z dengan huruf lainnya seperti B melalui A. Dengan kata lain,
Anda dapat benar-benar memutar alfabet, sehingga datang dengan pemetaan dari
surat kepada surat sehingga, jika Anda ingin mengirim pesan rahasia
untuk seseorang seperti Annie, Anda bisa menulis bawah pesan Anda dan kemudian memutar
surat-surat, dimana, jika Anda berarti mengatakan "A," Anda malah mengatakan "B,"
Anda bermaksud mengatakan "B," Anda malah mengatakan "C" -
atau sesuatu yang sedikit lebih pintar dari itu-- dan kemudian, akhirnya,
selama Annie memiliki decoder ini cincin, ia dapat membaca sandi pesan.
Sekarang, Anda mungkin ingat, pada kenyataannya, bahwa ini digunakan dalam film yang sangat terkenal yang
memainkan nauseum iklan selama musim Natal.
Mari kita lihat di sini.
Ralphie PARKER: "Jadilah itu diketahui semua dalam ringkasan
bahwa Ralph Parker dengan ini ditunjuk anggota dari Little Orphan Annie Rahasia
Lingkaran dan berhak atas semua kehormatan dan manfaat yang terjadi padanya. "
>> Ralphie PARKER (menceritakan): Ditandatangani kecil Orphan Annie.
Ditandatangani, Pierre Andre!
Dalam tinta.
Honors dan manfaat, sudah pada usia sembilan.
>> [MUSIC PLAYING]
>> [RADIO CHATTER]
Ralphie PARKER: Ayo.
Mari kita langsung saja.
Aku tidak perlu semua jazz yang tentang penyelundup dan bajak laut.
RADIO Announcer: Dengarkan besok malam untuk petualangan penutup
The Black Pirate Ship.
Sekarang, saatnya untuk Annie Pesan Rahasia untuk Anda anggota
Rahasia Circle.
Ingat anak-anak, hanya anggota Annie Rahasia Lingkaran
dapat memecahkan kode pesan rahasia Annie.
>> Ingat, Annie tergantung pada Anda.
Mengatur tanda Anda ke B-2.
Berikut adalah Message-- 12, 11, 2--
Ralphie PARKER (menceritakan): I berada di pertemuan rahasia pertama saya.
RADIO Announcer: --25, 14, 11, 18, 16--
Ralphie PARKER (menceritakan): Oh, Pierre berada di besar malam ini suara.
Saya bisa mengatakan bahwa malam ini Pesan itu benar-benar penting.
>> RADIO Announcer: --Kepar 3, 25.
Itu pesan dari Annie sendiri.
Ingat, jangan bilang siapa-siapa.
>> [Terengah-engah]
Ralphie PARKER (menceritakan): Sembilan puluh detik kemudian, aku
di satu-satunya kamar di rumah di mana anak laki-laki sembilan
bisa duduk dalam privasi dan decode.
Ah.
"B."
>> [Terkekeh]
>> Ralphie PARKER (menceritakan): Aku pergi ke yang berikutnya.
"E."
Kata pertama adalah "menjadi."
Ya!
Itu datang lebih mudah sekarang.
"U."
>> [Terkekeh]
>> RANDY PARKER: Aw, ayolah, Ralphie.
Aku harus pergi!
>> Ralphie PARKER: Aku akan segera turun, Ma.
Gee jagoan.
"T." "O." "Pastikan untuk. "" Pastikan untuk "apa?
Apa yang sedikit Orphan Annie coba katakan? "Pastikan untuk" apa?
IBU: Ralphie, Randy telah harus pergi.
Maukah kau keluar?
>> Ralphie PARKER: Baiklah, Mom!
Aku akan segera keluar!
Ralphie PARKER (menceritakan): Aku semakin dekat sekarang.
Ketegangan sangat mengerikan.
Apa itu?
Nasib planet mungkin menggantung di keseimbangan.
>> IBU: Ralphie, Randy harus pergi!
>> Ralphie PARKER: Aku akan segera out, menangis dengan suara keras!
Ralphie PARKER (Menceritakan): Almost there!
Jari-jariku terbang!
Pikiranku perangkap baja.
Setiap pori bergetar.
Itu hampir jelas!
Ya!
>> Ralphie PARKER: "Pastikan minum Ovaltine Anda. "
Ovaltine?
Sebuah iklan payah?
>> [MUSIC PLAYING]
>> Ralphie PARKER: Bajingan.
>> [Tertawa]
>> DAVID J. Malan: Sehingga kemudian adalah sekilas apa kriptografi
bisa untuk ini-- minum dari masa lampau.
Jadi pengumuman cepat.
Jika Anda bebas ini Jumat pukul 13:15 dan akan
ingin bergabung dengan kami untuk CS50 makan siang, menuju ke URL ini di sini.
Pertama datang, pertama melayani seperti biasa.
Namun seiring berjalannya waktu, kami akan memastikan bahwa kebanyakan orang yang ingin berpartisipasi
mungkin menjadwalkan-bijaksana.
>> Jadi string.
Kami memiliki Zamyla-- yang Anda sekarang sudah bertemu kemungkinan besar
Soal Set 1-- yang Nama dieja demikian.
Dan misalkan Anda mengetik namanya ke dalam program komputer yang
menggunakan sesuatu seperti getString.
Dalam rangka untuk mengambil penekanan tombol, bagaimana
kita pergi tentang mewakili String, kata, paragraf,
atau beberapa huruf seperti ini di sini?
>> Kami berbicara terakhir kali tentang bilangan bulat dan masalah
yang muncul dengan integer overflow dan nilai floating point
dan masalah yang muncul dalam presisi.
Dengan string, setidaknya kita memiliki fleksibilitas sedikit lebih
karena strings-- hanya di dunia-- nyata
bisa menjadi panjang yang cukup sewenang-wenang.
Cukup singkat, cukup panjang.
Tetapi bahkan kemudian, kita akan menemukan bahwa komputer kadang-kadang dapat
kehabisan memori dan bahkan tidak menyimpan cukup tali besar.
>> Tapi untuk saat ini, mari kita mulai untuk memvisualisasikan string sebagai sesuatu di kotak-kotak ini
di sini.
Jadi enam kotak tersebut, masing-masing merupakan karakter atau "char."
Jadi ingat bahwa "char" - c-h-a-r-- adalah salah satu tipe data built-in di C.
Dan apa yang baik adalah bahwa Anda dapat menggunakan semacam sebagai sebuah blok bangunan,
sepotong puzzle, jika Anda mau, untuk membentuk Jenis yang lebih besar dari data yang kami akan terus
untuk memanggil "string."
>> Sekarang, apa yang berguna tentang berpikir tentang hal-hal seperti string dengan cara ini?
Nah, ternyata kita bisa benar-benar memanfaatkan struktur ini
untuk benar-benar mengakses karakter individu dengan cara cukup sederhana.
Aku akan pergi ke depan dan menciptakan sebuah file yang bernama "stringzero.c,"
tetapi Anda dapat menyebutnya apa pun yang Anda inginkan.
Dan di website program adalah sudah contoh ini di muka,
sehingga Anda tidak perlu ketik semuanya.
>> Dan aku akan pergi ke depan dan pertama kali melakukan int void main.
Dan dalam beberapa hari, kita akan mulai menggoda terpisah
apa batal sini, mengapa hal itu int sebelah utama, dan sebagainya.
Tapi untuk saat ini, mari kita lanjutkan copy paste itu.
>> Aku akan mendeklarasikan string disebut s.
Dan aku akan kembali dari GetString apapun jenis pengguna dalam.
Ini akan menjadi sederhana Program, tak ada instruksi,
Aku hanya akan membuta berharap bahwa pengguna mengetahui
apa yang harus dilakukan untuk tetap sederhana.
>> Dan sekarang aku akan memiliki untuk loop.
Dan dalam untuk loop saya, saya akan memiliki int i mendapat nol.
Dan saya adalah, sekali lagi, hanya konvensi, variabel indeks untuk menghitung,
tapi aku bisa menyebutnya apa pun yang saya inginkan.
Aku akan melakukan i kurang than-- baik Nama Zamyla adalah enam huruf.
Jadi aku akan sulit kode yang ada untuk saat ini.
>> Dan kemudian saya ++.
Dan sekarang dalam ini keriting braces Aku akan melakukan printf,
dan saya ingin mencetak satu karakter pada satu waktu.
Jadi aku akan menggunakan% c untuk mungkin untuk pertama kalinya.
Dan kemudian saya ingin mencetak setiap karakter pada baris sendiri.
Jadi aku akan menempatkan sedikit backslash n di sana.
Tutup kutipan.
>> Dan sekarang saya ingin melakukan sesuatu di sini.
Saya ingin mencetak huruf tertentu dalam string,
s, karena saya iterasi dari nol pada hingga enam.
Dengan kata lain, saya ingin mencetak karakter i'th dari s.
Sekarang bagaimana saya bisa melakukan ini?
>> Nah seperti kotak di representasi ini di sini,
jenis, menyulap gagasan tinju surat, Anda sama bisa melakukan itu
sintaksis di C dengan hanya menetapkan, Saya ingin mencetak s i'th karakter.
Menggunakan tanda kurung siku pada keyboard komputer Anda
bahwa pada keyboard AS umumnya di atas tombol kembali Anda.
>> Jadi ini tidak benar Namun, karena Anda mungkin telah memperhatikan.
Tapi aku akan jenis membabi buta maju di sini.
Dan aku akan melakukan membuat tali 0.
Tapi sebelum aku melakukan ini, mari kita lihat apakah kita tidak bisa mengantisipasi beberapa kesalahan umum.
Apakah ini akan mengkompilasi?
Tidak, aku kehilangan sejumlah hal.
Perpustakaan saya dengar.
>> Jadi yang file header mungkin saya ingin menambahkan di sini?
Ya.
>> AUDIENCE: Anda perlu standar I / O [Tak terdengar]
>> DAVID J. Malan Excellent.
Jadi saya perlu standar I / O. Untuk apa Tujuan yang ingin saya standar I / O?
Untuk printf.
Jadi termasuk stdio.h.
Dan Anda juga mengusulkan bahwa saya termasuk perpustakaan CS50 untuk alasan apa?
Untuk memiliki string.
Jadi kita akan melihat apa yang Perpustakaan CS50 adalah melakukan
untuk membuat gagasan ini string.
Tapi untuk saat ini, Anda hanya bisa memikirkan itu sebagai tipe data aktual.
>> Sehingga tampaknya sedikit yang dibersihkan.
Dan sekarang aku akan pergi ke depan dan memang benar membuat tali 0.
Disusun.
Jadi itu bagus.
Jadi ./string0 biarkan aku memperbesar sehingga kami dapat melihat lebih dekat apa yang terjadi.
Enter.
Z-A-M-Y-L-A masuk.
Dan kami telah dicetak nama Zamyla ini.
>> Jadi itu cukup bagus.
Jadi sekarang mari kita pergi ke depan dan menjalankan program ini lagi,
dan mengetikkan nama lengkap Daven ini.
Surprise, surprise.
Enter.
Hmm.
Kami belum dicetak Daven ini penuh pertama nama dengan benar.
Sekarang ini harus jelas di retrospeksi karena apa,
semacam, keputusan desain bodoh?
>> Ya, saya sulit kode tersebut enam dalam saya untuk loop.
Sekarang saya melakukan itu hanya karena Aku tahu nama Zamyla ini
akan menjadi enam huruf.
Tapi tentunya hal ini tidak solusi umum.
Jadi ternyata kita dapat secara dinamis mengetahui panjang string
dengan memanggil fungsi yang disebut strlen.
>> Sekali lagi, sengaja ringkas bernama hanya
untuk membuatnya lebih nyaman untuk mengetik.
Tapi itu identik dengan mendapatkan panjang string.
Aku akan kembali ke terminal saya jendela dan kembali menjalankan compiler.
Tapi itu berteriak padaku.
Secara implisit menyatakan fungsi perpustakaan strlen dengan tipe unsigned int const--
Saya tersesat.
Benar-benar.
>> Jadi, terutama karena Anda mata mulai berkaca-kaca
dengan pesan error seperti ini, fokus jujur ​​pada beberapa kata pertama.
Kita tahu masalahnya adalah dalam baris 8, seperti yang ditunjukkan di sini.
Dan itu dalam string-0.c.
Secara implisit menyatakan fungsi library strlen.
Sehingga umumnya akan menjadi pola pesan kesalahan.
Secara implisit menyatakan sesuatu.
>> Jadi singkatnya, apa yang harus saya sepertinya telah dilakukan sehubungan dengan baris 8, di sini.
Apa yang mungkin menjadi solusi bahkan jika Anda belum pernah menggunakan strlen diri sendiri?
>> AUDIENCE: Bagian dari perpustakaan yang berbeda?
DAVID J. Malan: Part dari perpustakaan yang berbeda.
Jadi dinyatakan, sehingga untuk berbicara.
Hal ini disebutkan dalam beberapa berkas selain stdio.h dan CS50.h.
Sekarang mana itu didefinisikan?
Sejujurnya, Anda juga harus hanya tahu ini dari atas kepala Anda,
atau Anda Google ini dan mencari tahu.
Atau tahu ini, aku sudah dibuka di CS50 appliance program terminal, yang
hanya besar, versi layar penuh apa yang ada di bagian bawah jendela gedit ini.
>> Dan ternyata ada perintah sama ringkas, yang disebut
man untuk manual, di mana jika Anda mengetik nama fungsi dan tekan Enter,
Anda akan mendapatkan kembali cukup dokumentasi misterius.
Hanya saja teks yang umumnya terlihat sedikit sesuatu seperti ini.
Ini sedikit berlebihan pada pandangan pertama.
Tapi terus terang saya akan biarkan mataku berkaca-kaca
dan hanya fokus pada bagian Saya peduli untuk saat ini.
>> Yang ini.
Yang terlihat struktural seperti sesuatu yang saya kenal.
Memang halaman manual, sehingga untuk berbicara, akan memberitahu Anda
dalam apa sundulan mengajukan fungsi seperti strlen didefinisikan.
Jadi aku akan kembali sekarang untuk gedit.
Dan aku akan pergi ke depan dan menambahkan sini # include
dan menyimpan file.
>> Aku akan membersihkan layar dengan Kontrol L Jika Anda sudah bertanya-tanya.
Dan aku akan kembali menjalankan make string.0, mengkompilasi kali ini.
./string.0 Zamyla.
Itu tampaknya bekerja Biarkan aku pergi depan dan memutarkan dengan Davenport.
Enter.
Dan itu juga, tampaknya bekerja.
>> Jadi kita bisa melakukan sedikit lebih baik dari ini, meskipun, kita dapat mulai hal-hal rapi
up hanya sedikit.
Dan aku akan benar-benar memperkenalkan satu hal lain sekarang.
Aku akan pergi ke depan dan simpan ini dalam file yang berbeda.
Dan aku akan menelepon File string1.c ini hanya
agar sesuai dengan kode Anda akan dapat menemukan secara online.
>> Dan mari kita fokus pada kode yang sama persis.
Ternyata bahwa saya telah menjadi semacam mengambil
begitu saja fakta bahwa laptop saya, dan pada gilirannya, alat CS50
memiliki banyak memori, banyak RAM, banyak byte ruang
di mana saya dapat menyimpan string.
>> Tetapi kenyataannya jika saya mengetik panjang cukup, dan cukup keystrokes,
Aku bisa dalam jenis teori lebih karakter
dari komputer saya secara fisik memiliki memori untuk.
Dan ini bermasalah.
Sama seperti int hanya dapat menghitung begitu tinggi, dalam teori,
Anda hanya bisa menjejalkan begitu banyak karakter ke dalam RAM komputer Anda atau Random
Access Memory.
>> Jadi saya lebih baik mengantisipasi masalah ini, bahkan
meskipun mungkin langka kasus sudut, sehingga untuk berbicara.
Tidak terjadi yang sering, bisa terjadi.
Dan jika itu terjadi dan saya tidak mengantisipasi dan program itu,
program saya bisa melakukan yang tahu apa.
Freeze, menggantung, reboot, apa pun.
Sesuatu diantisipasi mungkin terjadi.
>> Jadi apa yang saya lakukan sekarang, selanjutnya benar-benar,
adalah sebelum saya pernah membabi buta menggunakan variabel seperti s yang
telah ditetapkan nilai pengembalian beberapa fungsi lain seperti GetString,
Aku akan memastikan bahwa nilai valid.
Jadi saya tahu hanya dari setelah membaca Dokumentasi CS50 untuk GetString,
yang pada akhirnya kami akan mengarahkan Anda pada, GetString yang mengembalikan simbol khusus
disebut NULL, N-U-L-L di semua caps, jika terjadi kesalahan.
>> Jadi biasanya, ia mengembalikan string.
Tapi sebaliknya jika ia mengembalikan N-U-L-L-- pada akhirnya kita akan melihat apa yang benar-benar
means-- itu hanya berarti sesuatu yang buruk terjadi.
Sekarang ini berarti, seperti di Scratch, Saya dapat memeriksa kondisi di sini di C,
jika s tidak NULL sama.
Jadi jika Anda tidak melihat ini sebelumnya, ini hanya berarti tidak sama.
>> Jadi kebalikan dari equals sama, yang, ingat,
berbeda dari satu sama, yaitu tugas.
Jadi, jika s tidak sama dengan NULL, hanya kemudian melakukan
Saya ingin mengeksekusi baris kode.
Jadi dengan kata lain, sebelum saya menyelam di membabi buta
dan mulai iterasi lebih dari s, dan memperlakukannya
seolah-olah itu adalah urutan karakter, aku akan periksa dulu,
tunggu dulu, ini pasti tidak s sama dengan nilai khusus ini, NULL?
>> Karena jika demikian, hal-hal buruk bisa terjadi.
Dan untuk saat ini, menganggap hal-hal yang buruk terjadi berarti crash program Anda,
dan Anda tidak dapat selalu pulih.
Jadi terus terang, terlihat jelek.
itu agak membingungkan sekarang untuk melirik.
Tapi ini akan menjadi lebih akrab sebelum lama.
>> Tapi aku akan mengusulkan sekarang salah satu perbaikan lainnya.
Itu perbaikan untuk kebenaran.
Program saya sekarang lebih benar, karena dalam kasus yang jarang terjadi yang tidak cukup memori
ada, saya akan menanganinya, dan aku hanya akan melakukan apa-apa.
Aku setidaknya tidak akan crash.
>> Tapi mari kita lakukan versi terakhir di sini.
Dan file bernama string2.c.
Aku akan menempelkan kode yang sama untuk sesaat,
dan aku akan menyoroti ini line, 11, di sini, untuk sesaat.
Sekarang kenyataannya adalah bahwa kompiler pintar seperti dentang bisa memperbaiki ini bagi kita
di balik layar tanpa kita pernah tahu.
Tapi mari kita berpikir tentang hal ini fundamental sebagai desain bermasalah.
>> Baris kode ini, tentu saja, mengatakan, menginisialisasi beberapa variabel i dengan 0.
Itu cukup sederhana.
Dan apa lagi yang ini pernyataan, di sini, i ++, lakukan?
Kami telah melihat itu sebelumnya, tapi kami tidak benar-benar berbicara tentang hal itu.
>> AUDIENCE: Incrementing i.
>> DAVID J. Malan: Incrementing i.
Jadi pada setiap iterasi melalui lingkaran ini, setiap siklus,
Anda incrementing i per satu.
Jadi akan lebih besar, dan lebih besar, dan besar sampai loop berakhir.
Bagaimana mengakhiri?
Yah ada tengah ini kondisi yang kami telah digunakan sebelumnya.
Anda telah melihat dan walkthrough di P set.
>> Tapi apa pepatah ini?
Lakukan loop berikut sehingga selama i kurang dari apa?
AUDIENCE: Panjang string.
DAVID J. Malan: The panjang string.
Jadi diterjemahkan cukup bersih ke Inggris dalam arti itu.
Sekarang masalahnya adalah bahwa setiap kali saya iterate melalui lingkaran ini dalam teori,
Aku bertanya pertanyaan ini.
Apakah saya kurang dari panjang string s?
>> Sekarang ini saya berubah pada setiap iterasi?
Hal ini.
Karena ++ tersebut.
Jadi setiap iterasi i semakin besar.
Tapi s semakin besar, atau lebih kecil, atau mengubah sama sekali?
Nomor
Jadi dalam hal desain, salah satu sumbu sepanjang yang kita mencoba untuk mengevaluasi kode
di kelas, ini terasa agak bodoh.
>> Seperti Anda benar-benar, pada setiap iterasi
loop ini meminta pertanyaan sialan yang sama lagi,
dan lagi, dan lagi, dan benar-benar itu tidak akan pernah berubah.
Setidaknya jika aku tidak menyentuh dan mencoba untuk mengubah isi s.
Jadi aku bisa melakukan sedikit lebih baik daripada ini.
>> Dan apa yang akan saya lakukan adalah tidak menyatakan hanya satu variabel i,
tapi variabel kedua aku akan sewenang-wenang, tapi konvensional, sebut saja n.
Menetapkan n sama dengan panjang string s.
Dan kemudian di sini, aku akan melakukan optimasi kecil yang pintar, sehingga
untuk berbicara, bahwa pada akhir hari tidak lebih benar atau tidak kurang benar
dari sebelumnya.
Tapi itu desain yang lebih baik.
Dalam fakta bahwa saya menggunakan waktu kurang, siklus CPU yang lebih sedikit, sehingga
untuk berbicara, untuk menjawab hal yang sama pertanyaan, tapi hanya sekali.
>> Pertanyaan umum yang prinsip membaik,
mengatakan, efisiensi program ini?
Ya?
AUDIENCE: Mengapa Anda gunakan [Tak terdengar]?
DAVID J. Malan: Pertanyaan yang bagus.
Jadi mengapa kita menempatkan ++ pada akhir i bukan awal i?
Dalam hal ini, ia memiliki tidak berdampak fungsional.
Dan secara umum, saya cenderung untuk menggunakan operator postfix
sehingga sedikit lebih jelas ketika operasi terjadi.
>> Bagi mereka yang tidak terbiasa, ada lagi laporan dimana Anda bisa melakukan ++ i.
Ini adalah fungsional setara dalam hal ini
karena tidak ada yang lain sekitar incrementation itu.
Tapi Anda bisa datang dengan kasus dan baris kode
di mana yang membuat perbedaan.
Jadi secara umum, kita tidak bahkan berbicara tentang yang satu ini.
Karena terus terang, itu membuat Anda kode seksi, dan semacam jas hujan,
dan karakter yang lebih sedikit.
Tetapi kenyataannya adalah itu jauh lebih sulit, Saya pikir, bahkan bagi saya untuk membungkus pikiran saya
sekitar kadang-kadang, urutan operasi.
Jadi sebagai samping, jika Anda benar-benar tidak suka ini,
meskipun ini adalah jenis seksi mencari, Anda juga dapat melakukan i + = 1,
yang merupakan versi lebih buruk dari ide yang sama untuk postfix incrementation.
>> Saya mengatakan ini dan Anda harus membuat bersenang-senang,
tetapi Anda akan datang untuk melihat kode sebagai sesuatu yang indah sebelum lama.
>> [Tertawa]
>> DAVID J. Malan: Benar?
Ya.
Pertanyaan di tengah.
>> AUDIENCE: Apakah Anda perlu untuk mengatakan int n?
DAVID J. Malan: Anda melakukan tidak perlu mengatakan int n.
Jadi karena kita sudah mengatakan int, Anda tidak perlu mengatakannya lagi.
Menangkap adalah bahwa n harus menjadi tipe data yang sama seperti yang saya.
Jadi itu hanya kenyamanan di sini.
Ya.
>> AUDIENCE: Dapatkah Anda pergi ke cetak karakter s braket saya lagi?
DAVID J. Malan: Tentu saja.
Jadi% c, ingat dari terakhir waktu, hanya penampung.
Ini berarti menempatkan char di sini.
backslash n, tentu saja, hanya berarti menempatkan satu baris di sini.
Sehingga hanya daun, sekarang, ini bagian dari sintaks baru.
Dan ini benar-benar berkata, ambil string disebut s dan pergi mendapatkan nya
karakter i'th, sehingga untuk berbicara.
>> Dan saya selalu mengatakan karakter i'th karena pada setiap iterasi dari loop ini
itu seolah-olah kita mencetak , pertama s braket 0,
sebagai seorang programmer mungkin mengatakan.
Kemudian s bracket 1, maka s braket 2, kemudian 3, kemudian 4.
Tapi tentu saja itu sebuah variabel, jadi aku hanya mengungkapkannya dengan i.
>> Key, meskipun, adalah untuk mewujudkan, terutama jika Anda tidak sudah
telah acclimating ke dunia ini pemrograman, di mana kita semua
tampaknya dihitung mulai dari nol, harus mulai menghitung dari nol sekarang.
Karena string, karakter pertama, z di Zamyla untuk lebih baik atau buruk
akan tinggal di lokasi angka nol.
>> Baiklah, jadi biarkan aku membawa kita kembali di sini untuk Zamyla
dan melihat apa yang sebenarnya terjadi di bawah kap mesin.
Jadi ada gagasan dari tipe casting.
Anda mungkin telah benar-benar bermain dengan ini sudah,
mungkin bagi hacker edisi P menetapkan satu.
Tapi tipe casting hanya mengacu pada kemampuan dalam C dan beberapa bahasa lain
mengkonversi satu tipe data yang lain.
>> Sekarang bagaimana mungkin kita melihat ini cukup tedeng aling-aling?
Jadi ini, ingat, adalah awal dari abjad Inggris.
Dan konteksnya, ingat, dari seperti tahun lalu adalah ASCII.
The American Standard Kode untuk Informasi Interchange.
Yang hanya cara yang sangat panjang mengatakan pemetaan dari huruf
untuk angka, dan dari nomor surat-surat.
>> Jadi A sampai M sini, dot dot dot, garis dengan, ingat,
angka desimal 65 ke atas.
Dan kita tidak bicara tentang hal ini secara eksplisit,
tapi pasti ada yang sama angka untuk huruf kecil.
Dan memang, ada.
Dunia memutuskan beberapa tahun lalu yang sedikit sebuah, huruf kecil a,
akan menjadi 97.
Dan sedikit b akan menjadi 98, dan sebagainya.
>> Dan untuk tombol lain pada keyboard, ada
akan menjadi pola yang sama bit.
Atau dengan kata lain, angka desimal.
Jadi pertanyaan di tangan, kemudian, adalah bagaimana kita bisa
benar-benar melihat ini di bawah tenda?
Jadi aku akan pergi ke gedit lagi.
Dan bukan tipe yang satu ini dari awal,
Aku akan pergi ke depan dan hanya membuka sesuatu
dari kode hari ini disebut ASCII nol.
>> Dan ASCII nol terlihat seperti ini.
Jadi mari kita membungkus pikiran kita sekitar ini.
Jadi pertama, saya sudah berkomentar kode, yang bagus.
Karena itu benar-benar mengatakan apa yang akan terjadi,
menampilkan pemetaan untuk huruf besar.
Sekarang aku tak tahu apa yang saya maksud dengan itu, jadi mari kita menyimpulkan.
>> Dalam bahasa Inggris, mungkin agak teknisi Inggris,
apa baris 18 muncul untuk melakukan bagi kita?
Baris hanya 18.
Apa itu merangsang?
Apa itu akan kick off di sini?
>> AUDIENCE: Sebuah lingkaran.
>> DAVID J. Malan: Sebuah loop.
Dan berapa kali adalah yang akan iterate?
AUDIENCE: [interposing SUARA] enam kali.
DAVID J. Malan: Tidak enam kali.
AUDIENCE: 26 kali.
DAVID J. Malan: 26 kali.
Ya, maaf.
26 kali.
Mengapa?
Nah, itu sedikit aneh, tapi Saya sudah mulai menghitung dari 65.
Yang aneh, tapi tidak salah.
Ini tidak buruk per mengatakan.
Dan aku melakukan itu hanya karena, misalnya ini,
Aku agak mengantisipasi bahwa modal A adalah 65.
Sekarang ini bukan yang paling elegan cara untuk melakukan ini, untuk jenis kode keras
Nilai-nilai esoteris bahwa tidak ada satu yang pernah diharapkan untuk mengingat.
>> Tapi untuk saat ini, melihat bahwa aku melakukan hal ini melalui 65 ditambah 26.
Karena ternyata saya bahkan tidak ingin untuk melakukan aritmatika di kepalaku.
Jadi aku akan membiarkan compiler melakukannya.
Tapi kemudian pada setiap loop, setiap iterasi loop, aku incrementing i.
>> Jadi sekarang ini terlihat sedikit samar.
Tapi kita harus memiliki bangunan dasar blok yang dapat digunakan untuk memahami hal ini.
% C hanya sebuah tempat untuk char.
% I merupakan tempat bagi int.
Dan ternyata bahwa dengan menggunakan ini sintaks baru, kurung ini, sehingga
untuk berbicara, sehingga tipe data dalam tanda kurung a,
Aku bisa memaksa compiler untuk mengobati saya tidak adalah bilangan bulat, tetapi sebagai char.
>> Dengan demikian menunjukkan kepada saya karakter setara dengan jumlah tersebut.
Sekarang di sini, kode ini cukup banyak identik.
Aku hanya ingin membuat Super eksplisit fakta
bahwa aku mulai pada 97, yang huruf kecil a.
Pada melalui 26 huruf lainnya.
Dan aku lakukan-- lagi, pengecoran i, sehingga untuk berbicara.
Atau tipe casting i, sehingga untuk berbicara.
>> Dari int ke char.
Jadi hasil akhirnya akan menjadi, terus terang, informasi yang kita sudah tahu.
Aku akan membuat ascii-0 tidak dot-- dot c.
Perhatikan, Anda mungkin dibuat bahwa kesalahan karena aku baru saja melakukannya tanpa sengaja.
Membuat ascii-0.
Sekarang aku akan melakukan ./ascii-0.
Aku akan memperbesar, dan sayangnya itu akan menggulir dari layar.
Tapi kita melihat seluruh grafik dimana sebuah peta ke 97, peta b ke 98,
dan jika kita gulir ke atas lebih lanjut A, tentu saja, peta ke 65.
Jadi ini hanya untuk mengatakan bahwa apa yang kita telah berkotbah,
ada kesetaraan ini, sebenarnya terjadi dalam kenyataan.
Jadi modifikasi cepat ini.
Biarkan aku membuka ascii-1.c.
Dan melihat ini pintar, semacam dari, klarifikasi ini.
Ini adalah ascii-1.c, dan melihat hal gila ini.
>> Dan ini benar-benar sampai ke hati apa komputer lakukan.
Meskipun kita manusia akan tidak dihitung dalam hal letters--
Saya tidak mulai berpikir, baik-baik kemudian b,
dan menggunakan mereka untuk menghitung benda-benda fisik.
Anda pasti bisa mengatakan bahwa saya ingin menginisialisasi beberapa variabel yang disebut c--
tapi aku bisa menelepon anything-- ini jadi c diinisialisasi ke ibukota A.
>> Karena pada akhir hari, komputer tidak peduli apa yang Anda menyimpan,
hanya peduli bagaimana Anda ingin untuk menyajikan informasi tersebut.
Bagaimana Anda ingin komputer untuk menafsirkan bahwa pola bit?
Jadi ini bukan sesuatu yang saya umumnya akan merekomendasikan melakukan.
Ini benar-benar hanya sebuah contoh untuk menyampaikan bahwa Anda dapat benar-benar
menginisialisasi sebuah integer ke char.
Karena di bawah kap char, tentu saja,
hanya nomor dari 0 sampai 255.
>> Jadi, Anda pasti bisa memasukkannya ke dalam sebuah int.
Dan apa ini juga menunjukkan adalah bahwa kita
dapat mengkonversi dari satu ketik ke yang lain, di sini,
akhirnya mencetak hal yang sama.
Dan pada kenyataannya, ini saya akan memperbaiki online-- dimaksudkan untuk mengatakan ini, sekali lagi, di sini.
Biarkan aku membersihkan ini secara online, dan kami akan lihat dalam walkthrough secara online sesuai kebutuhan,
apa yang dimaksudkan di sana.
>> OK.
Contoh Jadi terakhir sekarang melibatkan a dan b dan kemudian kita akan
mengambil hal-hal membuat takik.
Jadi dengan dan b dan c di kapitalisasi
dan kesetaraan daripadanya, mari kita kita lihat contoh ini, di sini.
Contoh kode lain.
Kami akan membuka satu yang sudah dibuat, jadi kami
tidak perlu mengetiknya semua keluar dari awal.
>> Dan melihat di antisipasi kami menggunakan beberapa kepala
file, di antaranya adalah teman baru kami, string.h.
Sekarang ini terlihat, pada awalnya sekilas, agak samar.
Tapi mari kita lihat apakah kita tidak bisa alasan melalui apa yang terjadi di sini.
Pertama saya mendapatkan string dari pengguna, dan saya menaruh string yang dalam variabel
disebut s.
Copy paste dari sebelumnya.
Sejalan 22, aku rupanya melakukan apa
Saya melakukan beberapa saat yang lalu, aku iterasi lebih karakter dalam s.
>> Dan trik baru di sini menggunakan panjang string, optimasi kecil
menyimpan panjang string n, daripada menelepon strlen lagi,
dan lagi, dan lagi.
Dan hanya memeriksa bahwa saya kurang dari n.
Sekarang di sini, hal-hal sedikit menarik.
Tapi itu hanya sebuah aplikasi ide baru ini sama.
Apa dalam bahasa Inggris tidak s braket i mewakili?
>> AUDIENCE: Menghitung setiap Karakter [Tak terdengar].
>> DAVID J. Malan: Menghitung masing-masing karakter.
Dan bahkan lebih ringkas, s braket saya mewakili apa?
Akan Anda katakan.
Tidak untuk menempatkan Anda di tempat di sini.
>> AUDIENCE: Well--
DAVID J. Malan: Jadi jika kata Ini-- jika string adalah Zamyla, yang starts--
AUDIENCE: --you berurusan dengan karakter separately--
DAVID J. Malan: Good.
Tepat.
Notasi persegi braket memungkinkan Anda untuk mengakses masing-masing karakter individu,
sehingga s braket 0 akan menjadi karakter pertama dalam string.
s bracket 1 akan menjadi yang kedua, dan sebagainya.
Jadi pertanyaan saya bertanya, di sini, dalam kondisi ini adalah apa?
Apakah karakter i'th dari s lebih besar dari atau sama dengan huruf kecil a?
Dan apa artinya ini, di sini, dengan ampersands ganda?
AUDIENCE (BERSAMA): Dan.
DAVID J. Malan: Dan.
Hanya saja setara dengan ini.
Dan bukan merupakan kata kunci dalam C, Anda harus digunakan, mengganggu, ampersand ampersand.
Dan ini, sebaliknya, meminta adalah s i'th karakter kurang dari atau sama
huruf kecil z?
Dan lagi, di sinilah memahami mendasari
pelaksanaan komputer masuk akal.
Perhatikan bahwa, meskipun saya memiliki dot dot dot di sana,
tampak seperti melalui z dalam huruf kecil yang semua nilai yang berdekatan naik dari 97 ke atas.
>> Dan sama untuk huruf besar mulai dari 65.
Jadi takeaway, kemudian, adalah bahwa dalam bahasa Inggris,
bagaimana Anda akan menjelaskan apa baris 24 dilakukan?
Ya?
>> AUDIENCE: Pada tanggal 24 itu memeriksa untuk melihat apakah masing-masing karakter huruf kecil a.
DAVID J. Malan: Ini memeriksa apakah masing-masing karakter adalah huruf kecil.
Jadi, bahkan lebih ringkas, adalah karakter i'th dari s huruf kecil?
Itu semua kita mengekspresikan sini logis,
sedikit samar, tapi akhirnya cukup tedeng aling-aling.
Apakah s i'th karakter huruf kecil?
>> Jika demikian, dan di sinilah hal-hal mendapatkan pikiran sedikit membungkuk
untuk sesaat, jika demikian, pergi depan dan mencetak karakter.
Jadi ini hanya pengganti, tapi apa karakter?
Mengapa saya melakukan s braket i dikurangi ungkapan ini di sini?
>> Nah melihat pola di sini.
Angka-angka yang sebenarnya tidak penting begitu banyak.
Tetapi perhatikan bahwa 97 adalah seberapa jauh dari 65?
>> AUDIENCE: 32.
>> DAVID J. Malan: 32.
Seberapa jauh 98 dari 66?
>> AUDIENCE: 32.
>> DAVID J. Malan: Little c dari besar C?
32.
Jadi ada 32 hop dari satu huruf yang lain.
Jadi terus terang saya, bisa menyederhanakan ini itu.
Tapi kemudian aku agak sulit coding Pemahaman ini tingkat rendah
bahwa tidak ada pembaca yang pernah akan mengerti.
Jadi aku akan menggeneralisasi sebagai, saya mengetahui huruf kecil lebih besar.
Aku tahu huruf kapital yang nilai-nilai yang lebih kecil, ironisnya.
>> Tapi ini efektif setara dengan mengatakan kurangi 32 dari s braket i.
Jadi dalam konteks ini surat, jika surat itu
kebetulan, huruf kecil , dan aku kurangi 32,
apa efek yang yang memiliki, matematis, pada huruf kecil a?
AUDIENCE: Capitalizes--
DAVID J. Malan: mengkapitalisasi itu.
Dan memang, inilah sebabnya kami Program ini disebut memanfaatkan nol.
Program ini baik mengkapitalisasi huruf a,
setelah memeriksa jika memang huruf kecil.
Jika tidak, di baris 30, apa yang harus saya lakukan jika itu bukan huruf kecil bahwa aku
melihat pada tertentu iterasi dalam lingkaran.
Hanya print.
>> Jadi tidak mengubah hal-hal itu tidak bahkan huruf kecil.
Batasi diri Anda untuk sedikit melalui sedikit z.
Sekarang ini cukup misterius.
Tetapi pada akhir hari, ini adalah bagaimana kita, sekali waktu,
harus menerapkan hal.
Jika saya bukan terbuka memanfaatkan satu, oh terima kasih Tuhan.
Ada fungsi dipanggil untuk atas yang dapat
melakukan segala sesuatu yang kita hanya melakukan pada tingkat yang cukup rendah.
>> Sekarang untuk bagian atas menarik karena ini dideklarasikan pada file,
dan Anda hanya akan tahu ini dengan memeriksa dokumentasi,
atau diberitahu, misalnya, di kelas, di mana itu ada, dalam sebuah file bernama ctype.h.
Jadi ini adalah teman baru yang lain dari kita.
Dan untuk bagian atas tidak persis apa namanya.
>> Anda dapat lulus dalam, sebagai argumen, antara kurung ini, beberapa karakter.
Aku akan lulus dalam karakter i'th dari s menggunakan notasi mewah baru
melibatkan kurung persegi.
Dan mengambil menebak, apa yang return nilai untuk atas tampaknya akan
untuk menjadi?
Sebuah huruf kapital.
>> Jadi jika saya lulus dalam huruf kecil a, mudah-mudahan, berdasarkan definisi untuk bagian atas,
itu akan mengembalikan huruf A. Jika tidak,
jika itu bukan huruf kecil di tempat pertama, saya hanya mencetaknya.
Dan memang, perhatikan teman kedua di sini.
Tidak hanya untuk bagian atas ada, tetapi lebih rendah, yang
sebenarnya menjawab pertanyaan itu untuk saya.
>> Sekarang siapa pun yang menulis hal-hal ini, 10-an tahun yang lalu, kau tahu apa?
Diterapkan untuk bagian atas dan menurunkan menggunakan kode seperti ini.
Tapi sekali lagi, konsisten dengan Ide ini abstrak pergi,
semacam, tingkat yang lebih rendah rincian pelaksanaan.
Dan berdiri di pundak orang yang datang sebelum kami, menggunakan fungsi
seperti untuk bagian atas dan bawah, yang cukup mengagumkan adalah baik
ditunjuk untuk mengatakan apa yang mereka lakukan, adalah paradigma yang indah untuk mengadopsi.
>> Sekarang, ternyata bahwa jika saya membaca halaman manual untuk, mengatakan, untuk bagian atas,
Saya belajar sesuatu yang lain.
Jadi pria toupper.
Ini sedikit luar biasa.
Tapi perhatikan, inilah yang menyebutkan file header yang harus saya gunakan.
Sebagai samping, karena ini menyesatkan, fungsi
menggunakan int bukan karakter karena alasan pengecekan error.
Tapi kita mungkin akan datang kembali ke di masa depan.
>> Tapi perhatikan, di sini, untuk bertobat atas huruf c ke huruf besar jika mungkin.
Jadi itu cukup sederhana.
Dan sekarang mari kita menjadi sedikit lebih spesifik.
Mari kita lihat bagian dari halaman manual di bawah nilai kembali.
Nilai yang dikembalikan adalah bahwa surat dikonversi.
Atau c, jika konversi tidak mungkin,
di mana c adalah input asli.
Yang saya tahu dari sini, dari argumen untuk ke atas.
>> Jadi apa adalah takeaway ini?
Nilai yang dikembalikan adalah bahwa surat dikonversi,
atau c, surat asli, jika konversi itu tidak mungkin.
Apa perbaikan bisa karena itu saya membuat desain kode saya?
Ya?
>> AUDIENCE: Anda dapat menghapus yang lain itu.
DAVID J. Malan: aku bisa menghapus pernyataan lain,
, bukan hanya pernyataan lain.
>> AUDIENCE: Anda dapat menghapus [Tak terdengar].
>> DAVID J. Malan: aku bisa menghapus seluruh garpu
di jalan, jika yang lain sama sekali.
Jadi memang, biarkan aku membuka versi final ini,
memanfaatkan-2 dan perhatikan betapa, jika Anda akan, seksi, kode ini kini semakin,
bahwa saya telah berkurang dari beberapa tujuh atau lebih baris untuk hanya empat,
fungsionalitas yang aku berniat hanya dengan menelepon ke atas,
lewat di s braket i, dan pencetakan keluar, dengan placeholder% c,
bahwa karakter tertentu.
>> Sekarang bisa dibilang, ada bug, atau setidaknya risiko bug,
dalam program ini.
Jadi hanya untuk kembali ke takeaway sebelumnya,
apa yang harus saya mungkin juga dilakukan di Program ini untuk membuatnya lebih kuat,
sehingga tidak ada cara itu bisa kecelakaan, bahkan dalam kasus yang jarang terjadi?
AUDIENCE: Pastikan itu tidak NULL.
DAVID J. Malan: Pastikan itu tidak NULL.
Jadi benar-benar, untuk membuat super tepat, saya harus melakukan sesuatu seperti,
jika s tidak NULL, maka pergi ke depan dan mengeksekusi
baris kode, yang Saya kemudian dapat indent seperti itu,
dan kemudian dimasukkan ke dalam penjepit dekat saya.
Jadi baik mengikat bersama-sama dari dua ide.
Ya?
AUDIENCE: Bisakah Anda menggunakan a lakukan while, bukan?
DAVID J. Malan: Bisa Saya melakukan do while?
AUDIENCE: --you ingin memastikan bahwa Anda benar-benar [Tak terdengar].
DAVID J. Malan: Bisa Anda menggunakan do sementara?
Jawaban singkat, tidak.
Karena kau akan memperkenalkan kasus sudut lain.
Jika string adalah panjang nol.
Jika misalnya, saya hanya memukul Masukkan, tanpa pernah mengetik Zamyla.
Aku akan menyerahkan kembali aktual String, seperti yang kita akhirnya akan melihat,
yang memiliki nol karakter.
Ini masih string, itu hanya super pendek.
Tetapi jika Anda menggunakan do sementara, Anda akan membabi buta
mencoba melakukan sesuatu dengan menghormati ke string itu,
dan tidak ada yang akan berada di sana.
>> AUDIENCE: Nah, jika Anda melakukan lakukan [Tak terdengar] sementara s--
DAVID J. Malan: Oh, begitu, tetap mendapatkan string dari pengguna.
Jawabannya begitu singkat, Anda bisa, dan terus mengganggu
mereka untuk memberikan string yang cukup pendek untuk muat di memori.
Tentu saja.
Aku hanya memilih untuk tidak.
Jika mereka tidak memberi saya string I inginkan, aku berhenti, aku menyerah.
Tapi benar-benar, untuk tujuan itu, Anda benar-benar bisa melakukannya.
>> Jadi file header perpustakaan yang kita sekarang akrab dengan semuanya ini, di sini.
Standard I / O, CS50.h, string.h, ctype.h, dan ada, memang, orang lain.
Beberapa dari Anda telah menemukan perpustakaan matematika di math.h.
Tapi izinkan saya memperkenalkan Anda, sekarang, untuk sumber daya ini bahwa staf CS50, Davin,
dan Rob, dan Gabe tertentu telah mengumpulkan.
Itu akan segera menghubungkan pada website kursus ini.
Ini disebut referensi CS50.
>> Yang hanya untuk memberikan cepat rasa itu, bekerja sebagai berikut.
Biarkan aku pergi ke reference.cs50.net.
Anda akan melihat di sisi kiri sisi daftar luar biasa
fungsi yang datang dengan c.
Tapi kalau aku peduli, untuk saat ini, tentang sesuatu seperti strlen,
Saya bisa mengetik di sana.
Ini filter ke bawah daftar hanya apa yang saya sayangi.
Aku akan klik.
Dan sekarang di sebelah kiri, Anda akan melihat apa yang kita harapkan
adalah lebih mudah, manusia Penjelasan ramah bagaimana
Fungsi ini bekerja.
>> Mengembalikan panjang string.
Berikut sinopsis, di sini adalah bagaimana Anda menggunakannya dalam hal file header,
dan dalam hal apa fungsi Sepertinya dalam hal argumen.
Dan kemudian di sini, kembali panjang string.
Tapi bagi Anda yang lebih nyaman, Anda benar-benar dapat mengklik lebih nyaman,
dan isi dari ini Halaman, sekarang, akan berubah
menjadi nilai default apa Anda dapatkan dengan menggunakan halaman manual.
>> Dengan kata lain, CS50 referensi adalah penyederhanaan
dari halaman manual oleh staf, untuk siswa.
Khususnya, mereka yang kurang nyaman dan di antara, sehingga Anda
tidak harus mencoba untuk membungkus pikiran Anda sekitar, terus terang,
beberapa sintaks yang cukup samar dan dokumentasi kadang-kadang.
>> Jadi ingat-ingat di masa yang akan datang.
Jadi di sini, sekali lagi, adalah Zamyla.
Mari kita sekarang mengajukan pertanyaan yang sedikit lebih manusiawi diakses.
Terima kasih kepada Chang, yang sudah mencetak lebih gajah
tanpa henti selama beberapa hari terakhir.
Kami memiliki kesempatan untuk memberikan setidaknya satu dari mereka pergi.
Jika kita bisa mendapatkan hanya satu relawan untuk datang ke atas untuk menggambar di layar.
Bagaimana di sini?
>> Ayo up.
Siapa nama Anda?
ALEX: Alex.
DAVID J. Malan: Alex.
Baiklah.
Alex, datang ke atas.
Kita akan melihat Anda tulisan tangan pada layar di sini.
Baiklah, senang bertemu dengan Anda.
>> ALEX: Nice Anda bertemu Anda.
>> DAVID J. Malan: Baiklah.
Jadi, latihan super sederhana.
Bar tidak tinggi untuk mendapatkan gajah hari ini.
Anda memainkan peran GetString.
Dan aku akan hanya memberitahu Anda string yang telah Anda masuk.
Dan anggaplah bahwa Anda, GetString, telah dipanggil.
Dan manusia, seperti saya, memiliki diketik di Zamyla, Z-A-M-Y-L-A.
Hanya pergi ke depan dan menulis Zamyla pada layar seolah-olah Anda mendapatkan itu
dan disimpan di suatu tempat dalam memori.
>> Meninggalkan ruang untuk apa yang akan menjadi beberapa words-- lain yang OK, terus berjalan.
>> [Tertawa]
>> Jadi Zamyla, Excellent.
Jadi sekarang anggaplah bahwa Anda, GetString, disebut lagi.
Dan karena itu, saya memberikan Anda, di keyboard, dengan nama lain, Belinda.
Baiklah.
Dan sekarang waktu berikutnya GetString adalah disebut, saya ketik sesuatu seperti Gabe,
G-A-B-E. Kau benar-benar mengambil hati random access memory.
Yang menarik segalanya benar-benar acak.
OK.
>> [Tertawa]
ALEX: Maaf tulisan tangan saya buruk.
DAVID J. Malan: Tidak, itu OK.
Dan bagaimana dengan Rob, R-O-B. OK.
Baik.
Jadi saya tidak mengantisipasi Anda akan jenis meletakkan hal-hal dengan cara ini.
Tapi kita bisa membuat karya ini.
Jadi bagaimana Anda pergi tentang peletakan out karakter tersebut dalam memori?
Dengan kata lain, jika kita berpikir tentang layar ini hitam persegi panjang
sebagai mewakili komputer RAM, atau memori.
>> Dan mengingat RAM yang hanya sejumlah byte,
dan byte sejumlah besar bit.
Dan bit entah bagaimana dilaksanakan, umumnya
dengan beberapa bentuk listrik di hardware.
Jadi itu semacam yang layering kita bicarakan
dan sekarang dapat mengambil untuk diberikan.
Bagaimana Anda pergi tentang memutuskan di mana untuk menulis
Rob vs Gabe dibandingkan Belinda vs Zamyla?
>> ALEX: Aku hanya melakukannya dalam memerintahkan agar Anda mengatakan kepada saya.
>> DAVID J. Malan: Dan itu benar.
Tapi apa yang diatur di mana Anda meletakkan Nama Belinda dan nama Gabe?
>> ALEX: Tidak ada?
DAVID J. Malan: [TERTAWA] Jadi yang bekerja, itu baik-baik saja.
Jadi komputer yang sedikit lebih tertib dari itu.
Jadi ketika kita implement-- tinggal di sana hanya moment-- ketika kita benar-benar
menerapkan sesuatu seperti GetString di komputer,
Zamyla mungkin ditata cukup banyak seperti yang Anda lakukan pada layar, ada.
>> Dan apa adalah kunci untuk melihat di sini, apa Alex lakukan,
adalah ada semacam demarkasi yang antara masing-masing kata-kata ini, kan?
Anda tidak menulis Z-A-M-Y-L-A-B-E-L-I-N-D-A-G-A-B--
dengan kata lain, ada semacam demarkasi yang tampaknya,
semacam, jarak acak antara berbagai kata-kata.
Tapi itu bagus, karena kita manusia sekarang dapat
memvisualisasikan bahwa ini adalah empat senar yang berbeda.
Ini bukan hanya satu urutan dari banyak karakter.
Jadi komputer, maka, sementara itu, mungkin mengambil string seperti Zamyla,
menempatkan masing-masing huruf dalam byte memori.
Tapi jumlah yang jauh lebih besar, Tentu saja, dari enam karakter.
>> Ada sejumlah besar RAM.
Dan begitu selanjutnya, ini grid kotak akan
untuk mewakili apa Alex hanya lakukan di sini di layar.
Dan sekarang, Alex, kami dapat menawarkan Anda biru atau gajah jeruk dari Chang.
ALEX: Aku akan mengambil gajah biru.
DAVID J. Malan: Seekor gajah biru.
Jadi tepuk tangan meriah, jika kita bisa, untuk Alex di sini.
>> [Tepuk Tangan]
>> ALEX: Terima kasih.
DAVID J. Malan: Terima kasih.
Jadi takeaway adalah bahwa, meskipun Pola semacam berubah dari waktu ke waktu, di sini
di papan, ada ini demarkasi antara berbagai string
Alex mendapat bagi kita.
Sekarang komputer, terus terang, bisa melakukan hal yang sama.
Mereka bisa jenis celepuk string di mana saja di RAM.
Sampai di sini, di sini, di sini, di sini.
>> Mereka bisa melakukan hal itu.
Tapi, tentu saja, itu mungkin bukan perencanaan terbaik.
Benar?
Jika saya terus bertanya Alex mendapatkan nama, mungkin dia akan
menaruh beberapa lebih di sini, mungkin sampai di sini, di sini, di sini, akhirnya
di sini.
Tapi dengan perencanaan sedikit lebih, pasti, kita bisa berbaring hal-hal lebih bersih.
Dan memang, itulah yang komputer tidak.
>> Tapi menangkap adalah bahwa jika string berikutnya saya mendapatkan
setelah Zamyla adalah sesuatu seperti Belinda,
mengusulkan di mana kita mungkin menulis huruf b sehubungan dengan jaringan ini?
Di mana Anda akan pergi?
Di sebelah kanan dari itu, di bawah z, di bawah itu?
Apa yang akan naluri pertama Anda menjadi?
AUDIENCE: Di bawah z.
DAVID J. Malan: Jadi di bawah z.
Dan itu cukup mudah, bukan?
Ini semacam rapi, itu apa yang kita lakukan pada keyboard ketika kita tekan Enter,
atau email saat melakukan daftar bullet hal.
Tetapi kenyataannya adalah bahwa komputer mencoba untuk menjadi lebih efisien,
dan menjejalkan tentu sebanyak data ke dalam RAM mungkin,
sehingga Anda tidak membuang-buang bytes.
Sehingga Anda tidak membuang setiap layar real estat.
Dan masalahnya, meskipun, adalah bahwa jika kita benar-benar menempatkan surat
b setelah, bagaimana kita akan tahu di mana nama Zamyla berakhir
dan nama Belinda dimulai?
Jadi Anda tidak manusiawi saja diusulkan, baik, tekan tombol Enter, pada dasarnya.
Meletakkannya di bawah ini.
Atau bahkan seperti Alex lakukan, hanya mulai menulis nama berikutnya di bawah sebelumnya,
dan di bawah satu itu, dan kemudian di bawah satu.
Itu isyarat visual.
>> Komputer memiliki isyarat visual lainnya, tapi itu sedikit lebih ringkas.
Ini karakter yang funky ini.
Backslash 0, yang mungkin mengingatkan backslash n,
dan sebagainya, sekarang.
Urutan escape khusus.
Backslash 0 adalah cara mewakili delapan bit nol berturut-turut.
0000 0000.
>> Cara Anda mengungkapkan bahwa tidak memukul angka nol pada keyboard Anda,
karena sebenarnya yang char ASCII.
Sepertinya nomor, tetapi sebenarnya angka desimal
yang mewakili melingkar Mesin terbang, jenis huruf melingkar.
Sementara itu, backslash nol berarti, secara harfiah
menempatkan delapan nol byte sini bagi saya.
>> Jadi ini agak sewenang-wenang.
Kita sudah bisa digunakan pola apapun bit, tetapi dunia
memutuskan beberapa tahun lalu, bahwa untuk mewakili
akhir string dalam memori, hanya menempatkan sejumlah besar nol.
Karena kita bisa mendeteksi itu.
Sekarang berarti bahwa ada surat dari alfabet dapat direpresentasikan dengan nol.
>> Tapi itu OK, kita telah melihat bahwa kita menggunakan 65 ke atas di 97 ke atas.
Kami tidak mendapatkan di mana saja dekat dengan semua nol.
Jadi Belinda di memori komputer sebenarnya akan pergi di sini.
Aku sudah ditarik dalam kuning hanya untuk menarik perhatian kita untuk itu.
Dan pemberitahuan juga, ini benar-benar sewenang-wenang.
Saya menggambarkannya sebagai kotak.
Seperti, RAM hanya beberapa objek fisik.
Itu tidak selalu memiliki baris dan kolom, per se.
Itu saja mendapat sejumlah byte diimplementasikan dalam perangkat keras entah bagaimana.
Tetapi jika setelah Belinda I mengetik nama Gabe,
dia akan berakhir di sini dalam memori, dan jika saya mengetik nama Daven ini,
misalnya, dia akan berakhir di sini.
Dan aku bisa terus menulis nama bahkan lebih.
>> Sayangnya, jika saya mencoba untuk menulis nama super panjang,
Aku mungkin akhirnya kehabisan memori.
Dalam hal ini, GetString adalah akan kembali NULL, seperti yang kita katakan.
Tapi untungnya, setidaknya dalam hal ini visual yang di sini, kami tidak bisa sejauh itu.
>> Sekarang apa yang baik adalah bahwa ini ide umum memperlakukan hal-hal
sebagai dalam kotak adalah wakil dari fitur C
dan banyak bahasa, dikenal sebagai array.
Array adalah jenis lain dari data.
Ini adalah struktur data, jika Anda mau.
Struktur dalam arti benar-benar, jenis, tampak seperti kotak, setidaknya
di mata pikiran Anda.
Array adalah bersebelahan urutan tipe data yang identik,
kembali ke belakang untuk kembali ke belakang.
>> Jadi string, di lain kata-kata, adalah array dari karakter.
Array karakter.
Tapi ternyata Anda dapat memiliki array tandan hal.
Bahkan, kita dapat menempatkan bahkan nomor dalam array.
Jadi bentuk yang kita akan mulai
menyatakan data ini struktur yang dikenal sebagai array
juga akan menggunakan tanda kurung siku.
Tapi ini kurung siku akan memiliki arti yang berbeda dalam konteks ini.
>> Dan mari kita lihat sebagai berikut.
Misalkan saya membuka sebuah file baru di sini.
Dan saya menyimpan ini sebagai ages.c.
Dan aku akan menyimpan ini dalam folder saya di sini.
Dan sekarang aku akan pergi ke depan dan mulai mengetik sesuatu
seperti termasuk CS50.h, termasuk stdio.h, int void main.
Dan kemudian dalam sini, saya ingin untuk pertama memiliki int disebut usia.
>> Dan aku akan menggunakannya untuk mendapatkan int dari pengguna untuk usianya.
Tapi program ini dimaksudkan untuk digunakan oleh beberapa orang, untuk konteks apapun.
Aku punya antrean orang.
Semua dari mereka harus mengetikkan mereka usia untuk mungkin beberapa, saya tidak tahu,
kompetisi, atau acara bahwa mereka telah tiba untuk.
Jadi orang berikutnya, saya perlu variabel lain.
>> Karena jika saya hanya melakukan usia mendapat getInt, itu
akan mengkritik, atau menimpa usia orang sebelumnya.
Jadi itu tidak baik.
Jadi insting pertama saya mungkin, oh, oke,
jika saya ingin mendapatkan beberapa orang ages-- mari kita sebut age1 ini,
int age2 mendapat int, int age3 mendapat getInt.
Dan sekarang aku akan menggunakan beberapa kode pseudo di sini.
>> Lakukan sesuatu dengan angka-angka.
Kami akan berangkat ke hari lain apa kita lakukan di sana, karena kita hanya
peduli untuk saat ini tentang age1, age2, age3.
Sayangnya, setelah saya mengkompilasi program ini
dan meletakkannya di depan pengguna yang sebenarnya, apa desain fundamental miskin
keputusan yang saya tampaknya telah membuat?
Ya?
AUDIENCE: [Tak terdengar]
DAVID J. Malan: Ya, Aku bahkan belum mencoba
untuk mengetahui berapa banyak usia saya benar-benar peduli?
Jika saya memiliki lebih sedikit dari tiga orang di sini, dan karena itu kurang dari tiga usia,
Aku masih membabi buta mengharapkan tiga.
Allah melarang empat orang muncul.
Program saya hanya bahkan tidak akan mendukung mereka.
>> Dan jadi ini, cerita panjang Singkatnya, ini bukan kebiasaan yang baik.
Benar?
Saya pada dasarnya menyalin dan menyisipkan kode dan hanya tweaking
nama variabel.
Dan, Tuhan, jika Anda memiliki, bukan tiga usia, namun 10, atau 100, atau bahkan 6.500
mahasiswa, misalnya.
Hal ini tidak akan menjadi sangat kode elegan, atau berkelanjutan.
Anda akan harus menulis ulang program setiap kali
nomor perubahan orang.
>> Jadi untungnya, dalam sebenarnya kami File ages.c untuk hari ini,
kami memiliki solusi yang lebih pintar.
Pertama, aku akan meminjam membangun kami telah digunakan beberapa kali,
ini dilakukan while, untuk mendapatkan jumlah orang di dalam ruangan.
Aku hanya akan mengganggu pengguna, lagi dan lagi, sampai dia memberi saya
nilai n itu adalah bilangan bulat positif.
>> Saya bisa menggunakan, lalu waktu kita mendapatkan int positif.
Tapi kita tidak memiliki nyata, jadi saya pergi ke depan
dan kembali menerapkan ide ini.
Sekarang di sini, ini adalah trik baru.
Sejalan 27, sebagai komentar sejalan 26 menunjukkan,
mendeklarasikan array di mana untuk menyimpan usia semua orang.
>> Jadi jika Anda ingin mendapatkan, tidak satu int, tidak dua ints, tetapi sejumlah besar int.
Secara khusus n bilangan bulat, yang mungkin n tiga, mungkin 100, mungkin 1.000.
Sintaks, cukup sederhana, adalah untuk mengatakan, apa tipe data yang Anda inginkan?
Apa yang ingin Anda panggil bahwa sepotong memori?
Apa yang ingin Anda panggil grid yang terlihat seperti ini pictorially?
>> Dan dalam tanda kurung di sini, Anda mengatakan seberapa besar Anda ingin array menjadi.
Dan lebih awal, ketika saya mengatakan sintaks ini sedikit berbeda di sini,
kami masih menggunakan tanda kurung, tapi ketika saya mendeklarasikan array,
jumlah bagian dalam kurung siku berarti
seberapa besar Anda ingin array menjadi.
>> Sebaliknya, ketika kami menggunakan s braket i sesaat lalu, s, string,
memang sebuah array karakter, tetapi bila Anda tidak mendeklarasikan sebuah variabel,
seperti dengan kata kunci ini di sini, Anda hanya mendapatkan
indeks tertentu, tertentu elemen dari array tersebut.
Setelah kita tahu bahwa, sisanya ini sangatlah mudah.
Jika baru pertama aku akan mencetak apa usia orang nomor i.
Di mana saya hanya mengatakan nomor orang satu, orang nomor dua, orang nomor tiga.
>> Dan aku hanya melakukan aritmatika, sehingga orang normal seperti,
kita menghitung dari satu untuk ini Program, dan tidak dari nol.
Lalu aku menelepon getInt, tapi aku menyimpan jawaban di usia braket i.
Yang merupakan usia i'th dalam array.
Jadi sementara terakhir kali kami memperlakukan kotak-kotak ini sebagai karakter untuk nama Zamyla ini,
dan lain-lain.
Sekarang, kotak-kotak ini merupakan 32 bit, atau empat byte
di mana kita dapat menyimpan int, int, int.
Semua yang, sekali lagi, adalah tipe data yang sama.
>> Sekarang aku melakukan sesuatu yang bodoh, seperti berjalannya waktu, hanya
untuk membenarkan menulis program ini.
Dan kemudian di sini, saya kembali iterate lebih dari array mengatakan tahun dari sekarang,
orang nomor satu akan berusia sesuatu tahun.
Dan untuk mengetahui bahwa math-- Maksudku, ini
tidak sangat rumit arithmetic-- Saya hanya menambahkan satu dengan usia mereka.
Hanya untuk menunjukkan, sekali lagi, ini.
>> Sama seperti saya bisa indeks ke string, s, jadi saya bisa indeks ke array usia,
seperti itu ada.
Jadi di mana ini akan membawa kita?
Jadi kita akan melihat, akhirnya, beberapa hal di masa yang akan datang.
Satu, selama ini, ketika menulis program Anda sendiri,
seperti Mario, serakah, kredit.
Anda telah mengetik nama program dan memukul Enter.
Dan kemudian mendapatkan masukan pengguna.
>> Dengan getString, getInt, getLongLong, atau sejenisnya.
Tapi ternyata C mendukung sesuatu yang disebut baris perintah
argumen, yang akan membiarkan kita benar-benar mendapatkan kata-kata yang Anda ketik,
pada prompt berkedip, setelah nama program anda.
>> Jadi pada hari-hari yang akan datang, Anda bisa ketik sesuatu seperti Caesar,
atau ./caesar nomor 13, setelahnya.
Kita akan melihat bagaimana yang bekerja.
Karena memang, di Masalah mengatur dua, kami tidak
akan memperkenalkan Anda untuk sedikit sesuatu
mengingatkan Ralphie ini menantang sebelumnya kartografi.
Seni berebut informasi.
Hal ini, pada kenyataannya, sangat mengingatkan kita pada apa Ralphie lakukan.
>> Ini adalah contoh dari enkripsi algoritma yang disebut ROT13, R-O-T 13.
Yang berarti memutar huruf dalam alfabet 13 tempat.
Dan jika Anda melakukannya, Anda akan melihat sekarang apa yang, mungkin, sebuah frase akrab.
Tapi cara kita akan menggunakan ini, pada akhirnya, adalah lebih umum.
>> Dalam P menetapkan dua, dalam edisi standar, Anda akan menerapkan beberapa cipher,
satu disebut Caesar, yang disebut Vigenere.
Keduanya adalah rotasi cipher, bahwa entah bagaimana Anda
mengubah satu huruf ke huruf yang berbeda.
Dan Caesar super sederhana.
Anda menambahkan satu, Anda menambahkan 13, atau beberapa nomor hingga 26.
Vigenere melakukan itu pada per surat basis.
Jadi Vigenere, karena Anda akan melihat di spec, lebih aman.
>> Tetapi pada akhir hari apa Anda akan menerapkan dan P menetapkan dua,
adalah bahwa kunci yang Anda gunakan baik untuk enkripsi dan dekripsi.
Mengacu pada proses mengubah teks biasa, beberapa pesan asli,
ke dalam teks nol, yang adalah sesuatu dienkripsi.
Dan kemudian mendekripsi lagi.
>> Dalam edisi hacker, Sementara itu, Anda akan
bertugas dengan sesuatu yang mirip dalam roh, di mana kami akan memberikan
file, dari Linux khas, atau Mac, atau Unix komputer yang disebut etsy
password, yang berisi keseluruhan sekelompok username dan password.
Dan orang-orang memiliki semua password telah dienkripsi, atau hash,
sehingga untuk berbicara, lebih tepat seperti yang Anda lihat di spec.
>> Dan edisi hacker akan menantang Anda dengan mengambil masukan seperti ini,
dan retak password.
Artinya, mencari tahu apa yang sandi manusia sebenarnya.
Karena, memang, password umumnya tidak disimpan di jelas,
dan umumnya password harus sulit menebak.
Itu tidak sering terjadi.
>> Dan apa yang saya pikir kita akan lakukan adalah menyimpulkan dengan beberapa menit
melirik khususnya miskin pilihan password
dari film Anda mungkin ingat sayang.
Dan jika tidak, Anda harus menyewa.
>> [VIDEO PEMUTARAN]
>> -Helmet, Anda iblis, apa yang terjadi?
Apa yang Anda lakukan untuk anak saya?
>> -Permit Saya untuk memperkenalkan brilian ahli bedah plastik muda,
Dokter Phillip Schlotkin.
Terbesar hidung pria kerja di seluruh alam semesta dan Beverly Hills.
>> -Anda Mulia.
>> Pekerjaan -Nose?
Saya tidak mengerti.
Dia sudah memiliki pekerjaan hidung.
Itu dia manis 16 hadir.
>> Tidak, itu bukan apa yang Anda pikirkan.
Ini jauh, jauh lebih buruk.
Jika Anda tidak memberi saya kombinasi untuk perisai udara,
Dokter Schlotkin akan memberikan Anda Putri kembali hidung lamanya.
- [Terengah] Nooooooooooooo.
Di mana Anda mendapatkan itu?
>> Baiklah.
Aku akan memberitahu, aku akan memberitahu.
>> Tidak, Ayah, no.
Anda tidak harus.
>> -Kau Benar sayangku.
Aku akan merindukan hidung baru Anda.
Tapi aku tidak akan memberitahu mereka Kombinasi tidak peduli apa.
>> -Sangat Baik.
Dokter Schlotkin, lakukan terburuk Anda.
>> Kesenangan -My.
>> -Tidak!
Tunggu, tunggu.
Aku akan memberitahu.
>> -Aku Tahu itu akan berhasil.
Baiklah, berikan kepada saya.
>> Kombinasi -The adalah salah satu.
>> -Satu.
-Dua.
-Tiga.
Empat.
-Lima.
-Jadi Kombinasi adalah satu, dua, tiga, empat, lima.
Itu kombinasi terbodoh Aku pernah mendengar dalam hidupku.
Itulah jenis hal yang bodoh akan di koper.
>> Terima kasih, Yang Mulia.
>> [REMOTE KLIK]
>> Apa yang Anda lakukan?
>> -Aku Dimatikan dinding.
>> Tidak, Anda tidak, Anda mematikan seluruh film.
>> Pasti -Aku menekan tombol yang salah.
>> Nah, mengembalikannya ke!
Masukan film kembali!
>> Ya, Pak!
Ya, Pak.
-Let Pergi, Arnold.
Ayo, Gretchen.
Tentu saja Anda tahu saya akan harus menagih Anda untuk ini.
-Nah?
Apakah itu bekerja?
Dimana raja?
>> -It Bekerja, Pak, kita memiliki kombinasi.
Bagus.
Sekarang kita bisa mengambil setiap napas terakhir udara segar dari planet Druidia.
Apa kombinasi?
>> -Satu, Dua, tiga, empat, lima.
>> -Satu, Dua, tiga, empat, lima?
Ya.
-Itu Menakjubkan.
Aku punya sama kombinasi pada bagasi saya.
Siapkan Spaceball 1 untuk keberangkatan langsung.
>> Ya, Pak.
>> -Dan Mengubah kombinasi pada bagasi saya.
[PINTU PENUTUP SUARA]
[CLINK PINTU Memukul HELM]
-Ahh.
[END VIDEO PUTAR]
DAVID J. Malan: Itu untuk CS50, kita akan melihat Anda minggu depan.
Narator: Dan sekarang, Deep Pikiran, berdasarkan Daven Farnham.
>> Daven Farnham: Coding di C adalah jauh lebih sulit daripada Scratch.
printf, Scratch itu bohong.
>> [Tertawa ucapan]