(資料構造)大学カリキュラムリスト追加、マトリクス多用


質問する


2つのマトリクスをファイルm 1とする.txt, m2.txtを入力し、マトリクスの追加を実行するプログラムを記述し、
画面に印刷します.入力ファイルで使用されるマトリクスは、1行目にrowとcolumn、2行目にrow-majorを含む
要素が順番に格納されています.Matrix入力ファイルの行数X列数を指定するには、mallocを使用します.
サイズ2の配列を生成して使用します.
*自由にする方法を考えます.実施する必要はありません.
Ex)
m1.txt
9 10
5 2 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 2 0 0 0 0 0 0 0 0
m2.txt
9 10
7 0 0 0 0 0 0 0 0 9
0 -1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
(output)
9 10
12 2 0 0 0 0 0 0 0 9
0 0 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 2 0 0 0 0 0 0 0 0

プールコード

#include <stdio.h>
#include <stdlib.h>


int main() {
	int n, m, l; // n 세로줄 m 가로줄 l 배열 안의 값
	int i, j;
	int** x; //m1 txt 배열
	int** y; //m2 txt 배열
	int** z; //output txt 배열
	printf("컴퓨터학부 2019115615 김규회\n");
	FILE* fp = NULL;
	fopen_s(&fp, "m1.txt", "r");
	if (fp == NULL) {
		return 0;
	}



	fscanf_s(fp, "%d %d", &n, &m);




	x = (int**)malloc(sizeof(*x) * n);
	for (i = 0; i < n; i++) {
		x[i] = (int*)malloc(m * sizeof(**x));

	}

	for (int i = 0; i < n; i++) {


		for (j = 0; j < m; j++) {
			fscanf_s(fp, "%d", &l);
			x[i][j] = l;



		}

	}
	FILE* fp2 = NULL;
	fopen_s(&fp2, "m2.txt", "r");
	if (fp2 == NULL) {
		return 0;
	}
	fscanf_s(fp2, "%d %d", &n, &m);
	y = (int**)malloc(sizeof(*y) * n);
	for (i = 0; i < n; i++) {
		y[i] = (int*)malloc(m * sizeof(**y));

	}
	for (int i = 0; i < n; i++) {


		for (j = 0; j < m; j++) {
			fscanf_s(fp2, "%d", &l);
			y[i][j] = l;
		}
	}

	z = (int**)malloc(sizeof(*z) * n);
	for (i = 0; i < n; i++) {
		z[i] = (int*)malloc(m * sizeof(**z));

	}

	for (int i = 0; i < n; i++) {


		for (j = 0; j < m; j++) {
			z[i][j] = x[i][j] + y[i][j];


		}

	}

	printf("%d %d\n", n, m);
	for (int i = 0; i < n; i++) {


		for (j = 0; j < m; j++) {
			printf("%d ", z[i][j]);



		}
		printf("\n");
	}




	fclose(fp);
	fclose(fp2);
	return 0;
}
注:これは2 D配列で、動的割り当て時に**として受信されます.
flcloseと書いてメモリを無駄にしません.

回答結果



その他の質問


課題#05の入力ファイルに対して、マトリクス乗算結果を出力する.でもtxt
柱数とm 2.txtの行数は同じです.
Ex)
m1.txt
5 2
1 1
2 0
0 0
0 0
0 1
m2.txt
2 3
1 1 1
0 0 2
(output)
5 3
1 1 3
2 2 2
0 0 0
0 0 0
0 0 2

回答結果

#include <stdio.h>
#include <stdlib.h>

int main() {
	int n, m, l; // n 세로줄 m 가로줄 l 배열 안의 값
	int n2, m2; // n2 y 배열 받을 세로줄  m2 가로줄
	int i, j, k;
	int** x; 
	int** y;
	int** z;


	printf("컴퓨터학부 2019115615 김규회\n");
	FILE* fp = NULL;
	fopen_s(&fp, "m1.txt", "r");
	if (fp == NULL) {
		return 0;
	}


	fscanf_s(fp, "%d %d", &n, &m);

	x = (int**)malloc(sizeof(*x) * n);
	for (i = 0; i < n; i++) {
		x[i] = (int*)malloc(m * sizeof(**x));

	}

	for (int i = 0; i < n; i++) {


		for (j = 0; j < m; j++) {
			fscanf_s(fp, "%d", &l);
			x[i][j] = l;

		}

	}
	FILE* fp2 = NULL;
	fopen_s(&fp2, "m2.txt", "r");
	if (fp2 == NULL) {
		return 0;
	}


	fscanf_s(fp2, "%d %d", &n2, &m2);
	y = (int**)malloc(sizeof(*y) * n2);
	for (i = 0; i < n2; i++) {
		y[i] = (int*)malloc(m2 * sizeof(**y));

	}
	for (int i = 0; i < n2; i++) {


		for (j = 0; j < m2; j++) {
			fscanf_s(fp2, "%d", &l);
			y[i][j] = l;

		}

	}
	z = (int**)malloc(sizeof(*z) * n);
	for (i = 0; i < n; i++) {
		z[i] = (int*)malloc(m2 * sizeof(**z));

	}


	for (i = 0; i < n; i++) {
		for (j = 0; j < m2; j++) {
			z[i][j] = 0;
			for (k = 0; k < m; k++) {
				z[i][j] = z[i][j] + (x[i][k] * y[k][j]);
			}

		}



	}

	printf("%d %d\n", n, m2);
	for (i = 0; i < n; i++) {
		for (j = 0; j < m2; j++) {
			printf("%d ", z[i][j]);
		}

		printf("\n");
	}

	fclose(fp);
	fclose(fp2);
	return 0;
}
注意すべき点:行列乗算の計算方法を知ってから解くことができます.

回答結果