行列の和・差・積を繰返し計算する電卓を作成する課題を解いてます。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たきじゅん
記事: 3
登録日時: 2年前

行列の和・差・積を繰返し計算する電卓を作成する課題を解いてます。

#1

投稿記事 by たきじゅん » 2年前

コード:

#include <stdio.h>
struct matrix //構造体作成//
{
	int 行;
	int 列;
	double data[100][100];
};
void matrix_read(struct matrix* P);//readは要素に値を入力する
void matrix_print(struct matrix P);//printは要素を表示する
void matrix_add(struct matrix A, struct matrix B, struct matrix* C);//A+B=C
void matrix_sub(struct matrix A, struct matrix B, struct matrix* C);//A-B=C
void matrix_mul(struct matrix A, struct matrix B, struct matrix* C);//A*B=C
void matrix_copy(struct matrix A, struct matrix* B);
int main()//操作選択
{
	int select;
	struct matrix A, B, C;
	// 初期化
	A.行 = 0;
	A.列 = 0;
	B.行 = 0;
	B.列 = 0;
	C.行 = 0;
	C.列 = 0;
	do {
		printf("項目を選択してください.\n1.行列Aを入力\n2.行列Bを入力\n3.行列Aを表示\n4.行列Bを表示\n5.行列Cを表示\n6.C = A + Bを計算\n7.C = A - Bを計算\n8.C = ABを計算\n9.行列Cを行列Aにコピー\n10.行列Cを行列Bにコピー\n11.終了\n");
			scanf_s("%d", &select);
			switch (select) {
			case 1:
				printf("行列Aを読み込みます¥n");
				matrix_read(&A);
				break;
			case 2:
				printf("行列Bを読み込みます¥n");
				matrix_read(&B);
				break;
			case 3:
				printf("行列A¥n");
				matrix_print(A);
				break;
			case 4:
				printf("行列B¥n");
				matrix_print(B);
				break;
			case 5:
				printf("行列C¥n");
				matrix_print(C);
				break;
			case 6:
				printf("行列の和C = A + Bを計算します¥n");
				matrix_add(A, B, &C);
				break;
			case 7:
				printf("行列の差C = A - Bを計算します¥n");
				matrix_sub(A, B, &C);
				break;
			case 8:
				printf("行列の積C = A * Bを計算します¥n");
				matrix_mul(A, B, &C);
				break;
			case 9:
				printf("行列Cを行列Aにコピー¥n");
				matrix_copy(C, &A);
				break;
			case 10:
				printf("行列Cを行列Bにコピー¥n");
				B = C;
				break;
			}
	} while (select != 11);
	return 0;
}
void matrix_read(struct matrix* P)//入力
{
	int i, j;
	printf("行の数は:");
	scanf_s("%d", &P->行);
	printf("列の数は:");
	scanf_s("%d", &P->列);
	for (i = 0; P->行 > i; i++) 
	{
		for (j = 0; P->列 > j; j++) 
		{
			printf("(%d,%d)成分:", i + 1, j + 1);
			scanf_s("%lf", &P->data[i][j]);
		}
	}
}
void matrix_print(struct matrix P)//表示
{
	int i, j;
	for (i = 0; P.行 > i; i++)
	{
		printf("|");
		for (j = 0; P.列 > j; j++)
		{
			printf("%7.2f", P.data[i][j]);
		}
		printf("|¥n");
	}
	printf("¥n");
}
void matrix_add(struct matrix A, struct matrix B, struct matrix* C)
{ 
	int i, j;
	for ("i=0;P.行>i;i++")
	{
		for ("j=0;P.列>j;j++")
		{
			C[i][j] = a[i][j] + b[i][j];
		}
	}
}
void matrix_sub(struct matrix A, struct matrix B, struct matrix* C)
{ 
	int i, j;
	for ("i=0;P.行>i;i++")
	{
		for ("j=0;P.列>j;j++")
		{
			C[i][j] = a[i][j] - b[i][j];
		}
	}
}
void matrix_mul(struct matrix A, struct matrix B, struct matrix* C)
{ 
	int i, j, k, x;
	for ("i=0;P.行>i;i++")
	{
		for ("j=0;P.列>j;j++")
		{
			C[i][j] = a[i][j] * b[i][j];
			for (i = 0; P.行 > i; i++)
			{
				for ("j=0;P.列>j;j++")
				{
					x = 0;
				for(k=0;P.行>k;k++)
				x=x+ a[i][k] * b[k][j];
				C[i][j] = x;
				}
			}
		}
	}
}
void matrix_copy(struct matrix A, struct matrix* B)
{ // 中身を作成してください
}
最後の3つのmatrixが上手くいきません。

box
記事: 2002
登録日時: 13年前

Re: 行列の和・差・積を繰返し計算する電卓を作成する課題を解いてます。

#2

投稿記事 by box » 2年前

コード:

	int 行;
	int 列;
悪いことは言わんので、マルチバイト文字の変数名は使わない方がよい。

コード:

	for ("i=0;P.行>i;i++")
		for ("j=0;P.列>j;j++")
	for ("i=0;P.行>i;i++")
		for ("j=0;P.列>j;j++")
	for ("i=0;P.行>i;i++")
		for ("j=0;P.列>j;j++")
そりゃダブルクォーテーションで囲ったら動きませんわ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 行列の和・差・積を繰返し計算する電卓を作成する課題を解いてます。

#3

投稿記事 by box » 2年前

for文の間違いは直せたとして、

コード:

void matrix_add(struct matrix A, struct matrix B, struct matrix* C)
			C[i][j] = a[i][j] + b[i][j];
void matrix_sub(struct matrix A, struct matrix B, struct matrix* C)
			C[i][j] = a[i][j] - b[i][j];
void matrix_mul(struct matrix A, struct matrix B, struct matrix* C)
			C[i][j] = a[i][j] * b[i][j];
				x=x+ a[i][k] * b[k][j];
				C[i][j] = x;
このあたり、本当に正しいですか?
変数名が大文字と小文字で食い違っているし、
構造体のメンバーdata[][]はどこ行ったんですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 行列の和・差・積を繰返し計算する電卓を作成する課題を解いてます。

#4

投稿記事 by box » 2年前

あと、行列の積って、確か
かけられる側の列数とかける側の行数が
同じでないと計算できないはずなので、
そこら辺のチェックが必要かも。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

“C言語何でも質問掲示板” へ戻る