Zorlukların nasıl aşılacağını ve aynı zamanda döngülerin nasıl yazılacağını nasıl öğretirim?

Her ne kadar temel konulardan birinden bahsedecek olsak da bu yazı deneyimli profesyoneller için yazılmıştır. Amaç, yeni başlayanların programlamada ne tür yanılgılara sahip olduğunu göstermektir. Uygulamalı geliştiriciler için bu sorunlar uzun zamandır çözülmüş, unutulmuş veya hiç fark edilmemiştir. Aniden bu konuyla ilgili birine yardım etmeye ihtiyaç duyarsanız makale kullanışlı olabilir. Makale, Schildt, Stroustrup ve Okulov'un programlama üzerine çeşitli kitaplarındaki materyallerle paralellikler kuruyor.

Döngülerle ilgili konu seçildi çünkü programlamada uzmanlaşırken pek çok kişi bu konunun dışında tutuldu.

Bu teknik zayıf öğrenciler için tasarlanmıştır. Kural olarak güçlü insanlar bu konuya takılıp kalmazlar ve onlara özel teknikler bulmaya gerek yoktur. Makalenin ikinci hedefi ise bu tekniği “tüm öğrenciler için çalışır, ancak yalnızca bir öğretmen için çalışır” sınıfından “tüm öğrenciler için çalışır, tüm öğretmenler için çalışır” sınıfına taşımaktır. Mutlak özgünlük iddiasında değilim. Bu konuyu öğretmek için zaten benzer bir metodoloji kullanıyorsanız, lütfen sürümünüzün nasıl farklılaştığını yazın. Kullanmaya karar verirseniz, bize nasıl gittiğini anlatın. Benzer bir teknik bir kitapta anlatılıyorsa lütfen adını yazınız.


Bu teknik üzerinde 4 yıl boyunca farklı eğitim seviyelerindeki öğrencilerle bireysel olarak çalıştım. Toplamda yaklaşık elli öğrenci ve iki bin saat ders bulunmaktadır. İlk başlarda öğrenciler hep bu konuya takılıp kaldılar. Her öğrenciden sonra metodoloji ve materyaller ayarlandı. Geçtiğimiz yıl boyunca öğrenciler artık bu konuya takılıp kalmadılar, bu yüzden bulgularımı paylaşmaya karar verdim.

Neden bu kadar çok mektup var? Döngüler o kadar basit ki!

Yukarıda yazdığım gibi, pratik yapan geliştiriciler ve güçlü öğrenciler için döngü kavramının karmaşıklığı hafife alınabilir. Örneğin uzun bir ders verebilir, sallanan kafaları ve zeki gözleri görebilirsiniz. Ancak herhangi bir sorunu çözmeye çalışırken sersemlik ve açıklanamayan sorunlar başlar. Dersten sonra öğrenciler muhtemelen konuyu kısmen anladılar. Durum, öğrencilerin kendilerinin sanrılarının tam olarak ne olduğunu dile getirememeleri nedeniyle daha da kötüleşiyor.
Bir gün öğrencilerin örneklerimi hiyeroglif olarak algıladıklarını fark ettim. Yani, içine bazı "sihirli" harfler eklemeniz gereken bölünmez metin parçaları gibi ve işe yarayacaktır.
Bazen öğrencilerin belirli bir sorunu çözmenin gerekli olduğunu düşündüklerini fark ettim. başka bir şey henüz ele almadığım bir tasarım. Çözüm örnekte yalnızca küçük bir değişiklik gerektirmesine rağmen.

Bu yüzden odak noktasının ifadelerin söz dizimi değil, döngüler kullanılarak tekrarlanan kodu yeniden düzenleme fikri olması gerektiği fikrini ortaya attım. Öğrenciler bu fikre hakim olduktan sonra, herhangi bir sözdizimi çok az pratikle geliştirilebilir.

Kime ve neden öğretiyorum?

Giriş sınavı olmadığı için sınıflarda hem güçlü hem de çok zayıf öğrenciler yer alabilmektedir. Makalede öğrencilerim hakkında daha fazla bilgi edinebilirsiniz Akşam kursu öğrencilerinin portresi
Programlama öğrenmek isteyen herkesin öğrenebilmesi için çaba harcadım.
Derslerim bireysel olarak yapılıyor ve öğrenci her ders için kendi parasını ödüyor. Görünüşe göre öğrenciler maliyetleri optimize edecek ve minimumu talep edecek. Ancak insanlar canlı bir öğretmenle yüz yüze derslere bilginin kendisi için değil, öğrendiklerinin güveni için, ilerleme hissi için ve uzmandan (öğretmen) onay almak için giderler. Öğrenciler öğrenmelerinde ilerleme hissetmezlerse ayrılırlar. Genel olarak sınıflar, öğrencilerin tanıdık yapıların sayısının artmasında ilerlemeyi hissetmelerini sağlayacak şekilde yapılandırılabilir. Yani, önce ayrıntılı olarak çalışırız, sonra çalışırız, sonra çalışırız ve şimdi iki ay boyunca döngülerin tek başına çalışıldığı bin bir gecelik kursumuz hazırdır ve sonunda - yazan bir öğrenci dikte edilen standart bir kütüphane. Ancak pratik sorunları çözmek için yalnızca materyal bilgisine değil, aynı zamanda uygulama ve yeni bilgi arayışında bağımsızlığa da ihtiyacınız var. Bu nedenle yüz yüze derslerde doğru prensibin asgariyi öğretmek ve nüanslar ve ilgili konuların bağımsız çalışılmasını teşvik etmek olduğunu düşünüyorum. Döngüler konusunda, while yapısının minimum olduğunu düşünüyorum. Prensibi bundan anlayabilirsiniz. Prensibi bilerek, hem kendiniz için hem de kendi başınıza yaparken ustalaşabilirsiniz.

