Cara mengajar mengatasi kesulitan, dan pada saat yang sama menulis siklus

Terlepas dari kenyataan bahwa kami akan fokus pada salah satu topik dasar, artikel ini ditulis untuk para profesional yang berpengalaman. Tujuannya adalah untuk menunjukkan apa kesalahpahaman yang dimiliki pemula dalam pemrograman. Untuk pengembang berlatih, masalah ini telah lama diselesaikan, dilupakan atau tidak diperhatikan sama sekali. Artikel bisa berguna jika Anda tiba-tiba harus membantu seseorang dengan topik ini. Artikel menarik paralel dengan bahan dari berbagai buku tentang pemrograman oleh Shildt, Straustrup, Okulov.

Topik siklus dipilih karena cukup banyak orang putus ketika menguasai pemrograman.

Teknik ini dirancang untuk siswa yang lemah. Sebagai aturan, mereka yang kuat dalam topik ini tidak terjebak dan tidak perlu menemukan teknik khusus untuk mereka. Tujuan sekunder dari artikel ini adalah untuk mentransfer metodologi ini dari kelas "bekerja untuk semua siswa, tetapi hanya untuk satu guru" ke kelas "bekerja untuk semua siswa, semua guru". Saya tidak berpura-pura menjadi benar-benar asli. Jika Anda sudah menerapkan teknik serupa untuk mengajarkan topik ini, silakan tulis bagaimana perbedaan versi Anda. Jika Anda memutuskan untuk mendaftar, beri tahu kami dengan hasil bagaimana semuanya berjalan. Jika teknik serupa dijelaskan dalam sebuah buku, silakan tulis namanya.


Saya berlatih teknik ini selama 4 tahun, belajar secara individu dengan siswa dari berbagai tingkat pelatihan. Hanya sekitar lima puluh siswa dan dua ribu jam kelas. Awalnya, siswa terjebak dan pergi selamanya tentang hal ini. Setelah setiap siswa, metodologi dan materi disesuaikan. Tahun lalu, siswa tidak lagi terjebak pada topik ini, jadi saya memutuskan untuk membagikan praktik terbaik saya.

Kenapa begitu banyak surat? Siklusnya elementer!


Seperti yang saya tulis di atas, untuk berlatih pengembang dan untuk siswa yang kuat, kompleksitas konsep siklus dapat diremehkan. Misalnya, Anda dapat mengatur kuliah yang panjang, melihat anggukan kepala dan mata yang cerdas. Tetapi ketika Anda mencoba untuk memecahkan masalah, masalah yang pingsan dan tidak dapat dijelaskan dimulai. Setelah kuliah, siswa mungkin hanya mengembangkan sebagian pemahaman. Situasi ini diperburuk oleh fakta bahwa siswa sendiri tidak dapat menyuarakan apa sebenarnya kesalahan mereka.
Suatu kali saya menyadari bahwa siswa menganggap contoh saya sebagai hieroglif. Yaitu, sebagai potongan teks yang tak terpisahkan di mana Anda perlu menambahkan semacam huruf "ajaib" dan itu akan berfungsi.
Kadang-kadang saya memperhatikan bahwa siswa berpikir bahwa untuk menyelesaikan masalah tertentu, beberapa konstruksi lain diperlukan, yang saya belum sampaikan. Meskipun solusinya hanya diperlukan sedikit modifikasi contoh.

Oleh karena itu, saya datang dengan gagasan bahwa fokus utama seharusnya tidak pada sintaks ekspresi, tetapi pada gagasan refactoring kode berulang menggunakan loop. Begitu siswa menguasai ide ini, setiap sintaks diperketat dengan sedikit latihan.

Kepada siapa dan mengapa saya mengajar


Karena tidak ada ujian masuk, di kelas bisa ada siswa yang kuat dan sangat lemah. Rincian lebih lanjut tentang siswa saya dapat ditemukan di artikel Potret siswa kursus malam.
Saya berusaha memastikan bahwa semua orang yang ingin itu menguasai pemrograman.
Kelas saya diadakan secara individual dan siswa membayar uangnya untuk masing-masing. Tampaknya siswa akan mengoptimalkan biaya dan memerlukan minimum. Namun, orang tidak menghadiri kelas penuh waktu dengan guru langsung untuk pengetahuan itu sendiri, tetapi untuk keyakinan bahwa mereka telah belajar, untuk rasa kemajuan dan untuk persetujuan dari seorang ahli (guru). Jika siswa tidak merasakan kemajuan dalam studi mereka, mereka akan pergi. Secara umum, kelas dapat dirancang sehingga siswa merasakan kemajuan dalam meningkatkan jumlah desain yang akrab. Yaitu, pertama kita belajar sambil detail, lalu kita belajar, lalu sementara dan sekarang kita punya kursus selama seribu satu malam, di mana kita belajar siklus hanya selama dua bulan, dan pada akhirnya kita memiliki seorang siswa yang menulis perpustakaan standar yang ditentukan. Namun, untuk menyelesaikan masalah praktis, orang tidak hanya membutuhkan pengetahuan materi, tetapi juga kemandirian dalam penerapannya dan dalam mencari informasi baru. Oleh karena itu, untuk kursus penuh waktu, saya pikir prinsipnya benar - untuk mengajar minimum dan mendorong studi independen tentang nuansa dan topik terkait. Dalam topik loop, saya menganggap konstruksi sementara minimum. Di atasnya Anda bisa memahami prinsipnya. Mengetahui prinsipnya, Anda bisa menguasainya baik untuk maupun untuk sementara.

