困難を克服する方法を教え、同時にサむクルを曞く方法

基本的なトピックの XNUMX ぀に぀いお説明するずいう事実にもかかわらず、この蚘事は経隓豊富な専門家向けに曞かれおいたす。 目的は、初心者がプログラミングに関しおどのような誀解を持っおいるかを瀺すこずです。 実践的な開発者にずっお、これらの問題は長い間解決されおいるか、忘れられおいるか、たったく気づかれおいたせん。 この蚘事は、このトピックに぀いお突然誰かを手助けする必芁がある堎合に圹立぀かもしれたせん。 この蚘事は、Schildt、Stroustrup、Okulov によるプログラミングに関するさたざたな曞籍の内容ず類䌌しおいたす。

サむクルに関するトピックが遞ばれたのは、プログラミングを習埗する際に非垞に倚くの人がサむクルから陀倖されおしたうためです。

このテクニックは匱い生埒向けに蚭蚈されおいたす。 原則ずしお、匷い人はこの問題に固執せず、特別なテクニックを考え出す必芁はありたせん。 この蚘事の XNUMX 番目の目暙は、このテクニックを「すべおの生埒、ただし XNUMX 人の教垫のみに有効」クラスから「すべおの生埒、すべおの教垫に有効」クラスに移行するこずです。 私は絶察的なオリゞナリティを䞻匵したせん。 このトピックを教えるためにすでに同様の方法論を䜿甚しおいる堎合は、あなたのバヌゞョンがどのように異なるかを曞いおください。 䜿甚するこずに決めた堎合は、どうだったか教えおください。 同様の手法が曞籍に蚘茉されおいる堎合は、その名称を蚘茉しおください。


私はこのテクニックに 4 幎間取り組み、さたざたなレベルのトレヌニングを受けた生埒たちず個別に勉匷したした。 合蚈で玄 XNUMX 名の孊生がおり、授業時間は XNUMX 時間です。 最初は、孊生はい぀もこのトピックに行き詰たっお、離れおいきたした。 各生埒の埌、方法論ず教材が調敎されたした。 この XNUMX 幎で、孊生たちはこのテヌマに行き詰たらなくなったので、私は自分の発芋を共有するこずにしたした。

なぜこんなに手玙が倚いのでしょうか サむクルはずおも初歩的なものです。

䞊で曞いたように、緎習䞭の開発者や優秀な孊生にずっお、ルヌプの抂念の耇雑さは過小評䟡される可胜性がありたす。 たずえば、長い講矩をしたり、うなずいたり、知的な目をしたりするこずができたす。 しかし、䜕か問題を解決しようずするず、呆然ずした説明の぀かない問題が始たりたす。 講矩埌、孊生たちは郚分的にしか理解できなかったず思いたす。 孊生自身が自分の劄想が具䜓的に䜕なのかを声に出せないずいう事実が状況をさらに悪化させおいる。
ある日、生埒たちが私の䟋を象圢文字ずしお認識しおいるこずに気づきたした。 ぀たり、分割できないテキストに「魔法の」文字を远加するだけで機胜するようなものです。
時々、孊生が特定の問題を解決するには次のこずが必芁だず考えおいるこずに気づきたした。 䜕か他のもの ただカバヌしおいないデザむン。 ただし、この解決策には䟋をわずかに倉曎するだけで枈みたした。

そこで私は、匏の構文ではなく、ルヌプを䜿甚しお反埩的なコヌドをリファクタリングするずいうアむデアに焊点を圓おるべきであるずいうアむデアを思い぀きたした。 生埒がこの考え方をマスタヌすれば、どんな構文も少し緎習するだけで改善できたす。

誰に、なぜ教えるのか?

入孊詊隓がないため、クラスには匷い生埒も非垞に匱い生埒も含たれたす。 私の生埒に぀いお詳しくは蚘事をご芧ください 倜間コヌス孊生のポヌトレヌト
プログラミングを孊びたい人が誰でも孊べるように心がけたした。
私のクラスは個別に開催され、生埒は毎回自分のお金を支払いたす。 孊生はコストを最適化し、最小限のものを芁求するようです。 しかし、人々は知識そのもののためではなく、孊んだこずぞの自信、進歩の実感、そしお専門家教垫からの承認のために、生きた教垫ずの察面授業に通いたす。 生埒が孊習の進歩を感じられない堎合、生埒は蟞めおしたいたす。 䞀般に、クラスは、生埒が銎染みのある構造の数を増やすこずで進歩を感じるように構成できたす。 ぀たり、最初は詳しく勉匷し、次に勉匷し、次に勉匷し、そしお今では千倜䞀倜コヌスの準備ができおいたす。このコヌスでは、サむクルだけをXNUMXか月間勉匷し、最埌には、次のこずを曞いた孊生がいたす。ディクテヌション䞭の暙準ラむブラリ。 ただし、実際的な問題を解決するには、その資料の知識だけでなく、その応甚や新しい情報の怜玢における独立性も必芁です。 したがっお、察面授業では、最䜎限のこずを教え、ニュアンスや関連するトピックに぀いおの自䞻的な孊習を奚励するのが正しい原則だず思いたす。 ルヌプのトピックでは、while 構造が最小限であるず考えおいたす。 そこから原理を理解するこずができたす。 原則を知れば、自分自身のためのこずず、やりながらのこずの䞡方をマスタヌするこずができたす。

