Лекция 11
double matr[100][200]; - матрица размеров 100 строк на 200 столбцов
matr[i][j] – элемент i-й строки и j-го столбца
Вопрос: что такое matr[i] - ?
Задача 1. Перемножить две матрицы
void mult(double m1[100][200], double m2[200][300], double m3[100][300]) {
int i, j, k;
for (i = 0; i < 100; i++) {
for (j = 0; j < 300; j++) {
m3[i][j] = 0;
for (k = 0; k < 200; k++) {
m3[i][j] += m1[i][k] * m2[k][j];
}
}
}
}
Матрица 100 строк на 200 столбцов
Матрица должна размещаться в памяти по строкам.
Память:
… [0][0] [0][1] [0][2] [0][3] … [0][199] [1][0] [1][1] [1][2] … [1][199] ... [99][0] [99][1] … [99][199] …
Что такое matr[0]? Это адрес начала матрицы
Что такое matr[1]? Это адрес строки с номером 1
Вопрос: что такое matr[i]? Это адрес строки с номером i
Задача 2. В файле input.txt находятся размеры матрицы (два целых числа: количество строк и количество столбцов) и ее элементы.
Считать матрицу из файла, найти столбец с минимальным элементом и вычесть его из всех остальных столбцов.
Получившую матрицу вывести в файл output.txt (размеры не выводить).
В случае некорректных данных программа должна возвращать -1, в остальных случаях 0.
В программе должны вызываться функции.
a00 a01 a02 …
a10 a11 a12 …
...
ai0 ai1 ai2 … aij ... ai(K-1)
...
a(N-1)0 ...
Замечание. Перед i-й строкой — ровно i строк, в каждой строке — K элементов.
Поэтому номер элемента ai0 в матрице: i * K, а номер aij = j + i * K
#include <stdio.h>
void process(double *matr, int N, int K);
void process(double *matr, int N, int K) {
double minElement;
int minElColumn = 0;
int i, j;
minElement = matr[0];
for (i = 0; i < N; i++) {
for (j = 0; j < K; j++) {
if (matr[j + i * K] < minElement) {
minElement = matr[j + i * K];
minElColumn = j;
}
}
}
for (j = 0; j < K; j++) {
if (j != minElColumn) {
for (i = 0; i < N; i++) {
matr[j + i * K] -= matr[minElColumn + i * K]
}
}
}
}
int main(void) {
FILE *IN, *OUT;
double *matr;
int N, K, i, j;
IN = fopen("input.txt", "r");
if (IN == NULL) {
printf("File not opened\n");
return -1;
}
if (fscanf(IN, “%d%d”, &N, &K) != 2) {
printf("Not enough data\n");
fclose(IN);
return -1;
}
if ((N <= 0) || (K <= 0)) {
printf("Wrong matrix size\n");
fclose(IN);
return -1;
}
matr = (double*)malloc(N * K * sizeof(double)); /* sizeof(matr[0]) */
if (matr == NULL) {
printf("Memory not allocated\n");
fclose(IN);
return -1;
}
for (i = 0; i < N * K; i++) {
if (fscanf(IN, "%lf", &matr[i]) != 1) {
printf("Not enough numbers\n");
free(matr);
fclose(IN);
return -1;
}
}
fclose(IN);
process(matr, N, K);
OUT = fopen("output.txt", "w"); /* "out___.txt" – образец */
if (OUT == NULL) {
printf("File output.txt not opened\n");
return -1;
}
for (i = 0; i < N; i++) {
for (j = 0; j < K; j++) {
fprintf(OUT, "%lf ", matr[j + i * K]);
}
fprintf(OUT, "\n");
}
fclose(OUT);
free(matr);
return 0;
}