ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュの正方行列のk乗をもとめる。 について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
n×n正方行列Aに対して、A^k(Aのk乗)を求めるプログラムを作成する。n,k,Aの要素入力までのプログラムは作成済みであり、
A^kの計算部分を追加していただけませんか?

ただし、以下の点に従うことが条件とされています。


A^kの計算部分を1つの関数としてまとめ、これを main() から呼び出すこと。

n,k,Aを引数として受け取り、計算結果の配列へのポインタを戻り値として返すものとする。ただし、Aの内容を破壊(Aを格納する配列の内容を変更)してはならない。また、計算結果を格納する配列も、必要に応じてこの関数内で動的に確保すること。

行列の乗算を行うためには、少なくとも3個の行列(A,X,Y)を記憶するためのメモリ領域(変数領域)が必要となるが、これ以外に不必要に領域を確保しないようにすること。


以下 n,k,Aの要素入力までのプログラム (読みにくくてすみません;;)

#include<stdio.h>
#include<stdlib.h>
float **matrix;
int input_matrix(int x){
int i,j;
matrix=(float**)malloc(sizeof(float)*x);
for(i=0;i<x;i++)
matrix[i]=(float*)malloc(sizeof(float)*x);
printf("行列の値>>\n");
fflush(stdout);
for(j=0;j<x;j++){
for(i=0;i<x;i++){
printf("%d行%d列->\n",j+1,i+1);
fflush(stdout);
scanf("%f",&matrix[j][i]);}
}

return *matrix[0];
}

void output_matrix(int x, float *array[0]){
int i,j;
for(j=0;j<x;j++){
for(i=0;i<x;i++){
printf("%f ",array[j][i]);
fflush(stdout);
}
printf("\n");
}
}

int main(){
int n,k;
printf("n×n正方行列Aに対し,A^k(Aのk乗)を求める\n");
fflush(stdout);
printf("n?>\n");
fflush(stdout);
scanf("%d",&n);
printf("k?>\n");
fflush(stdout);
scanf("%d",&k);
input_matrix(n);
output_matrix(n, &matrix[0]);
return 0;
}

コメント(11)

直接の回答ではないですが、同じような質問をしている人がいました。
http://mixi.jp/view_bbs.pl?id=31044562&comm_id=602606

この人と相談しながら作っていけばいいのではないでしょうか。
>001殿

ですよねー

#電車の中で声あげて笑いそうに…
>きよたんさん
課題丸投げのほうの人にも連絡してあげたほうがいいんじゃないでしょうか?
ご指摘ありがとうございますあせあせ(飛び散る汗)
丸投げの方の投稿者も自分なんです^^

なかなか回答をいただけず、こちらの趣旨に反するかと思いましたが、以前とても丁寧な回答を下さったのでこちらのコミュにも立てさせていただきました。
お時間のある方は是非完成させてください;;よろしくお願いします。
>3
丸投げコミュには参加していないので、コメントできないんです。
入っていなくても、見ることだけは出来るんで。
でも、どうやら同じ人の書き込みだったようなので、連絡する手間が省けました^^;

とりあえずヒントはあげるけど、どこから言えばいいのかな。
階乗の求め方って知っていますか?
行列の掛け算って知っていますか?
行列って知っていますか?
問題文の意味は理解できますか?

階乗の計算には、やっぱり再帰関数が重要ですね。
軽く読んでいて気になったのですが、
3行目
> float **matrix;
となっているのに、
15行目
> scanf("%f",&matrix[j][i]);}
となっていて、おかしくないですか?
2重ポインタと2次元配列は全く別のものなので。。。

あとは、メモリのことでかなりかかれているので、、、それについてちょっと突っ込むと、
6行目
> matrix=(float**)malloc(sizeof(float)*x);

matrix=(float**)malloc(sizeof(float*)*x);
の間違いではないかと。

ほかにも突っ込みたいところはありますが、まぁこの辺でww

配列とポインタの違いをもう少し勉強すると良いと思います。
とりあえず要素nの正方行列の2乗を作る関数を作って、それを再起呼び出しすればいんじゃね?
行列の掛け算なんて計算方法忘れたなあ・・・

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング