[Powered by Google Translate] DAVID J. Malan: Baiklah, ini adalah CS50, dan ini adalah
mulai dari dua minggu.
Terima kasih.
Mari kita mulai di sini dengan panggilan telepon.
Aku akan menghubungi 617-BUG-CS50.
CS50: Ini adalah CS50.
Untuk Boy Shuttle, tekan 1.
Untuk memulai, tekan 9.
DAVID J. Malan: Jadi dia mengatakan untuk Boy Shuttle, tekan 1.
Jadi kita akan tekan 1.
CS50: Apa asal Anda?
Untuk quad, tekan 1.
Mather, tekan 2.
Boylston, tekan 3.
Lamont, tekan 4.
Mem Hall, tekan 5.
Untuk memulai, tekan 0.
DAVID J. Malan: Kami akan tekan 1 untuk quad.
CS50: shuttle selanjutnya daun ini sangat menit pada jam 1:10, dan
kemudian pada 1:20 PM, 1:30, 1:40 PM.
Ini adalah CS50.
>> DAVID J. Malan: Jadi ini adalah suara CS50 itu.
Dan itu adalah contoh jenis-jenis proyek akhir, untuk
Misalnya, Anda bisa menggigit ke arah
akhir semester.
Misalnya, shuttleboy.cs50.net yang ada -
sebenarnya sebuah proyek yang saya pertama kali menulis setelah mengambil CS51
kembali ketika saya adalah seorang sarjana.
Dan inspirasi di sini adalah waktu itu, semua yang mereka miliki adalah
jadwal bus shuttle dicetak, dan tidak ada
gagasan mencari hal-hal online.
Dan jadi saya semacam merpati dalam waktu satu minggu, dituangkan melalui
dicetak jadwal, dan porting ke sebuah program komputer.
Pada saat itu, program komputer kebetulan ditulis
di C. Dan Anda benar-benar berlari dengan Boy Shuttle mengetik pada
berkedip meminta seperti kita sudah melakukan sejauh ini.
Tapi selama bertahun-tahun, itu berkembang menjadi instan
pesan bot.
Ini berkembang baru-baru ini ke website ini, menjadi
SMS-alat berbasis, serta menjadi alat ini berbasis suara.
Dan ini mengisyaratkan berbagai hal yang dapat Anda
lakukan untuk diri sendiri pada akhir semester.
>> Misalnya, ada, versi SMS Boy Shuttle terjadi
untuk beroperasi sebagai berikut.
Jika, pada ponsel Anda, Anda mengirim pesan teks ke 41.411 dan
kemudian mengirim sboy simbol khusus, untuk Boy Shuttle,
diikuti oleh A dan B, di mana A adalah asal-mula, dan B adalah
tujuan -
misalnya, Boylston Ruang Quad -
apa yang Anda harus kembali dalam waktu beberapa detik adalah teks
pesan dari Boy Shuttle memberitahu Anda persis kapan
angkutan mendatang adalah, dari titik bahwa A akan bahwa
titik B.
Dan ini adalah contoh yang lebih umum apa yang dikenal sebagai
menggunakan API.
>> Jadi misalnya, ini di sini hanya shuttleboy.cs50.net, yang
aktual berbasis web inkarnasi ini.
Namun data yang menggarisbawahi aplikasi ini dan lainnya yang CS50
telah mengembangkan semua terkena semua orang di sini dalam bentuk
API, aplikasi antarmuka pemrograman.
Dan itu hanya cara mewah untuk mengatakan bahwa orang-orang seperti kita di
Internet dan lain-lain telah menghabiskan beberapa waktu menciptakan
perangkat lunak yang dapat Anda gunakan untuk mengambil data dari kami dan
kemudian membangun aplikasi Anda sendiri di atas
itu kumpulan data.
Jadi misalnya, ini Boy Shuttle API halaman di sini, yang
kebetulan di, manual CS50 dasarnya dokumen
bagaimana Anda bisa pergi tentang meminta CS50 server untuk data.
Misalnya, jika Anda terbiasa dengan file CSV, koma
dipisahkan nilai-nilai, ini hanya semacam cepat dan kotor
Excel seperti file.
Jadi Anda dapat meminta Boy Shuttle untuk semua data pada semua
rumah dan mereka koordinat GPS, dan Anda akan mendapatkan
kembali, pada dasarnya, sebuah spreadsheet seperti itu yang
Anda kemudian dapat membaca ke dalam program Anda sendiri dan kemudian
menghasilkan hasil, seperti Boy Shuttle sendiri
kebetulan lakukan.
Bagi mereka, representasi data yang lebih akrab lebih modern
termasuk JSON, JavaScript Object Notation.
Sesuatu akan datang kembali kepada Anda menuju
akhir semester.
>> Tapi sekali lagi, ini hanya salah satu dari beberapa API sendiri CS50 itu.
Dan hal yang menarik adalah sekarang, hari ini, Facebook dan
Twitter dan Google dan cukup banyak setiap situs populer di luar
ada memiliki semacam API, yang berarti jika Anda membaca
dokumentasi di situs web mereka, Anda mendaftar untuk
akun, maka Anda dapat mulai menulis perangkat lunak di atas
apapun alat atau data yang ada perusahaan menyediakan.
Dan jadi salah satu rekan kita sendiri mengajar beberapa tahun yang lalu
menulis versi Mac ini.
Jadi pada link berjudul Mac di sini di kiri atas, Anda dapat benar-benar
download widget Mac OS yang berjalan pada Mac Anda sendiri untuk melakukan
sama macam hal.
Jadi itu semua tentang membangun di atas set data seperti ini.
Tapi lebih pada bahwa menjelang akhir semester.
>> Jadi mari kita menyelam dengan cepat nyata untuk bug, hanya untuk mendapatkan jenis
hal menghangat saat ini, dan berpikir kembali pada beberapa
hal yang kita melihat pekan lalu.
Secara khusus, biarkan aku pergi ke depan dan menarik, katakanlah,
ini contoh di sini.
Buggy1.c, ini tersedia di website ini saja kalau kau
ingin men-download dan melihat-lihat sendiri.
Tapi mari kita tampilannya di sini pada program ini cukup singkat, dan hanya
rekap super cepat dari beberapa blok bangunan dasar yang
kita benar-benar akan hanya mulai mengambil untuk diberikan.
>> Jadi hal-hal biru, di baris 1 sampai 9, hanya
softball pertanyaan.
Jadi ini hanya komentar.
Mereka tidak memiliki makna fungsional.
Tapi mereka komentar dalam arti bahwa mereka mencatat bahwa
Aku, manusia, dibuat untuk diri sehingga dalam kuliah dan setelah
kuliah, saya benar-benar bisa mengingat apa program ini
tidak tanpa harus membacanya baris demi baris dan
menciptakan sejarah dalam pikiran saya.
Apalagi, jika saya menyerahkan program ini kepada orang lain seperti
Anda, itu jauh lebih jelas bagi Anda, karena komentar seperti ini,
program apa yang benar-benar melakukan, atau setidaknya apa yang
Program yang seharusnya melakukan.
Apakah atau tidak itu benar adalah masalah lain sama sekali.
Sekarang, di C, dengan multi-line komentar, ingat bahwa pada baris
satu di sini adalah simbol sihir, / *.
Artinya di sini datang awal komentar.
Dan ada lagi yang penting sampai Anda mencapai akhir terminator,
yang * /, sebaliknya.
Jadi fakta bahwa saya memiliki 80-beberapa bintang yang aneh di sini dari
kiri ke kanan benar-benar hanya sebuah detil estetika.
Ini memiliki makna fungsional.
>> Sekarang bagaimana dengan jalur 11?
Apa yang dilakukan ini dalam istilah awam?
Apa itu?
HADIRIN: Termasuk standar.
DAVID J. Malan: OK, baik.
Jadi itu termasuk perpustakaan stdio.h.
Jadi apa artinya?
Nah, di dalam file tersebut, stdio.h, adalah sejumlah besar
Fungsi deklarasi -
yaitu, kode yang orang lain menulis.
Dan contoh sempurna dari fungsi yang dideklarasikan di
stdio.h adalah -
yang favorit sekarang?
Jadi printf, salah satu yang paling umum digunakan, tentu
sejak dini, dari perpustakaan yang ada.
Jika saya mengecualikan bahwa baris kode, dentang akan berteriak
padaku sesuatu tentang menggunakan simbol dideklarasikan.
Sesuatu dideklarasikan mungkin kata kunci, karena
kami belum memberitahu compiler apa yang terlihat printf
seperti kecuali kita termasuk garis itu.
Dan lebih turun ke bumi, benar-benar, apa garis yang katakan adalah
membuka file, stdio.h, di mana pun pada server
hard drive, atau hard drive alat, dan copy-paste itu
sana ke file saya, tanpa saya
harus melakukannya secara manual.
>> Sekarang, setelah kami datang ke sini untuk main, sebelum lama kita akan mulai
menggoda terpisah apa int dan apa void.
Tapi untuk saat ini, mari kita lihat pada tiga baris
berjarak 17 15 melalui.
Hal ini di sini saya mengklaim sebagai kereta.
Baris 7 dalam komentar saya mengatakan "Harus mencetak 10
tanda bintang tetapi tidak "Kenapa. hal ini tidak mencetak, pada kenyataannya,
10 bintang seperti itu?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Tepat.
Jadi melihat bahwa kita mulai menghitung dari 0.
Dan ini sebenarnya adalah sebuah konvensi di program dan
ilmu komputer pada umumnya, mulai menghitung
dari 0, bukan 1.
Dan ini benar-benar hanya berasal dari fakta bahwa, untuk
Misalnya, ketika kita memiliki delapan orang di atas panggung, saat
tidak ada yang mengangkat tangan mereka, mereka
semua nol efektif.
Dan jadi itu hanya semacam konvensi komputer sehingga,
Oleh karena itu, untuk mulai menghitung dari 0.
Jika itu jumlah terendah yang dapat mewakili dalam biner.
>> Jadi di sini kita sudah mulai menginisialisasi i ke 0.
Kami telah menetapkan i sama dengan 0.
Tapi kemudian saya membuat kesalahan ini di sini, mengatakan saya kurang dari atau
sama dengan 10.
Tapi jika Anda berpikir bahwa melalui, jika saya mulai dari 0 dan kemudian saya pergi
sampai dengan 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, aku benar-benar akan
mencetak 11 bintang untuk layar, karena saya sudah naik
ke dan sama dengan 10.
Jadi memperbaiki mudah di sini kemudian adalah apa?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Hanya mengubahnya menjadi kurang dari.
Jika Anda benar-benar ingin, Anda bisa melakukan ini.
Tapi secara umum, yang disukai.
Dan sehingga mulai menghitung dari 0 hanya sesuatu yang Anda harus
biasanya terbiasa.
Sekarang, bagaimana dengan ini membangun keseluruhan dalam dan dari dirinya sendiri?
Ini 15 baris demarks untuk loop.
Jadi untuk tidak fungsi.
Ini hanya sebuah pernyataan.
Ini adalah membangun perulangan, seperti kita lihat di Scratch.
Dan itu memiliki tiga bagian.
Perhatikan bahwa ada bagian pertama
sebelah kiri dari titik koma.
Ada bagian tengah di antara dua titik koma.
Dan kemudian ada bagian kanan ke kanan
dari koma kedua.
Sekarang, yang pertama ini melakukan apa?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Kembali sana?
Ya?
HADIRIN: Inisialisasi.
>> DAVID J. Malan: Inisialisasi.
Jadi apa artinya ini?
Kami telah mendeklarasikan sebuah variabel yang disebut i.
Ini adalah tipe int, karena saya sudah ditentukan int i.
Dan aku menginisialisasi i dengan nilai 0.
Jadi apa ini benar-benar katakan?
Ini secara efektif berkata kepada komputer hey, memberi saya cukup
memori, RAM yang cukup, agar sesuai nomor, dan kemudian menempatkan
angka 0 dalam sepotong RAM.
Dan sebagai samping, seberapa besar adalah int biasanya, setidaknya dalam
alat?
HADIRIN: 32 bit.
DAVID J. Malan: 32 bit.
Jadi itu berarti memberi saya 32 bit, atau dikenal sebagai 4 byte,
dan menempatkan 0 nilai di dalamnya, yang cukup mudah karena
itu hanya berarti mengatur semua bit ke 0.
>> Jadi sekarang, bagian kedua di sini adalah kondisi.
Dan kondisi, seperti namanya, adalah apa yang diperiksa
lagi dan lagi dan lagi, apakah itu benar atau salah.
Jadi ini hanya mengatakan melakukan baris kode berikut -
yaitu jalur 16, karena itulah satu-satunya indentasi
bawah -
asalkan i adalah kurang dari 10.
Dan setelah setiap iterasi melalui loop ini, lakukan
incrementation, yang dalam hal ini adalah i + +.
Sekarang, tidak harus i + +.
Ini bisa menjadi i -.
Tapi jika saya melakukan ini, apa perilaku akan
untuk program ini?
HADIRIN: Ini akan menjadi infinite loop.
DAVID J. Malan: Ini akan menjadi semacam loop tak terbatas,
kecuali kita beruntung setelah 2 negatif miliar atau lebih.
Mungkin hal ini akan membungkus, hanya dengan sifat yang terbatas
jumlah bit yang kita telah dialokasikan untuk int.
Tapi itu pasti akan iterate jauh lebih dari 10 dan
pasti lebih dari 11 kali di sini.
>> Dan sekarang, hanya sebagai samping, menyadari bahwa i + + dan i -
benar-benar hanya sintaksis gula.
Ini hanya notasi singkat untuk apa yang sedikit lebih
eksplisit ditulis sebagai berikut:
i = i + 1.
Yang identik dengan i + +.
Itu hanya semacam tampak cantik untuk mengatakan i + +.
Ini lebih ringkas, lebih mudah dibaca.
Dan sehingga sebagian besar orang melakukan itu sebagai gantinya.
Tapi ini adalah identik secara fungsional kepada
apa yang kita hanya melihat.
Jadi singkatnya, perbaikan cepat di sini adalah hanya untuk mengatakan saya iterate
dari 0 semua jalan sampai dengan kurang dari 10.
Dan kemudian kita memang akan mendapatkan 10 bintang.
>> Jadi mari kita coba ini.
Mari saya membuka terminal di bagian bawah.
Biarkan aku pergi ke direktori bahwa ini adalah masuk
Dan aku akan mengkompilasi secara manual dengan dentang untuk saat ini.
Dan aku akan mengkompilasi ini sebagai buggy1.c, Enter.
Dan sekarang buggy1, mengapa tidak ada berkas atau direktori
disebut buggy1?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Ya.
Jadi itu benar-benar disebut a.out.
Jadi ingat jika Anda hanya menjalankan dentang, di mana dentang adalah
compiler, dan Anda tidak menentukan nama yang ingin Anda
berikan untuk program anda, itu akan default a.out.
Jadi memang jika saya lakukan ls -
oops.
Dan saya tidak - masalah hitam-putih beberapa
Anda dihadapkan telah diperbaiki.
Tapi biarkan aku melakukan ini.
Di sana kami memiliki a.out di sisi kiri ada.
Jadi kita harus menjalankan a.out bukan buggy1.
>> Jadi biarkan aku pergi ke depan dan melakukan hal ini.
/ A.out., Enter.
Dan aku tampaknya tidak melakukan apa?
HADIRIN: Simpan.
DAVID J. Malan: Simpan file saya.
Sehingga mudah dipecahkan dengan memukul S Kontrol, atau pergi ke
File, Save, seperti di sebagian besar program.
Biarkan aku pergi ke sini, membersihkan layar, jalankan lagi.
Dan masih ada bug.
Jadi apa yang sedang terjadi -
HADIRIN: Anda tidak mengkompilasi.
DAVID J. Malan: Ah, baik.
Saya tidak compile.
Seperti idiot, aku melihat kode untuk melihat apa yang salah.
Jadi dentang buggy1.c, sekarang a.out.
Dan Fiuh, disimpan.
>> Sehingga terlihat agak jelek karena tidak ada baris baru
di mana saja dalam program.
Tapi sekali lagi, itu hanya sebuah detail estetika.
Dan setidaknya jika kita menghitung mereka keluar, kita harus
sekarang melihat 10 bintang tersebut.
Nah, bagaimana dengan contoh pemanasan kedua?
Jadi dalam buggy2, saya mengklaim bahwa versi ini juga, akan mencetak
10 bintang, satu per baris.
Jadi saat ini, saya memiliki karakter baris baru, hanya untuk membuat
sedikit lebih cantik hal.
Tapi bukannya apa yang saya dapatkan adalah ini.
Jadi biarkan aku melakukan buggy2.c dentang, Enter.
Sekarang itu lagi disebut a.out.
Enter.
Saya hanya melihat satu baris baru, hanya garis baru yang sangat terakhir yang
bergerak cepat saya ke baris berikutnya.
Namun jelas saya sudah mencetak *, maka baris baru,
*, Maka baris baru.
Tapi apa bug di sini?
Ya?
HADIRIN: [Tak terdengar].
>> DAVID J. Malan: Tepat.
Jadi tidak seperti beberapa bahasa, seperti Python, di mana indentasi
sebenarnya memiliki makna fungsional, dalam
bahasa seperti C -
seperti yang akan kita lihat, PHP, JavaScript -
indentasi benar-benar hanya untuk kepentingan manusia '.
Jadi fakta bahwa saya telah menjorok baris 16 dan 17 tampak hebat,
tetapi tidak memiliki makna fungsional sini.
Jika saya ingin kedua saluran untuk mengeksekusi sebagai bagian dari untuk
lingkaran, maka saya harus menyertakan mereka dalam kurung kurawal dengan melakukan hal ini.
Anda hanya dapat memotong sudut itu dan menghilangkan kurung kurawal jika
apa yang terjadi?
HADIRIN: Hanya satu baris.
DAVID J. Malan: Hanya satu baris.
Jadi itu hanya semacam semacam bagus detail sintaks sehingga
Anda tidak membuang waktu menulis tiga baris, dua di antaranya adalah
kurung kurawal, hanya untuk menulis satu baris kode.
Tapi jika Anda memiliki dua atau lebih baris, kita
memang perlu melakukan hal ini.
>> Jadi sekarang biarkan aku simpan ini.
Biarkan aku pergi ke depan dan kembali menjalankan dentang.
Kemudian biarkan aku jalankan kembali a.out, dan sekarang saya mendapatkan mereka satu per baris.
Sekarang, a.out lagi adalah jenis nama bodoh untuk sebuah program.
Bagaimana saya bisa tahu dentang untuk benar-benar memberi saya nama file
yang lebih user-friendly, seperti buggy2 sendiri?
Sedikit lebih jelas?
HADIRIN: [Tak terdengar].
DAVID J. Malan: OK, jadi saya benar-benar dapat mengambil sangat
user-friendly pintas dan hanya menulis membuat buggy2.
Saya tidak menentukan c dalam kasus ini., Dan tekan Enter.
Dan apa yang membuat dilakukannya itu mengkompilasi buggy2.c untuk saya oleh
meminta dentang untuk melakukannya.
Secara khusus, itu panggilan dentang, berjalan dentang menggunakan cara yang lebih
argumen baris perintah atau switch daripada aku benar-benar membutuhkan.
Pada waktunya, kami akan datang kembali untuk apa semua ini berbagai
ekspresi ditulis dgn tanda penghubung samar berarti.
Tapi untuk saat ini, itu hanya menyelamatkan saya kesulitan
harus mengingat dan harus mengetikkan semua orang
berbagai ekspresi ditulis dgn tanda penghubung.
Dan terbalik itu pada akhirnya adalah
bahwa sekarang saya memiliki buggy2.
Jika saya ingin melakukan ini secara manual, meskipun, saya
justru bisa melakukan hal ini -
dentang-o buggy2 dan kemudian buggy2.c.
Dan itu sama akan memberi saya sebuah file yang bernama buggy2.
>> Jadi singkatnya, dentang itu compiler.
Membuat hanyalah alat user-friendly bahwa kita akan menggunakan lebih
dan banyak lagi, karena hanya mulai
menyederhanakan hal-hal untuk kita.
Dan kita kembali 0, terakhir.
Untuk saat ini, hanya karena, tapi kami akan mulai menggoda bagian itu
hari ini dan pada hari Rabu.
Setiap pertanyaan tentang semua ini?
Ya?
HADIRIN: [Tak terdengar]
ls dalam tanda kutip sana?
DAVID J. Malan: OK.
Ketika saya mengetik ls dalam tanda kutip, yang saya melakukan sihir
belakang layar untuk memperbaiki bug.
Aku lupa, seperti kita telah memberitahu banyak dari Anda pada
papan diskusi, untuk melakukan -
kita akan melakukan ini sekarang - sudo yum-y update appliance50.
Whoops, bahwa yang dieja benar.
Jadi alat seperti sistem operasi.
Ini menjalankan sistem operasi yang disebut Fedora.
Dan sekarang karena koneksi internet lambat, saya sudah
benar-benar disemprot itu.
Jadi menjalankan yum update sudo, seperti yang kita katakan Anda lakukan dalam
sejumlah masalah, pada dasarnya seperti menjalankan update otomatis
di Mac OS atau Windows.
Dan alasan untuk menjalankan ini di awal dari
set masalah adalah karena ketika kami menciptakan alat, saya
kacau, dan saya sengaja membuat semua program Anda terlihat
hitam pada layar hitam, yang mengapa Anda tidak melihat mereka
secara default.
Tapi versi terbaru dari alat perbaikan ini.
Dan aku akan memperbaikinya selama istirahat setelah saya memiliki Internet
konektivitas.
>> Jadi tanda kutip hanya menyembunyikan kesalahan saya, sangat diam-diam,
rupanya.
Pertanyaan lain?
Ya?
HADIRIN: Dimana tidak membuat berasal?
[Tak terdengar]
DAVID J. Malan: Pertanyaan yang bagus.
Dimana tidak membuat berasal?
Ini adalah program Linux yang telah ada selama bertahun-tahun, panjang
sebelum CS50.
Dan dilengkapi dengan sistem operasi seperti Fedora.
Itu tidak datang dari perpustakaan CS50.
Bahkan, satu-satunya hal yang berasal dari perpustakaan CS50
sejauh ini, yang kita lihat, adalah GetString, GetInt, semua
Dapatkan mereka fungsi, dan string kata, dan beberapa
sejauh, kata bool.
Tapi kita akan menggoda bahwa selain ketika kita menyelam ke CS50
alatnya sendiri.
>> Jadi ya, satu pertanyaan lagi di sini.
HADIRIN: Ketika Anda mengatakan membuat dan kemudian kereta, bagaimana
komputer tahu [Tak terdengar]?
DAVID J. Malan: Pertanyaan yang bagus.
Jadi, ketika Anda hanya menjalankan make buggy1 atau membuat buggy2, bagaimana
tidak membuat tahu?
Jadi secara default, jika Anda mengetikkan make buggy1, membuat penampilan untuk
file bernama buggy1.c.
Dan kemudian mengeksekusi perintah dentang yang sesuai,
sehingga mengesampingkan default file output yang disebut a.out.
Padahal, jika kita melihat apa yang membuat, apa -
mari kita berhenti ini.
Jika kita melihat apa yang membuat benar-benar melakukan, membuat buggy2,
itu sudah up to date.
Jadi biarkan aku menghapus perintah rm, yang
Program yang saya tulis sebelumnya.
Mengetik Y-E-S untuk mengkonfirmasi bahwa saya ingin menghapusnya.
Jika saya lakukan sekarang membuat, perhatikan bahwa dalam baris yang sangat panjang,
ada hal terakhir di sini,-o buggy2.
Make semua lakukan adalah melewati argumen itu, sehingga untuk berbicara, untuk
Clang, sehingga saya tidak perlu mengetik sendiri.
>> Baiklah, jadi beberapa cepat administrasi
pengumuman.
Jadi untuk bagian, yang secara resmi dimulai ini datang
Minggu, Anda akan selalu ingin membawa, jika
Anda memiliki satu, sebuah laptop.
Jika Anda tidak memiliki sebuah laptop, jangan menjangkau kepada saya oleh
menjatuhkan saya email.
Dan kita akan mengetahui alur kerja.
Apa yang umumnya Anda akan menemukan di bagian adalah bahwa mereka adalah bagian
konseptual, bagian tangan-on.
Kami secara khusus akan menggunakan bagian dari pertanyaan, bagian dari
minggu ini masalah set, berjalan melalui beberapa
konseptual materi dari kuliah.
Dan itu semua di set masalah saat ini.
Dan kita juga akan menyelam ke dalam beberapa tangan-kegiatan, kadang-kadang
yang akan diperlukan untuk diserahkan, kadang-kadang
yang tidak akan.
Misalnya, minggu pertama ini, mereka dimaksudkan hanya sebagai
latihan pemanasan.
Dan Anda akan menemukan bahwa masalah-masalah yang benar-benar hanya itu.
Mereka dimaksudkan untuk menjadi cukup kecil, tetapi belum tentu
sepele program untuk menulis, yang belum tentu
menarik dalam dan dari diri mereka sendiri, tetapi baik kesempatan untuk
berlatih dengan sintaks, dengan fungsi baru, dalam kenyamanan sebuah
bagian di mana Anda memiliki beberapa teman sekelas Anda hadir sebagai
serta TF Anda.
>> Dan apa yang akan kita lakukan dari waktu ke waktu adalah menggunakan alat yang disebut CS50 Spaces,
dimana bukan hanya menggunakan Appliance CS50, Anda akan
bukannya pergi ke halaman web di browser, di mana Anda akan dapat
untuk menulis kode dalam jendela browser saat bagian.
Dan kemudian jika Anda memilih dalam, rekan mengajar Anda kemudian dapat menunjukkan
apa pun yang Anda mengetik pada layar Anda di browser Anda
window sampai di depan kelas, baik secara anonim atau
publik, sehingga ia kemudian dapat berjalan melalui dengan
teman sekelas Anda apa yang Anda lakukan dengan baik, apa yang Anda tidak melakukannya dengan baik.
Dan lagi, yakinlah semua ini dapat dengan baik anonim.
Tapi itu akan menjadi kesempatan bagus untuk lebih
interaktivitas dari sesuatu seperti kuliah memungkinkan.
>> Sementara itu, kita akan memiliki hal-hal ini disebut super
bagian, yang adalah opsional, tetapi terbuka untuk semua orang di
kelas, sehingga Anda dapat melakukan ini lebih kolektif untuk
Masalah menetapkan satu.
Berikut jadwal.
Hal ini juga diposting pada homepage di cs50.net.
Perhatikan bahwa akan ada hacker khusus
satu besok sore.
Dan kami akan memfilmkan satu hari ini dan besok dan satu posting mereka
online dalam waktu 24 jam.
Jadi jika Anda tidak dapat membuat salah satu kali, tidak perlu khawatir.
Dan lagi, jadwal yang online sekarang di cs50.net.
>> Dalam hal sectioning sendiri, Anda harus mendapatkan suatu
email menginstruksikan Anda untuk pergi ke homepage saja untuk menemukan
keluar bagian Anda.
Jika kehidupan telah berubah dan Anda perlu mengubah bagian Anda,
tidak masalah.
Kembali ke URL yang sama, cs50.net/section, tunggal,
dan Anda akan mengisi formulir yang sama sehingga Anda dapat
kemudian memberi kita preferensi Anda.
Dan kami akan menindaklanjuti pada akhir minggu untuk apa yang kita bisa
mengakomodasi.
Pekan lalu, ingat bahwa kami mengusulkan menggunakan CS50 Bahas,
kursus ini pembahasan alat, dalam kuliah.
Jadi kami memiliki 40 pertanyaan yang diajukan dan
menjawab selama kuliah.
Jadi tampaknya bekerja dengan baik, jadi kami akan terus
mencoba untuk melakukan hal ini.
Jika, selama kuliah, Anda tidak hanya merasa nyaman penggalangan
tangan Anda, tidak masalah.
Pergi ke cs50.net/discuss, posting di sana, dan salah satu pengajaran kami
fellows baik akan menjawabnya secara elektronik atau meningkatkan mereka
tangan atas nama Anda anonim untuk bertanya, tergantung
pada sifat dari pertanyaan.
Dan dalam hal umpan balik, umumnya psets akan
kembali dalam waktu seminggu.
Karena memerlukan sedikit waktu untuk bagian untuk mencapai
kesetimbangan, pset pertama, 0 dan 1, akan menjadi sedikit
tertunda karena hal menetap.
Tapi menantikan untuk itu dalam minggu-minggu yang akan datang.
>> Baiklah, jadi biar memakai serius saya
suara untuk sesaat.
Jadi ini sebenarnya adalah iklim yang menarik untuk menjadi
memiliki diskusi ini, apa dengan semua hal-hal lain
terjadi di dalamnya kampus terkait.
Tapi CS50 tentu memiliki sejarah khusus ini
topik, dalam sebanyak setiap tahun, kursus ini, bagi banyak
tahun, Ad-Dewan sekitar 3% dari kelas.
Tahun ini terbaru, 2011, CS50 Ad-Boarded 35 siswa.
Ini bukan, saya pikir, karena kurangnya kejelasan.
Sadarilah bahwa dalam silabus mata kuliah tersebut, ada halaman
pernyataan yang menjelaskan di mana garis.
Pernyataan yang sama diulang pada setiap salah satu
Masalah set di halaman satu.
>> Jadi saya menyebutkan hari ini benar-benar hanya untuk membuat
sadar ini orang.
Dan kita sudah mencoba hal yang berbeda.
Dan apa yang saya pikir kita akan lakukan hari ini hanya mengambil waktu sejenak untuk
benar-benar melihat beberapa kasus masa lalu yang telah datang.
Daripada menjaga rahasia sedikit kotor, sebenarnya
menunjukkan apa yang siswa lakukan dan bagaimana kita telah mendeteksi
dan benar-benar apa motivasi menyeluruh adalah untuk
bahkan memiliki percakapan ini.
Jadi dengan mengatakan bahwa, garis dasarnya adalah ini -
per silabus, Anda dipersilahkan, anda dianjurkan, untuk
berbicara dengan teman sekelas.
Itulah seluruh tujuan memiliki ini kolaboratif
kantor jam di Annenberg dan mendorong orang untuk
tugas akhir untuk bekerja sama.
Tapi garis ditarik ketika tiba saatnya untuk benar-benar menulis
Anda akhir solusi.
Berbicara dalam bahasa Inggris, benar-benar baik, berbicara dalam kode semu,
benar-benar baik-baik saja.
Email teman sekelas pset Anda, membiarkan mereka melihat lebih
layar sebagai tangan terus mengetik,
melewati garis serta.
Jangan melihat ke silabus untuk garis tertentu.
>> Tapi hanya untuk melukis gambaran tentang bagaimana hal ini sayangnya
kenyataannya, menyadari bahwa ada banyak website di luar sana yang
memiliki solusi dari kelas ini dan kelas lainnya.
Kenyataan bahwa Anda atau 3% dari Anda tahu bahwa ini ada
Artinya, kita tahu bahwa ini ada.
Fakta bahwa ada website seperti ini di mana Anda
dapat membayar seseorang untuk benar-benar melakukan set masalah Anda - ini adalah
kasus aktual yang muncul tahun lalu.
Ini adalah sebuah situs web disebut odesk.com.
Dan Tim adalah nama orang di sini yang posting di
website ini dan meminta seseorang untuk melakukan pset nya 7 di
kasus ini.
Nah, odesk.com sangat Google-mampu, dan kami juga adalah
sangat baik Googling.
Di sini, juga ada situs - dan yang satu ini agak
mengerikan, terus terang.
[TERTAWA]
DAVID J. Malan: Yang lucu tentang situs ini adalah jika
Anda membaca halaman About, mereka berbicara tentang perusahaan mereka
budaya dan bagaimana layanan pelanggan mereka nomor satu
prioritas, untuk memastikan bahwa Anda mendapatkan tugas
berbalik tepat waktu.
>> Tapi dalam keseriusan semua, sekali lagi, fakta bahwa situs tersebut
ada, menyadari bahwa kita, juga, adalah menyadari
jenis situs.
Dan untuk memberikan rasa apa bentuk ini umumnya
membutuhkan, kita umumnya tidak memiliki skandal besar di mana orang
bekerja sama pada setiap jenis skala besar, melainkan
itu ini larut malam saat-saat kelemahan, di mana Anda memiliki begitu
banyak yang harus dilakukan, itu 4:00 AM, Anda lelah, dan Anda
berpikir untuk diri sendiri, baik, saya hanya melihat saya
teman sekamar atau kode teman saya atau sejenisnya.
Dan manifestasi dari ini sayangnya melibatkan Mahasiswa
Sebuah sesuatu yang mengirimkan seperti ini dan mengirimkan Student B
sesuatu seperti ini, yang pasti, dalam komputer
kelas sains, adalah sangat mudah bagi para ilmuwan komputer
untuk mendeteksi dengan perangkat lunak.
Ini adalah satu lagi paradigma yang umum, di mana Anda sudah semacam
telah bekerja bersama seseorang, mungkin berbicara di
Inggris, baik-baik saja, pseudocode.
Tapi kemudian tiba saatnya untuk benar-benar menyerahkan, dan psets
hanya bisa ditukar melalui email atau Dropbox atau sejenisnya.
Namun dalam upaya untuk membuatnya kurang jelas bahwa ini adalah
apa yang telah terjadi, maka ini adalah apa yang disampaikan.
Ini juga, tidak melonjak sampai yang ditulis dengan baik potongan
perangkat lunak seperti kita harus benar-benar mendeteksi
macam hal.
Dan memang apa yang kita lakukan adalah menjalankan software yang membandingkan semua
tahun ini pengajuan terhadap semua tahun terakhir ini
pengiriman, terhadap segala sesuatu yang kita temukan di
Internet, terhadap setiap situs pekerjaan di luar sana.
Ini semua sangat otomatis.
Dan jadi kita lakukan ini benar-benar dalam keadilan besar untuk% 97 yang
benar-benar bekerja pantat mereka off dalam hal ini dan di lain
kelas dan meletakkan di semua upaya itu sehingga pekerjaan
mereka akhirnya menyerahkan adalah mereka sendiri.
Dan aku bisa terus untuk usia.
>> Ini hanyalah segelintir kasus tahun lalu.
Beberapa siswa mengajukan file-file identik untuk pset 2,
pset 3, 4 pset, pset 5, 6 pset, pset 9.
Dalam kasus ini, ini adalah kuis 0 dan tahun lalu, di mana dua
siswa disampaikan identik kalimat ini di antara banyak
orang lain, "Permintaan tipe -" titik, titik, titik.
Jadi bahkan di kelas 600 yang kita mendeteksi
pada disampaikan kuis.
Jadi singkatnya, ini - terus terang, aku benci memiliki semacam ini
percakapan - tapi ini benar-benar sebuah upaya yang disengaja
tahun ini untuk mencoba untuk menurunkan angka tersebut.
Karena meskipun kita mengatakan hal-macam hal setiap
tahun, saya pikir realitas telah berdiam di atasnya untuk beberapa
detik dari biasanya dan benar-benar hanya menunjukkan
bahwa apa yang mungkin tampak seperti, eh, bukan masalah besar, setidaknya
berpikir kembali ke saat tertentu, baik dalam keadilan untuk
diri sendiri dan teman-teman sekelas Anda di sini.
Jadi jika Anda pernah memiliki pertanyaan ke mana garis
adalah, silahkan saja menjangkau saya pribadi.
Tapi jawabannya selalu, benar-benar menekankan pada
menit terakhir, kas di hari akhir.
Atau jika masalah tidak memiliki apapun hari terlambat,
jujur, email saya secara pribadi.
Kami akan memikirkan sesuatu.
Tolong jangan menempatkan waktu Anda di sini di Harvard beresiko.
>> Sekarang, saya pikir kita harus meringankan suasana, jadi saya
termasuk ini sebagai slide berikutnya.
[TERTAWA]
DAVID J. Malan: Website ini adalah besar.
Saya benar-benar mendapat sedikit terganggu.
Ada satu ini.
Dan kemudian satu ini sangat mengagumkan.
Oke, jadi pikirkan itu kucing larut malam ketika membuat
keputusan tersebut.
Semua, hal-hal yang tepat sehingga kembali ke lebih menyenangkan dan kurang serius, seperti
kondisi.
>> Baiklah, jadi kami berbicara singkat tentang ini.
Ini adalah sesuatu yang mungkin cukup akrab dari
dunia Scratch.
Dan dalam dunia Scratch, kita memiliki kebutuhan ini kadang-kadang untuk
pergi membuat garpu di jalan.
Entah melakukan ini atau itu atau hal lain di sini.
Dan ketika kita ingin melakukan ini, kita bisa menggunakan, di C sekarang, ini jika
lain membangun.
Dan maka di sini kita memiliki ekspresi Boolean.
Misalnya, ekspresi Boolean sini, kita bisa OR
mereka bersama-sama, dalam arti bahwa kita memiliki kondisi ini ATAU
kondisi.
Kita bisa DAN mereka bersama-sama, dalam arti bahwa kita ingin
memeriksa kondisi DAN kondisi itu.
Dan di sini kita memiliki pernyataan switch sekarang, yang tidak begitu
mirip dengan yang sintaksis macam kondisi, tetapi
memungkinkan kita untuk melakukan setara dengan if, else if, else if, else
jika, dan sejenisnya hanya dengan pencacahan mereka kasus per kasus
oleh kasus per kasus.
Jadi kita melihat mereka terakhir kali.
Dan kemudian kita mulai menyentuh pada hal-hal seperti loop.
Kami melihat salah satu dari ini beberapa saat yang lalu.
Tapi ada konstruksi ini perulangan lainnya.
>> Misalnya, ini satu di sini.
Jadi sementara (kondisi), melakukan hal ini lagi dan lagi.
Jadi pada dasarnya, apa yang tampaknya berbeda antara
untuk loop dan loop sementara di sini?
Hal ini untuk loop dan ini while loop.
Ya?
Apa itu?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Baik.
Jadi sedangkan di untuk kondisi loop, ada jelas
lebih sintaks.
Ada inisialisasi ini, ada pembaruan ini.
Dalam beberapa saat loop, hanya ada kondisi ini.
Jadi sepertinya bahwa itu sedikit dikupas ke bawah versus untuk
loop, yang berarti jika kita ingin memiliki variabel dan kami ingin
memiliki incrementation, kita benar-benar harus
melakukan hal ini diri kita sendiri.
>> Jadi biarkan aku pergi ke depan dan membuka gedit.
Biarkan saya beralih ke alat.
Dan mari kita hanya melakukan sedikit contoh cepat yang
membedakan salah satu dari yang lain.
Dan di belakang pikiran saya di sini, saya harus mengatakan satu hal.
Saya secara khusus menyebutkan nama Tim.
Tim sebenarnya seseorang bahwa seorang siswa mencoba untuk menemukan untuk melakukan
mereka pekerjaan untuk mereka.
Kami tidak punya Tim di bagian tertentu.
Jadi menyadari, supaya aku diungkapkan mahasiswa, itu bukan mahasiswa.
Itu orang acak di Internet melakukan hal-hal
tahun lalu proxy.
Jadi kita menemukan bahwa, juga.
Jadi dalam hal ini di sini, biarkan aku pergi ke depan dan
membuka file baru.
File, New.
Ini memberi saya tab di sini.
Biarkan aku pergi ke depan dan simpan sebagai loop.c.
Biarkan aku pergi dan klik Save.
Dan kemudian di sini, mari kita pergi ke depan dan mulai menulis
# Include.
Biarkan aku zoom in
Sekarang kita akan melakukan int main (void).
Sekarang biarkan aku pergi ke depan dan lakukan untuk (int i = 0; i <
oh, 10; i + +).
Dan sekarang aku akan pergi ke depan dan jangan mencetak bintang yang saya
lakukan sebelumnya.
Dan kemudian pada akhir program ini, kami hanya akan
mencetak baris baru, hanya agar prompt saya
tidak terlihat semua berantakan.
return 0.
Tampak sintaksis benar?
Sejauh.
Jadi mari kita lihat.
>> Jadi biarkan aku tampilannya keluar, masuk ke jendela terminal saya.
Dan biarkan aku pergi ke depan dan menjalankan loop, karena saya menyebut
hal loop.c.
Jadi membuat lingkaran.
Sepertinya untuk mengkompilasi OK.
Biarkan saya menjalankan loop, dan sekarang Enter.
Dan tampaknya telah dicetak 10 bintang.
Jadi mari kita mengubah ini untuk beberapa saat loop dan melihat apa
jenis masalah yang kita tersandung.
Jadi bukannya ini, biarkan aku pergi di sini dan mengatakan sementara i adalah
kurang dari 10 -
biarkan aku menyingkirkan untuk loop.
OK, jadi kami memiliki beberapa masalah sudah.
Jadi kondisinya sama, tapi aku jelas hilang
inisialisasi.
Saya hilang incrementation.
Jadi apa yang harus compiler kemungkinan memberitahu saya ketika saya mencoba untuk
mengkompilasi program ini?
Ya?
HADIRIN: [Tak terdengar].
>> DAVID J. Malan: Baik.
Jadi itu akan mengatakan sesuatu seperti dideklarasikan - dalam hal ini
kasus, variabel i.
Dan memang, penggunaan undeclared identifier i.
Dan jadi ini sangat kontras dengan bahasa seperti PHP dan
Python dan Ruby, yang beberapa dari Anda mungkin familiar,
di mana Anda dapat hanya jenis mulai menggunakan variabel
mau tak mau dan tidak perlu khawatir tentang menyatakan mereka
eksplisit selalu.
Dalam C dan dalam bahasa seperti Java dan C + +, Anda harus
Super eksplisit.
Dan jika Anda ingin sebuah variabel yang disebut i, Anda harus memberitahu saya
apa variabel itu.
Jadi kita akan harus memperbaiki ini sebagai berikut.
Aku akan harus pergi di sini dan ketik int i, karena itu,
Saya telah mendeklarasikan variabel yang disebut i.
Sekarang, saya sudah melewatkan satu langkah.
Saya jelas tidak diinisialisasi, tapi mari kita lihat apakah itu di
Setidaknya merek berhenti dentang mengeluh.
Jadi biarkan aku remake program ini.
>> Baiklah, sekarang itu hanya mengeluh
untuk alasan yang berbeda.
"Variabel 'i' yang diinisiasi bila digunakan di sini." Baiklah, jadi
itu cukup eksplisit.
Diinisialisasi hanya berarti pengaturan itu sama dengan nilai.
Dan kami sudah tidak melakukan itu, jadi saya mencoba sama dengan 0.
Sekarang mari kita coba ini lagi dan kembali menjalankan dentang.
Disusun saat ini.
Dan aku akan menjalankannya.
Namun infinite loop besar tua, karena saya sudah melakukan
inisialisasi, saya sudah melakukan kondisi, tapi saya belum pernah melakukan
apapun incrementation.
Jadi bagaimana bisa saya lakukan incrementation?
Nah, dalam while loop, rasanya seperti aku akan memiliki
untuk melakukannya dalam loop, karena banyak seperti yang pertama
minggu contoh melakukan konstruksi perulangan, seperti dengan
kaus kaki dan dengan menghitung diri, kami harus melakukan
sesuatu di akhir, seperti kembali ke baris berikutnya.
Bagaimana jika saya pergi ke depan dan melakukan hal ini i + + di sini?
Mari kita bahkan tidak mengkompilasi ini.
Tangkap aku sudah.
Apa yang salah di sini?
HADIRIN: [Tak terdengar].
>> DAVID J. Malan: Jadi itu pasti tidak int.
Ini i.
Dan keriting kawat gigi, seperti sebelumnya,
indentasi tidak cukup.
Jadi sekarang saya telah membangun ini.
Jadi sementara saya adalah kurang dari 10, mencetak bintang,
maka kenaikan i.
Dan cara sementara karya loop bahwa segera setelah Anda menekan
bawah loop, yang dalam hal ini terlihat seperti baris 10,
itu akan kembali ke jalur 6, di mana titik
Kondisi akan diperiksa lagi.
Dan jika saya masih kurang dari 10, kami akan melakukan jalur 8 dan
kemudian 9, maka kita akan mencapai 10, dan kembali ke 6, lagi dan
lagi dan lagi dan lagi, asalkan i adalah kurang dari 10.
Jadi mari kita kembali jalankan make di sini.
>> Oke, kita telah menyusun apa-apa.
Mari saya kembali menjalankan loop.
Dan sekarang itu benar-benar tampaknya bekerja.
Jadi plus dan minus di sini?
Nah, sejauh ini ada sebenarnya bukan seluruh PLO -
sangat lucu.
Baiklah, itu adalah - ah, itu kecelakaan.
Baiklah, jadi mari kita kembali ke untuk loop.
Jadi untuk loop yang bagus karena mereka super eksplisit.
Dan meskipun mereka sedikit kikuk untuk menulis, itu
sangat kuat dan memungkinkan Anda untuk melakukan
beberapa hal sekaligus.
Sementara loop tampaknya tidak memiliki sejumlah besar nilai hanya
Namun, karena rasanya kita hanya perlu melakukan lebih banyak pekerjaan.
Kita harus meletakkan inisialisasi di sini, yang
memperbarui di sini, dan kita harus ingat untuk melakukan semua itu.
Jadi kita akan lihat pada saat itu loop sementara sebenarnya meminjamkan
diri untuk hanya konteks yang berbeda, data yang berbeda
struktur seperti daftar dan tabel hash, hal yang kita akan sampai ke
mid-semester.
Tapi untuk saat ini, tahu bahwa ada jenis ketiga yang dikenal sebagai do-
sementara loop.
Dan kami telah melihat sebentar ini.
Dan ini mungkin super membantu dengan pset 1.
Setiap kali Anda ingin melakukan sesuatu dan kemudian memeriksa apakah
pengguna bekerja sama, dan jika mereka tidak, melakukannya lagi, do-
sementara loop cocok untuk semacam itu logika.
Karena sebagai urutan dari atas ke bawah di sini menunjukkan,
yang secara harfiah berarti melakukan hal ini.
Dan melakukan ini lagi dan lagi, apa yang mungkin itu?
Mungkin itu berarti GetInt menelepon atau GetString dan kemudian
memeriksa nilai GetInt atau GetString dan kemudian berteriak
pada pengguna jika mereka tidak bekerja sama dengan meminta mereka
lagi dan lagi dan lagi.
Di mana Anda ingin melakukan sesuatu sekali,
kemudian memeriksa beberapa kondisi.
>> Jadi mari kita coba ini.
Biarkan aku benar-benar mengubah ini sekarang untuk loop do-while.
Dan aku akan pergi ke depan dan lakukan hal berikut.
Jadi melakukan hal berikut.
Mari kita lakukan int i = GetInt (), tetapi mari kita pertama memberitahu pengguna
apa yang harus dilakukan.
Jadi waktu yang sedikit berbeda ini.
"Beri aku sebuah int".
Jadi saya akan menggunakan printf untuk itu.
Dan sekarang aku akan pergi ke sini, dan aku akan melakukan hal ini
sementara saya adalah, katakanlah, lebih besar dari -
mari kita lihat, saya adalah, katakanlah, kurang dari 0, atau i adalah
lebih besar dari 10.
Dengan kata lain, saya ingin nomor dari 1 sampai 9, hanya
sewenang-wenang.
Jadi saya menggunakan ekspresi Boolean gabungan di sini untuk
pastikan bahwa i adalah kurang dari 0 atau lebih besar dari 10, di mana
kasus saya akan melakukan loop ini di sini lagi.
Jadi sekali lagi, lakukan ini -
sementara i adalah kurang dari 0 atau i lebih besar dari 10.
>> Jadi sekarang mari kita pergi ke depan dan melakukan hal ini setelah kami telah melakukan itu.
Mari kita hanya melakukan cek kewarasan cepat.
printf ("Terima kasih, saya adalah% d", i).
Jadi program ini sederhana meminta user untuk int,
membuat yakin itu dalam beberapa rentang, 1 sampai 9 inklusif,
dan kemudian terima kasih pengguna dengan mengingatkan mereka apa yang mereka hanya
mengetik, hanya sebagai cek kewarasan sedikit.
Tapi mari kita lihat apakah ini bekerja sebagaimana dimaksud.
Biarkan aku pergi kepala ke sini dan kembali menjalankan membuat loop.
Hmm.
"Penggunaan undeclared identifier 'i'". Itu aneh.
Saya pikir kami memutuskan bahwa.
Sama gejala tetapi kode yang berbeda.
Ya?
HADIRIN: [Tak terdengar] dalam dua, kita harus
[Tak terdengar].
>> DAVID J. Malan: Tepat.
Jadi ini benar-benar membawa kita ke topik yang dikenal sebagai ruang lingkup.
Ternyata C, sekali lagi, itu benar-benar membawa Anda secara harfiah.
Dan jika Anda melakukan sesuatu seperti ini di mana Anda mendeklarasikan int
dan kemudian menetapkan beberapa nilai, tapi Anda melakukannya dalam sebuah
sepasang kurung kurawal, apa C dilakukannya itu mengasumsikan bahwa Anda
hanya ingin orang-bit 32 yang dikenal sebagai i untuk tetap eksis dalam
konteks tersebut kurung kurawal, dalam konteks garis
6 sampai 9. Jadi saya dinyatakan, dan diberikan sebuah
nilai di baris 8, tetapi segera setelah Anda mendapatkan luar
jalur 9 di bawah penjepit keriting, saya tidak lagi
ruang lingkup, sehingga untuk berbicara.
S-C-O-P-E. Ini tidak lagi dalam konteks yang tepat.
Jadi sekarang tidak ada i, jadi seolah-olah kita bahkan tidak
menyatakan sama sekali.
>> Jadi apa yang memperbaiki maka untuk sesuatu seperti ini, jika
Alasannya adalah bahwa i dinyatakan dalam kurung kurawal, yang
ternyata buruk?
Di sini?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Ya.
Jadi kita bisa menginisialisasi luar.
Jadi biarkan aku pergi ke depan dan menghapus bagian deklarasi dimana
Saya menentukan jenis, dan biarkan aku melakukannya di sini.
Jadi sejalan 5, sekarang mengatakan "Beri aku sebuah int." Sebut saja i.
Perhatikan sejalan 9, saya tidak ingin melakukan hal ini, karena saya
sudah memiliki 32 bit.
Saya tidak ingin meminta komputer untuk
bit 32 yang berbeda.
Saya ingin menggunakan mereka 32 bit yang sama.
Dan sekarang karena saya dinyatakan di baris 5, itu masih legit
untuk menggunakannya di baris 11 dan baris 12.
>> Jadi saya mencoba untuk mengkompilasi ulang ini dan melihat
jika dentang berhenti berteriak.
membuat loop.
Jadi sekarang itu adalah "deklarasi implisit dari fungsi
'GetInt' tidak valid di C99 "Apa itu.?
Ya?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Ya.
Jadi sekarang bahwa aku benar-benar menggunakan GetInt, ini bukan sesuatu
yang hanya datang dengan C. Ini berasal dari CS50.
Jadi kita perlu ini di sini.
Dan biarkan aku kembali ke bawah cepat
di sini dan kembali jalankan make.
Oke, akhirnya.
Sekarang kita sudah diselesaikan itu dan kesalahan lainnya.
Sekarang saya menjalankan loop dan melihat apa yang terjadi.
"Beri aku sebuah int." Aku akan memberikan 11.
Aku akan memberikannya -1.
Aku akan memberikannya foo.
Aku akan memberikan 5.
Dan sekarang memang bekerja.
Tapi prompt berubah untuk alasan sini.
Mengapa isinya coba lagi salah satu kali tapi beri saya sebuah
int tiga kali lainnya?
Mengapa perilaku yang berbeda?
HADIRIN: Memberikan string.
DAVID J. Malan: Maaf?
HADIRIN: Anda memberikannya string.
DAVID J. Malan: Ya.
Jadi kami berikan itu string dalam usaha ketiga,
ketika saya mengetik foo.
Foo adalah string.
Ini jelas bukan sebuah int.
Dan cara yang CS50 telah menerapkan GetInt adalah bahwa kita
tidak memeriksa apakah ada sesuatu yang kurang dari 0 atau lebih besar dari 10
untuk Anda, karena bagaimana kita mengetahui terlebih dahulu apa
int yang Anda inginkan?
Tapi kita minimal dapat memeriksa untuk Anda, apakah pengguna setidaknya
ketik integer?
Dan jika mereka tidak, kita berteriak pada pengguna dengan mengetikkan "coba lagi" pada
layar.
>> Jadi sekarang kita memiliki program yang perulangan. Oke.
Sekarang, yang ini adalah semacam konstruk yang lebih baik?
Jadi ini adalah di mana hal-hal mulai mendapatkan sedikit berantakan, yang
kenyataan bahwa Anda harus ingat untuk mendeklarasikan variabel di sini
jika Anda ingin menggunakannya dalam beberapa
keriting kawat gigi dan luar.
Tetapi bahkan jika ini terlihat sedikit samar pada awalnya
sekilas, hanya lagi, mengingat logika sederhana.
Dalam rangka untuk menggunakan apa-apa di C, apakah itu fungsi atau
itu variabel, Anda harus memasukkannya jika fungsi
di beberapa perpustakaan, atau Anda perlu untuk mendeklarasikan.
Tapi sekarang Anda harus berhati-hati tambahan fakta bahwa
Anda menyatakan dalam lingkup yang tepat.
Kau tidak menempatkan terlalu erat dalam tanda kurung.
>> Jadi biarkan aku benar-benar memutar kembali.
Jika kita kembali ke kami misalnya dari sebelumnya, dan aku pergi
untuk kembali ke int, int i = 0; i <10; i + +, dan saya
melakukan bintang printf, seperti ini, dan kemudian paren dekat, dan sekarang
printf i sekarang -
sesuai dengan logika yang sama, apa yang akan terjadi ketika saya mencoba untuk
mengkompilasi program ini?
HADIRIN: identifier tidak valid.
DAVID J. Malan: Jadi lain identifier yang tidak valid,
undeclared identifier.
Sekarang, alasannya adalah sedikit berbeda.
Jelas tidak ada kurung kurawal di sini, tapi sama
Ide, cerita yang sama dari lingkup berlaku.
Jika Anda telah mendeklarasikan variabel seperti saya dalam sebuah
untuk loop, bahkan jika Anda tidak secara eksplisit menulis keriting
kawat gigi, menganggap mereka sebagai mental masih berada di sana, di mana
kasus saya adalah hanya di dalam yang valid untuk loop.
Hal ini tidak berlaku setelah Anda sampai ke baris berikutnya, yang dalam
Kasus ini sekarang 10.
Jadi hanya beberapa masalah dari ruang lingkup dan sejenisnya.
Baiklah, pertanyaan?
>> Baiklah, jadi ini adalah jenis program kecil sepele,
mencetak hanya bintang kecil.
Tapi mari kita lihat apakah Anda ingat lagu ini di sini.
Ini adalah lagu yang sangat mengganggu anak-anak akan menyanyi di
bus sekolah dan sejenisnya.
Tapi apa yang baik tentang hal itu adalah bahwa ia memiliki cyclicity ini,
dimana itu "99 botol bir di dinding,
99 botol bir.
Ambil satu turun, lulus sekitar, 98 botol bir di
wall "Dan. maka lagu mengulangi 97, kemudian 96, kemudian
95, kemudian 94, semua jalan turun ke 0 jika Anda benar-benar mendapat bahwa
jauh di bus.
Jadi ini adalah program yang bagus untuk semacam alat, karena saya
Tuhan, jika Anda hanya bisa menerapkan ini dengan beberapa
baris kode, Anda bisa meludah keluar lirik seluruh ini
lagu cukup cepat.
Tapi sepanjang jalan, kita bisa mulai sekarang menggoda selain beberapa
dari konstruksi perulangan dasar dan sekarang juga
memperkenalkan fungsi yang kita tulis sendiri, mengembalikan nilai
bahwa kita lulus sekitar.
Tapi pertama-tama, kenapa tidak kita pergi ke depan dan mengambil kami lima menit
istirahat di sini?
Dan ketika kita kembali, kita akan menyanyikan lagu ini.
>> Baiklah, jadi kami kembali.
Dan ketika saya mengatakan kita sekarang akan menyanyikan lagu ini, maksudku
pemrograman, tidak secara verbal.
Jadi di sini kita memiliki beer1.c, yang merupakan salah satu implementasi dari ini
lagu tertentu.
Dan hanya harus jelas, bagi mereka yang tidak terbiasa dengan apa
hal ini terlihat seperti, biarkan aku pergi ke depan
dan membuat beer1, Enter.
Sekarang biarkan aku jalankan beer1, dan apa yang kita akan melihat - berapa banyak botol
bir akan ada?
Aku akan mengetik 99, seperti lagu mengatakan.
Enter.
Dan sekarang jika kita menelusuri -
oops - jika kita menggulir melalui semua ini, kita akan melihat bahwa
ini memang menyanyikan seluruh lagu.
Tunggu sebentar.
Scroll bar saya agak kacau.
Mari kita gunakan jendela besar.
Jadi beer1, 99, di sana kita pergi.
Jadi di sini kita memiliki seluruh lagu, dinyanyikan jauh lebih cepat oleh
komputer daripada itu bisa saja oleh kami.
Jadi perhatikan, meskipun, sifat siklus sini.
Ia mengatakan 99, kemudian 99, kemudian "mengambil satu turun, lulus
sekitar, "kemudian 98.
Dan sekarang mengulangi lagi dan lagi.
>> Jadi ini sebenarnya adalah sebuah kesempatan yang sempurna untuk beberapa jenis
perulangan membangun.
Perhatikan bahwa Aku agak memotong sudut di sini.
Perhatikan bahwa saya mengatakan "98 botol bir di dinding,
97 botol bir di dinding, "dan itu hanya begitu
bahwa ketika kita mendapatkan satu botol bir, saya tidak memiliki
khawatir tentang tata bahasa Inggris.
Tapi kita juga bisa memperbaiki ini dengan sedikit jika
Kondisi, mungkin.
Jika nomor ini adalah tunggal, maju dan berkata "botol",
sebaliknya jika itu plural, mengatakan "botol".
Tetapi untuk sekarang, aku benar-benar memotong pojok itu.
Jadi mari kita lihat apa yang kita punya di sini.
Jadi kita punya beberapa komentar di atas.
Aku termasuk dua perpustakaan, seperti
kita sudah sering berada.
Dan sekarang biarkan aku gulir ke bawah untuk yang pertama
aktual baris kode.
Baris 17 kicks off utama.
Baris 21 dan 20 memiliki berapa banyak botol bir akan ada?
Dan kemudian saya sebut GetInt.
Dan sekarang aku punya sedikit cek kewarasan.
>> Jadi ini adalah konvensi yang sekarang kita akan mulai mengadopsi untuk
lebih ketat memeriksa input pengguna.
Kadang-kadang Anda hanya tidak ingin meminta mereka lagi
dan lagi dan lagi.
Jika pengguna sekrup dan tidak bekerjasama, baik.
Keluar dan hanya tidak berurusan dengan mereka.
Dan itulah yang saya lakukan di sini.
Jika n adalah kurang dari 1, saya hanya akan berteriak pada pengguna,
"Maaf, itu tidak masuk akal." Dan kemudian aku akan
sewenang-wenang mengembalikan 1.
Jadi sekali lagi, ini hanyalah sebuah konvensi untuk membiasakan diri.
Untuk saat ini, bawa pada iman.
Tapi sampai sekarang, kita selalu kembali 0, karena
kami telah mengatakan kembali 0 menandakan apa?
HADIRIN: Sukses.
DAVID J. Malan: Sukses, itu saja.
Jadi sekarang kita akhirnya mulai berpikir tentang
non-keberhasilan -
dengan kata lain, kasus sudut, kondisi kesalahan -
sekarang saya memiliki pasokan tak terbatas, atau setidaknya empat miliar
mungkin hal-hal yang bisa salah dalam program saya.
Dan saya bisa mulai menugaskan mereka nomor individu.
Sekarang, umumnya cukup untuk hanya kembali
selain 0 sesuatu.
Jadi kita akan hanya kembali 1 untuk saat ini.
Tapi alasan untuk kembali 1 adalah bahwa segera setelah Anda kembali
1, tebak apa yang terjadi ke seluruh program?
Ini berhenti.
Itu saja.
Jadi fakta bahwa aku kembali 1 adalah efektif
hubungan arus pendek eksekusi program ini sehingga
apa-apa di bawah garis 27 akan terus mengeksekusi.
Segera setelah pengembalian utama, yang itu.
>> Baiklah, jadi jika pengguna tidak bekerja sama dan kita mencapai baris 30
karena mereka mengetik nomor yang sah, di sini adalah saya
pelaksanaan lagu ini.
Jadi saya pertama kali mencetak karakter newline, hanya untuk
estetika.
Saya sekarang memiliki untuk loop.
Dan perhatikan aku melakukan hal-hal sedikit
dari arah yang berbeda.
Saya tidak perlu melakukan kurang dari, saya tidak perlu melakukan + +.
Saya malah bisa mengatakan menginisialisasi variabel i, mengatur itu sama dengan
n, jumlah pengguna mengetik, kemudian lakukan hal berikut, sehingga
Selama i lebih besar dari 0, maka saya -
setelah Anda selesai satu iterasi dari loop ini.
Jadi kita bisa menghitung mundur menggunakan untuk loop juga.
Sekarang, ini adalah minggu yang cukup banyak hal sekarang, dengan printf.
Jadi cetak "botol d% bir di dinding." Cetak "% d
botol bir. "" Ambil satu turun, lulus sekitar. "Print
"% D botol bir di dinding." Jadi itu masih d%, namun
melihat bahwa argumen untuk printf berubah.
Setelah koma, saya punya i, karena saya ingin mengatakan 99.
Setelah koma ini, saya memiliki i, karena saya ingin mengatakan 99.
Setelah koma ini, saya memiliki i - 1, karena saya ingin mengatakan 98 di
ini iterasi pertama, dan sebagainya.
Dan sekarang di sini, saya hanya memiliki beberapa komentar sedikit bodoh.
Dan kemudian baris 42, saya kembali 0 dengan konvensi, menandakan bahwa
semuanya baik-baik saja.
>> Jadi bagaimana jika aku melakukan kesalahan?
Apa yang mungkin kesalahan umum di sini bisa?
Nah, bagaimana jika saya sengaja berkata baik, saya ingin menghitung
turun ke 0, saya ingin 0 botol bir di dinding?
Jadi saya katakan, saya lebih besar dari atau sama dengan 0.
Apa yang akan menjadi gejala yang sekarang saya melihat apakah saya mengkompilasi ulang
beer1 dan menjalankannya?
HADIRIN: Negatif.
DAVID J. Malan: Ya, itu akan pergi negatif.
Ini adalah kesalahan off-per-satu, yang sangat
kesalahan umum untuk membuat.
Mari kita benar-benar pergi kembali ke jendela terminal dan melakukannya
di sini, jadi kita bisa melihat lebih banyak pada satu waktu.
Masukkan, 99 botol bir.
Dekat, tapi kami pergi yang sedikit terlalu jauh.
Kami menyanyikan lagu terlalu jauh di bawah, sehingga sekarang kita memukul
negatif nomor.
Jadi tidak cukup bekerja.
>> Baiklah, jadi kita dengan mudah dapat memperbaikinya dengan kembali ke
cara seperti dulu.
Tapi apa adalah beberapa peluang sekarang untuk
perbaikan?
Nah, biarkan aku membuka beer2.c dan gulir ke bawah sini dan mengambil
melihat versi ini.
Apa hal pertama yang melompat keluar pada Anda sebagai berbeda
dalam versi ini di sini?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Ya, jadi tidak ada lagi i, karena terpikir
kau tahu apa, saya meminta pengguna untuk n, dan kemudian saya
pengaturan i sama dengan n, dan kemudian aku mengubah i, tapi aku tidak pernah
menyentuh n lagi.
Jadi apa sih adalah titik Anda mengalokasikan lain 32
bit disebut i hanya agar aku dapat memiliki variabel yang berbeda?
Jadi dalam hal ini, saya semacam diakui bahwa tidak perlu
desain fitur.
Dan aku sekarang akan mengatakan sementara n lebih besar dari 0, pergi
depan dan mencetak lagu yang sama, melewati n untuk printf sebagai
Argumen kedua, dan n - 1 sebagai argumen kedua di sini.
Dan kemudian pada setiap iterasi dari loop ini, pergi ke depan dan hanya
memundurkan n sendiri.
Sekarang, fungsional, program ini
akan menjadi identik.
Jika saya mengetik 99, n dimulai pada 99.
Saya pengurangan, pengurangan, penurunan, penurunan.
Aku akan mendapatkan semua jalan ke "Satu botol bir di
dinding, satu botol bir.
Ambil satu turun, lulus sekitar.
0 botol bir di dinding "Akhir., Karena saya melakukan
mendapatkan kondisi yang benar.
Ini lebih besar dari 0.
Saya tidak membuat kesalahan ini.
>> Jadi yang lebih baik, versi satu atau dua versi?
Jadi saya mendengar sekelompok sungut untuk dua.
Kenapa dua?
Apa itu?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Oh, oke.
Jadi tidak akan pergi di bawah 0, tapi ingat, dalam versi satu,
versi yang benar asli tidak pergi di bawah 0 baik.
Jadi ingat bahwa ini adalah versi yang benar.
Jadi mari kita setidaknya membandingkan dua versi yang benar.
Apa argumen yang mendukung versi
dua yang, mmm, baik?
Ya?
HADIRIN: Menggunakan lebih sedikit ruang.
DAVID J. Malan: Oke, sehingga menggunakan ruang kurang, kan?
Sedangkan satu versi 32 bit yang digunakan untuk n, dan kemudian lain
32 bit untuk i.
Versi kedua hanya menggunakan 32 bit untuk n, sehingga
tampaknya menjadi plus.
Pikiran lain?
Apakah ada yang ingin berdebat mendukung satu?
Ya?
HADIRIN: Anda harus menggunakan baris tambahan kode untuk n -.
>> DAVID J. Malan: Oke, yakin.
Jadi itu adil.
Jadi ini hanya, setidaknya untuk saya -
Maksudku, ini benar-benar terasa berantakan sedikit, fakta bahwa
Saya tidak bisa semacam merangkum semua logika saya dalam satu
indah line, untuk loop, karena untuk loop bisa.
Di sini, aku agak harus taktik ini n -
pada akhir loop, karena
itu logis diperlukan.
Tapi jenis menggosok dengan cara yang salah, hanya karena
tampaknya terpisah dari logika di sini, meskipun,
lagi, itu diperlukan.
Pikiran lain?
Ya?
HADIRIN: [Tak terdengar].
>> DAVID J. Malan: Ya.
Jadi bagaimana jika Anda bukan, di akhir lagu, ingin
mencetak lagi nama lagu?
Seperti "Terima kasih untuk bermain 99 botol bir", atau sesuatu
konyol seperti itu?
Tapi yang penting, Anda ingin akses ke nilai aslinya.
Kenyataan bahwa Anda telah bermutasi atau berubah pada setiap n
iterasi dan karena itu telah menghancurkan nilai aslinya
berarti Anda tidak bisa melakukan itu di akhir.
Sekarang, bisa dibilang, kami jelas tidak ingin melakukan
bahwa dalam program ini.
Jadi siapa yang peduli?
Tapi itu hal yang sangat valid.
Dan jujur, ada benar-benar tidak ada yang
tepat menjawab di sini.
Mereka berdua sama-sama benar.
Aku bisa diyakinkan dengan cara baik.
Saya akan mengatakan bahwa, secara umum, itu adalah prinsip yang baik jika Anda
meminta pengguna untuk nilai tertentu dan Anda disimpan dalam sebuah variabel
seperti n, hanya semacam prinsip, itu mungkin baik
untuk menjaga bahwa sekitar.
Dan setiap data yang ingin Anda bermutasi lagi dan lagi, hanya
memberikan diri Anda salinan variabel itu, hanya agar Anda
memiliki akses ke aslinya.
Anda menghabiskan 32 bit lebih, tetapi kenyataannya adalah ini
komputer telah, seperti, dua gigabyte RAM hari ini,
dan kami kebawelan lebih dari 32 bit?
Benar-benar bukan masalah besar.
Dan bahkan pada perangkat ini di sini, dengan setengah manggung atau
gigabyte RAM, 32 bit vs 64 bit,
bukan masalah besar.
Tentu saja hari ini, itu akan menjadi cara yang kewalahan oleh ukuran
dari program itu sendiri, yang akan menjadi beberapa ratus
kilobyte, jika tidak sedikit megabyte, hari ini.
>> Jadi wajar kekhawatiran, tidak ada satu jawaban yang benar.
Tapi setidaknya mereka adalah pikiran yang harus mulai
pergi melalui pikiran Anda?
Karena dalam pset 0, meskipun kita benar-benar hanya diharapkan
benar, atau setidaknya mengelakkan berbagai bug yang
Anda mungkin telah menemui, seperti yang kita bergerak maju, desain
akan menjadi lain aspek kunci, baik untuk menulis kode
dan juga kami mengevaluasi kode.
Dan jadi setidaknya memberikan pemikiran untuk hal-hal seperti ini.
Dan hanya karena karya sesuatu tidak berarti itu baik,
bukan berarti itu dirancang dengan baik.
Dan itulah salah satu hal yang rekan-rekan mengajar dan
set masalah akan membantu kita menggoda bagian dari waktu ke waktu.
>> Nah, bagaimana dengan, katakanlah, versi ini di sini?
Biarkan aku melakukan sesuatu yang sedikit seksi di sini dalam sekejap.
Pertama biarkan aku menyingkirkan ini.
Dan sekarang mari kita memperbaiki masalah gramatikal.
Jadi dalam versi ini, saya ingin memperbaiki tata bahasa sehingga,
bukan hanya mengatakan s sisipan, seperti "botol"
atau "botol" -
Saya tidak ingin memotong sudut itu -
Saya juga ingin dinamis mencetak kata "botol"
atau "botol", sehingga menggunakan placeholder ini% s hari.
Jadi saya perlu kondisional memeriksa apa adalah nilai dari i.
Dan jika itu 1, saya ingin mengatakan "botol", dan jika ada itu
yang lain, saya ingin mengatakan "botol". Jadi mari kita coba untuk melakukan hal ini.
Jadi jika i == 1, maka biarkan aku pergi ke depan dan menyatakan -
Aku butuh string, jadi biarkan aku melakukan s1 string, karena itu adalah
string pertama saya peduli sekarang.
Aku akan mengatakan "botol". Dan kemudian, mari kita lihat, string
s2 - dan saya akan menjelaskan di mana aku akan dalam sekejap -
"Botol." Jadi ingat bahwa, dalam lagu ini, kita harus mampu
untuk mencetak hal-hal, dua kata yang berbeda berpotensi.
Jadi jika kita melihat kembali ke sini, perhatikan bahwa ketika kita sampai
ini contoh di sini, "dua botol bir di dinding,
dua botol bir, mengambil satu turun, lulus sekitar ", saya ingin
baris ini keempat untuk sekarang mengatakan "satu botol bir di
wall "Jadi saya harus memutuskan,. saya ingin mengatakan" botol "atau
"Botol"? Jadi aku akan sewenang-wenang mengatakan, oke,
Aku akan mendeklarasikan sekarang disebut variabel s1, string
satu, itu akan mendapatkan terpasang di sini dan juga di sini,
karena kata-kata yang selalu identik, hanya karena
sifat lagu.
Dan aku akan menelepon s2 kata apa pun saya ingin
akhirnya muncul di sini.
Sekarang, secara harfiah, 99 kali dari 100, itu akan menjadi
yang sama dalam kedua kasus tersebut, karena 3 adalah jamak, 2 adalah
plural, 4 adalah jamak.
Tapi dalam hal ini sudut, di mana kita bisa 2 dan kemudian 1, atau
bahkan 1 dan kemudian 0, saya perlu logika ini.
Jadi saya harus menghabiskan beberapa waktu di kode saya mendapatkan hak itu.
Jadi jika saya melakukan ini, jika saya == 1, maka s1 ditetapkan sama dengan "botol"
dan s2 sama dengan "botol", karena ini akan menjadi 1
botol, dan ini akan menjadi untuk 0 botol.
Dan ini di sini, apa ini mewakili?
Hanya untuk menjadi jelas.
Ini hanya komentar.
Jadi fakta bahwa Anda dapat memiliki single-line komentar berarti Anda
dapat komentar kode Anda seperti ini, tapi lain yang umum
paradigma, juga, adalah bahwa jika Anda memiliki frase super-pendek yang
Anda ingin menempatkan diri dan itu hanya lebih mudah dibaca untuk menempatkan
tepat di akhir baris kode, Anda dapat
benar-benar melakukan sesuatu seperti ini.
>> Jadi sekarang bagaimana jika saya melakukan ini? Lain jika saya tidak sama dengan 1.
Jadi Bang sama -
tanda seru dikenal sebagai "bang".
Jadi Bang = 1.
Jadi jika saya tidak sama dengan 1, apa yang harus saya malah ingin lakukan?
Nah, kata pertama yang saya ingin menjadi apa?
Jadi string 1 harus "botol" untuk botol jamak,
dan kemudian ini akan menjadi plural "botol" juga, untuk saat ini.
Dan kita akan melihat apakah ini benar-benar membuat kita untuk
di mana kita ingin pergi.
Jadi sekarang jika saya scroll ke bawah sini, perhatikan bahwa aku menghubungkannya
tidak hanya saya, tapi s1.
Aku menancapkan i dan s1.
Dan kemudian di sini, aku dikurangi 1, yang sama dengan
sebelumnya, namun s2.
Dengan kata lain, saya ingin kata bahasa Inggris untuk mengubah didasarkan
pada logika ini.
Sekarang, sudah ada beberapa masalah dalam kode ini.
Apa yang rusak sudah keluar dari pintu gerbang di sini?
Ya?
HADIRIN: [Tak terdengar].
>> DAVID J. Malan: Tepat.
Jadi saya sudah melanggar pelajaran dari ruang lingkup.
Jadi saya sudah dinyatakan s1 dan s2, tapi aku sudah melakukannya dalam
keriting kawat gigi, yang berarti ya, kode ini akan bekerja sampai
sampai garis 42, tapi begitu aku memukul garis 43, tebak apa yang ada
lagi ada?
Nah, coba tebak apa yang tidak lagi dalam lingkup - tidak s1 atau s2.
Jadi kita harus memperbaiki ini.
Jadi biarkan aku menghapus deklarasi.
Dan aku akan meninggalkan nama variabel dan menghapus ini di sini
dan menghapus ini di sini.
Dan dalam apa yang harus saya garis benar-benar menyatakan hal-hal ini?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Ya, jadi mungkin
sampai di sini, 33-ish.
Jadi s1 string dan kemudian string s2.
Dan ternyata, aku bisa melakukan ini.
Jika Anda menyatakan dua variabel dari jenis yang sama,
Anda dapat benar-benar hanya menggunakan koma dan melakukan itu di C. Semua
benar, jadi sekarang saya memiliki dua variabel -
s1 dan s2.
Saya menugaskan mereka nilai-nilai dalam
kondisi di sini, atau di sini.
Dan kemudian saya menggunakan mereka di bawah.
Seberapa baik ini sekarang akan bekerja?
>> Nah, itu masih sedikit buggy, tetapi mari kita setidaknya melihat
seberapa jauh kita sudah.
Jadi biarkan aku pergi ke depan dan membuat beer3.
Apakah beer3 ini?
Yap, ini adalah beer3.
Dan sekarang biarkan aku pergi ke depan dan menjalankan beer3.
399 99.
Kita mungkin dapat melewati sebagian besar dari mereka.
Dan di sini, lihat itu.
"Satu botol bir di dinding, satu botol bir, mengambil
satu turun, lulus sekitar, 0 botol bir di dinding. "
Tapi aku menarik perhatian Anda untuk hanya setengah dari solusi.
Jenis kacau di sini.
Jadi sepertinya bahwa kasus sudut muncul ketika saya sama apa yang
dua nilai?
HADIRIN: 2, 1.
DAVID J. Malan: 2 dan 1.
Ini bukan 1 dan tidak 1.
Ini benar-benar hanya ini terakhir dua bait dari lagu ini.
Jadi apa yang saya ingin lakukan, bukan?
Jadi saya tampaknya telah tertangkap kasus di mana jika saya adalah == untuk 1,
maka kata pertama adalah "botol", tetapi kata kedua
adalah "botol". Tapi di sini, saya ingin mengubah ini menjadi == 2.
Dan jika hal ini terjadi, apa yang saya ingin
Kata pertama untuk menjadi?
HADIRIN: "Botol".
DAVID J. Malan: "Botol", sehingga untuk dua botol.
Dan kemudian kata ini di sini harus -
HADIRIN: "Botol".
DAVID J. Malan: "Botol", tunggal.
>> Baiklah, mari kita zoom out, kembali ke sini, re-menjalankan make,
re-run beer3, tipe 99 lagi.
Oke, "Segmentation fault (inti dibuang)."
Apa yang telah kulakukan salah?
HADIRIN: Anda tidak memiliki nilai [Tak terdengar].
DAVID J. Malan: Ah, titik yang sangat baik.
Baiklah, jadi apa yang salah di sini?
Jadi kesalahan segmentasi, dan kami benar-benar akan melihat
ini beberapa kali di masa depan, dengan sengaja.
Tetapi untuk sekarang, apa ini benar-benar berarti?
Sebuah kesalahan segmentasi hampir selalu berarti bahwa Anda memiliki
entah bagaimana mencoba untuk mengakses memori, RAM di komputer Anda,
bahwa Anda tidak sendiri, bahwa Anda belum benar-benar bertanya
sistem operasi untuk.
Jadi dalam hal ini, perhatikan apa yang saya lakukan, yang
cacat dalam logika saya.
Saya telah ditugaskan nilai s1 dan s2 jika i sama dengan 1.
Saya juga melakukan itu jika saya sama dengan 2.
Tapi aku tidak melakukannya dalam jumlah tak terbatas lainnya
kemungkinan -
khususnya, 3 atau 4 atau dot, dot, dot, 99.
Jadi satu untuk memperbaiki ini hanya bisa mari kita
memiliki kondisi yang lain.
Dan biarkan aku pergi di sini dan mengatakan s1 sama -
apa yang harus ia berada di sini?
HADIRIN: [Tak terdengar].
>> DAVID J. Malan: "Botol", karena dalam kasus umum,
itu hanya hal yang sama.
Jadi sama dengan kutipan, tanda kutip, "botol." Jadi untuk jamak
botol, dan kemudian di sini, untuk botol jamak.
Oke, jadi sekarang biarkan aku kembali ke jendela terminal saya,
kompilasi ulang, re-menjalankannya.
99.
Wah.
Dan mari kita melakukan cek kewarasan cepat.
Secara teknis, kita ingin membaca semua ini untuk memastikan
mereka benar, tapi mari kita lihat
setidaknya diketahui penyebab.
3 botol, 2 botol, 2 botol, 1
botol, 1 botol, botol 0.
Kita tampaknya telah setidaknya tetap untuk saat ini.
Tapi menangkap di sini adalah bahwa apa yang berantakan Allah yang mengerikan ini
hanya untuk memecahkan bodoh
satu-karakter gramatikal detail.
Jadi ada semacam alasan bahwa saya memotong sudut ini
sebelumnya, karena itu hanya benar-benar menjengkelkan harus
menulis kode banyak.
Tapi ternyata ada cara yang sedikit lebih elegan
mengungkapkan hal yang sama persis.
Dan kita dapat melakukan hal ini sebagai berikut.
>> Biarkan aku meninggalkan ini pada layar sejenak dan
memperkenalkan sesuatu yang dikenal sebagai operator ternary.
Ini adalah jenis kapal satu-yang hanya dimaksudkan untuk membuat kita
menjalani seksi sedikit, seperti yang dijanjikan.
Dan aku akan melakukan hal ini sebagai berikut.
Beri aku string disebut s1, dan biarkan aku
menetapkan itu sebagai berikut.
(I == 1)?
"Botol", jika "botol". String s2 mendapat (i == 2)?
"Botol", jika "botol".
Jadi kalau begitu, apakah perbedaan di sini?
Kedua baris kode, saya berpendapat, bisa
mengganti kekacauan ini.
Jadi saya menyebutnya berantakan, hanya karena jenis menggosok saya
cara yang salah bahwa itu garis begitu banyak kode.
Tidak salah.
Ini bukan desain yang buruk.
Seperti, hal ini sepenuhnya benar dan baik-baik saja.
Tapi coding akan membosankan jika Anda harus mengekspresikan diri sehingga
sialan khusus lagi dan lagi dan lagi dengan sederhana
Skenario seperti ini.
Jadi C memiliki beberapa cara pintas, seperti ini.
Jadi ini pada dasarnya mengatakan mendeklarasikan string disebut s1 dan
menetapkan baik ini nilai atau nilai ini jika saya adalah == -
Maaf, saya harus mengatakan ini lebih jelas.
Deklarasi variabel s1, menetapkan nilai ini jika hal ini benar.
Jika tidak, menetapkan nilai ini.
Jadi dengan kata lain, ini adalah semacam cara satu-garis
mengatakan jika lain tetapi melakukan tugas sepanjang jalan.
Jadi jika saya adalah 1, kemudian pergi ke depan dan menyebutnya "botol". Dan
maka ini yang lain, sebut saja "botol". Sementara itu, s2, yang
kata kedua bahwa kita perlu mendefinisikan, jika saya sama dengan 2, kita akan
mengatur s2 untuk "botol". Jika tidak, set ke "botol". Dan apa
ini berarti sekarang adalah saya bisa melewati ini dan menghapus semua
mereka baris kode.
Dan ketika saya katakan, agak ridiculously, bahwa ini adalah saat
seksi, seksi itu dalam semacam rasa gaya.
Fakta bahwa fungsional, kode ini sebenarnya akan
melakukan hal yang sama persis.
Dan meskipun mungkin terlihat sedikit samar pada awalnya
sekilas, karena kami sudah tidak melihat konstruksi ini sebelumnya, aku akan
berpendapat bahwa itu pada akhirnya akan menjadi jauh lebih
dibaca dan lebih mudah bagi kita manusia untuk semacam
mengerti, karena sekarang Anda hanya dapat membaca
semua kode dalam satu baris.
Ini masih memiliki semangat yang sama jika, di mana ini adalah
kondisi dan maka ini adalah apa yang ada di dalam jika dan ini
adalah apa yang ada di dalam yang lain tersebut.
Tapi kita bisa melakukan hal ini hanya jauh lebih elegan.
>> Dan jika saya sekarang kembali ke terminal saya, setelah menghapus semua
dari baris tersebut dan menggantinya dengan hanya dua,
kompilasi ulang, re-run botol bir dengan 99, perhatikan bahwa saya
tata bahasa, pada kenyataannya, masih benar.
Jadi sekali lagi, untuk memulai sesuatu.
2 botol bir, 1 botol bir.
Tampak benar.
Ya.
Jadi ada kami memiliki solusi yang jauh lebih ringkas.
Jadi ini juga, karena Anda mendapatkan lebih nyaman dengan C, tidak
tentu dengan pset pertama atau bahkan kedua, namun
menyadari bahwa konstruksi ini dapat memungkinkan kita untuk melakukan hal-hal yang pernah
lebih elegan.
Sekarang mari kita lakukan satu hal lain di sini.
Biarkan aku pergi ke depan dan membuka return1.c.
Sekarang mari kita mulai untuk memecahkan masalah lain dengan cara yang
memungkinkan kita untuk menulis kode yang lebih canggih.
>> Jadi di sini adalah program kecil sederhana yang tujuannya dalam hidup
adalah untuk kenaikan nilai.
Dan sebenarnya, mari kita mengambil langkah mundur.
Biarkan aku melakukan ini secara manual.
Biarkan saya sertakan dan int main (void).
Dan biarkan aku sebut increment.c ini.
Dan apa yang ingin saya lakukan?
Aku akan pergi ke depan dan mengatakan sesuatu seperti -
akan kita sebut nomor yang sama -
int x.
Jadi x int mendapat 2, x printf adalah% d, baris baru, x.
Jadi aku mengetik cepat, tapi hal semacam akrab sekarang.
Lalu aku akan melakukan x + +.
Lalu aku akan mencetak kalimat yang sama lagi.
Dan kemudian aku akan kembali 0 hanya untuk keluar dari program.
Baiklah, jadi ini adalah sebuah program yang
peningkatan angka.
Ini pertama akan menginisialisasi sesuatu untuk 2, dan kemudian itu
akan kenaikan itu dan mencetaknya lagi.
>> Jadi mari kita jalankan kenaikan, program yang sangat sederhana.
Tapi misalkan sekarang aku ingin kubus nilai, begitu
agak sewenang-wenang sesuatu.
Dan aku benar-benar ingin melakukan x mendapat kubus itu.
Jadi saya bisa menggunakan apa yang disebut fungsi pow, tapi aku tidak
benar-benar tahu di mana yang belum.
Jadi aku akan melakukan hal ini dengan cara kuno.
x kali ini sama dengan x kali x kali x.
Jadi aku cubing nilai, mengalikannya dengan sendirinya lagi
dan lagi dan lagi, sehingga kita mendapatkan kekuatan
dari 3 dalam kasus ini.
Jadi sekarang saya harus mencetak angka seharusnya, seperti yang kita akan melihat
di sini - membuat kenaikan, sehingga sebenarnya tidak benar-benar kenaikan
lagi, tapi kami akan meninggalkan nama saja -
2 dan kemudian 8.
Sekarang, kita memiliki awal dari kesempatan untuk perbaikan
di sini, dimana hal ini cubing mengalikan angka
dengan sendirinya dengan sendirinya dengan sendirinya merasa seperti ini mungkin saja
berguna untuk memiliki sebagai fungsi, seperti seseorang memutuskan
tahun lalu - Anda tahu, jenis berguna jika salah satu dari kita duduk
dan menulis printf sehingga seluruh dunia dapat menggunakannya,
kenapa tidak kita duduk dan menulis fungsi yang disebut kubus
yang melakukan cubing ini untuk kita sehingga kita tidak perlu secara manual
mengimplementasikan gagasan cubing nilai di sini?
>> Jadi contoh sederhana, tapi mari kita pergi ke depan dan menggunakan ini sebagai
kesempatan untuk menulis fungsi kita sendiri.
Jadi sejauh ini, kita hanya digunakan utama, dan kami telah menggunakan lainnya
fungsi orang, tapi kami tidak menulis kita sendiri.
Jadi di sini kita pergi.
Aku akan pergi ke depan dan menulis fungsi yang disebut kubus.
Dan aku akan memilikinya mengambil input.
Jadi input akan menjadi integer.
Dan apa itu akan dilakukan?
Ini akan mendeklarasikan keluaran int = masukan masukan kali
kali masukan.
Dan kemudian itu akan kembali output tersebut.
Dan kemudian saya harus lebih spesifik sekarang.
Fungsi ini akan mengembalikan sebuah int.
Jadi di sini kemudian adalah bagaimana Anda akan menulis fungsi sendiri.
Anda pertama kali memutuskan apa nama Anda
Fungsi akan.
Dan pada umumnya, sesuatu yang jelas baik, jadi saya akan
menyebutnya kubus.
Kemudian Anda harus menentukan apa yang akan kembali, apa
outputnya akan menjadi.
Dan kami tidak memiliki pilihan yang banyak belum.
Int, char, float, bool, string.
Untuk saat ini, aku akan tetap dengan int, karena saya ingin
untuk kembali integer.
Kemudian Anda harus menentukan apa yang input-nya, jika ada, adalah.
Dan jika kubus mengambil argumen, mengambil sesuatu di antara
kurung, Anda harus memberikan argumen bahwa nama sehingga
Anda dapat menyebutnya sesuatu yang Anda menerapkan atau menulis
fungsi ini, dan Anda harus memberikan jenis, yang dalam hal ini
Kasus ini akan menjadi int.
Jadi singkatnya, kubus adalah fungsi yang mengambil integer
sebagai input dan mengembalikan sebuah integer sebagai output.
>> Jadi apa hubungannya dengan masukan itu?
Nah, di baris 14, saya menyatakan output yang disebut variabel, dan saya
menetapkan nilai, masukan masukan kali kali masukan.
Dan kemudian saya kembali output.
Jadi bagaimana saya menggunakan ini maka?
Apa yang harus saya mengubah karakter disorot pada baris
7 yang akan, menurut Anda?
HADIRIN: [Tak terdengar].
DAVID J. Malan: Ya, jadi kubus x.
Jadi x adalah variabel, yang berarti memegang beberapa nilai.
Untungnya, itu bertipe integer.
Dan karena x adalah int, itu berarti saya bisa lulus ke kubus.
Dan meskipun aku mengesampingkan nilai x dengan nilai
x kubus, seperti yang telah terjadi sejauh ini, setiap kali Anda
memiliki tanda sama dan baris kode, hal-hal di sebelah kanan
dijalankan dan kemudian akan diserahkan kepada
nilai di sebelah kiri.
Jadi urutan operasi adalah seperti yang kita akan berharap.
Jadi, apakah ini bekerja?
Nah, biarkan aku pergi ke sini.
Mari saya membuka jendela terminal saya.
Biarkan saya lakukan membuat kenaikan, Enter.
"Deklarasi implisit dari 'kubus' fungsi tidak valid dalam
C99 "Sebagai samping., C99 mengacu pada bahasa C seperti itu
didefinisikan pada tahun 1999, yang merupakan pembaruan atas versi dari
1989, yang merupakan pembaruan atas asli.
Jadi itulah yang berarti.
>> Jadi apa artinya bahwa "deklarasi implisit
'kubus' fungsi tidak valid "Ada di sini?.
Ini tepat di jalur 12.
HADIRIN: [Tak terdengar].
DAVID J. Malan: Apa itu?
HADIRIN: Ini bukan sebelumnya.
DAVID J. Malan: Ini bukan sebelumnya.
Jadi ini adalah hal.
C adalah agak bodoh, atau C compiler yang agak bodoh.
Mereka benar-benar hanya melakukan apa yang Anda katakan mereka lakukan.
Dan mereka, khususnya, hanya membaca atas kode Anda ke bawah,
kiri ke kanan.
Jadi jika compiler, dentang, yang membaca kode Anda, baris 1, maka
angka keluar bagaimana untuk melakukan hal ini.
Oh, di sini datang utama.
Oke, biarkan aku pergi ke depan dan menyatakan variabel x.
Biarkan saya mencetak sesuatu.
Baris 7, apa sih kubus?
Ini tidak dideklarasikan di stdio.h.
Itu tidak datang dengan C. Saya tidak tahu apa yang harus dilakukan.
Dan sehingga dentang hanya bails dan berhenti dengan pesan kesalahan.
Jadi kita bisa memperbaiki ini dalam beberapa cara.
Kita dapat mengajarkan dentang apa kubus dengan hanya menggerakkan mana
deklarasi ini.
Jadi saya dipotong dan disisipkan di atas utama.
Sekarang menyadari bahwa hanya karena utama adalah tidak lagi pertama, itu
masih dijalankan secara default.
Main utama.
Ini adalah nama fungsi standar.
Tidak peduli di mana itu adalah dalam file.
Tapi setidaknya sekarang dentang telah melihat kubus sebelum saya menggunakannya.
Jadi mari kita lihat apakah dentang lebih bahagia sekarang.
Membuat kenaikan, itu waktu kompilasi ini.
>> Biarkan saya jalankan kenaikan.
Dan memang, tampaknya akan bekerja.
Sekarang, Anda bisa datang dengan skenario di mana akhirnya
itu tidak layak untuk menempatkan setiap fungsi
atas setiap fungsi lainnya.
Anda akan terjebak dalam infinite loop pada kenyataannya,
di mana orang ini ingin berada di sini tapi ini
Orang perlu berada di sana.
Sehingga tidak selalu bekerja.
Jadi untungnya, C memiliki solusi yang lebih elegan.
Aku akan menempatkan kembali ini di mana itu, hanya karena aku
suka, sebagai masalah prinsip, yang utama selalu
di atas, karena itu hanya bagus untuk melihat apa program ini
tidak secara default.
Dan apa yang akan saya lakukan di sini adalah menyatakan apa yang disebut
prototipe.
Aku akan kembali mendeklarasikan fungsi kubus saya dengan benar
copy dan paste.
Sebenarnya, itu tidak benar.
Jadi secara harfiah menyalin dan menyisipkan baris 15
di atas jalur 6.
Tidak peduli apa yang baris ini berakhir di.
Hal ini terjadi untuk berada di jalur 4.
Tapi itu tidak harus sebelum main.
Tapi melihat perbedaan.
Jalur 4 berakhir dengan titik koma, yang berarti hei,
Clang, mengambil kata-kata saya untuk itu bahwa ada fungsi
disebut kubus yang mengambil int dan mengembalikan sebuah int.
Tapi aku tidak akan memberitahu Anda apa itu belum.
Hanya tahu bahwa aku berjanji untuk memberitahu Anda pada akhirnya.
Dan memang, sekarang tidak apa-apa bahwa ini adalah di bawah.
>> Jadi ini umumnya lebih baik, karena kemudian di bagian atas
file Anda, Anda hanya dapat mainan dari, cepat-api, satu baris
masing-masing, apa nama fungsi Anda, apa yang mereka
masukan, apa output mereka.
Dan untuk lebih jelas, masukan umumnya berarti argumen atau
parameter, identik.
Output berarti nilai kembali, apa fungsinya
menyerahkan kembali kepada saya.
Jadi dalam hal ini di sini, kubus telah dinyatakan di atas, namun
didefinisikan, atau dikenal sebagai diterapkan, di bagian bawah.
Jadi sekarang mari kita kembali ke sini dan kembali menjalankan ini.
Jadi sekarang biarkan aku pergi ke depan dan kembali menjalankan make, kembali menjalankan kenaikan.
Dan sekarang tampaknya akan bekerja baik-baik saja.
Jadi sekarang kita bisa pergi ke depan dan faktor luar sesuatu seperti
Contoh bir ke versi keempat.
Jadi biarkan aku gulir di sini.
Dan melihat bahwa aku agak mengambil pelajaran ini ke dalam hati hanya sekarang.
Fakta bahwa saya menyanyikan bait yang sama lagi dan
lagi dan lagi, garis chorus yang sama dalam lagu, merasa
seperti kenapa tidak saya faktor yang keluar ke fungsi?
Dan memang, ini harus menjadi salah satu motivasi.
Selain fakta bahwa orang lain di dunia mungkin ingin
untuk menggunakan fungsi kubus -
itu alasan yang baik untuk faktor sesuatu dan menulis Anda
Fungsi kustom -
jika ada serangkaian kode dalam program anda yang hanya membuat
konseptual akal, bahwa Anda seperti ingin memberikan
Nama - seperti dalam kasus ini, paduan suara -
maka Anda sama dapat menulis bahwa sebagai fungsi yang terpisah.
Anda tidak harus menulis segala sesuatu di utama jika hanya
terasa lebih bersih untuk memisahkan keluar dan memberikan nama.
>> Jadi dalam hal ini di sini, perhatikan bahwa saya memiliki komentar atas
fungsi ini yang hanya menyanyikan tentang
ditentukan jumlah botol.
Perhatikan di sini bahwa saya tidak perlu menyebut
hal input dan output.
Bahkan, kali ini saya hanya disebut b masukan saya untuk botol.
Dan perhatikan di sini, batal menunjukkan apa?
Paduan suara yang -
HADIRIN: Tidak mengembalikannya.
DAVID J. Malan: Tidak mengembalikan nilai.
Dan memang, fungsi tidak perlu mengembalikan nilai.
Mereka hanya bisa melakukan sesuatu.
Mereka dapat memiliki apa yang disebut efek samping, yang dalam hal ini
Kasus adalah hanya sekelompok seluruh mencetak pada layar.
Jadi perhatikan bahwa kode di sini, saya benar-benar hanya mencuri dari
contoh sebelumnya.
Satu-satunya perbedaan adalah bukan menggunakan i sebagai saya
variabel, Sekarang saya menggunakan b sebagai variabel saya.
Jadi saya memiliki b di sini, saya memiliki b di sini, saya telah b
dikurangi 1 di sini.
Tetapi kode ini persis sama.
Tapi hanya untuk menunjukkan Anda sekarang bagaimana kita bisa menggunakan ini, biarkan aku pergi
depan dan benar-benar mengubah ini menjadi untuk loop.
for (int i = n, i> n, i -).
>> Jadi saya sudah dicuri bahwa dari contoh kita sebelumnya.
Sebelumnya, itu sejalan 37 bahwa saya akan mulai
menyanyikan lagu ini menjengkelkan.
Tapi sebaliknya, aku hanya akan sekarang panggilan paduan suara i.
Selesai.
Jadi sekarang dalam setiap iterasi dari loop ini, saya sebut ini lain
fungsi, chorus, yang kebetulan saya menulis.
Itu tidak ditulis oleh orang lain tahun lalu.
Tapi chorus, sementara itu, menggunakan printf untuk mencetak
keluar empat baris.
Tapi fakta bahwa aku menelepon chorus lagi dan lagi dalam
lingkaran berarti bahwa aku akan mendapatkan, di akhir,
persis sama lagu seperti yang telah saya sejauh ini.
Jadi singkatnya, sekarang jika saya melihat kembali pada kode saya, meskipun
fungsional ini setara, perhatikan bahwa itu
mulai mendapatkan bahkan lebih mudah dibaca.
Saya tidak tahu persis bagaimana GetInt
diimplementasikan.
Terus terang, saya tidak tahu bagaimana chorus diimplementasikan.
Tapi itu tidak masalah bagi saya.
Saya tidak peduli, karena sekarang saya dapat semacam, sebagai manusia, baca
ini dari atas ke bawah.
Dan karena fungsi diberi nama sesuai dengan apa yang mereka
lakukan, kode saya semakin dibaca.
Dan sebagai program kami mendapatkan jauh lebih kompleks -
pada akhir semester, Anda akan menulis ratusan baris
kode dalam bahasa seperti PHP dan JavaScript dan sejenisnya -
Anda akan menemukan bahwa hal itu jauh lebih mudah daripada melacak
apa yang telah Anda lakukan.
Dan ketika Anda mulai berkolaborasi dengan teman atau
mitra atau rekan, Anda akan mampu menulis lebih banyak
besar program dengan mulai melaksanakan dasar ini
blok bangunan.
>> Jadi dengan mengatakan bahwa, kenapa tidak kita menyebutnya sehari?
Dan kita akan melihat Anda pada hari Rabu.
[Tepuk Tangan]