【Java】教授もフンガッフフ簡単な問題もOOPでイケ【宿題】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まえから立てたかったスレがあるんだよ

前スレ
http://pc2.2ch.net/test/read.cgi/tech/1040552821/
(;´Д`)Kanben Site YO!!
だれだよ、w
確かに俺は立てたいって言ったさ
でもさ、ネタ ネタだったのにさぁー
4デフォルトの名無しさん:03/07/19 23:26
ま、でもある意味 いいかも
5デフォルトの名無しさん:03/07/19 23:28
せめて、前のが1000いってからでもよかったじゃない?
6デフォルトの名無しさん:03/07/19 23:29
でも、前スレ(?)の>>426みたいに
OOPを勘違いしてるやつにはできないコード見れるな
厨房の夏 2chの夏
前スレだってまだ半年もつぞsage

このスレの定義
どんなに簡単な問題であろうと、OOP的な解釈で問題を解く
どんなにクラスが多くなろうとOOP的な方向性で解く
そうすれば、回答者に対して突っ込みいれるときも
一部分ですむから、最終的にはレスの見通しもよくなる
教授がフンガッフフとなっってしまうようなコードが書ければお前の勝ちだ


//以上のテンプレをみなが忘れた頃に貼りなおしてください または 誘導
//追加

つっこまれてもいいじゃないか?
自分も初心者の気持ちでコードをうpし合おう
//さらに追加

つっこみだけでコードを載せない、あるいはココがこうだからダメと
はっきり言わんやつは放置
そのような、お勉強にもならないレス帰してくるやつはクソ
1212:03/07/20 10:41
前スレ>>416-417 OOP版

class ValidateException extends Exception {

public ValidateException() {
super();
}

public ValidateException(String message) {
super(message);
}
}

class State {

private String message;
public State(String message) {
this.message = message;
}
public void print() {
System.out.println(message);
}
}
1312:03/07/20 10:42
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class OOP1 {
private final int MIN = 0;
private final int MAX = 1000;
private final String HIT_PREFIX = "正解:";
private final String HIT_SUFFIX = "回目";
private final String LARGER = "より大きな数です";
private final String SMALLER = "より小さな数です";
private final String REQUESTNUMBER = "数値を入力してください";
private final String UNJUSTVALUE = "0以上1000以下の数値を入力してください";
private int count;
private int answer;
private boolean isContinue;

public void execute() throws IOException {
String inputNumber;
State state;
while (isContinue && (inputNumber = new BufferedReader(new InputStreamReader(System.in)).readLine()) != null) {
int input;
count++;
try {
input = validate(inputNumber);
state = new State(check(input));
}
catch (ValidateException e) {state = new State(e.getMessage());}state.print();}}
1412:03/07/20 10:44

public String check(int input) {
if (input > answer) {
return input + SMALLER;
}
else if (input < answer) {
return input + LARGER;
}
else {
isContinue = false;
return HIT_PREFIX + count + HIT_SUFFIX;
}
}

public int validate(String inputNumber) throws ValidateException {
int num;try {
num = Integer.parseInt(inputNumber);
if (num < MIN || MAX < num) {
throw new ValidateException(UNJUSTVALUE); }}
catch (NumberFormatException e) {
throw new ValidateException(REQUESTNUMBER); }return num;}
public OOP1() {
isContinue = true;count = 0;
answer = (int) (Math.random() * 1001);}

public static void main(String[] args) {OOP1 oop = new OOP1();
try {oop.execute();}catch (IOException e) {e.printStackTrace();}}}
残念だけど、それはOOPとはいけないよ。
オブジェクトそのものを理解していないだろ?
前スレで上げたが、ステージ(main)、司会者、問題提示者、回答者
の4つのクラスに分けてこそ、もんモノのOOPだよ。
こうすればネットワーク多人数同時プレイも容易に可能になるし。

文句ある? なら俺がサンプル載せてやるが。

1612:03/07/20 11:23
>>15
どぞ お願いします
>>13
お前、whileの内側にtry-catchを置くと激重になるぞ。
yrt-catchはwhileの外側で囲んどけ。

しかもcatchすべき例外にExceptionクラスも追加しておけよ。
1812:03/07/20 12:27
>>17

>お前、whileの内側にtry-catchを置くと激重になるぞ。
>yrt-catchはwhileの外側で囲んどけ
ええ、ですがこの場合、外に書くと
例外発生時におわっちゃいますので、・・・どう書きます?

関係ないのですがこのwhileループをどこに置くかもかなり迷いますね
で、>>15の言うように分けるのいいのですがこういうループが必須のプログラムの場合
難しいんですよね、延々と回すならまだいいのですが
当たったら、プログラム終了させないといけないので・・・
>>15さんがどういう風につくるのか楽しみです


>しかもcatchすべき例外にExceptionクラスも追加しておけよ。
コレが分からないのですが
前述の「外側に書いたとき」にExceptionクラスも追加するってことなのでしょうか?
それとも、「Exceptionクラスも追加」っていうのはtrycatchのお決まりなのですか?
また、その理由は?

19どれどれ:03/07/20 12:41
import java.io.IOException;

public class NumGame {

ProblemPresentationPerson probPerson = new ProblemPresentationPerson();
Respondent resPerson = new Respondent();
Chairman chairman;

public static void main(String[] args) {
try {
new NumGame().run();
} catch (Exception e) {
e.printStackTrace();
}
}

public NumGame() {
chairman = new Chairman(probPerson, resPerson);
}

public void run() throws NumberFormatException, IOException {
chairman.statr();
}
}
20どれどれ:03/07/20 12:41
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Respondent {
public int answer() throws NumberFormatException, IOException {
BufferedReader bw = new BufferedReader(new InputStreamReader(System.in));
return Integer.parseInt(bw.readLine());
}
}
21どれどれ:03/07/20 12:43
public class ProblemPresentationPerson
static final int MAX_VALUE = 1000;
static final int MIN_VALUE = 0;

public static final int SMALL = 0;
public static final int LARGE = 1;
public static final int HIT = 2;
public static final int OUT_OF_RANGE = 3;
int answer;
public void genProblem() {
answer = (int) (Math.random() * MAX_VALUE);
}
public void presentation() {
System.out.println(MIN_VALUE + "から" + MAX_VALUE + "間の数を当ててください");
}
public int check(int answer) {
if (!(answer > MAX_VALUE || answer < MIN_VALUE)) {
if (this.answer == answer) {
return HIT;
} else if (this.answer > answer) {
return SMALL;
} else if (this.answer < answer) {
return LARGE;
}
}
return OUT_OF_RANGE;
}
}
22どれどれ:03/07/20 12:44
import java.io.IOException;
public class Chairman {
ProblemPresentationPerson probPerson;
Respondent resPerson;
Counter counter = new Counter(1);
private final String HIT_PREFIX = "正解:";
private final String HIT_SUFFIX = "回目";
private final String LARGER = "より大きな数です";
private final String SMALLER = "より小さな数です";
private final String UNJUSTVALUE = "0以上1000以下の数値を入力してください";
public Chairman(ProblemPresentationPerson probPerson, Respondent resPerson) {this.probPerson = probPerson;this.resPerson = resPerson;}
public void statr() throws NumberFormatException, IOException {
probPerson.genProblem();
probPerson.presentation();
int result = 0;
int answer = 0;
while ((result = probPerson.check((answer = resPerson.answer())))
!= ProblemPresentationPerson.HIT) {
switch (result) {
case ProblemPresentationPerson.LARGE :
System.out.println(answer + SMALLER);
break;
case ProblemPresentationPerson.SMALL :
System.out.println(answer + LARGER);
break;
case ProblemPresentationPerson.OUT_OF_RANGE :
System.out.println(UNJUSTVALUE);
break;
}
counter.incr();
}
System.out.println(HIT_PREFIX + counter.get() + HIT_SUFFIX);}}
23どれどれ:03/07/20 12:45

public class Counter {
int count = 0;

public Counter(int count) {
this.count = count;
}
public Counter() {
}

public void incr() {
count++;
}
public void decr() {
count--;
}
public int get() {
return count;
}
public void reset(int count) {
this.count = count;
}
public void reset() {
this.count = 0;
}
}
2412:03/07/20 13:08
>>19-23
なるほどそう言うことですか
ほんとのOOPっていうきがします

しかしコレでは
NumberFormatExceptionでプログラムが
終了してしまいます
その辺が難しいのですよねコレ
このコードでもうチョイ考えて見ます
なにかあればかいてください

25どれどれ:03/07/20 13:58
ちなみに15じゃないです
2615:03/07/20 14:30
すまん、ネットワーク化せたいので
しばらく時間クレ。

出題者&司会者=サーバー
回答者=クライアント

という形。
サーバーは起動後、問題を製作しクライアントからの接続を待つ。
クライアントから接続要求がくると現在の問題をクライアントへ送る。
クライアントから回答を受け付ける。
正解者が出ると現存の他のクライアントをすべて蹴り、
新規に問題を製作、再び接続待ちにする仕組み。

リスト中にOOPぽくない部分があるけど勘弁してや


おーい15よ。それだと趣旨にあわないだろw
今は一人用の数当てゲームなんだからさ?
なんか、凄いことになってきたなこっちはw

たとえば、ひとつのHelloWorldやるにしても
JavaSpaceからオブジェクト持ってきそうなやつ出てこられてもかなわんな
OOPが主体なんだから・・・だ、だれがネットワークなんて・・・
Javaの技術を使いまくるのが目的じゃないよ、OOPでやればいいのよ

ま、いいけど
29どれどれ:03/07/20 22:42
public class HelloApp {
public static void main(String[] args) {
new HelloApp().run();
}
public void run() {
HelloPrinter.print();
}
}
class HelloGenerator {
static final String HELLO = "Hello world";
public String execute() {
return HELLO;
}
}
class HelloPrinter {
public static void print() {
System.out.println(new HelloGenerator().execute());
}
}
OOのHello world… これくらいが妥当??
475 :デフォルトの名無しさん :03/07/21 22:01
月曜から金曜までの講義のコマ数をint型の配列変数にいれ、繰り返しを用いて「○曜日は○コマの講義があります」と
表示せよ。また1週間のコマ数の合計と1日平均コマ数を計算し、表示せよ。そして合計コマ数が12未満であれば、「コマ数は少ないです」
と表示、12以上15未満であれば「コマ数は数は普通です」と表示し15以上なら「コマ数は多いです」と表示する、プログラムをお願いします。

こんなの
月曜は1コマの講義があります。
火曜は3コマの講義があります。
水曜は3コマの講義があります。
木曜は5コマの講義があります。
金曜は2コマの講義があります。
全部で14コマの講義があります。
1日平均2.8コマの講義があります。
コマ数は普通です。

寂れてきてるので次のネタ!
世界と人とあいさつに分けるべきなんだよ。
>>30
おいこの問題は、「繰り返しを用いて」ってかいてるので
もうこの時点でOOP的にやるにはちょっと難しいよな
んじゃ>>30たんのネタに応えて、
おおまかな設計を書いてみた。

まず一週間分の講義データを格納しておくテーブルクラスを作成。
つぎに講義を数え上げるカウンタークラスを作成。
あとは、カウンターをテーブルの中に放り込んで、
「繰り返し」などをつかってカウンターに講義のコマ数などを数え上げさせて、
「○曜日は○コマの講義があります」などの課題中で指定された文を表示させる。
// この処理はVisitorパターンっぽくすると、おもしろいかも。


もちろん、テーブルクラスに格納する講義データも「講義クラス」としてクラス化。
この講義クラスには、講義をする担当教員や、受講生や、教室などの情報を格納。
さらに、教員クラスや、教室クラスというのも作ったりするとよさそう。
ついでに受講生ひとりひとりもオブジェクト化しておくと、
受講生の出席簿とか、成績の一覧表とかも、いろいろと生成できそうで便利。
// とりあえず、これらは抽象的なクラスにしておくとしても。


なお出題文自体には「月曜から金曜までの講義のコマ数をint型の配列変数にいれ」ともあるので、
int型の配列も、テーブルクラスなどに持たせておく必要がありそう。
ちょっと無理矢理だけど、テーブルクラスに新たな講義を格納したり、取り除いたりすると、
このint型の配列もこれに連動して、自動的に配列内の値を増減させればいいかな。
// int型の配列変数はカウンタークラスに持たせておくという解決法もあるとはおもうけど。
34山崎 渉:03/08/02 02:24
(^^)
35時代は個人主義:03/08/04 14:43


http://osaka.yomiuri.co.jp/new_feature/kokoro/jyuku06.htm

社会福祉法人「いのちの電話」の斎藤友紀雄事務局長は、「『いじめ』は
世界中で起きていますが、日本の場合、その一番大きな原因は、異質なも
のを認めないという精神文化に根ざしていると思います。偏差値教育や核
家族化によって孤独を強いられた子どもたちは、必死に自分の居場所を求
めるのですが、性格や能力が集団と調和しない子は、集団から排除されて
しまう。つまり、村意識が働いて、村八分にされてしまうのです」と語る。

<差別いじめをなくそう>
日本国憲法(国のあり方を定めた法)は、個人主義を定めています。
それは、戦前、全体主義だったわが国が、悲惨な戦争に突入し敗戦したと
いう苦い経験の反省に基づきます。

別にみなが一緒じゃなくてもいいでしょ?
みなが一緒じゃないと安心できない集団がいて、その集団が
異質分子を排斥しようとする。


36時代は個人主義:03/08/04 14:44

A型は仲間を作ろうとする時、自分と価値観やリズムが同じ人ばかりを引
き寄せて、波長の合わない人々を避けてしまう傾向があります。そこには、A型
の、周囲に波風を起こしたくない、できるだけ安定した環境を作っておきたい、と
いう思いが働くからです。そんな風にしているうちに、気がついてみたらA型ば
かりの集団になっていた、ということはよくあります。
価値観がある程度同じ方向に向かっていることは大切なことですが、あまり同じ
ような考えの人ばかりが集まることは危険です。和気合いあいのムードにすっ
かり慣れて、「井の中の蛙」になってしまう恐れがあるからです。
A型は、周囲と協調して現状を安定させたい面と、常に向上心を持って現状を
脱皮したい面の両方を、バランスよく保っていくことで、上手に成長していくので
す。
自分と違う考えの人は、衝突も激しく起こるけれど、自分に良い刺激を与え、視
野を広げることにもなるということを考えてみて下さい。
また、人間関係にもけじめをつけようとするA型は、お客と店員など、立場で態
度を大きく変えたりすることがありますが、行き過ぎれば、やはり好ましくない行
動表現に見えます。

>>18
「Javaの鉄則」を読め
>>37
おまえ、話になってる問題読んでないだろ?
鉄則に当てはめられないから困ってる
39山崎 渉:03/08/15 16:03
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
一応保守
42 :03/10/05 20:58
これも使えよ
44ところてん:03/12/07 17:07
 恐れ入りますが、アプレットではなくアプリケーションで画像を表示する
方法を教えてください。読み込む画像は、GIFかJPEGです。
 一応ネットで調べてみましたが、全部アプレットでの表示でした。
すごい初歩的な質問ですが、お願いしますm(_ _)m
45デフォルトの名無しさん:03/12/07 18:57
自作したFrameクラスを継承したクラスがあるんだろ。
それをmain()でnewするだけでよろしい。
教授もイーアルカンフー

に見えた