Mengajar C ++ kepada siswa sekolah menengah pertama: Di mana harus menarik garis?

35

Saya akan membimbing tim siswa sekolah menengah untuk Kompetisi Robotika PERTAMA, sebagian besar tim di sini mengembangkan [perangkat lunak robot mereka menggunakan C ++. Bagi banyak siswa dalam tim, ini akan menjadi pengantar pemrograman pertama mereka. Saya tidak akan memilih C ++ untuk mengajar pemrograman untuk siswa sekolah menengah (misalnya Python atau Javascript akan lebih mudah saya pikir) tetapi pilihannya sudah ditentukan.

Saya ingin mengajar mereka C + + yang tepat (yaitu menghindari dialek C / C ++ campuran, yaitu C +) tetapi saya tidak ingin menakut-nakuti mereka dengan kompleksitas yang tidak perlu. Untuk masalah itu:

  • Haruskah saya mulai menggunakan STL dari hari pertama, esp. vectoratau tetap dengan array standar? Array lebih mudah untuk diperkenalkan tetapi kesalahan pointer mungkin lebih sulit untuk ditangkap.
  • Untuk I / O, haruskah saya berpegang teguh pada cout, dll. Atau apakah menurut Anda printfakan lebih mudah dipelajari?
  • Apakah ada sumber daya online untuk C ++ yang cocok digunakan untuk pelajar muda seperti itu?

Terima kasih!

EDIT : Terima kasih atas begitu banyak jawaban bagus. Selain C + Akselerasi , yang disarankan oleh banyak orang, saya telah menemukan bahwa C ++ Untuk Semua Orang adalah teks yang sangat baik.

penerimaexeksklusif
sumber
52
Ya Tuhan tolong jangan ajari siapa pun javascript sebagai bahasa pertama!
SoapBox
26
@ SoapBox: kebalikan dari apa? Saya pikir Javascript hebat sebagai bahasa pertama. Anda dapat melakukan hal-hal menarik dengan beberapa baris kode, tidak ada kompiler pembelajaran overhead startup dan IDE dll, mudah untuk menguji dan debug, dan mendukung OO dan pemrograman fungsional. Apa yang bisa lebih baik?
kevin cline
7
Mengapa Anda mengatakan bahwa array lebih mudah diperkenalkan? Saya pikir vektor jauh lebih intuitif untuk pendatang baru karena Anda tidak perlu memikirkan pointer atau hal kompleks seperti itu.
Casey Patton
19
Jika Anda mengajar C ++ kepada siswa sekolah menengah, maka Anda sudah melewati batas.
tylerl
7
Alternatif untuk mengajar C ++ bukanlah COBOL.
jhocking

Jawaban:

40

Saya pikir Anda harus mulai dengan tipe data yang telah dibangun bahasa seperti array dan pointer, dan ketika siswa Anda memahami itu, pindah ke kelas dan OO, kemudian STL.

Alasannya adalah bahwa Anda dapat mengajar orang untuk memahami array tanpa memahami banyak hal lain selain variabel dan arsitektur komputer yang mendasarinya, tetapi Anda tidak dapat mengajar mereka untuk memahami vectortanpa mengajar mereka kelas terlebih dahulu. Jika Anda menggunakan STL sejak awal, siswa-siswa Anda harus hidup hanya dengan tidak memiliki petunjuk tentang bagaimana vectortepatnya bekerja. Dan kemudian ketika Anda sampai pada titik itu, mereka tidak akan memiliki pemahaman yang cukup baik tentang pointer dan array dan hal-hal yang Anda dapatkan dari melakukan hal-hal seperti menulis kelas vektor Anda sendiri, menulis kelas daftar tertaut Anda sendiri, dll. Yang akan diperlukan untuk menghargai dan memanfaatkan fitur-fiturnya. Itu mengganggu saya ketika siswa mengatakan "apa itu?" dan guru berkata "abaikan saja, kamu akan mempelajarinya nanti."

Dan seperti yang ditunjukkan Demian dalam komentar, menguraikan pesan yang relatif samar yang Anda dapatkan dari kesalahan templat jauh lebih sulit daripada memahami kesalahan yang mungkin Anda dapatkan dari susunan array / non-templat.

Saya tidak merasakan hal yang sama tentang coutdan printf. Tidak ada level yang lebih rendah dari yang lain, kecuali yang coutmenggunakan overloading operator.

Ini mungkin tampak bodoh, tetapi saya benar - benar fanatik tentang membuat orang memahami blok bangunan yang sangat mendasar dari semua hal sebelum pindah ke abstraksi. Anda tidak harus menggunakan pointer pintar sampai Anda mahir dengan pointer mentah, tidak ada vektor sebelum array, hal semacam itu.

Saya sering mengatakan ini, tetapi saya akan mengatakannya lagi: lebih baik mengajarkan siswa pembagian panjang terlebih dahulu dan kemudian membiarkan mereka menggunakan kalkulator daripada membiarkan mereka menggunakan kalkulator kemudian mengajar mereka pembagian panjang sesudahnya.

Adapun buku untuk mengajar pemula, lihat daftar master buku C ++ yang baik .

Seth Carnegie
sumber
4
Saya sebenarnya memiliki pendapat yang sama tetapi melihat buku Pengajaran C ++ Strousrup ( stroustrup.com/Programming ) dan dia secara eksplisit menganjurkan penggunaan vectorarray yang berlebihan. Saya sobek.
recipriversexclusion
4
@recipriversexclusion: Hanya menyatakan yang sudah jelas, tetapi Mr. Stroustrup jauh dari siswa SMA;)
Demian Brecht
14
OH TUHAN. Bagaimana mungkin ada orang yang berpikir bahwa memanipulasi array yang dialokasikan secara dinamis secara manual bisa menjadi rute "termudah-pertama" ke C ++, ketika ada std::stringdan std::vector?! Apakah itu pemrogram 32 C upvoting? Saya telah mengajar C ++ selama satu dekade, untuk pemrograman pemula, untuk siswa yang memiliki tahun Jawa, dan untuk para profesional pemrograman. Saya menggunakan std::stringdan std::vectorsejak hari pertama. Mereka mudah digunakan, tidak peduli apa jeroan mereka. (Anda tidak akan menghindar untuk mengajarkan string VB karena terlalu rumit di bagian dalam?)
sbi
18
Inilah downvote Anda. Anda tidak harus belajar membangun rumah untuk menikmati manfaat tinggal di rumah. Anda tidak harus bisa menulis std::vectoruntuk dapat menggunakannya. Dan kelas adalah bagian yang sangat mendasar dari C ++. Yang tidak mendasar adalah men-debug semua kesalahan yang akan mereka dapatkan dengan menggunakan array dan pointer asli.
DeadMG
6
@DeadMG: Metafora rumah tidak berfungsi. Di sebuah rumah, begitu fondasi dibangun, Anda tidak perlu memikirkannya lagi. Anda terus membangun yang lainnya. Dalam C ++, yang instan Anda melihat newkata kunci, Anda kembali tepat ke terrirory manajemen memori. Dan sering kali perpustakaan meminta petunjuk dan Anda perlu bertanya pada diri sendiri, "apakah itu akan menjadi milik? Atau apakah saya masih perlu membersihkannya?". Fondasi kakiku. Lebih seperti paku atau mendempul atau sesuatu.
Chris Eberle
38