Itu tidak cukup untuk menggambarkan sintaksis untuk mencapai penguasaan materi oleh siswa yang lemah. Anda perlu memberikan tugas yang lebih sederhana, namun beragam dan melukiskan contoh dengan lebih detail. Pada akhirnya, kecepatan perkembangan dibatasi oleh kemampuan siswa untuk mengubah ekspresi dan mencari pola. Untuk siswa yang cerdas, sebagian besar tugas akan membosankan. Saat berlatih dengan mereka, Anda tidak bisa memaksa untuk menyelesaikan 100% tugas. Materi saya dapat dilihat di github saya . Benar, repositori lebih seperti grimoire dari penyihir - tidak seorang pun kecuali saya akan mengerti apa yang ada , dan jika Anda gagal dalam cek, Anda bisa menjadi gila

Berlatih berorientasi pada praktik


Teori ini dijelaskan dengan contoh pemecahan masalah. Di kelas-kelas tentang dasar-dasar pemrograman, di mana percabangan dan pengulangan dipelajari, Anda tidak akan bisa memberikan kuliah yang bermanfaat tentang satu topik selama satu jam penuh. 15-20 menit sudah cukup untuk menjelaskan konsepnya. Kesulitan utama muncul ketika melakukan tugas-tugas praktis.
Guru pemula dapat membuang pernyataan, cabang, loop, dan array dalam satu kuliah. Di sini hanya para siswa mereka akan menghadapi masalah asimilasi informasi ini.
Anda tidak hanya perlu menyampaikan materi, tetapi juga memastikan bahwa audiens memahaminya.

Fakta penguasaan topik ditentukan oleh bagaimana siswa mengatasi pekerjaan mandiri.
Jika seorang siswa berhasil memecahkan masalah pada suatu topik tanpa bantuan seorang guru, maka topik itu telah dipelajari. Untuk memberikan verifikasi diri, setiap tugas diuraikan tabel dengan skrip pengujian. Tugas memiliki perintah yang diucapkan. Melewatkan tugas tidak disarankan. Jika tugas saat ini terlalu rumit, maka melanjutkan ke yang berikutnya tidak berguna. Dia bahkan lebih sulit. Agar siswa dapat menguasai tugas sulit saat ini, ia dijelaskan beberapa trik pada contoh tugas pertama. Sebenarnya, seluruh isi topik dikurangi menjadi metode mengatasi kesulitan. Siklus lebih cenderung merupakan efek samping.

Tugas pertama selalu menjadi contoh. Yang kedua sedikit berbeda dan dilakukan "secara mandiri" segera setelah yang pertama di bawah pengawasan seorang guru. Semua tugas selanjutnya ditujukan untuk menarik perhatian pada berbagai hal kecil yang dapat menyebabkan kebingungan.

Penjelasan dari contoh ini adalah dialog di mana siswa perlu memanggil kembali propagasi dan validasi silang untuk memastikan bahwa sebagian dari materi tersebut berasimilasi.

Saya akan dangkal dan menyatakan bahwa contoh pertama tentang topik ini sangat penting. Jika ada bahan untuk pekerjaan independen yang luas, penghilangan contoh pertama dapat diperbaiki. Jika, terlepas dari contoh, tidak ada yang lebih, maka siswa kemungkinan besar tidak akan menguasai topik.

Sementara atau untuk?


Salah satu masalah kontroversial adalah pilihan konstruk untuk contoh: sementara atau untuk. Suatu kali, seorang teman saya, seorang pengembang berlatih tanpa pengalaman mengajar, meyakinkan saya selama satu jam bahwa perulangan for adalah yang paling mudah untuk dipahami. Argumen datang ke "semuanya jelas di dalamnya dan diletakkan di tempat." Namun, akar penyebab kesulitan pemula sejati dalam gagasan siklus, dan bukan dalam penulisan. Jika seseorang tidak memahami ide ini, maka dia akan mengalami kesulitan dengan sintaksisnya. Begitu ide tersebut direalisasikan, masalah desain kode menghilang dengan sendirinya.

Dalam materi saya, tema siklus mengikuti tema percabangan. Kesamaan lahiriah jika dan sementara memungkinkan kita untuk menarik analogi langsung: "ketika kondisi di header benar, maka tubuh puas." Keunikan siklus adalah bahwa tubuh dilakukan berkali-kali.

Argumen kedua saya adalah bahwa sementara membutuhkan lebih sedikit hiasan daripada untuk. Kurang gaya - lebih sedikit kesalahan bodoh dengan koma dan tanda kurung yang hilang. Pemula belum begitu perhatian dan teliti sehingga mereka secara otomatis menghindari kesalahan sintaksis.
Argumen ketiga adalah bahwa banyak buku bagus dijelaskan terlebih dahulu.