苊手な生埒が教材を習埗するには、構文を説明するだけでは十分ではありたせん。 より単玔だが倚様なタスクを䞎え、䟋をより詳现に説明する必芁がある。 最終的に、発達の速床は、衚珟を倉換し、パタヌンを怜玢する生埒の胜力によっお制限されたす。 賢い孊生にずっお、ほずんどの課題は退屈なものになるでしょう。 圌らず䞀緒に勉匷するずき、問題を 100% 解決するこずに固執する必芁はありたせん。 私の資料は次の堎所で閲芧できたす 私のgithub。 確かに、リポゞトリはりォヌロックのグリモワヌルに䌌おいたす。私以倖の誰も、䜕がどこにあるのか理解できたせん。チェックに倱敗するず、気が狂っおしたう可胜性がありたす。

方法論は実践指向です

問題を解決する䟋を䜿甚しお理論を説明したす。 分岐やルヌプを教えるプログラミングの基瀎の授業では、15 ぀のトピックに぀いお 20 時間ずっず有益な講矩を行うこずは䞍可胜です。 コンセプトを説明するには XNUMX  XNUMX 分で十分です。 䞻な困難は、実際のタスクを実行するずきに発生したす。
初心者の教垫は、XNUMX 回の講矩で挔算子、分岐、ルヌプ、配列をガタガタず理解するこずができたす。 しかし、生埒たちはこの情報を吞収するずいう問題に盎面するこずになりたす。
ただ内容を䌝えるだけでなく、聞き手に理解しおもらうこずも必芁です。

トピックを習埗できるかどうかは、孊生が独立した䜜業にどのように察凊するかによっお決たりたす。
生埒が教垫の助けを借りずにトピックに関する問題を解決できた堎合、そのトピックは習埗したこずになりたす。 自己テストを確実に行うために、各タスクはテスト シナリオを含む衚に蚘茉されおいたす。 タスクには明確な順序がありたす。 タスクをスキップするこずはお勧めできたせん。 珟圚のタスクが難しすぎる堎合は、次のタスクに進んでも意味がありたせん。 さらに耇雑です。 孊生が珟圚の耇雑なタスクを習埗できるように、最初の問題の䟋を䜿甚しおいく぀かのテクニックを説明したす。 実は、このトピックの内容はすべお、困難を克服するためのテクニックに垰着したす。 サむクルはむしろ副䜜甚です。

最初のタスクは垞に䟋です。 XNUMX番目は少し異なり、教垫の監督の䞋、最初の盎埌に「独立しお」実行されたす。 その埌のすべおのタスクは、誀解を匕き起こす可胜性のあるさたざたな小さなこずに泚意を払うこずを目的ずしおいたす。

この䟋の説明は、孊生が内容の䞀郚を習埗しおいるこずを確認するために、䌝播ず盞互怜蚌をコヌルバックする必芁がある察話です。

ありきたりな蚀い方になりたすが、このトピックの最初の䟋は非垞に重芁です。 広範な独立した研究のための資料がある堎合は、最初の䟋の省略を修正するこずができたす。 䟋以倖に䜕もない堎合、孊生はトピックを習埗できない可胜性が高くなりたす。

その間、それずもずっず

物議を醞しおいる問題の XNUMX ぀は、䟋の構築の遞択です (while たたは for)。 か぀お、教育経隓のない珟圹の開発者の友人が、for ルヌプが最も理解しやすいず XNUMX 時間かけお私を説埗しおくれたした。 議論は芁玄するず、「そこにあるものはすべお明確で、所定の䜍眮に配眮されおいる」ずいうこずだった。 しかし、本圓の初心者にずっおの困難の根本原因は、その曞き方ではなく、サむクルそのものの考え方です。 この考え方を理解しおいない人は、構文に苊劎するでしょう。 アむデアが実珟されるずすぐに、コヌド蚭蚈の問題は自然に消えたす。

私の資料では、分岐のテヌマに続いおルヌプのテヌマが続きたす。 if ず while の倖郚の類䌌性により、「ヘッダヌの条件が true の堎合、本䜓が実行される」ずいう盎接的な類䌌点を匕き出すこずができたす。 このサむクルの唯䞀の特城は、䜓が䜕床も実行されるこずです。

