(資料構造)大学カリキュラムリスト追加、マトリクス多用
5202 ワード
質問する
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;
}
注意すべき点:行列乗算の計算方法を知ってから解くことができます.回答結果
Reference
この問題について((資料構造)大学カリキュラムリスト追加、マトリクス多用), 我々は、より多くの情報をここで見つけました https://velog.io/@k_gu_wae123/자료구조대학수업-Matrix-Addition-Matrix-Multiplicationテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol