合計 昨日 今日

3×3行列と3×1行列の積を求めるプログラム

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: rubyxx
[URL]
ぴよぴよ(133 ポイント)
Date: 2017年9月14日(木) 14:45
No: 1
(OFFLINE)

 3×3行列と3×1行列の積を求めるプログラム

先月プログラム作成を始めた初心者です.
3×3行列と3×1行列の積を求めるプログラムをネットの情報を参考に作りました。
行列内の数値が4桁ほどの整数の場合はうまく出力されます。しかし、実際は以下に示すような桁数が多く、少数が混じっている計算をしたいのですが、値が正しく出力されません。
直すべき点はどこか教えていただきたいです。
よろしくお願いします。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
main()
{
int o, p, q;
        int v[3][3] = { {0.00003,0.000144,-0.010793 },{ -0.002352,0.00072,0.451383 },{0.072793,-0.053127,-12.838918} };
            int w[3][1]= { {-86157861},{-13984372},{-422159} };
            int z[3][1];
 
            for (o = 0; o< 3; ++o) {
                for (p = 0; p< 1; ++p) {
                z[o][p] = 0;
            for (q = 0; q< 3; ++q) {
 
            z[o][p] += v[o][q] * w[q][p];
            }
            printf("%d ", z[o][p]);
            }
            printf("\n");
            }
       return 0;
       }

Name: みけCAT
[URL]
伝説なるハッカー(680,600 ポイント)
Date: 2017年9月14日(木) 16:39
No: 2
(OFFLINE)

 Re: 3×3行列と3×1行列の積を求めるプログラム

int型では少数を保存できないので、double型を使用すると改善するでしょう。
double型のデータをprintfで出力するには、%fなどが使用できますが、%dはint型のデータを出力する用なので使用できません。
また、インデントも整えるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: box
[URL]
ハッカー(264,158 ポイント)
Date: 2017年9月15日(金) 03:15
No: 3
(OFFLINE)

 Re: 3×3行列と3×1行列の積を求めるプログラム

字下げ(インデント)の悪いくせが身に付いてしまうと、あとあとやっかいです。
今のうちから、せめて下記の感じくらいに書くようにする方がよいでしょう。
誤解しないでいただきたいのは、「何が何でも下記のように書け」ということではなく
(それ言い出すと宗教論争みたくなってしまう)、質問者さんのコードと当方のコードでは
どっちが見やすいですか?っていうことです。

あと、少数じゃなくって小数です。少数派とか少数精鋭とかだったら少数でいいんですけどね。

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 
int main(void)
{
    double v[3][3] = {
        {  0.00003,   0.000144,  -0.010793 },
        { -0.002352,  0.00072,    0.451383 },
        {  0.072793, -0.053127, -12.838918 },
    };
    double w[3][1] = { -86157861, -13984372, -422159 };
    double z[3][1];
    int i, j, k;
 
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 1; j++) {
            z[i][j] = 0;
            for (k = 0; k < 3; k++) {
                z[i][j] += v[i][k] * w[k][j];
            }
            printf("%f", z[i][j]);
        }
        printf("\n");
    }
    return 0;
}


実行結果
-42.123311
2019.145335
-108676.660567
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Name: rubyxx
[URL]
ぴよぴよ(133 ポイント)
Date: 2017年9月15日(金) 12:29
No: 4
(OFFLINE)

 Re: 3×3行列と3×1行列の積を求めるプログラム

[解決!]

ご指摘およびご教授ありがとうございます!
これからは見やすさも考えて作成していきたいと思います!


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[36人]