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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

184閲覧

printfが正しく表示されない

退会済みユーザー

退会済みユーザー

総合スコア0

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/07/12 13:32

前提・実現したいこと

c++で逆行列を計算するプログラムを作成しています。
c言語初心者です。

発生している問題・エラーメッセージ

C[3][2]の値をprintfで表示すると正しく表示されません。
for文の使い方がわからず、とても見にくいプログラムになっています。申し訳ありません。

該当のソースコード

C++

1 2 3#include<stdio.h> 4int main(void){ 5 6double A[4][4], D[4][4], C[4][4]; 7 8 for (i = 0;i < 4;i++) { 9 for (j = 0;j < 4;j++) { 10 printf("A[%d][%d]=\t", i + 1, j + 1); 11 scanf_s("%lf", &A[i][j]); 12 /*printf("%lf\n", A[i][j]);*/ 13 } 14 } 15 16 printf("入力された行列は\n"); 17 printf("%lf\t%lf\t%lf\t%lf\n", A[0][0], A[0][1], A[0][2], A[0][3]); 18 printf("%lf\t%lf\t%lf\t%lf\n", A[1][0], A[1][1], A[1][2], A[1][3]); 19 printf("%lf\t%lf\t%lf\t%lf\n", A[2][0], A[2][1], A[2][2], A[2][3]); 20 printf("%lf\t%lf\t%lf\t%lf\n", A[3][0], A[3][1], A[3][2], A[3][3]); 21 22 double b,b1,b2,b3,b4; 23 24 b1 = A[0][0] * (A[1][1] * A[2][2] * A[3][3] + A[2][1] * A[3][2] * A[1][3] + A[3][1] * A[1][2] * A[2][3] - A[1][3] * A[2][2] * A[3][1] - A[2][1] * A[1][2] * A[3][3] - A[1][1] * A[2][3] * A[3][2]); 25 b2 = A[1][0] * (A[0][1] * A[2][2] * A[3][3] + A[2][1] * A[3][2] * A[0][3] + A[3][1] * A[0][2] * A[2][3] - A[0][3] * A[2][2] * A[3][1] - A[2][1] * A[0][2] * A[3][3] - A[0][1] * A[2][3] * A[3][2]); 26 b3 = A[2][0] * (A[0][1] * A[1][2] * A[3][3] + A[1][1] * A[3][2] * A[0][3] + A[3][1] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[3][1] - A[1][1] * A[0][2] * A[3][3] - A[0][1] * A[1][3] * A[3][2]); 27 b4 = A[3][0] * (A[0][1] * A[1][2] * A[2][3] + A[1][1] * A[2][2] * A[0][3] + A[2][1] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[2][1] - A[1][1] * A[0][2] * A[2][3] - A[0][1] * A[1][3] * A[2][2]); 28 b =1/( b1 - b2 + b3 - b4); 29 /*printf("%lf\n", b);*/ 30 31 if (b1-b2+b3-b4 == 0) { 32 printf("逆行列は存在しません\n"); 33 } 34 35 else { 36 C[0][0] = b * (A[1][1] * A[2][2] * A[3][3] + A[2][1] * A[3][2] * A[1][3] + A[3][1] * A[1][2] * A[2][3] - A[1][3] * A[2][2] * A[3][1] - A[2][1] * A[1][2] * A[3][3] - A[1][1] * A[2][3] * A[3][2]); 37 C[1][0] = (-1)*b * (A[1][0] * A[2][2] * A[3][3] + A[3][2] * A[2][0] * A[1][3] + A[3][0] * A[1][2] * A[2][3] -A[1][3] * A[2][2] * A[3][0] - A[3][2] * A[2][3] * A[1][0] - A[2][0] * A[1][2] * A[3][3]); 38 C[2][0]= b * (A[1][0] * A[2][1] * A[3][3] + A[3][1] * A[2][0] * A[1][3] + A[3][0] * A[1][1] * A[2][3] - A[1][3] * A[2][1] * A[3][0] - A[3][1] * A[2][3] * A[1][0] - A[2][0] * A[1][1] * A[3][3]); 39 C[3][0]=(-1)*b * (A[1][0] * A[2][1] * A[3][2] + A[3][1] * A[2][0] * A[1][2] + A[3][0] * A[1][1] * A[2][2] - A[1][2] * A[2][1] * A[3][0] - A[3][1] * A[2][2] * A[1][0] - A[2][0] * A[1][1] * A[3][2]); 40 C[0][1] = (-1)*b*(A[0][1] * A[2][2] * A[3][3] + A[2][1] * A[3][2] * A[0][3] + A[3][1] * A[0][2] * A[2][3] - A[0][3] * A[2][2] * A[3][1] - A[2][1] * A[0][2] * A[3][3] - A[0][1] * A[2][3] * A[3][2]); 41 C[1][1]= b * (A[0][0] * A[2][2] * A[3][3] + A[2][0] * A[3][2] * A[0][3] + A[3][0] * A[0][2] * A[2][3] - A[0][3] * A[2][2] * A[3][0] - A[2][0] * A[0][2] * A[3][3] - A[0][0] * A[2][3] * A[3][2]); 42 C[2][1]=(-1)* b * (A[0][0] * A[2][1] * A[3][3] + A[2][0] * A[3][1] * A[0][3] + A[3][0] * A[0][1] * A[2][3] - A[0][3] * A[2][1] * A[3][0] - A[2][0] * A[0][1] * A[3][3] - A[0][0] * A[2][3] * A[3][1]); 43 C[3][1]= b * (A[0][0] * A[2][2] * A[3][2] + A[2][0] * A[3][2] * A[0][2] + A[3][0] * A[0][2] * A[2][2] - A[0][2] * A[2][2] * A[3][0] - A[2][0] * A[0][2] * A[3][2] - A[0][0] * A[2][2] * A[3][2]); 44 C[0][2] = b * (A[0][1] * A[1][2] * A[3][3] + A[1][1] * A[3][2] * A[0][3] + A[3][1] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[3][1] - A[1][1] * A[0][2] * A[3][3] - A[0][1] * A[1][3] * A[3][2]); 45 C[1][2]=(-1) *b * (A[0][1] * A[1][2] * A[3][3] + A[1][0] * A[3][2] * A[0][3] + A[3][0] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[3][0] - A[1][0] * A[0][2] * A[3][3] - A[0][0] * A[1][3] * A[3][2]); 46 C[2][2]= b * (A[0][1] * A[1][1] * A[3][3] + A[1][0] * A[3][1] * A[0][3] + A[3][0] * A[0][1] * A[1][3] - A[0][3] * A[1][1] * A[3][0] - A[1][0] * A[0][1] * A[3][3] - A[0][0] * A[1][3] * A[3][1]); 47 C[3][2]=(-1)* b * (A[0][0] * A[2][1] * A[3][3] + A[0][3] * A[3][1] * A[2][0] + A[3][0] * A[0][1] * A[2][3] - A[0][3] * A[2][1] * A[3][0] - A[2][0] * A[0][1] * A[3][3] - A[0][0] * A[2][3] * A[3][1]); 48 C[0][3]=(-1)*b*(A[0][1] * A[1][2] * A[2][3] + A[1][1] * A[2][2] * A[0][3] + A[2][1] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[2][1] - A[1][1] * A[0][2] * A[2][3] - A[0][1] * A[1][3] * A[2][2]); 49 C[1][3]= b * (A[0][0] * A[1][2] * A[2][3] + A[1][0] * A[2][2] * A[0][3] + A[2][0] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[2][0] - A[1][0] * A[0][2] * A[2][3] - A[0][0] * A[1][3] * A[2][2]); 50 C[2][3]=(-1)*b * (A[0][0] * A[1][1] * A[2][3] + A[1][0] * A[2][1] * A[0][3] + A[2][0] * A[0][1] * A[1][3] - A[0][3] * A[1][1] * A[2][0] - A[1][0] * A[0][1] * A[2][3] - A[0][0] * A[1][3] * A[2][1]); 51 C[3][3]= b * (A[0][0] * A[1][1] * A[2][2] + A[1][0] * A[2][1] * A[0][2] + A[2][0] * A[0][1] * A[1][2] - A[0][2] * A[1][1] * A[2][0] - A[1][0] * A[0][1] * A[2][2] - A[0][0] * A[1][2] * A[2][1]); 52 53 printf("%lf\n", C[3][2]); 54 55 for (i = 0; i< 4; i++) { 56 for (j = 0; j < 4; j++) { 57 D[i][j] = A[i][j] * C[i][j]; 58 59 for (i = 0; i < 4; i++) { 60 for (j = 0; j < 4; j++) { 61 num = 0; 62 for (k = 0; k <4; k++) 63 num = num + A[i][k] * C[k][j]; 64 D[i][j] = num; 65 } 66 } 67 } 68 } 69 70 if (D[0][0] && D[1][1] && D[2][2] && D[3][3] == 1 && D[0][1] && D[0][2] && D[0][3] && D[1][0] && D[1][2] && D[1][3] && D[2][1] && D[2][0] && D[2][3] && D[3][0] && D[3][1] && D[3][2] && D[3][2] == 0) 71 { 72 printf("逆行列は存在しません\n"); 73 } 74 75 else { 76 printf("逆行列は\n"); 77 printf("%lf\t%lf\t%lf\n", C[0][0], C[0][1], C[0][2], C[0][3]); 78 printf("%lf\t%lf\t%lf\n", C[1][0], C[1][1], C[1][2], C[1][3]); 79 printf("%lf\t%lf\t%lf\n", C[2][0], C[2][1], C[2][2], C[2][3]); 80 printf("%lf\t%lf\t%lf\n", C[3][0], C[3][1], C[3][2], C[3][3]); 81 } 82 } 83 } 84 85 return 0; 86 87}