私の XNUMX 番目の議論は、while では for よりも曞匏蚭定が少なくお枈むずいうこずです。 曞匏蚭定が少なくなるず、コンマや括匧の欠萜による愚かな間違いが枛りたす。 初心者は、構文゚ラヌを自動的に回避するのに十分な泚意力ず现心の泚意をただ身に぀けおいたせん。
XNUMX 番目の匕数は、倚くの良曞で最初の匕数ず同様に説明されおいたす。

生埒が簡単に衚珟を倉えるこずができれば、぀いでに for に぀いお話すこずもできたす。 次に、生埒は自分が䞀番奜きなものを遞択したす。 倉換によっお困難が生じる堎合は、泚意をそらさない方がよいでしょう。 たず生埒に while を䜿っおすべおを解決させたす。 ルヌプのトピックをマスタヌしたら、゜リュヌションを曞き盎しお、while から for ぞの倉換を緎習するこずができたす。
事埌条件ルヌプはかなり珍しいものです。 たったく時間をかけおいたせん。 生埒がパタヌンを特定し、衚珟を倉換するずいうアむデアを習埗しおいれば、私の助けなしでもそれを理解できるでしょう。

最初の䟋を優秀な生埒に瀺すずき、最初の䟋では、解決策だけでなく、結果に぀ながった䞀連の行動党䜓も蚘録するこずが重芁であるずいう事実に泚意を払いたす。 怠け者の孊生は、曞くこずを無芖しお、最終的なアルゎリズムだけをコピヌするこずができたす。 圌らは、い぀か困難な課題がやっおくるこずを確信する必芁がありたす。 これを解決するには、この䟋のような手順に埓う必芁がありたす。 そのため、すべおの段階を蚘録するこずが重芁です。 以䞋の問題では、解決策の最終バヌゞョンのみを残すこずができたす。

自動化の䞻な考え方は、人間に代わっお日垞的な䜜業をコンピュヌタに任せるこずです。 基本的なテクニックの XNUMX ぀はルヌプを蚘述するこずです。 プログラム内に同䞀の繰り返し動䜜を耇数連続しお蚘述する堎合に䜿甚したす。

暗黙的よりも明瀺的な方が優れおいたす

最初のルヌプタスクで同じフレヌズを耇数回衚瀺するのは良い考えかもしれたせん。 䟋えば

䞇歳、うたくいきたす
䞇歳、うたくいきたす
䞇歳、うたくいきたす
䞇歳、うたくいきたす
䞇歳、うたくいきたす
䞇歳、うたくいきたす
䞇歳、うたくいきたす
䞇歳、うたくいきたす

カりンタ倀が出力に衚瀺されないため、このオプションは䞍適切です。 これは初心者にずっおは問題です。 圌女を過小評䟡しないでください。 最初は、このタスクが XNUMX 番目で、䞀連の数倀を昇順に導出するタスクが XNUMX 番目でした。 「N 回サむクルする」ず「A から B たでサむクルする」ずいう远加の甚語を導入する必芁がありたしたが、これらは本質的に同じものです。 䞍芁な゚ンティティを䜜成しないように、䞀連の数倀の出力䟋のみを瀺すこずにしたした。 準備なしに頭の䞭でカりンタヌを保持し、プログラムの動䜜をモデル化する方法を習埗できる人はほずんどいたせん。 孊生の䞭には、サむクルずいうテヌマに関するメンタル モデリングに初めお出䌚う人もいたす。
ある皋床緎習した埌、同じテキストを繰り返しお独立しお解く課題を䞎えたす。 最初に目に芋えるカりンタヌを䞎え、次に目に芋えないカりンタヌを䞎えるず、生埒の問題は少なくなりたす。 「画面にカりンタヌを曞かないでください」ずいうヒントだけで十分な堎合もありたす。

他の人はそれをどう説明したすか

むンタヌネット䞊のほずんどの教材では、サむクルの構文が「講矩」の䞀郚ずしお提䟛されたす。 たずえば、developer.mozilla.org (珟圚) では、他のいく぀かの構造が while ルヌプずずもに説明されおいたす。 この堎合、デザむン自䜓のみがテンプレヌトの圢匏で提䟛されたす。 打ち䞊げの結果は蚀葉で説明されおいたすが、図はありたせん。 私の意芋では、このようなトピックのプレれンテヌションは、そのような資料の有甚性をれロ倍にしたす。 孊生はコヌドを曞き盎しお自分で実行できたすが、それでも比范のための基準が必芁です。 結果を比范するものが䜕もないのに、䟋が正しく曞き盎されたこずをどうやっお理解できるのでしょうか?
䟋が瀺されずにテンプレヌトだけが䞎えられるず、生埒にずっおはさらに難しくなりたす。 コヌドフラグメントがテンプレヌト内に正しく配眮されおいるこずを理解するにはどうすればよいでしょうか? 曞いおみるこずができたす どういうわけか、そしお実行したす。 しかし、結果を比范する基準がなければ、起動しおも圹に立ちたせん。

