[Powered by Google Translate] [Minggu 3]
[David J. Malan - Universitas Harvard]
[Ini adalah CS50. - CS50.TV]
Mari saya mengarahkan kita ke arah mana kami tinggalkan terakhir kali,
yang mulai berpikir sedikit lebih dari sekitar sintaks
dan mencoba untuk berpikir sedikit kurang tentang semua hal-hal kecil
yang mengambil sedikit waktu untuk menyesuaikan diri dengan sejauh dalam hal titik koma
dan tanda kurung dan kurung kurawal,
untuk mulai mengambil hal-hal sedikit untuk tingkat konseptual yang lebih tinggi
sehingga masalah yang kita sekarang mulai memecahkan selama beberapa minggu berikutnya
akan melibatkan lebih banyak masalah tingkat yang lebih tinggi konseptual
dan sedikit kurang dalam sintaksis sebagai Anda mendapatkan kaki Anda basah
dan tangan Anda kotor dengan beberapa sintaks dari beberapa minggu terakhir ini.
>> Jadi ingat bahwa minggu lalu kami memperkenalkan gagasan dari sebuah array.
Dan sebuah array dalam bahasa Inggris dapat digambarkan sebagai apa? >> [Respon siswa tidak terdengar]
Maaf?
Sebuah koleksi? >> [Respon siswa terdengar] >> Oke, baik.
Sebuah koleksi item. Jadi kita melihat array dalam Scratch.
Jika Anda kebetulan gunakan untuk pset 0 salah satu daftar Scratch yang Anda dapat menarik hal-hal
seperti jeruk dan pisang ke dalam, inventarisasi macam,
itu jenis seperti apa array adalah.
Dan kemudian lebih teknis, dalam konteks sebuah komputer yang sebenarnya,
array hanyalah sepotong bersebelahan memori.
Dengan kata lain, Anda memiliki byte, maka lain byte, maka byte yang lain, maka byte yang lain,
dan jika Anda adalah untuk menarik orang-orang byte dalam gambar,
mereka akan kembali untuk kembali ke kembali ke belakang. Itulah yang kami maksud dengan berdekatan.
>> Jadi jumlah byte 1, kemudian 2, kemudian 3.
Itu tidak berarti di sini, di sini, di sini, di sini.
Array adalah sepotong bersebelahan 0 atau lebih byte.
Jadi apa yang mereka berguna untuk?
Ingat kita punya semacam ini contoh buat nilai kuis orang menyimpan dalam sebuah program
untuk menghitung rata-rata kuis Anda untuk kursus tertentu,
dan ingat bahwa kita bisa mulai menulis program yang dengan mendeklarasikan quiz1 variabel.
Kemudian kita bisa memiliki variabel lain yang disebut quiz2.
Tapi kemudian jika ada 3 kuis di kelas ini, quiz4.
Atau jika ada kuis mingguan, akan quiz5, quiz6, quiz7.
Jadi, Anda akan memiliki semua variabel yang dideklarasikan dalam main
atau di tempat lain dalam program Anda,
dan masalah dengan pendekatan itu, mudah meskipun hanya copy dan paste,
apakah hanya sangat cepat menjadi berat.
Allah melarang Anda benar-benar memiliki 30 atau 50 kuis kuis.
Jika itu seperti kuis gaya pop sekolah tinggi harian,
maka Anda hanya memiliki daftar ridiculously panjang variabel dinyatakan,
dan ini hanya sangat cepat menjadi tidak terkendali.
Itu jelek, sulit untuk mempertahankan, itu jauh lebih mudah untuk membuat kesalahan ketik
jika Anda mendapatkan 1 nomor mistyped suatu tempat dalam program Anda.
>> Jadi kami memperkenalkan konsep array sebagai gantinya.
Dan ingat bahwa kami menerapkan program ini dengan melakukan sedikit sesuatu seperti ini.
Biarkan aku pergi ke 3 direktori Sumber hari Senin
dan membuka array, yang kita lihat terakhir kali.
Dan meskipun ada beberapa trik baru C di sini,
di antaranya gagasan konstan,
ingat bahwa kita menyatakan mengapung beberapa dasarnya dengan menggunakan sintaks ini:
float, maka nama variabel, maka kita menggunakan kurung siku benar-benar untuk pertama kalinya,
dan apa yang kita lakukan dalam kurung siku tersebut secara efektif menempatkan nomor.
Tapi bukannya menempatkan nomor, saya menempatkan kata ini dikapitalisasi, kuis.
Dan apa motivasi untuk menempatkan kata dikapitalisasi seperti kuis
dan kemudian menggunakan trik baris 17 di sini untuk benar-benar memberikan yang nomor?
Apa motivasi di sana? Ya.
>> [Respon siswa terdengar] >> Tepat.
Jika kita ingin mengubah bahwa nilai 2, kita hanya perlu mengubahnya dalam 1 tempat
karena menganggap - Aku bahkan tidak ingat apa program ini melakukan persis,
tetapi jika Anda hanya skim itu Anda melihat kuis, kuis.
Anda lihat kuis, di sini lebih Kuis.
Jadi jika kita tidak memiliki konstan, ini penggunaan tajam mendefinisikan,
kita akan mengetik 2, kemudian 2, kemudian 2, kemudian 2, yang baik-baik saja. Ini akan sama benar.
Tapi misalkan tahun depan kita memiliki 3 kuis di CS50.
Jadi aku harus pergi dan memperbarui kode, saya harus mengkompilasi ulang,
tapi masalahnya adalah jika saya melakukan sesuatu yang bodoh, seperti saya mengabaikan 1 menyebutkan 2
dan lupa untuk plug-in 3, seluruh program bisa sangat baik istirahat.
Jadi kita hanya meminta masalah.
>> Jadi gagasan konstan adalah semua tentang anjak beberapa bagian dari data,
apakah itu string atau char atau pelampung atau apa pun,
dan menyatakan itu 1 tempat sehingga Anda dapat lebih mudah mengubahnya di masa mendatang.
Dan itu juga, terus terang, sedikit lebih mudah untuk dibaca karena jika Anda hanya memikirkan hal ini sekarang,
itu kuis, atau kita bahkan bisa mengubah nama itu sesuatu seperti NUMBER_OF_QUIZZES
atau lebih eksplisit sesuatu.
Kode hanya menjadi sedikit lebih jelas untuk apa yang dilakukannya,
dan Anda bertanya-tanya sedikit kurang apa nomor 2 mungkin terjadi berarti.
Jadi konstan tidak ada hubungannya dengan fundamental array.
Array diperkenalkan dengan cara tersebut kurung siku.
>> Jadi melihat bahwa di baris 23 kita meminta pengguna, "Apa skor kuis Anda?"
Kemudian kita hanya memiliki lingkaran yang tampaknya meminta user untuk kelas mereka. Bagaimana?
Ini iterates dari 0 sampai 2. Dan saya katakan 2 karena kuis di semua topi saat ini 2.
Jadi iterates dari 0 sampai dengan 2 dan kemudian mencetak Quiz # sesuatu dari sesuatu,
dan kemudian menggunakan GetFloat untuk mendapatkan nilai dari pengguna.
Jadi melihat ini adalah satu-satunya baru lainnya dari sintaks dari Rabu lalu.
Jika Anda ingin menyimpan sesuatu di lokasi tertentu dalam array itu,
Anda lagi menggunakan tanda kurung siku.
>> Jadi ada sedikit dikotomi di sini.
Pertama kali Anda menggunakan tanda kurung siku
Anda menggunakannya untuk menentukan seberapa besar Anda ingin array menjadi.
Tapi ini konteks berikutnya di sini di mana kita lagi menggunakan ini tanda kurung siku
berarti di mana dalam array yang Anda ingin menempatkan beberapa nilai?
Dan perbedaan di sini dapat disimpulkan dari konteks.
Perhatikan di sini kita memiliki tipe data, maka kita memiliki nama variabel,
maka kita memiliki kurung siku kami dengan sejumlah dalamnya, titik koma. Itu saja.
Jadi itu deklarasi.
Itu hanya seolah-olah kita telah melakukan sesuatu seperti pelampung Grade1, pelampung grade2;
tapi sekali lagi, ini sangat cepat devolves ke copy terlalu banyak, pasta,
jadi bukannya kami hanya disederhanakan seperti itu,
yang berarti selanjutnya kita memiliki nilai yang dapat disimpan di braket 0,
kita memiliki kelas yang dapat disimpan pada braket 1,
tapi bagaimana jika saya menyia-nyiakan dan, misalnya, loop saya pergi sejauh -
misalnya, saya membuat ini kurang dari atau sama dengan,
yang recall merupakan sumber bug sebelumnya -
yang secara efektif berarti bahwa pada beberapa iterasi disengaja ketiga lingkaran ini
Saya menggunakan braket 2. Efektif, apa yang mungkin terjadi di sini? Maaf?
[Mahasiswa] Ini akan diganti. >> Apakah akan diganti?
Apa yang akan diganti?
Ini benar-benar mengatakan mengganti apa yang di lokasi 2 dengan nilai kembali dari GetFloat.
Tapi masalahnya adalah seberapa besar array saat ini dalam cerita?
[Respon terdengar mahasiswa] >> array masih hanya ukuran 2
karena array, seperti variabel apapun, dinyatakan terlebih dahulu, sebelum kita menggunakannya,
dan kami ditentukan di sini karena konstan ini bahwa saya memiliki 2 nilai bahwa aku akan menempatkan.
>> Tapi ingat, ilmuwan komputer mulai menghitung dari 0.
Jadi lokasi pertama dalam array yang braket 0.
Lokasi berikutnya adalah 1. Hal ini pernah jadi sedikit terlalu jauh ke samping.
Jadi dengan kata lain, jika saya benar-benar memiliki array ini -
dan biarkan aku melihat seberapa baik ini bekerja sama di sini untuk kita -
jika saya memiliki array yang saya hanya ditarik sebagai berikut
dan saya sudah dialokasikan ruang untuk 2 elemen, aku mungkin menggambar ini seperti ini dalam memori
mana ini kanvas putih besar.
Ini hanya RAM saya miliki dalam komputer saya, pertunjukan RAM, 2 gigs of RAM, apa pun,
tetapi sekarang 2 kotak individual merupakan pelampung, 32 bit.
Jadi jika saya menempatkan nomor 1 di sini seperti 1,0, maka saya menempatkan nomor lain di sini seperti 3,2
tapi kemudian saya lakukan braket 2, itu seperti menempatkan sesuatu di sini.
Dan seperti gambar menunjukkan, tidak ada ada.
Ini semacam seperti tanah tak bertuan karena saya belum meminta sistem operasi
untuk memberikan saya ini kuis ketiga.
Jika aku ingin bahwa kuis ketiga, saya harus memiliki pemikiran yang
untuk meminta sistem operasi untuk itu dengan menyatakan Kuis menjadi tidak 2
tapi bukan sama 3.
>> Jadi dengan kata lain, gambar yang kita miliki secara efektif di tangan terlihat seperti ini di sini.
Ini lagi adalah tanah tak bertuan. Kami lebih baik tidak mencoba menulis nilai-nilai di sini.
Tapi sekali lagi, karena para ilmuwan komputer menghitung dari 0,
ketika kita berbicara tentang lokasi ini dalam array, yang seharusnya menjadi lokasi 0,
ini seharusnya menjadi lokasi 1, dan ini bahkan tidak ada
karena kita hanya meminta sistem operasi untuk 2 tempat tersebut.
Jadi bagi anda dengan pengalaman pemrograman sebelumnya dari bahasa lain
mungkin tahu bahwa hal ini tidak selalu terjadi dengan array atau hal-hal yang disebut vektor.
Sebaliknya, Anda hanya dapat terus menambahkan dan menambahkan, dan menambahkan hal-hal ke array,
yang, terus terang, kita punya kemampuan dalam Scratch, namun kita tampaknya telah diberikan itu di sini
karena dengan C Anda pemrograman lebih eksplisit.
Ini hanya Anda dan komputer sekarang, dan komputer hanya akan melakukan
apa yang Anda katakan untuk dilakukan.
Jadi jika Anda hanya mengatakan itu untuk memberikan 2 mengapung dengan cara baris 22 di sini,
itu semua Anda akan mendapatkan kembali dari sistem operasi: ruang untuk 2.
>> Jadi semakin program yang Anda akan sesekali menjadi kereta berkaitan dengan array.
Ini hanya semacam sifat binatang dimana kita semua tidak sempurna,
dan pada titik tertentu Anda akan mengindeks sangat mungkin melampaui batas array Anda.
Dan itu hanya cara mewah untuk mengatakan Anda pergi ke sesuatu braket
dan sesuatu itu terlalu besar nomor. Anda melampaui batas-batas array Anda.
Tapi terbalik sekarang ini.
Sisa dari program ini benar-benar tidak ada hubungannya dengan fundamental array.
Ini semua hanya tentang beberapa aritmatika sederhana untuk rata-rata komputasi.
Jadi kita miliki di sini di sini untuk loop pertama sejumlah variabel yang disebut bahwa kita menginisialisasi ke 0.
Kemudian kita iterate dari 0 sampai dengan 2 lagi dan kami menambah bahwa variabel penjumlahan
kelas engan, sehingga braket 0 maka braket 1.
Dan kemudian seperti yang akan Anda lakukan di sekolah dasar untuk menghitung rata-rata,
kami hanya mengambil uang tersebut, membaginya dengan jumlah total kuis,
dan kemudian untuk mengukur baik kita memanggil fungsi di sini disebut putaran.
>> Sekarang, sebagai samping, apa kesepakatan dengan int kurung on line 34?
Mungkin telah datang sudah dalam bagian, belum benar-benar berbicara tentang hal itu secara resmi di sini,
tapi apa ini int dalam parens mungkin melakukan? >> [Respon siswa tidak terdengar]
Ya, ini mengacu pada casting atau typecasting,
yang berarti mengambil 1 tipe data dan mengubahnya ke yang lain.
Anda tidak dapat melakukan hal ini dengan semua jenis data karena kadang-kadang akan menjadi sedikit aneh.
Tapi dalam kasus ini, jika nilai kembali dari putaran adalah pelampung
karena, setelah semua, saya mengambil pelampung dan membaginya dengan angka seperti 2,
Aku akan mendapatkan kembali pelampung.
Tetapi orang-orang sekolah dasar tidak benar-benar ingin tahu bahwa rata-rata adalah 93,4
karena mereka akan menyadari bahwa mereka yang pernah begitu dekat dengan yang 95 titik pembulatan.
>> Jadi kita ingin gantinya menggunakan int untuk putaran setiap orang untuk int terdekat,
yang dalam hal ini akan menjadi 94 tanpa poin setelah itu.
Jadi itu hanya trik matematika sedikit.
Dan kita akan kembali ke gagasan casting karena akan memiliki implikasi,
jika Anda belum menemukan sudah, untuk masalah set 2.
Jadi array kemudian, Anda bisa memikirkan - itu akan membuat saya tersenyum sepanjang hari.
Sepertinya ini jika Anda menggambar gambar itu,
tapi kuncinya adalah bahwa ukuran juga dipilih oleh Anda
ketika Anda memintanya dari sistem operasi.
Setiap pertanyaan kemudian pada array? Ya.
[Pertanyaan siswa tidak terdengar]
Ah, pertanyaan yang bagus.
Pertanyaannya adalah apa yang terjadi pada 0 nol dalam array? Ini tidak ada dalam konteks ini.
Itu hanya ada dalam konteks string, yang kita akan datang ke hanya dalam beberapa saat.
Tapi untuk array, seperti dalam kasus ini, semua yang Anda dapatkan adalah apa yang Anda minta sistem operasi untuk.
>> Dan sebagai samping, supaya ini tidak jelas,
Saya selalu mengatakan Anda bertanya sistem operasi, meminta sistem operasi.
Sebuah sistem operasi, seperti yang mungkin Anda ketahui, adalah Mac OS, Windows, Linux.
Ketika Anda menelepon fungsi seperti GetFloat
atau Anda menyatakan variabel seperti nilai,
pada akhir hari Anda secara efektif meminta orang lain untuk memberikan memori yang
karena kita sebagai calon programmer
tidak tahu bagaimana untuk benar-benar mendapatkan akses fisik ke memori.
Tetapi seseorang melakukan: sistem operasi.
Jadi selain menyajikan kita dengan ikon cantik dan menu dan folder dan sejenisnya
yang Anda lihat pada desktop Anda, apakah Mac atau PC,
Sistem operasi juga melakukan hal-hal tingkat rendah duniawi,
hal-hal yang sangat teknis pengelolaan gigabyte yang
atau 2 gigabyte memori yang Anda miliki, mengelola CPU yang Anda miliki, dan sebagainya.
Jadi, ketika Anda menulis kode,
Anda benar-benar hooking ke sistem operasi Anda dalam pengertian itu.
Aku akan harus meminimalkan itu. Baiklah.
>> Pertanyaan lain tentang array?
Tidak ada? Oke.
Jadi transisi alami dari array sebenarnya untuk topik yang agak familiar.
Dan kami melihat pernah begitu singkat ini terakhir kali juga.
Ini adalah contoh string dari Rabu.
Ini contoh String adalah sebuah program yang cukup sederhana,
dan aku sudah benar-benar disederhanakan dengan beberapa baris untuk tujuan hari ini.
Semua yang dilakukannya dalam baris 19 adalah mendapatkan string dari user, menyimpannya dalam variabel yang disebut s.
Kemudian pada baris 22 dan seterusnya itu rupanya mencetak string 1 karakter per baris.
Tapi bagaimana melakukan ini?
Kita mendeklarasikan variabel i, pengaturan sama dengan 0,
dan ini menjadi kebiasaan lama sekarang.
Kami tidak melihat ini sampai Rabu, tetapi Anda dapat menyimpulkan jenis dari namanya
strlen hanya mengembalikan apa ketika diberikan s? Panjang string.
Jadi jika saya lulus string, kutipan-tanda kutip DAVID,
itu mudah-mudahan akan kembali ke saya nomor 5 karena DAVID.
Jadi itulah tujuannya dalam hidup adalah untuk mengambil string, apakah sulit dikodekan oleh Anda
atau dalam hal ini terpasang sebagai variabel, sebagai argumen,
dan itu angka apa yang panjang string yang.
>> Jadi di sini sekarang kita meminjam beberapa notasi dari contoh kuis sebelumnya.
Ini tidak ada hubungannya dengan pelampung, tidak ada hubungannya dengan kuis,
tapi ternyata bahwa kebohongan putih kecil kami telah memberitahu Anda sejak minggu 1
adalah bahwa string tidak benar-benar ada di C.
Sebuah string pada akhir hari benar-benar hanya sebuah array.
Ini sebuah array byte, sehingga byte, byte, byte, byte, dimana recall hanya 8 bit,
sehingga sepotong memori, sepotong memori, sepotong memori, sepotong memori.
Dan cara dengan mana string diimplementasikan
adalah dengan menempatkan karakter pertama di sini,
maka di sini, maka di sini, maka di sini, back to back ke belakang dalam memori komputer.
Jadi jika Anda ingin mengeja kata seperti HELLO, Anda akan menempatkan 1 karakter H,
maka E, maka L kemudian L, maka O - 5 karakter total - suatu tempat di RAM komputer Anda.
Tapi detail kunci di sini adalah bahwa mereka akan kembali ke kembali ke belakang ke belakang,
tepat di sebelah satu sama lain.
Ketika ketika saya mengatakan s [i], apa yang dalam bahasa Inggris ini memberi saya?
Apa s [i] mewakili dalam kasus ini? Ya.
>> [Mahasiswa] Karakter engan dalam string. >> Tepat. Karakter engan dalam string.
Sekarang, saya akan mulai dari 0 per saya untuk loop di sini,
tapi itu bagus karena semuanya mulai menghitung dari 0.
Jadi s [0] akan mewakili H huruf dalam kata seperti HELLO,
s [1] akan mewakili surat seperti E dalam kata seperti HELLO, dan sebagainya.
Dan apa yang kita tampaknya akan melakukan pada setiap iterasi dari loop ini
untuk sementara menyimpan karakter engan dalam variabel yang disebut c, yang hanya char,
dan kemudian kami mencetak c
sehingga pada akhir hari apa program ini dilakukan adalah sebagai berikut.
Jika saya pergi ke direktori source dan saya membuat string1 dan saya pergi ke depan dan menjalankan string1,
dan kemudian saya ketik kata seperti HELLO, Enter, semua hal ini adalah mencetak karakter 1 pada suatu waktu.
>> Jadi ada kesempatan untuk perbaikan di sini.
Aku agak melakukan pekerjaan lebih, meskipun itu lebih jelas mungkin cara ini, dari yang diperlukan.
Yang baris kode di sini bisa saya mungkin membuang sama sekali? Ya.
Baris 24. Sejalan 24 Saya mendeklarasikan variabel c.
Saya menyimpan karakter engan s di dalamnya, tapi kemudian saya menggunakan c disini.
Jadi saya menggunakan c, jadi saya merasa seperti saya tidak bisa hanya membuang line 24 pergi.
[Komentar mahasiswa terdengar] >> Tepat.
Jadi ketika datang untuk berbicara tentang desain program,
melihat ini penyederhanaan sedikit kode, yang hanya sebagai dibaca,
tapi menyadari bahwa s hanya variabel, tipe data adalah array,
sehingga s [i] hanya akan langsung kembali ke Anda karakter engan dalam string itu.
Dan jika Anda ingin mencetaknya, itu bagus.
Anda hanya harus menggunakan c% karena Anda tidak mencetak string,
Anda mencetak karakter dalam sebuah string, dan ini juga memiliki efek mencetak karakter engan.
Dan mengingat perbedaan hanya benar-benar dari minggu lalu dengan menggunakan printf
adalah bahwa sementara dalam beberapa minggu terakhir kita akan melakukan sesuatu yang super sederhana
seperti placeholder% s maka nama string di sini,
sekarang kita menyelam dalam sedikit lebih dalam di bawah kap dan berkata,
tidak mencetak string, mencetak karakter tunggal di dalamnya.
>> Jadi kita bisa melakukan sesuatu yang sedikit berbeda di sini karena ada 1 lainnya - tidak bug
karena program ini benar, tapi aku melakukan sesuatu yang bodoh
yang saya sebutkan secara singkat pada hari Rabu.
Tapi berpikir kembali, bagaimana mungkin desain program ini ditingkatkan lebih jauh? Ya.
[Respon siswa terdengar] >> Oh, baik.
Jadi ingat bahwa kita memperkenalkan variabel kedua disebut n terakhir kali,
yang tampaknya bertentangan diri kita sendiri karena tujuan saya yang kedua yang lalu
itu hanya untuk membuang variabel sebagai tidak perlu,
tapi ingat bahwa pada hari Rabu kita benar-benar melakukan ini.
Saya mengubah untuk loop untuk benar-benar memiliki koma di sini, maka n = strlen,
dan kemudian di sini saya lakukan i <n, maka saya lakukan bertahap saya.
Apa keuntungan mendasar yang saya mencapai dengan mengubah inisialisasi saya untuk ini
dan kondisi saya ini sekarang? >> [Respon siswa terdengar] >> Tepat.
Aku tidak mengingat strlen lagi dan lagi dan lagi karena mengingat bagaimana untuk bekerja loop.
Bahkan jika mereka mulai mendapatkan lebih rumit yang tampak,
ingat bahwa hal sebelum koma pertama adalah inisialisasi, yang terjadi sekali.
Kondisi ini, meskipun, adalah di tengah,
dan ini akan diperiksa setiap kali Anda pergi melalui loop.
>> Jadi itu agak bodoh untuk bertanya komputer pertanyaan yang sama lagi dan lagi -
Apa panjang HELLO? Apa panjang HELLO? Apa panjang HELLO? -
karena seperti yang kita akan melihat hari ini dan pada hari Rabu, ini pasti akan memakan waktu,
dan itu bukan penggunaan yang sangat baik waktu karena untuk mengetahui panjang string
benar-benar membutuhkan sedikit usaha.
Ini tidak seketika, karena dalam beberapa bahasa.
Jadi dengan mengubah ini ke n, harga saya membayar adalah apa?
Kami melihat trade-off di sini.
Saya bisa menghemat waktu dengan tidak mengajukan pertanyaan sialan yang sama lagi dan lagi,
tapi itu akan saya biaya sesuatu, yang adalah apa?
>> [Mahasiswa] Anda kehilangan sejumlah memori. >> Tepat. Ini akan saya biaya beberapa memori.
Jadi dalam hal ini biaya saya apa?
Sebanyak 32 bit karena n adalah hanya sebuah int, seperti yang tersirat oleh int kata di sini.
Tapi apakah itu oke?
Terus terang, itu mungkin apa-apa karena jika Anda berpikir tentang hal ini,
semakin lama string adalah, semakin banyak waktu aku akan menyia-nyiakan
karena strlen akan dipanggil lagi dan lagi dan lagi
untuk setiap iterasi dari loop.
Dan hari ini, saya memiliki Mac 2 gigs of RAM, hari ini 4 gigs RAM kadang-kadang.
Saya pikir saya mampu 4 orang byte untuk benar-benar mempercepat pekerjaan.
Tapi ini akan menjadi trade-off dan tema yang benar-benar dalam pemrograman dan ilmu komputer
tidak pernah benar-benar mendapatkan sesuatu secara gratis.
Jika Anda ingin meningkatkan sesuatu di sini, Anda harus membayar untuk itu di sisi lain entah bagaimana.
Ruang terhadap waktu dalam kasus ini.
>> Jadi ini semua mengarah ke arah sesuatu yang samar seperti ini,
yang, karena Anda mungkin tahu sekarang, benar-benar mengatakan?
[Respon terdengar mahasiswa] >> Ya, jadi ini adalah, Pastikan untuk minum Ovaltine Anda,
benar-benar menggunakan algoritma yang disebut ROT13, ROT 1-3,
yang hanya berarti memutar semua huruf 13 tempat,
yang berarti mengambil A dan kemudian menambahkan 13 untuk itu dan pergi dot, dot, dot
semua jalan ke surat ke-13 pergi, melakukan hal yang sama untuk B dan C dan D untuk dan sebagainya.
Dan jadi jika kita benar-benar mengubah ini di sini menggunakan pergeseran dari 13 tempat,
kita akan kembali ke apa yang Ralphie kecil itu, yang, Pastikan untuk minum Ovaltine Anda.
Tapi sekarang untuk masalah set 2, dalam edisi standar minimal,
Anda harus melakukan hal ini jenis enciphering sendiri,
dan kita harus entah bagaimana mengambil masukan seperti ini dan mengenkripsi atau mendekripsi itu.
>> Jadi mana yang semacam dasar menuntun kita pada kesempatan itu?
Mari kita lihat contoh ketiga di sini.
Pertama-tama, itu disebut ASCII. Apa ASCII merujuk kembali?
American Standard Kode untuk Informasi Interchange,
yang merupakan cara yang sangat panjang mengatakan apa? Apa ASCII?
[Respon siswa terdengar] >> Apa itu? >> [Mahasiswa] Sebuah peta karakter. >> Sebuah peta karakter.
Itu hanya memetakan nomor ke huruf karena dunia memiliki standar
apa nomor akan mewakili apa huruf sehingga kita semua dapat menggunakan komputer
dan program kami semua hanya kompatibel ketika datang untuk mencetak sesuatu di layar.
Jadi ingat bahwa 65 terjadi untuk mewakili A, 97 terjadi untuk mewakili huruf kecil a.
Dan jadi ini program sederhana di sini ASCII adalah mengambil keuntungan dari fakta bahwa -
bahwa dunia tahu bahwa modal adalah 65 - dan itu hanya mencetak pemetaan.
>> Jadi sebelum kita menyelam ke dalam kode ini, biarkan aku malah membuka jendela terminal.
Biarkan aku pergi ke depan dan membuat ASCII, dan kemudian mari kita menjalankan hal ini hanya untuk merusak output.
Dan itu hanya melakukan hal ini: grafik yang sangat besar yang hanya memberitahu saya semua berbagai kode
untuk semua berbagai surat.
Jadi program super sederhana, tapi aku tidak perlu kode keras yang 52 baris output:
26 huruf, 26 huruf kecil.
Sebaliknya, saya melakukan ini pemrograman dengan beberapa loop.
Perhatikan apa yang saya lakukan di sini.
Saya mengulangi dari i adalah 65 pada hingga 65 + 26 karena saya ingin mencetak 26 huruf
dalam abjad Inggris, i + + pada setiap iterasi, dan sekarang perhatikan ini lagi.
Ini terulangnya typecasting teman kita
dimana Anda mengkonversi 1 tipe data yang lain
karena apa yang saya ingin lakukan dalam program khusus ini?
Saya ingin menghitung numerik karena itulah bagaimana saya dibesarkan menghitung - 65, 66, 67, dan sebagainya -
tapi saya tidak ingin mencetak hanya angka.
Saya ingin mencetak huruf diikuti dengan nomor.
Saya ingin mencetak A: nomor, B: jumlah, tapi aku bisa melakukan ini dengan variabel yang sama persis.
Jadi saya mencetak c% sebagai tempat untuk karakter,
% D sebagai pengganti untuk digit atau nomor.
Lalu apa yang harus saya pasang di bagi 2 penampung?
Saya pasang pertama di setara karakter saya, dan kemudian saya mencetak saya sendiri.
>> Jadi perhatikan ini juga hanya bekerja.
Sama seperti saya dapat menyerahkan dari float ke int
dalam rangka untuk pergi dari bilangan real ke integer,
di sini saya bisa pergi dari int ke char, yang sedikit aneh -
tidak cukup memetakan ke dunia nyata - tapi di komputer
Char adalah hanya nomor di bawah kap mesin,
jadi kita sedang pernah begitu eksplisit sini untuk komputer, mengatakan,
printf, mencetak tidak saya sebagai 65, mencetak keluar sebagai setara numerik.
Dan ternyata aku teknis bahkan tidak perlu ini.
Apa yang saya lakukan beberapa saat yang lalu secara eksplisit pengecoran
dengan menentukan apa tipe data saya ingin pergi dari dan ke.
Tapi perhatikan bahwa saya sudah memiliki ini c% placeholder
dan ini% lainnya c placeholder sini.
Meskipun hal ini tidak int, komputer menyadari bahwa char,
itu hanya sebuah int bawah tenda.
>> Jadi jika saya benar-benar mengkompilasi ulang ini dan jalankan kembali program ASCII,
melihat itu masih hanya bekerja karena komputer menyadari bahwa ada korespondensi ini.
Sekarang, itu lebih penting untuk melakukan pengecoran eksplisit dalam dunia mengapung untuk ints
karena di sana Anda benar-benar membuat keputusan yang dihitung:
membuang semuanya setelah titik desimal.
Berikut ada benar-benar untuk membuang karena karakter adalah hanya nomor,
dan string hanya sebuah array karakter.
Jadi ketika tiba saatnya untuk menerapkan beberapa enkripsi atau dekripsi,
bagaimana mungkin kita benar-benar bisa menerjemahkan sesuatu seperti ini omong kosong,
Pastikan untuk minum Ovaltine Anda?
Bagaimana jika kita tahu sekarang - mari kita sebagai asumsi - bahwa kunci,
nomor yang kita berputar semua surat-surat oleh, adalah nomor 13?
Jadi kami pergi dari huruf B sepanjang jalan ke O pada awal kalimat,
Pastikan untuk minum Ovaltine Anda, karena jika saya melakukan B
dan kemudian aku pergi C, D, E, F, G, H, I, J, K, L, M, N, O,
itu sebabnya enkripsi dari huruf B menjadi O
karena saya hanya menambahkan 13 untuk itu.
>> Jadi jika saya ingin mendekripsi ini, saya pada dasarnya harus mengambil O dan kemudian kurangi 13 dari itu.
Atau, terus terang, karena ada 26 huruf dalam alfabet, ini luar biasa simetris,
kita juga bisa hanya menambahkan 13 dan kami akan kembali ke B. surat
Tapi bagaimana Anda pergi tentang pelaksanaan sesuatu seperti ini di Caesar
atau benar-benar memanipulasi string pada umumnya?
Jika huruf B adalah nomor berapa?
Apa huruf B? Jadi 66, kan?
Jadi jika huruf A adalah 65 dan huruf B adalah 66,
jadi 66, semua saya harus lakukan adalah menambahkan 13 untuk itu, dan ini memberi saya 79.
Dan jika kita pergi ke lembar contekan kecil kami, 79 memang peta ke O.
>> Tapi ada sedikit kasus sudut sini.
Apa, katakanlah, huruf Z?
Jika kita melakukan 66 + 25 untuk mendapatkan semua jalan ke akhir alfabet, kita berada di 91.
91 + 13 memberi saya 104, dan coba tebak?
104 tidak sama huruf besar.
Mari kita kembali ke contekan kecil di sini.
Jika saya jalankan kembali program ini dalam pemberitahuan, alat yang 104, jika saya kembali ke jendela terminal,
104 adalah rupanya h huruf kecil.
Jadi kita perlu beberapa trik kunci di sini dalam rangka untuk memastikan bahwa ketika kita mulai dari Z
dan kami menambahkan 13 untuk itu kita tidak ingin terus menempa depan untuk angka yang lebih besar dan lebih besar.
Apa yang kita benar-benar ingin lakukan?
Anda ingin membungkus.
>> Jadi ternyata, karena Anda mungkin telah melihat di bagian sekarang atau di spec masalah set sendiri
menyadari bahwa ada ini operator lain di C yang juga merupakan tanda persen,
tapi sementara kita telah menggunakan% di sini untuk menentukan placeholder,
tahu bahwa, terutama untuk sejumlah masalah 2, ada juga sesuatu seperti ini:
int x = y% z.
Mari saya hanya menyajikan ini sebagai bentuk yang sangat generik ini.
Persen berarti apa dalam bahasa pemrograman? >> [Mahasiswa] Modulo.
Modulo, yang merupakan cara mewah untuk mengatakan sisanya.
Meskipun ada perbedaan sedikit dengan definisi sana,
ini berarti membagi y oleh z tetapi tidak mengembalikan hasil pembagian tersebut;
sebagai gantinya, kembali sisanya.
>> Jadi jika y sebenarnya 3 dan z sebenarnya 2, 3 dibagi dengan 2 adalah 1 dengan sisa 1,
jadi apa yang x sebenarnya sama dalam skenario ini? 1.
Ini adalah suatu yang sederhana, tingkat rendah ide.
Dibutuhkan sedikit waktu untuk mendapatkan pikiran Anda dibungkus sekitarnya
karena itu mungkin sudah cukup lama sejak Anda bahkan harus peduli tentang sisa-sisa
dan benar-benar menggunakannya untuk sesuatu tujuan,
tetapi dalam kasus ini fakta sederhana bahwa Anda dapat pergi dari sejumlah besar seperti 3
ke nomor yang relatif kecil seperti 2 dan kemudian membungkus efektif
dengan menggunakan sisanya ke nilai yang lebih kecil seperti 1 akan menjadi trik yang sangat berharga
bahwa kita bisa menggunakan kedua untuk sesuatu seperti Caesar dan Vigenere ini hal lainnya
dalam masalah set 2, tapi ini akan menjadi trik berulang sepanjang semester.
Ini, Ide sederhana sederhana hanya mengambil sisanya pada umumnya
akan memungkinkan kita untuk membungkus.
Dan seperti yang kita mulai bermain lebih dengan array, seperti yang kita mulai bermain lebih dengan memori itu sendiri,
ini akan menjadi lebih dan lebih dari sebuah trik yang kuat.
>> Jadi pertanyaan kemudian pada ASCII atau representasi string sebagai array?
Dan kita akan mengambil itu 1 notch lebih lanjut. Ya.
[Pertanyaan siswa tidak terdengar] >> Pertanyaan bagus.
Apa artinya bila variabel memiliki tanda bintang di depannya?
Biarkan saya menunda menjawab bahwa secara rinci,
tapi itu mengacu pada topik yang dikenal sebagai pointer.
Pointer harus dilakukan dengan memori, dan kami benar-benar hari
mengambil langkah pertama menuju diskusi tersebut,
tetapi untuk sekarang, biarkan aku berpura-pura bahwa bintang tidak ada
dan kami akan terus memanggil string string daripada menggunakan char *,
yang Anda mungkin pernah lihat sebelumnya dan saya akan memakai layar hanya dalam beberapa saat sebagai teaser.
Jadi kita akan kembali ke yang jauh lebih rinci daripada banyak dari Anda mungkin akan menyukai.
Akhirnya, tidak hari ini. Ya.
>> [Pertanyaan siswa tidak terdengar]
Dalam konteks apa yang Anda miliki untuk memberikan tanda untuk karakter? >> [Mahasiswa] Ya.
Jadi secara default, bila Anda tidak menaruh +, hanya angka positif yang diasumsikan.
Jadi jika hanya menulis nomor 1, itu adalah 1 positif.
Jika Anda benar-benar ingin menentukan negasi dari nilai,
Anda benar-benar harus melakukan -1 pada keyboard Anda.
Tapi ini mungkin bukan pertanyaan Anda. >> [Respon siswa tidak terdengar]
>> Pertanyaan bagus. Oke.
Jadi ini harus dilakukan, saya kumpulkan, dengan beberapa jenis bug yang Anda berlari ke dalam
karena Anda mengkonversi integer ke karakter,
tapi entah bagaimana negatif terlibat,
sehingga karakter baru saja keluar munged entah bagaimana.
Jadi untuk saat ini, biarkan aku menyederhanakan sedikit sampai kita kembali ke topik semacam ini.
Untuk saat ini, memikirkan hal-hal seperti ini - dan ini terlalu menyederhanakan.
Tapi di dunia integer, Anda memiliki berapa banyak bit yang Anda inginkan?
Anda memiliki 32 bit.
Dan sejauh ini, kita telah berbicara tentang jumlah bilangan bulat karena itu Anda dapat mewakili
kira-kira 4 miliar secara total karena Anda memiliki 32 bit,
jadi itu 2 ke 32, sehingga kira-kira 4 miliar.
Tapi kami melihat seminggu atau 2 lalu bahwa Anda tidak benar-benar memiliki kisaran angka
dari 0 pada hingga 4 miliar.
Rentang ini bukannya pergi dari sekitar 2 miliar negatif menjadi positif 2 miliar.
Tapi ini kemudian menimbulkan pertanyaan, bagaimana Anda mewakili gagasan negatif 2 miliar
apalagi negatif 1?
Untuk saat ini, kita dapat menyederhanakan dan hanya mengatakan bahwa kita akan menggunakan bit paling kiri
dari mereka 32 bit, dan jika itu adalah 1 itu adalah angka negatif,
dan jika itu yang 0 itu adalah angka positif.
Masalah dengan representasi yang disederhanakan dari angka negatif
adalah bahwa jika Anda sengaja menjadi pintar dan mencoba untuk mengkonversi dari karakter ke nomor
atau sebaliknya, tidak ada hal seperti itu sebagai karakter negatif.
Dalam dunia ASCII, yang hanya menggunakan 8 bit, semua 8 orang materi bit,
dan bit paling kiri tidak ada hubungannya dengan negatif.
Dan hanya harus jelas, ketika saya mengatakan bit paling kiri,
ingat bahwa ketika kita melakukan sedikit-terkait kami contoh di minggu pertama
ingat bahwa kita menarik hal-hal seperti 1001101, sesuatu seperti ini.
Ketika saya mengatakan bit paling kiri, saya hanya harfiah berarti 1 yang Anda tulis sepanjang jalan ke kiri.
Jadi dalam dunia karakter tidak ada gagasan negatif,
sehingga bit paling kiri sebenarnya memiliki sesuatu untuk dilakukan dengan ASCII, tidak ada hubungannya dengan negatif.
>> Jadi kedengarannya seperti - dan keluar dari konteks sulit untuk menjawab dengan tepat -
tapi entah bagaimana, kode Anda membingungkan bahwa bit paling kiri sebagai mewakili nilai negatif
saat itu benar-benar bagian dari karakter yang bersangkutan.
Dan lagi, aku menyederhanakan karena komputer benar-benar melakukan sesuatu yang sedikit lebih menarik
dari sekedar perubahan yang agak paling kiri ke 1 untuk tanda negatif terhadap 0.
Mereka sebaliknya, jika Anda penasaran untuk Google, menggunakan sesuatu yang biasanya disebut komplemen 2 ini,
yang sedikit lebih canggih dari pendekatan
tetapi gagasan pada akhirnya sama.
>> Jadi singkatnya, itu ada hubungannya dengan fakta bahwa Anda sedang memijat nomor ke karakter
atau sebaliknya, tetapi kode Anda tidak menyadari fakta
bahwa 1 dari bit tersebut memiliki arti penting dalam dunia numerik.
Itu tidak terjadi di dunia karakter.
Tapi terdengar seperti Anda tetap, dalam hal Moot sekarang. Pertanyaan lain.
Oke.
Jadi sejauh ini, semua program kami telah menulis telah mengambil masukan dari pengguna mungkin
dalam bentuk fungsi seperti GetInt, GetString,
atau jika Anda sudah membaca berbagai buku di depan atau referensi online,
Anda sendiri mungkin telah menggunakan fungsi seperti scanf yang, terus terang, kita gunakan di perpustakaan CS50.
Tapi dalam seminggu atau 2, kita benar-benar akan menunjukkan kepada Anda bagaimana perpustakaan CS50 diimplementasikan
sehingga kita dapat mengambil orang-orang roda pelatihan di luar sama sekali.
>> Tapi ternyata ada cara lain untuk mendapatkan masukan dari pengguna.
Pada kenyataannya, kita sendiri telah menggunakan argumen baris perintah
selama beberapa minggu sekarang.
Setiap kali kita telah menjalankan dentang atau kita telah menjalankan make,
kita tidak hanya mengetik dentang, Enter, kami belum membuat mengetik, Enter.
Apa yang telah kita biasanya ditulis setelah dentang kata pada kami jendela terminal prompt?
[Mahasiswa] Nama file. >> Nama file, kan?
Hello.c atau mario.c atau apa pun nama file yang relevan.
Dan dalam arti apa yang Anda benar-benar dilakukan adalah Anda telah mempengaruhi perilaku dentang
karena pasti orang-orang yang menulis dentang tidak tahu bahwa sedikit lama Anda
akan menulis sebuah program yang disebut tahun mario.c kemudian.
Jadi Anda harus entah bagaimana mempengaruhi perilaku program tersebut,
dan bahwa dentang program yang harus ditulis sedemikian rupa sehingga dapat menerima masukan dari Anda
dengan penambahan kata-kata pada prompt sebelum hits pengguna Enter.
>> Jadi ternyata bahwa untuk beberapa waktu kita telah menyatakan hampir semua program kami
untuk memulai seperti ini - int main (void) - dan kemudian kami pergi ke depan
dan mulai menulis kode kita.
Dan kita mungkin memiliki beberapa tajam termasuk di bagian atas file,
tapi hampir semua program kami sejauh ini telah dimulai dengan ini
meskipun Anda mungkin telah melihat dalam bagian, dalam buku-buku, online referensi
bahwa hal ini sebenarnya tidak harus batal.
Bentuk lain yang sah untuk mengambil adalah int argc dan kemudian string argv [].
Jadi sekarang apa ini menyiratkan?
Ternyata argc, yang merupakan konvensi manusia - Anda bisa menyebutnya foo,
tapi itu hanya akan menjadi jauh lebih jelas bagi pembaca -
argc saja argumen ke fungsi yang disebut utama yang mewakili apa?
Apa argc berdiri untuk untuk mereka yang akrab?
>> [Respon siswa terdengar] >> Ya, jumlah argumen atau jumlah argumen.
Ini sesederhana itu.
Berapa banyak argumen yang dilewatkan ke program ini?
Apa artinya?
Jika pada baris perintah saya telah menjalankan sesuatu seperti ini - dentang-mario.c -
argc ketika saya tekan Enter akan mengambil nilai, agak membingungkan, 2.
Jadi ternyata bahwa argc adalah jumlah argumen,
tetapi untuk alasan historis, nama program itu sendiri termasuk dalam hitungan.
Jadi argc adalah 2 ketika saya menulis dentang mario.c.
Apa argv mengandung?
Pertama-tama, argv terlihat seperti string tetapi tidak cukup
karena pada Rabu lalu dan semua yang lebih hari ini,
ini tanda kurung siku menunjukkan apa? Itu array.
Tidak ada angka dalam array, dan itu harus masuk akal intuitif
karena orang-orang yang menulis tahun lalu dentang tentu tidak tahu
berapa banyak kata-kata orang seperti kita akan ketik pada prompt sebelum menekan Enter.
>> Jadi dalam hal ini di sini mereka telah menyatakan fungsi utama sebagai mengambil array argumen,
0 atau lebih argumen.
Mereka tidak tahu sebelumnya berapa banyak ada,
sehingga tidak sengaja ada di dalam jumlah tersebut kurung siku.
Tapi fakta bahwa tanda kurung siku ada yang memberitahu komputer,
mengharapkan array.
Argv hanya singkatan notasi untuk vektor argumen.
Vektor adalah cara mewah untuk mengatakan array,
dan array adalah cara mewah untuk mengatakan daftar atau koleksi.
Jadi ini hanya berarti bahwa jika Anda menulis main seperti ini
bukannya seperti bagaimana kita telah melakukannya selama beberapa minggu,
Program Anda sekarang memiliki kekuatan untuk menerima argumen baris perintah
sehingga tidak ada lagi apakah Anda harus menulis mario dan kemudian tekan Enter,
kemudian mengetikkan nomor untuk berapa banyak blok tinggi Anda ingin piramida menjadi,
lalu tekan Enter lagi.
Kami bahkan tidak perlu menggunakan GetString lagi atau GetInt atau GetFloat dalam hal ini.
Kami hanya bisa berharap pengguna untuk mengetik kata-kata pada prompt itu sendiri
seperti penulis dentang memutuskan akan menjadi program benar-benar menjengkelkan
jika untuk mengkompilasi kode Anda Anda pertama kali dentang mengetik, tekan Enter,
Kemudian kami berkata kepada pengguna, silakan ketik nama file yang ingin mengkompilasi,
maka kita ketik di mario.c dan tekan Enter.
Tapi itulah apa yang telah kami lakukan kepada para pengguna kami beberapa minggu terakhir.
Kami menggunakan GetString dan kami menunggu sampai program ini berjalan untuk meminta mereka untuk masukan.
Yang tidak lagi perlu terjadi.
>> Jadi dalam contoh di sini, kita sekarang memiliki string argv,
dan ini juga terlalu menyederhanakan,
roda pelatihan yang akan segera datang dari.
Ini adalah cara yang lebih tepat menulis ini deklarasi alternatif utama
karena ternyata apa yang kita terus menelepon string yang sebenarnya memiliki bintang,
asterisk, dalam definisi yang sebenarnya, tapi ini hanya terlihat rumit,
itu membingungkan pada awalnya, jadi kita menyederhanakan dengan hanya menciptakan sinonim macam
di perpustakaan CS50 bahwa peta char * untuk string kata yang lebih user-friendly.
>> Jadi mari kita benar-benar mencoba ini kemudian. Biarkan aku pergi ke depan dan membuka gedit sini.
Biarkan aku pergi ke depan dan membuka argv dari 1.
Program ini ternyata mencetak argumen, tetapi dalam istilah bahasa Inggris,
dengan melihat kode ini, apa yang dilakukan ini lebih spesifik?
Jika saya ketik perintah a.out foo bar, apa yang akan dicetak dalam jendela hitam dan putih?
A.out foo bar, Enter.
Silakan. Ya. >> [Respon siswa tidak terdengar]
Baik. Jadi a.out, baris baru, foo, baru garis, bar, baris baru.
Mengapa ini? Kita pasti bisa mengkonfirmasi hanya dalam beberapa saat.
Ini adalah jenis garis halus kode.
Itu hanya mencetak baris baru hanya untuk membuat hal-hal cantik di layar.
Ini adalah sebuah loop yang iterasi dari 0 pada hingga argc,
dan ini incrementing pada setiap iterasi + +.
Jadi ini sekarang mengatakan mencetak string, seperti yang tersirat oleh% s.
Argv [i] cukup banyak ide yang sama dari contoh sebelumnya.
Kami digunakan untuk memanggil variabel s, sekarang itu disebut, sewenang-wenang, argv.
Ini berarti mencetak argumen engan yang diketik pada baris perintah,
dan kemudian setelah semuanya selesai, untuk mengukur baik cetak satu lagi baris baru.
>> Jadi mari kita lihat ini. Mari saya membuka jendela terminal.
Biarkan saya mengkompilasi argv dari 1, dan sekarang biarkan aku menjalankan argv dari 1, Enter. Hmm. Oke.
Mari kita menjalankan bar foo. Menarik. Baz.
Dan jika Anda pernah bertanya-tanya mengapa saya mengetik ini,
ini hanya sebuah konvensi komputer juga bodoh ilmu.
Dunia seringkali hanya membutuhkan placeholder verbal untuk kata-kata.
Jadi jika Anda ingin berbicara tentang beberapa string generik,
ilmuwan komputer hanya cenderung untuk mengatakan foo ketika mereka membutuhkan kata acak,
kemudian mereka mengatakan bar jika mereka membutuhkan kata acak kedua,
kemudian mereka mengatakan baz jika mereka membutuhkan kata ketiga, maka mereka katakan qux jika mereka membutuhkan kata keempat,
dan kemudian ada online debat besar agama seperti apa datang setelah qux,
sehingga Anda dapat Google bahwa untuk mencari tahu apa kata sewenang-wenang lainnya harus.
Tapi ini tidak berarti apapun telah,
meskipun foo bar, jika Anda Google itu, yang tidak memiliki arti,
yang merupakan bagian dari etimologi sini.
>> Jadi semua ini lakukan kemudian mencetak 1 dari string per baris.
Jadi jika saya sebagai gantinya, meskipun, ingin mendapatkan sedikit lebih menarik,
anggaplah bahwa saya tidak ingin mencetak setiap string per baris;
Saya ingin mencetak masing-masing karakter dari setiap string per baris.
Bagaimana aku bisa melakukan itu bukan?
Apa yang saya perlu mengubah tentang program ini jika saya ingin mencetak tidak setiap kata
tapi saya ingin mencetak setiap huruf kata dengan huruf demi huruf,
maka huruf berikutnya kata dengan huruf demi huruf?
Bagaimana kita menggabungkan ide-ide sejauh ini? Ya.
[Mahasiswa]% c. >> Baiklah. Jadi kita membutuhkan suatu tempat c%.
Baik, karena saya tidak ingin mencetak string keseluruhan, saya ingin mencetak karakter. Apa lagi?
>> [Respon siswa terdengar] >> menarik.
Jadi kita perlu semacam dimensi kedua di sini sekarang
karena memikirkan argv sebagai sebuah array, tapi itu sebuah array dari string.
Tapi seperti dari, seperti, 15 menit yang lalu, apa string? Ini adalah array karakter.
Jadi benar-benar, argv adalah array dari array karakter,
array dari array karakter.
Jadi ternyata kita dapat menggunakan notasi bracket hanya lebih persegi. Jadi mari kita lakukan ini.
Di bagian atas lingkaran ini on line 19, aku akan iterate dari i sampai dengan argc,
tapi kemudian aku akan melakukan hal ini:
untuk - Saya tidak dapat menggunakan saya sekarang.
Aku butuh variabel lain karena saya ingin iterate atas kata-kata
tapi kemudian juga atas huruf dalam kata-kata
jadi saya semacam memiliki sumbu vertikal dan sumbu horisontal, semacam konseptual.
Jadi j int mendapat 0, maka saya ingin melakukan j selama j kurang dari - dan saya akan membersihkan ini dalam sedikit.
Bagaimana cara iterate atas huruf dalam string? Kami melakukan ini beberapa saat yang lalu.
Strlen dari argv [i]. Baik.
Dan lagi, saya sedang membuat inefisiensi kecil di sini dengan tidak menciptakan n atau apapun,
tapi kami akan kembali untuk itu.
>> Jadi sekarang j + +. Sekarang aku harus indent lebih lanjut di sini.
Apa yang harus saya sekarang ingin mencetak pada setiap iterasi?
[Respon siswa terdengar] >> Jadi [i] akan memberikan kata.
[I] [j], semacam matriks.
Bagi Anda dengan matematika-y latar belakang,
kita semacam pengindeksan lebih dalam ke dalam matriks atau array ini dari array,
struktur 2-dimensi.
Jadi sekarang mari kita lihat apa yang terjadi di sini. Mari saya membuka jendela terminal besar saya.
Biarkan saya jalankan kembali membuat dari argv dari 1.
Dan aku sudah mengacau di sini, yang merupakan pelajaran yang baik karena saya juga lupa untuk melakukan hal ini.
Secara implisit menyatakan 'strlen' C fungsi perpustakaan dengan unsigned tipe '-
Aku bahkan tidak tahu apa sisa berarti, tetapi saya telah melihat ini sebelumnya,
implisit menyatakan.
Setiap kali kita melihat kesalahan ini, apa ini biasanya menandakan?
>> [Respon siswa terdengar] >> Saya lupa perpustakaan top up. Tapi tunggu dulu.
Biasanya aku sudah kacau karena saya lupa perpustakaan CS50, tapi itu ada.
Biasanya aku sudah kacau karena saya sudah lupa standar I / O.
Dan terus terang, saya bahkan tidak perlu ini. Kami tidak menggunakan GetString hari.
Jadi apa yang saya hilang?
Ada perpustakaan lain yang sekarang kita perlu menggunakan string.h sesekali disebut,
dan ini hanya satu lagi perpustakaan yang memiliki fungsi lebih yang tidak dalam standar I / O.
>> Jadi mari kita kembali ke jendela terminal besar saya.
Oke. Sekarang, sialan, saya kira saya salah. Saya menggunakan perpustakaan CS50.
Jadi kita bisa memperbaiki ini di salah satu dari 2 cara.
Kita dapat mengambil roda pelatihan di luar sekarang dan hanya melakukan hal ini,
atau jenis mari kita menjaga dari penyederhanaan itu hanya untuk saat ini, paste kembali,
memecahkan masalah itu, dan sekarang kembali ke jendela terminal.
Jadi harus jelas, di perpustakaan CS50 bukan hanya fungsi,
itu juga string kata kunci, itulah sebabnya mengapa kesalahan yang baru saja terjadi.
>> Jadi di sini kita pergi. Saya tetap kedua masalah perpustakaan. Enter. Baik.
Argv dari 1, foo bar, Enter. Sangat baik.
Jadi sekarang kita memiliki setiap huruf dari setiap kata dicetak 1 per baris,
yang tidak membuat untuk program yang sangat menarik,
tapi perhatikan sekarang kita memiliki kemampuan tidak hanya kata-kata iterasi
tetapi juga atas huruf individu dalam kata-kata, yang terdengar sangat akrab
bahkan yang paling sederhana dari aplikasi seperti huruf berebut dalam string seperti ini.
Mari kita pergi ke depan dan mengambil 5 menit istirahat kami di sini.
Dan ketika kita kembali, kita akan mulai berbicara tentang efisiensi
dengan mana kita dapat melakukan hal-hal yang lebih baik.
>> Baiklah. Kami kembali.
Berkat salah satu dari kami yang TF memainkan banyak bananagrams,
kita benar-benar memiliki sejumlah besar karakter dengan kami di sini hari ini
fisik menjelma dengan potongan-potongan plastik kecil,
dan biarkan aku mengusulkan bahwa batu putih kosong di sini merupakan RAM di komputer saya -
laptop, desktop, apa pun - dan ada tampak seperti banyak dari itu
karena jika kita mulai memotong RAM ini menjadi kecil byte ukuran potongan,
mari kita sewenang-wenang mengatakan bahwa sesuatu yang ukuran dan kabur mewakili -
di sana kita pergi, dan mari kita zoom out sedikit di sini -
katakanlah sesuatu yang merupakan ukuran satu byte.
Jadi kita memang bisa muat sejumlah byte atau karakter dalam memori ini,
seperti yang disarankan oleh ukuran relatif di sini.
>> Jadi misalkan sekarang bahwa tujuannya adalah untuk mengalokasikan memori untuk string.
Bagaimana hal ini benar-benar bekerja?
Dalam program kami telah menulis, kita biasanya telah menggunakan GetString,
tapi sekarang, jelas, ada saluran ini lain melalui mana kita bisa mendapatkan input pengguna dalam argv
melalui argumen baris perintah.
Tapi apa yang sebenarnya terjadi di bawah tenda?
Ternyata jika kita sebut - mari kita gulir kembali ke GetString - yang GetString fungsi
di perpustakaan CS50, pengguna diminta untuk string,
diketik oleh pengguna dalam beberapa kata - sebut saja HELLO.
Dan kita telah mengatakan selama beberapa minggu bahwa nilai pengembalian GetString
sebenarnya string, seperti kata HELLO.
>> Tapi apa yang benar-benar melakukan GetString?
Sebagai jenis pengguna dalam HELLO, Enter, GetString adalah mencari tahu,
oke, berapa banyak karakter ini? Ini adalah H-E-L-L-O.
Sehingga perlu mengalokasikan, perlu meminta sistem operasi - Linux dalam hal ini -
untuk setidaknya 5 byte untuk menyimpan HELLO.
Dan apa yang kemudian mulai lakukan setelah itu akan kembali mereka 5 byte dari sistem operasi
adalah untuk lay out HELLO kembali untuk kembali ke kembali ke belakang.
Dan jadi apa yang sebenarnya kembali dari GetString adalah sepotong data yang terlihat seperti ini.
Tapi ini agak tidak akurat karena ternyata bahwa itu tidak sesederhana
sebagai hanya menyimpan HELLO dalam memori komputer
karena menganggap bahwa program saya bahwa saya sedang menulis di C kemudian memanggil GetString lagi,
dan kata berikutnya pengguna jenis dalam adalah BYE, BYE.
Yah, saya harus cocok dengan kata BYE di suatu tempat di memori.
Saya tidak bisa mengalahkan HELLO.
Misalnya, saya tidak ingin komputer untuk hanya mulai Timpa seperti ini
kata aslinya karena saya masih mungkin menggunakan kata HELLO dalam variabel
tempat lain dalam program saya.
>> Jadi B-Y-E harus berakhir di tempat lain dalam memori.
Tapi konvensi biasanya adalah bahwa string berikutnya Anda mengalokasikan
mungkin, tapi tidak selalu, akan berakhir pada lokasi memori yang tersedia berikutnya.
Dan jika saya belum meminta sistem operasi untuk memori setiap
sejak terakhir kali aku menelepon GetString, kemungkinan adalah BYE kata
akan berakhir tepat setelah kata HELLO dalam memori.
Tapi pada titik ini Anda mungkin dapat melihat di mana masalah potensial muncul.
Karena selanjutnya potongan memori, byte berikutnya yang hanya gratis -
membersihkan batu tulis putih - dalam memori komputer berada tepat di sebelah HELLO,
rasanya seperti string pertama saya meminta mungkin tiba-tiba sekarang berubah
karena saya sudah dasarnya berubah ke HELLOBYE
bukannya entah bagaimana demarcing awal BYE dan akhir HELLO.
>> Jadi ternyata bahwa apa yang sebenarnya terjadi di bawah tenda,
yang mungkin telah dilirik dalam referensi online atau bagian atau buku
atau tidak sama sekali dulu adalah bahwa sebenarnya ada demarkasi yang disengaja
antara kata-kata dalam memori komputer.
Dan pada kenyataannya, dalam hal ini di sini, bukan hanya menempatkan BYE sebelah kanan HELLO,
sebagai gantinya, komputer menempatkan karakter khusus, karakter null khusus, sehingga untuk berbicara,
yang diwakili dengan tanda garis miring terbalik dengan 0.
Jadi cerita panjang pendek, ingat bahwa karakter terwakili dalam ASCII.
ASCII hanya pemetaan antara angka dan huruf,
dan sebagian besar surat-surat dimulai sekitar 65 untuk modal A,
tapi ternyata Anda pasti dapat mewakili angka 0 sebagai integer atau dalam biner,
dan ternyata dunia memutuskan lama, lama, "Kau tahu apa?"
"Mari kita cadangan angka 0 tidak mewakili setiap karakter pada keyboard -
"Ada surat, tidak ada angka, tidak ada tanda baca. 0 adalah khusus."
"Ini akan menjadi karakter null khusus, dan kita akan menuliskannya sebagai \ 0."
Perbedaan yang jika kita hanya menulis 0, 0 adalah karakter.
Ingat bahwa ada kode ASCII untuk 0, untuk 1, untuk 2, selama 3
karena 0 karakter berbeda dari angka 0.
Dan Anda dapat melihat bahwa jika Anda melihat kembali dari minggu 1 ketika kami pertama kali berbicara tentang ASCII,
0 dan 1 dan 2 dan 3 semua jalan sampai dengan 9 memiliki kode ASCII sendiri.
Mereka tidak, kebetulan, 0 sampai 9. Mereka sangat berbeda.
Jadi 0 hanya berarti "Aku istimewa," dan \ 0 berarti, secara harfiah, "Aku bukan karakter 0."
"Saya ini nilai khusus, karakter null."
Jadi saya benar-benar membutuhkan salah satu dari ini karena saya tidak bisa membuat kesalahan yang sama dua kali.
>> Jadi setelah BYE kata kita juga akan membutuhkan salah satu dari karakter null.
Biarkan aku ambil pena saya di sini dan biarkan aku dengan cepat menarik lain \ 0
sehingga setelah saya telah meminta sistem operasi untuk 2 string
melalui GetString diikuti dengan panggilan lain untuk GetString,
ini adalah apa yang benar-benar di memori.
Jadi ketika aku kembali string, aku benar-benar mendapatkan kembali bahwa,
dan ketika saya mendapatkan string berikutnya, aku benar-benar kembali itu.
Jadi ini menimbulkan pertanyaan, strlen, pertama-tama, apa yang harus itu kembali?
Ketika saya sebut strlen pada string s dan s adalah kata HELLO bahwa pengguna mengetik,
apa yang kita jelas mengatakan panjang HELLO adalah beberapa menit yang lalu?
Itu 5, kan? H-E-L-L-O. Dan itu tentu saja bagaimana strlen bekerja.
Ia mengembalikan apa yang manusia normal akan mengharapkan panjang string untuk menjadi.
Namun dalam kenyataannya, seberapa besar adalah array karakter yang menyimpan halo?
Ini sebenarnya 6.
Jadi strlen tidak menyebutkan fakta bahwa untuk Anda.
Tapi di balik kap mesin komputer memang menggunakan 6 byte untuk menyimpan kata 5 huruf,
dan ini benar tidak peduli berapa lama kata tersebut.
Ada selalu akan menjadi karakter null khusus yang berakhir pada akhir dari string
untuk Demarc panjang total.
>> Jadi jika Anda sekarang orang menerapkan strlen 20, 30 tahun yang lalu,
bagaimana Anda pergi tentang pelaksanaan strlen itu sendiri?
Kami mengambil begitu saja bahwa itu ada, seperti kita mengambil begitu saja bahwa printf ada,
tetapi jika HELLO adalah kata dalam pertanyaan
dan apa yang saya miliki dalam memori adalah sesuatu yang terlihat seperti ini,
jika Anda harus reimplement strlen karena Anda diminta untuk
atau karena, terus terang, Anda tidak tahu strlen ada -
Anda harus menggulung satu ini pada Anda sendiri - bagaimana mungkin Anda menerapkan strlen
ketika diberi sesuatu yang tampak seperti ini?
Sekarang kita tahu string adalah array, kita dapat iterate atas masing-masing karakter individu
menggunakan sesuatu seperti - Mari kita mencoba untuk melakukan hal ini dengan cepat.
>> Biarkan aku pergi ke alat. Mari saya membuat file baru, strlen.c.
Biarkan aku pergi ke depan sekarang dan jangan termasuk stdio.h sehingga kita memiliki akses ke printf.
Biarkan aku melakukan int main (void). Oh. Saya hanya akan melakukan ini pada saya sendiri untuk saat itu. [Terkekeh]
Terima kasih.
Ini adalah apa yang saya lakukan. Baiklah.
Jadi sebelum aku menyalakan layar, saya mengetik semua itu.
Dan sekarang apa yang akan saya lakukan adalah sebagai berikut:
printf ("Beri aku string:")
Itu hanya petunjuk berbulu.
Sekarang biarkan aku melakukan GetString = string s.
Saya sudah perlu untuk melakukan perubahan sekarang.
Saya menggunakan perpustakaan CS50 tiba-tiba, jadi biarkan aku pergi ke depan dan ketik cs50.h.
Dan sekarang mari kita lakukan ini: printf ("Panjang adalah:% d, strlen [s] -
dan aku belum selesai. Apa lagi yang harus saya tambahkan ke program ini?
>> [Mahasiswa] string.h. >> String.h.
Jadi untuk saat ini, kami menggunakan strlen, jadi mari kita pastikan compiler tahu di mana itu,
sehingga kewarasan sedikit memeriksa.
Saya mendapatkan string di baris 8, dan sejalan 9 Saya mencetak panjangnya dengan d%.
Jadi mari kita pergi ke depan dan membuka ini.
Kami telah membuat strlen - mengkompilasi baik-baik saja -
strlen - biarkan aku memperbesar - Masukkan, H-E-L-L-O, Enter. Panjangnya 5.
>> Oke, jadi strlen tampaknya bekerja, tapi dunia tahu itu.
Jadi mari kita sekarang menerapkan strlen diri sebagai berikut.
Biarkan aku mengambil perpustakaan ini pergi.
Kita tidak lagi memiliki akses ke string.h karena saya bahkan tidak tahu itu ada.
Tapi itu tidak apa-apa karena saya bisa menerapkan strlen sendiri
dan memilikinya mengambil string disebut masukan,
dan sekarang aku perlu untuk mengetahui panjang string ini.
Jadi bagaimana saya bisa melakukan ini?
Bagaimana jika saya lakukan - mari kita lihat bagaimana melakukan ini - Apa yang Anda ingin lakukan?
>> [Respon siswa terdengar] >> Oke.
Jadi kita bisa melakukan ini dalam banyak cara. Biarkan saya mencoba untuk mengambil pendekatan ini.
Biarkan saya memberi diriku variabel int i, jadi saya mulai pada 0.
Dan biarkan aku mengatakan ini: sementara input [i] tidak sama dengan apa? \ 0.
Jadi ternyata, seperti halnya dengan semua karakter saat menulis secara harfiah dalam sebuah program,
Anda harus menggunakan tanda kutip tunggal, bukan tanda kutip ganda.
Jadi jika saya sedang menulis surat, saya akan melakukan itu, huruf b, saya akan melakukannya.
Hal ini, sebaliknya, akan menjadi string, bukan karakter individu.
>> Jadi saya ingin \ 0 harfiah. Apa yang ingin saya lakukan dalam lingkaran ini?
Sebenarnya, aku butuh variabel lain, sehingga panjang int mendapat 0.
Bahkan jika Anda tidak yakin mengapa kami mulai dengan cara kita lakukan,
sekarang kita akan jalan ini, apa yang ingin saya lakukan pada baris 9?
panjang + + dan kemudian turun di sini on line 10, panjang kembali.
Jadi bagaimana strlen diimplementasikan?
Ini benar-benar diterapkan mungkin seperti ini.
Mungkin orang yang digunakan untuk loop, mungkin lakukan sementara loop - siapa tahu?
Kami benar-benar harus melihat di bawah kap pada kode sumber yang sebenarnya
dalam beberapa file disebut string.c mungkin.
>> Tapi di sini mari kita berpikir tentang apa yang saya lakukan.
Saya mendeklarasikan sebuah variabel yang disebut i, pengaturan sama dengan 0.
Saya kemudian menyatakan lagi panjang yang disebut variabel, pengaturan sama dengan 0.
Lalu saya katakan sementara karakter i dalam input tidak sama dengan karakter null khusus, \ 0,
kenaikan panjang.
Tapi begitu karakter engan ini karakter khusus, apa yang terjadi pada loop?
Ini sirkuit pendek. Ini berhenti, yang berarti kita kemudian langsung kembali panjang.
>> Jadi jika saya tidak mengacaukan, mari kita pergi ke depan dan kembali ke jendela terminal saya.
Biarkan aku mengkompilasi ulang. Dan aku mengacaukan.
Kompatibel ulang fungsi perpustakaan strlen.
Jadi saya mencoba untuk mendapatkan terlalu pintar untuk kebaikan saya sendiri di sini.
Compiler benar-benar tahu bahwa ada fungsi yang disebut strlen
meskipun kita belum termasuk perpustakaan. Itu baik-baik saja. Apapun.
Kita hanya akan bekerja sama kemudian. Mari kita mengubah nama panjang ini.
Biarkan saya mengubah penggunaan untuk panjang di sini, dan ini akan membuat dentang bahagia.
Sebagai samping, karena beberapa fungsi-fungsi ini begitu darn umum -
strlen, prinf - mereka benar-benar memiliki semacam status khusus.
Dan sehingga dentang hanya tahu sedikit sesuatu yang istimewa tentang mereka.
Itu tidak selalu terjadi dengan fungsi yang paling, jadi itu sebabnya kami mendapat berteriak.
>> Mari saya coba lagi. Untungnya, itu bekerja waktu itu.
Jadi sekarang biarkan aku berjalan sendiri strlen program.
Beri aku string: H-E-L-L-O, Enter. Dan aku telah mengacaukan.
Kenapa? >> [Respon siswa terdengar] >> Tepat.
Jadi aku punya diriku di sini infinite loop yang sangat tampan
karena meskipun aku incrementing panjang pada setiap iterasi,
apa yang saya jelas tidak melakukan? Aku tidak incrementing i. Oke. Mudah memperbaiki. Ya?
Oke. Tidak Sekarang kita akan bertabrakan dengan beberapa kesalahan umum lain di mana saya harus tanda kurung.
Dan terus terang, kode ini mulai terlihat jelek,
jadi kita akan mengambil bacokan di membersihkan hal ini dalam sekejap.
Tapi sekarang aku incrementing baik panjang dan i.
Terus terang, saya sudah melihat kesempatan untuk perbaikan di sini, tapi kami akan kembali untuk itu.
>> Jadi sekarang mari kita pastikan kita setidaknya membuat kemajuan.
Hal ini terjadi pada beberapa dari Anda, dan saya tidak menyebutkan ini di muka.
Bila Anda memiliki kemalangan skenario seperti ini, bagaimana Anda memperbaiki ini
singkat restart alat atau komputer Anda atau menutup jendela?
Ini sebenarnya mudah.
Kontrol C akan mengirimkan wortel kecil simbol C, dan itu hanya berakhir sebagian besar program.
Jika Anda memiliki loop tak terbatas benar-benar buruk yang mencetak kali hal-hal tak terhingga banyaknya,
kadang-kadang Anda mungkin harus menekan Control C seribu kali untuk membuatnya benar-benar mendengarnya.
Jadi hanya sadar sekarang karena aku tidak mencetak apa-apa, itu cukup mudah.
Dan secara teknis, sekali sudah cukup, tapi saya tidak sabar dan saya biasanya memukul bahwa berkali-kali.
>> Jadi strlen. Beri aku string: HELLO. Apakah akan bekerja saat ini?
Oke. Kesalahan umum lainnya. Harus mengkompilasi ulang.
Itu memang disengaja, yang satu. Baiklah.
Jadi strlen, H-E-L-L-O, Enter. Sangat baik.
Jadi kita sekarang memiliki strlen sampai 5.
Jadi kita telah benar-benar reimplemented roda itu.
Jadi sekarang mari kita membersihkan ini karena ini tidak membuat saya terkesan
dengan desain kode saya.
Apa yang bisa kita jelas menghilangkan dalam program ini untuk membersihkan ini?
[Respon siswa terdengar] >> Ya. Secara harfiah, kita memperlakukan saya dan panjang identik.
Jadi kenapa tidak kita hanya mendapatkan cerdas dan mengatakan sementara panjang?
Sebaliknya, mari kita sebut saja panjang untuk memulai dengan, menginisialisasi ke 0
karena secara default string memiliki panjang tidak sampai kita mengetahui apa itu.
>> Sekarang kita melakukan ini, dan sekarang ini adalah program yang cukup elegan.
Satu variabel. Aku membersihkan itu, diperketat itu.
Jadi sekarang mari kita kembali ke jendela terminal saya. Mari kita pergi ke depan dan menjalankan ini.
Membuat strlen. Terlihat bagus. Jalankan strlen lagi, Enter.
Beri aku string: HELLO, Enter. Dan tampaknya akan bekerja sebagai 5.
Sekarang, harus jelas, jika saya tidak menulis, misalnya, HELLO di 1 string
dan kemudian BYE di lain, kita pasti bisa memiliki beberapa kata.
Jika ekspresi saya benar-benar ingin mengetik tidak HELLO tetapi, misalnya,
HELLO WORLD, perhatikan bahwa apa yang kita tidak akan memiliki situasi ini di sini, kan?
Itu akan menunjukkan bahwa itu 2 string.
Anda pasti dapat memiliki karakter spasi bar, jadi jika kita benar-benar mengetik dalam frase lagi
seperti DUNIA HELLO, apa yang kita benar-benar harus di memori
terlihat sedikit sesuatu seperti itu ada.
>> Baiklah. Setiap pertanyaan kemudian mengenai representasi sini string?
Tidak ada? Baiklah.
Jadi saya katakan sebelumnya bahwa menelepon strlen lagi dan lagi sengaja seperti itu
mungkin bukan ide terbaik karena Anda akan melakukan seluruh banyak pekerjaan
lagi dan lagi dan lagi.
Memang, apa jenis pekerjaan yang diperlukan untuk mencari tahu panjang string, rupanya?
Anda harus mulai dari awal dan kemudian lihat, lihat, lihat, lihat, lihat
sampai akhirnya Anda melihat bahwa karakter khusus, di mana titik, ah, sekarang saya tahu panjang.
Jadi sebelumnya ketika kami telah strlen dipanggil lagi dan lagi dan lagi,
alasan saya mengusulkan bahwa agak bodoh adalah karena lagi-lagi, string yang terlihat seperti itu.
Ini tidak akan berubah setiap kali Anda iterate melalui lingkaran tertentu,
sehingga Anda melakukan pekerjaan yang tidak perlu.
Pada saat yang sama Anda harus tahu, sebagai samping, bahwa kompiler seperti dentang hari ini
telah dikembangkan selama bertahun-tahun,
dan compiler penulis, programmer, cukup pintar.
Dan sehingga ternyata bahwa dentang dan lainnya kompiler benar-benar dapat mengetahui bahwa,
oke, ya, Anda menulis strlen dalam kondisi Anda,
yang secara teknis berarti bahwa kita akan menyebutnya lagi dan lagi dan lagi.
Tapi compiler pintar benar-benar dapat mengoptimalkan keputusan semacam pengguna miskin
keluar dari kode Anda untuk memperbaiki hal.
>> Jadi jangan hanya menyadari bahwa kadang-kadang compiler lebih pintar dari kita
dan akan jenis menyembunyikan kesalahan kita sendiri.
Namun yang pasti ketika datang ke set masalah dan sejenisnya,
jangan berpikir tentang keputusan-keputusan desain fundamental salah
berpotensi untuk alasan sederhana bahwa kita akan melakukan pekerjaan jauh lebih
daripada kita benar-benar harus lakukan. Tapi berapa banyak lebih banyak pekerjaan?
Dalam kasus WORLD HELLO, mari kita mulai untuk menggeneralisasi ukuran masalah ini.
Apa panjang masalah atau ukuran masalah
ketika kata pengguna mengetik adalah HALO?
Ini rupanya 5, mungkin 6. Plus atau minus 1. Apapun.
Hal ini begitu dekat kita hanya akan menyebutnya 5.
>> Jadi apa ukuran masalah di sini ketika mencoba untuk mencari tahu panjang HELLO?
Ini 1, 2, 3, 4, 5, 6 dan mungkin untuk karakter terakhir, tetapi mari kita generalisasi bahwa sebagai n.
Jadi n, hanya n variabel, adalah apa yang ilmuwan komputer biasanya akan menggunakan
untuk menggambarkan ukuran masalah, dan masalah di tangan adalah berapa lama HELLO?
Berapa banyak waktu yang strlen ambil?
Dibutuhkan pada urutan langkah n, di mana setiap langkah berarti melihat karakter,
melihat karakter, melihat karakter.
Dan kami memiliki diskusi ini beberapa waktu lalu, jumlah operasi membutuhkan sesuatu.
Hari pertama kelas kami semua canggung berdiri,
dan kemudian semua orang mulai berpasangan off dengan satu sama lain
dalam rangka untuk benar-benar menghitung idealnya berapa banyak orang berada di dalam ruangan.
Dan kami juga melakukan hal lain dimana jika saya bukan melakukannya dengan cara lama sekolah
hanya mulai 1, 2, 3, 4, 5, 6, dan sebagainya,
itu juga, ukuran masalah yang berukuran n. Ada orang-orang n di dalam ruangan.
Tapi aku bisa mempercepat itu, kan? Gaya sekolah dasar saya bisa mulai menghitung dalam 2s.
2, 4, 6, 8, 10, 12. Dan yang terasa begitu jauh lebih cepat, dan memang itu.
Itu benar-benar dua kali lebih cepat, tapi sekali lagi, jika lain 400 orang masuk ke ruangan ini
sekaligus, algoritma tersebut akan memakan waktu 400 atau mungkin 200 langkah.
>> Tapi sebaliknya, jika kita benar-benar mendapatkan cerdas dan kita malah memiliki semua Anda menghitung sendiri,
mengingat bagaimana algoritma yang bekerja.
Anda semua berdiri. Biarkan aku cepat-maju untuk ini.
Anda semua berdiri, Anda berpasangan, maka setengah dari Anda duduk,
setengah dari Anda duduk, setengah dari Anda duduk,
dan pada setiap iterasi dari loop dari minggu 0, kita dibelah dua masalah yang dihadapi
dan pergi ke n / 2, maka n / 4, maka n / 8.
Dan implikasi dari itu adalah bahwa jika lain 400 orang berjalan ke ruang, bukan masalah besar,
itu akan membawa kita putaran 1 lagi, tidak 400 putaran lagi, tidak 200 putaran lagi.
Dan jadi cerita kami mengatakan beberapa waktu lalu harus melakukan sedikit sesuatu dengan ini.
Ini garis merah di sini adalah linear, itu lurus, dan itu diberi label sebagai n
karena sebagai ukuran masalah tumbuh,
jika algoritma atau program dengan mana Anda memecahkan dibutuhkan langkah n,
kita bisa plot sebagai garis lurus di mana dibutuhkan lebih banyak waktu semakin besar ukuran masalah.
Dan pendekatan twosies, menghitung 2, 4, 6, 8, masih garis lurus, hanya sedikit lebih baik.
Butuh waktu sedikit kurang, sehingga garis kuning di bawah titik garis merah untuk titik.
>> Tetapi bahkan lebih baik adalah ini grail suci dari apa yang kita disebut waktu logaritmik
di mana bahkan jika lagi kita dua kali lipat jumlah orang di dalam ruangan,
kami dua kali ukuran buku telepon dari hari pertama kelas,
bukan masalah besar, dibutuhkan 1 halaman air mata lebih banyak, membutuhkan waktu 1 duduk lebih turun
dalam rangka memecahkan masalah yang dua kali lebih besar.
Dan jadi pembicaraan kita sekarang bisa mulai memiliki yang
bagaimana kita benar-benar memecahkan masalah secara efisien
jika kita mempertimbangkan masalah sederhana seperti ini?
Misalkan kita memiliki 8 pintu belakang yang beberapa angka,
dan masing-masing angka ini tidak diurutkan dengan cara apapun,
mereka hanya acak bilangan bulat di balik pintu,
dan kami bertanya bagaimana Anda pergi tentang menemukan nomor - siapa tahu -
7 balik pintu?
Apa yang akan Anda, manusia, dilakukan dalam rangka untuk menemukan saya nomor 7
kalau lagi masing-masing adalah pintu dan untuk melihat nilai Anda harus membuka pintu?
Apa yang akan Anda algoritma menjadi mungkin?
>> [Respon siswa terdengar] >> Jadi, mulailah dengan kiri dan membuka pintu, membuka pintu, membuka pintu.
Dan dalam kasus terburuk, berapa lama itu akan membawa kita untuk menemukan nomor 7?
Dan lagi, mereka tidak diurutkan, sehingga tidak semudah, juga, aku akan membuka pintu 7.
Ini bisa membawa kita, maksimal, 8 langkah.
Dalam kasus terburuk, 7 adalah secara acak pada akhir dari garis pintu,
jadi kita mungkin harus mencoba semua pintu n.
Jadi sekali lagi di sini, tampaknya kita memiliki algoritma linear.
Bahkan, kami melakukan ini hanya beberapa tahun yang lalu.
Salah satu pendahulu Anda ditantang dengan tepat ini
di mana kita tidak memiliki versi digital, kita malah memiliki papan tulis
dengan beberapa lembar kertas di atasnya.
Dan apa yang saya pikir akan saya lakukan adalah mengambil cepat melihat kembali bagaimana ini pergi,
salah satu peluang yang paling canggung dan mungkin terbaik di atas panggung
untuk memiliki demonstrasi di sini di Sanders.
Kami memiliki 2 baris nomor.
Kita hanya akan melihat apa yang terjadi di sini dengan Sean untuk bagian paling atas dari baris.
Kecuali ada yang pernah lagi sukarelawan di CS50,
kita memiliki berkat Sean untuk menjaga ini pada kamera,
jadi dia tahu bahwa ratusan orang telah menonton ini sekarang selama bertahun-tahun.
Tapi Sean melakukan pekerjaan yang menakjubkan - atau dia - pada kami benar-benar menemukan nomor tertentu?.
>> Jadi mari kita lihat bagaimana ia memecahkan algoritma ini sehingga kita akan melanjutkan pembicaraan ini tak lama
bagaimana kita menemukan hal-hal efisien.
[Malan video] Saya telah tersembunyi di balik pintu-pintu nomor 7,
tapi terselip di beberapa pintu serta yang lain non-negatif angka,
dan tujuan Anda adalah untuk memikirkan ini baris atas angka hanya sebagai array
atau hanya urutan potongan kertas dengan angka di belakang mereka,
dan tujuan Anda adalah, hanya menggunakan array atas sini, menemukan saya nomor 7.
Dan kita kemudian akan kritik bagaimana Anda pergi tentang melakukannya. >> Baiklah.
[Malan] Temukan kami nomor 7, silakan.
[Tertawa]
[Malan] No [tertawa]
5, 19, 13, [tertawa]. Ini bukan pertanyaan jebakan.
1.
[Tertawa]
Pada titik ini skor Anda tidak begitu baik, sehingga Anda mungkin juga terus. [Tertawa]
3.
Pergilah. Terus terang, saya tidak bisa membantu tetapi bertanya-tanya apa yang Anda bahkan berpikir tentang. [Tertawa]
Hanya baris atas, sehingga Anda punya 3 kiri. Jadi menemukan saya 7.
[Siswa bergumam]
[Malan] 17.
[Siswa bergumam]
[Malan] 7! [Tepuk tangan]
>> Jadi pada hari Rabu kita akan menyelam ke dalam ini dan algoritma yang lebih canggih untuk menemukan hal-hal.
Untuk saat ini kami akan meninggalkan Anda dengan Sean dan melihat Anda pada hari Rabu.
[CS50.TV]