- ベストアンサー
Java初心者の高校生、Javaでハイサーグラフを描くプログラムでループがうまく動かない
- アメリカ留学中にJavaのクラスを取った初心者が、ハイサーグラフを描くプログラムでループがうまく動かない問題に直面しています。
- プログラムを実行すると、入力を何度しても質問が最初に戻ってしまい、先に進むことができません。
- BlueJを使って練習しており、IOというものを使用してウィンドウが開き、値を入力することができる仕組みです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>Proceed!を10回表示する、 正解です。 そして, CarクラスのProceedメソッドには繰り返しが書かれていませんよね?VehicleクラスのAdvanceに繰り返しが書かれていて,Proceedを呼び出しているだけで。 =============== 本題に戻ります。 >平均気温の値と降水量を入力してその値を元にグラフィックスで座標平面にハイサーグラフを描くはずが、ループを設定していないにもかかわらず、入力を何度しても、質問が再び最初に戻ってしまうのでその先に進めません。 ハイサーグラフは先ほどのクラスで言う,Carクラスの部分に相当しています。ですから,ハイサーグラフ自身に繰り返しがかかれていなくても, Vehicle相当部分に,繰り返しが書かれていて,ハイサーグラフのpaintメソッドを呼び出している,と考えてください。paintメソッドが,grayLinesメソッドと,blackLinesメソッドと,drawを実行していますから(呼び出す:メソッドを実行すること,と思って下さい)… drawメソッドは「内容を聞く」というのを含むからそれだけの回数が実行されているわけです。 前回と大して変わりません。initメソッドを追加してみました。 ====================== abstract class Vehicle{ protected int gasoline; public abstract void init(); public void Advance(){ for (int i = 0;i < gasoline;i++){ Proceed(); } } public abstract void Proceed(); } class Car extends Vehicle{ public void init(){ gasoline = 5; } public void Proceed(){ System.out.println("Proceed!"); } } public class Example{ public static void main(String[] args){ Car c = new Car(); c.init(); c.Advance(); } } ================== どうなるでしょう? #やべ,前回のコード,コンパイルできなかったかも…。(privateとかpublicが変わってますが,気にしなくていいです。 #複雑になるので,今回はガソリンを減らしていません。 =================================== #本質問の回答へのヒント #ハイサーグラフで,IO.askIntで必要な項目聞くのって,複数回実行されることが前提のCarのProceedとかJAppletクラスのpaintみたいなメソッドじゃなくて最初の1回される奴でいいよね… #描画は毎回しないといけない。例えば,ウィンドウを最小化したり,他のアプリケーションをアクティブにしたりすると,空白になってしまう。必要に応じて勝手にMainに相当するプログラムが呼び出しているのだ。
その他の回答 (3)
- himajin100000
- ベストアンサー率54% (1660/3060)
敢えて答えのソースをずばっと書かないようにしている。 private abstract class Vehicle{ public void Advance(){ for (int i = 0;i < 10;i++){ Proceed(); } } public abstract void Proceed(); } public class Car extends Vehicle{ public void Proceed(){ System.out.println("Proceed!"); } } public class Example1{ public static void main(String[] args){ Car c = new Car(); c.Advance(); } } /* このソースがExampleのmainから始まったらどうなると思う? わからなくても勘で答えてみてくれ。 Appletを使っているときには,このソースのCarの部分しか書いてない(MainとVehicleは書かない)と思ってくれ。 この部分だけ見ると繰り返しはないよね? #俺のAdvanceとかProceedの単語の使い方おかしいかも。 */
お礼
Exampleのmainから始まると、Proceed!を10回表示する、でしょうか? これを参考にして、プログラムを組むことにチャレンジしましたが、うまくできませんでした。 値の入力と、描画はクラスで上(Vehicle,Car,Example)だと、どれにするとうまくいきますか? また、もし値を送るとしたら()内にどう入力すればいいでしょうか?(Graphicsと値入力をうまく同時にできません) もし時間があればよろしくお願いします。 とても勉強になります。ありがとうございます。
- himajin100000
- ベストアンサー率54% (1660/3060)
追記: 今回の問題とは直接関係ないけど 配列 とか java.util.ArrayList<E> とか習った? ==== #あと…別にいいんだけど,クラス名日本語で書いて,アメリカの高校で通じるの?
- himajin100000
- ベストアンサー率54% (1660/3060)
問題。 draw(g) は public void paint(Graphics g) から呼ばれているけど,このpaint(g)はどういうタイミングで何回呼ばれるの? public void init() って奴を調べてみるといいかもね。
お礼
"paint(Grapihcs g)が呼ばれる"という意味がよくわかりませんでした。 public static void main(String[] args) を使うということですか? public void init()調べてみましたが知識が無いためわかりませんでした。 java.util.ArrayList<E>も調べましたが、まだ頭が足りないようなので、一から順番に勉強することにしました。 配列は、intやdouble,charなどいくつかの種類があり、それによって入れられるデータの大きさが変わるということはわかります。 今はすでに帰国したので日本にいますがアメリカにいるときは説明もすべて英語で書いていました。 回答ありがとうございました
お礼
今回は、Proceed!を5回表示する、だと思いました。 himajin100000さんのプログラムを参考にして、気温や降水量を聞き、それをSystem.out.printlnで表示するプログラムを書くことに成功しました。ありがどうございます。 そこまではできるのですが、Graphicsにしようとするとどうもうまくいきません。 VehicleやCarにあたるクラスをAppletにしたりいろいろ試してみましたが、クラス間でうまくいかないようです。 もうひとつ他のクラスを作ってmainから呼び出そうと考えたのですが、どうしてもGraphicsをmainから呼び出せません。mainをAppletにしてもうまくいきませんでした。 ネットで調べたFrameをextendしてみましたが、それもうまくいきませんでした。 アプレットを使わずに描画する方法はありますか? 質問ばかりですみません。 もし差しつかえなければよろしくお願いします。