Bagaimana untuk mengajar bagaimana untuk mengatasi kesukaran, dan pada masa yang sama menulis kitaran

Walaupun kita akan bercakap tentang salah satu topik asas, artikel ini ditulis untuk profesional yang berpengalaman. Matlamatnya adalah untuk menunjukkan tanggapan salah pemula dalam pengaturcaraan. Bagi pembangun yang mengamalkan, masalah ini telah lama diselesaikan, dilupakan atau tidak disedari langsung. Artikel itu mungkin berguna jika anda tiba-tiba perlu membantu seseorang dengan topik ini. Artikel itu membuat persamaan dengan bahan dari pelbagai buku mengenai pengaturcaraan oleh Schildt, Stroustrup, Okulov.

Topik tentang kitaran dipilih kerana agak ramai orang dikecualikan daripadanya semasa menguasai pengaturcaraan.

Teknik ini direka untuk pelajar yang lemah. Sebagai peraturan, orang yang kuat tidak terjebak pada topik ini dan tidak perlu membuat teknik khas untuk mereka. Matlamat kedua artikel itu adalah untuk mengalihkan teknik ini daripada kelas "berfungsi untuk semua pelajar, tetapi hanya seorang guru" kepada kelas "berfungsi untuk semua pelajar, semua guru". Saya tidak menuntut keaslian mutlak. Jika anda sudah menggunakan metodologi yang serupa untuk mengajar topik ini, sila tulis bagaimana versi anda berbeza. Jika anda memutuskan untuk menggunakannya, beritahu kami bagaimana ia berlaku. Jika teknik yang sama diterangkan dalam buku, sila tulis nama.


Saya mengusahakan teknik ini selama 4 tahun, belajar secara individu dengan pelajar tahap latihan yang berbeza. Secara keseluruhan terdapat kira-kira lima puluh pelajar dan dua ribu jam kelas. Pada mulanya, pelajar sentiasa terperangkap dengan topik ini dan pergi. Selepas setiap pelajar, metodologi dan bahan diselaraskan. Sepanjang tahun lalu, pelajar tidak lagi terperangkap dalam topik ini, jadi saya memutuskan untuk berkongsi penemuan saya.

Mengapa begitu banyak surat? Kitaran sangat asas!

Seperti yang saya tulis di atas, untuk pembangun yang berlatih dan untuk pelajar yang kuat, kerumitan konsep gelung boleh dipandang remeh. Sebagai contoh, anda boleh memberikan syarahan yang panjang, melihat angguk kepala dan mata yang bijak. Tetapi apabila cuba menyelesaikan apa-apa masalah, masalah buntu dan tidak dapat dijelaskan bermula. Selepas kuliah, pelajar mungkin hanya mempunyai pemahaman separa. Keadaan diburukkan lagi kerana pelajar sendiri tidak dapat menyuarakan apa sebenarnya khayalan mereka.
Suatu hari saya menyedari bahawa pelajar menganggap contoh saya sebagai hieroglif. Iaitu, seperti kepingan teks yang tidak boleh dibahagikan di mana anda perlu menambah beberapa huruf "ajaib" dan ia akan berfungsi.
Kadang-kadang saya perasan bahawa pelajar berfikir bahawa untuk menyelesaikan masalah tertentu yang anda perlukan sesuatu yang lain reka bentuk yang saya belum tutup lagi. Walaupun penyelesaiannya hanya memerlukan sedikit pengubahsuaian contoh.

Jadi saya mendapat idea bahawa tumpuan tidak seharusnya pada sintaks ungkapan, tetapi pada idea memfaktorkan semula kod berulang menggunakan gelung. Apabila pelajar telah menguasai idea ini, sebarang sintaks boleh diperbaiki dengan sedikit latihan.

Siapa dan mengapa saya mengajar?

Memandangkan tiada peperiksaan kemasukan, kelas boleh merangkumi pelajar yang kuat dan sangat lemah. Anda boleh membaca lebih lanjut tentang pelajar saya dalam artikel Potret pelajar kursus petang
Saya berusaha untuk memastikan semua orang yang ingin mempelajari pengaturcaraan boleh mempelajarinya.
Kelas saya diadakan secara individu dan pelajar membayar wangnya sendiri untuk setiap kelas. Nampaknya pelajar akan mengoptimumkan kos dan menuntut yang minimum. Walau bagaimanapun, orang pergi ke kelas bersemuka dengan guru langsung bukan untuk pengetahuan itu sendiri, tetapi untuk keyakinan tentang apa yang mereka pelajari, untuk rasa kemajuan dan untuk kelulusan daripada pakar (guru). Jika pelajar tidak merasakan kemajuan dalam pembelajaran mereka, mereka akan pergi. Secara amnya, kelas boleh distrukturkan supaya pelajar merasakan kemajuan dalam meningkatkan bilangan struktur biasa. Iaitu, mula-mula kita belajar sambil terperinci, kemudian kita belajar untuk, kemudian buat sementara, dan sekarang kita mempunyai kursus seribu satu malam yang sedia, di mana kitaran sahaja dipelajari selama dua bulan, dan pada akhirnya - pelajar yang menulis perpustakaan standard di bawah imlak. Walau bagaimanapun, untuk menyelesaikan masalah praktikal, anda bukan sahaja memerlukan pengetahuan tentang bahan, tetapi juga kebebasan dalam aplikasinya dan dalam mencari maklumat baru. Oleh itu, untuk kursus bersemuka, saya fikir prinsip yang betul adalah untuk mengajar minimum dan menggalakkan kajian bebas tentang nuansa dan topik yang berkaitan. Dalam topik gelung, saya menganggap binaan while sebagai minimum. Anda boleh memahami prinsip daripadanya. Mengetahui prinsipnya, anda boleh menguasai kedua-duanya untuk dan semasa sendiri.