Jika seorang siswa berhasil mengubah ekspresi dengan mudah, maka Anda dapat membicarakannya secara sepintas. Siswa akan memilih apa yang paling disukainya. Jika transformasi menyebabkan kesulitan, lebih baik untuk tidak menyebarkan perhatian. Biarkan siswa menyelesaikan semuanya dengan bantuan sementara. Setelah menguasai topik loop, Anda dapat menulis ulang solusi untuk mengetahui konversi while to for.
Siklus postkondisi adalah hewan langka. Saya tidak menghabiskan waktu sama sekali. Jika seorang siswa telah menguasai ide-ide pola pengungkapan dan mengubah ekspresi, maka dia akan dapat mengetahuinya tanpa bantuan saya.

Ketika menunjukkan contoh pertama kepada siswa yang kuat, saya menarik perhatian pada fakta bahwa dalam contoh pertama penting untuk memperbaiki tidak hanya solusi, tetapi juga seluruh rangkaian tindakan yang mengarah pada hasilnya. Siswa yang malas dapat mengabaikan tulisan dan hanya mentransfer algoritma yang terbatas untuk diri mereka sendiri. Mereka perlu diyakinkan bahwa suatu hari mereka akan menemukan tugas yang sulit. Untuk mengatasinya, Anda harus mengikuti langkah-langkah seperti dalam contoh ini. Itulah mengapa penting untuk memperbaiki semua tahapan. Dalam tugas-tugas berikut, hanya dimungkinkan untuk meninggalkan solusi akhir.

Gagasan utama otomatisasi adalah bahwa kami memerintahkan komputer untuk melakukan pekerjaan rutin per orang. Salah satu trik dasar adalah siklus menulis. Ini digunakan ketika beberapa tindakan berulang identik ditulis dalam suatu program berturut-turut.

Eksplisit lebih baik daripada implisit


Mungkin tampak seperti ide yang baik dalam tugas pertama pada siklus untuk menampilkan beberapa frase yang identik beberapa kali. Sebagai contoh:
Hore, itu berhasil!
Hore, itu berhasil!
Hore, itu berhasil!
Hore, itu berhasil!
Hore, itu berhasil!
Hore, itu berhasil!
Hore, itu berhasil!
Hore, itu berhasil!

Opsi ini buruk karena output tidak menunjukkan nilai penghitung. Ini masalah bagi pemula. Jangan meremehkannya. Pada awalnya, tugas ini adalah yang pertama, dan tugas menghasilkan serangkaian angka dalam urutan menaik adalah yang kedua. Saya harus memperkenalkan istilah tambahan "cycle N times" dan "cycle from A ke B", yang pada dasarnya sama. Agar tidak menghasilkan entitas yang tidak perlu, saya memutuskan untuk hanya menampilkan contoh dengan serangkaian angka. Hanya sedikit yang bisa belajar bagaimana menjaga counter di kepala mereka dan mensimulasikan perilaku suatu program di kepala mereka tanpa persiapan. Untuk pertama kalinya, beberapa siswa dihadapkan dengan pemodelan "dalam pikiran" pada topik siklus.
Setelah beberapa latihan, saya memberikan tugas mengulangi teks yang sama ke solusi independen. Jika Anda pertama kali memberikan penghitung yang terlihat, dan kemudian tidak terlihat, maka siswa memiliki lebih sedikit masalah. Kadang-kadang petunjuk “jangan tulis penghitung di layar” sudah cukup.

Bagaimana orang lain menjelaskannya?


Dalam sebagian besar materi pendidikan di Internet, sintaks loop diberikan sebagai bagian dari "kuliah". Misalnya, di developer.mozilla.org (saat ini), beberapa konstruksi lainnya dijelaskan bersama dengan loop sementara. Dalam hal ini, hanya konstruksi itu sendiri yang diberikan dalam bentuk templat. Hasil peluncuran mereka dijelaskan dalam kata-kata, tetapi ilustrasinya hilang. Menurut pendapat saya, presentasi topik seperti itu akan melipatgandakan kegunaan materi tersebut dengan nol. Siswa dapat menulis ulang kode dan menjalankannya sendiri, tetapi tolok ukur untuk perbandingan masih diperlukan. Bagaimana memahami bahwa contoh ditulis ulang dengan benar jika tidak ada yang membandingkan hasilnya?
Ketika hanya sebuah template yang diberikan, tanpa contoh, itu menjadi lebih sulit bagi seorang siswa. Bagaimana memahami bahwa fragmen kode ditempatkan dalam templat dengan benar? Anda dapat mencoba menulis entah bagaimana , dan kemudian jalankan. Tetapi jika tidak ada standar untuk membandingkan hasilnya, maka peluncuran juga tidak akan membantu.

Dalam kursus C ++ tentang intuisi, sintaks loop dikubur di halaman ketiga Kuliah 4 tentang topik "operator". Saat menjelaskan sintaks loop, penekanan khusus ditempatkan pada istilah "operator". Istilah ini disajikan sebagai serangkaian fakta seperti “simbol; ini adalah operator "," {} ini adalah operator gabungan "," tubuh loop harus menjadi operator ". Saya tidak suka pendekatan ini karena tampaknya menyembunyikan hubungan penting dalam satu masa. Analisis kode sumber program ke dalam istilah pada tingkat seperti itu diperlukan bagi pengembang kompiler untuk mengimplementasikan spesifikasi bahasa, tetapi tidak untuk siswa dalam perkiraan pertama. Pemula dalam pemrograman jarang memiliki ketelitian untuk begitu memperhatikan persyaratan. Seseorang yang jarang mengingat dan memahami kata-kata baru pertama kali. Sebenarnya tidak ada yang dapat dengan benar menerapkan istilah yang baru saja mereka pelajari. Oleh karena itu, siswa memiliki banyak kesalahan seperti "menulis sementara (a <7); {, tetapi program tidak bekerja".
Menurut pendapat saya, pada awalnya lebih baik untuk memberikan sintaks konstruksi segera dengan tanda kurung. Pilihan tanpa tanda kurung hanya dijelaskan jika siswa memiliki pertanyaan spesifik "mengapa itu bekerja tanpa tanda kurung".

Dalam buku Okulov "Fundamentals of Programming" pada 2012, berkenalan dengan siklus dimulai dengan templat, kemudian rekomendasi diberikan untuk penggunaannya, dan kemudian bagian eksperimental dari pelajaran segera menyusul. Saya mengerti bahwa buku itu ditulis untuk minoritas siswa berkemampuan tinggi yang jarang datang ke kelas saya.

Dalam buku-buku populer, hasil dari fragmen kode selalu ditulis. Misalnya, Schildt "Java 8. Complete Guide" edisi 2015. Pertama, template diberikan, lalu contoh program, dan segera setelah itu adalah hasil eksekusi.
Sebagai contoh, perhatikan loop sementara di mana terbalik
hitungan mundur, mulai dari 10, dan tepat 10 baris "ukuran" adalah output:
//    while class While { public static void main(String args []) { int n = 10; while (n > 0) { System.out.println(" " + n); n--; } } } 

Setelah memulai program ini menampilkan sepuluh "tindakan" sebagai berikut:
10
9
8
7
6
5
4
3
2
1

Pendekatan yang menggambarkan templat, program sampel, dan hasil program ini juga digunakan dalam buku “Javascript untuk anak-anak” dan dalam kursus js di w3schools.com. Format halaman web bahkan memungkinkan Anda untuk membuat contoh ini interaktif.

Dalam buku Straustrup 2016, Prinsip dan Praktek Menggunakan C ++, penulis melangkah lebih jauh. Langkah pertama menjelaskan apa yang seharusnya terjadi, dan setelah itu - tampilkan teks program. Selain itu, sebagai contoh, mereka mengambil tidak hanya program acak, tetapi memberikan perjalanan ke dalam sejarah. Ini membantu untuk menarik perhatian padanya. “Lihat, ini bukan hanya teks yang tidak berguna. Anda melihat sesuatu yang signifikan. "
Sebagai contoh iterasi, pertimbangkan program pertama yang dijalankan pada mesin dengan program tersimpan (EDSAC). Itu ditulis oleh David Wheeler di lab komputer di Universitas Cambridge, Inggris pada 6 Mei 1949. Program ini menghitung dan mencetak daftar kotak sederhana.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Di sini, setiap baris berisi angka diikuti oleh tab ('\ t') dan kuadrat dari angka itu. Versi C ++ dari program ini terlihat seperti ini:
 //      0-99 int main() { int i = 0; //    while(i < 100){ cout << i << '\t' << square(i) << '\n'; ++i; } } 

Anehnya, templat sintaks tidak dijelaskan dalam buku ini. Stroustrup dalam buku pedoman instruktur ( terjemahan ) menekankan bahwa ia menghormati kecerdasan siswa-siswanya. Mungkin kemampuan untuk mengidentifikasi pola dalam beberapa contoh dianggap sebagai manifestasi dari kecerdasan tersebut.

Seperti yang saya jelaskan sendiri


Pendekatan Straustrup: deskripsi hasil, kemudian solusi untuk masalah, dan kemudian analisis independen oleh siswa - terlihat paling bijaksana. Oleh karena itu, saya memutuskan untuk mengambilnya sebagai dasar, tetapi menceritakannya dengan contoh yang kurang historis - tugas untuk memperoleh "daftar isi". Ini membentuk jangkar yang dapat dikenali, sehingga nantinya dikatakan "mengingat tugas dari daftar isi" dan agar siswa mengingatnya. Dalam contoh saya, saya mencoba memperingatkan dua lagi kesalahpahaman yang paling umum. Selanjutnya saya akan menulis lebih banyak tentang mereka.
Pada tugas ini, kami berkenalan dengan metode pemecahan masalah yang kompleks. Keputusan awal harus dibuat secara primitif dan sederhana. Nah, maka Anda bisa memikirkan cara meningkatkan solusi ini.

1
2
3
4
5
6
7

Menurut pengamatan saya, pendekatan "contoh-hasil-templat" dalam kombinasi yang berbeda masih mengarahkan siswa untuk menganggap siklus sebagai hieroglif. Ini memanifestasikan dirinya dalam kenyataan bahwa mereka tidak mengerti mengapa mereka harus menulis suatu kondisi, bagaimana memilih antara i ++ dan i-- dan hal-hal lain yang tampaknya jelas. Untuk menghindari kesalahpahaman ini, pendekatan cerita tentang siklus harus menekankan arti mengulangi tindakan yang sama dan hanya kemudian - merancang mereka menggunakan desain. Karena itu, sebelum memberikan sintaksis loop, Anda harus menyelesaikan masalah "dahi". Solusi primitif untuk masalah daftar isi terlihat seperti ini:
 Console.WriteLine(""); Console.WriteLine(" 1"); Console.WriteLine(" 2"); Console.WriteLine(" 3"); Console.WriteLine(" 4"); Console.WriteLine(" 5"); Console.WriteLine(" 6"); Console.WriteLine(" 7"); Console.WriteLine(""); 

Bagaimana itu bisa diperbaiki?
Ganti tindakan berulang dengan satu lingkaran.
Tindakan apa yang diulang dalam satu baris tanpa perubahan?
Tidak ada dalam fragmen ini. Namun, perintah untuk menampilkan kata "Bab" dengan nomor tersebut sangat mirip satu sama lain.
Oleh karena itu, langkah selanjutnya adalah mencari perbedaan antara fragmen. Hanya dalam tugas ini bahwa semuanya jelas, maka tidak ada perintah tunggal akan diulang, tetapi blok kode 5 baris atau lebih. Anda harus mencari tidak hanya dalam daftar perintah, tetapi dalam konstruksi cabang atau loop.
Dalam contoh, perbedaan antara tim dalam jumlah setelah kata "Bab".
Setelah perbedaan ditemukan, Anda perlu memahami pola perubahan. Fragmen yang berbeda adalah angka ini? Apakah terus meningkat atau menurun? Bagaimana nilai perubahan angka antara dua tim berdampingan?
Dalam contoh, angka setelah kata "Bab" meningkat dengan langkah 1. Perbedaannya ditemukan, polanya terungkap. Sekarang Anda dapat mengganti fragmen yang berbeda dengan variabel.
Variabel seperti itu harus dideklarasikan sebelum fragmen berulang yang pertama. Variabel seperti itu biasanya disebut I atau j atau entah bagaimana lebih diperluas. Nilai awalnya harus sama dengan nilai pertama yang ditampilkan di layar. Dalam contoh, nilai pertama adalah 1.
Nilai awal apa yang harus diambil untuk menghasilkan serangkaian angka "100, 101, 102, 103, 104, 105"?
Di baris ini, angka pertama adalah 100.
Setelah setiap perintah output, Anda perlu meningkatkan nilai variabel ini dengan 1. Unit ini adalah langkah perubahan.
Apa langkah yang akan terjadi dalam rangkaian angka "100, 102, 104, 106"?
Di baris ini, langkah 2.
Setelah mengganti fragmen yang berbeda dengan variabel, kode akan terlihat seperti ini:
 Console.WriteLine(""); int i; i = 0; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(""); 

Setelah menerapkan teknik "ekspresikan hukum variabel", kode menghasilkan beberapa kelompok tindakan identik yang dilakukan berturut-turut. Sekarang tindakan berulang dapat diganti dengan loop.

Urutan pemecahan masalah di mana Anda perlu menggunakan siklus terdiri dari langkah-langkah:
  1. Pecahkan "dahi" dengan banyak tim terpisah
  2. Temukan polanya
  3. Nyatakan keteraturan suatu variabel
  4. Desain sebagai lingkaran


Selanjutnya, istilah baru diperkenalkan sehingga siswa tidak menemukan dirinya dalam situasi "Saya mengerti segalanya, tetapi saya tidak bisa mengatakan":
- penghitung selalu merupakan variabel yang diperlukan untuk melacak jumlah langkah dalam satu siklus. Biasanya bilangan bulat yang dibandingkan dengan kendala.
- langkah kontra - deskripsi pola perubahan di konter.
- restriction - angka atau variabel yang digunakan penghitungnya dibandingkan, sehingga algoritmenya terbatas. Nilai penghitung berubah sehingga mendekati batas.
- cycle body - satu set perintah yang akan diulang. Ketika dikatakan "perintah itu tertulis di dalam siklus", itu berarti tubuh.
- loop iterasi - eksekusi tunggal dari tubuh loop.
- kondisi loop adalah ekspresi logis yang menentukan apakah iterasi lain akan dilakukan. (Mungkin ada kebingungan dengan desain cabang)
Anda harus siap dengan kenyataan bahwa pada awalnya siswa akan menggunakan istilah untuk tujuan lain. Ini berlaku untuk yang kuat dan yang lemah. Membangun bahasa yang umum adalah seni keseluruhan. Saya akan menulis secara singkat sekarang: Anda perlu mengatur tugas "pilih fragmen kode dengan <term>" dan gunakan istilah ini dalam percakapan dengan benar.
Setelah konversi dengan loop, sebuah fragmen diperoleh:
 Console.WriteLine(""); int i = 0; while (i < 7) { Console.WriteLine(" " + i); i = i + 1; } Console.WriteLine(""); 


Kesalahpahaman utama


Salah satu kesalahpahaman populer siswa adalah bahwa mereka memasukkan ke dalam struktur loop tindakan-tindakan yang perlu dilakukan hanya sekali. Misalnya, seperti ini:
 ; int i = 0; while (i < 7) { Console.WriteLine("") Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(""); } 

Siswa secara konstan menemukan masalah ini, baik di awal maupun dalam tugas yang lebih kompleks.
Petunjuk mahkota dalam hal ini:
Berapa kali Anda perlu mengulangi perintah: sekali atau banyak?

Perintah output untuk kata-kata "Pendahuluan" dan "Kesimpulan", serta deklarasi dan inisialisasi variabel i, tidak seperti tindakan berulang lainnya. Mereka dieksekusi hanya sekali, yang berarti mereka harus ditulis di luar tubuh siklus.

Ketiga tahap solusi harus tetap dalam kode, untuk kemudian merujuk mereka jika terjadi kesulitan. Dua opsi pertama sudah cukup untuk memberikan komentar sehingga tidak mengganggu.
Perhatian siswa harus diberikan pada fakta-fakta berikut:
- Dalam kondisi loop, penghitung dan batas biasanya dibandingkan. Penghitung dapat berubah di badan loop, tetapi batasnya tidak. Untuk melanggar aturan ini, Anda perlu merumuskan alasan yang bagus.
- Perintah untuk menampilkan kata "Pendahuluan" dan "Kesimpulan" berada di luar tubuh siklus. Kita perlu menjalankannya 1 kali. "Pendahuluan" - sebelum mengulangi tindakan, "Kesimpulan" - sesudahnya.
Dalam proses mengkonsolidasikan topik ini, menguasai hal-hal berikut, serta cobaan dengan kesulitan, bahkan berguna bagi siswa yang kuat untuk mengajukan pertanyaan: “Tetapi berapa kali tindakan ini perlu dilakukan? Satu atau banyak? "

Pengembangan keterampilan tambahan


Dalam proses belajar siklus, siswa masih memiliki keterampilan mendiagnosis dan menyelesaikan masalah. Untuk melakukan diagnosis, siswa harus mempresentasikan hasil yang diinginkan dan membandingkannya dengan hasil yang sebenarnya. Tindakan untuk koreksi tergantung pada perbedaan di antara mereka.
Karena siswa pada tahap ini masih memiliki gagasan yang buruk tentang hasil "yang diinginkan", mereka dapat fokus pada data tes. Sebagai aturan, tidak ada seorang pun di tahap ini yang masih mengerti apa yang salah dan bagaimana mengatasinya. Oleh karena itu, saya memberikan deskripsi masalah khas dan beberapa cara untuk menyelesaikannya di bawah entri di buku catatan. Pilihan yang paling cocok untuk mereka adalah tugas siswa itu sendiri.
Catatan diperlukan untuk bertanya, "Apa yang terjadi diharapkan?", "Manakah dari situasi ini sekarang terjadi?", "Apakah solusinya membantu?".
  1. Jumlah tindakan adalah 1 kurang atau lebih dari yang diharapkan. Cara untuk memecahkan:
    - menambah nilai awal penghitung sebesar 1.
    - ganti operator perbandingan ketat (<or>) dengan yang tidak ketat (<= atau> =).
    - ubah nilai batasan menjadi 1.
  2. Tindakan dalam loop dilakukan tanpa henti, tanpa henti. Cara untuk memecahkan:
    - tambahkan perintah perubahan balik jika tidak ada.
    - memperbaiki perintah perubahan balik sehingga nilainya menjadi lebih dekat ke batas.
    - hapus perintah untuk mengubah kendala, jika ada di tubuh siklus.
  3. Jumlah tindakan dalam loop lebih dari 1 kurang atau lebih dari yang diharapkan. Tindakan dalam loop tidak pernah dijalankan. Pertama, Anda perlu mengetahui nilai aktual dari variabel sebelum dimulainya siklus. Cara untuk memecahkan:
    - ubah nilai awal dari kendala
    - ubah nilai awal penghitung

Biasanya, masalah 3 terkait dengan menggunakan variabel yang salah atau non-zeroing the counter.

Setelah penjelasan ini, siswa mungkin masih memiliki berbagai kesalahpahaman tentang operasi siklus.
Untuk menghilangkan yang paling umum, saya memberikan tugas:
  1. Di mana batasannya, nilai awal penghitung atau langkah penghitung dimasukkan oleh pengguna.
  2. Di mana nilai penghitung harus digunakan dalam beberapa ekspresi aritmatika. Disarankan dengan penghitung dalam ekspresi radikal atau dalam penyebut sehingga perbedaannya adalah non-linear.
  3. Di mana nilai penghitung tidak ditampilkan selama siklus. Misalnya, output dari jumlah yang diperlukan dari fragmen teks yang identik atau gambar sebuah gambar dengan grafis kura-kura.
  4. Di mana Anda perlu melakukan beberapa tindakan berulang, lalu yang lain.
  5. Di mana Anda perlu melakukan tindakan lain sebelum dan sesudah diulang

Untuk setiap tugas, Anda perlu memberikan data uji dan hasil yang diharapkan.

Untuk memahami seberapa cepat Anda dapat bergerak, Anda perlu membaca kondisi tugas-tugas ini dan bertanya: "bagaimana mereka berbeda dari contoh?", "Apa yang perlu diubah dalam contoh untuk menyelesaikannya?". Jika siswa menjawab dengan penuh makna, maka biarkan dia memutuskan setidaknya satu dalam pelajaran, dan sisanya - di rumah sendiri. Jika solusinya berhasil, maka Anda dapat mulai menjelaskan kondisi di dalam loop.
Jika dengan solusi independen untuk kesulitan, maka Anda perlu memikirkan semuanya dalam pelajaran. Agar solusi untuk masalah tidak menyerupai menggambar burung hantu, saya sarankan Anda terlebih dahulu menyelesaikan masalah tidak secara universal. Yaitu, agar solusi melewati tes pertama dan tidak menggunakan loop konstruksi. Nah, kemudian terapkan transformasi untuk mencapai universalitas solusi.

Loop dan Cabang


Menurut pendapat saya, berguna untuk memberikan topik "loop di dalam cabang" secara terpisah. Sehingga nanti Anda bisa melihat perbedaan antara pemeriksaan beberapa kondisi dan satu pemeriksaan tunggal.
Tugas untuk memperbaiki adalah tentang output angka dari A ke B, yang dimasukkan oleh pengguna:
- selalu naik.
- naik atau turun tergantung pada nilai A dan B.

Topik "percabangan siklus dalam" harus diteruskan hanya setelah siswa telah menguasai trik: "mengganti pola dengan variabel" dan "mengganti tindakan berulang dengan loop".
Alasan utama untuk menggunakan percabangan dalam loop adalah anomali dalam pola. Di tengah, itu rusak tergantung pada sumber data.
Bagi para siswa yang mampu mencari solusi dengan menggabungkan teknik-teknik sederhana, cukup untuk mengatakan "percabangan dapat ditulis di dalam loop" dan memberikan tugas "misalnya" sepenuhnya ke solusi independen.
Tugas misalnya:
Pengguna memasukkan angka X. Tampilkan dalam angka kolom dari 0 hingga 9 dan menempatkan tanda '+' di seberang angka yang sama dengan X.

Jika 0 dimasukkan
0+
1
2
3
4
5
6
7
8
9

Jika 6 dimasukkan
0
1
2
3
4
5
6+
7
8
9

Jika 9 dimasukkan
0
1
2
3
4
5
6
7
8
9+

Jika 777 dimasukkan
0
1
2
3
4
5
6
7
8
9

Jika penjelasan singkat tidak cukup untuk menulis dengan loop, maka Anda perlu mencapai solusi universal untuk masalah yang sama tanpa loop.
Anda akan mendapatkan salah satu dari dua opsi:
Diinginkan
 string temp; temp = Console.ReadLine(); int x; x = int.Parse(temp); if (x==0) { Console.WriteLine(0 + "+"); } else { Console.WriteLine(0); } if (x==1) { Console.WriteLine(1 + "+"); } else { Console.WriteLine(1); } if (x==2) { Console.WriteLine(2 + "+"); } else { Console.WriteLine(2); } if (x==3) { Console.WriteLine(3 + "+"); } else { Console.WriteLine(3); } if (x==4) { Console.WriteLine(4 + "+"); } else { Console.WriteLine(4); } if (x==5) { Console.WriteLine(5 + "+"); } else { Console.WriteLine(5); } if (x==6) { Console.WriteLine(6 + "+"); } else { Console.WriteLine(6); } if (x==7) { Console.WriteLine(7 + "+"); } else { Console.WriteLine(7); } if (x==8) { Console.WriteLine(8 + "+"); } else { Console.WriteLine(8); } if (x==9) { Console.WriteLine(9 + "+"); } else { Console.WriteLine(9); } 


Mungkin
 string temp; temp = Console.ReadLine(); int x; x = int.Parse(temp); if (x==0) { Console.WriteLine("0+\n1\n2\n3\n4\n5\n6\n7\n8\n9"); } if (x==1) { Console.WriteLine("0\n1+\n2\n3\n4\n5\n6\n7\n8\n9"); } if (x==2) { Console.WriteLine("0\n1\n2+\n3\n4\n5\n6\n7\n8\n9"); } if (x==3) { Console.WriteLine("0\n1\n2\n3+\n4\n5\n6\n7\n8\n9"); } if (x==4) { Console.WriteLine("0\n1\n2\n3\n4+\n5\n6\n7\n8\n9"); } if (x==5) { Console.WriteLine("0\n1\n2\n3\n4\n5+\n6\n7\n8\n9"); } if (x==6) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6+\n7\n8\n9"); } if (x==7) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6\n7+\n8\n9"); } if (x==8) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6\n7\n8+\n9"); } if (x==9) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6\n7\n8\n9+"); } 


Saya memberikan masalah serupa sebelumnya, sambil mempelajari topik percabangan.
Jika siswa memiliki pilihan "mungkin", maka Anda perlu mengatakan bahwa ada banyak solusi untuk masalah yang sama. Namun, mereka berbeda dalam resistensi mereka terhadap perubahan persyaratan. Ajukan pertanyaan: "Berapa banyak tempat dalam kode yang perlu diperbaiki jika Anda harus menambahkan nomor lain?" Dalam versi "mungkin", Anda perlu menambahkan cabang lain dan menambahkan nomor baru di 10 tempat lain. Dalam "yang diinginkan", cukup untuk menambahkan hanya satu cabang.
Atur tugas untuk mereproduksi opsi "yang diinginkan", kemudian temukan pola dalam kode, lakukan penggantian variabel dan tulis satu lingkaran.
Jika Anda memiliki ide bagaimana menyelesaikan masalah ini tanpa loop dengan cara lain, silakan tulis di komentar.

Loop di dalam loop


Di utas ini Anda perlu memperhatikan fakta bahwa:
- Penghitung untuk loop dalam dan luar harus variabel yang berbeda.
- penghitung untuk loop dalam perlu diatur ulang berkali-kali (yaitu, di dalam tubuh loop luar).
- dalam tugas-tugas keluaran teks, Anda tidak dapat terlebih dahulu menulis satu huruf dalam beberapa baris, dan kemudian yang kedua. Pertama, Anda perlu mencetak semua huruf pada baris pertama, lalu semua huruf kedua dan seterusnya.

