41.Дан код a[n][m]. Что определяет значение перемен-
ной *(a +m*i+ j)?
42.Дан код a[n][m]. Что определяет значение перемен-
ной a[i][j]?
Варианты заданий :
При выполнении заданий необходимо обязательно использовать динамическую память.
1.Дополнить матрицу строкой, содержащей максимумы по столбцам.
2.Дополнить матрицу столбцом, содержащим максимумы по строкам.
3.Вычислить произведение двух матриц.
4.Вычислить произведение матрицы на вектор.
5.Транспонировать матрицу.
6.Найти максимальный элемент матрицы.
7.По заданной матрице составить вектор, элементы которого равны суммам элементов соответствующей строки.
8.По заданной матрице составить вектор, элементы которого равны суммам элементов соответствующего столбца.
9.По заданной матрице составить вектор, элементы которого равны произведениям элементов соответствующей строки.
10.По заданной матрице составить вектор, элементы которого равны произведениям элементов соответствующего столбца.
11.Поменять местами строки матрицы с номерами i и j.
12.Поменять местами столбцы матрицы с номерами i и
j.
13.В матрице найти строку, состоящую только из отрицательных чисел.
14.Проверить матрицу на симметричность.
15.Проверить совпадение двух матриц.
16.Найти минимальный элемент матрицы.
4
17. Проверить, является ли матрица верхней треуголь-
ной.
18.Удалить из матрицы дублирующие строки.
19.Удалить из матрицы дублирующие столбцы.
20.Проверить, является ли матрица нижней треуголь-
ной.
21. Подсчитать количество различных элементов мат-
рицы.
22.В матрице найти столбец, состоящий только из отрицательных чисел.
23.Определить в матрице строку с наименьшей суммой элементов.
24.Определить в матрице столбец с наименьшей суммой элементов.
25.Заменить в матрице строку с номером i на сумму строк с номерами i и j. Строку с номером j удалить.
26.Определить номер строки матрицы, в которой находится максимальная сумма элементов столбцов с номером k и l.
27.Определить в матрице строки, элементы которых расположены по возрастанию.
28.Определить в матрице строки, в которых отрицательных элементов больше, чем положительных.
29.Определить в матрице строки, в которых есть одинаковые элементы.
30.Определить в матрице строки, в которых все элементы разные.
Решение задач с динамической памятью ничем не отличается от решения задач со статической памятью. Поэтому если студент не овладел навыками для выделения динамической памяти, то он совершено спокойно может решать задачу, не используя понятие динамической памяти. Перейти от одного вида памяти к другой простая формальность, которая почти не влияет на структуру программы.
5
Пример решения варианта задания:
Дана матрица, используя динамическую память, составить программу ввода элементов матрицы с клавиатуры и вывод ее на экран монитора.
Анализ задачи.
1. Начальные данные:
а) переменные n и m, которые задают размер матрицы; б) переменная a, которая является указателем на ука-
затель для выделения динамической памяти;
в) переменные i и j для индексов строк и столбцов матрицы.
2. Результаты вычисления:
а) для матрицы выделяется динамическая память; б) в память для матрицы с клавиатуры введены числа.
3. Решаем данную задачу для матрицы с заранее определенного размера.
Программа 1. void main()
{
const n = 4, m = 5; int a[n][m];
int i,j; clrscr();
cout << “Введи элементы матрицы:\n”; for ( i = 0; i <= n-1; i++ )
for ( j = 0; j <= m-1; j++)
{ printf("a[ %d, %d ]= ", i, j); // Поясняющий текст. scanf( " %d", &a[i][j] ); }
cout << “Введена матрица:\n”; for ( i = 0; i <= n-1; i++ )
{for ( j = 0; j <= m-1; j++)
printf("%d ",a[i][ j]); // Вывод элемента i-той строки
// матрицы.
6
printf(“\n”); // Перевод курсора на новую строку монитора.
}
getch(); }
4. Решаем задачу для матрицы, размер которой определяется во время работы программы (для динамической матрицы). void main()
{
int n, m; int **a;
int i,j; clrscr();
cout << “Введи количество строк и количество столбцов матрицы: ”;
cin >> n >> m; // Вводится размер матрицы.
a = new int *[n]; // Выделяется память под массив указателей. for ( i = 0; i < n; i++)
a[i] = new int[m]; // Выделяется память под элементы i-той строки
cout << “Введи элементы матрицы:\n”; for ( i = 0; i <= n-1; i++ )
for ( j = 0; j <= m-1; j++)
{ printf("a[ %d, %d ]= ", i, j); // Поясняющий текст. scanf( " %d", &a[i][j] ); }
cout << “Введена матрица:\n”; for ( i = 0; i <= n-1; i++ )
{ for ( j = 0; j <= m-1; j++)
printf("%d ",a[i][ j]); // Вывод элемента i-той строки
// матрицы.
printf(“\n”); // Перевод курсора на новую строку монитора.
}
getch(); }
Комментарий. Сравним решения одной и той же задачи, которые отличаются друг от друга технологией выделения
7
памяти. В программах жирным шрифтом обозначены коды, по которым эти программы не совпадают. Из сравнения видно, что никакой принципиальной разницы между программами не существует. Несколько иначе обстоит дело, если динамическая память выделяется под матрицу как под одномерный массив (см. лекции методического комплекса). В этом случае принципиальной разницы между кодами программ также не существует, но изменяется формат доступа к элементам матрицы. Это означает, что для того чтобы перейти от программы 1 к программе с динамической памятью, надо все коды a[i][j] заменить на коды *(a + i*m + j), здесь a – указатель на первый элемент матрицы, а i*m + j – порядковый номер элемента матрицы (см. лекции методического комплекса).
8