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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

544閲覧

C言語の2次元配列に代入した値と出力結果が合いません。

K.M.PEANUTS

総合スコア40

C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/11/16 07:24

c言語で行列を使って2元一次方程式を解く問題をやっていて、a=2,b=3,c=5,d=1,e=1,f=3を代入しました。
ところが計算結果が合わず、原因を追求すると、a[0][0]=2を代入しているはずなのに、最終的にはa[0][0]=3に変わってしまっていることが分かりました。どうやら/2×1行列に代入/の部分で変わってしまっているようなのですが、原因は分かりますか?

c

1#include<stdio.h> 2 3int main(void) { 4int i,j; 5int a[2][2], b[2][1]; 6double ai[2][2], ans[2][1]; 7 8/*2×2行列に代入*/ 9for(i=0; i<2; i++) { 10 for(j=0; j<2; j++) { 11 if(i==0 && j==0) { 12 printf("a="); 13 } else if(i==0 && j==1) { 14 printf("b="); 15 } else if(i==1 && j==0) { 16 printf("c="); 17 } else { 18 printf("d="); 19 } 20 scanf("%d", &a[i][j]); 21 } 22} 23/*2x1行列に代入*/ 24for(i=0; i<2; i++) { 25 if(i==0) { 26 printf("e="); 27 } else { 28 printf("f="); 29 } 30 scanf("%d", &b[i][1]); 31} 32printf("a[0][0]=%d\n", a[0][0]); 33/*逆行列を求める*/ 34double s=1.0/(a[0][0]*a[1][1]-a[0][1]*a[1][0]); 35ai[0][0] = s*a[1][1]; 36ai[0][1] = -s*a[0][1]; 37ai[1][0] = -s*a[1][0]; 38ai[1][1] = s*a[0][0]; 39/*答え*/ 40ans[0][0] = ai[0][0]*b[0][0]+ai[0][1]*b[1][0]; 41ans[1][0] = ai[1][0]*b[0][0]+ai[1][1]+b[1][0]; 42 43printf("x=%f , y=%f\n", ans[0][0], ans[1][0]); 44 return 0; 45}

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

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

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

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

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

guest

回答3

0

配列bはb[2][1]で宣言されているので、&b[i][1]ではなく&b[i][0]でscanfを実行しないといけません。

投稿2020/11/16 07:35

Daregada

総合スコア11990

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

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

0

b[2][1]で配列を宣言した以上、2次元目は0しか使えません。b[i][1]なんてところに値を書き込んでは正常に動作しません。

投稿2020/11/16 07:34

maisumakun

総合スコア145208

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

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

0

ベストアンサー

int b[2][1];なのでbb[0][0]b[1][0]のみですが、

C

1scanf("%d", &b[i][1]);

で範囲外にアクセスしています。
bの次のアドレスにaが配置されて、b[1][1]a[0][0]にアクセスされたのでしょう。

投稿2020/11/16 07:33

編集2020/11/16 07:35
SHOMI

総合スコア4079

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問