Untuk mencapai penguasaan bahan oleh pelajar lemah, menerangkan sintaks tidak mencukupi. Adalah perlu untuk memberikan tugas yang lebih mudah tetapi pelbagai dan menerangkan contoh dengan lebih terperinci. Akhirnya, kelajuan pembangunan dihadkan oleh keupayaan pelajar untuk mengubah ekspresi dan mencari corak. Bagi pelajar pintar, kebanyakan tugasan akan membosankan. Apabila belajar dengan mereka, anda tidak perlu bertegas untuk menyelesaikan 100% masalah. Bahan saya boleh dilihat di github saya. Benar, repositori lebih seperti grimoire penyihir - tiada siapa kecuali saya akan memahami di mana, dan jika anda gagal dalam pemeriksaan, anda boleh menjadi gila

Metodologi adalah berorientasikan amalan

Teori diterangkan menggunakan contoh penyelesaian masalah. Dalam asas-asas kelas pengaturcaraan di mana cawangan dan gelung diajar, adalah mustahil untuk memberikan syarahan yang berguna mengenai satu topik selama sejam. 15-20 minit sudah cukup untuk menerangkan konsep. Kesukaran utama timbul apabila melaksanakan tugas praktikal.
Guru permulaan boleh mengecam operator, cawangan, gelung dan tatasusunan dalam satu kuliah. Tetapi pelajar mereka akan menghadapi masalah mengasimilasikan maklumat ini.
Ia perlu bukan sahaja untuk memberitahu bahan, tetapi juga untuk memastikan pendengar memahaminya.

Hakikat menguasai sesuatu topik ditentukan oleh cara pelajar mengatasi kerja bebas.
Sekiranya pelajar berjaya menyelesaikan sesuatu masalah tentang sesuatu topik tanpa bantuan guru, maka topik tersebut telah dikuasai. Untuk memastikan ujian kendiri, setiap tugasan diterangkan dalam jadual dengan senario ujian. Tugasan mempunyai susunan yang jelas. Melangkau tugas tidak disyorkan. Sekiranya tugas semasa terlalu sukar, maka beralih ke yang seterusnya tidak berguna. Ia lebih rumit. Supaya pelajar dapat menguasai tugasan yang kompleks semasa, beberapa teknik diterangkan kepadanya menggunakan contoh masalah pertama. Sebenarnya, keseluruhan kandungan topik itu bergantung kepada teknik untuk mengatasi kesukaran. Kitaran lebih merupakan kesan sampingan.

Tugas pertama sentiasa menjadi contoh. Yang kedua berbeza sedikit dan dilakukan "secara bebas" sejurus selepas yang pertama di bawah pengawasan seorang guru. Semua tugasan berikutnya adalah bertujuan untuk memberi perhatian kepada pelbagai perkara kecil yang boleh menyebabkan salah tanggapan.

Penjelasan contoh ialah dialog di mana pelajar perlu memanggil semula penyebaran dan pengesahan silang untuk memastikan bahawa dia telah menguasai sebahagian daripada bahan tersebut.

Saya akan cetek dan mengatakan bahawa contoh pertama mengenai topik itu sangat penting. Jika anda mempunyai bahan untuk kerja bebas yang meluas, peninggalan contoh pertama boleh dibetulkan. Jika tiada perkara lain selain contoh, maka kemungkinan besar pelajar tidak akan menguasai topik tersebut.

Sementara atau untuk?

Salah satu isu kontroversi ialah pilihan pembinaan untuk contoh: sementara atau untuk. Pernah, rakan pembangun saya yang berlatih tanpa pengalaman mengajar meluangkan masa sejam untuk meyakinkan saya bahawa gelung for adalah yang paling mudah difahami. Hujah-hujah itu disimpulkan kepada "segala sesuatu di dalamnya jelas dan diletakkan pada tempatnya." Walau bagaimanapun, punca kesukaran untuk pemula sebenar adalah idea kitaran itu sendiri, dan bukan tulisannya. Jika seseorang tidak memahami idea ini, maka dia akan mengalami kesukaran dengan sintaks. Sebaik sahaja idea itu direalisasikan, masalah reka bentuk kod hilang dengan sendirinya.