Zayıf öğrencilerin materyale hakim olmaları için sözdizimini açıklamak yeterli değildir. Daha basit ama çeşitli görevler vermek ve örnekleri daha detaylı anlatmak gerekiyor. Sonuçta gelişim hızı, öğrencinin ifadeleri dönüştürme ve kalıp arama becerisiyle sınırlıdır. Zeki öğrenciler için çoğu ödev sıkıcı olacaktır. Onlarla çalışırken sorunların %100 çözümünde ısrar etmenize gerek yok. Materyalim şu adreste görülebilir: benim github'ım. Doğru, depo daha çok bir büyücünün büyü kitabına benziyor - neyin nerede olduğunu benden başka kimse anlamayacak ve kontrolü geçemezsen delirebilirsin

Metodoloji uygulamaya yöneliktir

Teori, bir problemin çözümü örneği kullanılarak açıklanmaktadır. Dalların ve döngülerin öğretildiği programlamanın temelleri dersinde, bir saat boyunca tek bir konu hakkında faydalı bir ders vermek kesinlikle mümkün değildir. Konsepti anlatmak için 15-20 dakika yeterlidir. Temel zorluklar pratik görevleri yerine getirirken ortaya çıkar.
Yeni başlayan öğretmenler tek bir derste operatörleri, dalları, döngüleri ve dizileri anlatabilirler. Ancak öğrencileri bu bilgiyi özümseme sorunuyla karşı karşıya kalacaklar.
Sonuçta, sadece materyali anlatmak değil, aynı zamanda dinleyicilerin onu anladığından da emin olmanız gerekir.

Bir konuya hakim olma gerçeği, öğrencinin bağımsız çalışmayla nasıl başa çıktığıyla belirlenir.
Eğer öğrenci bir konu hakkındaki problemi öğretmenin yardımı olmadan çözebiliyorsa o konu hakim olmuş demektir. Kendi kendine testi sağlamak için her görev, test senaryolarını içeren bir tabloda açıklanır. Görevlerin net bir sırası var. Görevlerin atlanması önerilmez. Mevcut görev çok zorsa, bir sonrakine geçmek işe yaramaz. Daha da karmaşık. Öğrencinin mevcut karmaşık görevde ustalaşabilmesi için, ona ilk problem örneğini kullanarak çeşitli teknikler açıklanır. Aslında konunun tüm içeriği zorlukların üstesinden gelme tekniklerine dayanıyor. Döngüler daha çok bir yan etkidir.

İlk görev her zaman bir örnektir. İkincisi biraz farklıdır ve birincinin hemen ardından bir öğretmenin gözetiminde "bağımsız olarak" gerçekleştirilir. Sonraki tüm görevler, yanlış anlamalara neden olabilecek çeşitli küçük şeylere dikkat etmeyi amaçlamaktadır.

Örneğin açıklaması, öğrencinin materyalin bir kısmına hakim olduğundan emin olmak için yayılımı ve çapraz doğrulamayı geri çağırması gereken bir diyalogdur.

Banal olacağım ve konuyla ilgili ilk örneğin çok önemli olduğunu söyleyeceğim. Kapsamlı bağımsız çalışma için gerekli materyale sahipseniz, ilk örnekteki eksiklikler düzeltilebilir. Örneğin dışında başka bir şey yoksa, öğrenci büyük olasılıkla konuya hakim olamayacaktır.

Ne zaman, ne için?

Tartışmalı konulardan biri de örneğin yapının seçimidir: while veya for. Bir keresinde, hiçbir öğretmenlik deneyimi olmayan, pratik yapan bir geliştirici arkadaşım, for döngüsünün anlaşılması en kolay döngü olduğuna beni ikna etmek için bir saat harcadı. Tartışmalar şu şekilde özetlenmişti: "İçindeki her şey açık ve yerli yerinde." Ancak, gerçek yeni başlayanlar için zorlukların temel nedeni, yazımı değil, döngünün kendisi fikridir. Eğer kişi bu fikri anlamazsa sözdiziminde zorluk yaşayacaktır. Fikir hayata geçirildiği anda kod tasarımındaki sorunlar kendiliğinden ortadan kalkar.

