• ベストアンサー

ソースの内容

public class Power1{ public static void main (String[] args){ System.out.println(getPower 8,2); } /*xのn乗の計算*/ public static int getPower(int x, int n){ int y=1; for(int i = 0; i<n; i++){ y =y*x; } return y ; } } というソースの解釈をお願いします。実行結果は64になります。 私の解釈;まず、8と2でxとnを初期化。次にメソッドgetPowerの内容を実行。yを1で初期化。iを1で初期化。今、i=0に対してn=2であるのでi<nを満たしている。よってy=y*xが実行されy=1*2=2となりyに2が代入される。i++でi=1になる。i<nを満たすのでy=2*8=16が計算され、yに16が代入される。i++でi=2となる。i=nとなるのでfor文を外れ、return文へ。y=16が戻り値としてgetPowerメソッドに返される。再びfor文に入る。y=1,i=1で初期化される。。。なんか元に戻ってしまいましたwこんな具合で64になりません↓どこかの解釈が間違っているんでしょうがどこだかわかりません。このソースの解説で「nが0のとき、for文は一度もまわらないので戻り値は1になる」と説明されているんですがそもそもnは2で固定されているのではないでしょうか?と私は考えてしまいます。(これも明らかに間違いなんでしょうけど) どなたかこの積もりに積もった疑問に対してアドバイスをもらえないでしょうか。お願いします。

  • Java
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

1.java Power1 を実行 >public class Power1{ >public static void main (String[] args){ 2.メインメソッドが開始される。 >System.out.println(getPower(8,2)); 3.System.out.println命令実施しますが、その前にgetPower関数が呼び出されます。4.に進む。 8.getPowerメソッドの戻り値(64)がSystem.out.println命令出力される。 } /*xのn乗の計算*/ public static int getPower(int x, int n){ 4.getPowerメソッドがx=8 n=2で呼び出される。 int y=1; for(int i = 0; i<n; i++){ y =y*x; } 5.forループ前の変数の値 y=1 x=8 n=2 6.forループ開始 1回目のループ→i=0なのでループ内に入る。(i<n→0<2) y=y*x(y=1*8なのでyには8が代入される) 2回目のループ→i=1なのでループ内に入る。(i<n→1<2) y=y*x(y=8*8なのでyには64が代入される) 3回目のループ→i=2なのでループを抜ける。(i<n→2<2) return y ; 7.呼び出し元のmainメソッドにyの値を返しgetPowerメソッド終了(y=64) } } No2さんと説明していることは一緒かと思います。

solution64
質問者

お礼

めちゃくちゃ丁寧な解説ありがとうございます! 納得できました! このプログラムに関してはもう分からないところはないです、本当に感謝です!

その他の回答 (3)

回答No.3