Dalam bahan saya, tema gelung mengikut tema percabangan. Persamaan luaran if dan while membolehkan kita membuat analogi langsung: "apabila keadaan dalam pengepala adalah benar, maka badan dilaksanakan." Satu-satunya keanehan kitaran ialah badan itu dilaksanakan berkali-kali.

Hujah kedua saya ialah sementara memerlukan pemformatan yang kurang daripada untuk. Kurang pemformatan bermakna lebih sedikit kesilapan bodoh dengan tiada koma dan kurungan. Pemula belum lagi membangunkan perhatian dan ketelitian yang mencukupi untuk mengelakkan ralat sintaks secara automatik.
Hujah ketiga dijelaskan dalam banyak buku yang baik sebagai hujah pertama.

Jika pelajar boleh mengubah ekspresi dengan mudah, maka anda boleh bercakap secara sepintas lalu. Pelajar kemudian akan memilih apa yang paling disukainya. Sekiranya transformasi menyebabkan kesukaran, maka lebih baik jangan mengalih perhatian anda. Biarkan pelajar terlebih dahulu menyelesaikan semuanya menggunakan while. Setelah anda menguasai topik gelung, anda boleh menulis semula penyelesaian untuk berlatih menukar sementara kepada untuk.
Gelung postcondition adalah haiwan yang agak jarang berlaku. Saya langsung tidak meluangkan masa untuknya. Jika pelajar telah menguasai idea mengenal pasti corak dan mengubah ekspresi, dia boleh memikirkannya tanpa bantuan saya.

Apabila menunjukkan contoh pertama kepada pelajar yang kuat, saya menarik perhatian kepada fakta bahawa dalam contoh pertama adalah penting untuk merekodkan bukan sahaja penyelesaian, tetapi juga keseluruhan rantaian tindakan yang membawa kepada hasilnya. Pelajar yang malas boleh mengabaikan penulisan dan menyalin algoritma akhir sahaja. Mereka perlu yakin bahawa suatu hari nanti tugas yang sukar akan datang kepada mereka. Untuk menyelesaikannya, anda perlu mengikuti langkah-langkah seperti dalam contoh ini. Itulah sebabnya penting untuk merekodkan semua peringkat. Dalam masalah berikut adalah mungkin untuk meninggalkan versi akhir penyelesaian sahaja.

Idea utama automasi ialah kami mengamanahkan komputer untuk melakukan kerja rutin untuk seseorang. Salah satu teknik asas ialah menulis gelung. Ia digunakan apabila beberapa tindakan berulang yang sama ditulis dalam atur cara berturut-turut.

Tersurat lebih baik daripada tersirat

Ia mungkin kelihatan seperti idea yang baik untuk memaparkan frasa yang sama beberapa kali dalam tugasan gelung pertama. Sebagai contoh:

Hore, ia berkesan!
Hore, ia berkesan!
Hore, ia berkesan!
Hore, ia berkesan!
Hore, ia berkesan!
Hore, ia berkesan!
Hore, ia berkesan!
Hore, ia berkesan!

Pilihan ini tidak baik kerana nilai pembilang tidak dapat dilihat dalam output. Ini adalah masalah untuk pemula. Jangan pandang rendah dia. Pada mulanya, tugasan ini adalah yang pertama, dan tugas mendapatkan siri nombor dalam tertib menaik adalah yang kedua. Ia adalah perlu untuk memperkenalkan istilah tambahan "kitaran N kali" dan "kitaran dari A ke B", yang pada asasnya adalah perkara yang sama. Untuk tidak mencipta entiti yang tidak perlu, saya memutuskan untuk menunjukkan hanya contoh dengan output siri nombor. Segelintir orang berjaya mempelajari cara memegang kaunter di kepala mereka dan memodelkan tingkah laku program di kepala mereka tanpa persediaan. Sesetengah pelajar mula-mula menghadapi pemodelan mental mengenai topik kitaran.
Selepas beberapa latihan, saya memberikan tugas mengulang teks yang sama untuk diselesaikan secara bebas. Jika anda memberi kaunter yang kelihatan dahulu dan kemudian yang tidak kelihatan, pelajar akan menghadapi masalah yang lebih sedikit. Kadang-kadang pembayang "jangan tulis kaunter pada skrin" sudah cukup.

Bagaimana orang lain menjelaskannya?

Dalam kebanyakan bahan pendidikan di Internet, sintaks kitaran diberikan sebagai sebahagian daripada "kuliah". Contohnya, pada developer.mozilla.org (pada masa ini), beberapa binaan lain diterangkan bersama dengan gelung while. Dalam kes ini, hanya reka bentuk itu sendiri diberikan dalam bentuk templat. Hasil pelancaran mereka diterangkan dalam kata-kata, tetapi tidak ada ilustrasi. Pada pendapat saya, pembentangan topik sedemikian mendarabkan kegunaan bahan tersebut dengan sifar. Pelajar boleh menulis semula kod dan menjalankannya sendiri, tetapi dia masih memerlukan standard untuk perbandingan. Bagaimanakah anda boleh memahami bahawa contoh telah ditulis semula dengan betul jika tiada apa-apa untuk membandingkan hasilnya?
Apabila hanya templat diberikan, tanpa contoh, ia menjadi lebih sukar bagi pelajar. Bagaimana untuk memahami bahawa serpihan kod diletakkan dengan betul dalam templat? Anda boleh cuba menulis entah bagaimana, dan kemudian jalankan. Tetapi jika tiada standard untuk membandingkan hasilnya, maka pelancaran juga tidak akan membantu.

Dalam kursus C++ tentang Intuitif, sintaks gelung dikebumikan di halaman ketiga Kuliah 4 mengenai topik "pengendali". Apabila menerangkan sintaks gelung, penekanan khusus diberikan pada istilah "pengendali". Istilah ini dibentangkan sebagai satu set fakta seperti “simbol; ini ialah pernyataan", "{} ialah pernyataan majmuk", "badan gelung mestilah pernyataan". Saya tidak suka pendekatan ini kerana ia seolah-olah menyembunyikan hubungan penting di sebalik satu penggal. Menghuraikan kod sumber program kepada istilah pada tahap ini diperlukan oleh pembangun pengkompil untuk melaksanakan spesifikasi bahasa, tetapi bukan oleh pelajar sebagai anggaran pertama. Pendatang baru dalam pengaturcaraan jarang cukup teliti untuk memberi perhatian sedemikian terhadap istilah. Ia adalah orang yang jarang mengingati dan memahami perkataan baharu pada kali pertama. Hampir tiada siapa yang boleh menggunakan istilah yang baru mereka pelajari dengan betul. Oleh itu, pelajar mendapat banyak ralat seperti "Saya menulis semasa(a<7);{, tetapi program tidak berfungsi."
Pada pendapat saya, pada mulanya adalah lebih baik untuk memberikan sintaks pembinaan dengan segera dengan kurungan. Pilihan tanpa kurungan hanya perlu dijelaskan jika pelajar mempunyai soalan khusus: "mengapa tiada kurungan dan ia berfungsi."

Dalam buku Okulov 2012 "Asas Pengaturcaraan," pengenalan kepada gelung bermula dengan corak untuk, kemudian memberikan cadangan untuk penggunaannya, dan kemudian segera pergi ke bahagian eksperimen pelajaran. Saya faham bahawa buku itu ditulis untuk minoriti pelajar yang sangat berkebolehan yang jarang datang ke kelas saya.

Dalam buku popular, hasil serpihan kod sentiasa ditulis. Contohnya, edisi 8 "Java 2015. The Complete Guide" Shildt. Pertama, templat diberikan, kemudian program contoh dan sejurus selepas itu - hasil pelaksanaan.

Sebagai contoh, pertimbangkan gelung sementara yang melakukan sebaliknya
undur bermula dari 10, dan tepat 10 baris "langkah" dipaparkan:

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

Setelah dijalankan, program ini mengeluarkan sepuluh "kitaran" seperti berikut:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Pendekatan untuk menerangkan templat, program contoh dan hasil program juga digunakan dalam buku "Javascript for Kids" dan dalam kursus js di w3schools.com. Format halaman web juga membenarkan contoh ini menjadi interaktif.

Buku Stroustrup 2016 Prinsip dan Amalan Menggunakan C++ pergi lebih jauh. Langkah pertama adalah untuk menerangkan hasil yang perlu diperolehi, dan selepas itu teks program ditunjukkan. Selain itu, mereka bukan sahaja mengambil program rawak sebagai contoh, tetapi memberikan lawatan ke dalam sejarah. Ini membantu menarik perhatian kepadanya: “Lihat, ini bukan sekadar teks yang tidak berguna. Anda melihat sesuatu yang bermakna."

Sebagai contoh lelaran, pertimbangkan program pertama yang dilaksanakan pada mesin program tersimpan (EDSAC). Ia ditulis oleh David Wheeler di Makmal Komputer Universiti Cambridge, England pada 6 Mei 1949. Program ini mengira dan mencetak senarai petak yang ringkas.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Di sini, setiap baris mengandungi nombor diikuti dengan aksara tab ('t') dan kuasa dua nombor itu. Versi C++ program ini kelihatan seperti ini:

//Вычисляем и распечатываем таблицу квадратов чисел 0-99
int main()
{
    int i = 0; // Начинаем с нуля
    while(i < 100){
        cout << i << 't' << square(i) << 'n';
        ++i;
    }
}

Menariknya, corak sintaks tidak diterangkan dalam buku ini. Stroustrup dalam manual pengajar (terjemahan) menekankan bahawa ia menghormati kecerdasan pelajarnya. Mungkin keupayaan untuk mengenal pasti corak dalam beberapa contoh dianggap sebagai manifestasi kecerdasan tersebut.

Seperti yang saya jelaskan sendiri

Pendekatan Stroustrup: menerangkan keputusan, kemudian menyelesaikan masalah, dan kemudian analisis bebas oleh pelajar - nampaknya paling bijak. Oleh itu, saya memutuskan untuk mengambilnya sebagai asas, tetapi memberitahunya menggunakan contoh yang kurang bersejarah - tugas untuk mendapatkan "jadual kandungan". Ia membentuk sauh yang boleh dikenali supaya anda kemudiannya boleh menyebut "ingat tugas tentang jadual kandungan" dan supaya pelajar mengingati perkara ini dengan tepat. Dalam contoh saya, saya cuba menghalang dua lagi salah tanggapan yang paling biasa. Seterusnya saya akan menulis tentang mereka dengan lebih terperinci.

Dalam tugasan ini kita diperkenalkan kepada teknik untuk menyelesaikan masalah yang kompleks. Keputusan awal perlu dibuat primitif dan mudah. Nah, kemudian anda boleh memikirkan bagaimana untuk menambah baik penyelesaian ini.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Menurut pemerhatian saya, pendekatan "template-contoh-hasil" dalam pelbagai kombinasi masih membawa kepada fakta bahawa pelajar menganggap kitaran sebagai hieroglif. Ini nyata dalam fakta bahawa mereka tidak faham mengapa ada syarat untuk menulis di sana, bagaimana untuk memilih antara i++ dan i— dan perkara lain yang kelihatan jelas. Untuk mengelakkan salah tanggapan ini, pendekatan untuk bercakap tentang kitaran harus menekankan makna mengulangi tindakan yang sama dan hanya kemudian memformalkannya menggunakan struktur. Oleh itu, sebelum memberikan sintaks gelung, anda perlu menyelesaikan masalah secara langsung. Penyelesaian primitif kepada masalah jadual kandungan kelihatan 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 ia boleh diperbaiki?
Gantikan tindakan membosankan dengan kitaran.
Apakah tindakan yang diulang berturut-turut tanpa perubahan?
Tiada satu pun dalam serpihan ini. Walau bagaimanapun, arahan untuk memaparkan perkataan "Bab" dengan nombor adalah sangat serupa antara satu sama lain.
Oleh itu, peringkat seterusnya ialah mencari perbezaan antara serpihan. Hanya dalam tugas ini segala-galanya jelas, maka tidak satu perintah akan diulang, tetapi blok kod 5 baris atau lebih. Anda perlu mencari bukan sahaja dalam senarai arahan, tetapi dalam pembinaan cawangan atau gelung.
Dalam contoh, perbezaan antara arahan adalah dalam nombor selepas perkataan "Bab".
Setelah perbezaan ditemui, anda perlu memahami corak perubahan. Serpihan yang berbeza ialah nombor? Adakah ia sentiasa meningkat atau menurun? Bagaimanakah nilai nombor berubah antara dua pasukan bersebelahan?
Dalam contoh, nombor selepas perkataan "Bab" meningkat dalam kenaikan 1. Perbezaannya didapati, coraknya didedahkan. Kini anda boleh menggantikan serpihan yang berbeza dengan pembolehubah.
Anda perlu mengisytiharkan pembolehubah sedemikian sebelum serpihan berulang yang pertama. Pembolehubah sedemikian biasanya dipanggil I atau j atau sesuatu yang lebih terperinci. Nilai awalnya mestilah sama dengan nilai pertama yang dipaparkan pada skrin. Dalam contoh, nilai pertama ialah 1.
Apakah nilai awal yang perlu diambil untuk memaparkan siri nombor "100, 101, 102, 103, 104, 105"?
Nombor pertama dalam siri ini ialah 100.
Selepas setiap arahan keluaran, anda perlu meningkatkan nilai pembolehubah ini sebanyak 1. Unit ini ialah langkah perubahan.
Apakah langkah dalam siri nombor "100, 102, 104, 106"?
Langkah 2 dalam baris ini.
Selepas menggantikan serpihan yang berbeza dengan pembolehubah, kod akan kelihatan 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("Заключение");

Selepas menggunakan teknik "ungkapkan corak pembolehubah" dalam kod, anda mendapat beberapa kumpulan tindakan yang sama yang berjalan berturut-turut. Kini tindakan berulang boleh digantikan dengan gelung.

Urutan menyelesaikan masalah di mana anda perlu menggunakan gelung terdiri daripada langkah berikut:

  1. Selesaikan "head-on" dengan banyak arahan berasingan
  2. Cari corak
  3. Menyatakan corak pembolehubah
  4. Reka bentuk sebagai kitaran

Seterusnya, istilah baharu diperkenalkan supaya pelajar tidak mendapati dirinya dalam situasi "Saya faham segala-galanya, tetapi saya tidak boleh mengatakannya":
— pembilang sentiasa pembolehubah yang diperlukan untuk mengesan bilangan langkah dalam gelung. Biasanya integer yang dibandingkan dengan kekangan.
— langkah balas — perihalan corak perubahan kaunter.
- kekangan - nombor atau pembolehubah yang mana pembilangnya dibandingkan supaya algoritma adalah muktamad. Nilai kaunter berubah untuk menghampiri had.
— badan gelung — satu set arahan yang akan diulang. Apabila mereka menyebut "perintah ditulis di dalam gelung", mereka bermaksud badan.
— lelaran gelung — satu kali pelaksanaan badan gelung.
— keadaan gelung — ungkapan logik yang menentukan sama ada lelaran lain akan dilaksanakan. (Mungkin terdapat kekeliruan dengan struktur bercabang di sini)
Anda perlu bersedia untuk fakta bahawa pada mulanya pelajar akan menggunakan istilah untuk tujuan lain. Ini terpakai kepada kedua-dua yang kuat dan lemah. Mewujudkan bahasa yang sama adalah satu seni. Sekarang saya akan menulis secara ringkas: anda perlu menetapkan tugas "serlahkan serpihan kod dengan <term>" dan gunakan istilah ini sendiri dengan betul dalam perbualan.
Selepas transformasi dengan gelung, serpihan diperoleh:

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

Salah tanggapan utama

Satu miskonsepsi yang popular dalam kalangan pelajar ialah mereka meletakkan tindakan di dalam gelung yang perlu dilakukan sekali sahaja. Contohnya seperti ini:

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

Pelajar menghadapi masalah ini sepanjang masa, sama ada pada permulaan dan dalam masalah yang lebih kompleks.
Petunjuk utama dalam kes ini:

Berapa kali anda perlu mengulangi arahan: sekali atau banyak kali?

Perintah untuk mencetak perkataan "Pengenalan" dan "Kesimpulan" dan mengisytiharkan dan memulakan pembolehubah i tidak seperti tindakan berulang yang lain. Ia dilaksanakan sekali sahaja, yang bermaksud ia perlu ditulis di luar badan gelung.

Ketiga-tiga peringkat penyelesaian harus kekal dalam kod supaya anda boleh merujuknya kemudian jika berlaku kesukaran. Cukuplah untuk mengulas dua pilihan pertama supaya mereka tidak campur tangan.
Perhatian pelajar harus diberikan kepada fakta berikut:
— Dalam keadaan gelung, pembilang dan had biasanya dibandingkan. Kaunter boleh berubah dalam badan gelung, tetapi had tidak boleh. Untuk melanggar peraturan ini, anda perlu merumuskan alasan yang menarik.
— Perintah untuk memaparkan perkataan "Pengenalan" dan "Kesimpulan" terletak di luar badan gelung. Kami perlu melaksanakannya 1 kali. "Pengenalan" - sebelum mengulangi tindakan, "Kesimpulan" - selepas.
Dalam proses menyatukan topik ini, menguasai yang seterusnya, serta menangani kesukaran, adalah berguna untuk pelajar yang kuat untuk bertanya soalan: "Berapa kali tindakan ini perlu dilakukan? Satu atau ramai?

Pembangunan kemahiran tambahan

Dalam proses mempelajari kitaran, pelajar juga membangunkan kemahiran mendiagnosis dan menyelesaikan masalah. Untuk menjalankan diagnostik, pelajar perlu membentangkan hasil yang dikehendaki dan membandingkannya dengan keputusan sebenar. Tindakan pembetulan bergantung pada perbezaan antara mereka.
Memandangkan pelajar pada peringkat ini masih mempunyai sedikit idea tentang keputusan yang "diinginkan", mereka boleh memberi tumpuan kepada data ujian. Sebagai peraturan, tiada sesiapa pada peringkat ini lagi memahami apa yang boleh berlaku dan bagaimana untuk menanganinya. Oleh itu, saya menulis dalam buku nota penerangan tentang masalah biasa dan beberapa cara untuk menyelesaikannya. Memilih yang paling sesuai adalah tugas pelajar itu sendiri.
Rekod diperlukan untuk bertanya "adakah apa yang dijangkakan berlaku?", "Antara situasi ini yang manakah berlaku sekarang?", "Adakah penyelesaian yang digunakan membantu?"

  1. Bilangan tindakan adalah kurang 1 atau lebih daripada yang dijangkakan. Penyelesaian:
    — meningkatkan nilai awal pembilang sebanyak 1.
    — gantikan operator perbandingan ketat (< atau >) dengan operator yang tidak ketat (<= atau >=).
    — tukar nilai had kepada 1.
  2. Tindakan dalam gelung dilakukan tanpa henti, selama-lamanya. Penyelesaian:
    — tambah arahan tukar balas jika tiada.
    — betulkan arahan tukar kaunter supaya nilainya menjadi lebih dekat kepada had.
    — alih keluar arahan tukar kekangan jika ia berada dalam badan gelung.
  3. Bilangan tindakan dalam gelung adalah lebih daripada 1 kurang atau lebih daripada yang dijangkakan. Tindakan dalam gelung tidak dilaksanakan walaupun sekali. Mula-mula anda perlu mengetahui nilai sebenar pembolehubah sejurus sebelum gelung bermula. Penyelesaian:
    — ubah nilai awal kekangan
    — tukar nilai awal kaunter

Masalah 3 biasanya melibatkan penggunaan pembolehubah yang salah atau tidak menetapkan semula pembilang kepada sifar.

Selepas penjelasan ini, pelajar mungkin masih mempunyai pelbagai salah tanggapan tentang cara gelung berfungsi.
Untuk menghilangkan yang paling biasa, saya memberi anda tugasan berikut:

  1. Di mana had, nilai pembilang awal atau langkah pembilang dimasukkan oleh pengguna.
  2. Di mana nilai pembilang mesti digunakan dalam beberapa ungkapan aritmetik. Adalah dinasihatkan untuk menggunakan pembilang dalam ungkapan radikal atau dalam penyebut supaya perbezaannya tidak linear.
  3. Di mana nilai pembilang tidak dipaparkan pada skrin semasa gelung sedang berjalan. Contohnya, memaparkan bilangan serpihan teks yang sama yang diperlukan atau melukis angka dengan grafik penyu.
  4. Di mana anda perlu melakukan terlebih dahulu beberapa tindakan berulang, dan kemudian yang lain.
  5. Di mana anda perlu melakukan tindakan lain sebelum dan selepas mengulangi

Untuk setiap tugasan anda perlu menyediakan data ujian dan hasil yang dijangkakan.

Untuk memahami seberapa cepat anda boleh bergerak, anda perlu membaca syarat masalah ini dan bertanya: "bagaimana ia berbeza daripada contoh?", "Apakah yang perlu diubah dalam contoh untuk menyelesaikannya?" Jika pelajar menjawab dengan bermakna, maka biarkan dia menyelesaikan sekurang-kurangnya satu dalam kelas, dan selebihnya di rumah sendiri. Jika penyelesaiannya berjaya, maka kita boleh mula menerangkan keadaan di dalam gelung.
Jika anda menghadapi masalah menyelesaikan masalah sendiri, anda perlu menyelesaikan semua perkara di dalam kelas. Untuk mengelakkan menyelesaikan masalah yang mengingatkan lukisan burung hantu, saya mengesyorkan terlebih dahulu menyelesaikan masalah dengan cara yang tidak universal. Iaitu, supaya penyelesaian melepasi ujian pertama dan tidak menggunakan pembinaan gelung. Nah, kemudian gunakan transformasi untuk mencapai kesejagatan penyelesaian.

Gelung dan dahan

Pada pendapat saya, adalah berguna untuk memberikan topik "kitaran dalam cawangan" secara berasingan. Supaya kemudian anda dapat melihat perbezaan antara memeriksa keadaan beberapa kali dan menyemaknya sekali.
Tugas untuk penyatuan adalah mengenai mengeluarkan nombor dari A ke B, yang dimasukkan oleh pengguna:
- sentiasa dalam tertib menaik.
- menaik atau menurun bergantung pada nilai A dan B.

Topik "bercabang dalam gelung" harus dialihkan hanya selepas pelajar menguasai teknik: "menggantikan corak dengan pembolehubah" dan "menggantikan tindakan berulang dengan kitaran."
Sebab utama untuk menggunakan cawangan dalam gelung adalah anomali dalam corak. Di tengah ia pecah bergantung pada data awal.
Bagi pelajar yang dapat mencari penyelesaian dengan menggabungkan teknik mudah, cukup untuk mengatakan "cabang boleh ditulis di dalam gelung" dan berikan masalah "sebagai contoh" sepenuhnya untuk diselesaikan secara bebas.
Contoh tugasan:

Pengguna memasukkan nombor X. Paparkan nombor dari 0 hingga 9 dalam lajur dan letakkan tanda '+' bertentangan dengan nombor yang sama dengan X.

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

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

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

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

Jika penjelasan ringkas tidak mencukupi untuk menulis dengan gelung, maka anda perlu mencapai penyelesaian universal untuk masalah yang sama tanpa gelung.
Anda akan mendapat satu daripada dua pilihan:
Diingini

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 yang sama terlebih dahulu, semasa mempelajari topik percabangan.
Jika pelajar mengemukakan pilihan "kemungkinan", maka anda perlu memberitahu mereka bahawa terdapat banyak penyelesaian untuk masalah yang sama. Walau bagaimanapun, mereka berbeza dalam penentangan mereka terhadap perubahan dalam keperluan. Tanya soalan: "Berapa banyak tempat dalam kod yang perlu dibetulkan jika saya perlu menambah nombor lain?" Dalam versi "kemungkinan", anda perlu menambah satu lagi cawangan dan menambah nombor baharu di 10 tempat lain. Dalam "yang dikehendaki" ia cukup untuk menambah hanya satu cawangan.
Tetapkan tugas untuk menghasilkan semula pilihan "diingini", kemudian cari corak dalam kod, lakukan penggantian pembolehubah dan tulis gelung.
Jika anda mempunyai idea tentang cara menyelesaikan masalah ini tanpa gelung dengan cara lain, sila tulis dalam komen.

Gelung dalam Gelung

Dalam topik ini anda perlu memberi perhatian kepada perkara berikut:
— pembilang untuk gelung dalam dan luar mestilah pembolehubah yang berbeza.
— kaunter untuk gelung dalam mesti ditetapkan semula berkali-kali (iaitu, dalam badan gelung luar).
— dalam tugasan output teks, anda tidak boleh mula-mula menulis satu huruf dalam beberapa baris, dan kemudian yang kedua. Anda mesti mencetak semua huruf baris pertama, kemudian semua huruf kedua, dan seterusnya.

Adalah lebih baik untuk mula menerangkan topik gelung dalam gelung dengan menerangkan kepentingan menetapkan semula pembilang kepada sifar.
Contoh tugasan:

Pengguna memasukkan dua nombor: R dan T. Cetak dua baris aksara "#". Baris pertama harus mengandungi aksara R. Baris kedua mengandungi kepingan T. Jika sebarang nombor negatif, paparkan mesej ralat.

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

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

R=-1, T=6Nilai R mestilah bukan negatif

R=6, T=-2Nilai T mestilah bukan negatif

Jelas sekali, masalah ini juga mempunyai sekurang-kurangnya dua penyelesaian.
Diingini

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;
}

