Bagaimana mengajarkan bagaimana mengatasi kesulitan, dan sekaligus menulis siklus

Terlepas dari kenyataan bahwa kita akan membicarakan salah satu topik dasar, artikel ini ditulis untuk para profesional berpengalaman. Tujuannya adalah untuk menunjukkan kesalahpahaman yang dimiliki pemula dalam pemrograman. Bagi para pengembang yang berpraktik, masalah-masalah ini telah lama terpecahkan, dilupakan atau tidak diperhatikan sama sekali. Artikel ini mungkin berguna jika Anda tiba-tiba perlu membantu seseorang dengan topik ini. Artikel ini sejajar dengan materi dari berbagai buku tentang pemrograman oleh Schildt, Stroustrup, Okulov.

Topik tentang siklus dipilih karena cukup banyak orang yang dikecualikan ketika menguasai pemrograman.

Teknik ini dirancang untuk siswa yang lemah. Biasanya, orang kuat tidak terpaku pada topik ini dan tidak perlu memberikan teknik khusus untuk mereka. Tujuan kedua dari artikel ini adalah untuk memindahkan teknik ini dari kelas “berhasil untuk semua siswa, tetapi hanya satu guru” ke kelas “berhasil untuk semua siswa, semua guru”. Saya tidak mengklaim orisinalitas mutlak. Jika Anda sudah menggunakan metodologi serupa untuk mengajarkan topik ini, silakan tulis perbedaan versi Anda. Jika Anda memutuskan untuk menggunakannya, beri tahu kami bagaimana hasilnya. Jika teknik serupa dijelaskan dalam buku, harap tulis namanya.


Saya mengerjakan teknik ini selama 4 tahun, belajar secara individu dengan siswa dari berbagai tingkat pelatihan. Total ada sekitar lima puluh siswa dan dua ribu jam kelas. Pada awalnya, siswa selalu terjebak pada topik ini dan keluar. Setelah setiap siswa, metodologi dan materi disesuaikan. Selama setahun terakhir, siswa tidak lagi terpaku pada topik ini, jadi saya memutuskan untuk membagikan temuan saya.

Mengapa begitu banyak surat? Siklus sangat mendasar!

Seperti yang saya tulis di atas, bagi para pengembang praktik dan siswa yang kuat, kompleksitas konsep loop dapat diremehkan. Misalnya, Anda bisa memberikan ceramah yang panjang, melihat anggukan kepala, dan pandangan mata yang cerdas. Tetapi ketika mencoba memecahkan masalah apa pun, masalah pingsan dan tidak dapat dijelaskan dimulai. Setelah perkuliahan, para siswa mungkin hanya memiliki sebagian pemahaman. Keadaan tersebut diperparah dengan kenyataan bahwa siswa sendiri tidak dapat mengungkapkan apa sebenarnya khayalannya.
Suatu hari saya menyadari bahwa siswa menganggap contoh saya sebagai hieroglif. Artinya, seperti potongan teks yang tidak dapat dipisahkan di mana Anda perlu menambahkan beberapa huruf "ajaib" dan itu akan berhasil.
Kadang-kadang saya memperhatikan bahwa siswa berpikir bahwa untuk memecahkan masalah tertentu diperlukan sesuatu yang lain sebuah desain yang belum saya bahas. Meskipun solusinya hanya memerlukan sedikit modifikasi dari contoh.

Jadi saya mendapat ide bahwa fokusnya bukan pada sintaksis ekspresi, tetapi pada ide memfaktorkan ulang kode berulang menggunakan loop. Setelah siswa menguasai ide ini, sintaksis apa pun dapat ditingkatkan dengan sedikit latihan.

Siapa dan mengapa saya mengajar?

Karena tidak ada ujian masuk, kelas dapat mencakup siswa yang kuat dan sangat lemah. Anda dapat membaca lebih lanjut tentang siswa saya di artikel Potret siswa kursus malam
Saya berusaha keras untuk memastikan bahwa setiap orang yang ingin belajar pemrograman dapat mempelajarinya.
Kelas saya diadakan secara individual dan siswa membayar uangnya sendiri untuk setiap kelas. Tampaknya siswa akan mengoptimalkan biaya dan menuntut seminimal mungkin. Namun, orang mengikuti kelas tatap muka dengan guru langsung bukan untuk mengetahui pengetahuan itu sendiri, tetapi untuk keyakinan akan apa yang telah mereka pelajari, untuk merasakan kemajuan dan untuk mendapatkan persetujuan dari ahli (guru). Jika siswa tidak merasakan kemajuan dalam pembelajarannya, mereka akan keluar. Secara umum, kelas dapat disusun sedemikian rupa sehingga siswa merasakan kemajuan dalam meningkatkan jumlah struktur yang familiar. Artinya, pertama kita belajar sambil secara detail, lalu kita belajar, lalu mengerjakan sementara, dan sekarang kita sudah menyiapkan kursus seribu satu malam, yang siklusnya saja dipelajari selama dua bulan, dan pada akhirnya - seorang siswa yang menulis. perpustakaan standar di bawah dikte. Namun, untuk menyelesaikan masalah-masalah praktis, tidak hanya diperlukan pengetahuan tentang materi, tetapi juga kemandirian dalam penerapannya dan dalam mencari informasi baru. Oleh karena itu, untuk kursus tatap muka, menurut saya prinsip yang benar adalah mengajar seminimal mungkin dan mendorong studi mandiri tentang nuansa dan topik terkait. Dalam topik loop, saya menganggap konstruksi while sebagai minimum. Anda dapat memahami prinsipnya dari situ. Mengetahui prinsipnya, Anda dapat menguasai keduanya dan melakukannya sendiri.

Untuk mencapai penguasaan materi oleh siswa yang lemah, mendeskripsikan sintaksis saja tidak cukup. Penting untuk memberikan tugas yang lebih sederhana namun bervariasi dan menjelaskan contoh secara lebih rinci. Pada akhirnya, kecepatan perkembangan dibatasi oleh kemampuan siswa untuk mengubah ekspresi dan mencari pola. Bagi siswa yang cerdas, sebagian besar tugas akan membosankan. Saat belajar bersama mereka, Anda tidak perlu memaksakan diri untuk menyelesaikan 100% soal. Materi saya dapat dilihat di github saya. Benar, repositori lebih seperti grimoire penyihir - tidak seorang pun kecuali saya yang akan mengerti di mana tempatnya, dan jika Anda gagal dalam pemeriksaan, Anda bisa menjadi gila

Metodologinya berorientasi pada praktik

Teori dijelaskan dengan menggunakan contoh pemecahan suatu masalah. Dalam kelas dasar pemrograman yang mengajarkan percabangan dan perulangan, tidak mungkin memberikan ceramah yang berguna tentang satu topik selama satu jam penuh. 15-20 menit sudah cukup untuk menjelaskan konsepnya. Kesulitan utama muncul ketika melakukan tugas praktek.
Guru pemula dapat menjelaskan operator, cabang, loop, dan array dalam satu kuliah. Namun siswanya akan menghadapi masalah dalam mengasimilasi informasi ini.
Penting tidak hanya menyampaikan materi, tetapi juga memastikan bahwa pendengar memahaminya.

Fakta penguasaan suatu topik ditentukan oleh bagaimana siswa mengatasi pekerjaan mandiri.
Jika seorang siswa berhasil menyelesaikan suatu permasalahan pada suatu topik tanpa bantuan guru, maka topik tersebut telah dikuasai. Untuk memastikan pengujian mandiri, setiap tugas dijelaskan dalam tabel dengan skenario pengujian. Tugas-tugas tersebut memiliki urutan yang jelas. Melewatkan tugas tidak disarankan. Jika tugas saat ini terlalu sulit, maka melanjutkan ke tugas berikutnya tidak ada gunanya. Ini bahkan lebih rumit. Agar siswa dapat menguasai tugas kompleks saat ini, beberapa teknik dijelaskan kepadanya dengan menggunakan contoh soal pertama. Sebenarnya keseluruhan isi topik bermuara pada teknik mengatasi kesulitan. Siklus lebih 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 memperhatikan berbagai hal kecil yang dapat menimbulkan kesalahpahaman.

Penjelasan contohnya berupa dialog dimana siswa perlu memanggil kembali propagasi dan validasi silang untuk memastikan bahwa ia telah menguasai sebagian materi.

Saya akan bersikap dangkal dan mengatakan bahwa contoh pertama tentang topik ini sangat penting. Jika Anda memiliki materi untuk pekerjaan mandiri yang ekstensif, kelalaian pada contoh pertama dapat diperbaiki. Jika tidak ada hal lain selain contoh, kemungkinan besar siswa tidak akan menguasai topik tersebut.

Sementara atau untuk?

Salah satu isu kontroversial adalah pemilihan konstruksi misalnya: sementara atau untuk. Suatu kali, seorang teman pengembang saya yang berpraktik tanpa pengalaman mengajar menghabiskan waktu satu jam untuk meyakinkan saya bahwa perulangan for adalah yang paling mudah untuk dipahami. Argumen-argumennya bermuara pada “segala sesuatu di dalamnya jelas dan diletakkan pada tempatnya.” Namun, akar penyebab kesulitan bagi pemula sebenarnya adalah gagasan tentang siklus itu sendiri, dan bukan penulisannya. Jika seseorang tidak memahami gagasan ini, maka dia akan mengalami kesulitan dengan sintaksisnya. Begitu idenya terwujud, masalah desain kode akan hilang dengan sendirinya.

Dalam materi saya, tema loop mengikuti tema percabangan. Kesamaan eksternal dari if dan while memungkinkan kita untuk menggambar analogi langsung: “ketika kondisi di header benar, maka isi akan dieksekusi.” Satu-satunya kekhasan dari siklus ini adalah bahwa tubuh dieksekusi berkali-kali.

Argumen kedua saya adalah bahwa while membutuhkan lebih sedikit format dibandingkan for. Lebih sedikit pemformatan berarti lebih sedikit kesalahan bodoh dengan hilangnya koma dan tanda kurung. Pemula belum cukup mengembangkan perhatian dan ketelitian untuk secara otomatis menghindari kesalahan sintaksis.
Argumen ketiga dijelaskan dalam banyak buku bagus sebagai argumen pertama.

Jika siswa dapat dengan mudah mengubah ekspresi, maka Anda dapat membicarakannya secara sepintas. Siswa kemudian akan memilih apa yang paling disukainya. Jika transformasi menyebabkan kesulitan, lebih baik tidak mengalihkan perhatian Anda. Biarkan siswa menyelesaikan semuanya terlebih dahulu dengan menggunakan while. Setelah Anda menguasai topik perulangan, Anda dapat menulis ulang solusi untuk berlatih mengonversi while ke for.
Perulangan postcondition adalah hal yang sangat langka. Saya tidak menghabiskan waktu sama sekali. Jika seorang siswa telah menguasai gagasan mengidentifikasi pola dan mengubah ekspresi, dia dapat mengetahuinya tanpa bantuan saya.

Saat mendemonstrasikan contoh pertama kepada siswa yang kuat, saya menarik perhatian pada fakta bahwa pada contoh pertama penting untuk mencatat tidak hanya solusinya, tetapi juga seluruh rangkaian tindakan yang membuahkan hasil. Siswa yang malas dapat mengabaikan penulisan dan hanya menyalin algoritma akhir. Mereka perlu diyakinkan bahwa suatu hari tugas sulit akan menghadang mereka. Untuk mengatasinya, Anda perlu mengikuti langkah-langkah seperti pada contoh ini. Itulah mengapa penting untuk mencatat semua tahapan. Dalam soal-soal berikut ini, hanya dimungkinkan untuk menyisakan versi final dari solusinya.

Ide utama dari otomatisasi adalah kita mempercayakan komputer untuk melakukan pekerjaan rutin seseorang. Salah satu teknik dasarnya adalah menulis loop. Ini digunakan ketika beberapa tindakan berulang yang identik ditulis dalam sebuah program secara berurutan.

Eksplisit lebih baik daripada implisit

Tampaknya merupakan ide bagus untuk menampilkan frasa yang sama beberapa kali pada tugas perulangan pertama. Misalnya:

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 nilai penghitung tidak terlihat di output. Ini adalah masalah bagi pemula. Jangan meremehkannya. Pada awalnya, tugas ini adalah yang pertama, dan tugas menurunkan serangkaian angka dalam urutan menaik adalah yang kedua. Perlu diperkenalkan istilah tambahan “siklus N kali” dan “siklus dari A ke B”, yang pada dasarnya adalah hal yang sama. Agar tidak membuat entitas yang tidak perlu, saya memutuskan untuk hanya menampilkan contoh dengan keluaran serangkaian angka. Hanya sedikit orang yang berhasil mempelajari cara menyimpan counter di kepala mereka dan memodelkan perilaku suatu program di kepala mereka tanpa persiapan. Beberapa siswa pertama kali menemukan pemodelan mental pada topik siklus.
Setelah beberapa kali latihan, saya memberikan tugas mengulang teks yang sama untuk diselesaikan secara mandiri. Jika Anda memberikan penghitung yang terlihat terlebih dahulu dan kemudian yang tidak terlihat, siswa akan mempunyai lebih sedikit masalah. Terkadang petunjuk “jangan menulis penghitung di layar” sudah cukup.

Bagaimana orang lain menjelaskannya?

Di sebagian besar materi pendidikan di Internet, sintaksis siklus diberikan sebagai bagian dari “ceramah”. Misalnya, di developer.mozilla.org (saat ini), beberapa konstruksi lain dijelaskan bersama dengan loop while. Dalam hal ini, hanya desainnya saja yang diberikan dalam bentuk template. Hasil peluncurannya dijelaskan dengan kata-kata, tetapi tidak ada ilustrasi. Menurut pendapat saya, penyajian topik seperti itu mengalikan kegunaan materi tersebut dengan nol. Siswa dapat menulis ulang kode dan menjalankannya sendiri, namun ia tetap memerlukan standar untuk perbandingan. Bagaimana Anda bisa memahami bahwa sebuah contoh telah ditulis ulang dengan benar jika tidak ada yang bisa membandingkan hasilnya?
Jika hanya diberikan template saja, tanpa contoh maka akan semakin menyulitkan siswa. Bagaimana memahami bahwa potongan kode ditempatkan dengan benar di template? Anda bisa mencoba menulis entah bagaimana, lalu jalankan. Namun jika tidak ada standar untuk membandingkan hasilnya, maka peluncuran juga tidak akan membantu.

