初めまして。
大学の授業でプログラミングの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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語でAからZまでを表示する...
-
コンパイルエラーについて
-
円の面積を求めるプログラミン...
-
(C言語)めちゃくちゃな値にな...
-
10個出力で改行したいのですが...
-
4の倍数を論理演算で表す。。
-
printf で二進表示を行いたい。
-
C言語でマウス入力(クリックや...
-
switch分のケースを範囲数?に...
-
strcmp
-
C言語 プログラミング
-
アドレスの比較について
-
C言語で四則演算を使って10を作...
-
error C2143: 構文エラー : ';'...
-
名簿作成 表示について
-
10進数を2進数に変換するには・...
-
コマンドプロンプトがすぐ消える
-
C言語で質問します
-
次のプログラムは、n個の中から...
-
C言語の勉強しています。すみま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printf で二進表示を行いたい。
-
コンパイルエラーについて
-
10個出力で改行したいのですが...
-
コマンドラインに出力した文字...
-
既約分数の表示プログラム
-
【C言語教えてください】sin波...
-
(C言語)めちゃくちゃな値にな...
-
LU分解法のピボット選択機能実...
-
printfの出力内の文字をdefine...
-
ガウスの消去法、後退代入について
-
c言語でAからZまでを表示する...
-
テキストカーソル位置の取得
-
cshの文字列操作(0埋め)
-
printf( " %2d", p * q );
-
strcmp
-
defineで定数が置き換えられな...
-
三角形の判別
-
%P と %X の違い
-
8人分のテストの点数を入力し、...
-
c言語で2000年以降カレンダーを...
おすすめ情報