Malzemelerimde döngü teması dallanma temasını takip ediyor. if ve while'ın dışsal benzerliği doğrudan bir benzetme yapmamıza olanak tanır: "başlıktaki koşul doğru olduğunda gövde yürütülür." Döngünün tek özelliği bedenin birçok kez idam edilmesidir.

İkinci iddiam while'ın for'dan daha az biçimlendirme gerektirmesidir. Daha az biçimlendirme, eksik virgül ve parantezlerle ilgili daha az aptalca hata anlamına gelir. Yeni başlayanlar, sözdizimi hatalarını otomatik olarak önlemek için henüz yeterli dikkat ve titizliği geliştirmemişlerdir.
Üçüncü argüman birçok iyi kitapta ilk argüman olarak açıklanmaktadır.

Öğrenci ifadeleri kolayca dönüştürebiliyorsa, geçerken bunun hakkında konuşabilirsiniz. Öğrenci daha sonra en çok neyi sevdiğini seçecektir. Dönüşümler zorluklara neden oluyorsa dikkatinizi dağıtmamak daha iyidir. Öğrencinin önce her şeyi while kullanarak çözmesine izin verin. Döngüler konusunda uzmanlaştıktan sonra, while'ı for'a dönüştürme alıştırması yapmak için çözümleri yeniden yazabilirsiniz.
Sonkoşul döngüleri oldukça nadir görülen bir canavardır. Buna hiç vakit ayırmıyorum. Eğer bir öğrenci kalıpları tanımlama ve ifadeleri dönüştürme fikirlerinde uzmanlaştıysa, bunu benim yardımım olmadan da çözebilir.

İlk örneği güçlü öğrencilere gösterirken, ilk örnekte sadece çözümü değil, sonuca yol açan tüm eylem zincirini kaydetmenin önemli olduğuna dikkat çekiyorum. Tembel öğrenciler yazıyı ihmal edebilir ve yalnızca son algoritmayı kopyalayabilir. Bir gün önlerine zor bir görevin geleceğine ikna edilmeleri gerekiyor. Sorunu çözmek için bu örnekteki gibi adımları uygulamanız gerekecektir. Bu nedenle tüm aşamaların kayıt altına alınması önemlidir. Aşağıdaki problemlerde çözümün sadece son halini bırakmak mümkün olacaktır.

Otomasyonun ana fikri, bir kişinin rutin işlerini yapması için bir bilgisayarı emanet etmemizdir. Temel tekniklerden biri döngü yazmaktır. Bir programda birbirinin aynı olan birkaç yinelenen eylem art arda yazıldığında kullanılır.

Açık, örtülü olmaktan daha iyidir

İlk döngü görevinde aynı ifadeyi birden çok kez görüntülemek iyi bir fikir gibi görünebilir. Örneğin:

Yaşasın, işe yarıyor!
Yaşasın, işe yarıyor!
Yaşasın, işe yarıyor!
Yaşasın, işe yarıyor!
Yaşasın, işe yarıyor!
Yaşasın, işe yarıyor!
Yaşasın, işe yarıyor!
Yaşasın, işe yarıyor!

Bu seçenek kötüdür çünkü sayaç değeri çıktıda görünmez. Bu yeni başlayanlar için bir sorundur. Onu küçümseme. İlk başta bu görev birincisiydi ve artan sırada bir dizi sayı türetme görevi ikinciydi. Aslında aynı şey olan "N kere çevrim" ve "A'dan B'ye çevrim" gibi ek terimlerin eklenmesi gerekiyordu. Gereksiz varlıklar yaratmamak için bir dizi sayının çıktısı ile sadece bir örnek göstermeye karar verdim. Çok az insan, bir sayacı kafasında nasıl tutacağını ve bir programın davranışını hazırlık yapmadan kafasında nasıl modelleyeceğini öğrenmeyi başarır. Bazı öğrenciler zihinsel modellemeyle ilk kez döngüler konusunda karşılaşırlar.
Biraz pratik yaptıktan sonra, aynı metni bağımsız olarak çözülecek şekilde tekrarlama görevini veriyorum. Önce görünen, sonra görünmeyen bir sayaç verirseniz öğrencilerin daha az sorunu olacaktır. Bazen “Sayacı ekrana yazmayın” ipucu yeterlidir.

Başkaları bunu nasıl açıklıyor?

İnternetteki çoğu eğitim materyalinde döngünün sözdizimi bir “dersin” parçası olarak verilmektedir. Örneğin, geliştirici.mozilla.org'da (şu anda), while döngüsüyle birlikte başka birçok yapı da açıklanmaktadır. Bu durumda sadece tasarımların kendisi şablon şeklinde verilmektedir. Fırlatmanın sonucu kelimelerle anlatılıyor, ancak bir örnek yok. Bana göre konunun böyle bir sunumu, bu tür materyallerin kullanışlılığını sıfırla çarpıyor. Öğrenci kodu yeniden yazıp kendisi çalıştırabilir, ancak yine de karşılaştırma için bir standarda ihtiyacı vardır. Sonucu karşılaştıracak hiçbir şey yoksa, bir örneğin doğru şekilde yeniden yazıldığını nasıl anlayabilirsiniz?
Örnek olmadan sadece şablon verildiğinde öğrencinin işi daha da zorlaşır. Kod parçalarının şablona doğru şekilde yerleştirildiği nasıl anlaşılır? yazmayı deneyebilirsin her nasılsave ardından koşun. Ancak sonucu karşılaştıracak bir standart yoksa, lansmanın da bir faydası olmayacaktır.

Sezgisel C++ dersinde döngü sözdizimi, “operatörler” konusuyla ilgili Ders 4'ün üçüncü sayfasında gömülüdür. Döngülerin sözdizimini açıklarken “operatör” terimine özellikle vurgu yapılır. Terim “sembol; bu bir ifadedir", "{} bileşik bir ifadedir", "döngünün gövdesi bir ifade olmalıdır". Bu yaklaşımı sevmiyorum çünkü önemli ilişkileri bir terimin arkasına saklıyor gibi görünüyor. Bir programın kaynak kodunun bu seviyedeki terimlere ayrıştırılması, derleyici geliştiricilerinin dil spesifikasyonunu uygulaması için gereklidir, ancak ilk yaklaşım olarak öğrenciler tarafından gerekli değildir. Programlamaya yeni başlayanlar nadiren terimlere bu kadar dikkat edecek kadar titiz davranırlar. Yeni kelimeleri ilk defa hatırlayıp anlayan nadir kişilerdendir. Neredeyse hiç kimse yeni öğrendiği bir terimi doğru bir şekilde uygulayamaz. Bu nedenle öğrenciler “while(a<7);{ yazdım ama program çalışmıyor” gibi çok fazla hata alıyorlar.
Bana göre başlangıçta yapının sözdizimini hemen parantezlerle vermek daha doğru olur. Parantezsiz seçenek yalnızca öğrencinin belirli bir sorusu varsa açıklanmalıdır: "neden parantez yok ve işe yarıyor."

Okulov'un 2012 tarihli "Programlamanın Temelleri" kitabında döngülere giriş for modeliyle başlıyor, ardından kullanımına ilişkin öneriler veriyor ve ardından hemen dersin deneysel bölümüne geçiyor. Kitabın, derslerime nadiren gelen çok yetenekli öğrencilerden oluşan azınlık için yazıldığını anlıyorum.

Popüler kitaplarda kod parçalarının sonucu her zaman yazılır. Örneğin, Shildt'in “Java 8. The Complete Guide” 2015 baskısı. Önce bir şablon verilir, ardından örnek bir program ve hemen ardından uygulamanın sonucu verilir.

Örnek olarak bunun tersini yapan bir while döngüsü düşünün.
10'dan başlayan geri sayım ve tam olarak 10 satırlık "ölçü" görüntülenir:

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

Bu program çalıştırıldıktan sonra aşağıdaki gibi on "döngü" çıktısı verir:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Bir şablonun, örnek bir programın ve programın sonucunun anlatılması yaklaşımı “Javascript for Kids” kitabında ve w3schools.com'daki js dersinde de kullanılıyor. Web sayfası formatı bu örneğin etkileşimli olmasına bile olanak tanır.

Stroustrup'un 2016 tarihli C++ Kullanımı İlkeleri ve Uygulaması kitabı daha da ileri gitti. İlk adım, hangi sonucun elde edilmesi gerektiğini açıklamaktır ve ardından programın metni gösterilir. Üstelik sadece rastgele bir programı örnek almıyorlar, aynı zamanda tarihe bir gezi veriyorlar. Bu, dikkatin konuya çekilmesine yardımcı oluyor: “Bakın, bu sadece işe yaramaz bir metin değil. Anlamlı bir şey görüyorsunuz."

Yinelemeye bir örnek olarak, depolanan program makinesinde (EDSAC) yürütülen ilk programı düşünün. 6 Mayıs 1949'da İngiltere'deki Cambridge Üniversitesi Bilgisayar Laboratuvarı'nda David Wheeler tarafından yazılmıştır. Bu program basit bir kareler listesi hesaplar ve yazdırır.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Burada her satırda bir sayı ve ardından bir sekme karakteri ('t') ve bu sayının karesi bulunur. Bu programın C++ sürümü şuna benzer:

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

İlginç bir şekilde, sözdizimi modeli bu kitapta açıklanmamıştır. Eğitmen kılavuzunda Stroustrup (çeviri) öğrencilerinin zekasına saygı duyduğunu vurgulamaktadır. Belki de birkaç örnekteki bir modeli tanımlama yeteneği, bu tür bir zekanın tezahürü olarak kabul edilir.

Kendimi anlatırken

Stroustrup'un yaklaşımı: sonucun tanımlanması, ardından sorunun çözülmesi ve ardından öğrencinin bağımsız bir analizi - en düşünceli görünüyor. Bu nedenle, bunu temel almaya karar verdim, ancak daha az tarihsel bir örnek kullanarak anlatmaya karar verdim - bir "içindekiler" oluşturma görevi. Daha sonra “içindekiler ile ilgili görevi hatırla” diyebilmeniz ve öğrencilerin bunu tam olarak hatırlaması için tanınabilir bir bağlantı noktası oluşturur. Örneğimde en yaygın iki yanılgıyı daha engellemeye çalıştım. Daha sonra onlar hakkında daha detaylı yazacağım.

Bu görevde karmaşık problemleri çözmeye yönelik tekniklerle tanışıyoruz. İlk kararın ilkel ve basit olması gerekiyor. O zaman bu çözümü nasıl geliştireceğinizi düşünebilirsiniz.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Gözlemlerime göre çeşitli kombinasyonlarda “şablon-örnek-sonuç” yaklaşımı öğrencilerin hala döngüyü bir hiyeroglif olarak algılamalarına neden oluyor. Bu, neden oraya yazma koşulu olduğunu, i++ ile i arasında nasıl seçim yapılacağını ve görünüşte bariz olan diğer şeyleri anlamamalarıyla kendini gösterdi. Bu yanlış anlamalardan kaçınmak için döngülerden bahsetme yaklaşımı, aynı eylemleri tekrarlamanın ve ancak daha sonra bunları bir yapı kullanarak resmileştirmenin anlamını vurgulamalıdır. Bu nedenle döngü sözdizimini vermeden önce sorunu doğrudan çözmeniz gerekir. İçindekiler tablosu sorununun ilkel çözümü şuna benzer:

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("Заключение");

nasıl geliştirilebilir?
Monoton eylemleri bir döngüyle değiştirin.
Hangi eylemler art arda değişiklik yapılmadan tekrarlanıyor?
Bu parçada hiçbiri yok. Ancak “Bölüm” kelimesinin bir sayı ile görüntülenmesine ilişkin komutlar birbirine çok benzemektedir.
Bu nedenle bir sonraki aşama parçalar arasındaki farkı bulmaktır. Yalnızca bu görevde her şey açıktır, o zaman tek komutlar tekrarlanmayacak, ancak 5 satır veya daha fazla kod blokları tekrarlanacaktır. Yalnızca komut listesinde değil, dallanma veya döngü yapılarında da arama yapmanız gerekecek.
Örnekte komutlar arasındaki fark “Bölüm” sözcüğünden sonraki sayıdadır.
Farkı bulduğunuzda değişimin modelini anlamanız gerekir. Farklı parça sayı mı? Sürekli artıyor mu yoksa azalıyor mu? Bir sayının değeri iki takım arasında yan yana nasıl değişir?
Örnekte “Bölüm” sözcüğünden sonraki sayı 1'er artışlarla artmaktadır. Fark bulunur, desen ortaya çıkar. Artık farklı parçayı bir değişkenle değiştirebilirsiniz.
Tekrarlanan parçaların ilkinden önce böyle bir değişkeni bildirmeniz gerekir. Böyle bir değişkene genellikle I veya j veya daha ayrıntılı bir ad verilir. Başlangıç ​​değeri ekranda görüntülenen ilk değere eşit olmalıdır. Örnekte ilk değer 1'dir.
“100, 101, 102, 103, 104, 105” sayı serisini görüntülemek için hangi başlangıç ​​değeri alınmalıdır?
Bu serideki ilk sayı 100'dür.
Her çıkış komutundan sonra bu değişkenin değerini 1 artırmanız gerekir. Bu birim değişim adımıdır.
“100, 102, 104, 106” sayı dizisinde hangi adım olacak?
Bu satırdaki 2. adım.
Farklı parçayı bir değişkenle değiştirdikten sonra kod şöyle görünecektir:

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("Заключение");

Kodda "değişkenin modelini ifade etme" tekniğini uyguladıktan sonra, arka arkaya giden birkaç aynı eylem grubunu elde edersiniz. Artık tekrarlanan eylemler bir döngüyle değiştirilebilir.

Döngüleri kullanmanız gereken bir sorunu çözme sırası aşağıdaki adımlardan oluşur:

  1. Birçok ayrı komutla "başbaşa" sorunu çözün
  2. Bir model bulun
  3. Bir değişkenin modelini ifade edin
  4. Döngü olarak tasarım

