私は定期的にJavaを使用したプログラミングコースの概要を教えています。私は生徒たちにいくつかの刺激的な彼らが関連するか、または面白いと感じることができる課題を与えたいです。少なくとも、意味があり、内部にまとまりのある割り当てが必要です(たとえば、非常に悪いプログラミング演習は、対象となる最新のプログラミング構成を使用しなければならないように考案されているようです)。
スコープのアイデアを提供するために、-ここにカバーされているものはここです:
if
、for
、while
学生は、高度なトピック(たとえば、再帰なし、継承の強調なし)に進みません。したがって、私は not ではなく、複雑なプロジェクトを探しています。「Cコンパイラを作成してもらいます。私は5歳のときにそれをしました。
スコープよりも高度なアイデアがある場合は、このリンクではなく、下記の「挑戦的な」質問に投稿してください。
代わりに、私が探しているのは、短いプログラムで実現できる興味深いアイデアです。例えば:
学生は "Star Wars Name" Generator のコンソールバージョンを作成できます。これは効果的に文字列を読み取り、substring
を使用していますが、楽しいと思います。同様のバリエーションは " Mad Libs "プログラムです。 これを5年前に使用しましたが、おそらくすでに「古くなっています」
与えられたいくつかのトリガーを使用して、生徒は通常のポリゴンを描画し、興味深いスパイラル形状を作成できます。
ほとんどのコードが提供されている単純なアニメーションクラスを使用することも問題外ではありません。また、シンプルなAPIを使用してアクセスできるTwitterまたはFacebookサービスをご存知の場合は、私が知りたいと思っています。
この質問は、「 挑戦的なJava初心者向けの質問 "質問」とは異なります。質問自体は探していません。興味深いだけです。学生は「なぜ誰もがそれをプログラムしたいと思うのはなぜだろう」と簡単に答えることができる何かに取り組み、それから彼らはよりよく学ぶでしょう。
ガロンあたりのマイル数の計算のような単純な問題でさえも良い場合があります。ただし、より関連性の高いものに更新する方法がある場合は、なお良いでしょう。他の場所(本またはウェブサイト)からのエクササイズがある場合は、出典を引用してください。
今日の典型的な新入生について考えるのを助けるために、確かにあなたを古く感じさせる多くの例について、 ベロイトマインドセットリスト をチェックしてください。
制約があるため、ハングマンのバージョンを実装することをお勧めします。生徒は、過度に複雑にすることなく、紹介するすべてのテクニックを実演できます。
コースの進行に合わせて、開発プロジェクトとして使用することもできます。例えば文字列と変数をカバーしたら、テキストバージョンとして開始します
例えば.
You have 10 guesses left. * * * E * * T
What is your next guess?
次に、ループを導入して、コードからカットアンドペースト要素を削除し、10回の推測がカウントダウンします。5週間のコースの終わりに、線のグラフィックスとスティックの人が吊り下げられる/保存されるまで構築します。
プログラマーの採用と面接の経験を持つ他のほとんどの人と同様に、大学でこのレベルの授業料が必要であることに本当に腹を立てますが、悲しいかな、学校がプログラミングを深刻な科目として扱うまで、それはおそらく必要とされ続けるでしょう数学または科学と同等
テキストアドベンチャーゲームのように聞こえるかもしれませんが、学期半ばのどこかで素晴らしい仕事になるでしょう。巨大洞窟アドベンチャーをプレイしてから、独自のゲームを作るクラスがありました。それは私に早い段階で多くの基本的な構成を教えてくれました、そして誰もがそれに取り掛かることをするのはとても楽しかったです。
http://projecteuler.net/ の1つまたは2つの問題を使用するのはどうでしょうか。これらのいくつかは非常に興味深いものであり、問題を解決するプログラムを作成することの利点を理解することができます。それらは十分に小さいので、いくつかを割り当てとして行うことができます。私が使用したいもう1つは、1.00ドルの単語を見つけることです。アラファベットの各文字は、ペニーでの位置の価値があります。つまり、a = 1、b = 2。 $ 1.00ドルの単語はいくつ見つかりますか?これには、ファイルI/O(ディクショナリーでの読み取り)、配列、ループなどが含まれます。
モノポリーゲームを実装します。独占には明らかなシーケンスがあり、機能への分割が非常に簡単です。また、1次元配列といくつかの基本クラスのみが必要です。論理は非常に単純なので、学生は「何を」ではなく「どのように」を考えるようになり、結果として他の人に示すことができるものになります。
リバーシブルルールで暗号化された暗号化ファイルを渡して、デコーダーを作成するように依頼します(ただし、十分にシンプルにしてください)。メッセージの内容についての謎のため、これはそれを解決するための追加のインセンティブを与えます。
なぜ1次元配列のみをカバーし、行列をカバーしないのかはわかりません(実際にはそれほど違いはありません)が、それをシラバスに含めても構わない場合は、Jon ConwayのGame of Lifeも比較的簡単で、何かにつながります楽しい。
チェスのようなゲームは少し考えが必要ですが、初心者が最小限の継承で実行できること(特定のピースは一般的なクラスのピースから継承され、ボードはピースタイプのオブジェクトを保持します)、および2D配列(あなたは敵の駒がキャスリングパスを脅かしている場合、星の検出や城を作れないなどの難しいものを実装する必要がないことで、それを簡素化できます)。
学校では、I/O、関数、条件付き演算子のみを使用して、かなりの数のプロジェクトを作成しました。オブジェクト指向プログラミングについて学ぶ前にすべて完了しました。これらのプロジェクトはゆっくりと進み、ますます困難になりました。言うまでもありませんが、年末に向けて、毎週4時間では十分ではありませんでした。
これらのプロジェクトはすべて、関数とI/Oだけで行われました。
学習するゲームあなたはいくつかのスティックを取り、PCはいくつかのスティックを取ります。繰り返す。棒を持っている最後の人は緩みます。各ゲームの後に良くなる簡単な自己学習プログラムを作成する必要がありました。 2D配列を学習する良い例。
コードブレーカー。シーザー暗号化を知っているので、文字を1つ選び、その文字の値をWordの各文字に追加します。例えば。 key = 'a'およびWord = "secret"。これは「tfdsfq」になります。ファイルを読み込んでから、各文字の頻度表を作成することで実行できます。また、英語の聖書を読みます。次に、英語のアルファベットで最も使用される文字が「e」であることを確認し、それを解決します。チャレンジを追加:割り当てであった「ab」などのキーを使用します。 I/Oを理解するための良い練習。
バーコードメーカー。このプログラムは、外部ライブラリを呼び出すための演習でした。コードを取得し、バーコードで画像を生成する必要がありました。外部ライブラリを使用して画像を生成しました。
巡回セールスマン問題を解決するための遺伝的アルゴリズム。これは、2人または3人向けのより高度なプロジェクトでした。ランダムなルートから始め、このルートは「良いルート」ができるまで常に改善されます。ボーナス:ルートを含むマップを作成します。
動作するlzw圧縮プログラム。これが最後の4人プロジェクトでした。パラメータは非常に単純でした。 「Zip file.txt file.Zip」または類似のもの。楽しいプロジェクトですが、lzwアルゴリズムの理解にはしばらく時間がかかりました。
電卓は、算術演算を学ぶのに適したプロジェクトです。シンプルなメニューベースのコンソールアプリまたはGUIにすることができます。開始する4つの関数(+、-、*、/)、平方根などのより複雑なもののための追加のポイント.
文字列の処理については、検証の問題をいくつか提案します。メールアドレスが頭に浮かぶ-チェックされていないままにすると、SQLインジェクションホールなどにつながる可能性があり、検証は比較的簡単です。追加する場合は、姓、名、姓を取得し、それらをスペースでつないだり、フルネームを取得して各コンポーネントに解析したりできるプログラムがあるかもしれません。 1つ目は実際に2つ目よりも多く使用されますが、単純な別の構文解析シナリオを考えることはできませんでした。
静的メソッドを示すために、メールルックアップ問題を割り当てることができます。名前と電子メールのファイルを用意します。静的コンストラクターは、特定の名前の電子メールを検索する静的メソッドを使用して、名前/電子メールをリストに入れることができます。
これらがあなたにいくつかのアイデアを与えることを願っています!あなたのクラスで頑張ってください。
課題にとって非常に興味深いクールなことの1つは、2DでConwayの Game of Life の実装を作成することです。それは基本的な配列データ構造に非常によく対応します。楽しく簡単に実行できますが、それでもいくつかの検討が必要です。それはいくつかの好奇心と実験も開くかもしれません(AI)。
上級生は、追加のポイントのために3Dでバージョンを書くことができます。
素数ジェネレータで繰り返します。
割り当て
前世紀は入門的な方法で教えましたが、それは基本でしたが、あなたと同じように、生徒たちが自分で考案した楽しいプロジェクトを進めてもらいたかったのです。だから私はたくさんの可能性を提案しました:
...または学生が考えたものは何でも。彼らは私に来て、「XYZを行うプログラムはどうですか?」そして、私はいつも「素晴らしい」と言って、多分それがあまりにも複雑にならないように彼らを少し導くかもしれません。
通常、彼らのプロジェクトは数百行のコードになり、常に楽しんでいました。
追伸生徒が基本的な制御構造、I/O、アレイ、およびシーケンシャルファイルに習熟した後で、この課題を割り当てました。それは彼らの学年の主要な部分であるタームプロジェクトでした、そして私は途中のアウトラインのような中間のマイルストーンの割り当てを持っていたので、彼らは最後にそれをすべてやろうとして壁にぶつかることはしませんでした。私は、彼らを始めるのに十分なスキルを持っていた、可能な限り学期の早い段階で、彼らをこれに入れたかったのです。
私は ACM Library を使用して、イントロの学生が簡単なグラフィックスとゲームを行えるようにしています。概説したスキル以外に、基本的な2プレイヤーのクリックベースのゲームを行うことができました。今週、彼らは Fox and Hounds ゲームをやっています。
コンソールI/Oからできるだけ離れるようにしています。 GUIで育ったすべての学生にとって、これは最近の外国人の概念です。したがって、私はMVCに焦点を当て、モデルを正しく取得し、モデルをテストした後にのみGUIを追加します。テストは自動ユニットテストと BlueJ のコードパッドを介して行われます。 public static void main()
は必要ありません。
あなたがモジュールを書いたプログラムを先生に書いてもらいました。基本的に、それはゲームであり、あなたはそれを解決するためにアルゴを書かなければなりませんでした、それをグラフィカルできれいにそしてうまく動かすためにすべてがそこにありました。おそらく、独自のゲームフレームワークを作成し、それらのボックスの外で後で実行できるクールなことの機能を簡素化した基本的なツールを提供する必要があります。
高校では、プログラミングの入門クラスを受講し、 Karel J. Robot を使用しました。ロボットを表示するためのGUIを提供し、非常に基本的なセンサーと移動方法のセットを備えているため、ロボットを興味深いものにするために拡張する必要があります。ソフトウェアの違いをまだ理解していない人にとってはロボットがわかりやすいのでいいと思います。
また、元々はプログラミングを教えるために設計された Processing もあり、Javaにも含まれています。
私の導入コースでは、3つのプロジェクトが立ち往生しました
ランダムに表示するプログラムを書く モンドリアン 絵画
BrickBreakerゲームの最初の部分を記述し、設定された領域内でボールを跳ね返らせます
テキストベースのアドベンチャーゲームを書く
私のアルゴリズムクラスから
セルピンスキー三角形を実装する
これらの4つのプロジェクトは、文字列処理、ランダム化、グラフィックス、再帰、アニメーションについて非常によく理解してくれました。
クラスのすべての学生はCS専攻ですか?私の推測ではありません。クラスの専攻に合わせた課題を考えます。
例:
美術の学生は、キャンバスとフレームの寸法を取り、キャンバスの量を計算するプログラムを書くことができます(キャンバスをフレームの周りに巻き付けたりステープルで留めたりするため)。
Econの学生は、アイテムの複利を計算できます。
数学の学生は、Project Eulerから問題を選択できます。
私はここで反対者になります。おもちゃではなく問題を解決するには、有効なビジネスタイプの問題を与える必要があると思います。彼らがプロとして実際にやろうとしている仕事に興味を持ち、やる気を起こさせるほど真剣ではないなら、私はむしろあなたを紹介コースで彼らをばかにしたいと思います。実際の仕事はクールなものを作ることではなく、クライアントのニーズを満たすことです。また、ゲームで学んだことと、ビジネスプログラミングで同じテクニックを使用することとの間に飛躍をもたらさない多くの人々を見てきました。
私が知っているすべての上級開発者および採用マネージャーは、最近の卒業生の質にうんざりしています。彼らが現実の世界で働くために学ぶ必要があることに集中してみて、それを楽しくすることを忘れてください。
彼らの携帯電話で愚かなウィジェットを構築するための割り当て。彼らが友達に見せることができる何か。私は超安価なAT&T電話を使っており、それはある種のjarファイルを必要とします。
私が見た中で最も重要な割り当ては、他の方法では考えられなかったことを人々に考えさせることです。単純なコース教材から完全に外れたもの、不可能と思われるもの。複数の有効なソリューションがあるもの。
私を感動させたいくつか:
Roshambo AI(UOAのAIコースで使用)。じゃんけんの場合は-1、0、1を返す単純な関数。 AIは互いにピットし、統計は集約ユーティリティプログラムによって収集されます。この割り当ては、実行可能なアプローチの数(およびパフォーマンスが非常に低い方法)に常に驚かされます。
不可能な特性を持つ単純なソート問題。有限のメモリで無限の長さのファイルをソートします。この問題は、アルゴリズムにおける思考の基盤を揺るがしました。多くの関連する問題があります:無限長のデータに対するウィンドウ平均など、それぞれが明らかに不可能なことの解決策を強制します。
些細に見えるシミュレーションの問題。交通シミュレーション(車両、ネットワーク)、レースカーシミュレーション(左、右、高速、低速)、食料品店シミュレーション。
ネットワークの問題(ここ数年で一緒に働いた卒業生の大きな弱点)。ハンドヘルドのピアネットワーキングの問題。たとえば、n同期の問題、ピアの更新、ピアの信頼などの複雑さを証明します。
小さな言語(最近の卒業生のもう1つの弱点)。シンプルなゲームAI(チェッカー、ロシャンボ、タンク、CSSモジョ、Twitterボット)のための小さな言語を開発します。言語の設計、解釈、および行動の概念について考えることは、基本的なことです。