>また、voidは戻り値のないことを表すのになぜ戻り値を返すのでしょうか? >public static int getPower(int x, int n){ int型の戻り値を返していますよね? ほかの部分についてはNo2さんが解説してくださっていますのでそちらをご覧になるとよろしいでしょう。 >エラーが出てしまって確認できませんでした、すみません。 お言葉を返すようで恐縮ですが、恐らく質問者さんの修正の方法に問題があるためのエラーかと思われます。

solution64
質問者

お礼

その通りです、エラーが出たのは私に原因があります。 public static int getPower(int x, int n){ にint型の戻り値を返してこのプログラムは終了ということですか?No2さんによると、mainメソッドにに返されるとコメントされていますがどうちがうのでしょうか。おそらくお二人のコメントには違う意味合いが含まれていることと思いますが私の勉強不足で混乱気味です。面倒なやつですみません。。

回答No.2

見やすく改行してます。 >まず、8と2でxとnを初期化。 厳密には「初期化」とはいわないけど、まずOK >次にメソッドgetPowerの内容を実行。yを1で初期化。 OK >iを1で初期化。今、i=0に対してn=2であるのでi<nを満たしている。 NG 「i=0」なので「iを0で初期化」 >よってy=y*xが実行されy=1*2=2となりyに2が代入される。 NG この時点で「x = 8」、従って「y = 1*8 = 8」。 >i++でi=1になる。 OK >i<nを満たすのでy=2*8=16が計算され、yに16が代入される。 一部NG 「i<n」は満たしているが、前述の通り「y=8」。 従って「y=8*8=64」 >i++でi=2となる。 OK >i=nとなるのでfor文を外れ、return文へ。 OK >y=16が戻り値としてgetPowerメソッドに返される。 一部NG yが戻り値として返されるが、yの値は前述の通り「64」。 「getPowerメソッドを実行」しているのであって「main(正確には、mainで実行使用としている、System.out.println)」に返される」 >再びfor文に入る。y=1,i=1で初期化される。。。 NG 提示ソースではreturnでmainに戻って終わり。入らない。

回答No.1

>私の解釈;まず、8と2でxとnを初期化。次にメソッドgetPowerの >内容を実行。yを1で初期化。iを1で初期化。 >for(int i = 0; i<n; i++){ iは0から開始されます。 >今、i=0に対してn=2であるのでi<nを満たしている。よってy=y*xが >実行されy=1*2=2となりyに2が代入される。i++でi=1になる。 >System.out.println(getPower 8,2); >public static int getPower(int x, int n){ 引数xは8なのですから、 y=1*8なのでyの値は8です。 getPowerの中に変数内容を出力するように手を加えてみましたので、実際に動作させて結果を確認してみてください。 public static int getPower(int x, int n){ int y=1; System.out.println("x:" + x + "/n:" + n); for(int i = 0; i<n; i++){ y =y*x; System.out.println("i:" + i + "/y:" + y); } return y ; }

solution64
質問者

お礼

いろいろタイプミスがあったのでもう一度訂正して投稿しました。すみません。このミスに伴い質問も変わってきてしまいました↓ >getPowerの中に変数内容を出力するように手を加えてみましたので、実際に動作させて結果を確認してみてください。 エラーが出てしまって確認できませんでした、すみません。 public class Power1{ public static void main (String[] args){ System.out.println(getPower 8,2); } /*xのn乗の計算*/ public static int getPower(int x, int n){ int y=1; for(int i = 0; i<n; i++){ y =y*x; } return y ; } } というソースの解釈をお願いします。実行結果は64になります。 私の解釈;まず、8と2でxとnを初期化。次にメソッドgetPowerの内容を実行。yを1で初期化。iを0で初期化。今、i=0に対してn=2であるのでi<nを満たしている。よってy=y*xが実行されy=1*8=8となりyに8が代入される。i++でi=1になる。i<nを満たすのでy=8*8=64が計算され、yに64が代入される。i++でi=2となる。i=nとなるのでfor文を外れ、return文へ。y=64が戻り値としてgetPowerメソッドに返される。再びfor文に入る。y=1,i=1で初期化される。。。なんか元に戻ってしまいました。これは何回も64が表示されるということでしょうか。どこかの解釈が間違っているんでしょうがどこだかわかりません。このソースの解説で「nが0のとき、for文は一度もまわらないので戻り値は1になる」と説明されているんですがそもそもnは2で固定されているのではないでしょうか?と私は考えてしまいます。(これも明らかに間違いなんでしょうが)また、voidは戻り値のないことを表すのになぜ戻り値を返すのでしょうか?

関連するQ&A

  • プログラムのスレッド化について。

    以下の処理をスレッド化しようとしています。 public class FCP{ int N=10 long LOOP_MAX=100 double x[][] = new double[N][4] int g[][] = new int[N][4] boolean y[][] = new boolean[N][4]//出力 boolean A[][] = new boolean[N][10] double T=0.5 Set_Adjacent_Matrix() //A配列にtrueとfalseを代入 Set_initial_value() //y配列に初期値を代入(Math.random()>0.5) g1(int i, int j) //k<4 sum=1 if( y[i][k] == true ) --sum return(double)sum g2(int i, int j) //k<N sum=0 if( y[i][j] == true ) if( y[k][j] == true && A[i][k] == true ) --sum return(double)sum Display_output() //結果表示 if( y[i][j] ) System.out.print("0") else System.out.print(".") public static void main(String args[]) { long loop; int i, j, k; Set_Adjacent_Matrix(); Set_initial_value(); for( loop=0; loop<LOOP_MAX; loop++ ){ for( i=0; i<N; i++ ){ for( j=0; j<4; j++ ){ x[i][j] = g1( i, j ) + g2( i, j ); if( y[i][j] ){ x[i][j] += T; }else{ x[i][j] -= T; } if( x[i][j] > 0.0){ y[i][j] = true; }else{ y[i][j] = false; } } } Display_output(); } } 今回Threadクラスの継承を使ってスレッド化しようと考えました。runメソッドには上のプログラムのmain部分の処理をさせようと思っています。そしてstartメソッドで必要な数(Nの値=10コ)のスレッドを生成しrunメソッドを実行する。 と、ここまではわかったのですが、「生成された各スレッドの番号を保持し、そのスレッドに担当させる処理を決める」という部分をどうすればいいのかわかりません。 「i(1~10)番目のスレッドはN(1~10)列目の処理を担当している」という風にするにはどうしたらいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 昇進者です。 戻り値の学習をしていますが。

    *を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ですか。

  • C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに

    C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに困っています。 以下の点に留意して、階乗を計算するプログラムを作成する。 階乗とは、数字を1つづつ減らしながら掛け合わせたものです。つまり 5の階乗:5×4×3×2×1=120 3の階乗:3×2×1=6 となります。 main内 1)整数型の変数kazu、kekkaを宣言する。 2)“階乗を計算します。”を表示する。 3)実行例と同様の表示になるように、“整数を入力してください”を表示し、入力された値を、変数kazuに読み込む。 4)作成する関数名は、kaijyoとし、kazuを引数とし、戻り値をkekka に代入する。 6)“○の階乗は ○です。”と表示する。 関数kaijyo内 1)引数を変数名xとする。 2)整数型の変数i、valを宣言する。 3)計算結果をvalに入れていくために、valを初期化する(下記注意参照)。 4)iをカウンターとするfor文と複合代入演算子を使って階乗を計算する。 5)valの内容が戻り値となるようにする。 注意:階乗を計算するために、for文の中で複合代入演算子を使って階乗を計算します。しかし、for文に入る前のvalの初期化には注意が必要です。0に何を何回かけても0だと言うことを思い出してください。 という問題です。 それで私は下の通りに作りました。 #include <stdio.h> int kaijyo(int x); void main(void) { int kazu,kekka,kaijyo,sum; printf("階乗を計算します。\n"); printf("整数を入力してください"); scanf("%d",&kazu); kekka=kaijyo(kazu); printf("%dの階乗は%dです。",kazu,kekka); } int kaijyo(int x) { int i,val; val=1; x=1; for(i=1;i<=val;i++){ x=x*i; } return val; } しかし、メイクして実行してもどの階乗でも256になってしまいます。 どこが間違っているのか分からずに困っています。 よかったら教えてください。 よろしくお願いします。 カテゴリを間違ってしまっていたらすみません。

  • c言語 パスカルの三角形

    c言語でパスカルの三角形を出力するプログラムを作りたいのですが、上手くいきません。 何を直せばいいのか教えてください。 #include <stdio.h> #define N 10 int main(void){ int i, j = 1, x, y; int d[N][N]; /* 三角形を作成 */ for (i = 1 ; i < N ; i++){ d[i][0] = 1; while (j <= i - 1){ d[i][j] = d[i-1][j-1] + d[i-1][j]; j ++; } } /* 三角形の表示 */ for (y = 0; y < N; y++) { for (x = 0; x < N-y; x++) printf(" "); for (x = 0; x < y; x++) printf("%3d ", d[x][y]); printf("\n"); } return 0; } 実行結果 -2147417616 2665208 1629976532 1627572249 1629101723 1 1629982744 2665256 2665548 3407923 1629345053 1627571017 0 3538997 1629739051 10 1629345053 2665368 3670071 2665384 1629739040 1627927140 2665244 1628040295 57 1628810863 1629476960 1628602749 2665560 2665304 1629345053 0 1629739040 1629740576 1628992224 2 4411498 1628040588 -2147417600 0 1629476960 1629740664 1629739040 1 267574 0

  • webでプログラミング repl.itの利用

    Web上でC++の実行をしようとrepl.itを使いました。 しかし、C++でプログラミングを実行しようとしても exited with non-zero status というエラーが出てしまいます。 これの解決方法をお願いします。 また、単にソースがおかしいことも考えられるので載せます。 #include <stdio.h> #include <math.h> int main(){ int x,y,i; printf("xに代入する値を決めてください。x="); scanf("%d",x); for(i=0;i<x;i++){ y=y+2; } printf("y=%dです。",y); return 0; }

  • 静的変数と静的メソッドの使い方について

    独習JAVAにてJAVAを学習しています。「コマンドライン引数を受け取り、それをスペイン語表記に変換して表示するアプリケーションを作成しなさい。例えば、OneはUno、・・・、FiveはCincoになります。静的メソッドを使って実現しなさい」という問題で躓きました。以下、私が作成したプログラムです。 class Language { static String st[] = new String[5]; //静的初期化ブロックは実行しない。 //コマンドライン引数を受け取るmainメソッドが使えないため //静的メソッド static String translation(){ for(int i = 0; i < st.length; i++) { if(st[i] == "One") return st[i] = "Uno"; if(st[i] == "Two") return st[i] = "Dos"; if(st[i] == "Three") return st[i] = "Tres"; if(st[i] == "Four") return st[i] = "Quatro"; if(st[i] == "Five") return st[i] = "Cinco"; } } //21行目 } class StaticalMethodPractice { public static void main(String args[]) { //mainメソッドが登場したので、静的変数を初期化する for(int i = 0; i < Language.st.length; i++) Language.st[i] = args[i]; //静的メソッドを実行 System.out.println(Language.translation()); } } このプログラムに対して、21行目return文が指定されていませんというエラーメッセージが出てくるのですが、そもそもreturnの使い方もよく分からないので右往左往している状況です。低級な質問かもしれませんが、よかったらアドバイスの方よろしくお願いします。

  • C#のソースコードについての質問です

    using System; public class kkk { public static void Main() { ddd d = new ddd(); int i = d.knapsack(0, 0); Console.WriteLine("" + i); } } public class ddd { int[] ws = new int[] { 3, 4, 1, 2, 3, }; int[] ps = new int[] { 2, 3, 2, 3, 6 }; int maxw = 10; public int knapsack(int n, int w) { if (w > maxw) return -1; if (n >= ws.Length) return 0; return Math.Max(knapsack(n + 1, w), knapsack(n + 1, w + ws[n]) + ps[n]); } } このコードを書いたらエラー 1 静的でないフィールド、メソッド、またはプロパティ 'kkk.d' で、オブジェクト参照が必要です というエラーがでてきました、構文が間違っているところが分かりません どなたか教えてください

  • メモリ動的確保に関するAP試験問題

    H23年秋のAP(応用技術者試験)についてどうしても理解(納得?)できない 下記問題についてお教えください。 (問)メインプログラムを実行した結果はどうなるか?ここでは、staticは、静的割り当てを、autoは動的割り当てを表す。 -----------------------メインプログラム-------------------------- auto int x,y; x=f(2)+f(2); y=g(2)+g(2); ------------------------------------------------------------------- ------------------------------f(u)-------------------------------- auto int u; auto int v=1; v=v+u; return v; ------------------------------------------------------------------- ------------------------------g(u)-------------------------------- auto int u; static int v=1; v=v+u; return v; ------------------------------------------------------------------- (答) x=6 y=8 このg関数を無理やりCで書くと以下の様でしょうか? int g(int u){ int *v; v=malloc(sizeof(int)); *v=1; *v=*v+u; return *v; } freeしていない時点で問題ですが、どっちみちvの指す領域を1で初期化しているので 何度呼び出しても戻り値は同じです。 さらに仮に初期化をしないにしても関数を抜けた時点で関数の領域は開放されるので 何度関数を呼び出しても戻り値は同じになります。 ご指摘を宜しくお願い致します。

  • 複素数の絶対値について

    このプログラムでx2[i]y2[i]の絶対値の2乗がほしいんですけどどうすればよろしいで しょうか?? #include <stdio.h> #include <stdlib.h> #include <math.h> #define PI 3.14159265358979323846 /*省略*/ /* FFT main routine */ int fft(n, x, y) /*省略*/ /*** Main Program ***/ #define N 256 int main(argc, argv) int argc; char *argv[]; { FILE *fp; int i; static float x1[N], y1[N], x2[N], y2[N], x3[N], y3[N]; if ((fp = fopen(c1.txt, "r")) ==NULL){ printf ("File Open Error \"%s \" file.\n", c1.txt); exit(1); } for (i = 0; i < N; i++) { fscanf(fp, "%f", &x1[i]); x2[i] = x1[i] ; y1[i] = y2[i] = 0; } if (fft(N, x2, y2)) return EXIT_FAILURE; for (i = 0; i < N; i++) { x3[i] = x2[i]; y3[i] = y2[i]; } if (fft(-N, x3, y3)) return EXIT_FAILURE; printf(" Original data Fourier Transformed Inverse Transformed\n"); for (i = 0; i < N; i++) printf("%4d | %6.3f %6.3f | %6.3f %6.3f | %6.3f %6.3f\n", i, x1[i], y1[i], x2[i], y2[i], x3[i], y3[i]); return EXIT_SUCCESS; }

  • C/C++の配列について

    配列の作り方について nは特定の数でarr[3]以降の値をfor文で代入したいのですが 同じfor文で値を代入すると(1)は不正解で(2)が正解になります 小さい数だと見た目は同じで何が違うのか解らないのですが、これは何がちがうのでしょうか? (1)の0, 0, 1以降は全て初期値として0が入ると認識してたのですがそれも違いますか? (1) int arr[n]={0, 0, 1}; (2) int arr[n]; arr[0]=0; arr[1]=0; arr[2]=1; for (int i=3; i<n; i++) { arr[i]=略 } よろしくお願いします

専門家に質問してみよう