Dalam kursus C++ tentang Intuitif, sintaks loop terkubur di halaman ketiga Kuliah 4 dengan topik “operator”. Saat menjelaskan sintaks loop, penekanan khusus diberikan pada istilah “operator”. Istilah ini disajikan sebagai serangkaian fakta seperti “simbol; ini adalah sebuah pernyataan", "{} adalah pernyataan gabungan", "badan perulangan harus berupa sebuah pernyataan". Saya tidak menyukai pendekatan ini karena sepertinya menyembunyikan hubungan penting di balik satu periode. Mengurai kode sumber suatu program ke dalam istilah-istilah pada tingkat ini diperlukan oleh pengembang kompiler untuk mengimplementasikan spesifikasi bahasa, tetapi tidak oleh siswa sebagai perkiraan pertama. Jarang sekali orang yang baru mengenal pemrograman cukup teliti untuk memperhatikan istilah-istilahnya. Jarang ada orang yang mengingat dan memahami kata-kata baru untuk pertama kalinya. Hampir tidak ada orang yang dapat menerapkan istilah yang baru mereka pelajari dengan benar. Oleh karena itu, siswa mendapatkan banyak kesalahan seperti “Saya menulis while(a<7);{, tetapi program tidak berfungsi.”
Menurut saya, di awal lebih baik memberikan sintaks konstruksi segera dengan tanda kurung. Opsi tanpa tanda kurung hanya boleh dijelaskan jika siswa memiliki pertanyaan spesifik: “mengapa tidak ada tanda kurung dan berhasil.”

Dalam buku Okulov tahun 2012, “Fundamentals of Programming,” pengenalan tentang loop dimulai dengan pola for, kemudian memberikan rekomendasi untuk penggunaannya, dan kemudian langsung menuju ke bagian eksperimen dari pelajaran. Saya memahami bahwa buku ini ditulis untuk sebagian kecil siswa berkemampuan tinggi yang jarang datang ke kelas saya.

Dalam buku-buku populer, hasil potongan kode selalu ditulis. Misalnya, “Java 8. The Complete Guide” karya Shildt edisi 2015. Pertama, template diberikan, kemudian contoh program dan segera setelah itu - hasil eksekusi.

Sebagai contoh, pertimbangkan perulangan while yang melakukan kebalikannya
hitungan mundur dimulai dari 10, dan tepat 10 baris “ukuran” ditampilkan:

//Продемонстрировать применение оператора цикла while
class While {
    public static void main(String args []) {
        int n = 10;
        while (n > 0) {
            System.out.println("такт " + n);
            n--;
        }
    }
}

Setelah dijalankan, program ini menghasilkan sepuluh "siklus" sebagai berikut:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Pendekatan mendeskripsikan template, contoh program dan hasil program juga digunakan dalam buku “Javascript for Kids” dan kursus js di w3schools.com. Format halaman web bahkan memungkinkan contoh ini menjadi interaktif.

Buku Stroustrup tahun 2016, Prinsip dan Praktik Menggunakan C++, melangkah lebih jauh. Langkah pertama adalah menjelaskan hasil apa yang harus diperoleh, dan setelah itu teks program ditampilkan. Selain itu, mereka tidak hanya mengambil program acak sebagai contoh, tetapi memberikan perjalanan ke dalam sejarah. Hal ini membantu untuk menarik perhatian ke sana: “Lihat, ini bukan sekedar teks yang tidak berguna. Anda melihat sesuatu yang berarti."

Sebagai contoh iterasi, perhatikan program pertama yang dijalankan pada mesin program tersimpan (EDSAC). Ditulis oleh David Wheeler di Laboratorium Komputer Universitas Cambridge, Inggris pada tanggal 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 dengan karakter tab ('t') dan kuadrat dari angka tersebut. 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;
    }
}

Menariknya, pola sintaksisnya tidak dijelaskan dalam buku ini. Stroustrup dalam manual instruktur (terjemahan) menekankan bahwa pihaknya menghargai kecerdasan siswanya. Mungkin kemampuan mengidentifikasi suatu pola dalam beberapa contoh dianggap sebagai manifestasi dari kecerdasan tersebut.

Seperti yang saya jelaskan sendiri

Pendekatan Stroustrup: mendeskripsikan hasil, kemudian memecahkan masalah, dan kemudian analisis independen oleh siswa - tampaknya yang paling bijaksana. Oleh karena itu, saya memutuskan untuk mengambilnya sebagai dasar, tetapi menceritakannya dengan menggunakan contoh yang kurang historis - tugas mendapatkan “daftar isi”. Ini membentuk jangkar yang dapat dikenali sehingga Anda kemudian dapat mengatakan “ingat tugas tentang daftar isi” dan agar siswa mengingatnya dengan tepat. Dalam contoh saya, saya mencoba mencegah dua kesalahpahaman paling umum. Selanjutnya saya akan menulis tentang mereka lebih terinci.

Dalam tugas ini kita diperkenalkan dengan teknik untuk memecahkan masalah yang kompleks. Keputusan awal perlu dibuat secara primitif dan sederhana. Nah, selanjutnya Anda bisa memikirkan cara meningkatkan solusi ini.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Menurut pengamatan saya, pendekatan “template-example-result” dalam berbagai kombinasi masih mengarah pada fakta bahwa siswa mempersepsikan siklus sebagai hieroglif. Hal ini terwujud dalam kenyataan bahwa mereka tidak memahami mengapa ada syarat untuk menulis di sana, bagaimana memilih antara i++ dan i— dan hal-hal lain yang tampaknya jelas. Untuk menghindari kesalahpahaman tersebut, pendekatan dalam membicarakan siklus harus menekankan pada makna mengulangi tindakan yang identik dan baru kemudian memformalkannya menggunakan suatu struktur. Oleh karena itu, sebelum memberikan sintaks perulangan, Anda harus menyelesaikan masalahnya secara langsung. 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 cara memperbaikinya?
Gantikan tindakan monoton dengan sebuah siklus.
Tindakan apa yang diulangi berturut-turut tanpa perubahan?
Tidak ada satu pun di fragmen ini. Namun, perintah untuk menampilkan kata “Bab” dengan nomor sangat mirip satu sama lain.
Oleh karena itu, tahap selanjutnya adalah mencari perbedaan antar fragmen. Hanya dalam tugas ini semuanya menjadi jelas, maka tidak ada satu perintah pun yang akan diulang, tetapi blok kode yang terdiri dari 5 baris atau lebih. Anda harus mencari tidak hanya di daftar perintah, tetapi juga dalam konstruksi percabangan atau loop.
Pada contoh, perbedaan antar perintah terletak pada angka setelah kata “Bab”.
Setelah perbedaannya ditemukan, Anda perlu memahami pola perubahannya. Fragmen yang berbeda adalah nomornya? Apakah terus meningkat atau menurun? Bagaimana nilai suatu angka berubah antara dua tim secara berdampingan?
Pada contoh, angka setelah kata “Bab” bertambah 1. Perbedaannya ditemukan, polanya terungkap. Sekarang Anda dapat mengganti fragmen yang berbeda dengan sebuah variabel.
Anda perlu mendeklarasikan variabel tersebut sebelum fragmen pertama yang berulang. Variabel seperti itu biasanya disebut I atau j atau yang lebih detailnya. Nilai awalnya harus sama dengan nilai pertama yang ditampilkan di layar. Dalam contoh, nilai pertama adalah 1.
Berapa nilai awal yang harus diambil untuk menampilkan rangkaian angka “100, 101, 102, 103, 104, 105”?
Angka pertama pada deret ini adalah 100.
Setelah setiap perintah keluaran, Anda perlu menambah nilai variabel ini sebesar 1. Unit ini adalah langkah perubahan.
Berapakah langkah pada rangkaian angka “100, 102, 104, 106”?
Langkah 2 di baris ini.
Setelah mengganti fragmen yang berbeda dengan variabel, kodenya 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 pola variabel" dalam kode, Anda mendapatkan beberapa kelompok tindakan identik yang dilakukan secara berurutan. Sekarang tindakan yang berulang dapat diganti dengan sebuah siklus.

Urutan penyelesaian masalah yang memerlukan penggunaan loop terdiri dari langkah-langkah berikut:

  1. Selesaikan "langsung" dengan banyak perintah terpisah
  2. Temukan sebuah pola
  3. Ekspresikan pola suatu variabel
  4. Susunlah sebagai sebuah siklus

Selanjutnya, istilah-istilah baru diperkenalkan sehingga siswa tidak mendapati dirinya dalam situasi “Saya mengerti segalanya, tetapi saya tidak bisa mengatakannya”:
— penghitung selalu merupakan variabel yang diperlukan untuk melacak jumlah langkah dalam satu lingkaran. Biasanya bilangan bulat yang dibandingkan dengan batasan.
— counter step — deskripsi pola perubahan counter.
- batasan - angka atau variabel yang penghitungnya dibandingkan sehingga algoritmanya final. Nilai counter berubah mendekati batas.
— loop body — sekumpulan perintah yang akan diulang. Ketika mereka mengatakan "perintah ditulis di dalam satu lingkaran," yang mereka maksud adalah isi.
— iterasi perulangan — eksekusi satu kali pada badan perulangan.
— kondisi loop — ekspresi logis yang menentukan apakah iterasi lain akan dieksekusi. (Mungkin ada kebingungan dengan struktur percabangan di sini)
Anda harus siap menghadapi kenyataan bahwa pada awalnya siswa akan menggunakan istilah untuk tujuan lain. Hal ini berlaku bagi yang kuat dan yang lemah. Membangun bahasa yang sama adalah sebuah seni. Sekarang saya akan menulis secara singkat: Anda perlu mengatur tugas "sorot fragmen kode dengan <term>" dan gunakan sendiri istilah-istilah ini dengan benar dalam percakapan.
Setelah transformasi dengan loop, fragmen diperoleh:

Console.WriteLine("Введение");
int i = 0;
while (i < 7) {
    Console.WriteLine("Глава " + i);
    i = i + 1;
}
Console.WriteLine("Заключение");

Kesalahpahaman utama

Salah satu kesalahpahaman yang populer di kalangan siswa adalah bahwa mereka menempatkan tindakan di dalam satu lingkaran yang hanya perlu dilakukan sekali. Misalnya seperti ini:

;
int i = 0;
while (i < 7) {
    Console.WriteLine("Введение")
    Console.WriteLine("Глава " + i);
    i = i + 1;
    Console.WriteLine("Заключение");
}

Siswa selalu mengalami masalah ini, baik pada awal maupun pada masalah yang lebih kompleks.
Petunjuk penting dalam kasus ini:

Berapa kali Anda harus mengulangi perintah: sekali atau berkali-kali?

Perintah untuk mencetak kata "Pendahuluan" dan "Kesimpulan" serta mendeklarasikan dan menginisialisasi variabel i tidak seperti tindakan berulang lainnya. Mereka dieksekusi hanya sekali, yang berarti mereka harus ditulis di luar badan perulangan.

Ketiga tahap solusi harus tetap ada dalam kode sehingga Anda dapat merujuknya nanti jika terjadi kesulitan. Cukup dengan mengomentari dua opsi pertama agar tidak mengganggu.
Perhatian siswa harus tertuju pada fakta-fakta berikut:
— Dalam kondisi loop, counter dan limit biasanya dibandingkan. Penghitung dapat berubah di badan perulangan, tetapi batasnya tidak bisa. Untuk melanggar aturan ini, Anda perlu merumuskan alasan yang kuat.
— Perintah untuk menampilkan kata “Pendahuluan” dan “Kesimpulan” terletak di luar badan perulangan. Kita perlu melakukannya 1 kali. "Pendahuluan" - sebelum mengulangi tindakan, "Kesimpulan" - setelahnya.
Dalam proses mengkonsolidasikan topik ini, menguasai topik berikutnya, serta menghadapi kesulitan, ada gunanya bagi siswa yang kuat sekalipun untuk mengajukan pertanyaan: “Berapa kali tindakan ini perlu dilakukan? Satu atau banyak?

Pengembangan keterampilan tambahan

Dalam proses belajar siklus, siswa juga mengembangkan keterampilan mendiagnosis dan memecahkan masalah. Untuk melakukan diagnosa, siswa perlu menyajikan hasil yang diinginkan dan membandingkannya dengan hasil sebenarnya. Tindakan korektif bergantung pada perbedaan di antara keduanya.
Karena siswa pada tahap ini masih memiliki sedikit gambaran tentang hasil yang “diinginkan”, mereka dapat fokus pada data tes. Biasanya, belum ada seorang pun pada tahap ini yang memahami apa yang salah dan bagaimana cara mengatasinya. Oleh karena itu, saya menulis di buku catatan uraian tentang masalah-masalah umum dan beberapa cara untuk menyelesaikannya. Memilih yang paling cocok adalah tugas siswa itu sendiri.
Catatan diperlukan untuk menanyakan “apakah yang diharapkan terjadi?”, “Situasi manakah yang terjadi sekarang?”, “Apakah solusi yang diterapkan membantu?”

  1. Jumlah tindakan kurang atau lebih 1 dari yang diharapkan. Solusi:
    — menambah nilai awal penghitung sebesar 1.
    — ganti operator perbandingan ketat (< atau >) dengan operator perbandingan tidak ketat (<= atau >=).
    — ubah nilai batas menjadi 1.
  2. Tindakan dalam satu lingkaran dilakukan tanpa henti, tanpa batas waktu. Solusi:
    — tambahkan perintah counter change jika tidak ada.
    — perbaiki perintah counter change agar nilainya mendekati batas.
    — hapus perintah perubahan batasan jika perintah tersebut ada di badan perulangan.
  3. Jumlah tindakan dalam satu putaran lebih dari 1 kurang atau lebih dari yang diharapkan. Tindakan dalam loop tidak dieksekusi sekali pun. Pertama, Anda perlu mengetahui nilai sebenarnya dari variabel sebelum loop dimulai. Solusi:
    — mengubah nilai awal batasan
    — mengubah nilai awal penghitung

Masalah 3 biasanya melibatkan penggunaan variabel yang salah atau tidak menyetel ulang penghitung ke nol.

Setelah penjelasan ini, siswa mungkin masih memiliki berbagai kesalahpahaman tentang cara kerja loop.
Untuk menghilangkan yang paling umum, saya memberi Anda tugas-tugas berikut:

  1. Dimana batas, nilai penghitung awal, atau langkah penghitung dimasukkan oleh pengguna.
  2. Di mana nilai penghitung harus digunakan dalam beberapa ekspresi aritmatika. Disarankan untuk menggunakan penghitung pada ekspresi akar atau penyebut agar selisihnya tidak linier.
  3. Dimana nilai penghitung tidak ditampilkan di layar saat loop sedang berjalan. Misalnya, menampilkan jumlah fragmen teks identik yang diperlukan atau menggambar gambar dengan grafik kura-kura.
  4. Di mana Anda perlu melakukan beberapa tindakan berulang terlebih dahulu, dan kemudian tindakan lainnya.
  5. Di mana Anda perlu melakukan tindakan lain sebelum dan sesudah pengulangan

Untuk setiap tugas, Anda perlu menyediakan data pengujian dan hasil yang diharapkan.

Untuk memahami seberapa cepat Anda dapat bergerak, Anda perlu membaca ketentuan masalah ini dan bertanya: “apa bedanya dengan contoh?”, “Apa yang perlu diubah dalam contoh untuk menyelesaikannya?” Jika siswa menjawab dengan penuh arti, biarkan dia menyelesaikan setidaknya satu di kelas, dan sisanya di rumah sendiri. Jika solusinya berhasil, maka kita bisa mulai menjelaskan kondisi di dalam loop.
Jika Anda memiliki masalah dalam menyelesaikan masalah sendiri, Anda perlu menyelesaikan semuanya di kelas. Untuk menghindari penyelesaian masalah yang mengingatkan kita pada menggambar burung hantu, saya sarankan terlebih dahulu menyelesaikan masalah dengan cara yang tidak universal. Artinya, agar solusinya lolos pengujian pertama dan tidak menggunakan konstruksi loop. Nah, kemudian terapkan transformasi untuk mencapai solusi universal.

Loop dan cabang

Menurut pendapat saya, ada gunanya memberikan topik “siklus dalam cabang” secara terpisah. Sehingga nantinya dapat terlihat perbedaan antara pengecekan suatu kondisi berkali-kali dengan pengecekan satu kali.
Tugas konsolidasi adalah mengeluarkan angka dari A ke B, yang dimasukkan oleh pengguna:
- selalu dalam urutan menaik.
- naik atau turun tergantung nilai A dan B.

Topik “percabangan dalam loop” harus dilanjutkan hanya setelah siswa menguasai teknik: “mengganti pola dengan variabel” dan “mengganti tindakan berulang dengan siklus.”
Alasan utama penggunaan cabang di dalam loop adalah anomali dalam polanya. Di tengahnya rusak tergantung data awal.
Bagi siswa yang mampu mencari solusi dengan menggabungkan teknik sederhana, cukup dikatakan “percabangan dapat ditulis di dalam loop” dan memberikan soal “misalnya” secara lengkap untuk diselesaikan secara mandiri.
Contoh tugas:

Pengguna memasukkan angka X. Tampilkan angka 0 hingga 9 dalam satu kolom dan beri tanda '+' di seberang angka yang sama dengan X.

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

Jika 6 dimasukkan0
1
2
3
4
5
6+
7
8
9

Jika 9 dimasukkan0
1
2
3
4
5
6
7
8
9+

Jika 777 dimasukkan0
1
2
3
4
5
6
7
8
9

Jika penjelasan singkat tidak cukup untuk menulis dengan perulangan, maka Anda perlu mencapai solusi universal untuk masalah yang sama tanpa perulangan.
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+n1n2n3n4n5n6n7n8n9");
}
if (x==1) {
    Console.WriteLine("0n1+n2n3n4n5n6n7n8n9");
}
if (x==2) {
    Console.WriteLine("0n1n2+n3n4n5n6n7n8n9");
}
if (x==3) {
    Console.WriteLine("0n1n2n3+n4n5n6n7n8n9");
}
if (x==4) {
    Console.WriteLine("0n1n2n3n4+n5n6n7n8n9");
}
if (x==5) {
    Console.WriteLine("0n1n2n3n4n5+n6n7n8n9");
}
if (x==6) {
    Console.WriteLine("0n1n2n3n4n5n6+n7n8n9");
}
if (x==7) {
    Console.WriteLine("0n1n2n3n4n5n6n7+n8n9");
}
if (x==8) {
    Console.WriteLine("0n1n2n3n4n5n6n7n8+n9");
}
if (x==9) {
    Console.WriteLine("0n1n2n3n4n5n6n7n8n9+");
}

Saya memberikan tugas serupa sebelumnya, sambil mempelajari topik percabangan.
Jika siswa mempunyai pilihan yang “mungkin”, maka Anda perlu memberi tahu mereka bahwa ada banyak solusi untuk masalah yang sama. Namun, mereka berbeda dalam hal penolakan terhadap perubahan persyaratan. Ajukan pertanyaan: “Berapa banyak tempat dalam kode yang perlu diperbaiki jika saya harus menambahkan nomor lain?” Dalam versi “mungkin”, Anda perlu menambahkan satu cabang lagi dan menambahkan nomor baru di 10 tempat lainnya. Di bagian "yang diinginkan" cukup menambahkan satu cabang saja.
Tetapkan tugas untuk mereproduksi opsi "yang diinginkan", lalu temukan pola dalam kode, lakukan penggantian variabel, dan tulis perulangan.
Jika Anda memiliki ide tentang cara mengatasi masalah ini tanpa loop dengan cara lain, silakan tulis di komentar.

Loop di dalam Loop

Dalam topik ini Anda perlu memperhatikan hal-hal berikut:
— penghitung untuk loop dalam dan luar harus berupa variabel yang berbeda.
— penghitung untuk loop dalam harus direset berkali-kali (yaitu, di badan loop luar).
— dalam tugas keluaran teks, Anda tidak dapat menulis satu huruf dalam beberapa baris terlebih dahulu, lalu huruf kedua. Anda harus mencetak terlebih dahulu semua huruf pada baris pertama, lalu semua huruf pada baris kedua, dan seterusnya.

Yang terbaik adalah mulai menjelaskan topik perulangan di dalam perulangan dengan menjelaskan pentingnya menyetel ulang penghitung ke nol.
Contoh tugas:

Pengguna memasukkan dua angka: R dan T. Cetak dua baris karakter "#". Baris pertama harus berisi karakter R. Baris kedua berisi potongan T. Jika ada angka yang negatif, tampilkan pesan kesalahan.

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

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

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

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

Jelasnya, 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 #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 dalam solusi "mungkin", variabel kedua digunakan untuk menampilkan baris kedua. Anda harus bersikeras menggunakan variabel yang sama untuk kedua loop. Keterbatasan ini dapat dibenarkan dengan fakta bahwa solusi dengan satu counter untuk dua siklus akan menjadi ilustrasi istilah “counter reset”. Memahami istilah ini diperlukan ketika memecahkan masalah berikut. Sebagai kompromi, Anda dapat menyimpan kedua solusi untuk masalah tersebut.

Masalah khas dengan menggunakan satu variabel counter untuk dua loop muncul seperti ini:
R=5, T=11#####
######

Jumlah karakter pada baris kedua tidak sesuai dengan nilai T. Jika Anda memerlukan bantuan untuk masalah ini, maka Anda perlu melihat catatan tentang masalah umum dengan loop. Ini adalah gejala #3. Ini didiagnosis jika Anda menambahkan keluaran nilai penghitung segera sebelum siklus kedua. Diperbaiki dengan mengatur ulang. Namun lebih baik jangan langsung memberitahukan hal ini. Siswa harus mencoba merumuskan setidaknya satu hipotesis.

Tentu saja ada solusi lain. Tapi saya belum pernah melihatnya di kalangan siswa. Pada tahap siklus belajar, cerita tentang hal tersebut akan mengalihkan perhatian. Anda dapat kembali lagi nanti ketika mempelajari tentang fungsi string.
Kemungkinan #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 berikutnya yang diperlukan:

Tampilkan angka dari 0 hingga 9. Setiap angka harus berada pada barisnya masing-masing. Jumlah digit dalam satu baris (W) dimasukkan dari keyboard.

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

W=100000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999

Jika seorang siswa telah menguasai teknik penggantian suatu variabel, maka ia akan mengatasinya dengan cukup cepat. Kemungkinan masalah lagi adalah mengatur ulang variabel. Jika Anda tidak dapat menangani transformasi tersebut, itu berarti Anda sedang terburu-buru dan perlu menyelesaikan masalah yang lebih sederhana.

Terima kasih atas perhatian Anda. Sukai dan berlangganan saluran ini.

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

Hanya pengguna terdaftar yang dapat berpartisipasi dalam survei. Masuk, silakan.

Polling untuk pembaca tanpa karma

  • 20,0%Saya mengajar secara profesional, +12

  • 10,0%Saya mengajar secara profesional, -11

  • 70,0%Saya tidak mengajar, +17

  • 0,0%Saya tidak mengajar, -10

  • 0,0%Lainnya0

10 pengguna memilih. 5 pengguna abstain.

Sumber: www.habr.com

Tambah komentar