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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

672閲覧

C言語 ポインタ 行列

kun_monimoni

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/08/29 07:36

編集2020/08/29 07:43

秋学期の授業のために、夏休み中に自主勉強としてやっているものです。

キーボードから次元 N を入力した後,N × N の配列の各行の合計を求めて,どの行の合計が最大かを表示するプログラムである.

上記のような問題で、下記のようにソースコードを書いたのですが、出力がおかしくなってしまいます。
確かめていただける方やわかる方いらっしゃいましたらご指摘していただけるとありがたいです。ポインタは秋学期の授業で勉強する内容ということもあり、これ以上は原因がわかりませんでした、、、。どうぞよろしくお願いいたします。

#include <stdio.h> #include <stdlib.h> int main(void){ int i,j,N,bmaxno=0; double *A,*ai,*b,bmax = 0.0; printf("N= "); scanf("%d",&N); A= (double *) malloc(N*N*sizeof(double)); if(A==NULL){ printf("Can’t allocate memory.Y=n"); exit(1); } b= (double *) malloc(N*sizeof(double)); if(b==NULL){ printf("Can’t allocate memory.Y=n"); exit(1); } ai = A; for(i=0;i<N;i++){ for(j=0;j<N;j++){ printf("A[%d][%d] = ",i,j); scanf("%lf",&ai[j]); } ai+=N; } for(i=0;i<N;i++){ for(j=0;j<N;j++){ b[i]+=ai[j]; } printf("b(%d) = %f\n", i, b[i]); } for(i=0;i<N;i++){ if(bmax <b[i]){ bmax = b[i]; bmaxno = i; } } free(A); free(b); printf("%d is Maxnumber\n",bmaxno); return 0; } コード

このソースコードで実行しますと、出力が以下のようになってしまい、各行の合計を表すb(i)が全て0になってしまいます。これを直すにはどのようにすればよろしいでしょうか。よろしくお願いいたします。

N= 3
A[0][0] = 9
A[0][1] = 8
A[0][2] = 7
A[1][0] = 1
A[1][1] = 2
A[1][2] = 3
A[2][0] = 2
A[2][1] = 3
A[2][2] = 4
b(0) = 0.000000
b(1) = 0.000000
b(2) = 0.000000
2 is Maxnumber

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • 問題点1:aiが範囲外を指している。

二度目のforの前にai = A;aiが正しい位置を指すようにしてください。

C

1 ai = A; 2 for (i = 0; i < N; i++) { 3 for (j = 0; j < N; j++) { 4 printf("A[%d][%d] = ", i, j); 5 scanf("%lf", &ai[j]); 6 } 7 ai += N; // ここでaiをN要素後ろにずらしています 8 } 9 10 //ここでaiはA[N*N]をさしています。 11 for (i = 0; i < N; i++) { 12 for (j = 0; j < N; j++) { 13 b[i] += ai[j]; // 範囲外アクセス 14 } 15 printf("b(%d) = %f\n", i, b[i]); 16 }
  • 問題点2:bに領域を確保だけして0初期化していない。aiが指す位置をずらしていない。

for (j = 0; j < N; j++) {の前でb[i] = 0;とでもして0初期化してください。
各行の合計ならfor (i = 0; i < N; i++) {の最後でaiが指す位置をN要素後ろにずらしてください。

C

1 b = (double*)malloc(N * sizeof(double)); 2//中略 3 for (i = 0; i < N; i++) { 4 for (j = 0; j < N; j++) { 5 b[i] += ai[j]; // bの内容を0初期化していないため不定値 6 } 7 printf("b(%d) = %f\n", i, b[i]); 8 // 各行の合計ならここでaiをN要素後ろにずらす(ai += N;)のでは? 9 }
  • 問題点3:bmax0初期化している。

すべて0未満の数を入力された場合、合計値が最大値の列を正しく求められない。
b[0]の値をbmaxに格納しておかないと正しく比較できません。

C

1 // ここでbmax = b[0];としておくべき。 2 for (i = 0; i < N; i++) { 3 if (bmax < b[i]) { 4 bmax = b[i]; 5 bmaxno = i; 6 } 7 }

投稿2020/08/29 07:47

編集2020/08/29 08:08
SHOMI

総合スコア4079

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

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

kun_monimoni

2020/08/29 08:41

ありがとうございます。 教えていただいたようソースコードを変更したところ以前よりはうまくいったのですが、 N= 2 A[0][0] = 1.0 A[0][1] = 2.0 A[1][0] = 3.0 A[1][1] = 4.0 b(0) = 3.000000 b(1) = 231584192301797364411909831297017744263647873515383991293188759304378525941760.000000 1 is Maxnumber となってしまいます。原因はわかるでしょうか。よろしくお願いいたします、、。
kun_monimoni

2020/08/29 08:42

b(1) = 7.000000と出力されれば正しいのですが。。。難しいです。
SHOMI

2020/08/29 08:42

どう直したのですか?私の指摘通りに全て直したなら動くはずですが。
SHOMI

2020/08/29 08:43

>for (j = 0; j < N; j++) {の前でb[i] = 0;とでもして0初期化してください。 を入れていないのでは?
kun_monimoni

2020/08/29 08:44

申し訳ないです、成功しました!!! 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問