Penjelasan topik tentang loop di dalam loop sebaiknya dimulai dengan menjelaskan pentingnya mengatur ulang counter.
Tugas misalnya:
Pengguna memasukkan dua angka: R dan T. Mencetak dua baris karakter "#". Baris pertama harus berisi karakter R. Baris kedua adalah potongan T. Jika ada angka negatif, tampilkan pesan kesalahan.

R = 5, T = 11
#####
#############

R = 20, T = 3
######################
###

R = -1, T = 6
Nilai R harus non-negatif

R = 6, T = -2
Nilai T harus non-negatif

Jelas, masalah ini juga memiliki setidaknya dua solusi.
Diinginkan
 string temp; int R; int T; temp = Console.ReadLine(); R = int.Parse(temp); temp = Console.ReadLine(); T = int.Parse(temp); int i = 0; while (i < R) { Console.Write("#"); i = i + 1; } Console.WriteLine(); i = 0; while (i < T) { Console.Write("#"); i = i + 1; } 


Kemungkinan No. 1
 string temp; int R; int T; temp = Console.ReadLine(); R = int.Parse(temp); temp = Console.ReadLine(); T = int.Parse(temp); int i = 0; while (i < R) { Console.Write("#"); i = i + 1; } Console.WriteLine(); int j = 0; j = 0; while (j < T) { Console.Write("#"); j = j + 1; } 