Ini pengalaman saya sendiri. Terima apa pun nilainya.

Melihat kembali ke ketika saya mulai pemrograman, saya benar-benar berharap aku akan belajar tentang memori pertama . Tidak, ini tidak mengasyikkan. Itu akan membuat Anda berkaca-kaca. Tetapi itu adalah konsep yang sangat mudah untuk diajarkan. Cukup tunjukkan meja 1-D dan buat mereka menjalani beberapa latihan mental:

Pelajaran 1:
Ini adalah 10 byte memori. Ini adalah huruf "a" yang dimasukkan ke dalam sel nomor 3. "a" adalah nilainya, dan 3 adalah alamatnya. BAIK? Ini adalah nomor 3 yang dimasukkan ke dalam sel 5. Nilainya 3 dan alamatnya adalah 5. Sekarang apa arti angka 3? Yah itu bisa saja angka 3 -atau- itu bisa menjadi referensi ke alamat 3. Sama seperti 1 mungkin angka atau mungkin kode negara. Itu hanya angka, itu semua tergantung pada bagaimana kita memperlakukannya.

Pelajaran 2:
Mari belajar berhitung dalam biner. Mari berhitung hingga 10 menggunakan penghitungan jari biner. Tidak menarik? Lihat bagaimana itu hanya membutuhkan 4 jari? Jadi kita katakan bahwa hanya 4 bit yang dibutuhkan (1/2 sel). Apa yang tertinggi yang bisa Anda hitung di satu sisi (jawabannya 31). Bagaimana dengan 2 tangan (jawabannya adalah 1023). Jelaskan bagaimana lebih banyak bit berarti rentang angka yang lebih tinggi. Ingatkan mereka bahwa sel memori adalah 8 bit. Tanyakan apa yang terjadi ketika angka membutuhkan lebih dari 8 bit. Bagaimana mereka akan memasukkan nomor multi-byte ke dalam memori (dengan cara yang logis)? Perkenalkan mereka ke karakter, celana pendek, bilangan bulat, dan panjang.

Pelajaran 3:
Inilah program yang saya tulis di C ++. Ini menggunakan bilangan bulat 32-bit. Dan ini di sini juga angka. Tetapi ini adalah angka yang digunakan untuk menunjuk. Dengan menggunakan tanda bintang kecil ini, kami berjanji bahwa nomor tersebut akan digunakan untuk menunjuk. Dan inilah cara kami mengarahkannya ke angka pertama. Ampersand kecil mengisi nilai bagi kita. Rapi ya?

dan sebagainya. Setelah Anda mendapatkan memori dasar, yang lainnya adalah kue. Siswa miskin yang menganggap kompiler melakukan sesuatu yang ajaib (atau mereka tidak pernah harus memikirkan manajemen memori) yang cenderung paling berjuang. Dan C ++ mengerutkan air karena beberapa hal dibersihkan secara otomatis (yaitu vektor normal) sementara yang lain tidak (yaitu vektor yang dialokasikan menggunakan "baru"). Dan bahkan jangan mulai saya menggunakan string (char * vs. std :: string - coba jelaskan tanpa pengetahuan pointer).

Saya tidak tahu platform apa yang akan ditarget pesaing robot Anda, tetapi jika lingkungan dengan memori terbatas, keterampilan manajemen memori sangat penting.

EDIT

Setelah Anda mengajari mereka dasar-dasar, maka ya saya katakan pergi C ++ sepanjang jalan. Secara teknis mereka hanya perpustakaan yang berbeda, tapi ya tidak ada gunanya membingungkan mereka dengan lebih dari satu paradigma. Beri mereka alat C ++ (yang termasuk pointer dan array).

