[Powered by Google Translate] [Minggu 4]
[David J. Malan] [Universiti Harvard]
[Ini adalah CS50.] [CS50.TV]
>> Baiklah, ini adalah CS50, dan ini adalah permulaan 4 minggu,
dan ini adalah salah satu algoritma sorting perlahan mungkin.
Yang mana satu adalah bahawa kita hanya menonton di sana?
Itu adalah jenis gelembung, dalam perintah besar O (n ^ 2) + jumlah,
dan sememangnya kita tidak adalah satu-satunya di dunia ini seolah-olah tahu
apa apapun gelembung atau masa berjalan.
Sesungguhnya, ini adalah satu temu bual dengan Eric Schmidt Google
dan bekas senator Barack Obama hanya beberapa tahun yang lalu.
>> Sekarang, Senator, anda di sini pada Google,
dan saya suka berfikir presiden sebagai temuduga pekerjaan.
Kini, ia adalah sukar untuk mendapatkan pekerjaan sebagai presiden, dan anda akan melalui menggigil sekarang.
Ia juga sukar untuk mendapatkan pekerjaan di Google.
Kami mempunyai soalan, dan kita bertanya soalan calon kami,
dan yang satu ini adalah dari Larry Schwimmer.
Kalian fikir saya bergurau? Ia adalah di sini.
Apakah cara yang paling berkesan untuk menyelesaikan satu juta integer 32-bit?
[Ketawa]
Well-
Saya minta maaf. >> Tidak, tidak, tidak, tidak.
Saya fikir jenis gelembung akan menjadi cara yang salah untuk pergi.
>> Come on, yang memberitahunya ini?
Minggu lepas ingat kita mengambil cuti dari kod, sekurang-kurangnya untuk hari,
dan mula memberi tumpuan kepada beberapa idea tahap yang lebih tinggi dan penyelesaian masalah lebih amnya
dalam konteks mencari dan menyusun,
dan kita memperkenalkan sesuatu yang kita tidak menampar nama ini pada minggu lepas,
tetapi notasi asimptot, Big O, Omega Besar,
dan kadang-kadang notasi Teta Besar, dan ini adalah semata-mata cara
menerangkan masa berjalan algoritma,
berapa banyak masa yang diperlukan untuk algoritma untuk menjalankan.
>> Dan anda mungkin ingat bahawa anda bercakap tentang masa berjalan dari segi saiz
input, yang kita biasanya panggilan n, apa jua masalah yang berkenaan,
di mana n ialah bilangan orang di dalam bilik,
bilangan muka surat dalam buku telefon, dan kita mula untuk menulis perkara yang keluar
seperti O (n ^ 2) atau O (n) atau O (n log n),
dan walaupun matematik tidak cukup bersenam begitu sempurna
dan ia adalah n ² - n / 2 atau sesuatu seperti itu
kita sebaliknya akan hanya buang beberapa terma perintah yang lebih rendah,
dan motivasi di sana adalah bahawa kita benar-benar mahu
jenis cara objektif menilai
prestasi program atau prestasi algoritma
bahawa pada akhir hari tiada kaitan, misalnya,
dengan kelajuan komputer anda hari ini.
>> Sebagai contoh, jika anda melaksanakan isih gelembung,
atau anda melaksanakan bergabung apapun jenis atau pemilihan pada komputer hari ini,
komputer 2 GHz, dan anda menjalankan,
dan ia mengambil masa beberapa beberapa saat, tahun depan ada satu GHz 3
atau komputer 4 GHz, dan kemudian anda mungkin mendakwa bahawa "Wow, algoritma saya
kini dua kali lebih cepat, "apabila dalam realiti yang jelas bukan kes itu.
Ia hanya perkakasan telah mendapat lebih cepat, tetapi komputer anda
tidak, dan sebagainya kita benar-benar mahu buang perkara-perkara seperti
gandaan 2 atau gandaan 3 apabila ia datang untuk menerangkan
berapa cepat atau bagaimana perlahan algoritma dan benar-benar hanya memberi tumpuan
n atau beberapa faktor daripadanya,
sedikit kuasa daripadanya seperti dalam kes macam dari minggu lepas.
Dan ingat bahawa dengan bantuan apapun merge
kita mampu untuk melakukan jauh lebih baik daripada isih gelembung dan apapun pemilihan
dan juga kemasukan apapun.
>> Kami mendapat ke n log n, dan sekali lagi,
ingat bahawa log n umumnya merujuk kepada sesuatu yang tumbuh
lebih perlahan maka n, supaya n log n setakat ini adalah baik
kerana ia adalah kurang daripada ² n.
Tetapi untuk mencapai n log n dengan apapun merge
apa yang kuman asas idea bahawa kita terpaksa untuk memanfaatkan
bahawa kita juga dimanfaatkan kembali di titik 0 minggu?
Bagaimana kita menangani masalah sorting bijak dengan jenis merge?
Apakah wawasan utama, mungkin?
Sesiapa sahaja pada semua.
Baiklah, mari kita mengambil langkah ke belakang.
Terangkan bergabung apapun dalam perkataan anda sendiri.
Bagaimana ia berfungsi?
Baiklah, kita akan berdayung kembali ke 0 minggu.
Okay, yeah.
[Didengar-pelajar]
Okay, baik, jadi kami dibahagikan pelbagai nombor ke 2 keping.
Kami disusun setiap orang-orang keping, dan maka kita digabungkan mereka,
dan kita telah melihat idea ini sebelum mengambil satu masalah yang besar ini
dan mencincang sehingga ia menjadi masalah yang ini besar atau besar ini.
>> Recall contoh buku telefon.
Recall algoritma pengiraan diri dari minggu lalu,
apapun jadi bergabung telah diringkaskan oleh pseudokod ini di sini.
Apabila anda diberi n unsur, pertama ia adalah kewarasan memeriksa.
Jika n <2 kemudian tidak berbuat apa-apa pada semua
kerana jika n <2 maka n jelas 0 atau 1,
dan sebagainya jika ia adalah sama ada 0 atau 1 ada apa-apa untuk menyelesaikan.
Anda selesai.
Senarai anda sudah disusun trivially.
Tetapi sebaliknya jika anda mempunyai 2 atau lebih unsur pergi ke hadapan dan membahagikan mereka
kepada 2 bahagian, kiri dan kanan.
Susun setiap bahagian mereka, dan kemudian menggabungkan bahagian yang disusun.
Tetapi masalah di sini adalah bahawa pada pandangan pertama ini merasakan seperti yang kita sedang punting.
Ini adalah definisi yang bulat dalam bahawa jika saya telah meminta anda untuk menyusun elemen-elemen n
dan anda memberitahu saya "Baiklah, halus, kita akan menyusun unsur-unsur n / 2 dan mereka n / 2,"
maka soalan seterusnya saya akan menjadi "Fine, bagaimana anda menyusun n / 2 elemen?"
>> Tetapi kerana struktur program ini,
kerana terdapat kes ini asas, jadi untuk bercakap,
ini kes khas yang mengatakan bahawa jika n <beberapa nilai tetap seperti 2 pulangan segera.
Jangan bertindak balas dengan jawapan yang sama bulat.
Proses ini, cyclicity ini akhirnya akan berakhir.
Jika saya meminta anda "Susun unsur-unsur n," dan anda berkata, "Fine, menyusun ini n / 2,"
maka anda mengatakan, "Halus, jenis-n / 4, n / 8, n/16,"
akhirnya anda akan membahagikan dengan bilangan yang cukup besar
bahawa anda akan mempunyai hanya 1 kiri unsur, di mana titik anda boleh mengatakan,
"Di sini, di sini adalah elemen tunggal yang disusun."
Kemudian kecemerlangan algoritma ini sehingga di sini adalah berasal dari fakta
bahawa apabila anda mempunyai semua ini senarai yang disusun secara individu,
semua yang 1 saiz, yang seolah-olah menjadi sia-sia,
sebaik sahaja anda mula penggabungan mereka dan bergabung mereka
anda membina akhirnya sebagai Rob lakukan dalam video senarai akhirnya diselesaikan.
>> Tetapi idea ini menjangkau lebih jauh daripada sorting.
Terdapat idea ini tertanam dalam program ini dikenali sebagai rekursi,
idea di mana anda program,
dan untuk menyelesaikan beberapa masalah yang anda memanggil diri anda,
atau meletakkan dalam konteks bahasa pengaturcaraan anda adalah fungsi,
dan untuk menyelesaikan masalah, anda fungsi memanggil diri
lagi dan lagi dan lagi, tetapi anda fungsi
tidak boleh memanggil diri anda masa yang tak terhingga banyaknya.
Akhirnya anda perlu ke bawah keluar, jadi untuk bercakap,
dan mempunyai beberapa keadaan yang berkod keras asas yang mengatakan
pada ketika ini berhenti memanggil diri anda supaya bahawa keseluruhan proses
akhirnya tidak sebenarnya berhenti.
Apakah ini benar-benar bermakna, untuk recurse?
>> Mari kita lihat, jika kita boleh melakukan yang mudah, contoh remeh dengan, katakan,
3 orang dengan saya di sini di atas pentas, jika seseorang selesa.
1, datang pada sehingga, 2 dan 3.
Jika anda 3 mahu datang sini.
Jika anda mahu berdiri di sebelah saya di sini dalam satu barisan, andaikan bahawa masalah di tangan
sangat trivially mengira bilangan orang-orang yang berada di sini.
Tetapi terus-terang, saya letih semua contoh-contoh pengiraan.
Ini akan mengambil sedikit masa, 1, 2, dan dot, dot, dot.
Ia akan mengambil masa selama-lamanya.
Saya lebih suka hanya menyepak bola masalah ini sama sekali dengan bantuan-apa nama anda?
Sara. >> Sara, hak semua.
Kelly. >> Kelly dan?
>> Willy >> Willy, Sara, Kelly, dan Willy.
Sekarang saya telah ditanya soalan oleh seseorang
berapa ramai orang yang berada di atas pentas ini, dan aku tidak mempunyai idea.
Ini adalah senarai yang benar-benar panjang, dan begitu juga sebaliknya saya akan melakukan silap mata ini.
Saya akan bertanya kepada orang yang datang kepada saya untuk melakukan kebanyakan kerja,
dan sekali dia dilakukan melakukan kebanyakan kerja
Saya akan melakukan jumlah kurangnya kerja mungkin dan hanya menambah 1
apa jua jawapan itu, jadi di sini kita pergi.
Saya telah ditanya berapa ramai orang yang berada di atas pentas.
Berapa ramai orang yang berada di atas pentas di sebelah kiri anda?
Kiri saya? >> Baiklah, tetapi jangan menipu.
Itu baik, yang betul, tetapi jika kita mahu terus logik ini
mari kita andaikan bahawa anda sama mahu masalah ini menyepak bola ke kiri anda,
jadi bukannya jawapan terus pergi ke hadapan dan hanya lulus tanggungjawab.
Oh, berapa ramai orang yang sebelah kiri saya?
Berapa ramai orang yang ke kiri?
1.
[Ketawa]
Okay, jadi 0, jadi apa sekarang Willy telah dilakukan
anda telah kembali jawapan anda ke arah ini mengatakan 0.
Sekarang, apa yang anda perlu lakukan? >> 1.
Okay, jadi anda 1, jadi anda berkata, "Baiklah, saya akan tambahkan 1
untuk apa jua kiraan Willy, "jadi 1 + 0.
Anda sekarang 1 jadi jawapan anda ke kanan kini-
1. >> Dan saya akan menjadi 2.
Baik, jadi anda mengambil jawapan sebelumnya 1,
menambah jumlah minimum kerja yang anda mahu lakukan, yang merupakan +1.
Anda kini mempunyai 2, dan anda kemudian menyerahkan saya mana nilai?
3, yang saya maksudkan, maaf, 2.
Baik.
>> Nah, kita mempunyai 0 ke kiri.
Kemudian kami mempunyai 1, dan kemudian kita tambahkan 2,
dan sekarang anda menyerahkan saya nombor 2,
dan sebagainya saya berkata, okay, +1, 3.
Sememangnya Terdapat 3 orang yang berdiri di sebelah kepada saya pada peringkat ini,
jadi kita mungkin telah jelas dilakukan ini sangat linear,
sangat banyak dalam fesyen yang jelas, tetapi apa yang kita benar-benar?
Kami mengambil masalah daripada 3 saiz mulanya.
Kami kemudian memecahkan ia ke dalam masalah saiz 2,
maka masalah saiz 1, dan kemudian akhirnya kes asas
adalah benar-benar, oh, tidak ada satu di sana,
di mana titik Willy kembali berkesan jawapan yang berkod keras beberapa kali,
dan yang kedua kemudiannya dipam sehingga, dipam sehingga, dipam sehingga,
dan kemudian dengan menambah tambahan satu ini 1
kami telah melaksanakan idea ini asas rekursi.
>> Sekarang, dalam kes ini ia tidak benar-benar menyelesaikan masalah
mana-mana lebih berkesan, maka kita telah melihat setakat ini.
Tetapi berfikir tentang algoritma yang kita telah dilakukan di atas pentas setakat.
Kami mempunyai 8 keping kertas di papan hitam,
pada video apabila Sean telah mencari untuk bilangan 7, dan apa yang dia benar-benar?
Nah, dia tidak melakukan apa-apa jenis jurang dan menakluk.
Dia tidak melakukan apa-apa jenis rekursi.
Sebaliknya dia hanya melakukan ini algoritma linear.
Tetapi apabila kita memperkenalkan idea nombor yang disusun di atas pentas hidup minggu lepas
maka kita mempunyai naluri ini pergi ke tengah-tengah,
di mana titik kita mempunyai senarai yang lebih kecil daripada 4 saiz atau lain senarai saiz 4,
dan kemudian kita mempunyai masalah yang sama yang tepat, jadi kita berulang, berulang, berulang.
Dalam erti kata lain, kita recursed.
Thank you very much kepada sukarelawan 3 kami di sini untuk menunjukkan rekursi dengan kami.
>> Mari kita lihat jika kita tidak boleh membuat ini kini konkrit lebih sedikit,
menyelesaikan masalah yang sekali lagi kita boleh lakukan cukup mudah,
tetapi kita akan menggunakan ia sebagai batu loncatan untuk melaksanakan idea asas.
Jika saya mahu mengira penjumlahan sekumpulan nombor,
sebagai contoh, jika anda lulus dalam bilangan 3,
Saya ingin memberi anda nilai sigma 3,
jadi jumlah 3 + 2 + 1 + 0.
Saya mahu mendapatkan kembali jawapan 6,
jadi kita akan melaksanakan fungsi ini sigma, fungsi ini penjumlahan
itu, sekali lagi, mengambil input, dan kemudian mengembalikan penjumlahan
daripada jumlah itu sepanjang jalan ke 0.
Yang boleh kita lakukan ini cukup mudah, kan?
Kita boleh melakukan ini dengan beberapa jenis struktur gelung,
jadi biarlah saya pergi ke hadapan dan mendapatkan ini bermula.
>> Termasuk stdio.h.
Biar saya dapatkan sendiri ke utama untuk bekerja di sini.
Mari kita menyimpan ini sebagai sigma.c.
Kemudian saya akan pergi di sini, dan saya akan mengisytiharkan n int,
dan saya akan melakukan perkara-perkara berikut semasa pengguna tidak bekerjasama.
Walaupun pengguna telah tidak memberikan saya nombor positif
membiarkan saya pergi ke hadapan dan meminta mereka untuk GetInt = n,
dan biarlah saya memberikan mereka beberapa arahan untuk apa yang perlu dilakukan,
jadi printf ("integer positif sila").
Hanya sesuatu yang agak mudah seperti ini supaya pada masa kita mencapai talian 14
kita kini mempunyai satu integer positif mungkin dalam n.
>> Sekarang mari kita melakukan sesuatu dengan ia.
Biar saya pergi ke hadapan dan mengira penjumlahan, jadi jumlah int = sigma (n).
Sigma merupakan hanya penjumlahan, jadi saya hanya menulis dalam cara penjaga.
Kami hanya akan memanggilnya sigma sana.
Itulah jumlah wang itu, dan kini saya akan mencetak hasilnya,
printf ("Jumlah ialah% d \ n", jumlah).
Dan kemudian saya akan kembali 0 untuk mengukur baik.
Kami telah melakukan segala-galanya bahawa program ini memerlukan kecuali bahagian yang menarik,
yang sebenarnya melaksanakan fungsi sigma.
>> Biar saya pergi ke sini ke bawah, dan biarlah saya mengisytiharkan fungsi sigma.
Ia mendapat untuk mengambil pembolehubah yang integer jenis,
dan apa jenis data yang saya mahu kembali dianggap dari sigma?
Int, kerana saya mahu ia sepadan dengan jangkaan saya pada 15 baris.
Di sini biarlah saya pergi ke hadapan dan melaksanakan ini
dalam cara yang agak mudah.
>> Mari kita pergi ke hadapan dan berkata jumlah int = 0,
dan sekarang saya akan pergi ke mempunyai sedikit gelung di sini
yang akan mengatakan sesuatu seperti ini,
(int i = 0; I <= bilangan; i + +) jumlah + = i.
Dan kemudian saya akan kembali jumlah.
Saya boleh dilaksanakan ini di mana-mana nombor cara.
Saya boleh digunakan gelung sementara.
Saya boleh dilangkau menggunakan pembolehubah jumlah jika saya benar-benar mahu,
tetapi dalam jangka pendek, kita hanya mempunyai fungsi bahawa jika saya tidak orang bodoh mengisytiharkan jumlah adalah 0.
Kemudian ia lelaran dari 0 sehingga melalui nombor,
dan pada setiap lelaran ia menambah bahawa nilai semasa kepada jumlah dan kemudian kembali jumlah.
>> Sekarang, terdapat pengoptimuman sedikit di sini.
Ini mungkin satu langkah yang sia-sia, tetapi jadi ia. Itu denda buat masa sekarang.
Kami berada sekurang-kurangnya yang menyeluruh dan akan 0 sepanjang jalan pada sehingga.
Tidak sangat keras dan cukup mudah,
tetapi ternyata bahawa dengan fungsi sigma kita mempunyai peluang yang sama
seperti yang kita lakukan di sini di atas pentas.
Di atas pentas kita hanya dikira berapa ramai orang yang berada di sebelah saya,
tetapi sebaliknya jika kita mahu untuk mengira bilangan 3 + 2 + 1
pada ke 0, kita boleh sama menyepak bola ke fungsi
bahawa saya bukannya akan menggambarkan sebagai rekursi.
Di sini mari kita melakukan kewarasan cepat menyemak dan memastikan saya tidak orang bodoh.
>> Saya tahu terdapat sekurang-kurangnya satu perkara dalam program ini yang saya tidak zalim.
Apabila saya tekan enter saya akan mendapat apa-apa jenis menjerit pada saya?
Apa yang saya akan menjerit pada kira-kira?
Ya, saya terlupa prototaip, jadi saya menggunakan fungsi dipanggil sigma on line 15,
tetapi ia tidak diisytiharkan sehingga garisan 22, jadi saya terbaik proaktif naik sini
dan mengisytiharkan prototaip, dan saya akan mengatakan int sigma (int nombor), dan itulah ia.
Ia dilaksanakan di bawah.
>> Atau cara lain saya boleh menyelesaikan masalah ini,
Saya boleh bergerak fungsi di sana, yang tidak buruk,
tetapi sekurang-kurangnya apabila program anda bermula untuk mendapatkan panjang, terus-terang,
Saya fikir ada beberapa nilai dalam sentiasa mempunyai utama di bahagian atas
supaya anda pembaca boleh membuka fail tersebut dan kemudian segera melihat
apa yang program ini lakukan tanpa perlu mencari melalui
mencari fungsi yang utama.
Mari kita pergi ke tetingkap terminal saya di sini, cuba membuat sigma membuat sigma,
dan saya diskrukan sehingga di sini juga.
Akuan tersirat GetInt fungsi bermakna saya terlupa untuk berbuat apa lagi?
[Didengar-pelajar]
Baik, jadi nampaknya satu kesilapan biasa, jadi mari kita meletakkan ini di sini,
cs50.h, dan sekarang mari kita kembali ke tetingkap terminal saya.
>> Saya akan mengosongkan skrin, dan saya akan memutarkan lagi membuat sigma.
Ia seolah-olah telah disusun. Izinkan saya sekarang menjalankan sigma.
Saya akan menaip dalam bilangan 3, dan saya tidak mendapat 6, jadi tidak cek yang ketat,
tetapi sekurang-kurangnya ia seolah-olah bekerja pada pandangan pertama, tetapi sekarang mari kita merobek ia selain,
dan mari kita sebenarnya memanfaatkan idea rekursi, sekali lagi,
dalam konteks yang sangat mudah supaya dalam masa beberapa minggu '
apabila kita mula meneroka struktur data yang penjaga daripada array
kita mempunyai satu lagi alat dalam Kit dengan yang
memanipulasi struktur data tersebut seperti yang kita akan lihat.
Ini adalah pendekatan lelaran, pendekatan berasaskan gelung.
>> Biar saya sebaliknya kini melakukan ini.
Biar saya bukan mengatakan bahawa penjumlahan nombor
ke 0 adalah benar-benar perkara yang sama seperti
nombor + sigma (nombor 1).
Dalam erti kata lain, sama seperti di atas pentas saya punted kepada setiap orang akan datang kepada saya,
dan mereka pula disimpan punting sehingga kita akhirnya berdasar keluar pada Willy,
yang terpaksa pulang jawapan keras berkod seperti 0.
Di sini sekarang kita sama punting untuk sigma
fungsi yang sama seperti pada asalnya dipanggil, tetapi wawasan utama di sini
adalah bahawa kita tidak memanggil sigma sepercaman.
Kami tidak lulus di n.
Kami jelas lulus dalam bilangan - 1,
jadi masalah sedikit lebih kecil, masalah kecil sedikit.
>> Malangnya, ini tidak agak penyelesaian lagi, dan sebelum kita menetapkan
apa yang mungkin melompat keluar sebagai jelas di sesetengah daripada anda
izinkan saya pergi ke hadapan dan memutarkan lagi membuat.
Ia seolah-olah untuk menyusun okay.
Izinkan saya jalankan lagi sigma dengan 6.
Oop, biarlah saya jalankan lagi sigma dengan 6.
Kami telah melihat sebelum ini, walaupun masa yang sengaja lepas juga.
Mengapa saya mendapat ini bersalah segmentasi samar? Yeah.
[Didengar-pelajar]
Tiada kes asas, dan lebih khusus, apa yang mungkin berlaku?
Ini adalah gejala apa tingkah laku?
Katakanlah ia sedikit kuat.
[Didengar-pelajar]
Ia gelung tak terhingga dengan berkesan, dan masalah dengan gelung tidak terhingga
apabila mereka melibatkan rekursi dalam kes ini, fungsi memanggil sendiri,
apa yang berlaku setiap kali anda memanggil fungsi?
Nah, berfikir kembali bagaimana kita dibentangkan memori dalam komputer.
Kami berkata bahawa ada ini sebahagian memori dipanggil timbunan yang di bawah,
dan setiap kali anda memanggil fungsi memori yang lebih sedikit mendapat meletakkan
pada timbunan ini kononnya mengandungi pembolehubah tempatan atau parameter yang fungsi,
jadi jika sigma panggilan panggilan sigma sigma panggilan sigma
panggilan sigma manakah ini akhir cerita?
>> Nah, ia akhirnya lebihan jumlah
memori yang anda ada ke komputer anda.
Anda ditakluki segmen bahawa anda sepatutnya berada dalam lingkungan,
dan anda mendapatkan ini kesalahan segmentasi, dibuang teras,
dan apa teras dibuang bermakna bahawa saya kini mempunyai fail yang dipanggil teras
yang merupakan fail yang mengandungi sifar dan orang-orang yang
yang sebenarnya pada masa depan akan menjadi diagnostically berguna.
Jika ia tidak jelas kepada anda di mana pepijat anda ini adalah
anda sebenarnya boleh melakukan sedikit analisis forensik, jadi untuk bercakap,
pada fail dump teras, yang, sekali lagi, hanya sekumpulan keseluruhan sifar dan orang-orang yang
yang pada asasnya mewakili negeri dalam program anda dalam ingatan
masa ini ia terhempas dengan cara ini.
>> Menetapkan di sini adalah bahawa kita tidak boleh hanya membuta tuli kembali sigma,
bilangan + sigma masalah kecil sedikit.
Kita perlu mempunyai beberapa jenis kes asas di sini,
dan apa yang perlu kes asas mungkin?
[Didengar-pelajar]
Okay, selagi nombor adalah positif kita sebenarnya perlu kembali ini,
atau meletakkan cara lain, jika nombor, katakan, <= ke 0
anda tahu apa, saya akan pergi ke hadapan dan kembali 0,
sama seperti Willy lakukan, dan yang lain, saya akan pergi ke hadapan
dan kembali ini, jadi ia tidak yang lebih pendek
daripada versi lelaran yang kita disebat pertama menggunakan untuk gelung,
tetapi notis bahawa terdapat jenis ini keanggunan ke.
Bukannya kembali beberapa nombor dan melaksanakan segala matematik ini
dan menambah perkara dengan pembolehubah tempatan
anda sebaliknya berkata "Baiklah, jika ini adalah masalah mudah super,
seperti nombor <0, izinkan saya dengan serta-merta mengembalikan 0. "
>> Kami tidak akan mengganggu menyokong nombor negatif,
jadi saya akan kod keras nilai 0.
Tetapi sebaliknya, untuk melaksanakan idea ini menjumlahkan
semua nombor-nombor ini bersama-sama anda berkesan boleh mengambil menggigit kecil
daripada masalah, sama seperti yang kita lakukan di sini di atas pentas,
kemudian menyepak bola seluruh masalah kepada orang yang seterusnya,
tetapi dalam kes ini orang yang seterusnya adalah diri sendiri.
Ia adalah fungsi sepercaman dinamakan.
Hanya lulus masalah yang lebih kecil dan lebih kecil dan lebih kecil setiap kali,
dan walaupun kita tidak cukup dirasmikan perkara dalam kod di sini
ini adalah apa yang telah berlaku di dalam 0 minggu dengan buku telefon.
Ini adalah apa yang telah berlaku dalam beberapa minggu lalu dengan Sean
dan dengan demonstrasi kami mencari nombor.
Ia mengambil masalah dan membahagikan lagi dan lagi.
>> Dalam erti kata lain, ada cara sekarang menterjemah
ini dunia sebenar membina, membina tahap yang lebih tinggi
membahagi dan menakluk dan melakukan sesuatu lagi dan lagi
dalam kod, jadi ini adalah sesuatu yang kita akan melihat semula dari masa ke masa.
Kini, sebagai diketepikan, jika anda baru kepada rekursi anda perlu sekurang-kurangnya memahami kini
mengapa ini lucu.
Saya akan pergi ke google.com,
dan saya akan mencari beberapa tips dan trik rekursi, masukkan.
Beritahu orang yang datang kepada anda jika mereka tidak ketawa tadi.
Adakah anda maksudkan rekursi?
Did you mean-ah, ada kita pergi.
Okay, sekarang bahawa seluruh semua orang.
Satu telur Easter sedikit tertanam tempat ada di Google.
Sebagai mengetepikan, salah satu link kita diletakkan di atas laman web kursus
untuk hari ini adalah hanya ini grid pelbagai algoritma isihan,
beberapa yang kita melihat pada minggu lepas, tetapi apa yang baik tentang visualisasi ini
seperti yang anda cuba untuk membalut fikiran anda sekitar pelbagai perkara yang berkaitan dengan algoritma
tahu bahawa anda boleh sangat mudah sekarang bermula dengan pelbagai jenis input.
Input semua diterbalikkan, input kebanyakannya disusun, input rawak dan sebagainya.
Seperti yang anda cuba, sekali lagi, membezakan perkara-perkara ini dalam fikiran anda
menyedari bahawa URL ini di laman web kursus pada halaman Kuliah
mungkin membantu anda sebab melalui beberapa daripada mereka.
>> Hari ini kita akhirnya dapat menyelesaikan masalah ini dari semasa belakang,
yang merupakan bahawa fungsi ini swap hanya tidak bekerja,
dan apakah masalah asas dengan swap fungsi ini,
matlamat yang adalah, sekali lagi, untuk menukar nilai di sini dan di sini
seperti yang perkara ini berlaku?
Ini tidak benar-benar bekerja. Mengapa?
Yeah.
[Didengar-pelajar]
Tepat sekali, penjelasan bagi bugginess ini
hanya kerana apabila anda memanggil fungsi dalam C
dan fungsi-fungsi mengambil hujah, seperti a dan b di sini,
anda lulus dalam salinan apa-apa nilai yang anda menyediakan fungsi itu.
Anda tidak menyediakan nilai asal sendiri,
jadi kita melihat ini dalam konteks buggyc,
buggy3.c, yang memandang sesuatu yang kecil seperti ini.
>> Ingatlah bahawa kita mempunyai x dan y dimulakan 1 dan 2, masing-masing.
Kami kemudian dicetak apa yang mereka.
Saya kemudian mendakwa bahawa saya telah bertukar-tukar mereka dengan memanggil swap x, y.
Tetapi masalahnya ialah bahawa bertukar-tukar bekerja,
tetapi hanya dalam skop swap berfungsi sendiri.
Secepat kita mencapai garis 40 nilai-nilai bertukar
dibuang, dan sebagainya tiada
utama dalam fungsi asal itu sebenarnya telah diubah pada semua,
jadi jika anda berfikir kembali kemudian untuk apa ini kelihatan seperti dari segi ingatan kita
jika ini sebelah kiri lembaga mewakili
dan saya akan melakukan yang terbaik untuk semua orang untuk melihat ini jika ini sebelah kiri lembaga
mewakili, katakan, RAM anda, dan timbunan akan berkembang dengan cara ini,
dan kita panggil fungsi seperti utama, dan utama mempunyai 2 pembolehubah tempatan, x dan y,
mari kita menggambarkan mereka sebagai x di sini, dan mari kita menggambarkan ini sebagai y di sini,
dan mari kita dimasukkan ke dalam nilai 1 dan 2, jadi ini di sini adalah utama,
dan apabila utama panggilan fungsi sistem operasi swap
memberikan fungsi swap petak sendiri memori pada timbunan,
bingkai sendiri pada timbunan, jadi untuk bercakap.
Ia juga memperuntukkan 32 bit bagi ints.
Ia berlaku untuk memanggil mereka a dan b, tetapi yang benar-benar sewenang-wenangnya.
Ia boleh telah memanggil mereka apa sahaja yang ia mahu, tetapi apa yang berlaku apabila utama
swap panggilan adalah ia mengambil masa ini 1, meletakkan satu salinan di sana, meletakkan salinan sana.
>> Terdapat 1 pemboleh ubah tempatan yang lain di swap, walaupun, yang dipanggil apa? Tmp >>.
Tmp, jadi biarlah saya memberikan diri saya 32 bit lagi di sini,
dan apa yang saya lakukan dalam fungsi ini?
Saya berkata tmp int mendapat, jadi mempunyai 1, jadi saya melakukan ini apabila kita terakhir dimainkan dengan contoh ini.
Kemudian mendapat b, jadi b ialah 2, jadi sekarang ini menjadi 2,
dan b kini mendapat menggoda, jadi sementara adalah 1,
jadi sekarang b menjadi ini.
Itu yang besar. Ia bekerja.
Tetapi kemudian secepat pulangan fungsi
memori swap berkesan hilang supaya ia boleh diguna semula
oleh fungsi lain pada masa depan, dan utama adalah jelas sepenuhnya berubah.
Kita memerlukan cara asasnya menyelesaikan masalah ini,
dan hari ini kita akhirnya akan mempunyai cara untuk melakukan ini di mana
kita boleh memperkenalkan sesuatu yang dipanggil penunjuk.
Ia ternyata bahawa kita boleh menyelesaikan masalah ini
bukan dengan lulus dalam salinan x dan y
tetapi bukannya dengan lulus dalam apa, adakah anda berfikir, untuk fungsi swap?
Ya, apa tentang alamat?
Kami telah tidak benar-benar bercakap tentang alamat secara terperinci banyak,
tetapi jika papan hitam ini mewakili memori komputer saya
kita pasti boleh mula penomboran bait dalam RAM saya
dan mengatakan ini adalah bait # 1, ini adalah bait # 2, bait # 3,
bait # 4, bait # ... 2 bilion jika saya mempunyai 2 Gigabyte RAM,
jadi kita pasti boleh datang dengan beberapa skim penomboran sewenang-wenangnya
untuk semua bait individu dalam memori komputer saya.
>> Bagaimana jika sebaliknya apabila saya panggil swap
bukannya pas dalam salinan x dan y
kenapa saya tidak sebaliknya lulus dalam alamat x di sini,
alamat y di sini, pada dasarnya pos alamat
x dan y kerana kemudian tukar, jika dia diberitahu
alamat dalam ingatan x dan y,
kemudian tukar, jika kita melatih dia sedikit,
dia berpotensi memandu ke alamat itu, jadi untuk bercakap,
x, dan menukar nombor di sana, kemudian memandu ke alamat y,
menukar nombor di sana, walaupun ketika tidak sebenarnya mendapat salinan nilai-nilai dirinya,
jadi walaupun kita bercakap tentang perkara ini sebagai ingatan utama
dan ini swap sebagai ingatan yang kuat dan bahagian berbahaya C
adalah bahawa apa-apa fungsi boleh menyentuh ingatan mana-mana sahaja dalam komputer,
dan ini adalah berkuasa dalam bahawa anda boleh melakukan perkara-perkara yang sangat mewah dengan program komputer di C.
Ini adalah berbahaya kerana anda juga boleh skru sehingga sangat mudah.
Malah, salah satu cara yang paling biasa untuk program hari ini akan dieksploitasi
masih adalah untuk programmer tidak menyedari
bahawa dia membenarkan data
hendaklah ditulis dalam lokasi memori yang tidak bertujuan.
>> Sebagai contoh, dia mengisytiharkan pelbagai bersaiz 10
tetapi kemudian sengaja cuba untuk meletakkan 11 bait ke dalam pelbagai bahawa memori,
dan anda mula menyentuh bahagian ingatan yang tidak lagi sah.
Hanya untuk konteks ini, sebahagian daripada anda mungkin tahu bahawa
perisian sering meminta anda untuk nombor siri atau kunci pendaftaran,
Photoshop dan Word dan program-program seperti ini.
Terdapat wujud retak, sebagai sebahagian dari kamu tahu, talian di mana anda boleh menjalankan program kecil,
dan Voilà, tiada permintaan yang lebih untuk nombor siri.
Bagaimana yang bekerja?
Dalam banyak kes, perkara-perkara ini hanya mencari dalam komputer
segmen dalam teks sifar sebenar dan orang-orang yang komputer
mana adalah bahawa fungsi yang mana nombor siri diminta,
dan anda menimpa ruang itu, atau semasa program sedang berjalan
anda boleh mengetahui di mana kunci sebenarnya disimpan
menggunakan sesuatu yang dipanggil penyahpepijat, dan anda boleh retak perisian yang cara.
Ini bukan untuk mengatakan bahawa ini adalah objektif kami untuk beberapa hari akan datang,
tetapi ia mempunyai kesan yang sangat dunia sebenar.
Bahawa salah satu yang berlaku melibatkan kecurian perisian,
tetapi terdapat juga kompromi mesin keseluruhan.
>> Malah, apabila laman web hari ini dieksploitasi
dan dikompromi dan data bocor dan kata laluan yang dicuri
ini sangat sering berkaitan dengan pengurusan yang lemah ingatan seseorang,
atau, dalam kes pangkalan data, kegagalan untuk menjangka
input pertentangan, jadi lebih pada itu pada minggu-minggu akan datang,
tetapi kini hanya preview menyelinap apapun kerosakan yang boleh anda lakukan
dengan tidak cukup memahami bagaimana perkara yang bekerja di bawah hood.
Mari kita pergi tentang memahami mengapa ini dipecahkan
dengan alat yang akan menjadi lebih dan lebih berguna
program kami mendapat lebih kompleks.
Setakat ini apabila anda mempunyai pepijat dalam program anda
bagaimana anda pergi tentang debugging ia?
Apa yang telah teknik anda menjadi setakat ini, sama ada yang diajar oleh TF anda
atau hanya otodidak?
[Pelajar] printf.
Printf, begitu printf mungkin telah menjadi rakan anda dalam bahawa jika anda mahu melihat
apa yang berlaku di dalam program anda
anda hanya meletakkan printf sini, printf sini, printf sini.
Kemudian anda menjalankan, dan anda mendapat sejumlah besar barangan pada skrin
yang boleh anda gunakan kemudian simpulkan apa yang sebenarnya berlaku salah dalam program anda.
>> Printf cenderung untuk menjadi perkara yang sangat berkuasa,
tetapi ia adalah satu proses yang sangat manual.
Anda perlu meletakkan printf sini, printf sini,
dan jika anda meletakkan ia di dalam gelung anda mungkin mendapat 100 baris
output yang anda kemudian perlu untuk menapis melalui.
Ia bukan satu mekanisme sangat user-friendly atau interaktif untuk debugging program,
tetapi bersyukur kerana wujud alternatif.
Ada program, misalnya, yang dipanggil GDB, GNU Debugger,
yang merupakan batin sedikit dalam bagaimana anda menggunakannya.
Ia adalah agak kompleks, tetapi terus-terang,
ini adalah salah satu daripada perkara-perkara di mana jika anda dimasukkan ke dalam minggu ini dan seterusnya
jam tambahan untuk memahami sesuatu seperti GDB
ia akan menjimatkan anda mungkin puluhan jam dalam jangka masa panjang,
demikian dengan itu, izinkan saya memberi anda penggoda bagaimana perkara ini berfungsi.
>> Saya dalam tetingkap terminal saya.
Biar saya pergi ke hadapan dan menyusun program ini, buggy3.
Ia sudah up to date.
Biar saya jalankan ia seperti kita melakukan belakang sementara, dan sesungguhnya, ia pecah.
Tetapi mengapa ini? Mungkin saya diskrukan sehingga fungsi swap.
Mungkin ia adalah a dan b. Saya tidak cukup bergerak mereka di sekitar dengan betul.
Biar saya pergi ke hadapan dan melakukan ini.
Bukannya hanya menjalankan buggy3 izinkan saya bukannya menjalankan program ini GDB,
dan saya akan memberitahu ia berjalan buggy3,
dan saya akan termasuk hujah baris arahan, tui,
dan kita akan meletakkan ini dalam masalah masa depan pada spec untuk mengingatkan.
Dan sekarang ini muka yang hitam dan putih muncul itu, sekali lagi,
adalah sedikit hangat pada mulanya kerana terdapat semua ini
maklumat waranti ke sini, tetapi sekurang-kurangnya ada sesuatu yang biasa.
Di bahagian atas tetingkap adalah kod sebenar saya,
dan jika saya tatal di sini marilah saya tatal ke sangat atas fail saya,
dan sesungguhnya, ada buggy3.c, dan notis di bahagian bawah tetingkap ini
Saya mempunyai ini prompt GDB.
>> Ini tidak sama seperti biasa saya John Harvard prompt.
Ini adalah prompt yang akan membenarkan saya untuk mengawal GDB.
GDB adalah penyahpepijat.
Penyahpepijat adalah satu program yang membolehkan anda berjalan melalui
pelaksanaan garis program anda oleh baris demi baris,
sepanjang jalan melakukan apa sahaja yang anda mahu program,
walaupun memanggil fungsi, atau mencari yang lebih penting,
pada nilai pembolehubah pelbagai.
Mari kita pergi ke hadapan dan melakukan ini.
Saya akan pergi ke hadapan dan taip dalam jangka segera GDB,
jadi notis di bahagian bawah kiri skrin saya menaip berjalan,
dan saya telah melanda memasuki, dan apa yang dilakukan?
Ia benar-benar berlari program saya, tetapi saya tidak benar-benar melihat banyak pergi di sini
kerana saya telah tidak sebenarnya memberitahu penyahpepijat
untuk berhenti pada masa tertentu dalam masa.
Hanya menaip jangka menjalankan program.
Saya sebenarnya tidak melihat apa-apa. Saya tidak boleh memanipulasi.
>> Sebaliknya biarlah saya melakukan ini.
Pada ini prompt GDB izinkan saya bukan menaip rehat, masukkan.
Itu bukan apa yang saya maksudkan untuk menaip.
Mari kita bukannya menaip rehat utama.
Dalam erti kata lain, saya mahu untuk menetapkan sesuatu yang dipanggil titik putus,
yang dinamakan kerana ia akan memecahkan atau menjedakan
pelaksanaan program anda di tempat yang tertentu.
Utama ialah nama fungsi saya.
Perhatikan bahawa GDB cukup bijak.
Ia beranggapan bahawa utama berlaku bermula kira-kira pada 18 baris
buggy3.c, dan kemudian notis di sini di sebelah kiri atas
b + adalah betul-betul bersebelahan dengan line 18.
Itu mengingatkan saya bahawa saya telah menetapkan titik putus di line 18.
Kali ini apabila saya menaip jangka, saya akan menjalankan program saya
sehingga ia mencecah titik putus itu,
supaya program itu akan berhenti untuk saya pada line 18.
Di sini kita pergi, berlari.
Tiada apa-apa jua nampaknya telah berlaku, tetapi notis di bahagian bawah kiri
program bermula, buggy3, titik putus 1 utama di garisan buggy3.c 18.
Apa yang boleh saya lakukan sekarang?
>> Notis saya boleh mula menaip perkara-perkara seperti cetak,
tidak printf, cetak x, dan kini yang aneh.
$ 1 hanya ingin tahu, seperti yang kita akan lihat
setiap kali anda mencetak sesuatu anda mendapat baru $ value.
Itulah supaya anda boleh merujuk kembali kepada nilai-nilai yang sebelumnya hanya dalam kes,
tetapi sekarang apa yang cetak memberitahu saya bahawa nilai x pada titik ini dalam cerita
nampaknya 134514032.
Apa? Di manakah yang walaupun datang dari?
[Didengar-pelajar]
Sesungguhnya, ini adalah apa yang kita akan memanggil nilai sampah, dan kami tidak bercakap tentang perkara ini lagi,
tetapi sebab bahawa anda memulakan pembolehubah
adalah jelas supaya mereka mempunyai beberapa nilai yang anda mahu mereka mempunyai.
Tetapi tangkapan ingat bahawa anda boleh mengisytiharkan pembolehubah
seperti yang saya lakukan masa lalu dalam contoh saya sigma
tanpa sebenarnya memberikan mereka nilai.
Ingat apa yang saya lakukan di sini dalam sigma.
Saya mengisytiharkan n, tetapi apa nilai adakah saya memberi ia?
Tiada, kerana saya tahu bahawa dalam beberapa baris seterusnya
GetInt akan menjaga masalah meletakkan nilai di dalam n.
>> Tetapi pada ketika ini dalam cerita dari 11 baris
dan 12 line dan line 13 dan garis 14
sepanjang mereka beberapa baris apakah nilai n?
Dalam C, anda hanya tidak tahu.
Ia adalah umumnya beberapa nilai sampah, beberapa nombor rawak sepenuhnya
yang ditinggalkan dasarnya daripada beberapa fungsi sebelumnya
telah dijalankan, supaya program anda berjalan
ingat bahawa fungsi mendapat fungsi, fungsi, fungsi.
Semua ini bingkai mendapat diletakkan di ingatan, dan kemudian mereka kembali fungsi,
dan seperti saya mencadangkan dengan pemadam memori mereka akhirnya semula.
Nah, ia hanya kebetulan bahawa ini x ubah dalam program ini
seolah-olah telah terkandung beberapa nilai sampah seperti 134514032
daripada beberapa fungsi sebelumnya, tidak ada seorang pun yang saya tulis.
Ia boleh menjadi sesuatu yang datang secara berkesan dengan sistem operasi,
beberapa fungsi di bawah hood.
>> Okay, itulah denda, tetapi mari kita kini maju ke baris seterusnya.
Jika saya menaip "seterusnya" di GDB saya segera dan saya tekan enter,
notis bahawa menonjolkan bergerak ke bawah hingga 19 baris,
tetapi implikasi logik adalah bahawa line 18
kini telah selesai melaksanakan, jadi jika saya sekali lagi menaip "cetak x"
Saya kini perlu melihat 1, dan sesungguhnya, saya lakukan.
Sekali lagi, barangan $ adalah cara GDB mengingatkan anda
apa sejarah cetakan yang anda lakukan.
Sekarang mari saya pergi ke hadapan dan mencetak keluar y, dan sesungguhnya, y ialah beberapa nilai gila juga,
tetapi ada masalah besar kerana di baris 19 kita berada kira-kira untuk menetapkan
nilai 2, jadi biarlah saya menaip "seterusnya" lagi.
Dan sekarang kita berada di garis printf.
Biar saya buat x cetak.
Biar saya melakukan y cetak. Terus terang, saya mendapat sedikit letih percetakan ini.
Biar saya bukan menaip "paparan x" dan "y paparan,"
dan kini setiap kali saya menaip arahan pada masa hadapan
Saya akan mengingatkan apa yang x dan y, apa yang x dan y, apa yang x dan y.
>> Saya boleh juga, sebagai jenis diketepikan, dalam "info penduduk tempatan."
Maklumat adalah arahan khas.
Tempatan bermakna ia menunjukkan saya pembolehubah tempatan.
Hanya dalam kes saya lupa atau ini adalah gila, fungsi rumit
bahawa saya atau orang lain menulis info penduduk tempatan akan memberitahu anda
apakah semua pembolehubah tempatan di dalam fungsi tempatan ini
yang mungkin anda mengambil berat tentang jika anda mahu untuk mencucuk di sekitar.
Sekarang, printf kira-kira untuk melaksanakan, jadi biarlah saya pergi ke hadapan dan hanya menaip "seterusnya."
Kerana kita berada dalam persekitaran ini kita sebenarnya tidak melihat ia
melaksanakan ke sini, tetapi notis itu semakin sedikit remuk di sini.
Tetapi notis ia mengatasi skrin terdapat,
jadi ia bukan satu program yang sempurna di sini, tetapi itulah okay kerana saya sentiasa boleh mencucuk di sekitar
menggunakan cetak jika saya mahu.
>> Biar saya menaip datang lagi, dan sekarang di sini adalah bahagian yang menarik.
Pada ketika ini dalam cerita y ialah 2, dan x ialah 1,
seperti yang dicadangkan di sini, dan sekali lagi,
sebab ini secara automatik memaparkan kini adalah kerana saya menggunakan arahan
paparan x dan y paparan, jadi masa saya menaip seterusnya
dalam teori x dan y harus menjadi ditukar.
Sekarang, kita sudah tahu bahawa tidak akan menjadi kes,
tetapi kita akan melihat dalam seketika bagaimana kita boleh menyelam lebih mendalam untuk memahami mengapa itu benar.
Seterusnya, dan malangnya, y masih 2 dan x masih 1, dan saya boleh mengesahkan banyak.
Cetak x, y cetak.
Sesungguhnya, tiada bertukar-tukar sebenarnya telah berlaku, jadi mari kita mulakan ini lebih.
Jelas swap rosak.
Mari kita bukannya menaip "jangka" lagi.
Biar saya katakan ya, saya ingin memulakan semula dari awal, masukkan.
>> Kini saya kembali pada 18 baris.
Sekarang notis x dan y adalah nilai sampah lagi.
Seterusnya, seterusnya, seterusnya, seterusnya.
Jika saya mendapat bosan saya juga boleh hanya menaip n seterusnya.
Anda boleh menyingkatkan urutan yang sesingkat mungkin aksara.
Swap kini dipecahkan.
Mari kita menyelam dalam, jadi bukannya menaip seterusnya,
sekarang saya akan menaip langkah supaya saya melangkah di dalam fungsi ini
supaya saya boleh berjalan melaluinya, jadi saya mencecah langkah dan kemudian masukkan.
Notis bahawa lompatan menonjolkan turun lebih rendah dalam program saya kepada 36 baris.
Sekarang apakah pembolehubah tempatan?
Maklumat penduduk tempatan.
Tiada apa-apa sahaja lagi kerana kita telah tidak mendapat ke garis itu,
jadi mari kita pergi ke hadapan dan berkata "seterusnya."
Sekarang kita seolah-olah mempunyai tmp, tmp cetak.
Sampah nilai, betul-betul? Saya fikir begitu.
Bagaimana pula mencetak cetak b, 1 dan 2?
Dalam seketika, sebaik sahaja saya menaip seterusnya lagi
tmp akan mengambil nilai 1, mudah-mudahan,
kerana tmp akan diberikan nilai a.
>> Sekarang mari kita tidak mencetak b, cetak,
tetapi kini mencetak tmp, dan ia sememangnya 1.
Biarkan saya lakukan seterusnya. Biarkan saya lakukan seterusnya.
Saya telah selesai fungsi swap.
Saya masih di dalamnya di baris 40, jadi biarlah saya mencetak,
b cetak, dan saya tidak peduli apa tmp.
Ia kelihatan seperti swap adalah betul apabila ia datang untuk bertukar-tukar a dan b.
Tetapi jika saya kini menaip seterusnya, saya melompat kembali kepada 25 baris,
dan tentu saja, jika saya taip x dan y cetak
mereka masih tidak berubah, jadi kita telah tidak tetap masalah.
Tetapi diagnostically kini mungkin dengan program GDB ini
kita telah sekurang-kurangnya mendapat satu langkah lebih dekat untuk memahami
apa yang berlaku salah tanpa perlu untuk sampah kod kami dengan meletakkan printf sini,
printf sini, printf di sini dan kemudian berjalan lagi dan lagi
cuba untuk mengetahui apa yang berlaku salah.
>> Saya akan pergi ke hadapan dan berhenti daripada ini sama sekali dengan berhenti.
Ia akan kemudian berkata, "Berhenti anyway?" Ya.
Kini saya kembali pada prompt biasa saya, dan saya dilakukan dengan menggunakan GDB.
Sebagai mengetepikan, anda tidak perlu untuk menggunakan ini-tui bendera.
Malah, jika anda meninggalkan anda mendapat asasnya separuh bahagian bawah skrin.
Jika saya kemudian taipkan rehat utama dan kemudian berjalan
Saya masih boleh menjalankan program saya, tetapi apa yang ia akan lakukan lebih textually
hanya menunjukkan kepada saya satu baris pada satu masa semasa.
The tui, pengguna teks antara muka,
hanya menunjukkan anda lebih daripada program ini sekali gus, yang mungkin sedikit konsepnya mudah.
Tetapi sesungguhnya, saya hanya boleh lakukan seterusnya, seterusnya, seterusnya,
dan saya akan melihat satu baris pada satu masa, dan jika saya benar-benar mahu melihat apa yang berlaku di
Saya boleh menaip senarai dan melihat sekumpulan keseluruhan garisan jiran.
>> Ada video yang kami telah diminta yang anda menonton untuk masalah menetapkan 3
di mana Nate meliputi beberapa selok-belok GDB,
dan ini adalah salah satu daripada perkara-perkara, jujur, di mana beberapa peratusan yang bukan remeh anda
tidak akan menyentuh GDB, dan yang akan menjadi satu perkara yang buruk
kerana benar-benar anda akan berakhir dengan menghabiskan lebih banyak masa kemudian semester ini
mengejar pepijat maka anda akan jika anda dimasukkan ke dalam setengah jam yang / jam
pembelajaran minggu ini dan seterusnya untuk mendapatkan selesa dengan GDB.
Printf adalah rakan anda.
GDB kini harus menjadi rakan anda.
>> Sebarang pertanyaan pada GDB?
Dan di sini adalah senarai cepat beberapa arahan yang paling berkuasa dan berguna.
Yeah. >> Bolehkah anda mencetak rentetan?
Anda boleh mencetak rentetan? Sudah tentu.
Ia tidak perlu untuk hanya menjadi integer.
Jika s berubah-ubah adalah rentetan hanya taip cetak s.
Ia akan menunjukkan kepada anda apa yang pembolehubah rentetan.
[Didengar-pelajar]
Ia akan memberi anda alamat dan rentetan itu sendiri.
Ia akan menunjukkan kepada anda berdua.
Dan satu perkara yang lepas, hanya kerana ini adalah baik untuk mengetahui terlalu.
Jejakundur dan bingkai, izinkan saya menyelam ke dalam masa ini terakhir,
program yang tepat sama dengan GDB.
Biar saya pergi ke hadapan dan menjalankan versi teks antara muka pengguna,
memecahkan utama.
Biar saya pergi ke hadapan dan berjalan lagi. Di sini saya.
Sekarang mari saya pergi seterusnya, seterusnya, seterusnya, seterusnya, seterusnya, langkah, masukkan.
>> Dan kini andaikan saya kini di swap sengaja, tetapi saya seperti "Damn, apakah nilai x?"
Saya tidak boleh melakukan x lagi.
Saya tidak boleh melakukan y kerana mereka tidak berada dalam skop.
Mereka tidak berada dalam konteks, tetapi tidak ada masalah.
Saya boleh menaip jejakundur.
Itu menunjukkan saya semua fungsi yang telah dilaksanakan sehingga masa ini.
Perhatikan bahawa satu di bahagian bawah, utama, garis-garis dengan utama
berada di bahagian bawah gambar kami di sini.
Hakikat bahawa swap adalah atas ia garisan dengan swap berada di atas dalam ingatan di sini,
dan jika saya mahu mendapatkan kembali utama sementara saya boleh mengatakan "bingkai."
Apakah nombor? Main bingkai # 1.
Saya akan pergi ke hadapan dan berkata "bingkai 1."
>> Kini saya kembali utama, dan saya boleh mencetak x, dan saya boleh mencetak y,
tetapi saya tidak boleh mencetak b atau.
Tetapi saya boleh jika saya katakan, "Baiklah, tunggu satu minit. Mana swap?"
Biar saya pergi ke hadapan dan berkata "0 frame."
Kini saya kembali di mana saya mahu menjadi, dan sebagai mengetepikan,
ada arahan lain juga, seperti jika anda benar-benar mendapat bosan menaip seterusnya, seterusnya, seterusnya, seterusnya,
anda secara amnya boleh mengatakan sesuatu seperti "10 tahun akan datang," dan yang akan melangkah melalui 10 baris berikutnya.
Anda juga boleh menulis "continue" apabila anda benar-benar mendapat bosan dengan melangkah melaluinya.
Teruskan akan menjalankan program anda tanpa gangguan sehingga ia mencecah lain titik putus,
sama ada dalam gelung atau menurunkan dalam program anda.
>> Dalam kes ini kita terus ke akhir, dan program keluar biasanya.
Ini adalah cara yang mewah, proses yang lebih rendah.
Hanya program anda keluar seperti biasa.
Lebih pada itu dalam video dan debugging sesi akan datang.
Itu adalah banyak.
Mari kita rehat 5-minit kami di sini, dan kita akan kembali dengan structs dan fail.
>> Jika anda telah menyelam ke pset minggu ini sudah
anda akan tahu yang kita gunakan dalam kod pengagihan,
sumber kod yang kami sediakan untuk anda sebagai titik permulaan, beberapa teknik-teknik baru.
Secara khususnya, kami memperkenalkan kata kunci ini baru yang dipanggil struct, struktur,
supaya kita boleh mewujudkan pembolehubah khas kejayaannya.
Kami juga memperkenalkan tanggapan fail I / O, fail input dan output,
dan ini adalah supaya kita dapat menyelamatkan negeri
lembaga Kacau anda untuk fail pada cakera
supaya felo pengajaran dan saya boleh memahami
apa yang berlaku di dalam program anda tanpa perlu secara manual bermain
berpuluh-puluh permainan Kacau.
Kita boleh melakukan ini lebih automatedly.
>> Ini idea struct satu menyelesaikan masalah yang agak menarik.
Katalah kita mahu untuk melaksanakan beberapa program
yang entah bagaimana menjejaki maklumat mengenai pelajar,
dan pelajar mungkin mempunyai, misalnya, ID, nama
dan sebuah rumah di tempat seperti Harvard, jadi ini adalah 3 keping maklumat
kita mahu untuk menjaga sekitar, jadi biarlah saya pergi ke hadapan dan mula menulis program kecil di sini,
termasuk stdio.h.
Biar saya lakukan termasuk cs50.h.
Dan kemudian mula Fungsi utama saya.
Saya tidak akan mengganggu dengan apa-apa hujah baris arahan,
dan di sini saya mahu mempunyai pelajar, jadi saya akan katakan
pelajar mempunyai nama, jadi saya akan mengatakan "nama rentetan."
Kemudian saya akan mengatakan pelajar juga mempunyai ID, id jadi int,
dan pelajar mempunyai rumah, jadi saya juga akan berkata "rumah rentetan."
Kemudian saya akan memerintahkan ini sedikit lebih rapi seperti ini.
Okay, sekarang saya mempunyai 3 pembolehubah yang mewakili pelajar, jadi "pelajar."
>> Dan sekarang saya mahu untuk mengisi nilai-nilai ini, jadi biarlah saya pergi ke hadapan dan mengatakan sesuatu seperti
"Id = 123."
Nama akan untuk mendapatkan David.
Katakan rumah akan mendapatkan Mather,
dan kemudian saya akan melakukan sesuatu sewenang-wenangnya seperti printf ("% s,
yang ID adalah% d, tinggal di% s.
Dan kini, apa yang saya mahu untuk palam di sini, salah satu selepas yang lain?
Nama, id, rumah; pulangan 0.
Okay, kecuali saya diskrukan sehingga tempat di sini
Saya fikir kita mempunyai satu program yang cukup baik yang menyimpan seorang pelajar.
Sudah tentu, ini tidak semua yang menarik. Bagaimana jika saya ingin mempunyai 2 pelajar?
Itulah ada masalah besar. Saya boleh menyokong 2 orang.
Biar saya pergi ke hadapan dan menonjolkan ini dan pergi ke sini,
dan saya boleh mengatakan "id = 456" untuk seseorang seperti Rob yang tinggal di Kirkland.
>> Okay, tunggu, tetapi saya tidak boleh memanggil-perkara yang sama,
dan ia kelihatan seperti saya akan perlu untuk menyalin ini,
jadi biarlah saya katakan bahawa ini akan menjadi pembolehubah Daud,
dan biarlah saya mendapatkan beberapa salinan ini untuk Rob.
Kami akan memanggil ini Rob tetapi ini tidak akan bekerja sekarang
kerana saya telah-tunggu, mari kita mengubah saya kepada ID1, NAME1 dan house1.
Rob akan menjadi 2, 2.
Saya telah mendapat untuk menukar ini di sini, sini, sini, sini, sini, sini.
Tunggu, apa mengenai Tommy? Mari kita buat ini lagi.
Jelas sekali jika anda masih berfikir ini adalah cara yang baik untuk berbuat demikian, ia bukan,
jadi copy / paste buruk.
Tetapi kita menyelesaikan ini seminggu yang lalu.
>> Apakah penyelesaian kami apabila kita mahu mempunyai contoh-contoh pelbagai jenis data yang sama?
[Pelajar] Satu pelbagai.
Pelbagai, jadi biarlah saya cuba untuk membersihkan ini.
Izinkan saya membuat beberapa bilik untuk diri sendiri di atas, dan biarlah saya bukannya melakukan ini di sini.
Kami akan memanggil orang-orang ini, dan sebaliknya saya akan mengatakan "id int,"
dan saya akan untuk menyokong 3 kita sekarang.
Saya akan untuk mengatakan "nama-nama rentetan," dan saya akan menyokong 3 daripada kita,
dan kemudian saya akan untuk mengatakan "rumah rentetan," dan saya akan menyokong 3 kita.
Sekarang di sini bukannya Daud mendapat pembolehubah tempatan sendiri
kita boleh menyingkirkan mereka.
Itu berasa baik bahawa kita sedang membersihkan ini.
Saya kemudian boleh mengatakan Daud akan menjadi [0] dan nama [0]
dan rumah-rumah [0].
Dan kemudian Rob kami juga boleh menyimpan mengenai perkara ini.
Mari kita meletakkan ini turun di sini, jadi dia akan sewenang-wenangnya menjadi id [1].
Dia akan menjadi nama [1],
dan kemudian akhir sekali, rumah [1].
>> Masih membosankan sedikit, dan kini saya mempunyai untuk memikirkan ini,
jadi mari kita mengatakan "nama [0], id [0], rumah [0],
dan mari kita menjamakkan ini.
Id, id, id.
Dan sekali lagi, saya melakukannya, begitu lagi, saya sudah melawat menyalin / menampal lagi,
jadi kemungkinan ada penyelesaian lain di sini.
Saya mungkin boleh membersihkan ini meningkat lagi dengan gelung atau sesuatu seperti itu,
jadi dalam jangka pendek, ia adalah sedikit lebih baik tetapi masih berasa seperti
Saya mengambil jalan untuk menyalin / menampal, tetapi walaupun ini, saya menuntut,
tidak benar-benar pada dasarnya penyelesaian yang betul kerana
bagaimana jika kadang-kadang kita membuat keputusan anda tahu apa?
Kami benar-benar harus telah menyimpan alamat e-mel untuk Daud dan Rob
dan orang lain dalam program ini.
Kita juga perlu menyimpan nombor telefon.
Kita juga perlu menyimpan nombor telefon kecemasan.
Kami mempunyai semua ini keping data yang kami ingin menyimpan,
jadi bagaimana anda pergi tentang berbuat demikian?
>> Anda mengaku pelbagai lain di bahagian atas, dan kemudian anda secara manual menambah
alamat e-mel [0], alamat e-mel [1]
Daud dan Rob dan sebagainya.
Tetapi ada benar-benar hanya satu andaian yang mendasari reka bentuk ini
bahawa saya menggunakan sistem penghormatan untuk mengetahui bahawa
[I] dalam setiap beberapa tatasusunan
hanya kebetulan untuk merujuk kepada orang yang sama,
jadi [0] id adalah nombor 123,
dan saya akan menganggap bahawa nama [0]
adalah orang yang sama nama dan rumah [0]
adalah rumah orang yang sama dan sebagainya untuk semua pelbagai tatasusunan yang saya buat.
Tetapi notis bahawa tidak ada hubungan asas
kalangan mereka 3 keping maklumat, id, nama, dan rumah,
walaupun entiti yang kita sedang cuba untuk model dalam program ini tidak tatasusunan.
Tatasusunan adalah hanya cara ini perancangan untuk berbuat demikian.
Apa yang kita benar-benar mahu untuk model dalam program kami adalah orang
seperti Daud, orang seperti Rob dalam mana
atau encapsulating adalah nama dan ID dan rumah.
>> Bolehkah kita entah bagaimana meluahkan idea ini pengkapsulan
di mana seseorang mempunyai ID, nama dan rumah
dan tidak mengambil jalan untuk benar-benar hack ini di mana kita hanya
mempercayai bahawa sesuatu kurungan
merujuk kepada entiti yang sama manusia dalam setiap array berbeza?
Kita sebenarnya boleh melakukan ini.
Biar saya pergi utama di atas buat masa ini, dan izinkan saya membuat jenis data saya sendiri
untuk benar-benar kali pertama.
Kami menggunakan teknik ini dalam Kacau,
tetapi di sini saya akan pergi ke hadapan dan mewujudkan satu jenis data,
dan anda tahu apa, saya akan memanggilnya pelajar atau orang,
dan saya akan menggunakan typedef untuk menentukan jenis.
Saya akan mengatakan bahawa ini adalah struktur,
dan kemudian struktur ini akan menjadi pelajar jenis, kita akan berkata,
walaupun ia adalah sedikit bertarikh sekarang bagi saya.
Kami akan mengatakan "int id."
Kami akan mengatakan "nama tali."
Maka kita akan mengatakan "rumah tali,"
jadi sekarang menjelang akhir tahun ini beberapa baris kod
Saya baru sahaja diajar dilafaz bahawa wujud
jenis data selain ints, selain rentetan, selain beregu, selain terapung.
>> Sehingga saat ini dalam garis masa 11, kini terdapat satu jenis data baru yang dipanggil pelajar,
dan sekarang saya boleh mengisytiharkan pembolehubah pelajar mana-mana sahaja yang saya mahu,
jadi biarlah saya tatal ke bawah di sini untuk orang-orang.
Sekarang saya boleh menghilangkan ini, dan saya boleh kembali turun kepada Daud di sini,
dan bagi David, saya benar-benar boleh mengatakan bahawa Daud,
kita benar-benar boleh menamakan pembolehubah selepas diri sendiri,
akan menjadi pelajar jenis.
Ini mungkin kelihatan sedikit pelik, tetapi ini tidak semua yang berbeza
daripada mengisytiharkan sesuatu sebagai int atau tali atau apungan.
Ia hanya kebetulan dipanggil pelajar kini,
dan jika saya mahu meletakkan sesuatu di dalam struktur ini
Saya kini perlu menggunakan sekeping baru sintaks, tetapi ia agak mudah,
david.id = 123, david.name = "Daud" dalam modal D,
dan david.house = "Mather,"
dan sekarang saya boleh menghilangkan barangan ini di sini.
Notis sekarang kami telah direka semula program kami benar-benar cara yang lebih baik
bahawa sekarang program kami mencerminkan dunia sebenar.
>> Ada tanggapan dunia sebenar seseorang atau pelajar.
Di sini kita mempunyai kini versi C seseorang atau lebih khusus pelajar.
Dalam orang itu adalah ciri-ciri yang berkaitan,
ID, nama dan rumah, jadi Rob dasarnya menjadi perkara yang sama di bawah sini,
jadi pelajar merompak, dan kini rob.id = 456,
rob.name = "Rob."
Hakikat bahawa pembolehubah dipanggil Rob adalah jenis bermakna.
Kami telah dipanggil ia x atau y atau z.
Kami hanya dinamakan Rob menjadi semantik konsisten,
tetapi benar-benar nama adalah di dalam bidang itu sendiri,
jadi sekarang saya ini.
Ini juga tidak berasa seperti reka bentuk yang terbaik bahawa saya telah keras berkod Daud.
Saya telah keras berkod Rob.
Dan saya masih mempunyai untuk menggunakan beberapa salinan dan tampal setiap kali saya mahu pembolehubah baru.
Selain itu, saya mempunyai nampaknya memberi setiap pembolehubah ini nama,
walaupun saya lebih lebih suka menggambarkan pembolehubah ini
lebih generik sebagai pelajar.
>> Sekarang kita boleh menggabungkan idea-idea yang telah bekerja dengan baik bagi kami
dan sebaliknya berkata, "Kamu tahu apa, memberi saya pelajar berubah-ubah dipanggil,
dan mari kita ia telah menjadi daripada 3 saiz, "jadi sekarang saya boleh memperbaiki ini dengan lebih lanjut,
menyingkirkan Daud manual diisytiharkan,
dan saya sebaliknya boleh mengatakan sesuatu seperti pelajar [0] di sini.
Saya kemudian boleh mengatakan pelajar [0] di sini,
pelajar [0] di sini, dan sebagainya, dan saya boleh pergi di sekitar
dan membersihkan bahawa untuk Rob.
Saya juga boleh pergi tentang mungkin menambah gelung
dan menggunakan GetString dan GetInt untuk benar-benar mendapatkan nilai-nilai dari pengguna.
Saya boleh pergi tentang menambah berterusan kerana ini adalah umumnya amalan yang buruk
kod keras beberapa nombor sewenang-wenangnya seperti 3 di sini
dan kemudian hanya ingat bahawa anda perlu meletakkan tidak lebih daripada 3 pelajar di dalamnya.
Ia mungkin akan menjadi lebih baik untuk menggunakan # define di atas fail saya
dan faktor yang keluar, jadi sememangnya, izinkan saya pergi ke hadapan dan umum ini.
>> Izinkan saya membuka satu contoh itulah antara hari ini
contoh terlebih dahulu, structs1.
Ini adalah satu program yang lebih lengkap yang menggunakan # define di sini
dan mengatakan bahawa kita akan mempunyai 3 orang pelajar secara lalai.
Di sini saya mengisytiharkan bernilai kelas pelajar,
jadi kelas pelajar, dan sekarang saya menggunakan gelung
hanya untuk membuat kod sedikit lebih anggun, mengisi kelas
dengan input pengguna, jadi melelar dari i = 0 sehingga kepada pelajar, iaitu 3.
Dan kemudian saya segera turun dalam versi ini
apa ID pelajar, dan saya mendapatkannya dengan GetInt.
Apa nama pelajar, dan kemudian saya mendapatkannya dengan GetString.
Apakah rumah pelajar? Saya mendapat ia dengan GetString.
Dan kemudian di bawah sini saya hanya memutuskan untuk menukar
bagaimana saya mencetak ini keluar dan untuk benar-benar menggunakan gelung,
dan yang saya percetakan?
Menurut komen saya mencetak sesiapa di Mather,
dan itulah ia jadi Rob dan Tommy dan sebagainya sebenarnya Tommy dalam Mather.
Tommy dan David akan dicetak dalam kes ini, tetapi bagaimana ini bekerja?
Kami tidak melihat fungsi ini sebelum ini, tetapi mengambil meneka apakah ini tidak.
Membandingkan tali.
>> Ia sedikit tidak jelas bagaimana ia membandingkan tali kerana ia ternyata
jika ia mengembalikan 0 yang bermaksud tali adalah sama.
Jika ia kembali -1 yang bermakna satu datang abjad sebelum yang lain,
dan jika ia kembali +1 yang bermakna perkataan lain datang abjad
sebelum yang lain, dan anda boleh melihat dalam talian atau di halaman lelaki
untuk melihat tepat yang cara yang, tetapi semua ini kini melakukan ia berkata
jika [i]. rumah adalah sama dengan "Mather"
kemudian pergi ke hadapan dan mencetak begitu dan begitu juga dalam Mather.
Tetapi di sini adalah sesuatu yang kita tidak pernah melihat sebelum ini, dan kita akan kembali kepada ini.
Saya tidak ingat pernah mempunyai untuk melakukan ini dalam mana-mana program saya.
Percuma nampaknya merujuk kepada ingatan, membebaskan memori,
tetapi apa memori saya nampaknya membebaskan dalam gelung ini di bawah program ini?
Ia kelihatan seperti saya membebaskan nama seseorang
dan rumah seseorang, tetapi mengapa?
>> Ia ternyata semua ini minggu yang anda telah menggunakan GetString
kita telah jenis telah memperkenalkan bug ke dalam setiap satu daripada program anda.
GetString oleh reka bentuk memperuntukkan memori supaya ia boleh kembali kepada anda tali,
seperti David, atau Rob, dan anda kemudian boleh melakukan apa sahaja yang anda mahu
dengan tali itu dalam program anda kerana kita telah merizab memori untuk anda.
Masalahnya ialah semua masa ini setiap kali anda memanggil GetString
kita, pengarang GetString, telah meminta sistem operasi
untuk memberi kita sedikit RAM rentetan ini.
Beri kami sedikit RAM rentetan ini akan datang.
Beri kami RAM lebih untuk string ini seterusnya.
Apa yang anda, pengaturcara, tidak pernah telah melakukan
memberi kita yang kembali memori,
jadi untuk beberapa minggu ini semua program yang anda telah ditulis
mempunyai apa yang dipanggil lonjakan memori di mana mereka terus menggunakan
memori lebih dan lebih setiap kali anda memanggil GetString, dan itulah denda.
Kami sengaja berbuat demikian dalam beberapa minggu pertama kerana ia bukan yang menarik
perlu bimbang tentang di mana rentetan itu datang dari.
Apa yang anda mahu adalah perkataan Rob kembali apabila jenis pengguna ia masuk
>> Tetapi bergerak ke hadapan kita kini mempunyai untuk memulakan semakin canggih tentang perkara ini.
Mana-mana masa yang kita memperuntukkan memori kita lebih baik akhirnya menyerahkannya kembali.
Jika tidak di dunia sebenar pada Mac atau PC anda, anda mungkin mempunyai kadang-kadang berpengalaman
gejala di mana komputer anda pengisaran terhenti akhirnya
atau bola pantai berputar bodoh hanya menduduki komputer
perhatian keseluruhan dan anda tidak boleh melakukan perkara-perkara.
Yang boleh dijelaskan oleh apa-apa bilangan pepijat, tetapi di kalangan mereka pepijat yang mungkin
perkara-perkara yang dipanggil kebocoran memori di mana seseorang yang menulis bahawa sekeping perisian
anda menggunakan tidak ingat kepada memori percuma
bahawa dia bertanya kepada sistem operasi untuk,
tidak menggunakan GetString, kerana itulah satu perkara yang CS50, tetapi menggunakan fungsi yang serupa
yang meminta sistem operasi untuk ingatan.
Jika anda atau mereka skru sehingga dan tidak pernah benar-benar kembali memori yang
gejala yang boleh menjadi bahawa program melambatkan dan melambatkan dan melambatkan
melainkan jika anda ingat untuk memanggil percuma.
>> Kita akan kembali kepada bila dan mengapa anda akan memanggil bebas,
tetapi mari kita pergi ke hadapan hanya untuk mengukur baik dan cuba menjalankan program ini tertentu.
Ini dipanggil structs1, masukkan.
Biar saya pergi ke hadapan dan menjalankan structs1, 123, David Mather,
456, Rob Kirkland, 789,
Tommy Mather, dan kita lihat Daud dalam Mather, Tommy dalam Mather.
Ini adalah hanya cek kewarasan sedikit bahawa program ini bekerja.
Sekarang, malangnya, program ini adalah sedikit mengecewakan dalam
Saya tidak semua kerja itu, saya menaip dalam 9 rentetan yang berbeza, tekan enter,
memberitahu yang berada dalam Mather, namun jelas saya tahu yang di Mather sudah kerana saya taip.
Ia akan menjadi sekurang-kurangnya baik jika program ini adalah lebih seperti pangkalan data
dan ia sebenarnya ingat apa yang saya telah ditaip dalam
jadi saya tidak lagi mempunyai untuk input rekod-rekod pelajar.
Mungkin ia adalah seperti sistem registrarial.
>> Kita boleh melakukan ini menggunakan teknik ini yang dikenali sebagai fail I / O, fail input dan output,
cara yang sangat generik mengatakan bila-bila masa anda mahu membaca fail atau menulis fail
anda boleh melakukan ini dengan satu set fungsi tertentu.
Biar saya pergi ke hadapan dan membuka structs2.c contoh ini,
yang hampir sama, tetapi mari kita lihat apa sekarang tidak.
Pada bahagian atas fail Saya mengaku kelas pelajar.
Saya kemudian mengisi kelas dengan input pengguna,
jadi mereka baris kod sama seperti sebelum ini.
Kemudian jika saya tatal ke bawah di sini saya mencetak semua orang yang berada dalam Mather sewenang-wenangnya seperti sebelum ini,
tetapi ini adalah satu ciri baru yang menarik.
Ini baris kod adalah baru, dan mereka memperkenalkan sesuatu di sini,
FILE, semua topi, dan ia mempunyai * di sini juga.
Biar saya bergerak ini di sini, * di sini juga.
>> Fungsi ini kita tidak pernah melihat sebelum ini, fopen,
tetapi ia bermakna fail terbuka, jadi mari kita agunan melalui ini,
dan ini adalah sesuatu yang kita akan kembali dalam psets masa depan,
tetapi ini selaras di sini dasarnya membuka fail yang dipanggil pangkalan data,
dan ia secara khusus dibuka dalam apa-apa cara yang ia boleh melakukan apa yang ia?
[Didengar-pelajar]
Betul, jadi "w" hanya bermakna ia memberitahu sistem operasi
membuka fail ini dalam apa-apa cara yang saya boleh menulis ia.
Saya tidak mahu membacanya. Saya tidak mahu hanya melihat ia.
Saya ingin menukar dan menambah barangan berpotensi untuk ia,
dan fail akan dipanggil pangkalan data.
Ini boleh dipanggil apa-apa.
Ini mungkin database.txt. Ini boleh menjadi db.
Ini boleh menjadi satu perkataan seperti foo, tetapi saya sewenang-wenangnya memilih untuk menamakan pangkalan data fail.
Ini adalah cek kewarasan sedikit bahawa kita akan kembali secara terperinci dari masa ke masa,
jika fp, untuk penunjuk file, tidak NULL sama yang bermakna semuanya berjalan dengan lancar.
>> Cerita pendek panjang, fungsi seperti fopen kadang-kadang gagal.
Mungkin fail tidak wujud. Mungkin anda keluar dari ruang cakera.
Mungkin anda tidak mempunyai kebenaran ke folder itu,
jadi jika fopen mengembalikan sesuatu batal buruk berlaku.
Sebaliknya, jika fopen tidak kembali batal semua adalah baik
dan saya boleh mula menulis ke fail ini.
Berikut adalah helah baru.
Ini adalah gelung untuk itu iterating setiap pelajar saya,
dan ini kelihatan begitu serupa dengan apa yang kita telah dilakukan sebelum,
tetapi fungsi ini adalah sepupu printf dipanggil fprintf fail printf,
dan notis ia berbeza hanya dalam 2 cara.
Satu, ia bermula dengan f bukannya p,
tetapi kemudian hujah pertama nampaknya apa?
[Pelajar] File. >> Ia adalah fail.
Ini perkara yang dipanggil fp, yang akhirnya kita akan mengusik selain apa penunjuk fail,
tetapi untuk sekarang fp hanya mewakili fail yang saya telah dibuka,
supaya fprintf sini mengatakan mencetak ID pengguna ini ke fail, bukan ke skrin.
Cetak nama pengguna ke fail, bukan untuk skrin,
rumah ke fail, bukan ke skrin, dan kemudian turun di sini, jelas,
menutup fail, dan kemudian turun di sini percuma memori.
>> Satu-satunya perbezaan antara ini versi 2 dan versi 1
adalah pengenalan fopen dan FILE ini dengan *
dan ini tanggapan fprintf, jadi mari kita lihat apa hasil akhir.
Biar saya pergi ke tetingkap terminal saya.
Izinkan saya menjalankan structs2, masukkan.
Kelihatan seperti semua adalah baik. Mari kita jalankan lagi structs2.
123, David Mather, 456, Rob Kirkland,
789, Tommy Mather, masukkan.
Kelihatan seperti ia berkelakuan yang sama, tetapi jika saya kini melakukan ls
notis apa fail di sini di kalangan semua kod saya, pangkalan data,
jadi mari kita membuka, gedit pangkalan data, dan melihat itu.
Ia bukan seksi format fail.
Ia benar-benar adalah satu sekeping garis data per baris per baris,
tetapi mereka yang menggunakan fail Excel atau CSV, Comma Separated Values,
Saya pasti boleh digunakan fprintf sebaliknya mungkin melakukan sesuatu seperti ini
supaya saya sebenarnya boleh mewujudkan bersamaan fail Excel
dengan memisahkan perkara dengan koma, bukan sahaja barisan baru.
>> Dalam kes ini, jika saya telah sebaliknya digunakan koma bukannya barisan baru
Saya benar-benar boleh membuka fail pangkalan data dalam Excel jika saya bukannya membuat ia kelihatan seperti ini.
Secara ringkas, sekarang bahawa kita mempunyai kuasa untuk menulis kepada fail
kita kini boleh memulakan data yang berterusan, menjaga ia wujud pada cakera
supaya kita boleh menyimpan maklumat di sekeliling lagi dan lagi.
Notis beberapa perkara lain yang kini sedikit lebih akrab.
Pada bahagian atas fail C ini kita mempunyai typedef
kerana kita mahu mencipta sejenis data yang mewakili perkataan,
jadi jenis ini dipanggil perkataan, dan dalam struktur ini
ia sedikit penjaga sekarang.
Mengapa perkataan terdiri nampaknya pelbagai?
Apakah perkataan hanya intuitif?
>> Ia adalah pelbagai watak.
Ia jujukan aksara kembali ke belakang ke belakang.
HURUF dalam semua topi yang berlaku untuk kita sewenang-wenangnya mengatakan panjang maksimum
mana-mana perkataan di dalam kamus yang kita sedang menggunakan untuk Kacau.
Mengapa saya mempunyai 1?
Watak batal.
Ingat apabila kita lakukan contoh Bananagrams kita memerlukan nilai istimewa
di akhir perkataan untuk menjejaki
di mana perkataan yang sebenarnya berakhir, dan sebagai spesifikasi set masalah mengatakan
di sini kita mengaitkan dengan perkataan yang diberikan nilai boolean,
bendera, jadi untuk bercakap, benar atau palsu.
Pernahkah anda menemui perkataan ini pun, kerana kita menyedari
kita benar-benar memerlukan cara mengingat bukan sahaja apa perkataan dalam Kacau
tetapi sama ada atau tidak anda, manusia, telah mendapati ia
supaya jika anda mencari perkataan "" anda tidak boleh hanya menaip, masukkan,, masukkan,, masukkan
dan mendapat 3 mata, 3 mata, 3 mata, 3 mata.
Kita mahu menjadi mampu untuk menyenaraihitamkan perkataan itu oleh menetapkan bool
kepada true jika anda telah mendapati ia, dan sebagainya itulah sebabnya kita
terkandung dalam struktur ini.
>> Sekarang, turun di sini Kacau ini struct lain yang dipanggil kamus.
Hadir di sini adalah perkataan typedef kerana dalam kes ini
kita perlu merangkumi idea kamus,
dan kamus mengandungi sekumpulan keseluruhan perkataan,
seperti yang tersirat oleh pelbagai ini, dan berapa banyak kata-kata yang ada?
Nah, apa sahaja yang ini saiz yang berubah-ubah yang dipanggil mengatakan.
Tetapi kita hanya perlu satu kamus.
Kita tidak memerlukan jenis data yang dipanggil kamus.
Kita hanya perlu salah seorang daripada mereka, jadi ia ternyata dalam C
bahawa jika anda tidak mengatakan typedef, anda hanya mengatakan struct, maka di dalam pendakap kerinting
anda meletakkan pembolehubah anda, maka anda meletakkan nama.
Ini mengisytiharkan satu kamus ubah yang dipanggil
yang kelihatan seperti ini.
Sebaliknya, ayat-ayat ini mewujudkan satu struktur data yang boleh diguna semula dipanggil perkataan
bahawa anda boleh membuat berbilang salinan, sama seperti kami menciptakan
berbilang salinan pelajar.
>> Apakah ini akhirnya membolehkan kita lakukan?
Biar saya pergi kembali ke dalam, katakan, satu contoh mudah dari zaman mudah,
dan biarlah saya membuka, katakan, compare1.c.
Masalah di sini di tangan sebenarnya adalah untuk mengupas kembali
lapisan rentetan dan mula mengambil kira roda latihan
kerana ia ternyata bahawa rentetan semua masa ini
adalah seperti yang kita janjikan dalam 1 minggu benar-benar hanya nama samaran,
sinonim dari perpustakaan CS50 untuk sesuatu yang kelihatan sedikit lebih samar,
char *, dan kita telah melihat bintang ini sebelum.
Kita melihat ia dalam konteks fail.
>> Mari kita lihat sekarang mengapa kita telah menyembunyikan butiran ini untuk beberapa waktu sekarang.
Berikut adalah fail yang dipanggil compare1.c,
dan nampaknya ia meminta pengguna untuk 2 tali, s dan t,
dan kemudian ia cuba untuk membandingkan mereka rentetan untuk kesaksamaan di baris 26,
dan jika mereka sama ia berkata, "Kamu menaip perkara yang sama,"
dan jika mereka tidak sama, ia berkata, "Anda ditaip perkara yang berbeza."
Biar saya pergi ke hadapan dan menjalankan program ini.
Biar saya pergi ke direktori sumber saya, membuat compare1 satu. Ia disusun okay.
Mari saya menjalankan compare1.
Saya akan mengezum masuk, masukkan.
Mengatakan sesuatu. HELLO.
Saya akan mengatakan sesuatu lagi. HELLO.
Saya pasti tidak menaip perkara yang berbeza.
>> Biar saya cuba ini lagi. BYE BYE.
Pasti tidak berbeza, jadi apa yang berlaku di sini?
Nah, apa yang benar-benar sedang berbanding dalam 26 baris?
[Didengar-pelajar]
Ya, jadi ia ternyata bahawa rentetan, jenis data, adalah jenis dusta putih.
Rentetan adalah * char, tetapi apakah * char?
A * char, sebagaimana yang mereka katakan, adalah penunjuk,
dan penunjuk berkesan alamat,
lokasi jumlah dalam memori, dan jika anda berlaku telah ditaip dalam perkataan seperti HELLO,
ingat dari perbincangan lalu rentetan
ini adalah seperti perkataan HELLO.
Ingatlah bahawa perkataan seperti HELLO boleh diwakili
sebagai pelbagai watak seperti ini
dan kemudian dengan ciri-ciri khas pada akhir dipanggil watak nol,
sebagai menandakan \.
Apa sebenarnya adalah rentetan?
Perhatikan bahawa ini adalah ketulan pelbagai memori,
dan pada hakikatnya, akhir ia hanya diketahui apabila anda melihat melalui rentetan keseluruhan
mencari watak null khas.
Tetapi jika ini adalah sebahagian memori dari memori komputer saya,
mari kita sewenang-wenangnya mengatakan bahawa rentetan ini hanya mendapat bernasib baik,
dan ia mendapat diletakkan di awal sangat RAM komputer saya.
Ini adalah bait 0, 1, 2, 3, 4, 5, 6 ...
>> Apabila saya mengatakan sesuatu seperti GetString dan saya lakukan rentetan s = GetString
apa yang benar-benar dipulangkan?
Untuk beberapa minggu yang lalu, apa yang benar-benar akan disimpan dalam s
bukan ini rentetan per se, tetapi dalam kes ini apa yang disimpan adalah
0 nombor kerana apa GetString sebenarnya tidak
ia tidak fizikal mengembalikan rentetan.
Itu tidak benar-benar masuk akal konsep.
Apakah ia tidak pulangan adalah nombor.
Itu nombor alamat HELLO dalam ingatan,
dan tali s kemudian, jika kita mengupas kembali lapisan ini, tali tidak benar-benar wujud.
Ia hanya peringkasan di perpustakaan CS50.
>> Ini benar-benar adalah sesuatu yang dipanggil * char.
Char masuk akal kerana apa perkataan, seperti HELLO?
Nah, ia adalah satu siri aksara, siri aksara.
* Char bermakna alamat watak,
jadi apakah maknanya untuk kembali rentetan?
A nice, cara mudah mengembalikan rentetan
bukannya cuba untuk memikirkan bagaimana saya kembali ke 5 atau 6 bait yang berbeza
izinkan saya kembali ke alamat yang bait?
Yang pertama.
Dalam erti kata lain, izinkan saya memberi anda alamat watak dalam ingatan.
Itulah apa * char mewakili, alamat satu watak tunggal dalam ingatan.
Panggil bahawa s berubah-ubah.
Kedai dalam s bahawa alamat tertentu, yang saya sewenang-wenangnya berkata adalah 0,
hanya untuk menjaga perkara-perkara yang mudah, tetapi dalam realiti, ia adalah umumnya beberapa yang lebih besar.
>> Tunggu satu minit.
Jika anda hanya memberi saya alamat aksara pertama, bagaimana saya tahu apa alamat
watak kedua, ketiga, keempat dan kelima?
[Didengar-pelajar]
Anda hanya tahu di mana hujung tali adalah dengan cara silap mata ini berguna,
jadi apabila anda menggunakan sesuatu seperti printf, apa printf benar-benar mengambil sebagai hujah,
ingat bahawa kita menggunakan placeholder ini% s, dan kemudian anda lulus dalam
pemboleh ubah yang menyimpan rentetan.
Apa yang anda benar-benar lulus adalah alamat watak pertama rentetan itu.
Printf kemudian menggunakan untuk gelung atau gelung sementara apabila menerima alamat itu,
misalnya, 0, jadi biarlah saya melakukan ini sekarang,
printf ("% s \ n");
Apabila saya panggil printf ("% s \ n"); apa yang saya benar-benar menyediakan printf dengan
adalah alamat watak pertama di s, yang dalam kes ini sewenang-wenangnya adalah H.
>> Bagaimanakah printf tahu apa sebenarnya untuk memaparkan pada skrin?
Orang yang melaksanakan printf melaksanakan gelung sementara atau untuk gelung
yang mengatakan bahawa tidak watak ini menyamai watak null khas?
Jika tidak, mencetak. Bagaimana kira-kira satu ini?
Jika tidak mencetak, mencetak, mencetak, mencetak.
Oh, yang satu ini adalah istimewa. Hentikan percetakan dan kembali kepada pengguna.
Dan itulah benar-benar semua yang telah berlaku di bawah hood,
dan itulah banyak untuk mencerna pada hari pertama kelas,
tetapi kini ia adalah benar-benar blok bangunan memahami segala-galanya
yang telah berlaku di dalam memori komputer kita,
dan akhirnya kita akan mengusik ini selain dengan sedikit bantuan
daripada salah satu daripada rakan-rakan kami di Stanford.
>> Profesor Nick Parlante di Stanford telah dilakukan ini turutan video yang indah
dari pelbagai bahasa yang berbeza yang diperkenalkan
ini claymation sedikit watak Binky.
Suara anda kira-kira untuk mendengar dalam hanya pratonton menyelinap kedua beberapa
adalah seorang profesor Stanford, dan anda mendapat
hanya 5 atau 6 saat hak ini sekarang,
tetapi ini adalah nota yang kita akan menyimpulkan hari ini
dan bermula pada hari Rabu.
Saya memberikan anda Fun pointer dengan Binky, preview.
[Muzik ♪ ♪] [Profesor Parlante] Hei, Binky.
Bangun. Ia adalah masa untuk berseronok penunjuk.
[Binky] Apa itu? Belajar mengenai petunjuk?
Oh, gula-gula!
>> Kami akan melihat anda pada hari Rabu.
[CS50.TV]