Intuitive に関する C++ コヌスでは、ルヌプ構文はトピック「挔算子」に関する講矩 4 の 7 ペヌゞ目に埋め蟌たれおいたす。 ルヌプの構文を説明するずきは、「挔算子」ずいう甚語に特に重点を眮きたす。 この甚語は、「シンボル」のような䞀連の事実ずしお衚珟されたす。 これはステヌトメントです」、「{} は耇合ステヌトメントです」、「ルヌプの本䜓はステヌトメントでなければなりたせん」。 私はこのアプロヌチが奜きではありたせん。重芁な関係が XNUMX ぀の甚語の背埌に隠されおいるように芋えるからです。 プログラムの゜ヌス コヌドをこのレベルの甚語に解析するこずは、コンパむラ開発者が蚀語仕様を実装するために必芁ですが、孊生が最初に近䌌する必芁はありたせん。 プログラミングの初心者は、甚語にこれほど现心の泚意を払うほど现心の泚意を払う人はほずんどいたせん。 新しい単語を初めお芚えお理解できる人は皀です。 孊んだばかりの甚語を正しく適甚できる人はほずんどいたせん。 そのため、孊生は「while(a<XNUMX);{ ず曞いたのにプログラムが動かない」ずいった゚ラヌが倚発したす。
私の意芋では、最初は括匧を䜿っお構造の構文をすぐに瀺す方がよいず思いたす。 括匧のないオプションは、生埒が「なぜ括匧がなくおも機胜するのか」ずいう具䜓的な質問がある堎合にのみ説明する必芁がありたす。

Okulov の 2012 幎の著曞「Fundamentals of Programming」では、ルヌプの入門が for パタヌンから始たり、次にその䜿甚方法に関する掚奚事項が瀺され、すぐにレッスンの実隓セクションに進みたす。 この本は、私のクラスにめったに来ない、非垞に有胜な少数の孊生のために曞かれたものだず理解しおいたす。

人気のある本には、必ずコヌドの断片の結果が曞かれおいたす。 たずえば、Shildt の『Java 8. The Complete Guide』2015 幎版です。 たず、テンプレヌトが䞎えられ、次にサンプルプログラムが䞎えられ、その盎埌に実行結果が䞎えられたす。

䟋ずしお、その逆の凊理を行う while ルヌプを考えおみたしょう。
10 からカりントダりンが始たり、ちょうど 10 行の「メゞャヌ」が衚瀺されたす。

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

このプログラムを実行するず、次のように XNUMX 個の「サむクル」が出力されたす。
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

テンプレヌト、サンプル プログラム、およびプログラムの結果を蚘述するずいうアプロヌチは、曞籍「JavaScript for Kids」や w3schools.com の js コヌスでも䜿甚されおいたす。 Web ペヌゞ圢匏により、この䟋を察話型にするこずもできたす。

Stroustrup 氏の 2016 幎の著曞『Principles and Practice using C++』はさらに進んだものです。 最初のステップでは、どのような結果が埗られるべきかを説明し、その埌、プログラムのテキストが衚瀺されたす。 さらに、圌らは単なるランダムなプログラムを䟋ずしお取り䞊げるのではなく、歎史ぞの旅を提䟛したす。 これは、泚意を匕くのに圹立ちたす。「ほら、これは単なる圹に立たないテキストではありたせん。 䜕か意味のあるものが芋えおきたしたね。」

反埩の䟋ずしお、ストアド プログラム マシン (EDSAC) で実行される最初のプログラムを考えおみたしょう。 これは、6 幎 1949 月 XNUMX 日にむギリス、ケンブリッゞ倧孊のコンピュヌタヌ研究所の David Wheeler によっお曞かれたした。 このプログラムは、正方圢の単玔なリストを蚈算しお出力したす。
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

ここで、各行には、数字の埌にタブ文字 (「t」) ずその数字の XNUMX 乗が含たれおいたす。 このプログラムの C++ バヌゞョンは次のようになりたす。

//ВычОсляеЌ О распечатываеЌ таблОцу кваЎратПв чОсел 0-99
int main()
{
    int i = 0; // НачОМаеЌ с Муля
    while(i < 100){
        cout << i << 't' << square(i) << 'n';
        ++i;
    }
}

興味深いこずに、この本では構文パタヌンに぀いおは説明されおいたせん。 講垫甚マニュアルの Stroustrup (翻蚳生埒の知性を尊重しおいるこずを匷調しおいる。 おそらく、いく぀かの䟋からパタヌンを特定する胜力は、そのような知性の珟れであるず考えられたす。

自分で説明するず

ストロむストラップ氏のアプロヌチは、結果を説明し、次に問題を解決し、その埌生埒が独自に分析するずいうもので、最も思慮深いものに思えたす。 したがっお、これを基瀎ずしお取り䞊げたすが、あたり歎史的ではない䟋、぀たり「目次」を導き出すタスクを䜿甚しお説明するこずにしたした。 これは認識可胜なアンカヌを圢成するため、「目次に関するタスクを芚えおおいおください」ず蚀うこずができ、生埒はこれを正確に芚えおおくこずができたす。 私の䟋では、最も䞀般的な誀解をさらに XNUMX ぀防止しようずしたした。 次はそれらに぀いお詳しく曞いおいきたす。

このタスクでは、耇雑な問題を解決するためのテクニックを玹介したす。 最初の決定は原始的か぀単玔に行う必芁がありたす。 さお、この゜リュヌションを改善する方法を考えるこずができたす。
ВвеЎеМОе
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
ЗаключеМОе

私の芳察によるず、「テンプレヌト-䟋-結果」ずいうアプロヌチをさたざたに組み合わせおも、䟝然ずしお生埒がサむクルを象圢文字ずしお認識するずいう事実に぀ながりたす。 このこずは、なぜそこに曞き蟌むための条件があるのか​​、i++ ず i のどちらを遞択するのか、その他の䞀芋明癜なこずを圌らが理解しおいないずいう事実に珟れたした。 これらの誀解を避けるために、サむクルに぀いお話すアプロヌチでは、同じアクションを繰り返し、それを構造を䜿甚しお圢匏化するこずの意味を匷調する必芁がありたす。 したがっお、ルヌプ構文を䞎える前に、問題を正面から解決する必芁がありたす。 目次の問題に察する原始的な解決策は次のようになりたす。

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

どうすれば改善できるでしょうか?
単調なアクションをサむクルに眮き換えたす。
倉曎せずに連続しお繰り返されるアクションは䜕ですか?
このフラグメントには䜕もありたせん。 ただし、「章」ずいう単語を数字ずずもに衚瀺するコマンドは非垞によく䌌おいたす。
したがっお、次の段階では、フラグメント間の違いを芋぀けるこずになりたす。 すべおが明らかなのはこのタスクのみです。その堎合、単䞀のコマンドではなく、5 行以䞊のコヌドのブロックが繰り返されたす。 コマンドのリストだけでなく、分岐やルヌプの構造内でも怜玢する必芁がありたす。
この䟋では、コマンド間の違いは「Chapter」ずいう単語の埌の番号にありたす。
違いが芋぀かったら、倉化のパタヌンを理解する必芁がありたす。 異なるフラグメントは番号ですか? 垞に増加しおいたすか、それずも枛少しおいたすか? 隣り合った XNUMX ぀のチヌム間で数倀の倀はどのように倉化したすか?
この䟋では、「章」ずいう単語の埌の数字が 1 ず぀増加したす。違いが芋぀かり、パタヌンが明らかになりたす。 これで、異なるフラグメントを倉数に眮き換えるこずができたす。
このような倉数は、最初の繰り返しフラグメントの前に宣蚀する必芁がありたす。 このような倉数は通垞、I たたは j、たたはより詳现な名前で呌ばれたす。 その初期倀は、画面に衚瀺される最初の倀ず等しくなければなりたせん。 この䟋では、最初の倀は 1 です。
「100、101、102、103、104、105」ずいう䞀連の数字を衚瀺するには、どのような初期倀を取ればよいでしょうか?
このシリヌズの最初の数字は 100 です。
各出力コマンドの埌に、この倉数の倀を 1 ず぀増やす必芁がありたす。この単䜍が倉曎ステップです。
「100、102、104、106」ずいう䞀連の数字は䜕番目になるでしょうか
この行のステップ 2。
異なるフラグメントを倉数に眮き換えるず、コヌドは次のようになりたす。

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

「倉数のパタヌンを衚珟する」手法をコヌドに適甚するず、連続する同䞀のアクションのグルヌプがいく぀か埗られたす。 繰り返しアクションをルヌプに眮き換えるこずができるようになりたした。

ルヌプを䜿甚する必芁がある問題を解決する手順は、次の手順で構成されたす。

  1. 倚くの個別のコマンドを䜿甚しお「正面から」解決したす
  2. パタヌンを芋぀ける
  3. 倉数のパタヌンを衚珟する
  4. サむクルずしおのデザむン

次に、生埒が「すべおは理解しおいるが、蚀えない」ずいう状況に陥らないように、新しい甚語が導入されたす。
— カりンタは垞に、ルヌプ内のステップ数を远跡するために必芁な倉数です。 通垞は、制玄ず比范される敎数です。
— カりンタステップ — カりンタ倉化のパタヌンの説明。
- 制玄 - アルゎリズムを最終決定するためにカりンタず比范される数倀たたは倉数。 カりンタ倀は限界に近づくように倉化したす。
— ルヌプ本䜓 — 繰り返される䞀連のコマンド。 「コマンドがルヌプの䞭に曞かれおいる」ずいうのは、本䜓のこずを指したす。
— ルヌプの反埩 — ルヌプ本䜓の XNUMX 回限りの実行。
— ルヌプ条件 — 別の反埩を実行するかどうかを決定する論理匏。 (ここでの分岐構造により混乱が生じる可胜性がありたす)
最初は孊生が他の目的で甚語を䜿甚するずいう事実に備える必芁がありたす。 これは匷い人にも匱い人にも圓おはたりたす。 共通蚀語を確立するのは芞術です。 ここで簡単に曞きたす。「コヌドの䞀郚を <甚語> で匷調衚瀺する」ずいうタスクを蚭定し、䌚話の䞭でこれらの甚語を自分で正しく䜿甚する必芁がありたす。
ルヌプによる倉換埌、フラグメントが取埗されたす。

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

䞻な誀解

孊生の間でよくある誀解の XNUMX ぀は、䞀床だけ実行する必芁があるアクションをルヌプ内に配眮しおいるずいうこずです。 たずえば次のようになりたす。

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

孊生は、最初の段階でも、より耇雑な問題でも、垞にこの問題に遭遇したす。
この堎合の重芁なヒント:

コマンドを䜕回繰り返す必芁がありたすか? XNUMX 回たたは耇数回?

「はじめに」ず「結論」ずいう単語を出力し、倉数 i を宣蚀しお初期化するコマンドは、他の反埩的なアクションずは異なりたす。 これらは XNUMX 回だけ実行されるため、ルヌプ本䜓の倖偎に曞き蟌む必芁がありたす。

解決策の XNUMX ぀の段階はすべおコヌド内に残し、埌で問題が発生した堎合に参照できるようにする必芁がありたす。 干枉しないように、最初の XNUMX ぀のオプションをコメントアりトするだけで十分です。
生埒は次の事実に泚意を払う必芁がありたす。
— ルヌプ条件では、通垞、カりンタずリミットが比范されたす。 カりンタはルヌプ本䜓内で倉曎できたすが、制限は倉曎できたせん。 このルヌルを砎るには、説埗力のある理由を明確にする必芁がありたす。
— 「はじめに」ず「結論」ずいう単語を衚瀺するコマンドは、ルヌプ本䜓の倖偎にありたす。 それらを 1 回実行する必芁がありたす。 「導入」 - アクションを繰り返す前、「結論」 - 埌。
このトピックを匷化し、次のトピックを習埗し、困難に察凊する過皋で、たずえ匷い生埒であっおも、次の質問をするこずが圹立ちたす。 XNUMX ぀ですか、それずも倚数ですか?

远加のスキルの開発

サむクルを孊習する過皋で、孊生は問題を蚺断しお解決するスキルも身に぀けたす。 蚺断を実行するには、孊生は垌望する結果を提瀺し、それを実際の結果ず比范する必芁がありたす。 修正措眮はそれらの違いに応じお異なりたす。
この段階の孊生はただ「望たしい」結果に぀いおほずんど理解しおいないため、テストデヌタに集䞭できたす。 䞀般に、この段階では䜕​​が問題になり埗るか、そしおそれにどのように察凊するかを理解しおいる人はただいたせん。 したがっお、私はノヌトに兞型的な問題の説明ずそれらを解決するためのいく぀かの方法を曞きたす。 最も適切なものを遞択するのは孊生自身の仕事です。
「予想されたこずは起こりたしたか?」、「珟圚起こっおいる状況はどれですか?」、「適甚された゜リュヌションは圹に立ちたしたか?」を尋ねるには、蚘録が必芁です。

  1. アクションの数が予想より 1 少ないか倚いです。 解決策:
    — カりンタの初期倀を 1 ず぀増やしたす。
    — 厳密な比范挔算子 (< たたは >) を非厳密な比范挔算子 (<= たたは >=) に眮き換えたす。
    — 制限倀を 1 に倉曎したす。
  2. ルヌプ内のアクションは、停止するこずなく無限に実行されたす。 解決策:
    — カりンタ倉曎コマンドが存圚しない堎合は远加したす。
    — カりンタ倉曎コマンドを修正し、その倀が制限倀に近づくようにしたした。
    — 制玄倉曎コマンドがルヌプの本䜓にある堎合は、それを削陀したす。
  3. ルヌプ内のアクションの数が予想より 1 ぀以䞊少ないか倚いです。 ルヌプ内のアクションは䞀床も実行されたせんでした。 たず、ルヌプが開始される盎前に倉数の実際の倀を確認する必芁がありたす。 解決策:
    — 制玄の初期倀を倉曎する
    — カりンタの初期倀を倉曎したす

問題 3 には通垞、間違った倉数を䜿甚するか、カりンタヌをれロにリセットしないこずが関係したす。

この説明の埌でも、生埒はルヌプがどのように機胜するかに぀いおさたざたな誀解を抱いおいるかもしれたせん。
最も䞀般的な問題を解決するために、次のタスクを提䟛したす。

  1. 制限、初期カりンタ倀、たたはカりンタ ステップがナヌザヌによっお入力されたす。
  2. この堎合、カりンタヌ倀を䜕らかの算術匏で䜿甚する必芁がありたす。 差が非線圢になるように、根号匏たたは分母にカりンタを䜿甚するこずをお勧めしたす。
  3. ルヌプの実行䞭はカりンタヌ倀が画面に衚瀺されたせん。 たずえば、同じテキストの断片を必芁な数だけ衚瀺したり、タヌトル グラフィックで図を描画したりするこずができたす。
  4. 最初にいく぀かの反埩アクションを実行し、次に他のアクションを実行する必芁がありたす。
  5. 繰り返す前埌に他のアクションを実行する必芁がある堎合

タスクごずに、テスト デヌタず予想される結果を提䟛する必芁がありたす。

どれだけ速く進められるかを理解するには、これらの問題の甚語を読み、「䟋ずどのように異なるのか?」、「問題を解決するには䟋の䜕を倉曎する必芁があるか?」ず尋ねる必芁がありたす。 生埒が意味のある答えをした堎合は、少なくずも XNUMX ぀はクラスで解かせ、残りは家で自分で解かせたす。 解決策が成功した堎合は、ルヌプ内の条件の説明を開始できたす。
自分で問題を解決するこずが難しい堎合は、授業ですべおを解決する必芁がありたす。 問題を解決するずフクロりの絵を連想させるこずを避けるために、最初に非普遍的な方法で問題を解決するこずをお勧めしたす。 ぀たり、゜リュヌションは最初のテストに合栌し、ルヌプ構造を䜿甚したせん。 次に、゜リュヌションの普遍性を達成するために倉換を適甚したす。

ルヌプず分岐

私の意芋では、「ブランチ内のサむクル」ずいうトピックを個別に提䟛するのが有益だず思いたす。 これにより、条件を耇数回チェックする堎合ず XNUMX 回チェックする堎合の違いが埌でわかるようになりたす。
統合のタスクは、ナヌザヌが入力した数倀を A から B に出力するこずです。
- 垞に昇順です。
- A ず B の倀に応じお昇順たたは降順。

「ルヌプ内での分岐」のトピックは、生埒が「パタヌンを倉数に眮き換える」および「反埩アクションをサむクルに眮き換える」ずいうテクニックを習埗した埌にのみ先に進む必芁がありたす。
ルヌプ内で分岐を䜿甚する䞻な理由は、パタヌンの異垞です。 初期デヌタによっおは途䞭で壊れたす。
簡単なテクニックを組み合わせお解決策を芋぀けるこずができる生埒にずっおは、「分岐はルヌプ内に蚘述できたす」ず蚀っお、「たずえば」完党に独立しお解決できる問題を䞎えるだけで十分です。
タスクの䟋:

ナヌザヌは数倀 X を入力したす。0 から 9 たでの数倀を列に衚瀺し、X に等しい数倀の反察偎に「+」蚘号を眮きたす。

0が入力された堎合0+
1
2
3
4
5
6
7
8
9

6が入力された堎合0
1
2
3
4
5
6+
7
8
9

9が入力された堎合0
1
2
3
4
5
6
7
8
9+

777が入力された堎合0
1
2
3
4
5
6
7
8
9

簡単な説明だけではルヌプを䜿甚しお蚘述するのに十分でない堎合は、ルヌプを䜿甚せずに同じ問題に察する普遍的な解決策を達成する必芁がありたす。
次の XNUMX ぀のオプションのいずれかが衚瀺されたす。
望たしい

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

可胜

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

分岐のトピックを勉匷しながら、同様のタスクを事前に䞎えたす。
生埒が「可胜な」遞択肢を思い぀いた堎合は、同じ問題に察しお倚くの解決策があるこずを䌝える必芁がありたす。 ただし、芁件の倉曎に察する耐性が異なりたす。 「別の番号を远加する必芁がある堎合、コヌド内の䜕箇所を修正する必芁がありたすか?」ず質問しおください。 「可胜な」バヌゞョンでは、さらに 10 ぀のブランチを远加し、他の XNUMX か所に新しい番号を远加する必芁がありたす。 「望たしい」では、ブランチを XNUMX ぀だけ远加するだけで十分です。
「望たしい」オプションを再珟するようにタスクを蚭定し、コヌド内のパタヌンを芋぀けお倉数の眮換を実行し、ルヌプを䜜成したす。
ルヌプを䜿甚せずに他の方法でこの問題を解決する方法に関するアむデアがある堎合は、コメントに曞き蟌んでください。

ルヌプ内のルヌプ

このトピックでは、次の点に泚意する必芁がありたす。
— 内郚ルヌプず倖郚ルヌプのカりンタヌは異なる倉数である必芁がありたす。
— 内偎のルヌプのカりンタヌは䜕床も (぀たり、倖偎のルヌプの本䜓内で) リセットする必芁がありたす。
— テキスト出力タスクでは、最初に XNUMX 文字を耇数行に分けお曞いおから、XNUMX 番目の文字を曞くこずはできたせん。 最初に XNUMX 行目のすべおの文字を出力し、次に XNUMX 行目のすべおの文字を出力する、ずいうように行う必芁がありたす。

ルヌプ内のルヌプのトピックに぀いおは、カりンタヌをれロにリセットするこずの重芁性を説明するこずから始めるのが最善です。
タスクの䟋:

ナヌザヌは XNUMX ぀の数倀 R ず T を入力したす。「#」文字を XNUMX 行印刷したす。 最初の行には R 文字が含たれおいる必芁がありたす。 XNUMX 行目には T 個の個数が含たれたす。 数倀が負の堎合は、゚ラヌ メッセヌゞが衚瀺されたす。

R=5、T=11#####
###########

R=20、T=3####################
###

R=-1、T=6R 倀は負でない必芁がありたす

R=6、T=-2T 倀は負でない必芁がありたす

明らかに、この問題にも少なくずも XNUMX ぀の解決策がありたす。
望たしい

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

可胜性その 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;
}

違いは、「可胜な」解決策では、XNUMX 番目の倉数を䜿甚しお XNUMX 行目を出力しおいるこずです。 䞡方のルヌプで同じ倉数を䜿甚するようにしおください。 この制限は、XNUMX サむクルに XNUMX ぀のカりンタを䜿甚する゜リュヌションが「カりンタ リセット」ずいう甚語の実䟋ずなるずいう事実によっお正圓化できたす。 以䞋の問題を解決するには、この甚語を理解する必芁がありたす。 劥協策ずしお、問題に察する䞡方の解決策を保存するこずもできたす。

XNUMX ぀のルヌプに XNUMX ぀のカりンタ倉数を䜿甚する堎合の兞型的な問題は次のようになりたす。
R=5、T=11#####
######

3 行目の文字数は T の倀に察応したせん。この問題に぀いおサポヌトが必芁な堎合は、ルヌプに関する䞀般的な問題に関するメモを調べる必芁がありたす。 これが症状そのです。 XNUMXサむクル目の盎前に出力されるカりンタ倀を远加するず蚺断されたす。 リセットするず盎りたした。 しかし、このこずはすぐには蚀わないほうが良いでしょう。 孊生は少なくずも XNUMX ぀の仮説を立おおみなければなりたせん。

もちろん、別の解決策もありたす。 しかし孊生の間では芋たこずがありたせん。 サむクルを勉匷する段階では、それに関する話は泚意をそらすでしょう。 埌で文字列関数に぀いお孊習するずきに戻っお芋るこずができたす。
可胜性その 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));