Chris
sumber
Itu adalah tanggapan yang baik. Masalahnya saya pikir Anda dapat mengajar itu tetapi banyak anak-anak (saya adalah orang yang berjuang pada awalnya dengan konsep pointer / memori karena kurangnya minat) hanya akan mengabaikannya, karena itu tidak menyenangkan, meskipun itu perlu pengetahuan untuk berhasil memprogram di C ++.
Keith Layne
3
Yap, tidak ada argumen di sini. Untuk alasan yang sama, anak-anak mengabaikan matematika dan geografi. Baru kemudian mereka menyadari bahwa mereka seharusnya memperhatikan. Cukup yakin bahwa masalah tertentu masih belum terpecahkan.
Chris Eberle
+1. Saya ingat menyatukan pemahaman saya tentang bagaimana memori bekerja cukup lama setelah saya diperkenalkan ke C ++. Saya tidak berpikir saya bisa memahaminya di muka (tidak dalam arti praktis, seperti bagaimana nilai diwakili).
Cameron
+1, ini yang ingin saya katakan, tapi lebih baik. Saat melatih mekanik, mereka harus memahami mesin sebelum Anda membuat mereka menjadi ahli mengemudi.
Seth Carnegie
Ya saya bolak-balik tentang apakah pemula dapat memahami ini atau tidak. Ini SANGAT sangat mudah (dan Anda tiba-tiba mendapati diri Anda berkata "wow, komputer adalah mesin yang sangat bodoh, bukan?"), Namun itu mengharuskan mereka untuk memperhatikan dan memegang janji akan hal-hal yang lebih menarik yang akan datang. Tidak melihat "gambaran besar" membuat pendekatan keseluruhan sedikit membingungkan.
Chris Eberle
31

Haruskah saya mulai menggunakan STL dari hari pertama, esp. vektor atau hanya tetap dengan array standar? Array lebih mudah untuk diperkenalkan tetapi kesalahan pointer mungkin lebih sulit untuk ditangkap.

pasti langsung menggunakan jenis perpustakaan standar. a std::stringatau std::vectorapa yang harus sering mereka gunakan dan (sebagian besar implementasi) jenis-jenis ini menawarkan beberapa bentuk deteksi kesalahan dan penanganan kesalahan, sementara mengabstraksikan banyak kompleksitas dari siswa.

Anda dapat menghabiskan banyak waktu mengajar siswa bagaimana memori disusun dan bagaimana mengelola memori (gaya C), atau Anda dapat langsung bekerja menggunakan jenis bahasa idiomatik kemudian jelaskan detail implementasi jika diperlukan (dan ketika mereka memiliki pemahaman yang lebih baik tentang apa itu array dan di mana array digunakan).

sintaks std::vector(buat / baca / tulis) tidak jauh lebih rumit daripada sebuah array C. sebagai perbandingan, manajemen memori manual dan semua kesalahan umum yang dilakukan oleh pelajar baru dengan array C jauh lebih sulit untuk dipelajari, diajarkan, dan digunakan.

Untuk I / O, haruskah saya tetap berpegang pada cout, dll. Atau apakah menurut Anda printf akan lebih mudah dipelajari?

cout. secara pribadi, saya pikir coutlebih mudah dipelajari. mungkin yang lebih penting, Anda harus memilih coutkarena lebih aman, fleksibel, dan memungkinkan Anda untuk menentukan bagaimana suatu objek mencetak, yang berarti Anda sudah memiliki fungsi bawaan dan keamanan jenis menggunakan beberapa tipe perpustakaan standar. akhirnya, Anda hanya akan berakhir dengan program campuran ketika Anda menyadari mereka mungkin juga perlu belajar coutdi samping printf.

sebenarnya, saya pikir Anda harus membaca Accelerated C ++, oleh Koenig dan Moo dan mungkin menggunakannya untuk instruksi (menjawab pertanyaan 3 secara tidak langsung). dalam buku, mereka memperkenalkan std::coutsebelum return(halaman 3), dan menyimpan pointer dan array sampai bab 10. jika saya bisa menyalin dan menempelkan kata pengantar buku itu sebagai jawaban untuk pertanyaan Anda, saya akan melakukannya. (catatan: saya sarankan Anda membacanya untuk perspektif pengajaran c ++).

Sunting Di Sini adalah Kata Pengantar

Apakah ada sumber daya online untuk C ++ yang cocok digunakan untuk pelajar muda seperti itu?

jika Anda tidak ingin menggunakan Accelerated C ++ (yang mengasumsikan latar belakang dengan pemrograman pada umumnya), maka mungkin Anda ingin Eckel's Thinking in C ++ . Saya belum membacanya, tetapi ini adalah teks intro C ++ yang didistribusikan secara bebas.

justin
sumber
1
+1 ... dan saya sangat suka pada "mereka memperkenalkan std :: cout sesaat sebelum kembali (halaman 3)" harus mengintip yang itu :)
Felix Dombek
1
@ Feliks dan langsung sebelum std::coutperkenalan, kurung kurawal diperkenalkan =) (ini adalah diseksi sederhana dari "Halo, Dunia")
justin
1
Saya sungguh-sungguh merekomendasikan buku Koenig dan Moo. Ini menargetkan pengajaran C ++ dan pemrograman. Bruce Eckle's Thinking in C ++ terutama ditujukan untuk mengajar C ++ kepada mereka yang memiliki pengalaman sebelumnya dengan bahasa prosedural (seperti C atau Basic).
Stephen C. Steel
11