Daha sonra öğrencinin kendisini “Her şeyi anlıyorum ama söyleyemem” durumunda bulmaması için yeni terimler getiriliyor:
— sayaç her zaman bir döngüdeki adım sayısını izlemek için gereken bir değişkendir. Tipik olarak kısıtlamayla karşılaştırılan bir tamsayı.
- sayaç adımı - sayaç değişiklikleri modelinin açıklaması.
- kısıtlama - algoritmanın nihai olması için sayacın karşılaştırılacağı bir sayı veya değişken. Sayaç değeri sınıra yaklaşacak şekilde değişir.
— döngü gövdesi — tekrarlanacak bir dizi komut. “Komut bir döngü içinde yazılır” derken gövdeyi kastediyorlar.
— döngü yinelemesi — döngü gövdesinin bir defada yürütülmesi.
— döngü koşulu — başka bir yinelemenin yürütülüp yürütülmeyeceğini belirleyen mantıksal bir ifade. (Burada dallanma yapılarıyla ilgili karışıklık olabilir)
Öğrencilerin ilk başta terimleri başka amaçlarla kullanacakları gerçeğine hazırlıklı olmanız gerekir. Bu hem güçlü hem de zayıf için geçerlidir. Ortak dil oluşturmak bir sanattır. Şimdi kısaca yazacağım: "Kod parçasını <term> ile vurgulama" görevini ayarlamanız ve bu terimleri konuşma sırasında kendiniz doğru kullanmanız gerekiyor.
Bir döngü ile dönüşümden sonra parça elde edilir:

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

Temel yanlış anlama

Öğrenciler arasındaki popüler yanılgılardan biri, eylemleri yalnızca bir kez yapılması gereken bir döngünün içine yerleştirmeleridir. Örneğin şöyle:

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

Öğrenciler hem başlangıçta hem de daha karmaşık problemlerde bu problemle her zaman karşılaşırlar.
Bu durumda önemli ipucu:

Komutu kaç kez tekrarlamalısınız: bir kez mi yoksa birçok kez mi?

"Giriş" ve "Sonuç" sözcüklerini yazdırma ve i değişkenini bildirme ve başlatma komutları, diğer tekrarlanan eylemler gibi değildir. Yalnızca bir kez çalıştırılırlar, bu da döngü gövdesinin dışına yazılmaları gerektiği anlamına gelir.

Çözümün üç aşamasının tümü kodda kalmalıdır, böylece daha sonra zorluk yaşamanız durumunda bunlara başvurabilirsiniz. İlk iki seçeneğin müdahale etmemesi için yorumlanması yeterlidir.
Öğrencinin dikkati aşağıdaki gerçeklere çekilmelidir:
— Döngü durumunda genellikle bir sayaç ve bir limit karşılaştırılır. Sayaç döngünün gövdesinde değişebilir ama limit değişemez. Bu kuralı çiğnemek için zorlayıcı nedenler oluşturmanız gerekir.
— “Giriş” ve “Sonuç” sözcüklerini görüntülemeye yönelik komutlar döngünün gövdesinin dışında bulunur. Bunları 1 defa yapmamız gerekiyor. “Giriş” - eylemleri tekrarlamadan önce, “Sonuç” - sonra.
Bu konuyu pekiştirme, sonraki konulara hakim olma ve zorluklarla baş etme sürecinde güçlü öğrencilerin bile şu soruyu sorması faydalıdır: “Bu eylemin kaç kez yapılması gerekiyor? Bir mi yoksa daha fazla mı?

Ek becerilerin geliştirilmesi

Çalışma döngüleri sürecinde öğrenciler aynı zamanda sorunları teşhis etme ve çözme becerilerini de geliştirirler. Teşhisi gerçekleştirmek için öğrencinin istenen sonucu sunması ve bunu gerçek sonuçla karşılaştırması gerekir. Düzeltici faaliyetler aralarındaki farka bağlıdır.
Bu aşamadaki öğrencilerin “istenen” sonuç hakkında henüz çok az fikirleri olduğundan test verilerine odaklanabilirler. Kural olarak, bu aşamada hiç kimse neyin yanlış gidebileceğini ve bununla nasıl başa çıkılacağını henüz anlamıyor. Bu nedenle, bir not defterine tipik sorunların bir tanımını ve bunları çözmenin birkaç yolunu yazıyorum. En uygun olanı seçmek öğrencinin görevidir.
“Beklenen gerçekleşti mi?”, “Bu durumlardan hangisi şimdi oldu?”, “Uygulanan çözüm işe yaradı mı?” gibi soruların kayıt altına alınması gerekiyor.

  1. Eylem sayısı beklenenden 1 az veya fazla. Çözümler:
    — sayacın başlangıç ​​değerini 1 artırın.
    — kesin karşılaştırma işlecini (< veya >) katı olmayan bir işleçle (<= veya >=) değiştirin.
    — sınır değerini 1 olarak değiştirin.
  2. Döngüdeki eylemler süresiz olarak durmadan gerçekleştirilir. Çözümler:
    — eksikse bir sayaç değiştirme komutu ekleyin.
    — sayaç değiştirme komutunu, değeri limite yakın olacak şekilde sabitleyin.
    — döngünün gövdesindeyse kısıtlama değiştirme komutunu kaldırın.
  3. Bir döngüdeki eylem sayısı beklenenden 1'den fazla veya daha az. Döngüdeki eylem bir kez bile yürütülmedi. Öncelikle döngü başlamadan hemen önce değişkenlerin gerçek değerlerini bulmanız gerekir. Çözümler:
    — kısıtlamanın başlangıç ​​değerini değiştirin
    — sayacın başlangıç ​​değerini değiştirin

Sorun 3 genellikle yanlış değişkenin kullanılmasını veya sayacın sıfırlanmamasını içerir.

Bu açıklamadan sonra öğrenci hala döngülerin nasıl çalıştığına dair çeşitli yanılgılara sahip olabilir.
En yaygın olanları ortadan kaldırmak için size aşağıdaki görevleri veriyorum:

  1. Limitin, başlangıç ​​sayaç değerinin veya sayaç adımının kullanıcı tarafından girildiği yerdir.
  2. Bazı aritmetik ifadelerde sayaç değerinin kullanılması gerekir. Farkın doğrusal olmaması için radikal ifadede veya paydada bir sayaç kullanılması tavsiye edilir.
  3. Döngü çalışırken sayaç değerinin ekranda görüntülenmediği durum. Örneğin, gerekli sayıda aynı metin parçasını görüntülemek veya kaplumbağa grafikli bir şekil çizmek.
  4. Önce bazı tekrarlayan eylemleri, sonra da diğerlerini gerçekleştirmeniz gerekir.
  5. Tekrarlamadan önce ve sonra başka eylemler gerçekleştirmeniz gereken

Her görev için test verilerini ve beklenen sonucu sağlamanız gerekir.

Ne kadar hızlı hareket edebileceğinizi anlamak için bu problemlerin şartlarını okuyup şu soruyu sormanız gerekir: “Örnekten ne kadar farklılar?”, “Bunları çözmek için örnekte neyin değiştirilmesi gerekiyor?” Öğrenci anlamlı cevap verirse, en az birini sınıfta, geri kalanını evde kendi başına çözmesine izin verin. Çözüm başarılı olursa döngülerin içindeki koşulları açıklamaya başlayabiliriz.
Sorunları kendi başınıza çözerken sorun yaşıyorsanız, sınıfta her şeyin üzerinde çalışmanız gerekir. Sorunun baykuş çizmeye benzer bir şekilde çözülmesini önlemek için öncelikle sorunu evrensel olmayan bir şekilde çözmenizi öneririm. Yani çözüm ilk testi geçer ve döngü yapısını kullanmaz. O halde çözümün evrenselliğini sağlamak için dönüşümleri uygulayın.

Döngüler ve dallar

“Dallar içindeki döngüler” konusunu ayrıca vermekte fayda var diye düşünüyorum. Böylece daha sonra bir koşulu birden çok kez kontrol etmekle bir kez kontrol etmek arasındaki farkı görebilirsiniz.
Konsolidasyon görevleri, kullanıcı tarafından girilen A'dan B'ye sayıların çıktısının alınmasıyla ilgili olacaktır:
- her zaman artan sırada.
- A ve B değerlerine bağlı olarak artan veya azalan.

"Döngüler içinde dallanma" konusuna ancak öğrenci şu tekniklerde uzmanlaştıktan sonra devam edilmelidir: "örüntüyü değişkenle değiştirmek" ve "tekrarlayan eylemleri döngüyle değiştirmek."
Döngülerin içinde dalların kullanılmasının ana nedeni desendeki anormalliklerdir. Ortada ilk verilere bağlı olarak kırılır.
Basit teknikleri birleştirerek çözüm arayabilen öğrenciler için “dallanma döngüler içinde yazılabilir” deyip problemi “örneğin” tamamen vererek bağımsız olarak çözmeleri yeterlidir.
Örnek görev:

Kullanıcı X sayısını girer. 0'dan 9'a kadar olan sayıları bir sütunda görüntüleyin ve X'e eşit olan sayının karşısına '+' işareti koyun.

0 girildiyse0+
1
2
3
4
5
6
7
8
9

6 girildiyse0
1
2
3
4
5
6+
7
8
9

9 girildiyse0
1
2
3
4
5
6
7
8
9+

777 girildiyse0
1
2
3
4
5
6
7
8
9

Döngü ile yazmak için kısa bir açıklama yeterli değilse o zaman aynı soruna döngü olmadan evrensel bir çözüm bulmanız gerekir.
İki seçenekten birini alacaksınız:
İstenen

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

potansiyel

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+");
}

Dallanma konusunu incelerken benzer bir görevi önceden veriyorum.
Eğer öğrenci “olası” bir seçenek bulursa, o zaman onlara aynı problemin birçok çözümünün olabileceğini anlatmanız gerekir. Ancak gereksinimlerdeki değişikliklere karşı dirençleri bakımından farklılık gösterirler. Şu soruyu sorun: "Başka bir sayı eklemek zorunda kalsaydım, kodda kaç yerin düzeltilmesi gerekirdi?" “Olası” versiyonda bir şube daha eklemeniz ve 10 yere yeni bir numara eklemeniz gerekecek. "İstenen" kısmına yalnızca bir şube eklemek yeterlidir.
"İstenen" seçeneği yeniden oluşturmak için görevi ayarlayın, ardından kodda bir model bulun, değişken değişimi gerçekleştirin ve bir döngü yazın.
Bu sorunu döngü olmadan başka bir şekilde nasıl çözebileceğinize dair bir fikriniz varsa lütfen yorumlara yazın.

Döngüler içindeki döngüler

Bu konu içerisinde aşağıdaki hususlara dikkat etmeniz gerekmektedir:
— iç ve dış döngülerin sayaçları farklı değişkenler olmalıdır.
— iç döngünün sayacı birçok kez sıfırlanmalıdır (yani dış döngünün gövdesinde).
— metin çıktısı görevlerinde, önce birkaç satıra bir harf, sonra ikincisini yazamazsınız. Önce ilk satırın tüm harflerini, ardından ikinci satırın tüm harflerini vb. yazdırmalısınız.

Döngüler içinde döngüler konusunu açıklamaya sayacı sıfıra sıfırlamanın önemini anlatarak başlamak en doğrusu.
Örnek görev:

Kullanıcı iki sayı girer: R ve T. "#" karakterlerinden oluşan iki satır yazdırın. İlk satır R karakterlerini içermelidir. İkinci satırda T parçaları bulunur. Herhangi bir sayı negatifse bir hata mesajı görüntüleyin.

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

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

R=-1, T=6R değeri negatif olmamalıdır

R=6, T=-2T değeri negatif olmamalıdır

Açıkçası bu sorunun da en az iki çözümü var.
İstenen

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

Olası #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;
}

Aradaki fark, "olası" çözümde ikinci satırın çıktısını almak için ikinci bir değişkenin kullanılmasıdır. Her iki döngü için de aynı değişkeni kullanmakta ısrar etmelisiniz. Bu sınırlama, iki çevrim için tek sayaçlı bir çözümün "sayacın sıfırlanması" teriminin bir örneği olacağı gerçeğiyle gerekçelendirilebilir. Aşağıdaki problemleri çözerken bu terimi anlamak gereklidir. Bir uzlaşma olarak, sorunun her iki çözümünü de kaydedebilirsiniz.

İki döngü için bir sayaç değişkeninin kullanılmasıyla ilgili tipik bir sorun şöyle görünür:
R=5, T=11#####
######

İkinci satırdaki karakter sayısı T değerine karşılık gelmiyor. Bu problemle ilgili yardıma ihtiyacınız varsa döngülerle ilgili tipik problemlerle ilgili notlara göz atmanız gerekir. Bu semptom #3. İkinci döngüden hemen önce bir sayaç değeri çıkışı eklerseniz teşhis konur. Sıfırlanarak düzeltildi. Ancak bunu hemen söylememek daha iyidir. Öğrenci en az bir hipotez formüle etmeye çalışmalıdır.

Elbette başka bir çözüm daha var. Ama bunu öğrenciler arasında hiç görmedim. Döngüleri inceleme aşamasında bununla ilgili hikaye dikkati dağıtacaktır. Daha sonra string fonksiyonlarını öğrenirken bu konuya geri dönebilirsiniz.
Olası #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));

Sonraki gerekli görev:

0'dan 9'a kadar sayıları görüntüleyin. Her sayı kendi satırında olmalıdır. Bir satırdaki rakam sayısı (W) klavyeden girilir.

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

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

Bir öğrenci bir değişkeni değiştirme tekniğinde ustalaştıysa, bu durumla oldukça hızlı bir şekilde başa çıkacaktır. Olası bir sorun yine değişkenin sıfırlanmasında olacaktır. Dönüşümün üstesinden gelemiyorsanız aceleniz var demektir ve daha basit sorunları çözmeniz gerekiyor demektir.

İlginiz için teşekkür ederiz. Beğenin ve kanala abone olun.

Not: Metinde yazım hatası veya hata bulursanız lütfen bana bildirin. Bu, metnin bir bölümünü seçip Mac'te "⌘ + Enter"a, klasik klavyelerde "Ctrl / Enter"a basılarak veya özel mesajlar aracılığıyla yapılabilir. Bu seçenekler mevcut değilse, yorumlardaki hatalar hakkında yazın. Teşekkür ederim!

Ankete sadece kayıtlı kullanıcılar katılabilir. Giriş yapLütfen.

Karması olmayan okuyucular için anket

  • %20,0Profesyonel olarak ders veriyorum, +12

  • %10,0Profesyonel olarak ders veriyorum, -11

  • %70,0Öğretmiyorum, +17

  • %0,0Öğretmiyorum, -10

  • %0,0Diğer (0

10 kullanıcı oy kullandı. 5 kişi çekimser kaldı.

Kaynak: habr.com

Yorum ekle