17

高校で (仲間のプログラマーと) プログラミングとアルゴリズムのクラブを始めようとしています。選択した言語は C++ です。申し訳ありませんが、これを変更することはできません。学生は前述のトピックの経験がほとんどまたはまったくないと想定できます。

私が注目すべき最も基本的な概念は何だと思いますか?

自分にとってすでに当たり前のことを教えるのは簡単なことではないことはわかっています。学生を怖がらせないように、最初の会議には細心の注意を払う必要があることを私は理解しています。

編集:おそらくプログラマーと初心者の主な違いは「プログラマーの考え方」にあることに気付きました。つまり、問題をアルゴリズムとして概念化することです。練習の問題だとは思いますが、この分野の発達を刺激するエクササイズ/概念/物事を知っていますか?

4

23 に答える 23

12

プログラミングを楽しく!

話し合うべきことは、あなたのクラブが独自に開催したり、地元で参加したりできるプログラミング競技会です。私は大学 (ACM) レベルのプログラミング コンテストに参加しており、下位レベルでも開催されていることを知っています。

この種のイベントは、実際に競争心を引き出し、クラブのメンバーを近づけることができます。

物事は常にプログラミングに関するものである必要もありません。ゲームをしたり、プログラミングについて話し合ったりする LAN パーティーを開催するのも良い考えかもしれません。

プログラミング/アルゴリズムに関連する実際のトピックに関しては、このプログラミングコンテストの入門書「プログラミングの課題」でこれらのプログラミングの問題のいくつかをグループで試すことをお勧めします: Amazon リンク

それらはかなり基本的なプログラミングの問題から始まり、次のようなさまざまなデータ構造を必要とする問題に徐々に進みます。

  • スタック
  • キュー
  • 辞書

ほとんどの問題は C++ で与えられます。

最終的には、Graph Traversal や一般的な Graph アルゴリズム ( Dijkstraなど)、Combinatrics の問題などを含む、より高度な問題に進みます。それぞれの問題は楽しく、小さな「ストーリー」のような形式で与えられます。ただし、これらのいくつかは非常に難しいことに注意してください。

編集: ピザとソーダは、クラブの例会に人を集めることに関しては決して悪くありません. 私たちの ACM クラブでは、ミーティングごとに (月に 1 回) ピザを用意しています。私たちのほとんどはまだ現れますが、それは素晴らしい砕氷船です. 特に新しいクラブやメンバーの場合。

于 2008-10-02T19:20:14.557 に答える
3

分解する

私にとって、プログラミングのユニークな点は、タスクをコンピューターにとって十分小さなステップに分割する必要があることです。これは言語によって異なりますが、100 までカウントするためだけに「for ループ」を記述しなければならない場合があるという事実に慣れる必要があります。

「トップダウン」アプローチは、この概念に役立つ場合があります。次のように、プログラムのマスター関数を作成することから始めます。

filterItemsByCriteria();

それがどのように機能するか分からないので、次のステップに分割します。

(注: 私は C++ を知らないので、これは単なる一般的な例です)

filterItemsByCritera() {
  makeCriteriaList();
  lookAtItems();
  removeNonMatchingItems();
}

次に、それぞれをさらに分解します。すぐに、基準リストなどを作成するために必要なすべての小さなステップを定義できるようになります。小さな機能がすべて機能すると、大きな機能が機能します。

それは、子供たちが「なぜ?」と問い続けるゲームのようなものです。「どのように?」と尋ね続ける必要があることを除いて、あなたが言うすべての後に。

于 2008-10-02T20:27:08.780 に答える
2

リンクされたリスト - 古典的なインタビューの質問であり、それには正当な理由があります。

于 2008-10-02T19:14:53.007 に答える
2

私はオブジェクト指向のものから始めようとはせず、C サブセットで作業しようとします。それは、彼らがいくつかの基本を理解した後に導入することができます.

于 2008-10-02T19:14:58.093 に答える
2

ご挨拶!

特定の言語を強制し、特定のトピックとカリキュラムに取り組むことで、あなたは自分よりも先を行っいると思います。 . それらは非常に異なるものです。

私はグループをまとめ、グループはクラブから何を得たいのかを正確に決定する必要があります。本質的には、クラブの「チャーター」を作成します。それから(そしてその時だけ)、優先する言語/プラットフォーム、会う頻度、会議で何が起こるかなどの決定を下すことができます.

最良のアプローチは、さまざまな言語/プラットフォームを調査する「調査」であることが判明する場合があります。または、最良のアプローチが「話題の」ものであることが判明するかもしれません.定期的にトピックが変更されます(ブッククラブのように)(今月はポインタ、来月はソート、次は再帰など).次に、例と議論がさまざまな言語で発生します。

余談ですが、クラブの「言語にとらわれない」オリエンテーションを検討します。子供たちにさまざまな言語やプラットフォームを探索するように勧めます。

頑張ってください、そして素晴らしい仕事です!

于 2008-10-02T20:43:37.583 に答える
1

上記の誰かが「プログラミングを楽しくする」と言った。今日、人々が学ぶために学ぶのではないことは興味深いことです。ほとんどの人はすぐに満足したいと思っています。

プログラミングを使って少し論理を教えます。これは問題解決に役立ちます(そしてそうです)。私が頭の中で持っている分類は、推測ゲームです。

  • 0 から 100 までの数を推測するプログラムを作ってもらいます。
  • 彼らにブラックジャックのクローンを作ってもらいます...私はこれを基本的に行いました:-(

紙の指示書を作成します。

于 2008-10-02T20:31:36.553 に答える
1
  1. 「目玉焼き」のストーリーを解説。自分で目玉焼きを作るために何をするかを聴覚に尋ねます。彼らが考えるステップに注意してください。おそらく、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. :)
  1. C の基礎 - 構文セマンティクスなどから始め、それと並行して、バブル ソートなどの非常に基本的なアルゴリズムについて説明します。
  2. 聴覚が構造化プログラミングに慣れたら (レッスンの頻度によっては、数週間または数か月かかる場合があります)、C++ と OOP に進むことができます。
于 2008-10-02T20:38:40.810 に答える
1

まあ、プログラミングクラブなので楽しいはずです!ですから、すぐに実践的な経験に飛び込むと思います。main() メソッドとは何かを説明することから始めて、生徒に hello world プログラムを作成させます。hello world プログラムを徐々に改善して、機能を持ち、ユーザー入力を出力できるようにします。

初心者にはアルゴリズムにあまり早く入り込まないでください。最初に C++ で遊んでもらいます。

于 2008-10-02T19:55:06.750 に答える
0

ハンク: ビッグオー??? 初心者のプログラマーに、彼らのコードは O(n^2) であり、あなたのコードは n log n であることを伝えますか??

于 2008-10-06T17:18:37.963 に答える
0

この質問への回答に加えて、取り上げるべき重要なトピックがいくつかあります。レッスンを構成する方法の例を次に示します。

最初のレッスン: 用語と構文

カバーする用語: 変数、演算子、ループ (反復)、メソッド、予約語、データ型、クラス

カバーする構文: 代入、演算、if/then/else、for ループ、while ループ、選択、入力/出力

レッスン 2: 基本的なアルゴリズムの構築

for または while ループなど、いくつかの入力を含むいくつかの単純なアルゴリズムについて説明します。

レッスン 3: より高度なアルゴリズムのトピック

これは、再帰、行列操作、および高レベルの数学などのためのものです。あまり複雑なトピックに入る必要はありませんが、実際のプロジェクトで役立つのに十分な複雑さを導入してください。

最終レッスン: グループプロジェクト

グループが参加できるプロジェクトを作成します。

これらは1日のレッスンである必要はありません。トピックを複数の日に分散させることができます。

于 2008-10-02T19:29:52.287 に答える
0

「スクラッチからの C++ 標準ライブラリ」から TinyPIM プロジェクトを構築し、それが機能するようになったら、独自の拡張機能の設計を開始できます。

于 2009-01-21T22:02:43.207 に答える
0

私はこれを取るいくつかの異なる方法を見ることができました:

1) 基本的なプログラミング ビルディング ブロック。switch や 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) ポインター。これは、メモリを割り当て/割り当て解除する方法、メモリリークとは何ですか?などの膨大な量のトピックにつながります。

これらは、さまざまな出発点に対する私の提案です。場合によっては、毎週同じテーマについて話すことを気にしない数人を集めることができれば、ディスカッションを開始すると、いくつかの興味深い場所につながる可能性があると思います。細かいところまで。

于 2008-10-18T00:49:57.317 に答える
0

疑似コードは非常に最初にする必要があります。

編集: 彼らが完全なプログラミングの初心者なら、前半はプログラミングについてだけにします。アルゴリズムについて話すことが理にかなっているレベルに達したら、疑似コードを理解することが非常に重要になります。

于 2008-10-02T19:14:52.697 に答える
0

ソフトウェア構築の概念を教えることで、どの言語でも実際にプログラミングする方法をクラブに学んでもらいます。Visual Studio の数十のライセンスを使い果たす代わりに、学生にコンパイラを使用させ、システム、ソース ファイル、オブジェクト、およびライブラリを作成させて、C コードをプログラムに変換します。私はこれがまさに始まりだと感じており、多くの教育機関が頼りにしたい松葉杖なしで、実際にこれらの子供たちがあらゆるプラットフォームでソフトウェアを作成する方法を理解する力を与えています.

于 2008-10-02T20:40:00.790 に答える
0

わお。C++ は、何かを機能させるために必要な無関係のがらくたの量という点で、最初から考えられる最悪の言語の 1 つです (Java は少し悪いと思います)。

ボイラープレートの多い環境で初心者を教える場合、通常、「これは単純な C プログラムです。ファイルの上部にあるこのがらくたが何であるかについては後で説明しますが、今のところ、間の行に集中してください」 int main(void)' と 'return' ステートメントで、すべての有用な作業が実行されます。

ここまで来たら、基本的なデータ構造 (配列、リンク リスト、ツリー、辞書) と基本的なアルゴリズム (並べ替え、検索など) をカバーする基本的な概念について説明します。

于 2008-10-02T20:03:18.167 に答える
0

デバッグ コンテストを行います。バグを含むコード サンプルを提供します。誰が最も多く、または最も速く見つけることができるかを競います。

最初に使用できる優れた本、How Not to Program in C++ があります。

あなたは常に間違いから最もよく学びます。私は他の人から学ぶことを好みます。

また、コードがほとんど機能しない場合でも、経験がほとんどない人でもコードを見て学ぶことができます。

于 2008-10-02T19:25:13.687 に答える
0

Deitel&Deitel の C++ プログラミングの内容はまずまずの紹介であり、各章の最後に提案されている練習問題は良いおもちゃの問題です。

- 制御構造 - 関数 - 配列 - ポインタと文字列

STL の紹介でフォローアップすることをお勧めします (「わかりました。今は難しい方法でそれを行ったので、より簡単なオプションがあります」)。

于 2008-10-02T19:18:04.623 に答える
0

返信ありがとうございます。

そして、彼らに実際の問題解決をどのように教えますか?

私は、C++ 構文といくつかの基本的なアルゴリズムを知っている多くの学生を知っていますが、実際の問題を解決するときに知っている知識を適用することはできません。厳格な手順。動的プログラミングや貪欲などの「高レベル」のアプローチについては話しませんが、基本的なアルゴリズムの考え方については話します。

それは、彼らが経験した学習プロセスが不十分だったからだと思います。他の科学、たとえば数学では、彼らは本当に素晴らしいです。

于 2008-10-02T19:45:28.130 に答える
0

並べ替えなどの問題を理解させることから始めます。これは非常に基本的なことであり、非常に迅速に対応できるはずです。彼らが問題を見つけたら、それを解決するためのツール/ソリューションを提示します。

最初にマージソートの例を見せられたときの気持ちを覚えています。私はすべての手順に従うことができましたが、一体何のために私がいたのですか? 問題の解決策を切望すれば、彼らはそのツールと解決策をよりよく理解するでしょう。

于 2008-10-02T19:19:25.180 に答える
0

簡単な「hello world」プログラムから始めます。これにより、変数、ストリームへの書き込み、プログラム フローなどの基礎が導入されます。

次に、そこから複雑さを追加します (リンクされたリスト、ファイル io、ユーザー入力の取得など)。

私が hello world から始めると言う理由は、子供が実行中のプログラムをすぐに見ることができるからです。彼らは最初から実行中のプログラムを書いているので、それはほぼ即時のフィードバックです。

于 2008-10-02T19:21:07.393 に答える
0

IMO、Big-Oは、初心者のプログラマーが学ぶべき重要な概念の 1 つです。

于 2008-10-02T19:21:34.507 に答える
0

アルゴリズムに精通しているからといって、アルゴリズムを実装できるわけではありません。プログラミングができるからといって、アルゴリズムを実装できるわけではありません。

各トピックから簡単に始めます (プログラミングはアルゴリズムの設計とは別にしてください)。彼らがそれぞれを理解したら、ゆっくりと 2 つの概念を結び付け始めます。

于 2008-10-02T19:59:00.843 に答える
0

選択した言語については - おめでとうございます - C++ は、コードのパフォーマンスをさらに向上させる (または派手なパターンを実装する) 数学的ショートカットと何百万もの方法を考えるのに非常に豊富であることがわかります。

質問に対して: 私がプログラミングを始めたとき、私は常に 1 つの実生活の問題をいくつかのステップに分解しようとしました。そして、それらが変換するタスクまたはデータ間の類似性を見つけたとき、私は常に怠惰で、より簡単で、より卑劣な方法を見つけようとしました。それを実装します。

パターンと実際のアルゴリズムを学ぶと、エレガンスが生まれました。

于 2008-10-02T21:25:48.013 に答える