みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

C言語で行列表現

C言語の講習で2×2行列の表現方法を考えると云う問題に直面しました。

当初は行列の要素ごとをscanfで記憶、対応させて掛け算等の演算を行おうと考えていましたが
汎用性の面から外部のテキストを読み込み、結果をテキストに書き込んで出力するような
プログラムにしたいと考えました。

当方の疑問として
行列の宣言を int a[ ][ ];と宣言した後(今回ですとa[2][2]と宣言するのが正しいのですが)
各要素にファイルの値を当てるにはどういったプログラムを書けばいいんでしょうか?

講師からはアドレス、構造体、配列、mallocないしallocを使えとのアドバイスを受けましたが
行列表現の段階で躓いていて今後の指針含めて正直よく分かりません。
部分部分で構いませんので、どなたか解説をお願いいたします。
m(_ _)m

P.S
表記の面で判りづらい点がありましたら遠慮なく指摘してください。
熟読の上改訂いたします。

投稿日時 - 2011-05-13 01:09:45

QNo.6733704

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

#2です
>変数x,yを整数型で宣言
行列の要素数を宣言しています(とりあえず2×2とのことだったので両方2にしています)

>forのループで行列を表現してるんでしょうか?
そういうことになります(コメントだけでは不十分だったですか?)

別にforループである必要はありませんが下手にわけわからん
変数名出たりすると逆にわかりにくいだろうと思って
あえてforループで書いているだけです

雑な一例と書いたようにそれなりに雑な書き方をしています
後は質問者さんが工夫すればいいだけの話なので
(ファイルから行列の要素数と各データを求めるにしてもそこは工夫次第でどうにでもなる話)

今回部分部分を切り出して説明する方法が思いつかなかったので
こういった一連の流れを書いています
(基本的に丸投げ質問に答えるのは嫌いです 今回分からない部分がある程度明確化されているので回答しました)

投稿日時 - 2011-05-15 17:51:18

お礼

ありがとうございました。

投稿日時 - 2011-05-15 21:19:14

ANo.4

先の回答でも申しましたが、どのように行列を記述するかは自由です

先の例では
ファイルの先頭から
1 2 3 4  //(区切りになる文字が空白ではなかったかもしれないのでご確認ください)
となっているのを読み込みます

ファイル内の移動はポインタの値を操作するのですが、
そのあたりの関数はCのほうで用意されていたような気がします
(もしなかったら自作です)

見やすくするなら行列名をコメント記号を決めて書くのも自由かと思います

勉強なさっているのなら、参考書もお持ちでしょうからそこらあたりいろいろ工夫されてみては
いかがでしょうか

投稿日時 - 2011-05-14 21:03:57

お礼

そうですね、一度試行錯誤してみようと思います。

回答ありがとうございました

投稿日時 - 2011-05-14 22:04:21

ANo.3

やりたいことから推測しますと
fopenでファイルを開いてfscanfか何かでファイル上の自分で決めたフォーマットで読み込み
2次元配列に受け渡すんだと思います
fscanf(fp, "%d%d%d%d", &a[0][0], &a[0][1], &a[1][0], &a[1][1]);
みたいにもできると思います

投稿日時 - 2011-05-14 10:11:34

補足

お返事ありがとうございます。
おっしゃるとおり、txtファイルないしexcelから
行列を読み込もうと考えています。

踏み込んでお聞きしたいのですが
行列のフォーマットを
A
1 2
3 4
とした場合、行列の名前であるAをスキャンせず
数値だけをスキャンする場合、どうすればいいのでしょうか。

自分自身で考えたのは
%_ の文字を変える(?)
表示はファイル全体だがスキャンは数値に限定する
ぐらいなんですが……。

P.S
考え付いたものは本当にC言語を租借し切れていない初心者の発想ですのでお目汚しになってしまわれたら申し訳ありません。

投稿日時 - 2011-05-14 19:48:36

ANo.2

考え方次第で書き方はいろいろあると思いますが 雑な一例
 int x = 2;
 int y = 2;
 int *data = (int *)malloc(sizeof(int) * x * y);

 for (int yy = 0 ; yy < y ; yy ++ ) {
  for (int xx = 0 ; xx < x ; xx ++ ) {
   *(data + yy * x + xx) = 1; //data[yy][xx] に相当
  }
 }
 free(data);

投稿日時 - 2011-05-13 04:07:52

補足

変数x,yを整数型で宣言

forのループで行列を表現してるんでしょうか?

投稿日時 - 2011-05-15 17:24:53

ANo.1

とりあえず 1点確認:
今問題に挙がっているのは「2×2行列」ですが, 本来はより一般的に m×n行列であるべきものですか? それとも, 「2×2行列さえできればいい」ということでしょうか?

投稿日時 - 2011-05-13 03:25:50

補足

遅ればせながら返答させていただきますと

課題として前者に取り組んでいますが、自身の中では汎用性の面からm×n行列の処理を出来ないかと考えております。

投稿日時 - 2011-05-14 19:40:42

あなたにオススメの質問