Perbezaannya ialah dalam penyelesaian "kemungkinan", pembolehubah kedua digunakan untuk mengeluarkan baris kedua. Anda harus berkeras untuk menggunakan pembolehubah yang sama untuk kedua-dua gelung. Had ini boleh dibenarkan oleh fakta bahawa penyelesaian dengan satu pembilang untuk dua kitaran akan menjadi ilustrasi istilah "tetapan semula balas". Memahami istilah ini adalah perlu apabila menyelesaikan masalah berikut. Sebagai kompromi, anda boleh menyimpan kedua-dua penyelesaian kepada masalah tersebut.

Masalah biasa dengan menggunakan satu pembolehubah pembilang untuk dua gelung muncul seperti ini:
R=5, T=11#####
######

Bilangan aksara dalam baris kedua tidak sepadan dengan nilai T. Jika anda memerlukan bantuan dengan masalah ini, maka anda perlu melihat nota mengenai masalah biasa dengan gelung. Ini adalah simptom #3. Ia didiagnosis jika anda menambah output nilai balas sejurus sebelum kitaran kedua. Dibetulkan dengan menetapkan semula. Tetapi adalah lebih baik untuk tidak memberitahu perkara ini dengan segera. Pelajar mesti cuba merumus sekurang-kurangnya satu hipotesis.

Sudah tentu, ada penyelesaian lain. Tetapi saya tidak pernah melihatnya di kalangan pelajar. Pada peringkat mempelajari kitaran, cerita mengenainya akan mengalihkan perhatian. Anda boleh kembali kepadanya kemudian apabila mempelajari tentang fungsi rentetan.
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));

Tugasan yang diperlukan seterusnya:

Paparkan nombor dari 0 hingga 9. Setiap nombor hendaklah pada barisnya sendiri. Bilangan digit dalam satu baris (W) dimasukkan dari papan kekunci.

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

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

Sekiranya pelajar telah menguasai teknik menggantikan pembolehubah, maka dia akan mengatasi dengan cepat. Masalah yang mungkin berlaku sekali lagi adalah dalam menetapkan semula pembolehubah. Jika anda tidak dapat mengendalikan transformasi, ini bermakna anda tergesa-gesa dan perlu menyelesaikan masalah yang lebih mudah.

Terima kasih kerana memberi perhatian. Suka dan langgan saluran.

PS Jika anda mendapati kesilapan atau kesilapan dalam teks, sila beritahu saya. Ini boleh dilakukan dengan memilih sebahagian daripada teks dan menekan “⌘ + Enter” pada Mac dan “Ctrl / Enter” pada papan kekunci klasik atau melalui mesej peribadi. Jika pilihan ini tidak tersedia, tulis tentang ralat dalam ulasan. Terima kasih!

Hanya pengguna berdaftar boleh mengambil bahagian dalam tinjauan. Log masuk, Sama-sama.

Tinjauan 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% Lain-lain0

10 pengguna mengundi. 5 pengguna berpantang.

Sumber: www.habr.com

Tambah komen