Satu hal yang perlu dipertimbangkan adalah bahwa dalam struktur data kode PERTAMA khas dari segala bentuk (struct, kelas, array, vektor, daftar) memainkan peran yang sangat kecil. Anda biasanya menangani sejumlah kecil data sensor, dan menggunakannya untuk memutuskan jumlah gerakan aktuator yang sangat kecil.

Tapi apa yang memainkan peran besar, dan dapat sangat sulit untuk memahami semua bentuk yang berbeda dari kontrol yang berlangsung.

Jadi saya lebih menekankan kontrol. Mulailah dengan dasar-dasar: if, for, while. Minta mereka banyak berlatih. Buat mereka mengenal mereka dengan baik ....

... tapi kemudian semakin sulit. Kode robot apa pun yang berukuran sedang akhirnya akan mencapai beberapa pola kontrol yang lebih rumit:

  • Loop "utama" besar, yang memanggil segalanya

  • Mesin negara (ini sering muncul)

  • Menyimpan nilai sebelumnya / penghitung berjalan (seperti untuk PID)

Ini sulit dipahami pemula. Berpikir tentang bagaimana suatu program bergerak melalui kode seperti ini membingungkan, Anda mungkin tidak menyadarinya sekarang, tetapi memang demikian. Ini akan memberi siswa Anda lebih banyak masalah daripada bahasa itu sendiri.

Juga, semoga berhasil! Semoga musim berjalan dengan baik.

Owen
sumber
2
+1; ini bukan lingkungan desktop biasa, tetapi kode embedded yang sebenarnya. Mesin negara jauh lebih penting daripada std :: vector vs array.
MSalters
8
  • Haruskah saya mulai menggunakan STL dari hari pertama, esp. vectoratau tetap dengan array standar? Array lebih mudah untuk diperkenalkan tetapi kesalahan pointer mungkin lebih sulit untuk ditangkap.

Masalah dengan array adalah apa pun kecuali contoh buku teks sederhana akan membutuhkan array berukuran dinamis, dan saat Anda membutuhkan array berukuran dinamis, std::vectorjauh lebih mudah. Selain itu, satu-satunya cara untuk menangani array ukuran dinamis dengan aman adalah dengan membungkusnya di kelas Anda sendiri, yang akan menjadi std::vectorrip-off yang buruk.
Berlawanan dengan kepercayaan yang tidak bisa dijelaskan, para siswa dapat menggunakan fitur yang membutuhkan mekanika rumit untuk diimplementasikan tanpa mengetahui bagaimana cara mengimplementasikan binatang seperti itu sendiri. Seperti yang saya katakan dalam komentar: Anda bahkan tidak akan berpikir untuk tidak mengajarkan string dalam bahasa lain, hanya karena implementasinya rumit, bukan?

  • Untuk I / O, haruskah saya berpegang teguh pada cout, dll. Atau apakah menurut Anda printfakan lebih mudah dipelajari?

Mengapa seperangkat konvensi string format kuno yang membuat program Anda meledak melalui atap saat Anda mendapatkan sesuatu yang salah (yang terjadi saat Anda mengubah typedefdalam beberapa header yang tampaknya tidak terkait) lebih disukai daripada jenis keamanan std::cout?

  • Apakah ada sumber daya online untuk C ++ yang cocok digunakan untuk pelajar muda seperti itu?

Sebagian besar sumber daya C ++, online atau tidak, buruk. Dan saya tidak berbicara tentang penggunaan font atau bahasa yang sulit dibaca. Saya berbicara kesalahan faktual yang sangat jelas. Ada sangat sedikit sumber daya C ++ yang bagus, kebanyakan satu atau dua lusin buku . Satu-satunya yang saya tahu adalah online adalah Bruce Eckel's Thinking in C ++ .


Selama satu dekade, saya telah mengajarkan C ++ kepada siswa dengan latar belakang yang sangat berbeda menggunakan Koenig / Moo's Accelerated C ++ sebagai basis. Kursus saya telah banyak berubah dalam dekade itu, sekarang tidak ada di dekat buku ini, kecuali untuk prinsip yang mendasarinya: Gunakan idiom modern, benar, aman sejak awal. Jangan mengajari siswa-siswa Anda cara memanipulasi memori secara manual, hanya agar mereka nanti melupakannya demi idiom yang lebih aman. Seperti yang dapat Anda lihat di beberapa jawaban yang disediakan di sini, ini tidak berfungsi: Mereka yang pernah mengajarkan cara manual terlebih dahulu jarang akan pernah memahami keuntungan menggunakan idiom modern dan aman.

sbi
sumber
7

Jika Anda ingin mengajar C ++, saya akan mulai langsung dengan C ++ konstruksi sebagai vektor dan cout, bukan subset C seperti printf.

K-ballo
sumber
7

Haruskah saya mulai menggunakan STL sejak hari pertama ...?

Iya nih. Menggunakan array asli di C ++ rentan kesalahan dan praktik buruk 99% dari waktu.

Untuk I / O, haruskah saya tetap berpegang pada cout, dll ...?

Iya nih.

Apakah ada sumber daya online untuk C ++ yang cocok digunakan untuk pelajar muda seperti itu?

