Лекция 11



Работа с матрицами.

Способы размещения матрицы в памяти


1. Двойные индексы


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. Реализация матрицы на базе одномерного массива


Задача 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;

}