>> [MUZIK bermain]
DAVID J. MALAN: Baiklah.
Ini adalah CS50, dan ini adalah permulaan minggu dua.
Jadi mari kita mulakan hari ini dengan pepijat.
Bug A, sudah tentu, adalah kesilapan dalam program,
dan anda akan mendapat sangat biasa dengan konsep ini
jika anda tidak pernah diprogramkan sebelum. pset0 dan kini pset1.
Tetapi mari kita mempertimbangkan sesuatu mudah sedikit pada mulanya.
Program ini di sini bahawa saya melemparkan bersama terlebih dahulu,
dan saya mendakwa bahawa ini perlu mencetak 10 bintang pada skrin menggunakan printf,
tetapi ia nampaknya buggy dalam beberapa cara.
>> Memandangkan spesifikasi yang yang ia perlu mencetak 10 bintang,
tetapi ia tidak nampaknya, apa yang anda akan menuntut adalah pepijat?
Yeah?
Jadi ia adalah satu off oleh satu kesilapan, dan apa yang anda maksudkan dengan itu?
OK.
Cemerlang.
Oleh itu, kita telah ditentukan yang memulakan nilai sifar untuk i,
dan kami telah ditentukan nilai n 10, tetapi kita telah menggunakan kurang daripada atau sama dengan.
Dan sebab ini adalah dua watak-watak dan bukan hanya satu simbol,
seperti dalam buku matematik, adalah bahawa anda tidak mempunyai
satu cara untuk menyatakan yang satu bersamaan watak.
>> Ini bermakna kurang daripada, tetapi jika anda mula mengira pada sifar,
tetapi anda mengira semua jalan sehingga melalui dan sama dengan 10,
anda sudah tentu akan mengira 11 perkara dalam jumlah.
Dan anda akan mencetak 11 bintang.
Jadi apa yang mungkin menjadi satu penyelesaian untuk ini?
Yeah?
>> Jadi hanya melaraskan kurang daripada atau sama dengan hanya kurang daripada,
dan ada, saya menuntut, mungkin penyelesaian yang lain juga.
Apa yang mungkin sahaja yang anda lakukan?
Yeah?
>> Jadi bermula menyamai kepada 1, dan meninggalkan yang kurang daripada atau sama dengan.
Dan terus terang saya akan menuntut itu, bagi seorang manusia biasa,
ini mungkin lebih mudah.
Mula mengira pada 1 dan mengira sehingga melalui 10.
Pada dasarnya melakukan apa yang anda maksudkan.
>> Tetapi realitinya adalah dalam pengaturcaraan, seperti yang kita lihat,
ahli-ahli sains komputer dan pengaturcara umumnya mula mengira pada sifar.
Dan sebagainya itu baik sekali anda membiasakan diri dengannya.
Keadaan anda akan umumnya menjadi sesuatu yang seperti kurang daripada.
Jadi hanya yang logik ralat yang kita dapat sekarang
menetapkan dan akhirnya susun semula ini dan mendapatkan hanya 10.
>> Nah bagaimana pula pepijat ini di sini?
Di sini, sekali lagi, saya menuntut bahawa saya mempunyai matlamat untuk mencetak 10 stars--
satu bagi setiap baris masa ini, tetapi ia tidak.
Sebelum kita mencadangkan apa menetapkan adalah, apakah ini
mencetak visual jika saya untuk menyusun dan menjalankan program ini yang anda fikir?
Yeah?
>> Star.
Jadi semua bintang pada baris yang sama adalah apa yang saya dengar,
dan kemudian watak barisan baru.
Jadi mari kita cuba itu.
Oleh itu, kereta-1, memasuki, dan saya melihat arahan yang dilafaz
bahawa kita bercakap tentang masa lalu.
./buggy-1, dan sesungguhnya saya lihat semua 10 bintang pada baris yang sama walaupun saya menuntut
dalam penentuan saya hanya komen di atas kod yang saya bertujuan untuk melakukan satu per
talian.
Tetapi ini kelihatan betul.
>> Sekarang talian 15 ia kelihatan seperti saya mencetak bintang, dan kemudian talian 16
ia kelihatan seperti saya percetakan watak talian baru,
dan mereka kedua-dua dilekukan jadi Saya di dalam gelung dengan jelas.
Jadi tidak perlu saya lakukan bintang, baru talian, bintang, baris baru, bintang, barisan baru?
Ya?
>> Ya, tidak seperti bahasa seperti Python, jika anda sudah biasa,
lekukan tidak perkara itu kepada komputer.
Ia hanya penting kepada manusia.
Jadi garis manakala di sini saya telah mencipta 15 dan 16-- yang kelihatan indah,
tetapi komputer itu tidak peduli.
Komputer mengambil berat tentang sebenarnya mempunyai pendakap kerinting
sekitar ini baris kod.
>> Jadi bahawa itu clear-- seperti dalam Scratch-- bahawa kedua-dua baris kod
perlu dilaksanakan.
Seperti salah satu daripada orang-orang kuning teka-teki Scratch keping lagi dan lagi dan lagi.
>> Jadi sekarang jalankan semula jika saya ini program-- ./buggy-2-- Hm.
Saya mempunyai kesilapan sekarang.
Apa yang saya lupa untuk lakukan?
Yeah, jadi saya tidak menyusun ia.
Oleh itu, kereta-2.
Tiada fail seperti itu kerana saya tidak sebenarnya menyusun versi kedua.
Jadi sekarang yang menarik tidak diisytiharkan tidak variable-- 2.
Kami lakukan 1.
Membuat kereta-1-- ./buggy-1-- dan kini setiap daripada mereka adalah pada baris yang sama.
>> Sekarang terdapat pengecualian kepada tuntutan ini sepatutnya saya
yang anda perlukan ini pendakap kerinting.
Bilakah ia sebenarnya OK-- jika anda mempunyai perasan dalam seksyen atau textbooks--
untuk meninggalkan pendakap kerinting?
Yeah?
>> Tepat sekali.
Apabila terdapat hanya satu baris kod yang anda
mahu dikaitkan dengan gelung seperti dalam contoh pertama kami.
Ia adalah sempurna yang sah untuk meninggalkan pendakap kerinting
seperti jenis kemudahan yang dari pengkompil kepada anda.
Yeah?
Soalan yang baik.
Adakah ia dianggap sebagai ralat gaya?
Kami akan promote-- seperti dalam CS50 panduan gaya, URL yang mana
adalah dalam pset1-- yang sentiasa menggunakan pendakap kerinting.
Sudah tentu jika anda baru kepada pengaturcaraan.
Realitinya adalah kita tidak akan melarang anda
daripada melakukan kemudahan ini.
Tetapi jika anda hanya mendapat ke dalam buaian perkara,
benar-benar hanya sentiasa menggunakan kerinting pendakap sehingga anda biasa itu.
Soalan yang baik.
>> Baiklah.
Jadi yang dahulu pepijat.
Sekurang-kurangnya dalam sesuatu yang agak mudah.
Namun anda mungkin rasa ini agak asas, bukan?
Ini adalah semacam minggu pertama untuk melihat bahasa
seperti, lihat pepijat anda di dalamnya.
Tetapi realitinya ini adalah sebenarnya wakil
beberapa masalah yang cukup menakutkan yang boleh timbul dalam dunia sebenar.
>> Jadi sebahagian daripada anda mungkin ingat jika anda mengikuti berita teknologi,
atau mungkin juga ditangkap angin ini pada bulan Februari
ini tahun lalu bahawa Apple mempunyai membuat sedikit kesilapan dalam kedua-dua IOS,
sistem operasi pada telefon mereka, dan juga
Mac OS, sistem operasi pada komputer meja dan komputer riba.
Dan anda melihat tajuk seperti ini.
Dan selepas itu, Apple berjanji untuk menetapkan pepijat ini,
dan dengan cepat telah menetapkan dalam IOS, tetapi akhirnya tetap dalam Mac OS
juga.
>> Sekarang tiada tajuk ini sahaja benar-benar mendedahkan apa masalah asas adalah,
tetapi bug yang telah akhirnya dikurangkan kepada bug dalam SSL, soket selamat lapisan.
Dan cerita panjang pendek, ini adalah perisian
bahawa pelayar kita dan lain-lain perisian yang digunakan untuk melakukan apa?
>> Jika saya berkata adalah SSL yang terlibat, setiap kali anda
melawat URL yang bermula dengan HTTPS, apa yang kemudian mungkin SSL berkaitan dengan?
Penyulitan.
Oleh itu, kita akan bercakap tentang ini pada hari-hari yang akan datang.
Penyulitan, seni berebut maklumat.
>> Tetapi cerita panjang pendek, Apple kadang-kadang yang lalu telah membuat kesilapan
dalam pelaksanaannya SSL, yang perisian yang akhirnya melaksanakan
URL seperti HTTPS atau max sambungan sana.
Keputusan ini adalah bahawa anda sambungan boleh berpotensi
dipintas.
Dan sambungan anda adalah tidak semestinya disulitkan
jika anda mempunyai beberapa lelaki yang buruk di antara anda dan laman web destinasi yang
tahu bagaimana untuk mengambil kesempatan daripada ini.
>> Kini Apple akhirnya mencatatkan yang menetapkan untuk ini akhirnya,
dan keterangan daripada menetapkan mereka adalah ini.
Pengangkutan yang gagal untuk mengesahkan kesahihan sambungan.
Isu itu ditangani oleh memulihkan hilang langkah-langkah pengesahan.
>> Jadi ini adalah penjelasan yang sangat beralun tangan hanya untuk mengatakan bahawa kita kacau.
Terdapat literal satu baris kod yang merupakan kereta
dalam pelaksanaannya SSL, dan jika anda pergi ke dalam talian dan mencari ini
anda sebenarnya boleh mencari kod sumber asal.
Sebagai contoh, ini adalah pukulan skrin hanya sebahagian fail yang agak besar,
tetapi ini adalah fungsi yang pada zahirnya dipanggil SSL mengesahkan pelayan tanda pertukaran utama.
Dan ia mengambil sekumpulan hujah-hujah dan input.
Dan kami tidak akan memberi tumpuan terlalu banyak pada minutia di sana,
tetapi jika anda memberi tumpuan kepada kod dalam daripada yang paling atas function-- mari
zum dalam pada itu.
Anda mungkin sudah mengesyaki apa kesilapan mungkin
menjadi walaupun anda tidak tahu akhirnya apa yang anda cari di.
Ada jenis anomali satu di sini, iaitu apa?
>> Yeah, saya tidak benar-benar suka rupa dua goto gagal.
Terus terang, saya tidak benar-benar tahu apa yang goto gagal-apa, tetapi mempunyai dua daripada mereka
kembali ke belakang.
Bahawa hanya jenis menggosoknya saya intelek dengan cara yang salah,
dan sememangnya jika kita zoom ke hanya orang-orang garisan, ini adalah C.
>> Jadi banyak kod Apple adalah sendiri yang ditulis dalam C,
dan ini nampaknya adalah benar-benar equivalent--
tidak dengan lekukan cantik versi, tetapi jika anda menyedari hakikat
bahawa tidak ada pendakap kerinting, apa Apple benar-benar menulis adalah kod yang kelihatan
seperti ini.
Jadi saya telah dizum keluar dan saya hanya tetap lekukan yang dalam erti kata yang
bahawa jika tidak ada pendakap kerinting, yang goto kedua gagal itu berwarna kuning
akan melaksanakan tidak kira apa.
Ia tidak berkaitan dengan jika keadaan di atasnya.
>> Jadi, sekali lagi, jika anda tidak cukup memahami apa yang boleh ini mungkin
menjadi lakukan, tahu bahawa setiap satu daripada syarat-setiap ayat-ayat ini
adalah langkah yang sangat penting dalam proses memeriksa
jika data anda sebenarnya disulitkan.
Jadi ponteng salah satu langkah-langkah, bukan idea yang terbaik.
>> Tetapi oleh kerana kita mempunyai goto kedua gagal dalam kuning,
dan kerana sebaik sahaja kami semacam estetika
bergerak ke kiri di mana ia secara logik adalah pada masa ini, apa yang
adakah ini bermakna untuk garis kod di bawah yang goto kedua
gagal anda akan berfikir?
Ia sentiasa akan dilangkau.
Jadi gotos biasanya disukai atas sebab-sebab kita tidak akan benar-benar pergi ke dalam,
dan bahkan di CS50 kami tidak cenderung untuk mengajar kenyataan goto ini,
tetapi anda boleh memikirkan goto gagal sebagai bermakna pergi melompat
kepada beberapa bahagian lain kod.
>> Dalam erti kata lain melompat ke atas baris ini lepas sama sekali,
dan sebagainya hasil daripada ini bodoh kesilapan mudah yang hanya
Hasil daripada mungkin seseorang menyalin dan menampal satu terlalu
banyak kali adalah bahawa keseluruhan keselamatan iOS dan Mac OS
adalah terdedah kepada pemintasan oleh orang jahat untuk beberapa waktu.
Sehingga Apple akhirnya tetap ini.
>> Sekarang jika sebahagian dari kamu sebenarnya berjalan versi lama iOS atau Mac OS,
anda boleh pergi ke gotofail.com yang adalah sebuah laman web yang seseorang menubuhkan
untuk menentukan dasarnya pengaturcaraan
jika komputer anda masih terdedah.
Dan terus terang, jika ia adalah, ia mungkin idea yang baik
untuk mengemas kini telefon anda atau Mac anda pada ketika ini.
Tetapi di sana, hanya membuktikan betapa penghargaan tahap ini lebih rendah
maklumat dan adil idea-idea yang mudah boleh benar-benar
menterjemahkan ke dalam keputusan dan masalah yang
affected-- dalam case-- ini berjuta-juta orang.
>> Sekarang sebuah kata pada pentadbiran.
Seksyen akan bermula hari Ahad ini akan datang.
Anda akan menerima e-mel oleh hujung minggu mengenai seksyen, pada masa
proses resectioning yang akan bermula jika anda mempunyai
sedar anda kini mempunyai beberapa konflik baru.
Jadi ini yang berlaku setiap tahun, dan kita akan menampung pada hari-hari akan datang.
>> Pejabat hours-- melakukan menyimpan mata pada jadual ini di sini.
Perubahan sedikit minggu ini, terutamanya masa mula
dan lokasi, jadi berunding yang sebelum menuju ke waktu pejabat
mana-mana empat malam seterusnya.
Dan kini satu perkataan kepada penilaian, terutamanya sebagai anda menyelam ke dalam masalah
menetapkan satu dan seterusnya.
>> Jadi setiap spesifikasi, ini secara umumnya
paksi yang bersama-sama yang kita menilai kerja anda.
Skop merujuk kepada apa yang setakat alat kod anda
ciri-ciri yang dikehendaki oleh spesifikasi kami.
Dalam erti kata lain, berapa banyak satu set sekeping adakah anda menggigit.
Adakah anda melakukan ketiga itu, setengah itu, 100% daripadanya.
Walaupun ia tidak betul, berapa banyak yang anda cuba?
Jadi yang menangkap tahap usaha dan jumlah yang
yang anda sedikit di luar masalah masalah set ini.
>> Correctness-- satu ini, untuk sejauh mana, adalah kod anda
konsisten dengan kami spesifikasi dan bebas daripada pepijat.
Jadi ia berfungsi dengan betul?
Jika kita memberikan input beberapa, bukan memberi output yang kita jangkakan?
Design-- sekarang ini adalah yang pertama orang-orang yang terutama kualitatif,
atau orang-orang yang memerlukan pertimbangan manusia.
Dan sesungguhnya, ini adalah mengapa kita mempunyai kakitangan yang begitu ramai felo pengajaran dan kursus
pembantu.
Sejauh manakah anda kod yang ditulis dengan baik?
>> Dan sekali lagi ini adalah sangat penilaian kualitatif
yang akan bekerja dengan anda pada bi-directionally pada minggu-minggu akan datang.
Supaya apabila anda tidak mendapat hanya skor angka, tetapi juga
skor yang bertulis, atau maklum balas menaip, atau maklum balas yang ditulis dalam perkataan bahasa Inggeris.
Itulah apa yang kita akan gunakan untuk memandu anda ke arah sebenarnya menulis kod yang lebih baik.
Dan dalam kuliah dan seksyen, kami akan cuba untuk menunjukkan out-- sekerap kita can--
apa yang membuat program yang bukan sahaja betul dan fungsi yang baik,
tetapi juga direka dengan baik.
Yang paling berkesan ia boleh menjadi, atau walaupun yang paling indah boleh.
>> Yang membawa kita kepada gaya.
Style akhirnya adalah pertimbangan estetik.
Adakah anda memilih yang baik nama-nama untuk pembolehubah anda?
Pernahkah anda dilekukan kod anda dengan betul?
Adakah ia melihat yang baik, dan oleh itu, adalah mudah bagi manusia lain
untuk membaca masing-masing ketepatan itu.
>> Sekarang umumnya setiap sukatan pelajaran, kita menjaringkan perkara-perkara ini pada skala lima mata.
Dan biarlah saya tukul rumah titik bahawa tiga memang baik.
Dengan cepat melakukan orang mula melakukan aritmetik.
Apabila mereka mendapat tiga daripada lima di betulnya bagi sesetengah Serangga
dan mereka berfikir celaka, saya akan 60% yang pada asasnya adalah D atau E.
>> Itu bukan cara kita memikirkan nombor-nombor ini.
A tiga memang baik, dan apa yang kita umumnya menjangka pada permulaan
istilah adalah bahawa jika anda mendapat sekumpulan three's-- mungkin pasangan
pameran, beberapa fours-- atau pasangan berdua-dua, beberapa fours--
itu tempat yang baik untuk memulakan.
Dan selagi kita melihat trajektori menaik dari masa ke masa,
anda berada di tempat yang sangat baik.
>> Formula yang kita gunakan untuk perkara yang berat pada asasnya
ini satu sukatan pelajaran, yang hanya bermakna bahawa kita
memberikan lebih berat kepada kebenaran.
Kerana ia sangat sering kebenaran yang mengambil masa yang paling.
Percayalah sekarang.
Anda akan find-- sekurang-kurangnya dalam satu pset-- anda
menghabiskan 90% daripada masa anda bekerja pada 10% daripada masalah tersebut.
>> Dan semua jenis kerja-kerja kecuali untuk satu atau dua pepijat,
dan mereka adalah pepijat yang menjaga anda sehingga lewat malam.
Mereka adalah orang-orang yang semacam melarikan diri anda.
Tetapi selepas tidur di atasnya, atau menghadiri waktu pejabat
atau bertanya soalan dalam talian, adalah apabila anda sampai ke matlamat itu 100%,
dan itulah sebabnya kita berat kebenaran yang paling.
Rekabentuk sedikit kurang, dan gaya sedikit kurang daripada itu.
Tetapi perlu gaya mind-- mungkin yang paling mudah
ini untuk menggigit seperti panduan gaya.
>> Dan sekarang, yang lebih serius ambil perhatian kejujuran akademik.
CS50 mempunyai perbezaan malang menjadi pengeluar terbesar Lembaga Iklan
kes hampir setiap tahun sejarah.
Ini bukan kerana pelajar menipu dalam CS50 lebih lagi daripada apa-apa kelas,
tetapi kerana dengan jenis kerja, hakikat bahawa itu elektronik,
hakikat bahawa kita melihat untuk itu, dan hakikat kita ahli-ahli sains komputer,
Saya boleh katakan kita malangnya sangat baik mengesan ia.
>> Jadi apakah ini bermakna dari segi sebenar?
Jadi, setiap sukatan pelajaran, falsafah kursus ini
benar-benar tidak mendidih ke munasabah.
Terdapat saluran ini di antara melakukan kerja seseorang pada anda sendiri
dan mendapatkan sedikit bantuan yang munasabah dari seorang teman,
dan secara terang-terangan melakukan kerja untuk anda rakan, atau menghantar dia atau dia kod anda
supaya dia boleh hanya mengambil atau meminjam keluar betul.
Dan itu melintasi garisan yang kami disediakan di dalam kelas.
>> Lihat, sukatan pelajaran akhirnya untuk garis
yang kami ingin menarik sebagai munasabah dan tingkah laku yang tidak munasabah,
tetapi ia benar-benar mendidih turun ke intipati
kerja anda perlu menjadi anda sendiri pada akhirnya.
Kini dengan mengatakan bahawa, terdapat heuristik a.
Kerana seperti yang anda mungkin imagine-- dari waktu pejabat dan visual
dan video yang kami telah ditunjukkan dengan itu far-- CS50
memang dimaksudkan untuk menjadi seperti kerjasama dan sebagai dan individu sosial
yang mungkin.
Sebagai kolaboratif kerana ia adalah ketat.
>> Tetapi dengan ini berkata, heuristik itu, seperti yang anda akan lihat dalam sukatan pelajaran,
ialah apabila anda mempunyai beberapa masalah.
Anda mempunyai beberapa bug dalam kod anda bahawa anda tidak dapat menyelesaikan, adalah munasabah untuk anda
untuk menunjukkan kod anda kepada orang lain.
Seorang kawan walaupun dalam kelas, rakan duduk di sebelah anda di waktu pejabat,
atau ahli kakitangan.
Tapi mereka tidak boleh menunjukkan kod mereka kepada anda.
>> Dalam erti kata lain, menjawab kepada question-- anda
Saya perlu help-- tidak oh, di sini kod saya.
Sila lihat ini dan simpulkan daripadanya apa yang anda akan.
Kini, sudah tentu, ada cara yang jelas untuk permainan
sistem ini di mana saya akan menunjukkan kepada anda kod saya sebelum mempunyai soalan.
Anda menunjukkan saya kod anda saya sebelum mempunyai soalan.
Tetapi melihat sukatan pelajaran sekali lagi untuk butir-butir yang lebih halus di mana talian ini.
>> Hanya untuk kini cat gambar dan berkongsi sebagai telus yang mungkin
di mana kita berada di dalam tahun-tahun kebelakangan ini, ini adalah jumlah kes Lembaga Iklan
CS50 yang mempunyai lebih tujuh tahun yang lalu.
Dengan 14 kes kejatuhan paling baru-baru ini.
Dari segi pelajar yang terlibat, ia adalah 20 beberapa pelajar ganjil
ini jatuh lalu.
Terdapat puncak 33 pelajar beberapa tahun lalu.
Ramai daripada mereka adalah malangnya tidak lagi di sini di kampus.
>> Pelajar yang terlibat sebagai peratusan daripada kelas sejarah, adalah di antara 0%
kepada 5.3%, yang hanya untuk mengatakan ini adalah tahun cabaran.
Dan ke arah mencapai matlamat ini, apa yang kami mahu lakukan adalah menyampaikan satu
bahawa kami hanya dd-- FYI-- membandingkan di yang adil bagi pelajar yang
adalah berikut garis sewajarnya.
Kami melakukan membandingkan semua semasa penghujahan terhadap semua misi yang lalu
dari banyak tahun yang lalu.
>> Kita tahu terlalu bagaimana untuk Google di seluruh dan mencari repositori kod
dalam talian, forum-forum perbincangan dalam talian, laman pekerjaan dalam talian.
Sekiranya pelajar boleh merasa, kita boleh pasti merasa seperti yang kita kesal lakukan.
Jadi apa yang anda akan lihat dalam sukatan pelajaran walaupun adalah klausa penyesalan ini.
Saya boleh pasti menghargai, dan kita semua mempunyai
kakitangan telah melakukan kursus seperti ini, atau yang satu ini sendiri dari masa ke masa,
pasti tahu bagaimana rasanya apabila hidup mendapat di jalan apabila anda mempunyai
beberapa malam lewat deadline-- bukan sahaja di dalam kelas ini,
tetapi another-- apabila anda benar-benar letih, tertekan,
mempunyai nombor tamak haloba perkara-perkara lain yang perlu dilakukan.
Anda akan membuat pada satu ketika dalam kehidupan pasti yang tidak baik, mungkin lewat
keputusan malam.
>> Jadi setiap sukatan pelajaran, terdapat fasal ini,
seperti bahawa jika dalam masa 72 jam membuat beberapa keputusan kurang baik, anda memiliki sehingga ia
dan mendekati saya dan salah satu kepala perjalanan ini
dan kami akan mempunyai perbualan.
Kami akan mengendalikan perkara dalaman dengan harapan
itu menjadi lebih daripada masa pengajaran atau kehidupan pelajaran,
dan tidak sesuatu dengan terutamanya kesan drastik
kerana anda mungkin melihat pada carta ini di sini.
>> Jadi itulah nada yang sangat serius.
Mari kita berhenti sejenak hanya untuk beberapa saat untuk memecahkan ketegangan.
>> [MUZIK bermain]
>> DAVID J. MALAN: Baiklah, jadi bagaimana ialah untuk segue satu?
Untuk topik utama hari ini.
Di mana yang pertama adalah pengekstrakan.
Satu lagi yang akan menjadi perwakilan data, yang terus-terang
adalah cara yang benar-benar kering untuk mengatakan bagaimana boleh kita pergi tentang menyelesaikan masalah dan berfikir
mengenai menyelesaikan masalah?
Jadi anda lihat dalam Scratch, dan anda mempunyai dilihat mungkin sudah pset1 dengan C
bahawa anda bukan sahaja boleh menggunakan fungsi, seperti printf,
bahawa orang lain dalam tahun yang lalu telah menulis untuk anda.
Anda juga boleh menulis fungsi anda sendiri.
>> Dan walaupun anda mungkin tidak mempunyai melakukan ini dalam C, dan terus terang dalam pset1
anda tidak benar-benar perlu untuk menulis anda fungsi sendiri kerana problem-- yang
manakala mungkin menakutkan di pertama glance-- anda akan melihat
akhirnya dapat diselesaikan dengan tidak semua yang banyak baris kod.
Tetapi dengan yang berkata, dari segi menulis fungsi anda sendiri,
menyedari bahawa C tidak memberi anda keupayaan ini.
>> Saya akan pergi dalam kod sumber hari ini, yang boleh didapati sudah dalam talian,
dan saya akan pergi ke depan dan terbuka sehingga program yang dikenali sebagai fungsi 0.C,
dan dalam fungsi sifar kita akan melihat beberapa perkara.
Dalam baris pertama 18 melalui 23 adalah fungsi utama saya.
Dan kini bahawa kita mula membaca kod yang kami tidak menulis dengan cepat,
tetapi sebaliknya saya telah menulis lebih awal atau anda dalam masalah yang dinyatakan
mungkin menerima mempunyai telah ditulis terlebih dahulu.
Satu cara yang baik untuk memulakan membaca kod orang lain
adalah mencari fungsi utama.
Memikirkan di mana yang masuk mata adalah untuk menjalankan program ini,
dan kemudian mengikutinya secara logik dari sana.
>> Jadi program ini nampaknya cetakan nama anda diikuti dengan noktah bertindih.
Kami kemudian gunakan GetString dari perpustakaan CS50 yang
untuk mendapatkan tali, atau perkataan atau frasa daripada pengguna di papan kekunci.
Dan kemudian ada ini perkara PrintName here--.
>> Sekarang PrintName bukan fungsi yang datang dengan C.
Ia bukan dalam io.h. standard
Ia bukan dalam CS50.h.
Ia bukan dalam fail yang sama.
Perhatikan jika saya tatal ke bawah garisan bit-- 25 hingga 27--
ia hanya satu cara cantik mengulas kod anda menggunakan bintang-bintang dan garis condong.
Ini adalah berbilang talian komen, dan ini hanyalah
penerangan saya dalam biru apa fungsi ini tidak.
>> Kerana dalam barisan 28 hingga 31, Saya telah menulis satu fungsi super mudah
Nama yang adalah PrintName.
Ia mengambil masa berapa hujah-hujah yang akan kamu katakan?
Jadi satu argument-- kerana ada satu hujah yang disenaraikan di dalam kurungan.
Jenis yang String.
Yang mengatakan PrintName adalah seperti kotak hitam ini
atau fungsi yang mengambil sebagai input rentetan.
>> Dan nama yang String mudah akan Nama.
Tidak S, N tidak, tetapi Nama.
Jadi apakah PrintName lakukan?
Ia baik mudah.
Sama seperti satu baris kod untuk printf, tetapi nampaknya ia
cetakan keluar "Hello," demikian dan demikian.
Jika jadi dan sebagainya berasal dari hujah.
>> Sekarang ini bukan inovasi yang besar di sini.
Benar-benar, saya telah mengambil program yang boleh telah ditulis dengan satu baris kod
dengan meletakkan ini di sini, dan menukarnya kepada sesuatu yang
yang melibatkan kira-kira enam atau tujuh atau lebih baris kod sepanjang jalan di sini.
>> Tetapi ia adalah satu amalan prinsip yang dikenali sebagai abstrak.
Jenis yang meliputi bahagian dalam yang baru fungsi yang mempunyai nama, dan yang lebih baik
namun nama yang benar-benar mengatakan apa yang dilakukan.
Maksud saya printf-- itu bukan terutamanya deskriptif.
Jika saya ingin membuat sekeping teka-teki, atau jika saya
ingin membuat majlis yang mencetak nama seseorang,
keindahan melakukan ini ialah saya boleh sebenarnya
memberikan fungsi yang nama yang menggambarkan apa yang dilakukan.
>> Kini ia mengambil masa dalam input yang Saya telah dipanggil secara sewenang-wenangnya nama,
tetapi itu juga adalah hebat deskriptif bukannya yang lebih sedikit
generik seperti S. Dan tidak sah, buat masa ini, hanya bermakna
bahawa fungsi ini tidak tangan saya kembali apa-apa.
Ia tidak seperti yang GetString literal tangan saya kembali rentetan
seperti yang kita lakukan dengan keping kertas dengan rakan-rakan anda minggu lepas,
tetapi ia hanya mempunyai kesan sampingan.
Ia mencetak sesuatu untuk skrin.
>> Jadi, pada akhir hari, jika saya jangan membuat fungsi-0, ./function-0,
kita akan melihat bahawa ia meminta nama saya.
Saya menaip Daud, dan ia jenis keluar nama saya.
Jika saya melakukannya sekali lagi dengan Rob, ia akan berkata "Hello, Rob."
Jadi idea yang mudah, tetapi mungkin penentuan berasaskan ini mental
bahawa program anda mendapatkan sedikit lebih rumit,
dan anda ingin menulis sebahagian daripada kod dan panggilan yang code-- sembah
code-- bahawa dengan beberapa deskriptif menamakan seperti PrintName,
C tidak mampu kita keupayaan ini.
>> Berikut adalah satu lagi contoh yang mudah.
Sebagai contoh, jika saya membuka memfailkan dari hari ini menggesa return.c,
perhatikan apa yang saya lakukan di sini.
Kebanyakan ini adalah fungsi utama printf.
Saya pertama sewenang-wenangnya memulakan satu pembolehubah x dipanggil dengan bilangan 2.
Saya kemudian mencetak "x kini % I "lulus dalam nilai x.
Jadi, saya hanya mengatakan apa yang ada.
>> Sekarang saya hanya berani mendakwa dengan printf.
Saya cubing bahawa nilai x, dan saya berbuat demikian dengan memanggil fungsi yang
dipanggil kiub berlalu dalam x sebagai hujah,
dan kemudian menyelamatkan output dalam pembolehubah itu sendiri, x.
Jadi saya clobbering nilai x.
Saya yang mengatasi nilai x dengan apa sahaja
hasil daripada memanggil fungsi kiub ini.
Dan kemudian saya hanya mencetak beberapa barangan kembang di sini mengatakan apa yang saya lakukan.
>> Jadi apa yang kemudian adalah kiub?
Perhatikan apa yang pada asasnya yang berbeza di sini.
Saya telah diberi fungsi yang nama seperti dahulu.
Saya telah dinyatakan nama untuk pertengkaran.
Kali ini ia dipanggil n bukannya nama, tetapi saya boleh memanggilnya apa-apa yang saya mahu.
Tetapi ini adalah berbeza.
Ini perkara yang di sebelah kiri.
Sebelum ini apa kata kunci?
Kanak-kanak lelaki.
Sekarang jelas int.
>> Jadi apa yang mungkin mengambil?
Manakala menandakan sah semacam ketiadaan, dan itu adalah kes itu.
PrintName kembali apa-apa.
Ia melakukan sesuatu, tetapi ia tidak menyerahkan saya kembali
sesuatu yang saya boleh memakai sebelah kiri tanda sama
seperti saya lakukan di sini pada baris 22.
>> Jadi, jika saya katakan pada baris ke 30, apa yang mungkin membayangkan
tentang apa kiub tidak untuk saya?
Yeah?
Ia mengembalikan integer.
Jadi tangan saya kembali, untuk contoh, sehelai kertas
di mana ia telah menulis jawapannya.
2 cubed, atau 3 cubed, atau 4 cubed-- apa yang saya diluluskan,
dan bagaimana saya melaksanakan ini?
Nah, hanya kali n n n kali ialah bagaimana saya mungkin Cube nilai.
Jadi sekali lagi, super mudah idea, tetapi demonstratif
sekarang bagaimana kita boleh menulis fungsi yang benar-benar mempunyai kita kembali
nilai-nilai yang mungkin menarik minat.
>> Mari kita lihat satu contoh lepas di sini dipanggil fungsi satu.
Dalam contoh ini, ia bermula untuk mendapatkan lebih menarik.
Jadi, dalam fungsi, ini notis program-- akhirnya
memanggil fungsi yang dipanggil GetPositiveInt.
GetPositiveInt bukan fungsi di perpustakaan CS50 ini,
tetapi kami mengambil keputusan kita mahu ia wujud.
>> Jadi, jika kita tatal ke bawah kemudian dalam fail, notis bagaimana saya pergi tentang melaksanakan
mendapatkan int positif, dan saya mengatakan ia lebih menarik
kerana ini adalah yang baik beberapa baris kod.
Ia bukan hanya yang bodoh program mainan sedikit.
Ia benar-benar mendapat beberapa semakan ralat dan melakukan sesuatu yang lebih berguna.
>> Jadi jika anda telah tidak dilihat Walkthrough video yang kami telah tertanam dalam pset1,
tahu bahawa ini adalah satu jenis gelung dalam bahasa C, yang sama dalam semangat
kepada jenis perkara Scratch boleh lakukan.
Dan melakukan mengatakan melakukan ini.
Cetak halaman ini keluar.
Kemudian pergi ke hadapan dan mendapatkan n-- mendapatkan int dan menyimpannya dalam n,
dan terus melakukan ini sekali lagi dan lagi dan lagi selagi n adalah kurang daripada satu.
>> Jadi n akan menjadi kurang daripada satu hanya jika manusia bukan bekerjasama.
Jika dia sedang menaip dalam 0 atau -1 atau -50,
gelung ini akan menyimpan melaksanakan lagi dan lagi.
Dan akhirnya notis, saya hanya mengembalikan nilai.
Jadi sekarang kita mempunyai fungsi yang akan sudah baik
jika CS50 akan melaksanakan di CS50.h dan CS50.c untuk anda,
tetapi di sini kita kini boleh melaksanakan ini diri kita sendiri.
>> Tetapi dua komen mengenai beberapa perkara penting.
One-- mengapa saya mengisytiharkan int n, adakah anda berfikir, pada baris 29
bukan hanya melakukan ini di sini, yang merupakan
lebih konsisten dengan apa yang kami lakukan pada minggu lepas?
Yeah?
Sungguh baik.
Jadi jika kita meletakkan ia di sini, ia seolah-olah kita
menyimpan mengisytiharkan sekali lagi dan sekali lagi.
Bahawa dalam dan dengan sendirinya adalah tidak bermasalah, per se,
kerana kita hanya perlu nilai sekali dan kemudian
kita akan mendapatkan yang baru pula.
Tetapi pemikiran yang baik.
Yeah?
>> Tutup.
Jadi kerana saya telah diisytiharkan n pada talian 29 di luar gelung,
ia boleh diakses di seluruh ini fungsi keseluruhan.
Tidak fungsi-fungsi lain kerana n masih di dalam kerinting ini
pendakap sini.
So-- pasti.
>> Tepat sekali.
Jadi ini adalah lebih tepat.
Jika kita bukan diisytiharkan n di sini pada baris 32,
ia bermasalah kerana meneka di mana lagi saya perlu mengaksesnya?
Popular 34, dan peraturan mudah ibu jari adalah
bahawa anda hanya boleh menggunakan pembolehubah bahagian dalam pendakap kerinting yang paling baru-baru ini
di mana anda diisytiharkan itu.
>> Malangnya, talian 34 adalah satu baris terlambat,
kerana saya telah ditutup pendakap kerinting pada baris 33
yang sepadan dengan pendakap kerinting pada baris 30.
Dan ini adalah satu cara untuk mengatakan bahawa pembolehubah int ini scoped,
boleh dikatakan, hanya dalam dari orang-orang pendakap kerinting.
Ia hanya tidak wujud di luar daripada mereka.
>> Jadi sesungguhnya, jika saya melakukan ini salah, biarlah saya menyelamatkan kod
kerana ia salah is-- bertulis.
Biar saya pergi ke hadapan dan jangan membuat fungsi-1, dan kesilapan notice--.
Penggunaan yang tidak diisytiharkan pengecam n pada baris 35, yang di sini.
Dan jika kita tatal ke atas lagi, satu sama lain.
Penggunaan yang tidak diisytiharkan pengecam n pada baris 34.
>> Jadi pengkompil, berdentang-dentang, yang perasan bahawa ia hanya
tidak wujud walaupun jelas ianya ada secara visual.
Jadi menetapkan mudah adalah mengisytiharkan ia di sana.
>> Sekarang mari saya tatal ke bahagian atas fail.
Apa yang melompat keluar pada anda sebagai yang sedikit berbeza
daripada barangan yang kita melihat pada minggu lepas?
Bukan sahaja saya mempunyai nama, bukan sahaja Saya mempunyai beberapa tajam termasuk sehingga atas,
Saya mempunyai sesuatu yang saya memanggil prototaip.
Sekarang yang kelihatan secara mengerikan serupa dengan apa yang kita hanya melihat masa lalu pada baris 27.
>> Jadi mari kita membuat kesimpulan yang berbeza dari mesej ralat mengapa saya lakukan ini.
Biar saya pergi ke hadapan dan memadam ayat-ayat ini di sana.
Dan supaya kita tahu apa-apa tentang prototaip.
Membentuk semula fail ini.
Buat satu fungsi.
Dan sekarang, celaka, empat kesilapan.
Mari kita tatal ke atas untuk yang pertama.
>> Pengakuan tersirat fungsi mendapatkan int positif adalah tidak sah di C99.
C99 hanya bermakna 1999 versi bahasa
C, yang adalah apa yang kita sememangnya menggunakan.
Jadi apa maknanya?
Nah C-- dan lebih khusus C compilers-- program cantik dalam keadaan sihat.
Mereka hanya tahu apa yang anda mempunyai memberitahu mereka, dan itu
sebenarnya tema dari minggu lepas.
>> Masalahnya ialah bahawa jika saya pergi mengenai melaksanakan nama di sini,
dan saya memanggil fungsi yang dipanggil GetPositiveInt sini pada baris 20,
fungsi yang secara teknikal tidak wujud sehingga pengkompil melihat baris 27.
Malangnya, pengkompil adalah melakukan perkara-perkara atas, ke bawah, kiri, kanan,
demikian kerana ia tidak melihat pelaksanaan GetPositiveInt,
tetapi ia melihat anda cuba menggunakannya di sini,
ia hanya akan bail-- menjerit pada anda dengan kesilapan message-- mungkin
samar, dan tidak benar-benar menyusun fail.
>> Jadi apa yang dipanggil prototaip sehingga di sini adalah diakui berlebihan.
Secara harfiah, saya turun di sini dan saya disalin dan ditampal ini, dan saya meletakkan ia di sini.
Tidak sah akan menjadi lebih betul, jadi kita akan harfiah salin dan tampal masa ini.
Saya benar-benar disalin dan ditampal itu.
Benar-benar seperti seperti serdak roti.
>> Satu penunjuk yang sedikit untuk pengkompil.
Saya tidak tahu apa ini tidak lagi, tetapi saya berjanji kepada anda
bahawa ia akan wujud akhirnya.
Dan itulah sebabnya ini line-- dalam talian 16-- berakhir dengan koma bernoktah.
Ia diperlukan oleh reka bentuk.
Ya?
>> Jika anda tidak menghubungkan perpustakaan anda untuk the-- oh, soalan yang baik.
Sharp termasuk Kemasukan fail header.
Perlu adalah-- sepatutnya hampir sentiasa di bahagian paling atas
fail untuk similar-- untuk betul-betul sebab yang sama, ya.
Kerana dalam standard io.h adalah benar-benar garis
seperti ini, tetapi dengan printf perkataan, dan dengan hujah-hujah dan Jenis pengembaliannya.
Dan dengan melakukan tajam termasuk sehingga di sini, apa yang anda benar-benar melakukan
adalah menyalin dan menampal kandungan orang lain telah menulis sehingga atas.
Dengan itu cluing kod anda dalam ke Hakikat bahawa fungsi-fungsi itu memang wujud.
Yeah?
>> Sama sekali.
Jadi yang sangat pandai dan betul penyelesaian akan menjadi, anda tahu apa?
Saya tidak tahu apa yang prototaip adalah, tetapi saya tahu
jika saya faham bahawa C adalah hanya bisu dan menafsir atas ke bawah.
Nah mari kita memberikan apa yang ia mahu.
Mari kita memotong kod itu, tampal sehingga atas, dan kini menolak utama ke bawah di bawah.
Ini juga akan menyelesaikan masalah.
>> Tetapi anda dengan mudah boleh datang dengan satu senario di mana A perlu memanggil B,
dan mungkin B menyeru kembali kepada A. Ini adalah sesuatu yang dinamakan rekursi,
dan kami akan kembali kepada itu.
Dan ia mungkin atau mungkin tidak yang baik perkara, tetapi anda boleh pasti
memecahkan penyelesaian ini.
>> Dan lebih-lebih lagi, saya akan mendakwa stylistically,
terutamanya apabila program anda menjadi yang panjang dan ini panjang,
ia hanya super mudah untuk meletakkan utama di bahagian atas
kerana ia adalah perkara yang paling pengaturcara akan mengambil berat tentang.
Dan ia adalah lebih bersih sedikit, boleh dikatakan, untuk melakukannya dengan cara yang
Saya asalnya melakukannya dengan prototaip walaupun
walaupun ia kelihatan sedikit berlebihan pada pandangan pertama.
Yeah?
Maaf, anda boleh mengatakan ia lebih kuat?
>> Jika anda menukar lokasi daripada pelaksanaan dan prototaip?
Jadi itu adalah satu soalan yang baik.
Mengisytiharkan semula jika anda ini ke bawah di sini, mari kita lihat apa yang berlaku.
Jadi, jika saya meletakkan ini di sini, anda berkata.
Oh, maaf.
Lebih kuat?
Lebih kuat.
Oh, soalan yang baik.
Ia akan membatalkan majlis itu?
Anda tahu, selepas semua tahun-tahun ini, saya tidak pernah meletakkan prototaip selepas itu.
Jadi mari kita buat membuat fungsi-1 selepas melakukan itu.
>> [Rungut]
DAVID J. MALAN: Oh, tunggu.
Kita masih perlu meletakkan segala-galanya atas.
Jadi mari kita buat ini di sini, jika saya memahami soalan anda dengan betul.
Saya meletakkan segala-galanya, termasuk prototaip di atas utama,
tetapi saya meletakkan prototaip di bawah pelaksanaan.
>> Jadi jika saya membuat satu, saya mendapat kembali satu error-- yang tidak digunakan boleh ubah n.
Oh, di sana.
Terima kasih.
Mari kita lihat, kita menyingkirkan ini.
Itu bug yang berbeza, jadi mari kita mengabaikan itu.
Mari kita benar-benar cepat membentuk semula ini.
>> OK, jadi tidak hujah data yang digunakan oleh format String
n-- oh, itu kerana Saya ditukar kepada ini di sini.
Baiklah, kita tahu apa jawapannya akan supaya- semua betul, di sini kita pergi.
Ah, terima kasih kerana positif.
Baiklah, saya akan menetapkan kod ini after-- mengabaikan pepijat ini khususnya
kerana ini was-- ia berfungsi adalah jawapannya.
>> Oleh itu, ia tidak akan tulis semula apa yang anda baru sahaja selesai.
Saya mengesyaki pengkompil ditulis dalam apa-apa cara
bahawa ia mengabaikan prototaip anda kerana badan, boleh dikatakan,
fungsi yang telah pun dilaksanakan sehingga lebih tinggi.
Saya akan mempunyai untuk benar-benar berunding secara manual pengkompil
untuk memahami jika ada yang lain implikasi, tetapi pada pandangan pertama
hanya dengan mencuba dan bereksperimen, terdapat seolah-olah tidak memberi kesan.
Soalan yang baik.
>> Jadi mari kita melangkah ke hadapan sekarang, bergerak dari kesan sampingan yang
adalah fungsi yang melakukan sesuatu seperti visual pada skrin dengan printf,
tetapi tidak mengembalikan nilai.
Dan fungsi yang mempunyai pulangan nilai seperti kita hanya melihat beberapa.
Kita sudah melihat idea ini skop, dan kita akan melihat ini lagi dan lagi.
Tetapi buat masa ini, sekali lagi, menggunakan peraturan ibu jari
bahawa pemboleh ubah yang hanya boleh digunakan dalam satu yang paling baru-baru ini dibuka
dan pendakap kerinting tertutup seperti yang kita melihat dalam contoh tersebut.
>> Dan seperti yang anda berkata, terdapat satu ability--
anda boleh menyelesaikan beberapa masalah-masalah ini dengan meletakkan pembolehubah global
di bahagian paling atas fail.
Tetapi dalam hampir semua kes kita akan berkerut apabila itu,
dan sememangnya tidak pergi ke dalam bahawa penyelesaian buat masa sekarang.
Jadi buat masa ini, bisa dibesarkan ialah pembolehubah mempunyai tanggapan ini skop.
>> Tetapi sekarang mari kita lihat satu lagi cara kering sebenarnya mencari
di beberapa cukup menarik butir-butir pelaksanaan.
Bagaimana kita boleh mewakili maklumat.
Dan kita sudah melihat ini pada minggu pertama kelas.
Melihat binari, dan mengingatkan diri kita tentang perpuluhan.
>> Tetapi ingat dari minggu lepas bahawa C mempunyai jenis data yang berlainan dan tandan lanjut,
tetapi yang paling berguna sekarang mungkin ini.
A char, atau watak, yang berlaku menjadi satu bait, atau lapan bit total.
Dan itu untuk mengatakan bahawa saiz arang yang hanya salah satu bait.
Bait adalah lapan bit, jadi ini bermakna bahawa kita boleh mewakili berapa banyak aksara.
Berapa banyak huruf atau simbol pada papan kekunci
jika kita mempunyai satu bait atau lapan bit.
Fikirkan kembali ke minggu sifar.
Jika anda mempunyai lapan bit, berapa jumlah nilai
anda boleh mewakili dengan corak sifar dan orang-orang?
One-- lebih daripada itu.
Jadi jumlah 256 jika anda mula mengira dari sifar.
Jadi jika anda mempunyai lapan bits-- jadi jika kita mempunyai mentol binari kami di sini sekali lagi,
kita boleh menyahaktifkan mentol lampu pada dan di luar di mana-mana 256 corak unik.
>> Sekarang ini agak bermasalah.
Tidak begitu banyak untuk Bahasa Inggeris dan bahasa cinta, tetapi sudah tentu
apabila anda memperkenalkan, untuk Contohnya, bahasa Asia, yang
mempunyai lebih daripada simbol seperti 26 huruf abjad.
Kami benar-benar mungkin perlu lebih daripada satu bait.
Dan bersyukur kerana di tahun baru-baru ini mempunyai masyarakat
pakai piawaian lain yang menggunakan lebih daripada satu bait setiap pertuduhan.
>> Tetapi untuk sekarang di C, lalai hanya satu bait atau lapan bit.
Integer, sementara itu, adalah empat bait, atau dikenali sebagai 32 bit.
Ertinya apa yang terbesar mungkin bilangan kita boleh mewakili dengan int satu
nampaknya?
Dengan bilion.
Jadi ia empat bilion memberi atau mengambil.
2 kepada kuasa 32th, jika kita tidak menanggung sebarang nombor negatif
dan hanya menggunakan semua positif nombor, ia empat bilion
memberikan atau mengambil kemungkinan.
Float A, sementara itu, adalah jenis yang berbeza jenis data dalam C. Ia masih nombor,
tetapi ia adalah nombor nyata.
Sesuatu dengan titik perpuluhan.
Dan ternyata bahawa C juga menggunakan empat bait
untuk mewakili nilai-nilai titik terapung.
>> Malangnya berapa terapung mata yang ada di dunia?
Berapa banyak nombor nyata yang ada?
Ada yang tidak terhad nombor, dan dalam hal ini
ada nombor tak terhingga integer.
Oleh itu, kita sudah jenis menggali lubang diri kita di sini.
Mana nampaknya dalam computers-- di kurangnya program yang ditulis dalam C pada them--
hanya boleh mengira setinggi empat bilion memberi atau mengambil,
dan terapung mata yang hanya boleh nampaknya
mempunyai beberapa jumlah yang terbatas ketepatan.
Hanya begitu banyak digit selepas titik perpuluhan mereka.
>> Kerana, sudah tentu, jika anda hanya mempunyai 32 bit,
Saya tidak tahu bagaimana kita akan pergi tentang mewakili numbers-- sebenar mungkin
dengan pelbagai jenis corak.
Tetapi ada pasti terbatas beberapa corak itu,
jadi di sini, juga, ini adalah bermasalah.
>> Sekarang kita boleh mengelakkan masalah yang sama.
Jika anda tidak menggunakan apungan, anda boleh menggunakan dua
dalam C, yang memberikan anda lapan bait, yang adalah cara yang lebih corak mungkin sifar
dan orang-orang.
Tetapi ia masih terbatas, yang akan menjadi bermasalah jika anda menulis perisian
untuk grafik atau untuk mewah formula matematik.
Jadi, anda sebenarnya mungkin mahu untuk mengira sehingga lebih besar daripada itu.
A panjang long-- bodoh named-- juga lapan bait, atau 64 bit,
dan ini adalah dua kali lebih lama sebagai int satu, dan ia untuk nilai integer yang lama.
>> Fact-- Fun jika int adalah empat bait, berapa lama lama dalam C biasanya?
Juga empat bait, tetapi lama lama lapan bait,
dan ini adalah atas sebab-sebab sejarah.
>> Tetapi Takeaway sekarang hanya data yang mempunyai
untuk diwakili dalam computer-- itu peranti fizikal dengan elektrik,
ia biasanya memandu orang-orang dan sifar ones--
dengan jumlah yang terbatas ketepatan.
Jadi apa masalah itu?
>> Juga ada masalah limpahan integer.
Bukan sahaja pada C, tetapi dalam komputer secara umum.
Sebagai contoh, jika ini ialah satu bait bernilai bit--
jadi jika ini adalah lapan bit-- semua di antaranya adalah nombor satu.
Apakah nombor ini adalah mewakili kita menganggap
itu semua nilai-nilai positif dalam binari?
>> 255, dan ia bukan 256, kerana sifar adalah nombor yang paling rendah.
Jadi 255 adalah yang tertinggi satu, tetapi masalahnya
adalah menganggap bahawa saya mahu menokokkan pembolehubah ini yang
menggunakan lapan bit jumlah jika saya mahu untuk kenaikan itu.
>> Dan saya pilih yang satu untuk semua orang-orang ini,
anda mungkin boleh bayangkan visually-- hanya seperti menjalankan satu menggunakan decimals--
sesuatu yang akan mengalir ke kiri.
Dan sesungguhnya, jika saya menambah bilangan satu ini, apa yang berlaku dalam binari
ialah ia melimpah kembali ke sifar.
>> Jadi jika anda hanya tidak use-- int satu, tetapi bait tunggal untuk mengira bilangan bulat
dalam program, dengan default-- secepat anda mendapat 250, 251, 252, 253, 254,
255-- 0 datang selepas 255, yang mungkin tidak apa yang
pengguna akan mengharapkan.
>> Sekarang pula di dunia terapung titik, anda juga mempunyai masalah yang sama.
Tidak begitu banyak dengan number-- terbesar walaupun itu masih isu.
Tetapi dengan jumlah ketepatan bahawa anda boleh mewakili.
Jadi mari kita lihat pada contoh ini di sini juga dari code-- sumber hari ini
terapung-0.c.
>> Dan notis itu super yang program mudah yang
nampaknya perlu mencetak apa nilai keluar?
Apa yang anda taruhan ini akan mencetak walaupun ada sedikit sintaks baru
di sini?
Jadi mudah-mudahan 0.1.
Jadi sama dengan satu per sepuluh kerana saya melakukan 1 dibahagikan dengan 10.
Saya menyimpan jawapan dalam pembolehubah yang dipanggil f.
Pembolehubah yang jenis apungan, yang adalah kata kunci yang saya dicadangkan wujud.
>> Kami telah tidak dilihat sebelum ini, tetapi ini adalah jenis cara yang kemas dalam printf
untuk menentukan berapa angka anda mahu melihat selepas titik perpuluhan.
Jadi notasi ini hanya bermakna bahawa di sini adalah pemegang tempat yang.
Ia untuk titik terapung nilai, dan oh, dengan cara itu,
menunjukkan dengan titik perpuluhan dengan satu nombor selepas titik perpuluhan.
Jadi, bilangan daripada digit bererti,
boleh dikatakan, yang anda mungkin mahu.
>> Jadi biarlah saya pergi ke hadapan dan melakukan membuat apungan-0, ./float-0,
dan nampaknya 1 dibahagikan dengan 10 adalah 0.0.
Sekarang mengapa ini?
>> Baik lagi, komputer sedang mengambil saya benar-benar, dan saya telah menulis 1
dan saya bertulis 10, dan mengambil meneka apa adalah jenis data yang diandaikan untuk kedua-dua
nilai-nilai?
Satu int, ia secara teknikal sesuatu yang sedikit berbeza.
Ia biasanya yang panjang, tetapi ia akhirnya nilai penting.
Bukan nilai titik terapung.
>> Yang mengatakan bahawa jika ini adalah int dan ini adalah satu int,
masalahnya ialah bahawa komputer tidak mempunyai keupayaan
malah menyimpan bahawa titik perpuluhan.
Oleh itu, apabila anda melakukan 1 dibahagikan sebanyak 10 menggunakan integer
untuk kedua-dua pengangka dan penyebut, jawapannya harus 0.1.
Tetapi computer-- kerana mereka adalah integers--
tidak tahu apa yang perlu dilakukan dengan 0.1.
>> Jadi apa yang jelas lakukan?
Ia hanya membuang ia jauh, dan apa yang saya lihat akhirnya
adalah 0.0 hanya kerana saya menegaskan bahawa printf menunjukkan saya satu titik perpuluhan.
Tetapi masalahnya ialah bahawa jika anda membahagi integer dengan integer,
anda akan get-- mengikut definisi daripada C-- integer.
Dan ia tidak akan melakukan sesuatu yang baik dan mudah
seperti pusingan ia sehingga terdekat satu atas atau bawah.
Ia akan memotong segala-galanya selepas perpuluhan.
>> Jadi, secara intuitif, apa yang mungkin menetapkan satu?
Apa yang menetapkan yang paling mudah di sini?
Yeah?
Tepat sekali.
Mengapa kita tidak merawat ini sebagai mata yang terapung berkesan
menjadikan mereka terapung atau beregu.
Dan kini jika saya membuat terapung-0, atau jika saya menyusun terapung-1,
yang serupa dengan apa yang hanya dicadangkan.
Dan kini saya lakukan terapung-0, kini saya mendapat 0.1 saya.
>> Sekarang ini luar biasa.
Tetapi sekarang saya akan lakukan sesuatu yang sedikit berbeza.
Saya ingin tahu untuk melihat apa yang benar-benar berlaku di bawah hud,
dan saya akan cetak ini kepada 28 tempat perpuluhan.
Saya benar-benar mahu melihat 0.1000-- infinite-- satu
[Didengar] 27 angka sifar yang 0.1.
>> Nah mari kita lihat jika itu sesungguhnya apa yang saya dapat.
Buat terapung-0 fail sama.
./floats-0.
Mari kita mengezum masuk pada jawapan dramatik.
Semua masa ini, anda telah berfikir 1 dibahagikan dengan 10 adalah 10%, atau 0.1.
Ia bukan.
Sekurang-kurangnya setakat yang komputer berkenaan.
>> Sekarang why-- OK, itu lengkap dusta 1 dibahagikan dengan 10 adalah 0.1.
Tetapi why-- yang tidak Takeaway hari ini.
Jadi mengapa komputer berfikir, tidak seperti kita semua di dalam bilik,
bahawa 1 dibahagikan dengan 10 adalah sebenarnya bahawa nilai gila?
Apa yang komputer melakukan nampaknya?
Apa itu?
>> Ia tidak melimpah, per se.
Limpahan biasanya apabila anda membalut di sekitar nilai.
Ia isu ini ketakpersisan dalam nilai mata terapung
di mana anda hanya mempunyai 32 atau mungkin juga 64 bit.
Tetapi jika ada yang tidak terhad beberapa numbers-- sebenar
nombor dengan titik perpuluhan dan nombor thereafter-- pasti
anda tidak boleh mewakili mereka semua.
Jadi komputer telah memberikan Perlawanan kami yang paling dekat
kepada nilai yang boleh mewakili yang menggunakan banyak bit dengan nilai yang saya benar-benar mahu,
iaitu 0.1.
>> Malangnya, jika anda mula melakukan matematik, atau anda
mula melibatkan jenis-jenis terapung mata yang di programs-- penting
perisian kewangan, apa-apa software-- tentera
di mana persepsi adalah mungkin cukup penting.
Dan anda mula menambah nombor seperti ini, dan permulaan
menjalankan perisian yang dengan input benar-benar besar
atau banyak masa atau banyak hari atau banyak tahun,
ini kesilapan kecil sedikit sudah tentu boleh menambah sehingga dari masa ke masa.
>> Sekarang sebagai diketepikan, jika anda telah pernah dilihat Superman 3 atau Ruang Pejabat
dan anda mungkin ingat bagaimana orang-orang lelaki mencuri
wang yang banyak dari komputer mereka dengan menggunakan mata yang terapung
dan menambah sehingga kecil peninggalan, mudah-mudahan filem yang
kini lebih masuk akal.
Ini adalah apa yang mereka merujuk kepada dalam filem itu.
Fakta bahawa kebanyakan syarikat tidak akan melihat
selepas beberapa tertentu tempat perpuluhan,
tetapi mereka adalah pecahan sen.
Jadi anda mula menambah mereka, anda mula membuat wang yang banyak
dalam akaun bank anda.
Jadi itulah Ruang Pejabat dijelaskan.
>> Sekarang malangnya di luar Ruang Pejabat, terdapat
adalah beberapa sah merisaukan dan kesan yang ketara
jenis-jenis keputusan reka bentuk asas,
dan sememangnya salah satu sebab kita menggunakan C dalam perjalanan
adalah supaya anda benar-benar mempunyai alasan ini sehingga memahami bagaimana komputer berfungsi,
bagaimana perisian kerja-kerja, dan tidak mengambil apa-apa untuk diberikan.
>> Dan sesungguhnya malangnya, walaupun dengan bahawa pemahaman asas,
kita manusia melakukan kesilapan.
Dan apa yang saya fikir saya akan berkongsi adalah video ini lapan minit di sini diambil
dari episod Marvels moden, yang persembahan pendidikan mengenai gerak kerja
yang cat dua gambar apabila satu penggunaan yang tidak betul
dan pemahaman mata yang terapung
membawa kepada beberapa penting keputusan malang.
Mari kita lihat.
[VIDEO MAIN SEMULA]
-Kami Kini kembali ke "Kejuruteraan Bencana "pada Marvels moden.
Komputer.
Kita semua telah datang untuk menerima masalah yang sering mengecewakan
mendapat dengan them-- pepijat, virus, dan glitches-- perisian untuk harga kecil
membayar untuk kemudahan tersebut.
Tetapi dalam teknologi tinggi dan kelajuan tinggi tentera dan program angkasa aplikasi,
masalah yang paling kecil boleh diperbesar-besarkan ke dalam bencana.
>> Pada 4 Jun 1996, ahli-ahli sains disediakan untuk melancarkan tanpa pemandu Ariane 5 roket.
Ia membawa saintifik satelit yang direka
untuk menubuhkan tepat bagaimana Berinteraksi medan magnet bumi
dengan angin suria.
Roket ini dibina untuk Agensi Angkasa Eropah,
dan diangkat dari kemudahannya di pantai French Guiana.
>> -At Kira-kira 37 saat ke dalam penerbangan, mereka pertama
perasan sesuatu yang telah pergi salah.
Bahawa muncung telah berputar dengan cara yang mereka benar-benar tidak sepatutnya.
Kira-kira 40 saat ke dalam penerbangan, jelas kenderaan itu ialah dalam kesusahan,
dan itulah apabila mereka membuat keputusan untuk memusnahkannya.
Pegawai keselamatan pelbagai, dengan keberanian yang luar biasa, ditekan butang
dan meletupkan roket sebelum ia boleh menjadi bahaya kepada keselamatan awam.
>> -Ini Adalah sulung pelayaran di Ariane 5,
dan kemusnahan mengambil meletakkan kerana kecacatan yang
tertanam dalam perisian roket ini.
-The masalah pada Ariane adalah bahawa terdapat
adalah nombor yang dikehendaki 64 bit untuk menyatakan,
dan mereka mahu untuk menukar kepada beberapa 16-bit.
Mereka mengandaikan bahawa jumlah tidak pernah akan menjadi sangat besar.
Bahawa kebanyakan mereka digit dalam nombor 64-bit adalah sifar.
Mereka salah.
>> -The ketidakupayaan satu program perisian untuk menerima
jenis nombor yang dijana oleh lain merupakan punca kegagalan.
Pembangunan perisian telah menjadi bahagian yang sangat mahal teknologi baru.
Ariane 4 roket mempunyai sangat berjaya.
Sekian banyak daripada perisian yang diwujudkan untuk ia juga digunakan dalam Ariane 5.
>> -The masalah asas ialah Ariane 5.
Telah faster-- dipercepatkan lebih cepat, dan perisian yang telah tidak diambil kira itu.
>> -The kemusnahan roket merupakan satu malapetaka kewangan yang besar.
Semua kerana kesilapan perisian minit.
Tetapi ini bukan yang pertama masa masalah penukaran data
telah dibelenggu teknologi roket moden.
>> -Dalam 1991 dengan permulaan Perang Teluk pertama,
peluru berpandu Patriot yang mengalami jenis yang sama
daripada masalah jumlah penukaran.
Dan hasilnya 28 people-- 28 Soldiers-- Amerika terbunuh,
dan kira-kira seratus orang lain cedera.
Apabila Patriot, yang sepatutnya untuk melindungi daripada Scuds masuk,
gagal untuk menembak peluru berpandu.
>> -Apabila Iraq menyerang Kuwait, dan Amerika dilancarkan Desert Storm pada awal tahun 1991,
Bateri peluru berpandu Patriot telah dikerahkan untuk melindungi Arab Saudi dan Israel
daripada serangan peluru berpandu Scud Iraq.
Patriot adalah US jarak sederhana permukaan-ke-udara sistem
dihasilkan oleh syarikat Raytheon itu.
>> Saiz-The daripada Patriot pemintas itself--
ia kira-kira kira-kira 20 kaki panjang, dan ia mempunyai berat kira-kira 2,000 paun.
Dan ia membawa kepala peledak kira-kira, Saya fikir ia adalah kira-kira £ 150.
Dan kepala peledak itu sendiri letupan yang tinggi, yang
mempunyai serpihan di sekelilingnya.
Oleh itu, sarung kepala peledak adalah direka untuk bertindak seperti peluru a.
>> -The peluru berpandu dijalankan empat per kontena,
dan diangkut oleh semi trailer.
>> -The Patriot sistem anti-peluru berpandu kembali sekurang-kurangnya 20 tahun.
Ia pada asalnya direka sebagai pertahanan peluru berpandu udara
menembak jatuh kapal terbang musuh.
Dalam Perang Teluk pertama apabila perang itu datang,
Tentera Darat mahu menggunakannya untuk menembak jatuh Scuds, bukan kapal terbang.
Tentera Udara Iraq tidak begitu banyak masalah,
tetapi Tentera bimbang mengenai Scuds.
Dan kerana itu mereka cuba meningkatkan Patriot.
>> -Intercepting Musuh peluru berpandu bergerak pada kelajuan Mach 5
telah akan mencabar cukup.
Tetapi apabila Patriot dikejarkan ke dalam perkhidmatan,
Tentera tidak sedar pengubahsuaian Iraq yang
dibuat scuds mereka hampir mustahil untuk ia.
>> -Apa Berlaku adalah Scuds yang telah datang adalah tidak stabil.
Mereka goyah.
Sebab untuk ini adalah Iraqis-- untuk mendapatkan 600 kilometer di luar
daripada 300 kilometer pelbagai missile-- mengambil berat daripada kepala peledak depan,
dan membuat kepala peledak yang lebih ringan.
Jadi sekarang ini Patriot cuba untuk datang di Scud, dan kebanyakan time-- yang
majoriti daripada time-- ia hanya akan terbang oleh Scud.
>> -Sebaik Sahaja pengendali sistem Patriot menyedari Patriot terlepas sasaran,
mereka meletupkan kepala peledak Patriot untuk mengelakkan kecederaan mungkin jika ia
telah dibiarkan jatuh ke tanah.
>> -Itu Adalah apa yang kebanyakan orang melihat seperti bola api yang besar di langit,
dan salah faham sebagai memintas dari peluru Scud.
>> -Although Di langit malam, Patriots muncul yang akan berjaya memusnahkan
Scuds, di Dhahran mungkin ada kesilapan tidak mengenainya prestasinya.
Terdapat sistem radar Patriot trek kehilangan satu Scud masuk
dan tidak pernah dilancarkan berikutan kepada kecacatan perisian.
>> Ia adalah Israel yang pertama kali ditemui yang lagi sistem itu pada,
yang lebih besar perbezaan masa yang menjadi.
Oleh kerana jam tertanam dalam komputer sistem.
>> -Pengenalan Dua minggu sebelum tragedi di Dhahran,
Israel dilaporkan kepada Jabatan Pertahanan
bahawa sistem telah kehilangan masa.
Selepas kira-kira lapan jam berjalan, mereka melihat
bahawa sistem ini menjadi nyata kurang tepat.
Jabatan Pertahanan bertindak balas dengan memberitahu semua bateri Patriot
untuk tidak meninggalkan sistem untuk masa yang panjang.
Mereka tidak pernah mengatakan apa yang lama itu.
8 jam, 10 jam, seribu jam.
Tiada siapa yang tahu.
>> -The Patriot bateri ditempatkan di berek
di Dhahran dan dalaman cacat yang jam telah selama lebih 100 jam
pada malam 25 Februari.
>> -Ia Dikesan masa untuk ketepatan kira-kira satu per sepuluh daripada satu saat.
Sekarang satu persepuluh saat adalah nombor menarik
kerana ia tidak boleh dinyatakan dalam binari betul-betul, yang
ertinya ia tidak boleh menyatakan dengan tepat di mana-mana komputer digital moden.
Sukar untuk percaya, tetapi menggunakan ini sebagai contoh.
>> Mari kita nombor satu ketiga.
Satu pertiga tidak boleh dinyatakan dalam perpuluhan dengan tepat.
Satu pertiga adalah 0.333 berlangsung selama infiniti.
Tidak ada cara untuk melakukan itu dengan ketepatan mutlak dalam nombor perpuluhan.
Itulah jenis masalah yang berlaku di Patriot.
Semakin lama sistem ini berjalan, yang lebih teruk ralat masa yang menjadi.
>> -After 100 jam operasi, kesilapan dalam masa hanya kira-kira satu pertiga
saat.
Tetapi dari segi mensasarkan peluru berpandu bergerak pada kelajuan Mach 5,
ia menyebabkan pengesanan yang kesilapan lebih 600 meter.
Ia akan menjadi satu kesilapan yang teramat untuk tentera di Dhahran.
>> -Apa Berlaku adalah pelancaran Scud adalah dikesan oleh satelit amaran awal,
dan mereka tahu yang Scud datang arah umum mereka.
Mereka tidak tahu di mana ia datang.
Ia kini sehingga radar komponen sistem Patriot yang
mempertahankan Dhahran untuk mencari dan menyimpan mengesan peluru berpandu musuh yang masuk.
>> -The radar sangat pintar.
Ia sebenarnya akan mengesan kedudukan Scud
dan kemudian meramalkan di mana ia mungkin akan menjadi
masa yang seterusnya radar denyutan dihantar keluar.
Yang dipanggil pintu julat.
>> -Kemudian Sekali Patriot memutuskan masa yang cukup mempunyai
diluluskan untuk kembali dan memeriksa seterusnya lokasi untuk objek ini dikesan
ia kembali.
Oleh itu, apabila ia kembali kepada salah tempat, kemudian ia tidak melihat objek.
Dan ia memutuskan bahawa tidak ada objek.
Bahawa terdapat pengesanan palsu dan harga turun trek.
>> -The masuk Scud hilang dari skrin radar,
dan saat kemudian, ia menyelar ke dalam berek.
Scud yang dibunuh 28.
Ia yang terakhir dipecat semasa Perang Teluk pertama.
Malang sekali, perisian terkini tiba pada waktu subuh pada hari berikut.
Kesilapan perisian mempunyai menjadi tetap, tutup
satu bab dalam bermasalah sejarah peluru berpandu Patriot itu.
>> [VIDEO AKHIR MAIN SEMULA]
>> DAVID J. MALAN: Itu sahaja untuk CS50.
Kami akan melihat anda pada hari Rabu.
>> [MUZIK bermain]