Mereka tidak terlalu muda. Belajar untuk memprogram tidak membutuhkan kebijaksanaan, hanya motivasi dan pikiran yang terbuka. Saya tidak bisa memikirkan apa pun yang diajarkan dalam dua tahun terakhir sekolah menengah yang akan lebih baik mempersiapkan siswa untuk belajar program. Pernahkah Anda melihat Bruce Eckel's Thinking in C ++ ? Ini tersedia untuk diunduh gratis dan ditinjau dengan sangat baik. Silakan menghindari populer tetapi mengerikan C ++: Bagaimana Program dan semua Teach Sam Diri C ++ ... buku.

kevin cline
sumber
5

Saya diajari C ++ di sekolah tinggi sebagai bahasa pemrograman pertama, meskipun itu lebih seperti "C +", sekarang yang Anda sebutkan itu; kami digunakan coutuntuk menulis teks ke konsol dan file, tetapi juga beberapa fungsi C ( getch()adalah favorit saya).

Saya pikir cara yang paling efektif (dan mungkin menyenangkan) untuk mengajarkan dasar-dasarnya adalah menggunakan kurikulum yang berorientasi pada tujuan: mulai dengan menunjukkan bagaimana cara menghasilkan barang, kemudian input keyboard, kemudian file I / O yang sederhana, dll. Kemajuan ke teks sederhana game berbasis (atau robotika yang setara). Kemudian ketika mereka bertanya, "Bagaimana saya melakukan X?", Anda dapat menjabarkan X dalam hal contoh yang telah mereka lihat, misalnya "Pertama, Anda harus mendapatkan input dari pengguna seperti yang kami lakukan di Z, lalu ... "(jelas itu tidak mudah dalam praktiknya karena X kemungkinan akan menjadi sesuatu yang mereka butuhkan pengetahuan tambahan untuk melakukannya, misalnya" grafis 3D ", tetapi Anda masih bisa menjelaskan bagaimana itu akan bekerja di tingkat tinggi cara).

Contoh yang Anda tunjukkan akan dimulai sebagai kotak hitam yang disalin dari copy-paste, yang misteri-misterinya terurai ketika potongan-potongan teka-teki pemrograman perlahan-lahan diketahui. Misalnya, siswa Anda akan mempelajari dasar-dasar ifs dengan cukup cepat, tetapi mereka mungkin tidak akan menyadari bahwa ekspresi boolean tidak terbatas hanya untuk digunakan dalam ifkondisi (mengarah ke if (blah) return true; else return false;kode klasik ).

Seluk-beluk apakah Anda memilih array atau vektor sebagai wadah akan tampak tidak relevan bagi siswa pada awalnya. Vektor / array hanya akan menjadi cara memiliki banyak variabel sebagai satu variabel, dapat diakses melalui indeks. Tetap pada satu di mana Anda bisa. Pointer tidak akan dipahami sampai nanti. Itu bukan untuk mengatakan bahwa Anda tidak harus menjelaskan sesuatu; Hanya saja Anda tidak bisa menjelaskan semuanya sekaligus, dan hal-hal yang Anda jelaskan tidak akan sepenuhnya diserap. Manusia belajar secara organik, bukan linear. Saya telah menggunakan coutselama beberapa tahun sebelum saya benar-benar memahami apa kelebihan operator itu!

Oh, dan jangan takut pengulangan. "Ini seperti program Hello World yang kami lakukan - ingat bagaimana kami menulis teks ke konsol?" (tidak ...) "Ayo kita ulangi lagi hanya untuk memastikan." ... Dan ajukan pertanyaan! Biarkan siswa terlibat dengan contoh-contoh menyenangkan dan banyak interaksi.

C ++ adalah bahasa yang kompleks, dan apa pun yang Anda lakukan, sejumlah besar kerumitan itu (dan keahlian pemrograman secara umum) akan hilang pada siswa Anda. Semua yang Anda tunjukkan kepada mereka akan menjadi hal baru bagi mereka; sebagian besar tidak akan tenggelam pada tingkat pemahaman yang mendalam (setidaknya, tidak segera). Bagaimana memori bekerja, bagaimana komponen-komponen PC berinteraksi, apa tumpukan dan tumpukan, pointer, kelas, bahkan loop dan jika rantai lain tidak akan dipahami dengan baik oleh mayoritas. Ini bagus! Mereka tidak harus dipahami untuk digunakan - jumlah yang luar biasa dari program keren dapat ditulis dengan fungsi 1000-garis yang sangat jelek dengan s berlipat ganda berlipat lima ifdan 43 variabel bernama hal-hal seperti x_2r. Yang penting siswa terus belajar dan berkembang. Kotak hitam baik-baik saja selama mereka menjadi transparan (atau setidaknya abu-abu tembus) dalam jangka panjang. Pada akhir kursus, mereka mungkin tidak tahu apa desain patters, tetapi mereka harus dapat melihat kembali program yang mereka tulis dalam beberapa minggu pertama dan merasa ngeri pada kode mereka. Mereka harus memahami pada tingkat detail yang signifikan bagaimana program pertama yang mereka tulis benar-benar bekerja (sedangkan ketika mereka menulisnya mereka tidak tahu). Tetapi mereka tidak akan tahu segalanya - belum .

Cameron
sumber
5

Saya telah mengambil banyak kelas pemrograman dalam hidup saya dari sekolah menengah ke perguruan tinggi. Saya dapat mengatakan bahwa saya benar-benar tidak belajar terlalu banyak dari kelas c ++ pertama saya selain cara mencetak sesuatu ke aliran.

Saran saya, sebagai siswa muda, yang hanya memiliki beberapa tahun terakhir memiliki pekerjaan nyata menjadi pengembang, adalah untuk tidak membodohi mereka. Beri tahu mereka apa yang mereka lakukan dan cara kerjanya hingga ke tingkat sistem operasi (Tidak perlu masuk ke IMO khusus).

