[MUSIC PLAYING] DAVID J Malan: Baiklah, selamat datang kembali ke CS50. Ini adalah awal dari dua minggu. Sebuah kata dari salah satu kami teman-teman di kampus - jika Anda tertarik, mungkin, baik sekarang atau dalam beberapa jangka waktu Bahkan, sekali lagi nyaman, pengajaran siswa sekolah menengah sedikit sesuatu tentang ilmu komputer, lakukan kepala ke URL tersebut. Mereka yang membutuhkan khususnya sekarang dari guru, terutama jika Anda memiliki memiliki beberapa paparan ilmu komputer. Jadi ingat bahwa terakhir kali, kami memperkenalkan tipe data beberapa di C, dan Anda mungkin sudah mulai untuk mendapatkan Anda tangan kotor dengan ini sejauh ini dalam masalah menetapkan satu. Dan kami memiliki char. Jadi dalam hal agak teknis, apa adalah char seperti yang Anda kenal sekarang? Jadi karakter, tapi mari kita lebih tepat sekarang. Apa yang kita maksud dengan karakter atau individu arang? Sebuah karakter non-numerik - jadi belum tentu. Ternyata nomor bahkan, bahkan tanda baca dan huruf direpresentasikan dengan data ini ketik dikenal sebagai char. Jadi belum tentu abjad. Ya? Jadi karakter ASCII. Jadi jika Anda berpikir kembali ke minggu nol, ketika kami memiliki byte relawan kami datang dan baik memegang tangan mereka atau tidak semua, mereka mewakili bit. Tapi kolektif sebagai kelompok delapan, mereka mewakili byte. Dan kami memperkenalkan konsep ASCII pada ceramah itu, yang hanya merupakan pemetaan antara angka dan huruf. Dan menggunakan ASCII, seperti yang manusia tersirat, delapan bit untuk mewakili karakter. Jadi oleh karena itu, jika delapan bit dapat masing mengambil salah satu dari dua nilai - nol atau satu - itu berarti ada dua kemungkinan untuk orang ini - nol atau satu - dua untuk orang ini, dua untuk ini orang, dua untuk yang satu ini. Jadi total dua kali dua kali dua kali dua kali dua - sehingga dua yang kedelapan secara total. Jadi ada jumlah karakter 256 mungkin bahwa Anda dapat mewakili dengan delapan bit. Sekarang, Anda yang berbicara Asia bahasa mungkin tahu bahwa ada lebih karakter di dunia dari sekedar As dan B dan C dan Ds. Dan memang, ASCII tidak cukup untuk banyak bahasa dunia. Tapi lebih pada waktu yang lain. Untuk saat ini, tahu bahwa di C jika Anda ingin untuk mewakili surat, sepotong tanda baca, atau hanya sesuatu karakter di alam, kita menggunakan char. Dan itu salah satu byte atau delapan bit. Bagaimana dengan int? Nah, int adalah integer. Berapa banyak bit, jika Anda ingat, adalah integer biasanya? Ingat siapapun? Jadi biasanya 32. Ini sebenarnya tergantung pada komputer yang Anda gunakan. Tapi dalam alat, dan dalam banyak komputer, itu 32 bit atau empat byte - delapan kali empat. Dan ints hanya digunakan untuk menyimpan angka, baik negatif, positif, atau nol. Dan jika Anda punya 32 bit dan Anda hanya peduli bilangan positif, bisa siapa pun kasarnya berapa banyak mungkin integer komputer dapat mewakili dari nol ke atas? Jadi akan ada dua untuk 32, yang kira-kira empat miliar. Jadi ini kekuasaan dua akan menjadi Tema berulang dalam ilmu komputer. Seperti yang akan kita lihat, mereka cukup nyaman untuk bekerja dengan bahkan jika itu tidak cukup mudah untuk melakukan matematika di kepala seseorang. Jadi kita akan mengatakan sekitar empat miliar. Sekarang, sebuah lama - Anda dapat jenis menebak. Ini lebih lama dari int. Berapa banyak bit? Jadi 64 bit atau delapan byte. Ini hanya berarti Anda dapat mewakili bahkan angka yang lebih besar, lebih besar atau positif besar angka negatif. Dan bagaimana mengapung? Itu floating point nilai 32 bit. Ini hanyalah sebuah bilangan real, sesuatu dengan titik desimal. Tapi jika Anda malah perlu lebih banyak tempat setelah titik desimal atau Anda ingin mewakili sejumlah besar dengan beberapa fraksi setelah, Anda dapat menggunakan ganda, yang adalah 64 bit. Tapi ada yang menarik takeaway di sini. Jadi jika ints dibatasi oleh 32 bit dan bahkan rindu panjang dibatasi oleh 64 bit, semacam itu dari menimbulkan pertanyaan, bagaimana jika Anda benar-benar ingin menghitung lebih tinggi dari 4 miliar untuk int? Nah, Anda hanya menggunakan yang lama. Tetapi bagaimana jika Anda ingin menghitung lebih tinggi dari dua sampai ke-64, memberi atau mengambil? Sekarang, itu sejumlah besar. Tapi akhirnya, Anda mungkin benar-benar peduli dengan jenis nilai, terutama jika Anda menggunakan database dan mulai mengumpulkan banyak dan banyak dan banyak data dan menetapkan unik angka untuk setiap potongan data. Jadi kita semacam memiliki masalah. Dan juga, dengan floating point nilai - mengapung atau ganda - jika Anda hanya punya jumlah terbatas bit, berapa banyak jumlah total bisa Anda mungkin mewakili? Nah, itu kurang jelas ketika Anda melibatkan titik desimal. Tapi itu pasti terbatas. Jika Anda memiliki jumlah terbatas bit, jumlah terbatas manusia, yang terbatas jumlah bola lampu, pasti Anda bisa hanya mewakili jumlah terbatas floating point nilai. Tapi berapa banyak bilangan real adalah mereka di dunia? Ada terbatas. Jadi itulah jenis masalah karena kita tidak memiliki jumlah tak terbatas memori atau RAM dalam komputer kita. Jadi beberapa hal yang menantang bisa terjadi. Jadi mari kita pergi ke depan dan mencoba untuk mengungkapkan hal ini di sini. Biarkan aku pergi ke depan dan membuka gedit. Aku akan pergi ke depan dan menyimpan file disebut "floats0.c" hanya untuk menjadi konsisten dengan contoh yang tersedia secara online, jika Anda ingin. Dan aku akan pergi ke depan dan mendefinisikannya sebagai berikut - Aku akan pergi ke depan dan berkata, int void main, seperti yang sering kita lakukan. Dan kemudian dalam program ini, aku akan menyatakan diri pelampung, sehingga 32-bit variabel yang disebut f, sewenang-wenang. Dan kemudian aku akan menyimpan di dalamnya Aku tidak tahu, sepersepuluh, jadi 0,1. Jadi aku akan menyatakan bahwa sebagai salah satu dibagi dengan 10, yang sempurna sah dalam C. Dan kemudian pada baris kedua, saya hanya ingin mencetak nilai tersebut. Jadi ingat bahwa kita dapat menggunakan akrab printf. Kami tidak ingin menggunakan% i untuk int. Kami ingin menggunakan% f untuk pelampung. Dan kemudian aku akan melakukan backslash n, kutipan dekat, koma, f, titik koma. Jadi, inilah program saya. Sudah ada satu bug. Apakah seseorang untuk siapa ini diklik sudah ingin menunjukkan setidaknya salah satu bug yang saya buat? Ya? Ya. Aku lupa "# include" di atas, mereka gejala yang jika saya mencoba untuk kompilasi ini akan menjadi bahwa compiler akan berteriak padaku, mengatakan simbol tidak terdefinisi atau sesuatu untuk efek itu. Ia tidak memahami sesuatu seperti printf. Jadi aku akan melakukan "# include ", Simpan file tersebut. Dan sekarang dalam kondisi lebih baik. Tapi aku juga akan menunjukkan keluar satu detail baru hari ini. Selain menentukan tempat pemegang seperti%% f i% s, Anda dapat kadang-kadang mempengaruhi perilaku dari placeholder itu. Misalnya, dalam kasus floating nilai titik, jika saya hanya ingin untuk menampilkan satu tempat desimal setelah periode, saya benar-benar bisa melakukan 0.1f. Jadi dengan kata lain, saya memisahkan f dan tanda persen dengan 0,1, hanya printf mengatakan, Anda mungkin memiliki seluruh sekelompok angka setelah desimal titik bagi saya. Tapi aku hanya ingin melihat salah satu dari mereka. Jadi aku akan pergi ke depan sekarang dan hemat program ini, masuk ke terminal saya jendela, dan aku akan pergi ke depan dan jenis membuat mengapung 0, masukkan. Saya melihat bahwa garis agak samar bahwa akan mulai lebih masuk akal seperti yang kita menggoda terpisah minggu ini dan berikutnya. Sekarang aku akan pergi ke depan dan menjalankan mengapung nol. Dan, sialan. Jadi ada bug lain di sini untuk beberapa alasan. Aku cukup yakin bahwa sepersepuluh, atau satu dibagi dengan 10, bukan 0,0. Mungkin aku hanya tidak melihat setidaknya cukup digit. Jadi kenapa tidak saya katakan dua .2 untuk melihat dua desimal, bukan hanya satu. Biarkan aku kembali ke jendela terminal saya di sini dan memukul beberapa kali untuk melihat sejarah saya. Jangan membuat mengapung nol lagi, dan kemudian naik lagi. Dan sekarang masuk. Dan sekarang aku cukup yakin ini salah. Dan aku bisa melakukan tiga dan empat, dan aku mungkin akan terus melihat angka nol. Jadi di mana bug? Satu dibagi 10 harus 0,1. Seseorang ingin mengambil bacokan di apa masalah mendasar adalah? Ya? Mereka berdua bilangan bulat. Jadi apa? Jadi dengan satu dibagi dengan 10, itu apa yang saya lakukan dalam aritmatika. Dan saya mendapatkan 0,1. Ya. Dan memang masalah itu. Ketika Anda mengambil sebuah integer dalam komputer dan Anda membaginya dengan bilangan bulat lain, komputer secara default akan berasumsi bahwa Anda ingin integer. Masalah meskipun, tentu saja, adalah bahwa 0,1 tidak integer. Ini adalah bilangan real. Dan jadi apa komputer tidak dengan standar itu hanya membuang semuanya setelah titik desimal. Ini tidak bulat bawah atau ke atas per se. Itu hanya membuang segala sesuatu setelah titik desimal. Dan sekarang itu masuk akal. Karena sekarang kita jelas kiri dengan nol. Tapi tunggu sebentar. Saya tidak melihat sebuah nol int. Aku benar-benar melihat 0.00. Jadi bagaimana cara mendamaikan ini sekarang? Jika salah satu dibagi dengan 10 adalah nol, tapi aku melihat 0.00, di mana itu mendapatkan dikonversi kembali ke bilangan real? Ya. Tepat. Jadi di sini sejalan lima, ketika saya benar-benar menyimpan bahwa 0,1, yang kemudian dipotong ke nol, dalam pelampung, yang efektif setara dengan menyimpannya bukan sebagai int tetapi, memang, sebagai pelampung. Selain itu, saya kemudian menggunakan printf untuk eksplisit mencetak nomor itu untuk dua desimal meskipun ada tidak mungkin benar-benar ada. Jadi semacam ini menyebalkan, kan? Tampaknya Anda tidak dapat melakukan matematika, setidaknya pada tingkat ini presisi, dalam komputer. Tapi tentunya ada solusi. Apa memperbaiki sederhana mungkin kita bisa lakukan, bahkan hanya intuitif sini untuk memecahkan ini? Ya? Putar bilangan bulat ke - ya. Bahkan jika saya tidak yakin apa yang sebenarnya terjadi di sini, jika fundamental harus dilakukan dengan kedua ini menjadi int, baik, kenapa tidak saya membuat 10,0, membuat ini 1.0, simpan file tersebut. Biarkan aku pergi kembali ke bawah dan mengkompilasi ulang. Sekarang saya jalankan. Dan ada - sekarang, aku punya satu kesepuluh direpresentasikan sebagai 0,10. Baik. Jadi itu tidak buruk. Dan biarkan saya menunjukkan salah satu cara lain kita bisa memecahkan ini. Biarkan aku benar-benar memutar kembali dalam waktu ketika kita memiliki ini sebagai salah satu kesepuluh saat yang lalu. Dan biarkan aku pergi ke depan dan simpan file ini sebagai nama file yang berbeda, hanya untuk memiliki pos pemeriksaan kecil. Jadi itu satu versi. Dan sekarang biarkan aku pergi ke depan dan melakukan satu versi yang lebih. Kami akan memanggil versi ini dua nol diindeks. Dan aku akan melakukan sebaliknya ini - Anda tahu apa? Menambahkan titik nol bekerja dalam kasus ini. Tapi bagaimana kalau ada orang yang variabel. Seharusnya 10 adalah variabel. Dengan kata lain, anggaplah bahwa saya tidak bisa hanya sulit-kode .0 pada akhir ini ekspresi aritmatika. Yah, aku benar-benar bisa melakukan sesuatu dalam kurung disebut pengecoran. Saya dapat melemparkan bahwa bilangan bulat 10 ke float, dan saya dapat melemparkan bahwa integer ke mengapung, juga. Kemudian matematika yang akan dilakukan secara efektif 1.0 dibagi dengan 10,0, hasil yang berjalan di f seperti sebelumnya. Jadi jika saya ulang ini sebagai membuat mengapung 2, dan sekarang mengapung 2, saya mendapatkan hal yang sama menjawab, juga. Jadi, ini adalah contoh yang cukup dibikin, untuk memecahkan masalah ini dengan memperkenalkan casting. Tapi secara umum, pengecoran akan menjadi hal yang kuat, terutama untuk Masalah mengatur dua dalam waktu satu minggu, ketika Anda ingin mengkonversi satu jenis data untuk lain yang pada akhir hari diwakili dengan cara yang sama. Pada akhir hari, setiap satu hal yang kita bicarakan sejauh ini adalah hanya ints bawah tenda. Atau jika itu tingkat rendah juga untuk Anda, mereka hanya nomor bawah tenda. Bahkan karakter, sekali lagi, mengingat sejak minggu nol, adalah nomor bawah tenda. Yang mengatakan, kita dapat mengkonversi antara berbagai jenis nomor jika mereka hanya bit. Kita dapat mengkonversi antara angka dan huruf jika mereka hanya bit, dan sebaliknya. Dan casting dengan cara ini adalah mekanisme dalam pemrograman yang memungkinkan Anda paksa mengubah satu tipe data yang lain. Sayangnya, hal ini tidak langsung seperti saya mungkin menyukai. Aku akan kembali ke mengapung 1, yang merupakan lebih sederhana, lebih satu langsung dengan 0,0 ditambahkan pada masing-masing. Dan hanya sebagai penyegaran cepat, biarkan aku pergi ke depan dan mengkompilasi ulang ini, membuat mengapung 2 - maaf, ini membuat mengapung 1. Dan sekarang mari kita jalankan mengapung 1. Dan di bagian bawah, perhatikan bahwa saya memang mendapatkan 0,1. Jadi, masalah terpecahkan. Tapi belum. Saya sekarang akan mendapatkan sedikit penasaran, dan aku akan kembali ke saya Pernyataan printf dan mengatakan, kau tahu apa? Saya ingin mengkonfirmasi bahwa ini benar-benar sepersepuluh. Dan aku akan ingin melihat ini untuk, katakanlah, lima tempat desimal. Ini bukan masalah. Saya mengubah dua sampai lima, Saya ulang dengan make. Saya jalankan sebagai mengapung 1. Melihat cukup bagus. Cek kewarasan saya mungkin berakhir di sana, tapi Aku mulai sedikit lebih berani. Aku akan mengubah 0,5-0,10. Saya ingin melihat 10 digit setelah tempat desimal. Dan aku akan pergi ke depan dan mengkompilasi ulang ini dan jalankan kembali mengapung 1. Aku agak menyesal karena tidak memeriksa ini lebih lanjut karena matematika saya tidak begitu benar lagi, tampaknya. Tapi tunggu dulu, mungkin itu hanya kebetulan. Mungkin komputer bertindak sedikit aneh. Biarkan aku pergi ke depan dan melakukan 20 poin desimal dan meyakinkan diri sendiri bahwa saya tahu bagaimana melakukan matematika. Aku tahu bagaimana program. Membuat mengapung 1, ulang, dan sialan. Yang benar-benar, benar-benar mendapatkan jauh dari sasaran. Jadi apa yang terjadi di sini? Secara intuitif, berdasarkan asumsi kita sebelumnya tentang ukuran tipe data, apa yang harus terjadi di sini bawah tenda? Ya? Tepat. Jika Anda ingin ini presisi banyak, dan itu heck of a banyak presisi - 20 angka setelah titik desimal. Anda mungkin tidak dapat mewakili jumlah sembarang kecuali Anda memiliki jumlah sewenang-wenang bit. Tapi kita tidak. Untuk pelampung, kita hanya memiliki 32 bit. Jadi, jika 32 bit hanya dapat permuted dalam cara - sama seperti manusia kami pada, panggung tangan atas atau bawah - dalam jumlah terbatas cara, hanya ada sejumlah terbatas bilangan real Anda dapat mewakili dengan bit tersebut. Dan sehingga komputer akhirnya akan harus mulai memotong sudut. Komputer dapat menyembunyikan detail-detail dari kami untuk sedikit waktu. Tetapi jika kita mulai menyembul di nomor dan melihat jauh dan lebih jauh di tertinggal angka di seluruh nomor, maka kita mulai melihat bahwa itu sebenarnya kurang lebih sama ide sepersepuluh. Dan ternyata, tragis, ada jumlah tak terbatas nomor kita tidak dapat mewakili secara tepat dalam komputer, setidaknya dengan terbatas jumlah bit, yang terbatas jumlah RAM. Sekarang sayangnya, terkadang hal ini memiliki konsekuensi dunia nyata. Jika orang tidak cukup menghargai ini atau semacam mengambil untuk diberikan fakta bahwa komputer mereka hanya akan melakukan apa mereka mengatakan itu harus dilakukan dan tidak memahami mendasari Rincian representasi - yang, terus terang, dalam beberapa bahasa yang disembunyikan dari pengguna, seperti di C - beberapa hal buruk bisa terjadi. Dan apa yang saya pikir kita akan melakukan adalah mengambil langkah mundur. Dan ini adalah tentang delapan menit video. Hal ini ditayangkan beberapa tahun yang lalu, dan memberikan wawasan sebenarnya apa yang bisa salah bila Anda kurang menghargai jenis rincian di sangat yang terlalu dunia nyata. Jika kita bisa meredupkan lampu selama beberapa menit. SPEAKER 1: Kita sekarang kembali ke rekayasa bencana terhadap Modern Marvels. Komputer - kita semua datang untuk menerima masalah sering membuat frustrasi yang pergi bersama mereka. Bugs, virus, dan gangguan perangkat lunak adalah harga kecil untuk membayar untuk kenyamanan. Tapi dalam teknologi tinggi dan kecepatan tinggi militer dan program luar angkasa aplikasi, masalah terkecil dapat diperbesar menjadi bencana. Pada tanggal 4 Juni 1996, para ilmuwan siap untuk meluncurkan berawak roket Ariane 5. Itu membawa satelit ilmiah dirancang untuk membangun tepat bagaimana medan magnet bumi berinteraksi dengan angin surya. Roket ini dibangun untuk Eropa Badan Antariksa dan lepas landas dari perusahaan fasilitas di pantai Guyana Prancis. JACK Ganssle: Pada sekitar 37 detik ke penerbangan, mereka pertama kali melihat sesuatu yang tidak beres. Nozel yang berputar di cara mereka benar-benar tidak seharusnya. Sekitar 40 detik dalam penerbangan, jelas kendaraan berada dalam kesulitan. Dan saat itulah mereka membuat keputusan untuk menghancurkannya. Kisaran petugas keamanan, dengan nyali luar biasa, menekan tombol, meledakkan roket sebelum bisa menjadi bahaya bagi keselamatan publik. SPEAKER 1: Ini adalah pelayaran perdananya dari Ariane 5, dan kehancuran terjadi karena cacat tertanam dalam perangkat lunak roket. JACK Ganssle: Masalah pada Ariane adalah bahwa ada sejumlah yang memerlukan 64 bit untuk mengekspresikan. Dan mereka ingin mengkonversi ke nomor 16-bit. Mereka beranggapan bahwa jumlah itu tidak pernah akan menjadi sangat besar, bahwa sebagian besar mereka digit di 64-bit nomor adalah nol. Mereka salah. SPEAKER 1: Ketidakmampuan satu software program untuk menerima jenis jumlah yang dihasilkan oleh orang lain adalah pada akar kegagalan. Pengembangan perangkat lunak telah menjadi sangat bagian mahal dari teknologi baru. Ariane 4 roket telah sangat sukses, begitu banyak perangkat lunak diciptakan untuk itu juga digunakan dalam Ariane 5. PHILIP COYLE: Masalah mendasar adalah bahwa Ariane 5 lebih cepat, dipercepat lebih cepat. Dan perangkat lunak itu tidak dipertanggungjawabkan. SPEAKER 1: Penghancuran roket adalah bencana keuangan yang besar, semua karena kesalahan software menit. Tapi ini bukan data pertama kalinya masalah konversi dialami moderen teknologi roket. JACK Ganssle: Pada tahun 1991, dengan start dari Perang Teluk pertama, Patriot rudal mengalami serupa dari masalah konversi nomor. Akibatnya, 28 tentara Amerika yang tewas dan sekitar 100 lainnya luka-luka ketika Patriot, yang seharusnya untuk melindungi terhadap Scud masuk, gagal untuk menembakkan rudal. SPEAKER 1: Ketika Irak menginvasi Kuwait dan Amerika meluncurkan Desert Storm di awal 1991, baterai rudal Patriot dikerahkan untuk melindungi Arab Saudi dan Israel dari Irak Scud serangan rudal. Patriot adalah US menengah sistem permukaan-ke-udara yang diproduksi oleh perusahaan Raytheon. THEODORE POSTOL: Ukuran Patriot pencegat itu sendiri kira-kira 20-kaki panjang. Dan beratnya sekitar 2000 pound. Dan itu membawa hulu ledak sekitar - Saya pikir itu sekitar 150 pound. Dan hulu ledak itu sendiri adalah ledak tinggi yang memiliki fragmen sekitarnya. Casing dari hulu ledak dirancang untuk bertindak seperti gotri. SPEAKER 1: Rudal itu dilakukan empat per kontainer dan diangkut oleh semi trailer. PHILIP COYLE: The Patriot anti-rudal sistem berjalan kembali setidaknya 20 tahun sekarang. Ini pada awalnya dirancang sebagai rudal pertahanan udara ke menembak jatuh pesawat musuh. Dalam Perang Teluk pertama, ketika perang datang, Angkatan Darat ingin menggunakannya untuk menembak jatuh rudal Scud, bukan pesawat terbang. Angkatan udara Irak tidak begitu banyak masalah. Tapi Angkatan Darat khawatir tentang Scud. Dan sehingga mereka mencoba untuk meng-upgrade Patriot. SPEAKER 1: mencegat rudal musuh bepergian di mach lima adalah akan cukup menantang. Tapi ketika Patriot dilarikan ke layanan, Angkatan Darat tidak menyadari adanya Modifikasi Irak yang membuat mereka Scud hampir mustahil untuk memukul. THEODORE POSTOL: Apa yang terjadi adalah rudal Scud yang datang tidak stabil. Mereka bergoyang-goyang. Alasan untuk ini adalah Irak, di Untuk mendapatkan 600 kilometer keluar dari Rudal 300-kilometer-range, mengambil berat dari hulu ledak depan. Mereka membuat hulu ledak ringan. Jadi sekarang Patriot berusaha datang pada Scud. Dan sebagian besar waktu, yang luar biasa sebagian besar waktu, itu akan hanya terbang oleh Scud. SPEAKER 1: Setelah sistem Patriot operator menyadari Patriot terjawab target, mereka meledakkan Patriots hulu ledak untuk menghindari kemungkinan korban jika diizinkan jatuh ke tanah. THEODORE POSTOL: Itulah yang paling orang melihat sebagai bola api besar di langit dan disalahpahami sebagai penyadapan Scud dari hulu ledak. SPEAKER 1: Meskipun di langit malam Patriot tampaknya berhasil menghancurkan rudal Scud, di Dhahran ada mungkin ada kesalahan tentang nya kinerja. Ada, sistem radar Patriot hilang melacak dari Scud masuk dan tidak pernah diluncurkan karena cacat perangkat lunak. Itu adalah Israel yang pertama kali menemukan bahwa semakin lama sistem pada, semakin besar waktu perbedaan menjadi karena jam tertanam dalam komputer sistem. JACK Ganssle: Sekitar dua minggu sebelum tragedi di Dhahran, Israel dilaporkan ke Departemen Pertahanan bahwa sistem itu kehilangan waktu. Setelah sekitar delapan jam berjalan, mereka melihat bahwa sistem ini menjadi terasa kurang akurat. Departemen Pertahanan menanggapi dengan memberitahu semua baterai Patriot untuk tidak meninggalkan sistem untuk waktu yang lama. Mereka tidak pernah mengatakan apa waktu yang lama adalah. Delapan jam? 10 jam? 1.000 jam? Tak ada yang tahu. SPEAKER 1: The Patriot baterai ditempatkan di barak di Dhahran dan jam internal cacat telah di lebih dari 100 jam pada malam 25 Feb. JACK Ganssle: Ini dilacak waktu ke akurasi sekitar sepersepuluh detik. Sekarang, sepersepuluh detik adalah Nomor menarik karena tidak dapat dinyatakan dalam biner persis, yang berarti itu tidak bisa diungkapkan tepatnya di setiap komputer digital modern. Sulit untuk percaya, tetapi menggunakan ini sebagai contoh. Mari kita nomor satu ketiga. Sepertiga tidak bisa diungkapkan dalam desimal persis. Satu ketiga 0,333 akan selama tak terhingga. Tidak ada cara untuk melakukan itu dengan akurasi mutlak dalam desimal. Itu persis jenis masalah yang sama yang terjadi di Patriot. Semakin lama sistem berlari, yang terburuk time error menjadi. SPEAKER 1: Setelah 100 jam operasi, kesalahan dalam waktu hanya sekitar sepertiga detik. Tapi dalam hal penargetan rudal bepergian di mach lima, itu mengakibatkan kesalahan pelacakan lebih dari 600 meter. Ini akan menjadi kesalahan fatal bagi tentara di Dhahran. THEODORE POSTOL: Apa yang terjadi adalah Scud peluncuran terdeteksi pada awal satelit peringatan. Dan mereka tahu bahwa Scud datang arah umum mereka. Mereka tidak tahu di mana itu berasal. SPEAKER 1: Sekarang sudah sampai ke radar komponen sistem Patriot membela Dhahran untuk mencari dan menjaga melacak rudal musuh yang masuk. JACK Ganssle: Radar sangat cerdas. Ini akan benar-benar melacak posisi yang Scud dan kemudian memprediksi mana mungkin akan menjadi waktu berikutnya radar mengirimkan pulsa keluar. Yang disebut gerbang jangkauan. THEODORE POSTOL: Kemudian setelah Patriot MEMUTUSKAN cukup waktu telah berlalu pergi kembali dan memeriksa lokasi berikutnya untuk ini terdeteksi objek, itu akan kembali. Jadi ketika kembali ke salah tempat, kemudian melihat ada objek. Dan memutuskan bahwa tidak ada objek, itu adalah deteksi palsu, dan turun trek. SPEAKER 1: masuk Scud menghilang dari layar radar, dan detik kemudian membanting ke markas. The Scud menewaskan 28 dan adalah yang terakhir dipecat selama Perang Teluk pertama. Tragisnya, perangkat lunak diperbarui tiba di Dhahran hari berikutnya. Perangkat lunak cacat telah diperbaiki, menutup satu bab dalam bermasalah sejarah rudal Patriot. Patriot sebenarnya merupakan singkatan untuk bertahap Array TRACKING Intercept Of Target. DAVID J Malan: Baiklah, sehingga menenangkan contoh, untuk memastikan. Dan untungnya, ini tingkat yang lebih rendah bug bukan sesuatu yang kita akan biasanya harus menghargai, tentu tidak dengan beberapa kami awal program. Sebaliknya, sebagian besar bug Anda akan pertemuan akan logis di alam, sintaksis di alam dimana kode hanya tidak bekerja dengan baik. Dan kau tahu itu cukup cepat. Tapi terutama ketika kita sampai ke akhir semester, itu akan menjadi lebih dan lebih dari kemungkinan untuk benar-benar berpikir keras tentang desain program-program anda dan mendasari perwakilan di sana juga, dari data. Misalnya, kami akan memperkenalkan MySQL, yang merupakan mesin database populer yang dapat Anda gunakan dengan website untuk menyimpan data di ujung belakang. Dan Anda harus mulai memutuskan di akhir semester tidak hanya apa jenis data sepanjang jalur tersebut untuk menggunakan tapi persis berapa banyak bit untuk digunakan, apakah Anda ingin menyimpan tanggal sebagai tanggal dan waktu sebagai kali, dan juga hal-hal seperti seberapa besar Anda ingin ID unik untuk menjadi untuk, misalnya, pengguna dalam database Anda. Bahkan, jika beberapa dari Anda telah memiliki Facebook account untuk beberapa waktu, dan Anda tahu bagaimana untuk mendapatkan akses untuk User ID - yang kadang-kadang muncul dalam Anda URL profil, kecuali jika Anda telah memilih julukan untuk URL, atau jika Anda sudah digunakan Facebook Grafik API, API yang tersedia untuk umum dengan mana Anda dapat meminta Facebook untuk data mentah - Anda dapat melihat apa ID numerik Anda. Dan beberapa tahun yang lalu, Facebook dasarnya harus mengubah dari menggunakan setara dengan int menggunakan panjang lama karena dari waktu ke waktu sebagai pengguna datang dan pergi dan membuat banyak akun dan account palsu, bahkan mereka sangat mudah mampu knalpot sesuatu seperti 4 miliar nilai kemungkinan seperti int. Jadi lebih pada orang-orang jenis masalah di jalan, juga. Baiklah, sehingga mengusir. Itu ketidaktepatan. Beberapa pengumuman cepat. Jadi bagian resmi mulai datang ini Minggu, Senin, Selasa. Anda akan mendengar melalui email akhir pekan ini untuk tugas bagian Anda. Dan Anda juga di sini pada saat itu akan bagaimana untuk mengubah bagian Anda jika Anda jadwal sekarang telah berubah atau Anda tingkat kenyamanan kini telah berubah. Sementara P-set satu dan satu hacker yang karena ini Kamis dengan pilihan untuk memperpanjang batas waktu per spesifikasi sampai Jumat dengan cara yang khas. Sadarilah bahwa disertakan dengan masalah spesifikasi set adalah petunjuk tentang bagaimana menggunakan alat CS50, membuat, serta beberapa CS50 alat khusus seperti gaya 50, yang dapat memberikan Anda dengan umpan balik secara dinamis pada kualitas gaya kode Anda dan juga memeriksa 50, yang dapat menyediakan Anda dengan umpan balik yang dinamis untuk Anda kebenaran kode itu. Memaafkan itu kita masih menyetrika keluar beberapa kinks dengan cek 50. Beberapa teman sekelas yang memang mulai sekitar 04:00 pada Jumat malam ketika spec naik menyadari sejak saat itu beberapa bug bahwa kita bekerja melalui, dan permintaan maaf bagi siapa saja yang telah mengalami frustrasi yang tidak semestinya. Kesalahannya adalah milikku. Tapi kita akan menindaklanjuti CS50 membahas kapan yang diselesaikan. Jadi kata pada nilai sendiri. Jadi itu akan menjadi satu atau dua minggu sebelum Anda mulai mendapatkan umpan balik pada set masalah karena Anda belum memiliki sesama mengajar. Dan bahkan kemudian, kita akan mulai untuk mengevaluasi masalah C set sebelum kita kembali dan mengevaluasi awal sehingga bahwa Anda mendapatkan lebih relevan umpan balik lebih cepat. Tapi secara umum per silabus, CS50 set masalah dievaluasi sepanjang setelah empat sumbu - ruang lingkup, ketepatan, desain, dan gaya. Lingkup akan menjadi nomor biasanya antara nol dan lima yang menangkap berapa banyak bagian yang Anda menggigit. Biasanya, Anda ingin ini menjadi lima. Anda setidaknya mencoba segalanya. Dan melihat itu adalah faktor perkalian sehingga hanya melakukan bagian dari Masalah set bukanlah strategi terbaik. Sementara itu, lebih jelas adalah pentingnya kebenaran - saja program yang benar dengan menghormati dengan spesifikasi? Hal ini sengaja berbobot lebih berat dari yang lain dua sumbu dengan faktor tiga karena kita menyadari yang biasanya Anda akan menghabiskan lebih banyak waktu memburu beberapa bug, mendapatkan kode Anda untuk bekerja, maka Anda Indentasi dan memilih nama variabel yang tepat dan seperti yang di ujung spektrum gaya. Itu bukan untuk mengatakan gaya tidak penting, dan kami akan memberitakannya atas waktu baik dalam ceramah dan dalam beberapa bagian. Gaya mengacu pada estetika kode Anda. Anda telah memilih dengan baik-nama variabel yang singkat tapi agak deskriptif? Apakah kode Anda menjorok seperti yang Anda lihat dalam ceramah dan secara konsisten dengan gaya 50? Terakhir adalah desain yang tepat ada di tengah. Desain adalah salah satu sulit untuk menempatkan jari pada karena itu jauh lebih subyektif. Tapi itu mungkin yang paling penting dari tiga sumbu dari segi pedagogis nilai dari waktu ke waktu dan bahwa ini akan menjadi kesempatan sesama mengajar untuk menyediakan Anda dengan umpan balik kualitatif. Memang, dalam CS50 meskipun kami memiliki formula ini dan skor, di akhir hari ini sangat sengaja ember sangat kecil - nilai titik antara nol dan tiga dan nol dan lima. Kami tidak mencoba untuk menarik garis yang sangat kasar antara set masalah atau antara siswa melainkan fokus sebanyak kita bisa pada kualitatif, tulisan tangan umpan balik, baik diketik atau lisan dari sesama mengajar tertentu, Anda akan mengenal cukup baik. Tapi secara umum, mereka adalah bobot bahwa berbagai sumbu akan memiliki. Sementara itu, juga, itu layak disimpan dalam pikiran bahwa Anda tidak harus mengasumsikan bahwa tiga dari lima adalah 60% dan Oleh karena itu kasar gagal. Tiga sengaja dimaksudkan untuk menjadi semacam tengah jalan yang baik. Jika Anda mendapatkan bertiga di awal semester, yang memang dimaksudkan untuk menjadi baik tempat untuk memulai. Jika Anda mendapatkan berpasangan, pameran, ada pasti beberapa pekerjaan yang harus membayar sedikit perhatian lebih, untuk mengambil keuntungan bagian dan jam kantor. Jika Anda mendapatkan merangkak dan balita, besar. Tapi sungguh, kami berharap dapat melihat lintasan kalangan siswa - sangat individual per siswa, tapi mulai semester di sini semacam dua sampai tiga rentang tetapi berakhir di sini di 04:56 jangkauan. Itulah yang kita benar-benar mencari. Dan kita diingat bahwa delta Anda menunjukkan antara minggu nol dan minggu 12 ketika saya melakukan nilai. Itu tidak masalah bagi kami benar-benar bagaimana Anda adil di awal jika Anda lintasan memang atas dan kuat. Kejujuran akademik - jadi biar memakai saya suara lebih serius untuk sesaat. Jadi kursus ini memiliki perbedaan mengirimkan siswa lebih dari yang lain dalam sejarah ke papan iklan, saya percaya. Kami memiliki semacam menghitung ini titik seberapa sering hal ini terjadi. Dan itu bukan karena siswa di 50 adalah lebih jujur ​​daripada mereka teman sekelas di tempat lain. Tetapi menyadari juga, bahwa kami sangat baik dalam mendeteksi hal semacam ini. Dan itu adalah keuntungan bahwa kelas ilmu komputer telah di kita dapat dan kita membandingkan semua siswa Masalahnya set berpasangan melawan setiap lain, tidak hanya tahun ini tetapi semua tahun-tahun sebelumnya. Kami memiliki kemampuan, seperti mahasiswa di kelas, ke Google dan cari kode di situs seperti github dan forum diskusi. Ada benar-benar solusi untuk CS50 ini p-set mengambang di sekitar sana. Tapi jika Anda dapat menemukan mereka, kita bisa menemukan mereka. Dan semua ini sangat banyak otomatis dan mudah dan menyedihkan bagi kita untuk menemukan. Tapi saya ingin menekankan, juga, bahwa Kebijakan kejujuran akademik program adalah sangat dimaksudkan untuk menjadi sangat banyak kebalikan dari semangat itu. Memang, tahun ini kami sudah diulang hal dalam silabus untuk menjadi ini, dot dot dot, dengan lebih detail dalam silabus. Namun tema yang menyeluruh dalam kursus benar-benar masuk akal. Kami menyadari bahwa ada yang signifikan jumlah pedagogis nilai dalam berkolaborasi, sampai batas tertentu, dengan teman sekelas, dimana Anda dua atau tiga atau Anda Anda lebih banyak berdiri di papan putih whiteboarding, sehingga untuk berbicara, ide-ide Anda - menuliskan pseudocode dalam gambar, diagram apa yang harus Mario jika Anda menulis pertama dalam pseudocode. Apa yang harus algoritma serakah - bagaimana seharusnya berperilaku per Masalahnya set satu? Dan begitu menyadari perilaku yang bahwa kami mendorong sangat banyak sepanjang garis itu. Dan dalam silabus, Anda akan melihat Seluruh sekelompok peluru di bawah kategori wajar dan tidak wajar kategori yang membantu kami membantu Anda membungkus pikiran Anda sekitar mana kita menarik garis itu. Dan secara umum, aturan praktis yang layak adalah bahwa jika Anda sedang berjuang untuk memecahkan beberapa bug dan teman Anda atau teman sekelas yang duduk di sebelah Anda, itu wajar bagi Anda untuk menunjukkan dia kode Anda dan berkata, hei, Anda dapat membantu saya mencari tahu apa yang salah di sini? Kami tidak biasanya merangkul sisi berlawanan. Ini bukan jawaban yang benar untuk Anda teman atau teman sekelas di sini untuk mengatakan, oh, hanya melihat saya dan tokoh keluar dari itu. Itu adalah semacam masuk akal. Tapi setelah orang lain, otak lain, sepasang mata melihat layar Anda atau melihat kode Anda dan mengatakan, apakah Anda yakin Anda ingin memiliki loop di sini? Atau apakah kamu yakin bahwa titik koma di sini? Atau oh, itu pesan kesalahan berarti ini. Mereka sangat wajar dan mendorong perilaku. Kasus-kasus yang saya menyinggung sebelumnya mendidih hingga ketika siswa larut malam membuat penilaian yang buruk keputusan dan email kode mereka untuk orang lain atau hanya mengatakan, di sini, di Dropbox atau Googling larut malam. Dan jadi saya akan mendorong dan mohon, jika Anda memiliki orang-orang tak terelakkan saat-saat stres, Anda menabrak terhadap batas waktu, Anda tidak terlambat hari karena sudah Jumat pada saat itu titik, email kepala kursus atau sendiri secara langsung. Katakanlah, dengarkan, aku di saya titik melanggar sini. Mari kita memiliki percakapan dan mencari tahu. Beralih ke web atau tidak beberapa lainnya perilaku yang wajar adalah tidak pernah solusi, dan terlalu banyak Anda teman sekelas tidak lagi di sini kampus karena itu penilaian buruk. Tapi itu sangat mudah untuk rok garis itu. Dan di sini adalah sedikit gambaran untuk menghibur Anda dari Reddit sehingga sekarang semuanya akan beres. Jadi rekap cepat, maka, di mana kita tinggalkan. Jadi minggu lalu, ingat bahwa kami memperkenalkan kondisi, tidak Scratch tapi di C saat ini. Dan ada beberapa sintaks baru tapi benar-benar tidak ada ide-ide baru per se. Kami memiliki ekspresi Boolean bahwa kita bisa atau bersama-sama dengan dua vertikal bar atau dan bersama-sama dengan dua ampersands, mengatakan bahwa kedua kiri dan hak harus benar untuk ini untuk mengeksekusi. Kemudian kami memiliki switch, yang kita melihat di singkat, tapi saya mengusulkan benar-benar hanya sintaks yang berbeda untuk mencapai yang sama tujuan jika Anda tahu di memajukan apa kasus Anda akan menjadi. Kami melihat loop. A untuk loop mungkin yang paling umum, atau setidaknya salah satu yang orang biasanya meraih naluriah. Meski terlihat agak samar, Anda akan melihat banyak, banyak contoh ini tak lama, Anda memiliki sudah akhir pekan lalu. Sementara loop dapat sama mencapai hal yang sama. Tetapi jika Anda ingin melakukan apapun incrementation atau memperbarui nilai variabel, Anda harus melakukannya lebih manual daripada untuk loop sebelum memungkinkan. Dan kemudian ada do-while loop, yang memungkinkan kita untuk melakukan sesuatu pada setidaknya sekali sementara sesuatu lain benar. Dan ini sangat baik untuk program atau game di mana Anda ingin untuk meminta pengguna untuk sesuatu setidaknya sekali. Dan kemudian jika dia tidak bekerja sama, Anda mungkin ingin melakukannya lagi dan lagi. Dengan variabel, sementara itu, kami memiliki garis-garis kode seperti ini, yang bisa menjadi dua baris. Anda bisa mendeklarasikan int disebut counter, koma. Atau Anda dapat mendeklarasikan dan mendefinisikannya, sehingga untuk berbicara. Berikan nilai pada waktu yang sama. Dan kemudian terakhir, kami berbicara tentang fungsi. Dan ini adalah contoh yang bagus di arti bahwa ia menggambarkan dua jenis fungsi. Salah satunya adalah GetString (), yang, sekali lagi, mendapatkan string dari pengguna. Tapi GetString () adalah jenis yang menarik, sejauh kita sudah menggunakannya, karena kita selalu menggunakannya dengan sesuatu di sisi kiri dari tanda sama. Itu adalah untuk mengatakan bahwa GetString () mengembalikan nilai. Ini kembali, tentu saja, string. Dan kemudian di sisi kiri, kami hanya menyimpan string yang dalam sebuah variabel yang disebut nama. Hal ini berbeda, dalam arti, dari printf karena printf, setidaknya kami Penggunaan di sini, tidak mengembalikan apa-apa. Sebagai samping, itu tidak kembali sesuatu. Kami hanya tidak peduli apa itu. Tapi itu memiliki apa yang disebut efek samping. Dan apa itu efek samping dalam setiap kasus yang telah kita lihat sejauh ini? Apa printf lakukan? Mencetak sesuatu ke layar, menampilkan teks atau angka atau sesuatu di layar. Dan itu hanya dianggap sebagai efek samping karena itu tidak benar-benar menyerahkan itu kembali kepada saya. Ini bukan jawaban dalam kotak hitam yang saya dapat kemudian menjangkau ke dan ambil. Ini hanya melakukannya sendiri, banyak seperti Colton yang terhubung ke ini kotak hitam pekan lalu, dan dia entah bagaimana ajaib menggambar di papan tulis tanpa aku benar-benar terlibat. Itu akan menjadi efek samping. Tapi kalau aku benar-benar harus mencapai kembali di sini dan mengatakan, oh, di sini adalah string dari pengguna, yang akan menjadi nilai kembali. Dan sejauh ini kita hanya digunakan fungsi bahwa orang lain telah menulis. Tapi kita benar-benar dapat melakukan hal- macam hal diri kita sendiri. Jadi aku akan pergi ke CS50 alat lagi. Biarkan aku menutup tab yang kita telah membuka beberapa saat yang lalu. Dan biarkan aku pergi ke depan dan membuat file baru. Dan aku akan pergi ke depan dan menyebutnya satu positive.c. Jadi saya ingin melakukan sesuatu dengan angka positif di sini. Jadi aku akan pergi ke depan dan melakukan int - maaf - # Include. Mari kita tidak membuat sama kesalahan seperti sebelumnya. Int main (void), terbuka keriting brace, ditutup keriting brace. Dan sekarang saya ingin melakukan hal berikut. Aku ingin menulis sebuah program yang menegaskan bahwa pengguna memberikan saya bilangan bulat positif. Jadi tidak ada fungsi GetPositiveInt dalam CS50 perpustakaan. Hanya ada getInt (). Tapi itu OK karena saya memiliki konstruksi dengan yang saya dapat memaksakan sedikit lebih kendala pada nilai tersebut. Aku bisa melakukan sesuatu seperti ini. Jadi int n - dan jika Anda sedang mengetik bersama, baru menyadari Aku akan kembali dan mengubah beberapa hal dalam sekejap - jadi int n sama getInt (). Dan itu akan menempatkan inside int n. Dan biarkan aku menjadi lebih deskriptif. Izinkan saya mengatakan sesuatu seperti saya menuntut agar Anda memberi saya bilangan bulat positif. Baik. Jadi hanya sedikit petunjuk. Dan sekarang apa yang bisa saya lakukan? Yah, aku sudah tahu dari yang sederhana saya kondisi atau cabang, sama seperti aku telah di Scratch, saya bisa mengatakan sesuatu seperti jika n kurang dari atau sama dengan nol, maka saya ingin melakukan sesuatu seperti, yang tidak positif. Dan kemudian aku bisa lakukan - OK, tapi aku benar-benar ingin mendapatkan int itu. Jadi aku bisa pergi di sini dan aku bisa jenis salinan ini dan indent ini. Dan kemudian, OK. Jadi jika n kurang dari atau sama dengan nol melakukan hal ini. Sekarang, bagaimana jika pengguna tidak bekerja sama? Nah, maka aku akan meminjam ini di sini. Dan kemudian aku pergi di sini dan di sini dan di sini. Jadi ini jelas tidak solusinya, kan? Karena tidak ada akhir yang terlihat. Jika saya ingin menuntut bahwa pengguna memberikan saya bilangan bulat positif, saya bisa benar-benar mendapatkan int. Saya kemudian dapat memeriksa int itu. Tapi kemudian saya ingin memeriksa lagi dan periksa lagi dan periksa lagi. Jadi jelas, apa yang lebih baik membangun akan menggunakan di sini? Baiklah, jadi semacam lingkaran. Jadi aku akan menyingkirkan hampir semua ini. Dan saya ingin mendapatkan ini int setidaknya sekali. Jadi aku akan mengatakan melakukan - dan aku akan kembali ke sementara hanya dalam beberapa saat - sekarang, melakukan apa? Aku akan melakukan getInt int n mendapat (). OK. Jadi itu cukup bagus. Dan sekarang seberapa sering melakukan Saya ingin melakukan ini? Biar printf dalam loop jadi saya bisa menuntut lagi dan lagi, jika perlu. Dan apa yang saya inginkan ini sementara kondisi yang harus dilakukan? Saya ingin terus melakukan hal ini sementara apa yang terjadi? Ya. N kurang dari atau sama dengan nol. Jadi sudah, kami telah secara signifikan dibersihkan kode ini up. Kami telah meminjam sangat sederhana membangun - do-while loop. Saya telah dicuri hanya garis penting kode yang saya mulai menyalin dan paste, yang tidak bijaksana. Dan sekarang aku akan benar-benar tempel dalam sini dan hanya melakukannya sekali. Dan sekarang apa yang ingin saya lakukan di akhir dari program ini? Saya hanya akan mengatakan sesuatu yang sederhana seperti, terima kasih atas - dan Aku akan melakukan% i untuk int - backslash n, koma, dan kemudian plug in n, titik koma. Baik. Jadi mari kita lihat apa yang terjadi sekarang ketika saya menjalankan program ini. Aku akan pergi ke depan dan lakukan membuat positif. Sial. Beberapa kesalahan. Jadi biarkan aku gulir kembali ke yang pertama. Jangan bekerja melalui mereka mundur. Bekerja melalui mereka dari atas ke bawah supaya mereka kaskade dan hanya satu hal yang salah. Deklarasi implisit Fungsi getInt (). Ya. Jadi itu tidak cukup. Aku agak membuat kesalahan yang sama tetapi sedikit berbeda kali ini. Saya perlu untuk tidak hanya mencakup stdio.h tetapi juga cs50.h, yang meliputi yang disebut deklarasi mendapatkan int, yang mengajarkan alat, atau mengajarkan C apa getInt () adalah. Jadi biarkan aku resave. Aku akan mengabaikan kesalahan lain karena aku akan berharap bahwa mereka entah bagaimana berhubungan dengan kesalahan Aku sudah tetap. Jadi biarkan aku pergi ke depan dan mengkompilasi ulang dengan make positif, Enter. Sial. Tiga kesalahan, masih. Mari saya gulir ke atas untuk yang pertama. Terpakai n variabel. Kami belum pernah melihat ini sebelumnya. Dan ini juga sedikit samar. Ini adalah output dari compiler. Dan apa garis disorot ada - positive.c :9:13 - mengatakan, itu mengatakan pada baris sembilan positive.c, pada karakter ke-13, Kolom 13, Anda membuat kesalahan ini. Dan khususnya, ia memberi tahu saya tidak terpakai variabel n. Jadi mari kita lihat - baris sembilan. Saya menggunakan n dalam arti bahwa Aku memberikannya nilai. Tapi apa compiler tidak suka adalah bahwa aku tidak tampaknya menggunakannya. Tapi tunggu dulu, saya menggunakan itu. Sejalan 11, saya menggunakan di sini. Tetapi jika saya gulir ke bawah lebih lanjut di positive.c :11 - sehingga pada baris 11, karakter 12, yang compiler mengatakan padaku, penggunaan dideklarasikan identifier n. Jadi berarti saya harus dideklarasikan tidak ditentukan sebagai variabel dengan tipe data. Tapi tunggu sebentar. Saya melakukan hal itu sejalan sembilan. Jadi seseorang benar-benar bingung di sini. Ini aku atau compiler karena sejalan sembilan, sekali lagi, aku mendeklarasikan int n, dan saya menugaskan itu yang mengembalikan nilai getInt (). Kemudian saya menggunakan bahwa n variabel sejalan 11 dan memeriksa jika nilainya kurang dari atau sama dengan nol. Tapi ini tampaknya adalah buruk dan rusak mengapa? Katakanlah lagi? Ah, saya harus menyatakan n sebelum memasuki loop. Tapi mengapa? Maksudku, kami hanya mengusulkan sedikit lalu yang itu baik untuk mendeklarasikan variabel semua dalam satu baris dan kemudian menetapkan mereka beberapa nilai. Sebuah variabel global - mari kita kembali ke gagasan hanya dalam beberapa saat. Mengapa Anda ingin saya untuk meletakkan itu di luar loop? Ini adalah. Tepat. Jadi, meskipun, agak berlawanan dengan intuisi, izinkan saya meringkas. Ketika Anda mendeklarasikan n dalam dari do blok sana - khusus dalam mereka kurung kurawal - bahwa variabel n memiliki apa disebut lingkup - terkait dengan sistem penilaian kami di tentu saja - tetapi memiliki cakupan yang terbatas pada kurung kurawal. Dengan kata lain, biasanya jika Anda menyatakan variabel di dalam satu set kurung kurawal, variabel yang hanya ada dalam kurung kurawal tersebut. Jadi dengan logika itu saja, meskipun Saya sudah menyatakan n sejalan sembilan, itu dasarnya menghilang dari ruang lingkup, menghilang dari memori, sehingga untuk berbicara, pada saat aku memukul baris 11. Karena line 11, sayangnya, di luar kurung kurawal tersebut. Jadi saya sayangnya tidak dapat memperbaiki hal ini dengan akan kembali ke apa yang saya lakukan sebelumnya. Anda mungkin pada awalnya melakukan hal ini. Tapi apa yang sekarang Anda tidak melakukan siklis? Kau jelas tidak mendapatkan int siklis. Jadi kita bisa meninggalkan getInt (), dan kami harus meninggalkan getInt () dalam lingkaran karena itulah yang kita ingin mengganggu pengguna untuk lagi dan lagi. Tapi itu tidak cukup untuk pergi sampai ke garis, mengatakan, enam. Int n, titik koma. Jangan memberikan nilai namun karena Anda tidak perlu dulu. Tapi sekarang di sini, pemberitahuan - ini akan menjadi kesalahan yang sangat mudah. Saya tidak ingin bayangan saya sebelumnya deklarasi n. Saya ingin menggunakan n yang benar-benar ada. Dan sekarang dalam baris 10, Saya menetapkan nilai n. Namun sejalan enam, saya menyatakan n. Dan demikian pula saya atau bisa saya tidak menggunakannya dalam baris 12 sekarang? Saya karena bisa antara yang keriting kawat gigi adalah n dinyatakan sekarang? Yang di sini pada baris kelima. Untuk satu di sini pada baris 14. Jadi jika sekarang saya zoom out, menyimpan file ini, pergi kembali ke dalam dan menjalankan make positif, disusun saat ini. Jadi itu sudah berlangsung. Slash. . / Positif, Enter. Saya meminta Anda memberi saya bilangan bulat positif. Negatif 1. Negatif 2. Negatif 3. Nol. Satu. Dan terima kasih untuk yang satu adalah apa yang sekarang dicetak. Biarkan aku mencoba sesuatu yang lain, karena penasaran. Saya diberitahu untuk memasukkan integer. Tapi bagaimana jika saya bukan mengetik domba? Jadi sekarang Anda melihat prompt yang berbeda - coba lagi. Tapi tak dalam kode saya aku menulis coba lagi. Jadi di mana, mungkin, apakah ini coba lagi meminta datang dari, yang akan Anda katakan? Ya, dari getInt () itu sendiri. Jadi salah satu hal yang tidak staf CS50 bagi Anda, setidaknya dalam beberapa pertama minggu, yang kami telah menulis beberapa jumlah memeriksa untuk memastikan bahwa jika kesalahan Anda menelepon getInt (), Anda akan setidaknya mendapatkan kembali sebuah int dari pengguna. Anda tidak akan mendapatkan string. Anda tidak akan mendapatkan char. Anda tidak akan mendapatkan sesuatu lain sama sekali. Anda akan mendapatkan int. Sekarang, mungkin tidak positif. Ini mungkin tidak negatif. Kami tidak membuat jaminan sekitar itu. Tapi kami akan mengganggu pengguna untuk mencoba lagi, coba lagi, coba lagi sampai dia benar-benar bekerja sama. Demikian pula, jika saya lakukan 1.23, yang bukan int. Tapi kalau aku mengetik, katakanlah, 50, yang memberi saya nilai yang saya inginkan. Baik. Jadi tidak buruk. Ada pertanyaan tentang apa yang baru saja kita lakukan? Kunci takeaway ini, harus jelas, tidak begitu banyak loop, yang telah kita lihat sebelum meskipun kita belum benar-benar menggunakannya, tapi masalah lingkup, di mana variabel hanya dapat hanya dapat digunakan dalam beberapa ruang lingkup tertentu. Baiklah, biarkan aku mengatasi saran Anda buat sebelumnya, yang dari variabel global. Sebagai samping, ternyata yang lain solusi untuk masalah ini, tapi biasanya solusi yang salah atau solusi yang dirancang buruk, adalah untuk mendeklarasikan variabel Anda sebagai apa disebut variabel global. Sekarang Aku agak melanggar definisi saya lingkup karena ada ada kurung kurawal di bagian paling atas dan bagian paling bawah file. Namun implikasi yang adalah bahwa sekarang di line empat, n adalah variabel global. Dan seperti namanya, itu hanya dapat diakses di mana-mana. Scratch sebenarnya memiliki ini. Jika Anda menggunakan variabel, Anda mungkin ingat Anda harus memilih apakah itu untuk sprite ini atau untuk semua sprite. Yah, semua sprite hanyalah jelas cara untuk mengatakan global. Ya? Ah, pertanyaan yang benar-benar baik. Jadi ingat bahwa dalam versi pertama kode saya, ketika saya salah dideklarasikan dan didefinisikan n sejalan sembilan - Saya menyatakan sebagai variabel dan saya memberikannya nilai dengan operator penugasan - ini memberi saya dua kesalahan. Satu, fakta bahwa n tidak digunakan, dan dua, bahwa pada baris 11 hal itu tidak diumumkan. Jadi yang pertama saya tidak alamat pada saat itu. Hal ini tidak sepenuhnya kesalahan untuk menyatakan variabel tapi tidak menggunakannya. Tapi salah satu hal yang kita lakukan di yang CS50 alat, sengaja, pedagogis, adalah kita telah mendongkrak harapan compiler untuk membuat Pastikan bahwa Anda melakukan hal-hal bukan hanya benar tapi benar-benar benar. Karena jika Anda mendeklarasikan variabel seperti n dan tidak pernah menggunakannya, atau menggunakannya benar, maka apa itu lakukan di sana? Ini benar-benar tidak ada gunanya. Dan itu sangat mudah dari waktu ke waktu, jika Anda tidak mengkonfigurasi komputer Anda sendiri dalam cara ini, hanya memiliki kode yang memiliki sedikit sisa-sisa di sini, sisa-sisa di sana. Dan kemudian bulan kemudian Anda melihat kembali dan Anda seperti, mengapa baris ini kode sana? Dan jika tidak ada alasan yang baik, tidak bermanfaat bagi Anda atau kolega Anda jalan harus tersandung kemudian. Sebagai samping, di mana yang datang dari? Nah, ingat bahwa setiap kali kita mengkompilasi Program, semua hal ini adalah sedang dicetak. Jadi kita akan kembali ke ini. Tapi sekali lagi, buat adalah sebuah utilitas yang mengotomatiskan proses kompilasi oleh menjalankan compiler yang sebenarnya disebut dentang. Hal ini, pada akhirnya kita akan lihat, memiliki hubungannya dengan debugging dengan khusus program yang disebut debugger. Hal ini harus dilakukan dengan mengoptimalkan kode - lebih pada di masa depan. Std = c99 - ini hanya berarti menggunakan versi 1999 C. C sudah ada lebih lama dari itu, tetapi mereka membuat beberapa nice perubahan 10 ditambah tahun yang lalu. Dan inilah yang relevan. Kami katakan membuat sesuatu yang sebelumnya akan menjadi peringatan kesalahan mencegah siswa dari kompilasi. Dan berarti dinding melakukannya untuk Seluruh banyak hal, tidak hanya terkait dengan variabel. Dan kemudian biarkan aku gulir ke akhir baris ini. Dan ini juga, pada akhirnya kita akan kembali ke. Ini jelas nama file saya kompilasi. Ini mengingatkan nama file Saya keluaran sebagai nama program runnable saya. Ini-lcs50 hanya berarti menggunakan CS50 yang perpustakaan, dan setiap nol dan satu yang staf menulis dan dikompilasi sebelumnya tahun ini, mengintegrasikan mereka ke dalam program saya. Dan ada yang tahu apa-lm adalah? Ini adalah perpustakaan matematika, yang hanya ada bahkan jika Anda tidak melakukan apapun matematika. Itu hanya diberikan secara otomatis kepada kami oleh buat. Nah, biarkan aku melakukan satu contoh lainnya di sini dengan membuka file baru. Dan biarkan aku menyimpan satu ini sebagai string.c. Ternyata bahwa ketika kita berbicara tentang data jenis hari ini, ada lebih banyak lagi terjadi di bawah tenda dari yang telah kita lihat sejauh ini. Jadi biar cepat melakukan program cepat. Sertakan stdio.h. Dan aku akan menyimpan itu. Dan kau tahu, biar tidak membuat kesalahan yang sama lagi dan lagi. Sertakan cs50.h. Dan biarkan aku pergi ke depan sekarang dan melakukan int main (void). Dan sekarang aku hanya ingin melakukan program yang melakukan hal ini - menyatakan string disebut s dan string dari pengguna. Dan biarkan aku melakukan sedikit petunjuk di sini - tolong beri saya string - jadi pengguna tahu apa yang harus dilakukan. Dan kemudian turun di sini di bawah ini, Saya ingin melakukan hal berikut - untuk int i mendapat nol. Sekali lagi, ilmuwan komputer biasanya mulai menghitung dari nol, tapi kita bisa membuat satu jika kita benar-benar ingin. Sekarang aku akan melakukan saya kurang dari panjang string s. Jadi strlen - S-T-R-L-E-N - lagi, itu singkat karena lebih mudah untuk mengetik, meskipun itu adalah sedikit samar. Itu adalah fungsi kita sudah tidak digunakan sebelum tapi benar-benar melakukan itu - kembali ke saya nomor yang mewakili panjang string bahwa pengguna mengetik. Jika mereka mengetik halo, itu akan kembali lima karena ada lima huruf dalam halo. Kemudian, pada setiap iterasi lingkaran ini, i plus plus. Jadi sekali lagi, standar membangun bahkan jika Anda tidak cukup atau terlalu nyaman akrab dengan it yet. Tapi sekarang pada setiap iterasi dari loop ini, perhatikan apa yang akan saya lakukan. Saya ingin pergi ke depan dan mencetak sebuah karakter tunggal - jadi% c backslash n pada baris baru. Dan kemudian, Anda tahu apa yang ingin saya lakukan? Apapun kata adalah bahwa jenis pengguna dalam, seperti halo, saya ingin mencetak H-E-L-L-O, satu karakter per baris. Dengan kata lain, saya ingin mendapatkan di karakter individu dalam sebuah string, dimana sampai sekarang string baru saja menjadi urutan karakter. Dan ternyata aku bisa melakukan s, braket, i, braket dekat, tutup kurung, koma. Dan aku harus melakukan satu hal lagi. Hal ini dalam sebuah file yang bernama string.h bahwa strlen dinyatakan. Jadi jika saya ingin menggunakan fungsi tersebut, Saya perlu memberitahu compiler, berharap untuk menggunakannya. Sekarang biarkan aku pergi ke depan dan membuat Program yang disebut tali. Dot, garis miring, tali. Tolong beri saya string. Aku akan pergi ke depan dan mengetiknya. Halo, dalam semua topi, Enter. Dan sekarang aku sudah melihat ini dicetak satu karakter demi satu. Jadi detail baru di sini adalah bahwa sebuah string, pada akhir hari, bisa diakses dengan cara individu karakter dengan memperkenalkan alun-alun notasi braket. Dan itu karena string di bawah tenda memang urutan karakter. Tapi apa yang rapi tentang mereka adalah dalam RAM komputer Anda - Mac, PC, apa pun itu - mereka harfiah kembali untuk kembali ke belakang - H-E-L-L-O - pada tingkat individu, yang berdekatan byte memori. Jadi jika Anda ingin mendapatkan di seperti kedelapan byte, yang dalam lingkaran ini akan braket nol, braket satu, dua braket, braket tiga, empat braket - yang nol diindeks sampai lima - yang akan mencetak H-E-L-L-O pada baris sendiri. Sekarang, sebagai teaser, mari kutunjukkan macam hal Anda akhirnya akan mampu memahami, setidaknya dengan beberapa dekat mencari. Untuk satu, apa yang kita termasuk dalam hari ini contoh, jika Anda ingin, sebenarnya salah satu jailbreaks pertama untuk iPhone. Jailbreaking berarti retak telepon sehingga Anda benar-benar dapat menggunakannya pada pembawa yang berbeda atau instalasi perangkat lunak Anda sendiri. Dan Anda akan melihat ini terlihat benar-benar samar, kemungkinan besar. Tapi lihat ini. IPhone tampaknya retak dengan untuk loop, kondisi jika, lain kondisi, sekelompok fungsi kita belum melihat. Dan lagi, Anda tidak akan di Sepintas mungkin memahami bagaimana ini bekerja. Tapi segala sesuatu yang kita semacam mengambil untuk diberikan dalam kehidupan modern kita sebenarnya cenderung mengurangi bahkan beberapa fundamental ini kita sudah melihat. Biarkan aku pergi ke depan dan membuka satu Program lainnya, holloway.c. Jadi ini juga, adalah sesuatu yang Anda tidak harus benar-benar tahu. Bahkan tidak ada staf atau aku bisa mungkin memikirkan hal ini dengan melihat karena ini adalah kode seseorang yang disampaikan kepada apa historis dikenal sebagai dikaburkan C kontes, di mana Anda menulis sebuah program yang mengkompilasi dan berjalan tetapi begitu sialan samar ada manusia yang dapat memahami apa itu akan dilakukan sampai mereka benar-benar menjalankannya. Jadi memang, jika Anda melihat ini kode, saya melihat sebuah tombol. Saya melihat utama. Saya melihat ini menyiratkan tanda kurung siku semacam array. Apakah ada yang ingin menebak apa Program ini benar-benar tidak jika saya menjalankan Holloway? Ya. OK. Well done. Jadi hanya staf dan aku tidak tahu tahu apa hal-hal ini. Dan sekarang akhirnya, biarkan aku pergi ke depan dan membuka satu program lainnya. Ini satu - lagi, kita akan membuat kode sumber tersedia online - satu ini hanya jenis cukup untuk melihat. Semua yang mereka lakukan adalah menekan ruang bar cukup sedikit. Tapi ini adalah kode nyata. Jadi, jika Anda pikir itu cukup, jika kita benar-benar menjalankan perintah ini di prompt, akhirnya Anda akan melihat bagaimana kita mungkin melakukan hal-hal seperti ini. Jadi kita akan meninggalkan Anda pada catatan dan melihat Anda pada hari Rabu. [MUSIC PLAYING] SPEAKER 2: Pada CS50 berikutnya, TF tahap pemberontakan. SPEAKER 3: Itu dia. Dapatkan dia! [MUSIC PLAYING]