質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2985閲覧

グラフを表示するプログラムがうまく読めないので教えて欲しい

prog1717nm

総合スコア56

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2016/07/17 00:35

public

1 public static void main(String[] args){ 2 for(int i=-8; i<=8; i++){ 3 if(i<0){ 4 printGraph(getPower(i,2),'-'); 5 }else{ 6 printGraph(getPower(i,2),'+'); 7 } 8 } 9 } 10 /*xのn乗の計算*/ 11 public static int getPower(int x, int n){ 12 int y=1; 13 for(int i=0;i<n;i++){ 14 y=y*x; 15 } 16 return y; 17 } 18 /* '*'でグラフ表示 */ 19 public static void printGraph(int x){ 20 printGraph(x,'*'); 21 } 22 /* 指定した文字でグラフ表示 */ 23 public static void printGraph(int x, char c){ 24 for(int i=0;i<x;i++){ 25 System.out.print(c); 26 } 27 System.out.println(" "); 28 }

上のプログラムは私が作成したわけではないので解読に困っています。いくつか疑問があります。作成した人にきくのは不可能なので教えて欲しいです。
まず、getpowerメドッドではメインメソッドより、x=i,n=2となっているのでfor文が2回繰り返されてy=i*iとなりiの2乗が戻り値になっていますが、メインメソッドのどこに戻ったのでしょうか?メインメソッドにはyという文字はないのですが...。また3つのメソッドでxが出てくるのですがこれは何を表しているのでしょうか?あとcもいまいちよく分かりません。全体的に引数の理解に苦しんでます。
初心者であまりよく理解できていないので教えてくださると大変助かります。よろしくお願いします。

raccy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず、getpowerメドッドではメインメソッドより、x=i,n=2となっているのでfor文が2回繰り返されてy=i*iとなりiの2乗が戻り値になっていますが、メインメソッドのどこに戻ったのでしょうか?メインメソッドにはyという文字はないのですが...。

メソッドの戻り値はメソッドを呼び出した場所に戻ります。例えばmainメソッドのループの最初、i=-8で入った際に

java

1printGraph(getPower(i,2),'-');

が実行されます。この時、getPower(-8, 2)が処理されます。
メソッドの中のyという変数は、メソッドの処理のために宣言した変数で、ローカル変数と呼びます。呼び出し元の変数とは何ら関わりありません。実際にこのgetPowerを、x=-8,n=2で実行すると、yは64になります。
最後のreturn yでは、この最後の状態でのyの値、今回の場合は64を戻すという意味になります。その結果、getPower(-8, 2)の結果が64とわかったので、上記文のi=-8における文は

java

1printGraph(64,'-');

と同じ意味ということになります。

また3つのメソッドでxが出てくるのですがこれは何を表しているのでしょうか?あとcもいまいちよく分かりません。全体的に引数の理解に苦しんでます。

まず確認して欲しいのは、3つのxはそれぞれのメソッドの仮引数として宣言されているため、お互いに無関係ということです。ただ単に最初の引数を表すシンボルとして使用しているだけで、この3つのxに直接的な関係はありません。
メソッドの引数は実行時に渡される情報です。例えば先程の文の続きを考えると、printGraphメソッドの引数としてint型(64)、char型('-')の順に値が渡されています。したがって、printGraph(int x, char c)のメソッドが、x=64, c='-'として実行されます。
最初のiの値が変わった時には、getPowerの値も変わるので実行結果も変わります。このように、似たようなことを実行する際に、引数だけ変化させて実行することでいろいろな結果を得ることができるのです。

投稿2016/07/17 01:17

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prog1717nm

2016/07/17 06:33

回答ありがとうございます。だんだん分かってきました。回答を踏まえてまた新たに疑問が出てきました。 まず、1つ目のprintGraphメソッドは引数がxだけで、2つ目のprintGraphメソッドは引数がxとcなのはなぜでしょうか。あと、1つ目のprintGraphメソッドとmainメソッドのつながりはどうなっているのでしょうか。1つ目のprintGraphメソッドで一旦、*でグラフをかき、そのあとで指定した文字でグラフをかくという解釈であっていますか。 何回もきいてしまってすみません。回答いただけたら嬉しいです。よろしくお願いします。
swordone

2016/07/17 08:49

Javaのメソッドは、同一名でも引数の数・型が違えば別メソッドとして認識されます。実行する際にはメソッド名と引数の数・型により、起動する最適なメソッドが選択されます。この仕組みをオーバーロードと呼びます。 mainメソッドから呼んでいるのはここでは2つ目のprintGraphだけで、1つ目は呼ばれていません。もしmainメソッドからのprintGraphの呼び出しで、それぞれ2番目の引数('+'や'-')を取り除くと、1番目のprintGraphが呼び出され、'*'でグラフが描かれることになります。 printGraphが2つある目的としては、2番目の引数を省略すればデフォルトとして'*'を使ったグラフを、2番目の引数に何かしら文字を指定するとそれを使ったグラフを描く、という動作をさせるためです。
guest

0

main関数で

printGraph(getPower(i,2),'-');

とあるのは、getPower()関数の戻り値 y がそのまま printGraph() 関数の第一引数に渡されています。

次のコードと等価です。

y = getPower(i,2); printGraph(y,'-');

printGraph() 関数は指定した回数、指定した文字でグラフを書くための関数ですね。

以下追記

プログラミングとは直接関係ないですが、、、
デバッガでステップ実行すると、どのようにプログラムが動くか、その時の変数の値等が確認できるので、
動かしてみると覚えるのも早いですよ。

投稿2016/07/17 01:13

編集2016/07/17 01:40
moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問