- 締切済み
C言語で行列表現
C言語の講習で2×2行列の表現方法を考えると云う問題に直面しました。 当初は行列の要素ごとをscanfで記憶、対応させて掛け算等の演算を行おうと考えていましたが 汎用性の面から外部のテキストを読み込み、結果をテキストに書き込んで出力するような プログラムにしたいと考えました。 当方の疑問として 行列の宣言を int a[ ][ ];と宣言した後(今回ですとa[2][2]と宣言するのが正しいのですが) 各要素にファイルの値を当てるにはどういったプログラムを書けばいいんでしょうか? 講師からはアドレス、構造体、配列、mallocないしallocを使えとのアドバイスを受けましたが 行列表現の段階で躓いていて今後の指針含めて正直よく分かりません。 部分部分で構いませんので、どなたか解説をお願いいたします。 m(_ _)m P.S 表記の面で判りづらい点がありましたら遠慮なく指摘してください。 熟読の上改訂いたします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- koi1234
- ベストアンサー率53% (1866/3459)
#2です >変数x,yを整数型で宣言 行列の要素数を宣言しています(とりあえず2×2とのことだったので両方2にしています) >forのループで行列を表現してるんでしょうか? そういうことになります(コメントだけでは不十分だったですか?) 別にforループである必要はありませんが下手にわけわからん 変数名出たりすると逆にわかりにくいだろうと思って あえてforループで書いているだけです 雑な一例と書いたようにそれなりに雑な書き方をしています 後は質問者さんが工夫すればいいだけの話なので (ファイルから行列の要素数と各データを求めるにしてもそこは工夫次第でどうにでもなる話) 今回部分部分を切り出して説明する方法が思いつかなかったので こういった一連の流れを書いています (基本的に丸投げ質問に答えるのは嫌いです 今回分からない部分がある程度明確化されているので回答しました)
- hrsmmhr
- ベストアンサー率36% (173/477)
先の回答でも申しましたが、どのように行列を記述するかは自由です 先の例では ファイルの先頭から 1 2 3 4 //(区切りになる文字が空白ではなかったかもしれないのでご確認ください) となっているのを読み込みます ファイル内の移動はポインタの値を操作するのですが、 そのあたりの関数はCのほうで用意されていたような気がします (もしなかったら自作です) 見やすくするなら行列名をコメント記号を決めて書くのも自由かと思います 勉強なさっているのなら、参考書もお持ちでしょうからそこらあたりいろいろ工夫されてみては いかがでしょうか
お礼
そうですね、一度試行錯誤してみようと思います。 回答ありがとうございました
- hrsmmhr
- ベストアンサー率36% (173/477)
やりたいことから推測しますと fopenでファイルを開いてfscanfか何かでファイル上の自分で決めたフォーマットで読み込み 2次元配列に受け渡すんだと思います fscanf(fp, "%d%d%d%d", &a[0][0], &a[0][1], &a[1][0], &a[1][1]); みたいにもできると思います
補足
お返事ありがとうございます。 おっしゃるとおり、txtファイルないしexcelから 行列を読み込もうと考えています。 踏み込んでお聞きしたいのですが 行列のフォーマットを A 1 2 3 4 とした場合、行列の名前であるAをスキャンせず 数値だけをスキャンする場合、どうすればいいのでしょうか。 自分自身で考えたのは %_ の文字を変える(?) 表示はファイル全体だがスキャンは数値に限定する ぐらいなんですが……。 P.S 考え付いたものは本当にC言語を租借し切れていない初心者の発想ですのでお目汚しになってしまわれたら申し訳ありません。
- koi1234
- ベストアンサー率53% (1866/3459)
考え方次第で書き方はいろいろあると思いますが 雑な一例 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);
補足
変数x,yを整数型で宣言 forのループで行列を表現してるんでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず 1点確認: 今問題に挙がっているのは「2×2行列」ですが, 本来はより一般的に m×n行列であるべきものですか? それとも, 「2×2行列さえできればいい」ということでしょうか?
補足
遅ればせながら返答させていただきますと 課題として前者に取り組んでいますが、自身の中では汎用性の面からm×n行列の処理を出来ないかと考えております。
お礼
ありがとうございました。