初めまして。
大学の授業でプログラミングの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を探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
- ・ちょっと先の未来クイズ第5問
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ガウスの消去法、後退代入について
-
コンパイルエラーについて
-
既約分数の表示プログラム
-
c言語でAからZまでを表示する...
-
ホームページをC言語で作りたい...
-
コマンドラインに出力した文字...
-
for文内でscanf関数により配列...
-
%P と %X の違い
-
C言語についてです学籍番号、名...
-
CTRL+Dでループを抜けるには
-
教えてください!!
-
unsigned int型について
-
環境はwindows10、visual studi...
-
2つ分数の四則演算を行うプロ...
-
printf() だけで文字列を表示で...
-
文字と数字の判定について
-
4の倍数を論理演算で表す。。
-
Cプログラムについて
-
2進数の加算の繰り上がり
-
引数の数が可変な関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンパイルエラーについて
-
10個出力で改行したいのですが...
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
4の倍数を論理演算で表す。。
-
c言語でAからZまでを表示する...
-
%P と %X の違い
-
cshの文字列操作(0埋め)
-
strcmp
-
(C言語)めちゃくちゃな値にな...
-
printf( " %2d", p * q );
-
CTRL+Dでループを抜けるには
-
printfの出力内の文字をdefine...
-
defineで定数が置き換えられな...
-
コマンドプロンプトがすぐ消える
-
コマンドラインに出力した文字...
-
C言語で四則演算を使って10を作...
-
C言語で四則演算を使って結果が...
-
円の面積を求めるプログラミン...
-
C言語 プログラミング
おすすめ情報