基本的なプログラミング/アルゴリズムの概念 [終了]
-
03-07-2019 - |
質問
私は高校で (仲間のプログラマーたちと) プログラミングとアルゴリズムのクラブを立ち上げようとしています。選択する言語は C++ です。申し訳ありませんが、これを変更することはできません。学生は前述のトピックについてほとんど、またはまったく経験がないと考えられます。
私が注目すべき最も基本的な概念は何だと思いますか?
私にとってすでに明らかなことを教えるのは簡単な仕事ではないことはわかっています。最初のミーティングでは、生徒を怖がらせないように細心の注意を払う必要があると認識していますので、質問させていただきます。
編集: おそらくプログラマーと初心者の主な違いは「プログラマーの考え方」、つまり、問題をアルゴリズムとして概念化することであることに気づきました。単なる練習問題であることはわかっていますが、この分野の発達を刺激する可能性のある練習/概念/物事のようなものを知っていますか?
解決
プログラミングを楽しく!
話し合う可能性のあるものは、あなたのクラブが自分で開催できるか、地元で参加できるプログラミング競技会でしょう。私は大学(ACM)レベルでプログラミング競技に参加していますが、実際には低レベルでも開催されていることを知っています。
この種のイベントは、競争心を引き出し、クラブのメンバーをより近づけます。
物事は常にプログラミングに関するものである必要はありません。おそらく、ゲームをプレイしたり、プログラミングについて話し合ったりするLANパーティーを開催することもお勧めします。
プログラミング/アルゴリズムに関連する実際のトピックについては、このプログラミング競技入門でこれらのプログラミング問題のいくつかを試みるグループとしてお勧めします" プログラミングの課題 &quot ;: Amazonリンク
これらは、かなり基本的なプログラミングの問題から始まり、次のようなさまざまなデータ構造を必要とする問題に徐々に進行します。
- スタック
- キュー
- 辞書
- 木
- 等
ほとんどの問題はC ++で提供されています。
最終的には、グラフトラバーサルおよび一般的なグラフアルゴリズム( Dijkstraのを含む、より高度な問題に進みます。など)、組み合わせの問題など。各問題は楽しく、小さな「ストーリー」で示されます。フォーマットのような。ただし、これらのいくつかは非常に難しいので注意してください!
編集: ピザとソーダは、クラブのミーティングに人々を出してもらうことに関しても決して痛いことはありません。 ACMクラブでは、毎月1回、ピザを開催しています。私たちのほとんどはまだ現れますが、それは素晴らしい砕氷船です。特に新しいクラブや会員の場合。
他のヒント
破壊する
私にとってプログラミングのユニークな点は、タスクをコンピューターに十分な小さなステップに分解する必要があることです。これは言語によって異なりますが、「forループ」を記述する必要がある場合があります。 100に数えるには慣れるだけです。
"トップダウン"アプローチはこの概念に役立つかもしれません。
filterItemsByCriteria();
のようなプログラムのマスター関数を作成することから始めます
それがどのように機能するのかわからないので、次のステップに分けます:
(注:私はC ++を知らないので、これは単なる一般的な例です)
filterItemsByCritera() { makeCriteriaList(); lookAtItems(); removeNonMatchingItems(); }
次に、それぞれをさらに分解します。すぐに、基準リストなどを作成するために必要なすべての小さなステップを定義できます。小さな機能がすべて機能すると、大きな機能が機能します。
これは、子供たちが「なぜ?」あなたが言うすべての後、「方法」を尋ね続ける必要がある場合を除きます
リンクリスト-古典的なインタビューの質問、そして正当な理由。
私はオブジェクト指向のものから始めようとするのではなく、Cサブセットで作業しようとします。基本のいくつかを理解した後に導入できます。
ご挨拶!
特定の言語を強制し、特定のトピックやカリキュラムに取り組むことで、自分よりも先に WAY を得ていると思います。あなた(およびレスポンダーの一部)が混乱しているようですプログラミングクラブ" 「プログラミングクラスをリードする」と。それらは非常に異なるものです。
グループを結成し、グループはクラブから何を彼らに出したいかを正確に決定する必要があります。本質的に、「チャーター」を作成します;クラブのために。次に(そしてその時のみ)優先言語/プラットフォーム、会議の頻度、会議で何が起こるかなどの決定を行うことができます。
最良のアプローチは、さまざまな言語/プラットフォームを調査する「調査」であることが判明する場合があります。または、最良のアプローチは「トピック」のものであることが判明する場合があり、定期的にトピックが変更されます(ブッククラブのように)(今月はポインター、来月はソート、以下は再帰など)その後、さまざまな言語で例と議論が行われます。
余談ですが、「言語にとらわれない」ことを検討します。クラブのオリエンテーション。さまざまな言語やプラットフォームを探検するように子供たちに勧めます。
頑張って、すばらしい仕事を!
まあ、それはプログラミングクラブなので、楽しいはずです!だから私はすぐに経験にいくつかの手を飛び込むと言うでしょう。 main()メソッドが何であるかを説明することから始め、生徒にハローワールドプログラムを作成させます。 hello worldプログラムを徐々に改善して、機能を持たせ、ユーザー入力を出力します。
初心者にはアルゴリズムにあまり速く入らないで、最初にC ++で遊ばせてください。
上記の誰か、「プログラミングを楽しくする」。今日、人々が学習のために学習しないのは興味深いことです。ほとんどの人は、瞬間的な満足を望んでいます。
プログラミングを使用してロジックを少し教えます。これは問題の解決に役立ちます(そして解決されます)。私の頭の中にある分類は、ゲームを推測しています。
- 0から100までの数字を推測するプログラムを作成してもらいます。
- ブラックジャッククローンを作成してもらいます...これは基本で行いました:-(
紙の指示書を作成します。
- 「目玉焼き」を説明するストーリー。目玉焼きを作るために彼らが何をするかを聴覚に尋ねます。彼らが考えているステップに注意してください。おそらく5ステップ未満のアルゴリズムを受け取るでしょう。次に、卵を揚げるようにコンピューターに教えたい場合、何ステップを書き留めるべきかを説明します。次のようなもの:
1) Go to the Fridge 2) Open the fridge door 3) Search for eggs 4) If there are no eggs - go to the shop to buy eggs ( this is another function ;) ) 5) If there are eggs - calculate how many do you need to fry 6) Close the fridge door 7) e.t.c. :)
- Cの基本-構文セマンティクスe.t.cから始め、それと並行して、バブルソートなどの非常に基本的なアルゴリズムを説明します。
- 聴覚が構造化プログラミングに精通したら(レッスンの頻度に応じて数週間または数か月かかる場合があります)、C ++およびOOPに進むことができます。
Deitel& DeitelのC ++プログラミングの内容はまともな紹介であり、各章の終わりに提案されている演習はいいおもちゃの問題です。
基本的に、あなたは次のことについて話している: -制御構造 - 関数 -配列 -ポインターと文字列
STLの概要をフォローアップしたい場合があります("わかりました。今では難しい方法でやったので、ここに簡単なオプションがあります")
たとえば、ソートなどの問題を理解させることから始めます。これは非常に基本的なものであり、非常に高速に関連できるはずです。問題を見つけたら、それを解決するツール/ソリューションを提示します。
マージソートの例を最初に見せたときの気持ちを覚えています。すべての手順を実行できましたが、私は何のためだったのですか?問題の解決策を考え、それを切望すると、彼らはツールと解決策をよりよく理解するでしょう。
簡単な「こんにちは世界」から始めますプログラム。これにより、変数、ストリームへの書き込み、プログラムフローなどの基礎が導入されます。
そこから複雑さを追加します(リンクリスト、ファイルio、ユーザー入力の取得など)。
こんにちは世界から始めると言う理由は、子供が実行中のプログラムを本当に素早く見ることができるからです。彼らは最初から実行中のプログラムを書いているので、それはほとんど即座のフィードバックです。
IMO、 Big-O は、プログラマーが学び始めるためのより重要な概念の1つです。 。
デバッグコンテストを開催します。バグを含むコードサンプルを提供します。コンテストを開催して、誰が最も多く、または最も早く見つけることができるかを確認してください。
最初に使用できる優れた本「How Not to Program in C ++」があります。
あなたは常に間違いから最もよく学び、私は他の人から学ぶことを好みます。
また、コードがほとんど機能しない場合でも、経験の少ない人にコードを見て学習させることができます。
この質問に対する回答に加えて、特定の重要なことがありますカバーするトピック。レッスンの構成方法の例を次に示します。
最初のレッスン:用語と構文
カバーする用語:変数、演算子、ループ(反復)、メソッド、予約語、データ型、クラス
カバーする構文:割り当て、操作、if / then / else、forループ、whileループ、選択、入力/出力
2番目のレッスン:基本的なアルゴリズム構築
forやwhileループなど、いくつかの入力を含むいくつかの単純なアルゴリズムをカバーします。
3番目のレッスン:より高度なアルゴリズムのトピック
これは、再帰、行列操作、高レベルの数学などの目的に使用します。複雑すぎるトピックに取り組む必要はありませんが、実際のプロジェクトで役立つように十分な複雑さを導入します。
最終レッスン:グループプロジェクト
グループが参加できるプロジェクトを作成します。
これらは、1日のレッスンである必要はありません。トピックを複数の日に広げることができます。
擬似コードは非常に最初でなければなりません。
編集:彼らが完全なプログラミング初心者であれば、プログラミングの前半を作成します。アルゴリズムについて話すことが理にかなっているレベルに到達したら、擬似コードは爪の下で取得することが本当に重要です。
お返事ありがとうございます!
そして実際の問題解決をどのように教えますか?
C ++構文といくつかの基本的なアルゴリズムを知っている学生のグループは知っていますが、実際の問題を解決するときに知っている知識を適用することはできません。一連の厳密な手順。動的プログラミングや欲張りなどの「高レベル」アプローチについては説明しませんが、基本的なアルゴリズムの考え方については説明します。
それは、彼らが経験した学習プロセスの悪さによるものだと思います。他の科学では-例えば数学-彼らは本当に素晴らしいです。
アルゴリズムに精通しているからといって、アルゴリズムを実装できるわけではなく、プログラミングできるからといってアルゴリズムを実装できるというわけでもありません。
各トピックから簡単に始めます(アルゴリズムの設計とプログラミングを分けてください)。それぞれのハンドルを取得したら、ゆっくりと2つの概念をまとめます。
おお。C++ は、何かを機能させるために必要な無関係なゴミの量という点で、そもそも最悪の言語の 1 つです (Java はもう少し悪いと思います)。
ボイラープレートが多い環境で初心者に教える場合、通常は「これが簡単な C プログラムです。ファイルの先頭にあるこのくだらない部分が何であるかについては後で説明しますが、今は「int main(void)」と「return」ステートメントの間の行に集中してください。ここですべての有用な作業が完了します。 」。
この時点を過ぎると、基本的なデータ構造 (配列、リンク リスト、ツリー、辞書) や基本的なアルゴリズム (並べ替え、検索など) などの基本的な概念をカバーすることになります。
クラブに、ソフトウェアの構築の概念を教えることで、実際に任意の言語でプログラムする方法を学んでもらいます。 Visual Studioのライセンスを1ダース購入する代わりに、Cコードをプログラムに変換するために、コンパイラーを使用して、システム、ソースファイル、オブジェクト、およびライブラリーを作成します。これは本当に始まりであり、実際にこれらの子供たちが多くの教育機関が頼りにしている松葉杖なしで、任意のプラットフォームでソフトウェアを作成する方法を理解する力を与えていると思います。
お好みの言語-おめでとうございます-C ++は、数学的なショートカットや、コードのパフォーマンスを向上させる(または派手なパターンを実装する)ための無数の方法を考えるのに非常に優れていることがわかります。
質問:私がプログラムを始めたとき、私は常に現実の問題をいくつかのステップに分解しようとします。そして、タスクまたはデータが変換する類似性を見ると、常に怠ierで簡単なものを見つけようとします。それを実装する意味のない方法。
パターンと実際のアルゴリズムを学ぶとき、エレガンスが後になりました。
ハンク:ビッグオー???あなたは、初心者のプログラマーに彼らのコードはO(n ^ 2)のものであり、あなたのものはn log n ??
であることを伝えることを意味しますこれを行うにはいくつかの異なる方法があります:
1)基本的なプログラミングビルディングブロック。条件文とは何ですか?スイッチとif / else?繰り返し文とは何ですか? forおよびwhileループ?これらをどのように組み合わせて、プログラムを目的の一連のステップにするのですか?食料品請求書を追加するか、温度または距離をメートル法から帝国法に、またはその逆に変換するのと同じくらい簡単にできます。文字列、整数、またはダブルのような基本的な変数タイプとは何ですか?また、ここでは、高度なアイデアのためにブール代数を使用したり、場合によっては簡単に感じる人もいれば難しい人もいる基数2または16で算術を行う方法を教えることができます。
2)アルゴリズム上、類似の構成要素は何ですか。ソートは非常に単純なトピックであり、広く議論され分析されて、最も頭の痛い方法であるバブルソートを学習する場合、順序が乱れているように見える要素を単に交換するよりも速くする方法を見つけようとすることができます。
3)コンパイルおよびランタイム要素。呼び出しスタックとは何ですか?ヒープとは何ですか?プログラムを実行するためのメモリの処理方法。コード部分とデータ部分?ファイルをどのように開いて操作しますか?コンパイルとリンクとは何ですか?メイクファイルとは何ですか?これのいくつかは単純ですが、物事がどのように機能するかを見るだけでも目を見張るものになります。
次の2つはやや難しいですが、楽しいかもしれません:
4)次のようなアルゴリズムの背後にあるさまざまなアイデアについて議論します。1)分割と征服、2)動的プログラミング、3)ブルートフォース、4)データ構造の作成、5)問題を既に解決済みの類似のものに減らすフィボナッチ数は、初心者プログラマーに与える古典的な再帰問題であり、6)「貪欲」であるという考えコインの種類がa、b、cである国にいた場合の変更例のように。また、少しエキゾチックなものが必要な場合は最小重量スパニングツリー、説明は簡単だが解決するのが苦手な場合は巡回セールスマンなど、いくつかのグラフ理論の例に入ることもできます。
5)数学関数。 1からnまでのすべての数の積である階乗をどのようにプログラムしますか?さまざまな算術級数または幾何級数の合計をどのように計算しますか?または、nのセットからr要素の組み合わせまたは順列の数を計算しますか?点のセットが与えられたら、この要件を満たす多項式を近似します。 xとyと呼ばれる2次元平面では、2つの点を与えて、線形方程式のペアを既に解いた場合に、勾配とy切片が何であるかを人々に理解させることができます。
6)リンクされたリストと配列を使用して実装できるリスト。さまざまな場合にどちらが良いですか?挿入、削除、検索、ソートなどの基本的な機能をどのように実装しますか?
7)抽象データ構造。スタックとキューとは何ですか?クラスをどのように構築してテストしますか?
8)ポインター。これは、メモリの割り当て/割り当て解除の方法、メモリリークとは何かといった膨大なトピックにつながるだけです。
これらは、さまざまな出発点に対する私の提案です。毎週同じトピックについて話すことを気にしない少数の人々を集めることができる場合、議論を始めることはいくつかの興味深い場所につながると思います。細かい点に。
皆さんは" ScratchのC ++標準ライブラリからTinyPIMプロジェクトを構築できます"そして、それが機能したら、独自の拡張機能の設計を開始します。