Лабораторная работа № 5.
Двумерные массивы (матрицы)
Массивы в С могут быть не только одномерными, т.е. когда данные визуально выстроены в одну линию. Массивы также могут быть и двумерными, трехмерными и так далее. С++ компиляторы поддерживают как минимум 12-ти мерные массивы!!! Естественно, что такими большими массивами на практике никто не пользуется, т.к. человеку сложно их визуально представить у себя в голове, не то что написать программу, которая оперирует таким сложными массивами. На практике редко применяют массивы, более трехмерного. Одномерный – это строка, двумерный – матрица (таблица), трехмерный – куб, а вот дальше уже сложно, поэтому дальше, обычно, никто и не идет...
Двумерный массив – это так называемая матрица (или таблица), у которой есть строки и столбцы. По соглашению программистов первый индекс массива будет указывать на строки, а второй на столбцы.
Фактически двумерный массив — это одномерный массив одномерных массивов. Структура двумерного массива, с именем a, размером m на n показана ниже:
где, m – количество строк двумерного массива;
n – количество столбцов двумерного массива;
m * n – количество элементов массива.
Вот пример объявления и инициализации двумерного массива, состоящего из трех строк и пяти столбцов.
int aMatrix[3][5] = {{3, 5, 5, 7, 8},
{4, 1, 1, 2, 9},
{3, 8, 8, 9, 7}};
Двумерный массив имеет два индекса. Можно и так записать, как показано ниже. Разницы для компилятора не будет никакой. Разве лишь разница будет в визуальном восприятии для человека:
int aMatrix[3][5] = {{3, 5, 5, 7, 8}, {4, 1, 1, 2, 9}, {3, 8, 8, 9, 7}};
Либо вообще так, без указания фигурных скобок, которые логически разделяют строки друг от друга.
int aMatrix[3][5] = {3, 5, 5, 7, 8, 4, 1, 1, 2, 9, 3, 8, 8, 9, 7};
Последняя запись демонстрирует то, как на самом деле элементы массива размещаются в памяти компьютера.
Для доступа к элементам двумерного массива нужно, так же, как и для одномерного указать индекс. В данном случае нужно будет указывать два индекса. Например, чтобы перезаписать последний элемент второй строки, мы должны использовать такую запись
aMatrix[1][4] = 0;
В этом случае мы перезапишем значение 9 на 0.
Для прохода по двумерному массиву удобнее всего использовать два цикла for, вложенных друг в друга.
Пример программы:
Дана матрица размером n строк и m столбцов (0<n<=20, 0< m<=30). Найти сумму положительных элементов каждой строки.
#include <stdio.h>
#include <conio.h>
/* Сумма по строкам*/
#define NMAX 20
#define MMAX 30
main()
{float x;
int i,j;
float s;
int n,m;
puts("Введи n m"); scanf("%d%d",&n,&m);
puts ("Введи матрицу");
for (i=0;i<n; i++)
{s=0;
for(j=0;j<m;j++)
{scanf("%f", &x);
if (x>0) s=s+x;
}
printf ("\n Строка %d, s= %.2f",i,s);
}
getch();
return 0;
}
Пример результатов тестирования программы:
-9 | -7 | ||||
-1 | -9 | -1 | |||
-2 | -3 | -8 | -9 | -4 |
Результат:
Строка 1 сумма = 5
Строка 2 сумма = 12
Строка 3 сумма = 9
Строка 4 сумма = 0
Порядок выполнения работы.
1. Получить задание у преподавателя.
2. Составить программу на Си и подобрать тесты для проверки программы на ЭВМ.
3. Отладить программу на ЭВМ.
4. Оформить и сдать отчет по лабораторной работе.
Задания для самостоятельного выполнения
1. Дана матрица размером n x m. Вычислить сумму положительных элементов каждой строки и найти номер строки, в которой эта сумма максимальна.
2. Определить, является ли заданная целочисленная квадратная матрица магическим квадратом, то есть такой, что суммы всех элементов во всех строках и столбцах одинаковы.
3. Дана матрица размером n x m. Найти минимальный элемент в каждом столбце матрицы (из ненулевых) и разделить на него все элементы этого столбца.
4. Дана матрица размером n x m. В каждой строке переставить местами наибольший и наименьший элементы матрицы.
5. Дана квадратная матрица размером n x n. Вычислить сумму элементов, расположенных над главной диагональю.
6. Дана квадратная матрица размером n x n. Найти наибольший элемент главной диагонали, и вывести всю строку, в которой он находится.
7. Дана матрица размером n x m. Найти наибольший положительный и наименьший отрицательный элементы матрицы.
8. Дана квадратная матрица размером n x n. Найти строку с наибольшим количеством отрицательных элементов.
9. Элементы матрицы А(n x n) назовем седловой точкой, если он одновременно является наименьшим в своей строке и наибольшим в своем столбце или наоборот. Найти индексы всех седловых точек матрицы.
10. Дана квадратная матрица размером n x n. Найти сумму отрицательных элементов в каждой строке.
11. Дан двумерный массив n х m элементов, найти количество четных и нечетных чисел в массиве.
12. Дан двумерный массив n х m элементов. Определить, сколько раз встречается число 7 среди элементов массива.
13. Дан массив из n x m элементов. Определить, сколько элементов массива больше заданного числа.