ID非公開さん
2022/1/20 23:54
3回答
C言語についての質問です。関数とポインタについてです。
C言語についての質問です。関数とポインタについてです。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13129772043 を参考にしております。 1 | 2,2 | 3,3,3 | 4,4,4,4 | 5,…… と続く群数列について (1)第200項の値を求めよ。 (2)先頭から第200項までの和を求めよ。 という問題を関数とポインタの使い方の練習として、C言語を用いて解こうとしていましたが、以下のコードでおかしいところはありますでしょうか。 もっと簡単にコードを書けそうではありますが、今回は敢えてポインタの使い方の練習として、2次元配列を引数にしてint型ポインタをリターンさせる形にしております。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define N 300 int *gunsuretsu(int (*)[N],int *); int main(void) { int a[N][N]; int b[N]; int *ans1; int ans2 = 0; ans1 = gunsuretsu(a,b); printf("The answer of (1) is %d\n",*ans1); for(int ele=1;ele<=200;ele++) { ans2 += b[ele]; } printf("The answer of (2) is %d\n",ans2); return 0; } int *gunsuretsu(int (*row)[N],int *insert) { int num = 1; for(int i=1;i<120;i++) { for(int j=1;j<=i;j++) { row[i][j] = i; } } for(int m=1;m<120;m++) { for(int n=1;n<120;n++) { if(row[m][n] != 0) { insert[num] = row[m][n]; num += 1; } } } return &insert[200]; }
ベストアンサー
以下、修正例です。 (1)11行目 【修正前】for (int j = 1; j <= i; j++) 【修正後】row[i][i + 1] = 0; for (int j = 1; j <= i; j++) この後にある22行目の if (row[m][n] != 0) で row[m][n] が 0 かどうかを確かめていますが、これは row の内容が 0 で埋まっている前提に基いていると考えられます。しかし、実際のところ row は main 内の a であり、この a は自動変数であることから、その全内容は初期状態で出鱈目な値となります。 そういうわけで、後続の if 文が正しく動作できるよう、row[i][i+1]に予め 0 を入れておく形としてみました。 (2)22行目 【修正前】if (row[m][n] != 0) 【修正後】if (row[m][n] == 0)break; この次の24行目と共に row[m][n] が 0 以外の場合に insert[num] に row[m][n] を代入するという処理が実装されています。しかし、row[m][n] が 0 となったときはどうなるのでしょう。確かに insert[num] への row[m][n] の代入は行われません。でも、これを含む for 文は続けられます。結果として insert[num] には出鱈目な値がどんどん設定されている格好となります。 row[m][n] == 0 となった時点で内側の for 文を終わらせるようにしました。 (3)25行目 【修正前】num += 1; 【修正後】num += 1; if (num > 200) { m = N; break; } num が 200 を超えても処理が続くというのは困りますから、このように if 文を追加して外側の for 文も含めて終わらせるようにしました。
1人がナイス!しています
ID非公開さん
質問者2022/1/21 22:35