1つのプログラミングレッスン

先日、私はハリコフのリセウムの一つの10年生の学生のためにプログラミングの実践的なレッスンを行う機会がありました。 6年前、私はポリテクニックでプログラミングコースを教えましたが、この科学の学生を始めるために、講義と実験室の授業のために2学期を過ごしました。 そして、ここでは、わずか1時間半の力で、私はまだそのような若い部下と仕事をしていません。 「わかりました 」と私は自分に言いました。 そして彼は準備を始めました。 私は学童で解決できるいくつかのタスクを与えられました。 それらの最初のものは、最大70行のヒンドゥー教コードを占めていました。 10行のソリューションを準備しました。 「最初に1つの解決策を示し、次に別の解決策を示しますと考えました。 プログラミング機能から主題領域に重点を移すために、別のタスクを書き直しました(タスクは幾何学的でした)。 3番目のタスクは最も簡単でした。1人はキーボードから数字を入力し、もう1人は推測します。 面白くない。 コンピュータに推測させてヒントを与えてください。 各タスクについて、資料の一連のプレゼンテーションを思いつきました。 時間が来て、生徒たちがコンピューターの前に座ったとき、私は彼らに尋ねました。 「プログラミングの経験はありますか? プログラミング言語をすでに勉強しましたか?」 否定的な答えを受け取ったので、精神的に「悲しい」と言い、コード3枚のプリントアウトで2枚のシートを脇に置き、「さあ、それではプログラミングを始めましょう!」



コーダーにとって、この記事はおそらく興味のないものです。 私の話は、たった1つのレッスンの例で、子供の精神が脆弱な人に限られた時間で方法を教えることです。 みんなを猫に招待します!



プログラミングについての入門的な言葉は、このようなものから始まりました。 「コンピューターは現在、人間の生活のほぼすべての分野で使用されています。 したがって、どちらを選択するか、誰が勉強を始めるかは問題ではありません。プログラムを作成できることは十分に重要です。 この科学の助けを借りれば、大きな利益を得ることができます" 次に、「巡回セールスマン問題」の例を挙げて、次のように定式化しました。 「あなたがNew Mailで作業していると想像してください。 多くの荷物をさまざまな都市に配送する必要があります。 可能な限り短いパスを選択するとよいでしょう。 これはお金を節約します-宅配便業者はより少ない時間で働き、より少ないガソリンを使います 。 そして、小さな移行: 「しかし、残念ながら、コンピューター自体はそのような問題を解決できません。 彼は算術演算と論理演算しか実行できません」 (他にもありますが、今はそれについては説明しません)。 「そして、彼はゼロと1の形の数字でそれをします」 (2進数システムについて話すのに時間を無駄にしないでしょう-学校のカリキュラムにあることを望みます)。 「コンピューターコマンド(機械命令)も数字の形式で与えられます。 しかし、通常プログラマーは、C、Java、C ++など、人間が理解できる言語でプログラムを作成します 。 「si-plus-plus」を聞いて、子どもたちは生き返った。 「プログラムコードをコンピューターコマンドに変換するコンパイラーなど、いくつかのタイプのプログラムがあります。 彼ともっと便利に仕事をするために、別のプログラムを使用します-開発環境には、テキストエディタと他の多くの便利なツールも含まれています。 デスクトップでCode :: Blocksプログラムのショートカットを見つけて実行します。



次に、新しいプロジェクトを作成する方法を説明し、行ごとに詳細にプログラムのファイルの内容を説明しました。 行番号付けは本当に役に立ちました。 しかし、用語の解釈は非常に自由であることが判明しました。



画像



「だから、プログラムコードには英語の単語があることがわかります。 これに 、およびの使用 、およびmainreturnが含まれます。 最初の行には、つまり 特定のライブラリを使用します。 通常、プログラマは他のプログラマが作成したコードを使用します。 あらゆる種類のライブラリに含まれています。 この場合、 iostreamライブラリを使用します。 ここで、iは入力、oは出力、streamはストリームです。 つまり ライブラリには、キーボード入力および画面への出力用のコードが含まれています '' (入力/出力ストリームのリダイレクトに関する情報で学生を過負荷にしないでください)。 「ライブラリが多数ある場合、それらの間で競合が発生する可能性があるため、通常、コードは異なるスペースに配置されます。 名前空間(名前空間)std-標準(標準)からの略語を選択するには、名前空間stdを使用する必要があります。 intは、整数とその格納と伝送について話していると言います」 (つまり、変数の宣言と関数によって返される値を念頭に置いていました。明示的な型変換については話しませんでした) mainは関数の名前です。 関数は、何らかの値を返す論理的に完成したコードの一種です。 cout ... c-コンソール(コンソール-キーボードと画面)、 out-出力、 endl-行末、行末。 7行目は、二重引用符で囲まれたテキストを画面に表示します。 この場合0返すと、オペレーティングシステムにプログラムを正常に完了するように伝えます。



その後、F9キーを押してプログラムをコンパイルすることを提案しました( 「プログラムテキストを機械語命令に変換する」 )。 「おめでとうございます! あなたは最初のプログラムを書きました!」私はテキスト付きのコンソールがモニターに現れるのを見たときに言った。 次に、彼は次のように述べました。 それでは、コードを変更しましょう。 テキストHello world!を二重引用符で囲みます。 他の人に英語でもう一度F9を押します。 今度は別のものです!」 実行中のプログラムのウィンドウを誰かが閉じなかったため、コンパイルが失敗しました。 私は助けなければなりませんでした。 「今、ロシア語でテキストを他のものに置き換えます。 「驚いた」 「ハロー」を書いた人は次のように見た:



画像



「問題は、テキストもゼロと1に変換されることです。 そして、この変換がどの程度正確に行われるかは、エンコーディングによって異なります。 誰もこの概念に出くわしましたか?「応答-不確実なムー... 」キリル文字のエンコーディングを設定しましょう。 対応するロケールを設定(設定)します。 これを行うには、7行目をドロップダウンします(カーソルを行の先頭に置いてEnterを押します)。 空の7行目にsetlocale(LC_ALL、 "rus")を入力します。 2行目に#include <locale> "と入力します 。 誰かがLC_ALLを小文字で書きました(小文字と大文字が異なることを説明しなければなりませんでした)、誰かがLCALLボードから書きました(はい、ボードはひどい状態です)、誰かが「russ」を書き、適切な結果を得ませんでした。 しかし、ほとんどの場合、私は前向きな結果を見ました。 ある女の子が書いたテキスト「私は食べたい」に少し悲しみました。 この状態では、情報の認識はかなり苦しみます。



学生のために問題の条件を定式化する時が来ました。 「プログラムを書きましょう。 コンピューターに0〜99の数字を推測させてくださいプロンプトでこの数字を推測します。 はい、これは3番目の課題です。



「rand関数は乱数を生成するために使用されます。単語randomの略語はランダムです。 それを使用するには、 cstdlibライブラリを接続する必要があります。 0から99までの数を生成するには、関数が返す結果を100で割った余りを取得する必要があります。除算の余りを取得する操作は、パーセント記号で記述されます。 ここで、私は学生に部門の残りが何であるかを思い出させなければなりませんでした。 彼は「5%2」の例を挙げましたが、私が考えていたことが明らかになりました。 「除算の残り(つまり、0から99までの乱数)を取得する操作の結果は、どこかに書き込む必要があります。 この数は整数です。 2.584や35.763などの実数を推測しようとした場合、奇妙なことになります。 変数を使用して結果を保存します。 変数とは、コンピューターのメモリの領域であり(メモリの場所は関係ありません)、名前でアクセスできます 。 はい、さまざまなタイプの変数を使用して特定の操作セットを実行できますが、今は重要ではありません。 「変数uに名前を付けましょう(unknownという単語から)。 整数変数を宣言するには、単語intを使用します。 これらのコンピューターのこのようなメモリ領域は4バイトを使用し、約マイナス20からプラス20億の数値を収容できます。 肯定的な答えを受け取った後、彼はボードにミッシングコードを書きました。 次のことが判明しました(出力の修正に加えて、画面上にはテキストではなく変数値が表示されます)。



画像



プログラムを開始すると、生徒たちは1対1で41番を見ました。42ではなく、それもまたそうです。 また、結果は発売ごとに変わりませんでした。 「だから、乱数を得た。 実際、コンピューターが41を生産すると誰が考えたでしょうか? 41という数値は、設定した条件を満たしています。 0から99の範囲にあります。しかし、本当にランダムにする方法は? これを行うには、現在の時刻など、いわゆる乱数ジェネレーターグレインを設定する必要があります。 10行目の前に行srand(time(0))を追加します。 プログラムがコンパイルされない場合は、 ctimeライブラリを追加します»



今、プログラムは本当にランダムな(まあ、実際にはランダムではないが、このタスクには関係ない)数値を生成しました。 現時点でのプログラムのソースコードは次のとおりです。



画像



それを推測する責任があるコードを書くことは残っています。



「0から99までの数字を初めて推測することはできないと思います。」生徒たちは笑った。 「同じアクションを数回行うと、これをサイクルの形にまとめることができます。」サイクルの実装方法を言葉で伝えるのは難しいため、最初にボード上の対応する行を書き留めました。



画像



「13行目では、変数uに似た変数i(入力から)を宣言しました。 その中に入力された番号を保存します。 実際には、入力は16行目で実行されます。 ループはdoキーワードで宣言されます 中括弧で囲まれたものはすべて、変数iの( while )値がuと等しくなくなるまで繰り返されます。 このコードに関して、学生の典型的な間違いは次のとおりです。 最初に、中括弧の代わりに丸括弧を配置します。 第二に、比較演算「!=」は個別に記述されました。 プログラムをコンパイルした後、子供たちは数uを推測しようとしました。 以前に「食べたい」と書いた少女がとてもうまくやってくれたことに驚いた。 実行時エラーのうち、私は次のことを見てうれしかったです。



画像



これにより、プログラムは入力データの正確性をチェックしないことを説明でき、数字のみが予想される場合に文字を入力することは最善のアイデアではありません。



私たちはフィニッシュラインに来ました。 ヒントを追加します。 ボードに2つの「if」を書いて説明しました。 「入力された数値が推測された数値よりも大きい場合、対応するメッセージを表示します(17行目)。 入力した数が予測数よりも少ない場合は、同じ処理を行います(18行目)。さらに、「ゲーム」の完了に関するメッセージの出力を拡張しました。



画像



これがプログラムの最終テキストで、10-inクラスのプログラミングの最初のレッスンで入力しました。 プログラムは完璧にはほど遠い。 特に、「あなたの数は多い!」と「あなたの数は少ない!」というメッセージが好きではありません。 彼らは本当に混乱しています。 同様のレッスンを実施する機会が2回あった場合、それを別の方法で作成していました。



このレッスンでは、隠れた数字をすばやく検索する(バイナリ検索)アルゴリズムを生徒に見せたかったのですが、彼ら自身が直感的にこの決定に至ったことがわかりました。



画像



まとめます。



1.レッスンは成功しました。 すべての生徒が課題を完了しました。 問題は解決しました。 1つだけですが、解決しました。 もちろん、困難がないわけではありません。



2.私は新しい教育経験を得ました。 過去2年間、私は5年生のみに講義と実験室での作業を行ってきましたが、彼らと一緒に働くことはまったく別の問題です。 彼らはすでに何らかの種類の基盤を持ち、勉強する態度(そして人生全般)が異なり、私の科目は高度に専門化されています-私が今後提供する資料は、各グループの卒業生に2〜3の力で役立つでしょう。 ここで、この特定のレッスンが1人または2人の学生のプログラミングに関心をもたらすことを期待しています。



3.学校のカリキュラムは、私が学んだものとはまったく異なります。 はい、私は単純な学校には行きませんでした。 7年生では、Logo、8年生-BASIC、9年生-Pascalを学びました。 しかし、それにもかかわらず、他の科目の知識で輝いていない(そして私も輝かなかった)私のクラスメートのものでさえ、コンピューターサイエンスが好きでした。 学校でプログラミングをすることは必須です。 それは脳を完全に発達させ、コンピューターを理解することを可能にします。



4. C ++のエントリしきい値は高くなっています。 このプログラミング言語の基本を明らかにする1つのレッスンでは、明らかに十分ではありません。 はい、C ++は知りません。 私はCが大好きで、OOPが必要なときはJavaで書きます。 しかし、ほとんどの場合、大学でC ++を勉強する必要があります(私の謙虚な意見ではCは必須です)。 繰り返しますが、多くは大学と専門分野に依存します。



最後まで読んでくださった皆さん、ありがとうございました! ご質問にお答えできることを嬉しく思います。



PS学校でコンピューターサイエンスに関する別の記事を書くというアイデアがあります。 あなたがコメントで支持するなら、おそらく私は約束しません(私は約束しません)記事は日の目を見るでしょう。



All Articles