• 締切済み

昇進者です。 戻り値の学習をしていますが。

*を10個表示するプログラムですが。 public class Graph1 { public static void main(String[] args) { printGraph(10); } public static void PrintGraph(int x) for(int i = 0; i < x; i++){ System.out.println("*"); } System.out.println(""); } } のprintGraph(10);は何のためにあるのですか? 10がxに代入されていますよね。戻り値はxですか。

みんなの回答

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.7

>「mainの方が先に実行される」の「実行される」は、PrintGraphメソッドを呼び出していることですか。 そうですね。今回のコードでプログラムの実行順序は 1.mainメソッドが実行される、つまりmainメソッドの中身を実行する。  →mainメソッドの中のprintGraph(10);が実行される、つまりprintGraphメソッドが引数10で呼び出される。 2.printGraphメソッドが呼び出され、実行される。  →forループが実行され、最後にSystem.out.println("");が実行される。 とまあ、こんな感じです。

jlnh
質問者

お礼

ありがとうございました。 これを知らないと始まりませんよね。

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.6

>10もxも引数で、メゾットの名前が同じだと、先に書いた値(10)が後に書いた(x)に代入されるのですね。 どうして。 ではなく、そういう性質なのですか? プログラムには実行する順番があって、(細かい話は省略しますが)mainメソッドは一番最初に実行されます。 そこで、PrintGraphメソッドを呼び出しているのです。 >最初から10にしてしまった方がよいと思いませんか? PrintGraph(10); という文の次の行に、 PrintGraph(20); と追加してコンパイル、実行してください。 *が10個表示され、次の行に20個表示されます。 最初から10にしてしまうと、後から「20個表示したい」となったときに、 「20個表示するバージョン」として同じようなコードをまた書かないといけません。 それが非常にメンドウなので、まとめてかけるところはまとめておき、 「何回」にあたる部分(変わるかもしれない部分)を引数にしておくのです。 メソッドと引数はだいたいこんな感じに使われます。 あとNo1さんの言っている「戻り値がvoidである」というのは、 とりあえず今のうちは「戻り値はない」と同じ意味と思ってもらって結構です。 厳密には違いますが、何がどう違うかはもう少し経ってから調べてみてください。 今調べても余計に混乱するだけだと思いますので…

jlnh
質問者

補足

あっ、なるほど。たしかに2番目のメソットには、10でも20でも複数の引数をXに代入できますね。「mainの方が先に実行される」の「実行される」は、PrintGraphメソッドを呼び出していることですか。 

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.5

>最初から10にしてしまった方がよいと思いませんか? その場合、public static void printGraph() { ... } と引数なしの関数として、これまで x が書かれていた箇所を 10 に置き換えることにります。 しかし、単純に 10回 * を印字するだけなら、そもそも関数にする意味すらありません。 質問文には * を 10回印字する、としか記載されていないので、前後関係がまったくわかりませんが、通常 * を 10回印字する「だけ」のプログラムはありません。 人は構造化されていないコードの羅列を理解することが困難なので、 printGraph(10); と「10回 * を印字する」という機能を切り出すことで、保守性を向上させていると考えるとよいでしょう。

jlnh
質問者

お礼

結果は同じでも、プログラムは何通りもあるのですね。

noname#119918
noname#119918
回答No.4

誤解があるようですので、別の角度から説明します。 記述の順序が関係するのならば、次のコードは違う動作をするはずです。 (mainとPrintGraphの順序を入れ替えてあります。) 実際にはそんなことはなく、同じ動作をします。 この意味をよく考えてください。 public class Graph1 { public static void PrintGraph(int x) for(int i = 0; i < x; i++){ System.out.println("*"); } System.out.println(""); } public static void main(String[] args) { printGraph(10); } } 関数とは機能の切り出しです。 PrintGraph関数は「x回"*"を表示する」という機能を切り出したものです。 そして具体的に何回かを決めるために引数を与えるのです。

jlnh
質問者

お礼

ありがとうございました。 自分なりにまたひとつ前進しました。

jlnh
質問者

補足

再度、程度の低い質問に付き合っていただきありがとうございます。 そして具体的に何回かを決めるために引数を与えるのです。> public static void main(String[] args) { printGraph(10); }のように、引数を用意するよりも public static void PrintGraph(10)として、最初から10にしてしまった方がよいと思いませんか? それでは引数と戻り値を習う意味がなくなってしまいますか。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

>10もxも引数で、メゾットの名前が同じだと、 >先に書いた値(10)が後に書いた(x)に代入されるのですね。 まったく違う。 最初の方にある printGraph(10); は関数の呼び出し。10は引数 後半にある public static void printGraph(int x)... は関数の定義。x は仮引数。 もう一度参考書を最初からよ~く読んだ方がよい。

noname#119918
noname#119918
回答No.2

関数PrintGraphは次のように宣言されていますよね。 public static void PrintGraph(int x) public,staticはこの質問に関しては、本質的ではないので、説明を省略します。 1.void 戻り値の型がvoidである、つまり戻り値がないことを表しています。 例えば、戻り値が整数ならば、ここはintとします。 2.int x 引数の型がint(整数)であることを示しています。 そして、PrintGraph中で、その引数を変数xで参照できることを示しています。 main関数中で、PrintGraph(10)と呼び出している箇所がありますね。 これは、PrintGraph関数を引数10で呼びます。 そして、PrintGraph関数中に、for(i=0 ; i<x ; i++) というループがあります。 引数x=10なので、このループは10回まわることになり、結局"*"が10回出力されます。

jlnh
質問者

補足

10もxも引数で、メゾットの名前が同じだと、先に書いた値(10)が後に書いた(x)に代入されるのですね。 どうして。 ではなく、そういう性質なのですか?

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>printGraph(10);は何のためにあるのですか? * を10個印字するためです。 >戻り値はxですか。 printGraph() の戻り値は void です。 (補足) あなたは何も理解できていません。Java の入門書を1冊買いましょう。

jlnh
質問者

補足

結城浩の「java言語プログラミングレッスン」という本を使っています。 上記は「戻り値がないメゾット」の例なのですが・・・

関連するQ&A

専門家に質問してみよう