試したこと

printf("%lf\n",C[3][2]);の時点では正しく表示されました。
その後、逆行列の存在証明を行ったあと表示すると0になってしまいました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2018/07/12 14:08

その表示が0になったときの変数の内容はどうだったんでしょうか
退会済みユーザー

退会済みユーザー

2018/07/12 14:17

すみません、変数というのは、C[3][2]の値のことですか?
y_waiwai

2018/07/12 14:19

どこのprintfの話かわかりませんが、出力させたい変数の実際の値を知りたいです
退会済みユーザー

退会済みユーザー

2018/07/12 21:41

試しに実行した時は A00=1 A01=1 A02=1 A03=-1 A10=1 A11=1 A12=-1 A13=1 A20=1 A21=-1 A22=1 A23=1 A30=-1 A31=1 A32=1 A33=1 を入力したとき C32=0.25となるはずなのですが 0と表示されます。
y_waiwai

2018/07/12 22:07

こうなるはず、の話じゃなく、実際に0が出力されるときの、実際のC32の値のはなしをしたいんですが。
退会済みユーザー

退会済みユーザー

2018/07/12 23:14

最後に逆行列を表示する直前まで 0.25が入力されています。
y_waiwai

2018/07/13 03:08

それはわかったけど、printfの実行のときはなにが入ってるのかと。
guest

回答1

0

ベストアンサー

C++

1 for (i = 0; i< 4; i++) { 2 for (j = 0; j < 4; j++) { 3 D[i][j] = A[i][j] * C[i][j]; 4 5 for (i = 0; i < 4; i++) { 6 for (j = 0; j < 4; j++) { 7 num = 0; 8 for (k = 0; k <4; k++) 9 num = num + A[i][k] * C[k][j]; 10 D[i][j] = num; 11 } 12 } 13 } 14 }

後半にある↑この辺りのコードを見直してみてください。
1行目でiを使った4周のループを、2行目でjを使った4周のループを開始していますが、5行目と6行目で、そのiとjを壊しているように見えます。

投稿2018/07/12 14:38

segavvy

総合スコア958

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問