[Powered by Google Translate] Masalah Seksyen Set 2: Edisi Hacker
Rob Bowden, Universiti Harvard
Ini adalah CS50. CS50.TV
Jadi, saya Rob. Saya kanan di Kirkland. Ini adalah tahun ketiga saya TFing CS50.
Ia adalah kali pertama bahawa kita berubah dari seksyen gaya tradisional kuliah,
di mana kita hanya jenis kajian apa yang berlaku di kuliah dan kemudian anda semua bertanya soalan,
sekarang untuk yang lebih banyak berasaskan masalah, di mana kita menggunakan kawasan, dan -
Oh, jadi idea untuk pergi ke pautan itu saya menghantar kepada anda dan kemudian anda akan di Angkasa saya.
Adakah sesiapa yang tidak mempunyai komputer riba? Okay.
Jadi kita akan menggunakan ini, dan kami akan melakukan masalah tinggal di seksyen
dan membincangkan mereka dan memikirkan apa yang salah
dan saya mungkin tarik sehingga beberapa kod anda, dan saya mungkin membincangkan idea-idea anda.
Begitu juga sesiapa yang menghadapi kesukaran?
Anda boleh berbual di sebelah, saya tidak tahu jika kita akan mempunyai sebab untuk itu.
Kini, seperti supersection sebelumnya, jika anda berada di kelas itu, anda tahu apa itu kira-kira.
Pada semua set P ada akan menjadi bahagian-bahagian ini.
Jadi P set 2, spesifikasi, saya rasa anda melihat ia pada P-set 1 sudah.
Tetapi kita boleh melihat P set 2 untuk apa yang kita akan akan lebih hari ini.
Dan anda akan melihat seksyen soalan.
Jadi ini akan menjadi dalam semua P-set; akan ada seksyen soalan.
Setakat ini kita telah berkata, "Pertimbangkan ini peluang untuk mengamalkan."
Anda tidak akan diminta untuk mengemukakan program ini.
Idea ini adalah bahawa ini sepatutnya kepada jenis membantu anda memulakan dengan set masalah.
Saya rasa pada edisi Hacker, banyak daripada mereka yang sepatutnya hanya menjadi baru, perkara-perkara yang menarik untuk belajar.
Mereka mungkin tidak langsung digunakan untuk set masalah.
Dan sekarang kita tidak mempunyai anda serahkan mereka, tetapi dalam teori,
untuk set masalah kemudian, anda mungkin mengemukakan mereka, dan dengan itu anda boleh datang ke bahagian
atau menonton seksyen untuk mendapatkan jawapan, atau anda hanya boleh mendapatkan mereka pada anda sendiri
jika anda tidak merasa seperti menikmati kehadiran saya.
Jadi - Saya rasa ini adalah yang pertama.
Oh. Juga, bawah seksyen ini soalan kita juga telah anda bertanya soalan tentang seluar pendek.
Jadi saya rasa, dalam teori, anda sepatutnya untuk menonton ini sebelum datang ke seksyen,
tetapi ia adalah baik jika anda tidak lakukan, kita akan pergi ke atas mereka anyway.
Jadi kita boleh mulakan dengan ini: "Bagaimana gelung sementara berbeza dari gelung do sementara?
Bilakah kedua amat berguna? "
Jadi sesiapa mempunyai apa-apa?
[Pelajar] do-gelung while akan sentiasa melaksanakan sekurang-kurangnya sekali.
Ya. Supaya perbezaan. Satu gelung sementara - I'll hanya melakukannya di sini - gelung while, kita mempunyai keadaan
di sini, manakala do-sementara, anda tidak mempunyai keadaan yang sehingga kita sampai ke sini.
Dan sebagainya, apabila program anda yang melaksanakan, dan ia mendapat gelung sementara,
ia segera memeriksa jika keadaan ini adalah benar.
Jika keadaan itu tidak benar, ia hanya akan melangkau lebih gelung sepenuhnya.
Do-gelung while, sebagai program melaksanakan, ia menjadi kepada "melakukan."
Tiada apa-apa yang berlaku pada ketika ini, hanya terus melaksanakan.
Kemudian apabila ia mencecah "sementara," jika keadaan adalah benar, ia gelung akan kembali dan melakukannya sekali lagi
dan lagi dan lagi sehingga keadaan tidak benar dan kemudian hanya jatuh melalui.
Jadi, perbezaan, bahawa ini boleh melangkau hak dari awal lagi.
Ini semestinya melaksanakan sekali dan kemudian boleh melaksanakan lebih banyak kali jika keadaan masih benar.
Jadi gelung sementara hanya akan melakukannya sekali, atau - gelung sementara - kita mungkin tidak perlu untuk melakukannya pada semua,
sejak secepat kita mendapatkannya, jika keadaan itu adalah palsu, kita hanya akan melangkau hak ke atas.
Manakala do-gelung while, kita akan melaksanakan sekali, semestinya.
Kemudian, apabila kita sampai kepada keadaan, kita memeriksa jika ia adalah benar atau palsu.
Jika ia benar, kita akan lakukan sekali lagi, jika ia adalah palsu, kita hanya akan terus pergi.
Jadi apabila kedua amat berguna?
Jadi, saya boleh mengatakan bahawa secara keseluruhan 4 tahun, 3 tahun, apa jua,
bahawa saya telah pengaturcaraan, saya telah menggunakan ini, seperti, di bawah 10 kali.
Dan mungkin 5 daripada mereka adalah di CS50 apabila kita memperkenalkan gelung do-sementara.
Jadi apabila anda digunakan lakukan sementara gelung?
Bilakah - ya?
[Pelajar] Apabila anda cuba untuk mendapatkan input pengguna, atau sesuatu yang anda mahu untuk memeriksa -
Yeah. Jadi lakukan sementara gelung, input pengguna adalah satu besar.
Itulah sebabnya pada masalah pertama set pasangan, apabila anda mahu untuk meminta pengguna, seperti,
"Memberi saya rentetan," anda tidak boleh terus sehingga anda mendapat bahawa rentetan.
Dan sebagainya anda, semestinya, perlu untuk meminta tali sekurang-kurangnya sekali.
Tetapi kemudian jika mereka menjawab sesuatu yang buruk, maka anda perlu untuk gelung balik dan bertanya lagi.
Tetapi selain daripada input pengguna, ia amat jarang berlaku bahawa saya menghadapi kes
mana saya mahu gelung "sekurang-kurangnya sekali" tetapi mungkin lebih.
Soalan atau? Adakah sesiapa yang digunakan do-gelung while mana-mana sahaja?
Okay. Jadi yang seterusnya adalah, "Apakah tidak diisytiharkan pengecam
biasanya menunjukkan jika outputted oleh dilafaz? "
Jadi apa jenis kod yang saya boleh menulis untuk mendapatkan 'pengecam tidak diisytiharkan?'
[Pelajar] Itu x = 2?
Jadi kita hanya boleh cuba di sini, x = 2.
Kami akan menjalankan ini - oh, saya tidak klik. Jadi di sini kita mendapat hak semua.
"Gunakan x pengecam yang tidak diisytiharkan."
Jadi itulah pengecam tidak diisytiharkan, pembolehubah.
Ia kerap akan memanggil pengecam pembolehubah.
Jadi ia mungkin tidak tahu ia sebenarnya pembolehubah, ia tidak tahu apa itu.
Jadi ia adalah pengecam.
Jadi mengapa ia tidak diisytiharkan? Yeah.
Jadi untuk menjadi jelas tentang istilah, pengisytiharan pembolehubah
adalah apabila anda mengatakan "int x," atau "tali y," apa-apa.
Pengawalan pembolehubah, atau tugasan pembolehubah,
apabila anda mengatakan "x = 2."
Jadi, kita boleh melakukan ini dalam langkah-langkah yang berasingan, int x, x = 2, dan sehingga kita boleh mempunyai sekumpulan barangan di sini -
tetapi sehingga garisan ini berlaku, x masih tidak diisytiharkan, tetapi ia telah diisytiharkan.
Dan supaya kita jelas boleh melakukannya di baris 1, dan sekarang kita sedang mengisytiharkan dan Memulakan.
Soalan?
Dan akhirnya, "Mengapa adalah Caesar Cipher tidak sangat selamat?"
Jadi pertama, adakah sesiapa yang mahu untuk mengatakan apa Cipher Caesar?
[Pelajar] Caesar Cipher hanya adalah bahawa anda memetakan, anda beralih setiap huruf,
beberapa huruf tertentu pergi ke atas, dan bergerak kembali ke atas, dan ia tidak sangat selamat kerana
terdapat hanya 26 pilihan yang mungkin dan anda hanya perlu mencuba setiap 1 daripada mereka sehingga anda mendapatkan ia.
Oh. Jadi, saya perlu mengulangi?
Cipher Caesar, it's - Maksud saya, anda akan berurusan dengan ia pada masalah yang anda -
atau saya rasa edisi standard set masalah yang tidak pada edisi penggodam.
Jadi pada edisi standard set masalah, anda akan mendapat mesej seperti, "Hello dunia,,"
dan anda juga mempunyai beberapa seperti 6, dan anda mengambil mesej itu, dan setiap watak individu,
anda memutarkan ia dengan 6 jawatan dalam abjad.
Jadi 'h' hello akan menjadi h-i-j-k-l-m-n.
Jadi surat pertama akan n. Kami melakukan perkara yang sama dengan e.
Jika kita mempunyai, seperti, z atau sesuatu, maka kita membalut kembali sekitar '.'
Tetapi setiap aksara mendapat dikitar 6 aksara kemudian dalam abjad, dan ia tidak sangat selamat
kerana terdapat hanya 26 kemungkinan untuk berapa banyak cara anda boleh balut surat tunggal.
Jadi, anda hanya boleh cuba semua 26 daripada mereka dan, mungkin, untuk mesej yang cukup panjang,
hanya 1 daripada mereka yang 26 perkara yang mungkin akan menjadi mudah dibaca,
dan satu mudah dibaca akan menjadi mesej asal.
Jadi ia bukan cara yang sangat baik menyulitkan apa-apa pada semua.
Tidak berkaitan kepada mereka seluar pendek, "Apakah fungsi?"
Jadi apa fungsi? Ya.
[Pelajar] Ia adalah seperti sekeping berasingan kod yang boleh anda panggil untuk pergi melalui dan kemudian mendapatkan nilai pulangan apa sahaja.
Yeah. Jadi saya akan menjawab dengan juga menjawab seterusnya atau berulang juga hanya menjawab satu depan.
Anda boleh menggunakan fungsi-fungsi dan bukannya hanya menyalin dan menampal kod lebih dan lebih lagi.
Hanya mengambil kod itu, meletakkan ia ke dalam satu fuction, dan kemudian anda hanya boleh memanggil fungsi
di mana anda telah menyalin dan menampal.
Jadi fungsi berguna.
Jadi sekarang kita akan melakukan masalah sebenar.
Yang pertama. Jadi idea yang pertama, anda lulus rentetan, dan tanpa mengira -
atau adakah ia mengatakan semua huruf kecil? Ia tidak mengatakan semua huruf kecil.
Jadi mesej boleh menjadi apa-apa, dan - oh tidak. Ia tidak.
"Untuk memudahkan, anda boleh mengandaikan bahawa pengguna hanya akan input huruf kecil dan ruang."
Jadi kita lulus mesej dengan hanya huruf kecil dan kemudian kita ganti
antara modal dan huruf kecil - kita menukar tali untuk menjadi modal dan huruf kecil, seli.
Jadi, sebelum kita memberi anda kedua untuk menyelam ke dalam masalah ini,
apakah perkara pertama yang perlu kita lakukan?
Oh, apa yang tidak saya hanya klik? Oh, saya hanya klik pada e-mel di sini.
Jadi perkara pertama yang perlu kita lakukan - saya mencari di salah?
Adakah ini sebahagian daripada yang satu ini?
Tidak, mereka masih di sana, walaupun.
Okay, masih di sini.
Sekarang kita tidak boleh mengandaikan -? Ya. Di sini kita tidak boleh menganggap bahawa ia hanya huruf kecil dan ruang.
Jadi sekarang kita perlu berurusan dengan fakta bahawa surat boleh menjadi apa sahaja yang kita mahu mereka menjadi.
Dan supaya perkara pertama yang kita mahu lakukan hanya mendapat mesej.
Kita hanya perlu untuk mendapatkan rentetan, rentetan s = GetString, okay.
Sekarang masalah ini, terdapat beberapa cara melakukannya.
Tetapi kita akan mahu untuk menggunakan pengendali bitwise di sini.
Adakah terdapat orang-orang yang sama ada tidak berada di supersection,
atau sesuatu, dan tidak tahu apa operator bitwise adalah?
Atau bagaimana ia berkaitan dengan ASCII dalam apa jua cara?
[Pelajar] Saya tidak berada di supersection, tetapi saya tahu apa operator bitwise adalah.
Okay. Jadi maka saya tidak perlu pergi ke atas asas-asas mereka, tetapi saya akan terangkan
apa yang kita akan mahu menggunakan di sini.
Jadi 'A': binari perwakilan modal A, nombor ialah 65.
Saya hanya akan melihat - 41 akan menjadi 01000001.
Jadi yang perlu 65 dalam perpuluhan, jadi ini adalah perwakilan perduaan watak modal A.
Sekarang, perwakilan binari watak huruf kecil 'a'
akan menjadi perkara yang sama, hampir. Adakah itu - 6, yeah. Ini adalah betul.
Modal Jadi perduaan A huruf kecil, binari '.'
Jadi melihat bahawa perbezaan antara A dan 'a' ini sedikit tunggal.
Dan ini berlaku untuk menjadi 32 bit, bit yang mewakili bilangan 32.
Dan yang masuk akal kerana A adalah 65; 'a' adalah 97.
Perbezaan antara mereka ialah 32.
Jadi sekarang kita tahu kita boleh menukar dari A ke 'a' dengan mengambil A
dan bitwise ORing, dengan - yang kelihatan seperti 1.
Ini adalah bitwise OR, dengan 00100000, dan yang akan memberi kita '.'
Dan kita boleh mendapat dari 'a' kepada A oleh bitwise Anding
dengan 11, 0 di tempat itu, 11111.
Jadi ini akan memberikan kita apa yang 'a'; tetapi membatalkan keluar ini sedikit individu,
jadi kita akan mempunyai 01000001, saya tidak tahu jika saya dikira betul.
Tetapi teknik ini bitwise ORing untuk mendapatkan modal untuk huruf kecil,
dan bitwise Anding untuk mendapatkan dari huruf kecil kepada modal tidak eksklusif kepada A.
Semua huruf, K vs k, Z vs z,
mereka semua hanya akan berbeza oleh sedikit tunggal ini.
Dan supaya anda boleh menggunakan ini untuk berubah dari mana-mana surat kecil untuk surat mana-mana modal dan sebaliknya.
Okay. Jadi cara yang mudah untuk mendapatkan daripada ini - jadi bukannya perlu
menulis apa jua 1011111 - cara mudah mewakili nombor ini, dan ini bukanlah satu
bahawa saya pergi ke dalam supersection, tetapi tilde (~) merupakan satu lagi pengendali bitwise.
Apa yang ~ tidak adalah ia melihat perwakilan bit.
Mari kita mengambil sebarang nombor.
Ini adalah hanya beberapa nombor perduaan, dan apa ~ tidak ia hanya lambungan semua bit.
Jadi ini adalah 1, kini 0 a, ini adalah 0, sekarang 1, 010100.
Jadi yang ~ semua tidak. Jadi 32 akan menjadi nombor - menghilangkan itu -
jadi 32 akan menjadi nombor 00100000, dan sebagainya ~ ini akan menjadi
nombor ini di sini bahawa saya ANDkan 'a' dengan.
Adakah semua orang melihat bahawa? Ini adalah agak biasa, seperti apabila anda mahu untuk memikirkan
untuk perkara-perkara kemudian yang kita mungkin akan melihat, apabila kita mahu melihat jika -
atau kita mahu segala-galanya, setiap set bit tunggal kecuali untuk 1
anda cenderung untuk lakukan ~ sedikit bahawa kita tidak mahu menetapkan.
Jadi kita tidak mahu 32 set sedikit, jadi kita ~ 32 tahun.
Okay. Jadi, kita boleh menggunakan semua daripada mereka di sini.
Baiklah, jadi ia adalah baik jika anda tidak dilakukan, kita perlahan-lahan akan berjalan di atas bersama-sama,
atau berjalan di atas ini, jadi melalui ini. Berjalan melalui ini.
Jadi kita mempunyai rentetan kami, dan kami mahu gelung atas setiap aksara dalam rentetan itu dan melakukan sesuatu untuk.
Jadi bagaimana kita gelung atas rentetan? Apa yang harus kita gunakan?
Saya tidak akan melakukannya di sini. Yeah.
Jadi saya mempunyai iterator saya, dan dia berkata ia, tetapi bagaimana saya tahu berapa banyak aksara dalam rentetan?
Strlen (s), maka i + +.
Jadi apa yang saya lakukan di sini bukan cara terbaik untuk melakukan sesuatu.
Adakah sesiapa yang tahu mengapa?
Kerana anda memeriksa bahasa rentetan setiap kali tunggal.
Jadi kita akan mahu bergerak strlen, saya boleh katakan di sini, int panjang = strlen (s),
dan kemudian i <panjang, dan dalam kes anda tidak melihat ia sebelum ini,
Saya juga boleh melakukan int i = 0, panjang = strlen (s).
Dan jadi ini adalah agak lebih baik, kerana sekarang saya telah menghadkan skop
panjang pembolehubah hanya ini 'for', bukannya mengisytiharkan sebelum
dan bahawa ia sentiasa wujud, dan jika anda tidak menangkap mengapa yang buruk,
atau mengapa asal adalah buruk, it's - bermula pada gelung.
Saya memeriksa keadaan. Adakah I <panjang s?
Jadi panjang s, mari kita bekerja dengan "hello" seluruh masa.
Jadi panjang s, h-e-l-l-o. Panjang ialah 5.
Jadi saya = 0, panjang 5, jadi saya tidak <5, maka gelung berterusan.
Kemudian kita pergi lagi. Kami memeriksa keadaan. Adakah I <panjang hello?
Jadi mari kita memeriksa panjang hello. H-e-l-l-o. Itulah 5; i tidak <5, jadi kita terus lagi.
Jadi kita mengira, kita mengira hello, bagi setiap lelaran gelung,
walaupun ia tidak akan berubah, ia sentiasa akan menjadi 5.
Jadi kita hanya ingat 5 di depan, dan kini segala-galanya adalah lebih baik.
Jadi iterating seluruh rentetan.
Apa yang kita mahu lakukan untuk watak setiap rentetan?
[Pengucapan Pelajar, tidak bijaksana yang]
Yeah. Jadi, jika watak bukan abjad, maka kita hanya mahu melangkau ke atasnya.
Kerana kita hanya mengambil berat tentang huruf abjad, kita tidak boleh mengambil kesempatan nombor.
Jadi bagaimana kita boleh melakukan ini? Jadi keadaan kami, jadi jika kita mahu sesuatu - memeriksa jika ia adalah abjad.
Jadi bagaimana kita memeriksa ini?
[Pelajar] Anda hanya boleh menggunakan fungsi adalah alfa.
Adakah yang dimasukkan ke dalam sama ada ini, atau mana-mana termasuk seperti, char.h atau sesuatu?
Mari kita tidak menggunakan fungsi alfa, dan menggunakan yang jelas - jadi kita mempunyai s [i],
yang adalah watak kelapan s, ingat bahawa rentetan adalah pelbagai watak,
jadi watak kelapan s.
Sekarang, jika ia adalah surat modal, kita tahu ia telah berada di dalam julat tertentu.
Dan apa yang pelbagai yang?
Yeah. Jadi, jika s [i] adalah ≥ 65, dan s [i] adalah ≤ 90, apa yang perlu saya lakukan sebaliknya?
Yeah. Jadi, anda perlu benar-benar tidak pernah perlu tahu nilai ASCII dengan apa-apa jua yang pernah.
Jangan sekali-kali berfikir 65 nombor, 90, 97 dan 102, atau apa sahaja ia adalah.
Anda tidak perlu - 112 - anda tidak perlu tahu mereka pada semua. Itulah salah juga.
Hanya gunakan aksara tunggal quote, pemalar quote tunggal. Jadi 'A' dan kurang daripada 90 adalah 'Z.'
Dan ini adalah jauh lebih baik - saya tidak akan tahu dari bahagian atas kepala saya bahawa Z ialah 90.
Saya tahu dari bahagian atas kepala saya bahawa 'Z' adalah modal Z.
Jadi selagi ini adalah dalam lingkungan modal A modal Z, atau kita boleh menyemak untuk huruf kecil,
Atau jika ia adalah dalam julat ≥ 'a' dan ≤ z.
Jadi itulah keadaan kita.
Gaya untuk di mana untuk meletakkan perkara-perkara ini berbeza.
Saya akan buat seperti ini.
Kini, apa yang kita mahu lakukan?
Kita tahu surat ini adalah watak, watak abjad.
Jadi kita perlu ganti antara sama ada ini kini harus huruf besar atau huruf kecil.
Bagaimana kita menyimpan trek yang mana satu kita mahu ia menjadi?
[Pelajar suara, difahami]
Jadi ya, tetapi biarlah saya periksa.
Modul 0-2 telah berkata, adalah satu cadangan yang tercampak keluar, dan saya bersetuju dengan itu.
Kecuali notis bahawa, seperti kes ini? Yeah.
Ia adalah setiap satu yang lain, tetapi kita tidak boleh modul 2 i, atau i arena 2, sejak
melihat bahawa E adalah modal dan 'a' adalah huruf kecil? Tetapi ada ruang yang memisahkan mereka?
Jadi mereka pergi untuk menjadi arena yang sama 2, tetapi mereka kes-kes yang berbeza.
[Pelajar soalan, difahami]
Yeah. Jadi kita hanya akan menyimpan kiraan.
Kita juga boleh berbuat demikian di sini jika kita mahu; yang mungkin mendapatkan sedikit dikawal
dalam untuk pengisytiharan gelung; saya akan meletakkan ia di sini.
Jadi kiraan int = bermula pada 0.
Dan jadi sekarang, saya akan mengira berapa banyak aksara abjad kita telah.
Jadi kita tidak dapat dielakkan akan mengira + + kerana kita mendapati aksara huruf lain.
Tetapi, jadi sekarang anda mengatakan jika arena kiraan 2.
Jadi apa jika kiraan arena 2? Oh. Saya akan lakukan == 0 buat masa sekarang.
Kami juga akan pergi ke bahawa. Jadi jika arena kiraan 2 == 0, kemudian apa?
[Pelajar jawapan, difahami]
Jadi kita mahu ia berakhir dengan huruf besar.
Terdapat 2 kes; huruf besar dan huruf kecil adalah 2 kes.
Jadi, jika kita berada dalam huruf kecil kita perlu untuk membuat huruf besar.
Jika ia adalah huruf besar kita tidak perlu berbuat apa-apa.
Tetapi, terdapat satu cara - shouldn't telah dibalik -
bahawa kita tidak perlu untuk memeriksa sama ada ia besar atau huruf kecil?
Apa yang kita boleh lakukan untuk sentiasa memastikan bahawa kita sentiasa berakhir pada huruf besar?
Jadi melihat apa yang kita lakukan untuk huruf kecil 'a', bagaimana jika kita lakukan perkara ini tepat yang sama kepada huruf besar A?
Adakah huruf besar perubahan, atau adakah perubahan nilai?
Yeah. Jadi mana-mana huruf bitwise ANDkan dengan ~ 32 akan menjadi bahawa sifat huruf yang sama
kerana bagi apa-apa sifat huruf besar sedikit 32 tidak ditetapkan.
Jadi, jika kita mahu membawa watak [i], kita mahu ia menjadi huruf kecil atau huruf besar.
Jadi, jika ia adalah huruf kecil, ia kini huruf besar, jika ia adalah huruf besar, ia masih huruf besar, dan itu sahaja.
Saya berkata demikian dalam supersection: Anda boleh menggunakan 32 jika anda mahu, tetapi saya cenderung lebih suka melakukan 'a' - A,
bukannya hanya 32 biasa, kerana ia boleh menjadi apa-apa sedikit lain.
Selepas sedikit daripada 32, ia boleh menjadi mana-mana, atau kita tidak akan mempunyai cukup
nombor untuk mewakili semua watak-watak.
Jadi, jika anda mendapat sedikit 32, ia boleh menjadi 64 bit, ia boleh menjadi sedikit 128.
Mana-mana bit-bit boleh menjadi sedikit yang membezakan antara huruf besar dan huruf kecil.
Saya tidak perlu untuk mengetahui bahawa ia adalah sedikit 32.
Saya boleh menggunakan 'a' - A untuk mendapatkan sedikit yang berbeza antara kedua-dua
tanpa perlu bergantung kepada bilangan ajaib yang ialah 32.
Dan jadi sekarang, lain kiraan ganjil, dan sebagainya apa yang saya mahu lakukan?
[Jawapan Pelajar, difahami]
[Pelajar] Apa itu?
Saya akan melakukannya dalam 1 saat.
Jadi sekarang jika saya mahu saya mahu pastikan watak kini huruf kecil,
dan sebagainya saya boleh ATAU sebanyak 32, dan 'a' 32 makna - A.
Tetapi notis, oleh pemikiran yang sama seperti sebelumnya, bahawa jika
surat sudah huruf kecil, maka ORing sebanyak 32 hanya menyimpan ia huruf kecil.
Ia tidak pernah berubah watak asal.
Tetapi sekarang saya tidak perlu untuk mengelakkan berkata, "Jika ia adalah huruf kecil, hanya lupa mengenainya,
jika ia adalah huruf besar, kemudian mengubahnya. "
Ia adalah lebih mudah untuk melakukan ini.
[Pelajar] Adakah bahawa strategi menolak huruf besar dari kerja kecil jika ia tidak 32 orang?
Jika ia adalah, seperti, 34 atau sesuatu?
Jadi, anda perlu tahu bahawa perbezaan antara 2 -? >> 1 bit.
Ia boleh menjadi lebih daripada 1 bit, selagi semua bit bawah kedudukan ini adalah sama.
Jadi kita memerlukan sekurang-kurangnya 26 aksara - atau, terdapat 26 aksara.
Jadi kita memerlukan sekurang-kurangnya 26 nombor untuk mewakili perbezaan -
Perbezaan antara A dan 'a' untuk menjadi sekurang-kurangnya 26,
atau lain kita tidak akan mewakili semua nombor nombor modal.
Ini bermakna bahawa A, jika kita bermula pada 1, ia akan menggunakan semua bit ini,
semua ini 5 bit pertama, untuk mewakili segala-galanya melalui Z.
Itulah sebabnya agak depan, atau bit ini, sedikit seterusnya adalah salah satu yang dipilih untuk membezakan antara A dan '.'
Itulah juga mengapa, dalam jadual ASCII, terdapat 5 simbol memisahkan huruf besar daripada huruf kecil.
Sejak mereka adalah simbol-simbol, 5 tambahan yang membawa sehingga 32 menjadi perbezaan di antara mereka.
[Pelajar] Jadi kita boleh melakukannya, kerana ASCII direka cara itu.
Ya. Tetapi - perbezaan ASCII juga boleh menjadi kedua-dua bit ini.
Seperti, jika A 10000001, dan 'a' adalah 11100001 - saya terlupa, apa sahaja.
Tetapi jika ia adalah ini, maka kita masih boleh menggunakan 'a' - A.
Ia hanya kini perbezaan antara A dan 'a' masih ini 2 bit.
Saya fikir ia ditulis 48. Adakah ia 32 + 64? Saya rasa ia adalah?
Ia masih akan menjadi 2 bit; setiap watak tunggal, seperti, Z dan z, K dan k,
mereka masih akan mempunyai bit yang sama tepat ditetapkan kecuali bagi mereka 2 bit.
Jadi selagi yang sentiasa benar, tanpa mengira jika kita menggunakan ASCII atau beberapa sistem lain,
selagi kerana hanya terdapat beberapa set bit yang berbeza untuk setiap aksara,
maka yang berfungsi dengan baik.
Ia hanya bahawa 32 ditubuhkan kerana ia adalah satu yang pertama kita mungkin boleh menggunakan. >> Cool.
Saya cenderung untuk memilih, dalam kes anda tidak pernah melihat, jika blok adalah hanya satu baris,
anda boleh menyingkirkan daripada pendakap kerinting, jadi saya cenderung untuk memilih berbuat demikian.
Juga, anda tahu bagaimana kita boleh melakukan perkara-perkara seperti [i] + = 1?
Anda juga boleh melakukan s [i] bitwise DAN = 32.
Dan bitwise OR = 32.
Juga, mengira arena 2 == 0.
Jadi ingat bahawa - saya tidak akan menulis - apa-apa nilai bukan sifar adalah benar, dan 0 adalah palsu.
Jadi "jika kiraan arena 2 == 0" adalah sama sebagai berkata "jika tidak mengira mod 2."
Saya mungkin akan hanya diterbalikkan garisan dan berkata, "jika kiraan arena 2,
jangan ATAU 1, lagi yang DAN 1, "supaya saya tidak perlu" tidak. "
Tetapi ini kerja-kerja seperti juga.
Dan apa lagi yang boleh saya lakukan di sini?
Anda boleh menggabungkan mereka dengan pertigaan jika anda mahu, tetapi kemudian yang hanya akan membuat perkara yang Messier
dan mungkin lebih sukar untuk membaca, jadi kita tidak akan berbuat demikian.
Sesiapa yang mempunyai apa-apa cadangan lain?
Adakah bahawa semua masalah meminta? Oh yeah.
Jadi menghilangkan ini baris kosong, sekarang kita akan mencetak f,% s sebagai satu rentetan,
Kami akan mencetak f, s.
Sekarang mari kita jalankan ia. Adakah saya melakukan apa-apa yang salah?
Itulah \ a "; saya mahu n.
Okay. Sekarang kita akan lari. Ia mungkin akan menjerit pada saya.
Strlen adalah di string.h.
Jadi ini adalah perkara yang baik tentang dilafaz adalah ia memberitahu anda apa yang ia dalam,
bukannya GCC yang hanya berkata, "Hei, anda terlupa sesuatu, saya tidak tahu apa perkara itu."
Tetapi ini akan memberitahu saya, "Kamu bertujuan untuk termasuk string.h."
Jadi saya tidak meminta apa-apa, jadi ia tidak mengatakan apa-apa.
Tetapi kita akan lakukan contoh mereka, "Terima kasih 4 add".
Yang kelihatan betul. Hore.
Jadi kembali ke utama anda, saya hampir tidak pernah melakukannya.
Ia adalah pilihan. Dan utama adalah fungsi sahaja yang ia adalah pilihan.
Jika anda tidak kembali apa-apa dari utama, ia diandaikan bahawa anda bertujuan untuk kembali 0.
Soalan?
Okay. Jadi sekarang masalah kedua.
"Recall dari kuliah kedua 2 minggu yang bertukar-tukar nilai 2 pembolehubah 'dengan melepaskan
mereka 2 pembolehubah untuk fungsi (walaupun dipanggil swap) tidak tepat bekerja, sekurang-kurangnya tidak tanpa 'petunjuk'. "
Dan mengabaikan petunjuk sehingga kita sampai kepada mereka.
Kita mahu untuk menukar 2 pembolehubah; kita tidak menggunakan fungsi untuk melakukannya.
Kami masih akan melakukannya utama seperti ia berkata.
Tetapi untuk menggunakan mereka 2 pembolehubah, kita tidak mahu menggunakan pembolehubah sementara.
Terdapat 2 cara untuk melakukan ini.
Anda boleh melakukannya menggunakan operator binari tradisional anda.
Jadi adakah sesiapa tahu cara yang cepat dan kotor berbuat demikian?
Ia sebenarnya mungkin mengambil beberapa minit pemikiran. Jika saya mempunyai -
Saya akan menetapkan masalah seperti mereka meminta. Jadi, jika saya mempunyai 2 pembolehubah, A, yang hanya integer
bahawa mereka memberi saya, dan jumlah pembolehubah B, yang merupakan satu lagi integer yang saya diberi.
Jadi jika saya mempunyai ini 2 pembolehubah, sekarang saya mahu untuk menukar mereka.
Tradisional, menggunakan operator binari biasa anda, saya maksudkan, seperti +, -, ÷.
Tidak bitwise pengendali yang bertindak pada binari.
Jadi menggunakan -, +, ÷, dan semua orang.
Kita boleh swap dengan melakukan sesuatu seperti a = a + b, dan b = a - b, a = a - b.
Jadi, kewarasan cek, dan kemudian kita akan melihat mengapa bahawa kerja-kerja.
Katakan = 7, b = 3, maka a + b akan menjadi 10.
Jadi kita sedang menetapkan 10 =, dan kemudian kita lakukan b = a - b.
Jadi kita lakukan b = a - b, yang akan menjadi 7, dan b = a - b sekali lagi,
atau = a - b. Yang akan menjadi 10-7 iaitu 3.
Jadi sekarang, betul, 'a' adalah 7, b adalah 3, dan kini b 7 dan 'a' ialah 3.
Jadi yang jenis masuk akal; 'a' adalah gabungan 2 nombor.
Pada ketika ini, 'a' adalah gabungan, dan kemudian kita menolak keluar b asal,
dan kemudian kita menolak apa yang asal '.'
Tetapi ini tidak bekerja untuk semua nombor.
Untuk melihat ini, mari kita pertimbangkan sistem, jadi kita biasanya berfikir integer sebagai 32 bit.
Mari kita bekerja pada sesuatu yang hanya seperti 4 bit.
Semoga saya tampil dengan contoh yang baik sekarang.
Jadi, saya tahu, ini akan menjadi mudah.
Katakan nombor 2 kami adalah 1111, dan 1111; supaya kita berada dalam binari sekarang.
Dalam perpuluhan sebenar, jika anda mahu untuk memikirkan ia cara itu, = 15 dan b = 15
Dan sebagainya yang kita harapkan, selepas kita menukar mereka - mereka tidak pun mempunyai untuk menjadi nombor yang sama,
tetapi saya melakukannya dengan cara ini.
Mari kita membuat mereka tidak nombor yang sama. Mari kita buat 1111 dan 0001.
Jadi = 15 dan b = 1.
Selepas kita menukar mereka, kita menjangkakan 'a' untuk menjadi 1 dan b untuk menjadi 15.
Jadi langkah pertama kami adalah a = a + b.
Nombor kami adalah hanya 4 bit lebar, jadi ',' yang merupakan 1111, + b, yang 0001,
akan akhirnya menjadi 10000, tetapi kita hanya mempunyai 4 bit.
Jadi sekarang = 0.
Dan sekarang kita mahu untuk menetapkan b = a - b - sebenarnya, ini masih bekerja keluar sempurna.
a = a - mari kita lihat jika ini kerja-kerja keluar dengan sempurna - b.
Demikian maka b = 0 - 1, yang masih akan menjadi 15, dan kemudian a = a - b, yang akan menjadi 1.
Mungkin ini berfungsi.
Saya rasa seperti ada sebab ia tidak berfungsi menggunakan biasa.
Okay, jadi bekerja pada andaian bahawa ia tidak bekerja dengan operasi binari biasa,
dan saya akan mencari - saya akan Google untuk melihat jika ia adalah benar.
Jadi kita mahu melakukannya menggunakan pengendali bitwise, dan petunjuk di sini adalah XOR.
Jadi, memperkenalkan XOR (^) jika anda tidak pernah melihat lagi.
Ia adalah, sekali lagi, pengendali bitwise jadi ia bertindak sedikit demi sedikit, dan it's -
Jika anda mempunyai bit 0 dan 1, maka ini akan menjadi 1.
Jika anda mempunyai 1 bit dan 0, ia akan menjadi 1, anda mempunyai 0 bit dan 0 ia akan menjadi 0,
dan jika anda mempunyai 1 bit dan 1, ia akan menjadi 0.
Jadi ia adalah seperti OR. Jika salah satu bit adalah benar, ia adalah 1, tetapi tidak seperti ATAU, ia tidak boleh menjadi kedua-dua bit yang benar.
ATAU akan ini menjadi 1, XOR akan mempunyai ini adalah 0.
Jadi kita akan mahu menggunakan XOR di sini.
Berfikir tentang hal itu selama satu minit, saya pergi ke Google.
Nah, anda tidak boleh membaca bahawa, Saya kini di halaman XOR algoritma swap.
Semoga ini akan menjelaskan mengapa saya can't -
Ini adalah tepat algoritma bahawa kita hanya melakukan.
Saya masih tidak melihat mengapa - saya mesti telah hanya memilih satu contoh yang buruk,
tetapi kes ini di mana 'a' yang berlaku kepada menjadi 0, selepas mendapat 5 bit, jadi sekarang 'a' adalah 0,
itu adalah apa yang dipanggil "limpahan integer."
Menurut Wikipedia, "Tidak seperti swap XOR, perubahan ini memerlukan bahawa ia menggunakan beberapa kaedah
untuk menjamin bahawa x + y tidak menyebabkan limpahan integer. "
Jadi ini tidak mempunyai masalah; ini adalah limpahan integer, tetapi saya melakukan sesuatu yang salah.
Saya tidak pasti. Saya akan cuba untuk tampil dengan satu lagi.
[Pelajar] Nah, tidak adalah limpahan integer apabila anda cuba untuk meletakkan beberapa di sana
lebih besar daripada jumlah bit anda telah diperuntukkan?
Yeah. Kami mempunyai 4 bit. That's - kami mempunyai 4 bit, kita kemudian cuba untuk menambah 1 kepadanya, jadi kita berakhir dengan 5 bit.
Tetapi hanya sedikit kelima mendapat terputus, yeah.
Ia mungkin sebenarnya -
[Pelajar] Adakah yang membuang anda ralat, atau adakah itu - yang akan membuang kesilapan?
No Jadi terdapat kesilapan tidak. Apabila anda sampai ke peringkat pemasangan, sedikit khas
tempat ditetapkan bahawa berkata terdapat limpahan, tetapi dalam C anda jenis hanya tidak berurusan dengan itu.
Anda sebenarnya tidak boleh berurusan dengan ia melainkan jika anda menggunakan arahan pemasangan khas di C.
Mari kita berfikir tentang swap XOR.
Dan saya fikir artikel Wikipedia mungkin juga telah mengatakan bahawa -
Jadi ia juga dibesarkan aritmetik modular, jadi saya rasa saya adalah, dalam teori, melakukan aritmetik modular
apabila saya berkata bahawa 0-1 adalah 15 lagi.
Jadi yang sebenarnya mungkin - pada pemproses biasa yang tidak 0-1 = 15.
Sejak kita akhirnya pada 0, kita tolak 1, maka ia hanya wrap kembali sekitar 1111.
Jadi algoritma ini sebenarnya mungkin bekerja, a + b, a - b, b - a, yang mungkin denda.
Tetapi ada beberapa pemproses yang tidak berbuat demikian, dan jadi ia tidak akan menjadi halus dalam orang-orang yang tertentu.
Swap XOR akan bekerja di mana-mana pemproses. Okay.
Idea ini adalah bahawa ia sepatutnya menjadi sama, walaupun.
Jika kita menggunakan XOR entah bagaimana mendapatkan maklumat daripada kedua-dua ke dalam 1 pembolehubah,
dan kemudian menarik keluar maklumat pembolehubah individu lagi.
Jadi adakah sesiapa mempunyai idea / jawapan?
[Pelajar jawapan, difahami]
Jadi ini harus bekerja, dan juga, XOR adalah kalis tukar tertib.
Tanpa mengira mana susunan nombor ini 2 berada di sini,
keputusan ini akan menjadi sama.
Jadi ^ b adalah b ^ a.
Anda juga mungkin melihat ini ditulis sebagai ^ = b, b = a, a = b sekali lagi.
Jadi ini adalah betul, dan untuk melihat mengapa kerja-kerja ini, berfikir bit.
Menggunakan beberapa smallish, mari kita katakan 11001, dan 01100.
Jadi ini adalah 'a'; ini adalah b.
Jadi ^ = b.
Kami akan menetapkan = 'a' kepada XOR ini 2 perkara.
Jadi 1 ^ 0 1; 1 ^ 1 adalah 0; 0 ^ 1 adalah 1, dan 0 ^ 0 adalah 0, 1 ^ 0 ialah 1.
Jadi ',' jika anda melihat nombor perpuluhan, ia akan menjadi -
anda tidak akan melihat banyak hubungan antara asal 'a' dan baru ','
tetapi melihat bit, 'a' kini seperti jaringan maklumat
kedua-dua asal 'a' dan b asal.
Jadi, jika kita mengambil b ^, kita melihat bahawa kita akan berakhir pada asal '.'
Dan jika kita mengambil asal 'a' ^ baru ',' kita lihat kita berakhir di b asal.
Jadi (a ^ b) ^ b = '.' Asal
Dan (a ^ b) ^ a = b asal.
Terdapat - cara lain melihat ini adalah XOR apa-apa sendiri sentiasa 0.
Jadi 1101 ^ 1101 semua bit akan menjadi sama.
Jadi ada tidak akan menjadi kes di mana 1 adalah 0 dan yang lain adalah 1.
Jadi ini adalah 0000.
Yang sama dengan ini. (A ^ b) ^ b adalah seperti ^ (b ^ b).
(B ^ b) akan menjadi 0; ^ 0 hanya akan menjadi ',' kerana semua bit adalah 0.
Jadi satu-satunya yang akan menjadi mana 'a' pada asalnya 1 - mempunyai orang.
Dan idea yang sama di sini; Saya agak pasti ia juga kalis tukar tertib.
Yeah. Saya tidak mengatakan sebelum ini bahawa ia adalah kalis tukar tertib.
^ ',' Dan ia bersekutu, jadi sekarang (b ^ a) ^ a.
Dan kita boleh melakukannya b ^ (a ^ a).
Dan sebagainya lagi, kita akan mendapat b asal.
Jadi 'a' kini gabungan 'a' b dan bersama-sama.
Menggunakan kombo baru kami 'kita katakan b = kombo' a '^ b asal, kita akan mendapat asal'. '
Dan kini kombo = '' ^ b baru, yang merupakan asal - atau yang kini apa 'a' atau b.
Itulah kes ini ke sini. Ini adalah = b, b lama.
Jadi sekarang semuanya kembali dalam perintah itu bertukar.
Jika kita benar-benar melihat bit, b = a ^ b, akan XOR ini 2,
dan jawapannya akan ini, dan kemudian = a ^ b XORing 2 ini dan jawapannya adalah ini.
Soalan? Okay. Jadi yang terakhir adalah agak ketara lebih sukar.
[Pelajar] Saya fikir dia mempunyai soalan tentang hal itu. >> Oh, maaf.
[Pelajar] Apa sebenarnya lebih cepat? Jika anda menggunakan XOR ini, atau adakah ia jika anda mengisytiharkan pembolehubah baru?
Jadi apa sebenarnya adalah lebih cepat, mengisytiharkan pembolehubah baru atau menggunakan XOR untuk menukar?
Jawapannya ialah, dalam semua kemungkinan, pembolehubah sementara.
Dan itu adalah kerana sekali ia disusun ke bawah - jadi di peringkat pemasangan,
tidak ada perkara seperti pembolehubah tempatan atau mana-mana pembolehubah sementara atau mana-mana barangan ini.
Mereka hanya suka - ada ingatan, dan terdapat daftar.
Daftar mana perkara yang sedang giat berlaku.
Anda tidak menambah 2 perkara dalam ingatan; anda menambah 2 perkara dalam daftar.
Dan anda membawa perkara-perkara dari memori ke dalam daftar kemudian menambah mereka,
dan kemudian anda mungkin meletakkan mereka kembali ke dalam memori, tetapi semua tindakan yang berlaku dalam daftar.
Jadi, apabila anda menggunakan pendekatan ubah sementara, biasanya apa yang berlaku ialah
2 nombor sudah di daftar.
Dan kemudian dari sudut bahawa pada, selepas anda telah bertukar mereka,
ia hanya akan mula menggunakan daftar lain.
Mana-mana anda telah menggunakan b, ia hanya akan menggunakan daftar yang sudah menyimpan '.'
Jadi ia tidak perlu berbuat apa-apa untuk benar-benar melakukan swap. Yeah?
[Pelajar] Tetapi ia juga mengambil memori yang lebih, kan?
Ia hanya akan mengambil memori yang lebih jika ia perlu untuk menyimpan bahawa pembolehubah sementara.
Seperti jika anda kemudian menggunakan bahawa pembolehubah sementara lagi tempat,
kemudian - atau anda menetapkan sesuatu pembolehubah yang sementara.
Jadi, jika pada bila-bila masa ',' b dalam menggoda mempunyai nilai-nilai yang berbeza atau sesuatu,
maka ia akan mempunyai lokasi yang berbeza dalam ingatan, tetapi ia adalah benar bahawa
terdapat banyak pembolehubah tempatan yang hanya akan wujud di dalam daftar.
Di mana, ia tidak pernah dimasukkan ke dalam ingatan, dan supaya anda tidak membuang memori.
Okay. Soalan terakhir ini adalah sedikit lebih.
Jadi di sini, pada perkakas ini CS50, terdapat kamus.
Dan sebab ini adalah kerana [? B66] adalah satu pemeriksa ejaan yang mana anda akan menulis
menggunakan jadual hash atau cuba atau beberapa struktur data.
Anda akan menulis pemeriksa ejaan, dan anda akan menggunakan kamus ini untuk berbuat demikian.
Tetapi bagi masalah ini, kita hanya akan melihat untuk melihat jika satu perkataan di dalam kamus.
Jadi, daripada menyimpan kamus keseluruhan dalam beberapa struktur data
dan kemudian mencari seluruh dokumen untuk melihat sama ada apa-apa yang silap eja,
kita hanya mahu untuk mencari 1 perkataan. Jadi kita hanya boleh mengimbas keseluruhan kamus
dan jika kita tidak pernah mencari perkataan di dalam kamus keseluruhan, maka ia tidak berada di sana.
Jika kita mengimbas seluruh kamus dan jangan melihat perkataan, maka kita baik, kita mendapati ia.
Ia mengatakan di sini bahawa kita mahu mula mencari pada majlis pengendalian fail-C,
kerana kita mahu untuk membaca kamus,
tetapi saya akan memberi pembayang di sini yang fungsi anda harus berfikir.
Saya akan menulis mereka pada kawasan.
Jadi yang utama anda akan mahu untuk melihat yang terbuka dan kemudian f, tidak dapat tidak, f ditutup,
yang akan pergi pada akhir program anda, dan f f imbasan.
Anda juga boleh menggunakan f membaca, tetapi anda mungkin tidak mahu
kerana itu - anda tidak akhirnya memerlukan bahawa.
F imbasan f adalah apa yang anda akan menggunakan untuk mengimbas lebih kamus.
Dan supaya anda tidak perlu untuk kod penyelesaian, hanya cuba dan suka kod pseudo-cara anda
kepada penyelesaian, dan kemudian kita akan berbincang.
Dan sebenarnya, kerana saya sudah memberikan anda ini, jika anda pergi ke mana-mana terminal atau shell perkakas anda,
Saya akan saya biasanya jika anda tidak pernah melihat lagi, saya tidak tahu jika anda lakukan di dalam kelas,
tetapi lelaki, jadi lelaki halaman, cukup berguna untuk melihat cukup banyak apa-apa fungsi.
Jadi saya boleh lakukan, seperti, f lelaki, imbasan f.
Ini adalah kini maklumat tentang keluarga f imbasan fungsi.
Saya juga boleh melakukan f lelaki, terbuka, dan yang akan memberikan saya butiran itu.
Jadi, jika anda tahu apa fungsi anda menggunakan, atau anda sedang membaca kod
dan anda melihat beberapa fungsi dan anda seperti, "Apakah ini lakukan?"
Hanya lelaki yang nama fungsi.
Terdapat beberapa contoh pelik di mana anda mungkin perlu mengatakan
suka. lelaki 2 yang nama fungsi, atau lelaki 3 bahawa nama fungsi,
tetapi anda hanya perlu untuk melakukan bahawa jika seorang lelaki fungsi nama tidak berlaku untuk bekerja kali pertama.
[Pelajar] Jadi saya membaca halaman lelaki untuk terbuka, tetapi saya masih keliru tentang bagaimana untuk menggunakan dan program.
Okay. Banyak muka surat manusia adalah kurang daripada membantu.
Mereka lebih membantu jika anda sudah tahu apa yang mereka lakukan
dan kemudian anda hanya perlu ingat perintah hujah atau sesuatu.
Atau mereka boleh memberikan anda gambaran umum, tetapi sesetengah daripada mereka adalah sangat menggalakkan.
Seperti f f imbasan, juga. Ia memberikan anda maklumat untuk semua fungsi-fungsi ini,
dan baris 1 turun di sini berlaku untuk mengatakan, "F imbasan f membaca dari sudut rentetan atau aliran."
Tetapi f membuka. Jadi, bagaimana kita akan menggunakan f terbuka?
Idea program yang perlu untuk melakukan fail I / O adalah bahawa
pertama anda perlu untuk membuka fail yang anda mahu untuk melakukan perkara-perkara dengan, dan tidak dapat dielakkan,
membaca perkara-perkara dari fail tersebut dan melakukan barangan dengan mereka.
F terbuka adalah apa yang kita gunakan untuk membuka fail.
Perkara yang kita akan mendapat kembali, jadi apa fail yang kita mahu untuk membuka, ia memberikan kita -
di sini ia berkata "/ user / share / Dict / perkataan."
Ini adalah fail yang kita mahu untuk membuka, dan kita mahu untuk membuka -
kita perlu jelas menentukan sama ada kita mahu untuk membuka ia untuk membaca atau jika kita mahu membukanya untuk menulis.
Ada beberapa kombinasi dan barangan, tetapi kita mahu untuk membuka ini untuk membaca.
Kami mahu membaca dari fail.
Jadi apakah ini? Ia mengembalikan fail bintang (*),
dan saya hanya akan menunjukkan segala-galanya dalam f pembolehubah, jadi *,
sekali lagi, ia adalah penunjuk, tetapi kita tidak mahu berurusan dengan penunjuk.
Anda boleh berfikir f, f kini pembolehubah yang anda hendak gunakan untuk mewakili fail.
Jadi jika anda mahu untuk membaca dari fail, anda membaca dari f.
Jika anda ingin menutup fail, anda menutup f.
Jadi pada akhir program apabila kita tidak dapat dielakkan mahu untuk menutup fail, apa yang kita harus lakukan?
Kami mahu menutup f.
Jadi sekarang fungsi fail lepas bahawa kita akan mahu menggunakan imbasan f, f scan f.
Dan apa yang tidak adalah ia mengimbas melalui fail mencari corak untuk perlawanan.
Melihat halaman lelaki di sini, kita lihat f f int imbasan, mengabaikan nilai pulangan untuk sekarang.
Hujah pertama adalah aliran fail *, jadi hujah pertama yang kita akan mahu untuk lulus f.
Kami pengimbasan lebih f.
Hujah kedua adalah rentetan format.
Saya akan memberikan anda rentetan format sekarang.
Saya fikir kita berlaku untuk mengatakan, 127s \ n, banyak yang tidak perlu.
Idea apa yang rentetan format, anda boleh berfikir f imbasan sebagai bertentangan f cetak.
Jadi f cetak, f cetak kita juga menggunakan jenis ini parameter format,
tetapi dalam f cetak apa yang kita lakukan - mari kita melihat bersamaan.
Jadi mencetak f, dan sebenarnya terdapat juga f cetak f, mana hujah pertama akan menjadi f.
Apabila anda mencetak f, kita boleh mengatakan sesuatu seperti, "cetak 127s \ n" dan kemudian jika kita lulus beberapa rentetan,
ia akan mencetak rentetan ini dan kemudian baris baru.
Apa 127 cara, saya agak pasti, tetapi saya tidak pernah terhad diri saya kepadanya,
Anda akan tidak perlu untuk mengatakan '127 'dalam f cetak,
tetapi apa yang ia bermakna adalah mencetak pertama 127 aksara.
Jadi saya cukup yakin bahawa kes itu. Anda boleh Google untuk itu.
Tetapi dalam satu seterusnya saya hampir positif ia bermakna bahawa.
Jadi ini adalah mencetak pertama 127 aksara, diikuti oleh baris baru.
F imbasan f sekarang, bukannya melihat pembolehubah dan percetakan,
ia akan melihat beberapa rentetan, dan menyimpan corak memasuki pemboleh ubah itu.
Mari kita sebenarnya menggunakan f imbasan dalam contoh yang berbeza.
Jadi mari kita mengatakan bahawa kita mempunyai beberapa int, x = 4,
dan kami mahu mewujudkan rentetan diperbuat daripada mahu untuk mewujudkan rentetan
yang seperti, ini akan tampil lebih kemudian,
sesuatu yang hanya seperti 4.jpg.
Jadi ini mungkin menjadi satu program di mana anda akan mempunyai jumlah kaunter,
kesimpulan menangani i, dan anda mahu menyimpan sekumpulan imej.
Jadi anda mahu untuk menyelamatkan i.jpg, di mana i adalah beberapa lelaran gelung anda.
Jadi bagaimana kita membuat rentetan ini bagi yang JPEG?
Jika anda mahu untuk mencetak 4.jpg, kita hanya boleh mengatakan f cetak, d.jpg%,
dan kemudian ia akan mencetak bagi yang JPEG.
Tetapi jika kita ingin menyelamatkan 4.jpg rentetan, kita menggunakan f imbasan.
Jadi rentetan s - sebenarnya kita can't - watak, char s, mari kita pergi 100.
Jadi saya hanya mengisytiharkan beberapa pelbagai 100 aksara,
dan itulah apa yang kita tidak dapat dielakkan akan menyimpan bahawa JPEG masuk
Jadi kita hendak untuk menggunakan f imbasan, dan format, bagaimana kita akan mengatakan d.jpg%
untuk mencetak 4.jpg, format ini akan menjadi d.jpg%.
Jadi format adalah d.jpg%, apa yang kita mahu untuk menggantikan% d dengan ialah x,
dan sekarang kita perlu untuk menyimpan tali bahawa tempat.
Dan di mana kita pergi untuk menyimpan rentetan ini adalah dalam pelbagai s.
Jadi selepas baris ini, kod s, jika kita mencetak f,% s s berubah-ubah,
ia akan mencetak 4.jpg.
Jadi f imbasan f adalah sama seperti imbasan f, kecuali kini ia mencari lebih fail ini
untuk apa untuk menyimpan dalam s.
Itulah apa hujah terakhir akan menjadi.
Kami ingin menyimpan - "Imbas f keluarga imbasan fungsi dalam kedua-dua mengikut format seperti yang cuba di bawah.
Jika mana-mana disimpan dalam mata lokasi anda mungkin kembali - "
Tidak, kita mungkin baik. Biarkan saya berfikir untuk sesaat.
Jadi imbasan f tidak - apa palang pintu adalah fungsi yang adakah itu?
Jadi imbasan f tidak akan mengambil integer dan melakukan dot jpg.
Ia akan [Mumbles].
Simpan pembolehubah int dalam rentetan int C.
Apa yang berubah-ubah ini, atau apakah fungsi ini dipanggil?
Ya. That's - ya. Jadi apa yang saya telah menentukan kepada anda sebelum ini adalah s f cetak,
yang - yang masuk akal banyak lagi, mengapa saya berkata ia adalah lebih seperti f cetak.
Scan f masih jenis seperti f cetak, tetapi s f cetak akan mengimbas ia lebih
dan menggantikan pembolehubah dan kini menyimpan ia dalam rentetan.
Daripada percetakan, ia menyimpan ia dalam rentetan.
Jadi mengabaikan sepenuhnya. Anda masih boleh berfikir specifier format seperti seperti yang f cetak.
Jadi sekarang, jika kita mahu melakukan perkara yang 4.jpg, kita akan melakukan s f cetak, x ini.
Jadi apa imbasan f melakukan - apa soalan anda akan menjadi?
[Pelajar] Saya hanya keliru tentang apa yang kita cuba lakukan di sini
dengan JPEG. Bolehkah anda menjelaskan bahawa masa 1 lagi?
Jadi ini adalah - ia adalah relevan kurang f imbasan f kini; diharapkan, ia akan mengikat kembali dalam beberapa jenis cara.
Tetapi apa yang saya pada mulanya bercadang untuk menunjukkan adalah - ini sebenarnya langsung relevan kepada [ini? F5]
Anda akan menggunakan s f cetak, di mana, katakan kita mempunyai 100 imej,
dan anda mahu membaca imej 1.jpg, 2.jpg, 3.jpg.
Jadi dalam usaha untuk berbuat demikian, anda perlu f terbuka, dan kemudian anda perlu untuk lulus dalam rentetan yang anda mahu untuk membuka.
Jadi kita mahu untuk membuka 1.jpg; dalam usaha untuk mewujudkan rentetan yang 1.jpg,
f cetak kita lakukan s% d.jpg kita tidak lakukan untuk int i = 0.
i <40, i + +.
Jadi s cetak f% d.jpg i.
Jadi selepas baris ini, kini pembolehubah atau s pelbagai akan 1.jpg.
Atau, 0.jpg, 1.jpg, 2.jpg. Dan supaya kita boleh membuka, pada gilirannya, setiap imej untuk membaca.
Supaya apa yang s mencetak f tidak. Adakah anda melihat apa yang s mencetak f kini melakukan?
[Pelajar] Okay, jadi ia mengambil - ia mewujudkan rentetan, something.jpg, dan kemudiannya menyimpan.
Ya. Ia mencipta - ini adalah satu lagi rentetan format, hanya seperti imbasan f dan f cetak,
di mana ia memasukkan semua pembolehubah ke hujah kedua, mungkin bertentangan i.
Mungkin - Maksud saya, itulah kes itu. Tetapi apa sahaja perintah hujah.
Ia akan memasukkan semua pembolehubah ke dalam rentetan format
dan kemudian simpan ke dalam buffer kita, kita panggil yang penampan, ia adalah di mana kita menyimpan rentetan.
Jadi kita menyimpan dalam s rentetan diformat dengan betul,% d telah digantikan dengan 4.
[Pelajar] Jadi jika kita melakukan ini, adalah f ubah hanya akan ditukarkan?
Ya. Jadi kita harus menutup f asal sebelum melakukan ini.
Tetapi - dan kemudian juga, jika tidak ada f membuka sini, maka kita akan perlu untuk mengatakan -
Yeah. Tetapi ia akan membuka seratus fail yang berbeza.
[Pelajar] Tetapi kita tidak akan dapat untuk mengakses atau - okay.
Okay. Jadi imbasan f, f scan f, adalah jenis idea yang sama,
tetapi sebaliknya, dan bukannya menyimpan ia ke dalam rentetan, ia lebih seperti anda sekarang
akan lebih menyengat dan corak padanan terhadap rentetan bahawa dan menyimpan keputusan ke pembolehubah.
Anda boleh menggunakan f imbasan untuk menghuraikan atas sesuatu seperti 4.jpg, dan menyimpan 4 integer ke x int jumlah.
Itulah apa yang kita boleh menggunakan f imbasan untuk.
F imbasan f akan untuk berbuat demikian pada baris arahan.
Saya sebenarnya cukup yakin ini adalah apa yang perpustakaan CS50 tidak.
Jadi, apabila anda mengatakan, "mendapatkan int," ia adalah imbasan f-ing atas - f imbasan adalah cara anda mendapat input pengguna.
F imbasan f akan melakukan perkara yang sama tetapi menggunakan fail untuk mengimbas alih.
Jadi di sini, kita mengimbas lebih fail ini.
Corak kita cuba untuk perlawanan adalah beberapa rentetan yang adalah 127 aksara
diikuti oleh baris baru
Jadi saya cukup yakin kita walaupun hanya boleh mengatakan "perlawanan s," kerana di dalam kamus
kita berlaku, kita dijamin tiada perkataan yang panjang,
dan juga f imbasan f, saya fikir, akan berhenti di garisan baru tidak kira apa.
Tetapi kita akan termasuk barisan baru dalam perlawanan itu, dan -
[Pelajar] Jika kita tidak termasuk barisan baru, tidak akan ia mencari bahagian-bahagian perkataan?
Ia - setiap melihat kamus -
Jadi, dalam kamus, semua ini adalah perkataan kami.
Masing-masing adalah pada baris baru.
F imbasan akan memilih perkataan ini.
Jika kita tidak termasuk barisan baru, maka ia adalah mustahil bahawa f imbasan seterusnya hanya akan membaca baris baru.
Tetapi termasuk barisan baru maka hanya akan mengabaikan barisan baru.
Tetapi kita tidak pernah akan mendapat sebahagian daripada perkataan, kerana kita sentiasa membaca sehingga kepada barisan baru, tidak kira apa.
[Pelajar] Tetapi bagaimana jika anda mencari perkataan "cissa," seperti cissa.
Ia akan mendapati bahawa, dan berkata ia adalah perlawanan?
Jadi di sini kita - ia akan membaca dalam - ini sebenarnya adalah satu titik yang baik.
Kami pernah menggunakan arus - perkataan yang kita cari adalah hujah baris arahan pertama.
Jadi tali, perkataan = argv 1.
Jadi rentetan kita cari adalah argv 1.
Kami tidak mencari perkataan di dalam f imbasan kami semua.
Apa yang kita lakukan dengan imbasan f mendapat setiap perkataan dalam kamus,
dan kemudian sekali kita mempunyai bahawa perkataan yang kita hendak menggunakan strcmp untuk membandingkan mereka.
Kami akan membandingkan perkataan kami dan apa yang kita hanya membaca masuk
Jadi tidak dapat dielakkan, kita akan berakhir sehingga melakukan sekumpulan imbasan fs
sehingga ia hanya kebetulan bahawa f imbasan akan kembali -
ia akan kembali satu, selagi ia telah dipadankan perkataan baru,
dan ia akan mengembalikan sesuatu yang lain dengan seberapa segera kerana ia telah gagal untuk memadankan perkataan.
Kita membaca seluruh kamus, menyimpan baris demi baris setiap perkataan ke dalam s berubah-ubah.
Kemudian kita membandingkan perkataan dengan s, dan jika perbandingan == 0,
strcmp berlaku untuk membawa 0 jika perlawanan telah dibuat.
Jadi, jika ia adalah 0, maka kita boleh mencetak f, dipadankan,
atau perkataan ada di dalam kamus, atau apa sahaja yang anda mahu untuk mencetak f.
Dan kemudian kita tidak mahu untuk menutup f berulang-ulang kali.
Ini adalah jenis perkara yang ingin kita lakukan, dan kita tidak hanya mencari perkataan di dalam kamus.
Jadi kita boleh lakukan itu, jika kita mahu mencari corak, mereka cissa, seperti yang anda katakan sebelum ini,
jika kita mahu mencari corak yang, maka ia akan gagal dalam kes itu
kerana itu bukan sebenarnya perkataan, tetapi salah satu perkataan di dalam kamus yang berlaku untuk mempunyai yang di dalamnya.
Jadi ia akan sepadan dengan perkataan ini, tetapi ini subset perkataan tidak adalah perkataan itu sendiri.
Tetapi itu bukan bagaimana kita menggunakan ia; kita membaca dalam setiap perkataan
dan kemudian membandingkan perkataan yang kita mempunyai dengan perkataan itu.
Jadi kita sentiasa membandingkan perkataan yang penuh.
Saya boleh menghantar penyelesaian dimuktamadkan kemudian.
Ini adalah jenis hampir jawapan yang betul, saya fikir.
[Pelajar komen, difahami]
Oh, adakah saya menghilangkan bahawa sebelum? Char s, saya rasa kita berkata 127 - saya terlupa apa yang terbesar adalah.
Kami hanya akan melakukan 128; jadi sekarang s cukup panjang.
Kita tidak perlu untuk mencetak apa-apa.
Kami juga akan mahu mempunyai untuk menutup fail kita, dan yang perlu tentang jawapan yang betul.
CS50.TV