
初めまして。
大学の授業でプログラミングのC言語を勉強しています。
4月からプログラミングを始めたばかりで、まったくの初心者です。
転置行列が作れなくて困っているのですが、
.datのファイルから転置させるのが上手くできません。
《kadai1.datの3行4列の行列Aと、kadai2.datの4行3列行列Bがある。
行列A、行列B、行列Aの転置行列を出力し、
行列Aの転置行列と行列Bの和を出力するプログラムを作る。
kadai1.datとkadai2.datは自分で作る。》
で、途中まで作ったのが以下です。
#include <stdio.h>
#include <stdlib.h>
#define ROW 3
#define COLUMN 4
int main(void)
{
FILE *fp;
double a[ROW][COLUMN], b[ROW][COLUMN];
int i, j;
if ( ( fp = fopen( "kadai1.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai1.dat \n");
exit(1);
}
printf("行列Aは次の通りです\n");
for ( i = 0 ; j < COLUMN ; j++)
{
scanf (fp, "%lf", &a[i][j]);
printf ("%5.2f\t", a[i][j]);
}
printf("\n");
}
if ( ( fp = fopen( "kadai2.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai2.dat \n");
exit(1);
}
printf("行列Bは次の通りです\n");
for ( i = 0 ; j < COLUMN ; j++)
{
scanf (fp, "%lf", &a[i][j]);
printf ("%5.2f\t", a[i][j]);
}
printf("\n");
}
return 0;
}
\の半角が出なかったので¥になってます。
(ごめんなさい!!)
上のプログラムで、行列Aと行列Bが出力できたのですが、転置と和のプログラムが出来ていません。
kadai1.datが、
1 2 3 4
5 6 7 8
9 10 11 12
kadai2.datが、
13 14 15
16 17 18
19 20 21
22 23 24
にしてみました。a1 a2 … c3 c4、でやってる人もいるみたいですが具体的な数字で作ろうと思っています。
お手数おかけしますが具体的にお答えいただければ幸いです。
どうぞよろしくお願いいたします。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
ヒントだけ。
fscanf( fp, "%lf", &ra[j][i]);
これは何のためにある?
あと、fclose(fp) を適切な場所に入れる必要があります。
これが理解できてないと他の課題をやっても時間の無駄になります。
完成しました!!
みなさまからたくさんのアドバイスを頂き、
本当に嬉しいです。
以下、完成したプログラムです。
kadai2.datを
13 17 21
14 18 22
15 19 23
16 20 24
に変更しました。
#include <stdio.h>
#include <stdlib.h>
#define ROW 3
#define COLUMN 4
int main(void)
{
FILE *fp;
double a[ROW][COLUMN], b[ROW][COLUMN];
double ra[COLUMN][ROW], c[COLUMN][ROW];
int i, j, r;
if ( ( fp = fopen( "kadai1.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai1.dat \n");
exit(1);
}
printf("行列Aは次の通りです\n");
for(i=0; i<ROW; i++)
{
for( j=0; j< COLUMN ; j++)
{
fscanf (fp, "%lf", &a[i][j]);
printf ("%5.2f\t", a[i][j]);
ra[j][i]= a[i][j];
}
printf("\n");
}
printf("行列Aの転置行列を求めると\n");
for(j=0;j < COLUMN ; j++)
{
for(i = 0; i < ROW; i++)
{
fscanf( fp, "%lf", &ra[j][i]);
printf( "%5.2f\t", ra[j][i]);
}
printf("\n");
}
if ( ( fp = fopen( "kadai2.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai2.dat \n");
exit(1);
}
printf("行列Bは次の通りです\n");
for(i=0; i<COLUMN; i++)
{
for( j=0; j<ROW ; j++)
{
fscanf (fp, "%lf", &b[i][j]);
printf ("%5.2f\t", b[i][j]);
}
printf("\n");
}
printf("行列Aの転置行列と行列Bとの和は\n");
for (i = 0; i < COLUMN; i++)
{
for (j = 0; j < ROW; j++)
{
c[i][j] = ra[j][i] + b[i][j];
printf("%lf", c[i][j]);
}
printf("\n");
}
printf("\n");
fclose(fp);
return 0;
}
No.5
- 回答日時:
ra[] と b[] はdouble 型ですよね。
だったら printf("%d") では正常に出力されません。
printf("%f ") にしなきゃダメ
この回答への補足
ありがとうございます!!
ここまでたどり着きましたが
転置行列成功まであと一歩です!!
転置行列の[i][j]やROW、COLUMNのところで間違いがあるのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#define ROW 3
#define COLUMN 4
int main(void)
{
FILE *fp;
double a[ROW][COLUMN], b[ROW][COLUMN];
double ra[COLUMN][ROW], c[COLUMN][ROW];
int i, j, r;
if ( ( fp = fopen( "kadai1.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai1.dat \n");
exit(1);
}
printf("行列Aは次の通りです\n");
for(i=0; i<ROW; i++)
{
for( j=0; j< COLUMN ; j++)
{
fscanf (fp, "%lf", &a[i][j]);
printf ("%5.2f\t", a[i][j]);
ra[j][i]= a[i][j];
}
printf("\n");
}
printf("行列Aの転置行列を求めると\n");
for(i=0;i < COLUMN ; i++)
{
for(j = 0; j < ROW; j++)
{
fscanf( fp, "%lf", &ra[j][i]);
printf( "%5.2f\t", ra[j][i]);
}
printf("\n");
}
if ( ( fp = fopen( "kadai2.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai2.dat \n");
exit(1);
}
printf("行列Bは次の通りです\n");
for(i=0; i<COLUMN; i++)
{
for( j=0; j<ROW ; j++)
{
fscanf (fp, "%lf", &b[i][j]);
printf ("%5.2f\t", b[i][j]);
}
printf("\n");
}
printf("行列Aの転置行列と行列Bとの和は\n");
for (i = 0; i < COLUMN; i++)
{
for (j = 0; j < ROW; j++)
{
c[i][j] = ra[j][i] + b[i][j];
printf("%lf", c[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}
No.4
- 回答日時:
おっと失礼。
#include <stdio.h>
#include <stdlib.h>
#define X (3)
#define Y (4)
int main(void)
{
int a[X][Y], ra[Y][X], b[Y][X], i, j;
FILE *fpa, *fpb;
fpa = fopen("kadai1.dat", "r");
if (fpa == NULL) {
fprintf(stderr, "kadai1.datがオープンできません。\n");
exit(1);
}
printf("【行列A】\n");
for (i = 0; i < X; i++) {
for (j = 0; j < Y; j++) {
fscanf(fpa, "%d", &a[i][j]);
printf("%d ", a[i][j]);
ra[j][i] = a[i][j];
}
putchar('\n');
}
putchar('\n');
fclose(fpa);
fpb = fopen("kadai2.dat", "r");
if (fpb == NULL) {
fprintf(stderr, "kadai2.datがオープンできません。\n");
exit(1);
}
printf("【行列B】\n");
for (i = 0; i < Y; i++) {
for (j = 0; j < X; j++) {
fscanf(fpb, "%d", &b[i][j]);
printf("%d ", b[i][j]);
}
putchar('\n');
}
putchar('\n');
fclose(fpb);
printf("【行列Aの転置行列と行列Bとの和】\n");
for (i = 0; i < Y; i++) {
for (j = 0; j < X; j++) {
printf("%d ", ra[i][j] + b[i][j]);
}
putchar('\n');
}
putchar('\n');
return 0;
}
この回答への補足
ありがとうございます!!
頑張って作ってみたのが以下ですが、
和の部分が0になってしまいます。
何度も申し訳ありませんが、アドバイスおねがいいたします。
#include <stdio.h>
#include <stdlib.h>
#define ROW3
#define COLUMN 4
int main(void)
{
FILE *fp;
double a[ROW][COLUMN], b[ROW][COLUMN];
double ra[COLUMN][ROW];
int i, j, c, r;
if ( ( fp = fopen( "kadai1.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai1.dat \n");
exit(1);
}
printf("行列Aは次の通りです\n");
for(i=0; i<ROW; i++)
{
for( j=0; j< COLUMN ; j++)
{
fscanf (fp, "%lf", &a[i][j]);
printf ("%5.2f\t", a[i][j]);
ra[j][i]= a[i][j];
}
printf("\n");
}
if ( ( fp = fopen( "kadai1.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai1.dat \n");
exit(1);
}
printf("行列Aの転置行列を求めると\n");
for(i=0;i < COLUMN ; i++)
{
for(j = 0; j < ROW; j++)
{
fscanf( fp, "%lf", &ra[j][i]);
printf( "%5.2f\t", ra[j][i]);
}
printf("\n");
}
if ( ( fp = fopen( "kadai2.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai2.dat \n");
exit(1);
}
printf("行列Bは次の通りです\n");
for(i=0; i<COLUMN; i++)
{
for( j=0; j<ROW ; j++)
{
fscanf (fp, "%lf", &b[i][j]);
printf ("%5.2f\t", b[i][j]);
}
printf("\n");
}
printf("行列Aの転置行列と行列Bとの和は\n");
for (i = 0; i < COLUMN; i++)
{
for (j = 0; j < ROW; j++)
{
printf("%d ", ra[j][i] + b[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}
No.3
- 回答日時:
#include <stdio.h>
#include <stdlib.h>
#define X (3)
#define Y (4)
int main(void)
{
int a[X][Y], ra[Y][X], b[Y][X], i, j;
FILE *fpa, *fpb;
fpa = fopen("kadai1.dat", "r");
if (fpa == NULL) {
fprintf(stderr, "kadai1.datがオープンできません。\n");
exit(1);
}
for (i = 0; i < X; i++) {
for (j = 0; j < Y; j++) {
fscanf(fpa, "%d", &a[i][j]);
ra[j][i] = a[i][j];
}
}
fclose(fpa);
fpb = fopen("kadai2.dat", "r");
if (fpb == NULL) {
fprintf(stderr, "kadai2.datがオープンできません。\n");
exit(1);
}
for (i = 0; i < Y; i++) {
for (j = 0; j < X; j++) {
fscanf(fpb, "%d", &b[i][j]);
printf("%d ", ra[i][j] + b[i][j]);
}
putchar('\n');
}
fclose(fpb);
return 0;
}
No.2
- 回答日時:
転置行列を作るんだから
double a[ROW][COLUMN], b[ROW][COLUMN];
に加えて
double ra[COLUMN][ROW], rb[COLUMN][ROW];
を用意し、aからra / bからrb に要素を転記するんでしょうね。
r,cをころころ変えながら
ra[c][r] = a[r][c];
rb[c][r] = b[r][c];
を繰り返せばいいでしょう。
この回答への補足
ありがとうございます!!
アドバイスを取り入れて修正してみたのですが
これも途中が抜けています。
#include <stdio.h>
#include <stdlib.h>
#define ROW 3
#define COLUMN 4
int main(void)
{
FILE *fp;
double a[ROW][COLUMN], b[ROW][COLUMN];
double ra[COLUMN][ROW], rb[COLUMN][ROW];
int i, j, c, r;
if ( ( fp = fopen( "kadai1.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai1.dat \n");
exit(1);
}
printf("行列Aは次の通りです\n");
for(i=0; i<ROW; i++)
{
for( j=0; j< COLUMN ; j++)
{
fscanf (fp, "%lf", &a[i][j]);
printf ("%5.2f\t", a[i][j]);
}
printf("\n");
}
if ( ( fp = fopen( "kadai2.dat", "r" ) ) == NULL )
{
printf("ファイルが見つかりません : kadai2.dat \n");
exit(1);
}
printf("行列Bは次の通りです\n");
for(i=0; i<ROW; i++)
{
for( j=0; j< COLUMN ; j++)
{
scanf (fp, "%lf", &a[i][j]);
printf ("%5.2f\t", a[i][j]);
}
printf("\n");
}
printf("行列Aの転置行列を求めると\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<COLUMN ; j++)
{
ra[c][r] = a[r][c];
rb[c][r] = b[r][c];
}
printf("\n");
}
return 0;
}
***********
もうすこし教えて頂きたいのですが、
ra[c][r] = a[r][c];
rb[c][r] = b[r][c];
の部分はscanf(…)
の中に入れれば良かったのでしょうか?
また、上の方のintにrとcを加えてみました。
これは不要でしょうか?
(まだ行列の和にはたどり着いていない状態です。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
printfの出力内の文字をdefine...
-
fscanf()【C言語】
-
文字を動かしたい
-
printf で二進表示を行いたい。
-
インクリメント演算子について
-
祝日判定です。
-
LU分解法のピボット選択機能実...
-
【C言語教えてください】sin波...
-
【至急】プログラミング
-
%P と %X の違い
-
#include <iostream> #include ...
-
覆面算 C
-
C言語での、年複利の計算方法...
-
三平方の定理を求めるプログラム
-
8人分のテストの点数を入力し、...
-
ホームページをC言語で作りたい...
-
コンパイルエラーについて
-
入力したお金の金額からお札の...
-
Cプログラムについて
-
printf( " %2d", p * q );
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンパイルエラーについて
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
strcmp
-
cshの文字列操作(0埋め)
-
printfの出力内の文字をdefine...
-
テキストカーソル位置の取得
-
アドレスの比較について
-
コマンドプロンプトがすぐ消える
-
Visual Sutdio 2017 でのC言語...
-
defineで定数が置き換えられな...
-
10個出力で改行したいのですが...
-
ifなんですが
-
c言語で2000年以降カレンダーを...
-
WM_CLOSEで閉じれないウィンド...
-
%P と %X の違い
-
Cプログラムについて
-
三角形の判別
おすすめ情報