Saya pikir mengajar mereka C adalah cara yang lebih baik untuk melakukannya (masih akan selalu dikompilasi sebagai C ++ seperti yang Anda tahu). Mengajari mereka apa sebenarnya terminal itu, bagaimana program mereka berinteraksi dengannya, bahwa string adalah array karakter yang diakhiri dengan \ 0 di memori, apa malloc itu dan bagaimana C ++ mengabstraksikannya, bagaimana arang dan int disimpan dalam memori , dll ... Hal-hal inilah yang membuat seseorang benar-benar tahu bagaimana menyelesaikan masalah ketika mereka menemukannya dalam pengembangan.

Saya tidak bisa menekankan pentingnya membiarkan program anak-anak dan berada di sana terutama untuk menjawab pertanyaan. Dalam pengalaman saya, Anda belajar bahasa dengan menggunakannya. Buku dan pelajaran bisa membantu dan diperlukan untuk memulai, tetapi pada akhirnya, saya katakan berikan mereka file C / C ++ dan katakan: Ini adalah contoh X, saya ingin Anda melakukan Y (yang dapat dilakukan dengan meretas X). Tunjukkan pada mereka cara menggunakan halaman manual (jika mereka menggunakan * NIX) atau perlihatkan pada mereka cplusplus.com dan biarkan mereka menjelajahi std libs untuk mencari tahu sendiri berbagai hal.

TL; DR Biarkan anak-anak belajar sendiri. Hadir di sana untuk memberikan struktur dan menjawab pertanyaan.

Juga: Daftar tertaut adalah kebenaran!

Bobak Hashemi
sumber
4

Anda tidak mengajar mereka pemrograman secara umum, Anda mengajar mereka semacam pemrograman tertanam menggunakan Robot dan semacamnya. Jika saya mengerti dengan benar.

Pertama, saya pikir Anda harus memeriksa perpustakaan apa yang akan Anda gunakan dan apa yang Anda butuhkan.

Jika Anda memiliki perpustakaan C untuk digunakan atau seperti-C dengan banyak pointer dan array-C, maka saya kira Anda akan membutuhkan cara untuk mengajari mereka cara menggunakannya atau mengapa Anda menggunakannya.

Tapi, Anda bisa menunjukkan kepada mereka beberapa kode sederhana untuk memulainya dengan string dan vektor, begitulah cara C ++ bekerja. Itu tidak berarti Anda tidak bisa mengajari mereka petunjuk.

Mungkin Anda harus menjelaskan perbedaan antara level rendah C ++ (yang menyerupai C) dan level tinggi C ++ dengan STL. Salah satu hal yang paling sulit di C ++ untuk pemula adalah untuk melihat apa itu C, apa itu C ++ dan apa perbedaan sistem API.

Karena tujuannya di sini bukan untuk mempelajari pemrograman umum tetapi untuk memasuki kompetisi Robot, saya mengarahkan pengajaran dengan cara ini.

Nikko
sumber
2

Saya mulai mengajar siswa C ++ akhir tahun lalu dan musim panas ini juga untuk Tim Robotika PERTAMA kami.

Kami menggunakan Pemrograman Stroustrup - Prinsip dan Praktek Menggunakan C ++ . Saya menemukan buku itu bisa didekati, dibaca, dan diorganisasi dengan baik. Kami memiliki sekitar 6 siswa membaca bab-bab sendiri. Saya di sana untuk membantu mereka dengan terminologi dan pertanyaan. Mereka melakukan semua latihan dalam buku ini.

Saya meminta siswa mengerjakan bab 14. Melewati bab-bab di atas aliran (tidak berguna untuk pemrograman FRC). Melalui bab 14 bermanfaat karena mereka mendapatkan pengantar untuk subclass. Namun, mereka mungkin perlu melangkah lebih jauh dalam buku ini untuk lebih memahami konstruktor dan destruktor terkait dengan subkelas.

Jangan meremehkan siswa Anda. Para siswa senang memiliki buku, membaca, belajar, dan melakukan latihan; dan ini selama musim panas di waktu mereka sendiri! Ada banyak siswa yang tidak akan mengerti. Mereka harus beralih ke sesuatu yang lain; tidak semua orang mengerti pemrograman.

Hambatan terbesar bukanlah bahasa atau buku; itu adalah lingkungan pengembangan. Visual Studio Express dapat menakutkan bagi pengguna pertama kali. Anda dapat berharga dalam membantu siswa fokus pada pemrograman daripada lingkungan. Namun, mempelajari lingkungan sangat berharga karena programmer menghabiskan banyak waktu untuk beradaptasi dengan sistem pengembangan baru.

Semoga berhasil.

Bill Door
sumber
+1: Jawaban terbaik sejauh ini. Pilihan buku teks yang luar biasa. Selamat atas kesuksesan Anda.
kevin cline
1

Anda mengatakan Anda ingin mengajari mereka C ++ tetapi tidak mengajari mereka konstruksi C apa pun, tetapi sebagian besar konstruksi pemrograman yang harus mereka ketahui pertama adalah umum untuk semua bahasa dan versi C ++ berakar pada C:

  1. Ini adalah bagaimana Anda membuat program [int main (..) {return 0; }]. Berikan gambaran dasar lingkungan pemrograman yang Anda ingin mereka coba juga. Mereka perlu tahu cara membuat proyek dan benar-benar mengkompilasi / menjalankannya.

  2. Ini adalah variabel. Variabel dapat menyimpan data (int, char, float, dll).

  3. String (yang C ++ lebih mudah digunakan dengan cin).

  4. Ini adalah bagaimana Anda membaca dan menulis data (cin, cout). "Halo,% s!"

  5. Persyaratan (komputer perlu membuat keputusan).

  6. Loop (komputer pandai melakukan hal yang sama berulang-ulang). Perlihatkan while dan for loop.

Itu akan memakan waktu sekitar dua pelajaran masing-masing satu jam. Pastikan untuk menyiapkan serangkaian catatan singkat yang dapat mereka rujuk dalam komponen praktis. Anda tidak berusaha menjadikan mereka pemrogram yang brilian, jadi berikan contoh cara membaca dari konsol, membuat struktur, dan segala hal lain yang perlu mereka lakukan. Hanya gunakan fitur yang didukung bahasa, bukan perpustakaan utilitas khusus. Anda hanya akan membingungkan mereka lebih banyak.

Dari awal, pimpin dengan contoh dan tunjukkan pada mereka contoh kode yang ditata dengan baik. Indentasi harus benar, menguatkan, dan tanda kurung konsisten dengan gaya yang paling Anda sukai. Nama variabel harus bermakna. Jika Anda menunjukkan slop sebagai contoh maka mereka akan belajar bahwa slop dapat diterima. Ini titik awal yang buruk. Tekankan pentingnya mendapatkan indentasi yang benar - Saya menemukan bahwa ketika banyak yang saya ajarkan menjorok kode mereka secara konsisten, mereka lebih mudah melihat di mana kesalahan mereka. Itu karena sebagian besar kesalahan mereka adalah ruang lingkup yang salah untuk operasi (menempatkan operasi dalam loop / kondisi yang tidak dimaksudkan, atau kebalikannya).

Kemudian beralihlah ke pekerjaan praktis. Cara terbaik untuk mempelajari sesuatu adalah dengan memecahkannya dan mencari tahu sebabnya. Anda harus memastikan bahwa mereka memiliki lingkungan yang mudah digunakan untuk mengkompilasi kode mereka. Dokumentasikan dengan tangkapan layar di selebaran Anda.

Contoh bagus yang membantu saya grok beberapa konsep adalah membangun mesin Coke:

  • Output menu item dan harga (menyimpan menu adalah array dari struktur yang ditentukan pengguna. Bisa berupa kelas di C ++). Untuk mengeluarkannya diperlukan sebuah loop.
  • Baca dalam pilihan pengguna.
  • Minta uang kepada pengguna. Mereka dapat memasukkan denominasi koin dalam sen (1, 5, 10, 20, 50, 100, 200 di Aus). Abaikan denominasi yang tidak dikenal. Sementara pengguna belum memasukkan cukup uang, teruslah bertanya (loop).
  • Hitung perubahan yang diperlukan (divisi modulo), dengan memberikan jumlah koin paling sedikit. Cetak hasilnya ke layar.
  • Tunggu pengguna selanjutnya.

Setelah itu Anda dapat pindah ke C ++ konstruksi; Anda tidak ingin menyelam terlalu jauh sebelum mereka setidaknya bisa membuat program dasar.

Dan di atas semua itu, punya banyak waktu luang dan kesabaran untuk mencurahkan pertanyaan. Akan ada banyak, dan kebanyakan dari mereka akan membuat Anda ngeri karena mereka begitu sepele sehingga jawabannya jelas bagi Anda.

Adam Hawes
sumber
1

Saya pikir Anda tidak harus mengajarkan hal-hal dari sudut pandang C ++ ("C ++ hello world"), tetapi dari domain masalah - dalam hal ini, robotika - sudut pandang. Jadi, dunia halo Anda akan berkedip dipimpin atau mengendarai motor.

Tentu saja Anda dapat / harus menguraikan setiap tugas robotik kecil dalam subset dari peningkatan tindakan C ++ yang bermakna secara konseptual, yang melibatkan jenis, fungsi, dan operasi IO.

Sedangkan saya sendiri, saya bukan programmer profesional, dan mencoba belajar Java, C ++ dan Python. Saya benar-benar mulai mencapai sesuatu (Python) ketika saya memiliki masalah nyata (sederhana) untuk dipecahkan. Itu membuat saya langsung ke pokok permasalahan, menghindari perhatian berlebihan pada detail implementasi insidental dari bahasa itu sendiri.

Jadi saya akan menyarankan: jangan membaca manual bahasa, tetapi belajarlah untuk melakukan hal-hal dengan bahasa pilihan Anda. Itulah yang membuat orang tetap termotivasi, saya pikir.

heltonbiker
sumber
0

Saya akan mengajarkan C ++ yang ketat. Anda tahu bagaimana ketika Anda menulis printf dan memberikannya kepada params kecil atau jenis yang salah sesuatu yang aneh terjadi? dan jika Anda menggunakan pointer tidak valid hal-hal buruk dapat terjadi? JANGAN MENGAJAR BAHWA

Dari hari pertama saya akan mengajarkan bagaimana cara menggunakan referensi, STL dan mengatakan Anda KEHILANGAN TANDA untuk menggunakan pointer. Jangan mengajarkan petunjuk pintar juga. Satu-satunya waktu saya perhatikan saya menggunakan pointer adalah ketika saya melakukan GUI dan objek (seperti kotak gambar) harus ada dan menjadi gambar yang valid atau nol. Untuk pemrograman konsol saya tidak menggunakan pointer (pintar atau mentah) dalam waktu yang lama.

Jadi singkatnya jangan mengajari mereka apa pun yang dapat membuat mereka kesulitan. Ajari iostreams, struct, beri tahu mereka bahwa mereka juga kehilangan nilai pada typecast dan jangan coba mengajar desain. Anda tidak ingin orang menjadi profesional yang berpengalaman

pengguna2528
sumber
0

Ini bukan seri kuliah C ++, tapi Richard Buckland's COMP1917 adalah seri kuliah yang sangat baik dilakukan pada pemrograman dalam C (diikuti dengan COMP1927 , struktur data).

Menurut pendapat saya sendiri, C ++ terlalu banyak kerumitan bagi siswa baru, tetapi C adalah dunia yang lebih sederhana dan memberikan fondasi yang baik dalam pemrograman sistem yang sering kurang dimiliki oleh programmer C ++ baru.

greyfade
sumber
0

Saya akan mulai dengan potongan signifikan kode boilerplate, membantu mereka "melakukan sesuatu yang keren" dengan pemrograman segera dan memperbaiki pemahaman mereka tentang cara kerja dari waktu ke waktu. Mereka tidak perlu menghargai atau memahami semua seluk-beluk C ++ untuk membuat LED berkedip. Mereka hanya perlu tahu "jika Anda meletakkan kode ini di sana, itu akan membuat LED berkedip." Dan kemudian "hei, mari kita bicara tentang apa itu loop sekarang, jika Anda menulis loop, Anda dapat membuat LED berkedip 50 kali tanpa harus menulis 50 baris kode, bukankah itu keren?" Sekarang mari kita bicara tentang persyaratan, ketika pengguna menekan tombol A pada kotak kontrol, kami ingin mengaktifkan pneumatik untuk menaikkan bendera, inilah cara kami menambahkan kode untuk melakukannya. Atau jika sakelar 2 pada kotak kontrol kami dibalik, kami menjalankan motor bor secara terbalik, bukannya maju.

Jika Anda tetap fokus pada mengajar mereka "cukup" untuk menyelesaikan masalah yang mereka minati, itu akan membuat hal-hal jauh lebih luar biasa dan lebih mudah didekati. Jika mereka benar-benar tertarik, dan ingin memahami seluk-beluknya, mereka mungkin akan kembali dan membaca buku yang komprehensif tentang pemrograman atau mengikuti kursus sekolah musim panas di JC setempat.

Buatlah daftar "hal-hal yang mereka ingin dapat kendalikan" pada robot mereka dan ubah masing-masing menjadi pelajaran ... apa yang paling tidak perlu mereka ketahui ...?

  • melakukan sesuatu yang "tampak keren" jika sakelar berada dalam pengaturan tertentu?
  • beri tahu katup pneumatik untuk membuka atau menutup (mis: lampiran grabber)?
  • hidupkan dan matikan motor bor (untuk drivetrain)?
  • membuat robot mengubah arah jika sensor pendeteksi rintangan diaktifkan?
  • membuat robot beralih antara mode penggerak 2 roda vs 4 roda?
  • menyesuaikan sensitivitas joystick?
  • dll.

Saya akan tetap mengajarkan konstruksi yang paling mudah, seperti yang saya ajarkan tentang printf, karena format penspesifikasi sangat mudah digabungkan dan penspesifikasi yang salah sering merupakan resep otomatis untuk menghentikan program Anda. Demikian juga, vektor mengaburkan beberapa kompleksitas manajemen memori. Jangan khawatir tentang setiap detail tentang cara kerja, atau apa perpustakaan STL itu, paling tidak mereka perlu tahu untuk mencapai X (yang mungkin membutuhkan menggunakan struktur perpustakaan perpustakaan STL, misalnya)

Jessica Brown
sumber
0

Gunakan Cara Memprogram C ++ oleh Deitel dan Deitel. Buku teks yang SANGAT BAIK menurut saya.

Kedengarannya seperti Anda sedang mencoba mengajar pemula cara memprogram dan kemudian memprogram mereka pada tingkat lanjutan pada saat yang sama. Jika Anda berharap memberi mereka beberapa monyet lihat monyet melakukan pengkodean snippet tanpa pemahaman Anda ditakdirkan untuk gagal.

Tinggal jauh dari STL untuk kelas pemula.

Jika Anda sudah memiliki solusi pengkodean untuk robot Anda - atau IDE SANGAT BAIK seperti apa bentuknya maka mungkin Anda dapat "memetakan" pelajaran dalam buku teks ke tugas pengkodean untuk robot. Tapi biarkan buku teks mendorong pembelajaran.

Jika Anda memaksa memberi makan kode, memberikan siswa pelajaran yang sangat sempit dan paparan bahasa maka saya pikir sebagai lautan kode yang Anda tulis semakin besar dan lebih besar, itu akan seperti baru saja belajar mengayuh anjing dan Anda akan tenggelam karena berenang NYATA Dibutuhkan.

Ini bukan pertanyaan "haruskah mereka belajar cout atau printf?" Ini adalah pertanyaan tentang belajar cukup untuk memiliki wawasan tentang cara menulis kode untuk menyelesaikan tugas-tugas pemrograman robot.

Jika ini adalah tugas membaca, apa hasilnya jika semua yang mereka tahu adalah kalimat subjek-kata kerja sederhana dan hanya setengah dari kosakata yang Anda TAHU akan diperlukan.

radarbob
sumber