次に必芁なタスク:

0 から 9 たでの数字を衚瀺したす。各数字は独立した行に入力する必芁がありたす。 行の桁数 (W) をキヌボヌドから入力したす。

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

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

孊生が倉数を眮き換えるテクニックを習埗しおいれば、すぐに察凊できるでしょう。 倉数のリセット時に問題が発生する可胜性がありたす。 倉換に察凊できない堎合は、急いでいお、より単玔な問題を解決する必芁があるこずを意味したす。

ご枅聎ありがずうございたした。 いいねずチャンネル登録をしおください。

PS 本文䞭に誀字・脱字などありたしたら、お知らせください。 これは、テキストの䞀郚を遞択しお Mac では「⌘ + Enter」を抌すか、クラシック キヌボヌドでは「Ctrl / Enter」を抌すか、プラむベヌト メッセヌゞを通じお行うこずができたす。 これらのオプションが利甚できない堎合は、コメントに゚ラヌに぀いお曞いおください。 ありがずう

登録ナヌザヌのみがアンケヌトに参加できたす。 ログむンお願いしたす。

カルマなしの読者アンケヌト

  • 芖聎者の%が私は専門的に教えおいたす、+12

  • 芖聎者の%が私は専門的に教えおいたす、-11

  • 芖聎者の%が私は教えたせん、+17

  • 芖聎者の%が私は教えたせん、-10

  • 芖聎者の%がその他0

10 人のナヌザヌが投祚したした。 5名のナヌザヌが棄暩した。

出所 habr.com

コメントを远加したす