Perbedaannya adalah bahwa dalam solusi "mungkin", variabel kedua digunakan untuk menampilkan baris kedua. Anda harus bersikeras menggunakan variabel yang sama untuk kedua siklus. Orang dapat memperdebatkan batasan semacam itu dalam bahwa solusi dengan satu penghitung untuk dua siklus akan menjadi ilustrasi dari istilah "penghitung penomoran". Memahami istilah ini diperlukan saat memecahkan masalah berikut. Sebagai kompromi, Anda dapat menyimpan kedua solusi untuk masalah tersebut.

Masalah umum dengan menggunakan variabel penghitung tunggal untuk dua siklus muncul sebagai berikut:
R = 5, T = 11
#####
######

Jumlah karakter di baris kedua tidak sesuai dengan nilai T. Jika bantuan diperlukan dengan masalah ini, maka Anda perlu "menyodok hidung Anda" ke dalam sinopsis tentang masalah khas dengan loop. Ini adalah gejala nomor 3. Itu didiagnosis jika Anda menambahkan output dari nilai penghitung segera sebelum siklus kedua. Diperbaiki dengan zeroing. Tetapi lebih baik tidak langsung memberi tahu. Siswa harus mencoba merumuskan setidaknya satu hipotesis.

Tentu saja, masih ada solusi seperti itu. Tapi saya belum pernah melihatnya di antara siswa. Pada tahap mempelajari siklus, cerita tentang dirinya akan menyebarkan perhatian. Anda dapat kembali lagi nanti, saat mempelajari fungsi-fungsi bekerja dengan string.
Kemungkinan nomor 2
 string temp; int R; int T; temp = Console.ReadLine(); R = int.Parse(temp); temp = Console.ReadLine(); T = int.Parse(temp); Console.WriteLine(new String('#', R)); Console.WriteLine(new String('#', T)); 



Tugas yang dibutuhkan berikutnya:
Tampilkan angka dari 0 hingga 9. Setiap digit harus pada barisnya sendiri. Jumlah digit per baris (W) dimasukkan dari keypad.

W = 1
0
1
2
3
4
5
6
7
8
9

W = 10
0000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999


Jika seorang siswa telah menguasai teknik mengganti variabel, maka ia akan mengatasinya dengan cukup cepat. Masalah yang mungkin terjadi lagi adalah mem-zeroing variabel. Jika Anda tidak dapat mengatasi konversi, maka Anda sedang terburu-buru dan Anda perlu memecahkan masalah yang lebih sederhana.

Terima kasih atas perhatian anda Seperti, berlangganan ke saluran.

PS Jika Anda menemukan kesalahan ketik atau kesalahan dalam teks, beri tahu saya.Ini dapat dilakukan dengan menyorot bagian dari teks dan menekan "⌘ + Enter" pada Mac, dan pada keyboard klasik "Ctrl / Enter", atau melalui pesan pribadi. Jika opsi ini tidak tersedia, tulis tentang kesalahan dalam komentar. Terima kasih

Source: https://habr.com/ru/post/id456500/


All Articles