Вы находитесь на странице: 1из 14

Лабораторная работа №5.

Матрицы и указатели

Цель работы: приобретение навыков реализации алгоритмов обработки


матриц на языке программирования Си. Перед выполнением работы необходимо
изучить правила описания и использования переменных типа массив и указатель.

Общие сведения.

Основные сведения, касающихся описании массива и указателей даны в


лабораторная работа №4. В языке СИ определены только одномерные массивы,
но поскольку элементом массива может быть массив, можно определить и
многомерные массивы, простейшей формой которых является двумерный
массив. Двумерные массивы называют также матрицами. При описании массива
первый размер определяет количество строк, а второй - количество столбцов.
Двумерный массив int a[2][4]

а[0][0] a[0][l] a[0][2] a[0][3]

а[1][0] a[1][l] a[1][2] a[1][3]

Первый индекс - номер строки, второй индекс - номер столбца.

Рассмотрим пример программы, которая заполняет элементы матрицы


случайными числами a[n][n] и осуществляет вывод данных в виде матрицы.

#include<stdio.h>

#include<stdlib.h>

#define n 10

void main()

{ int a[n][n],i,j,k,*pa,s1;

pa=&a[0][0];

for(i=0;i<n;i++)

{for(j=0;j<n;j++)

{*pa=rand()%9;

printf("%d ",*pa);

pa++;
} printf("\n");

getch();

Задание А.

Составить блок-схему и программу обработки матрицы. Элементы массива


заполнить, используя функцию генератора случайных чисел.

Пример задания А. Дана целочисленная матрица размером 8 на 8.


Найти:

1) такие k, что k-я строка матрицы совпадает с k-м столбцом;

2) сумму элементов в тех строках, которые содержат хотя бы один


отрицательный элемент.

На рисунке 2.5.1 приведена блок-схема решения задания


Рисунок 2.5.1 -Блок-схема решения задания
Программа может иметь следующий вид:

#include <stdio.h>

#include <stdlib.h>

#define m 8

#define n 8

int main()

{ int matrix[n][m]; /* Объявляем матрицу nхm */

int i, j, p; /* Счетчик и признак совпадения */

int p1, iSumm; /* признак нахождение отрицательного элемента и


переменная для хранения суммы */

/* генератором случайных чисел заполняем матрицу */

for (i = 0; i < m; i++)

for (j = 0; j < n; j++)

matrix[i][j]=rand()%10-1;

printf("\n Сгенерированная матрица имеет вид:\n ");

/* вывод матрицы */

for (i = 0; i < m; i++)

{ for (j = 0; j < n; j++)

printf(“%d “,matrix[i][j]);

printf("\n ");

printf("\n \t\t\tРЕЗУЛЬТАТ ПЕРВОЙ ЧАСТИ ЗАДАНИЯ");

for (i = 0; i < m; i++)

{ p=1;

for (j = 0; j < n; j++)


{ /* Сравниваем элемент i-й строки j-го столбца с элементом j-й
строки i-го столбца. В случае их несоответствия присваиваем p значение нуль и
прерываем цикл по j конструкцией break */

if (matrix [i][j] != matrix [j][i])

{ p=0;

break;

/* В случае p=1 выводим на экран номер соответствующей строки */

if (p==1) printf("\n k = %d ", i);

if (p==0) printf("\n нет одинаковых строк и столбцов ");

printf("\n \t\t\tРЕЗУЛЬТАТ ВТОРОЙ ЧАСТИ ЗАДАНИЯ");

printf("\n\n");

for (i = 0; i < m; i++)

/* Присваеваем переменным исходные значения */

iSumm = 0;

p1=0;

for (j = 0; j < n; j++)

{ /* Суммируем значения элементов i-й строки */

iSumm += matrix [i][j];

/* При нахождение хотя бы одного отрицательного элемента


присваиваем p1=1, обозначающее необходимость вывода Суммы на экран */

if (matrix [i][j] < 0) p1=1;

}
/* В случае нахождения в строке хотя бы одного
отрицательного элемента выводим на экран сумму элементов i-й строки
*/

if (p1==1) printf("Сумма элементов строки #%d = %d\n", i+1, iSumm);

system("PAUSE");/* задержка экрана*/

return 0;

Результат выполнения программы:

Сгенерированная матрица имеет вид

27271403

1 0 7 6 0 -8 3 5

27181493

92852006

71139391

8 2 4 9 1 -6 4 9

03909488

18328280

РЕЗУЛЬТАТ ПЕРВОЙ ЧАСТИ ЗАДАНИЯ

Совпавшие строки и столбцы

k=2

k=6
РЕЗУЛЬТАТ ВТОРОЙ ЧАСТИ ЗАДАНИЯ

Сумма элементов строки #1 = 14

Сумма элементов строки #5 = 31

Варианты задания А.

1) Дана целочисленная прямоугольная


матрица. Определить:

а) количество строк, не содержащих ни одного нулевого элемента;

б) максимальное из чисел, встречающихся в заданной матрице более


одного раза.

2) Дана целочисленная прямоугольная матрица.

а) Определить количество столбцов, не содержащих ни одного нулевого


элемента.

б) Характеристикой строки целочисленной матрицы назовем сумму ее


положительных четных элементов. Переставляя строки заданной матрицы,
расположить их в соответствии с ростом характеристик.

3) Дана целочисленная прямоугольная матрица. Определить:

а) количество столбцов, содержащих хотя бы один нулевой элемент;

б) номер строки, в которой находится самая длинная серия одинаковых


элементов.

4) Дана целочисленная квадратная матрица. Определить:

а) произведение элементов в тех строках, которые не содержат


отрицательных элементов;

б) максимум среди сумм элементов диагоналей, параллельных главной


диагонали матрицы.

5) Дана целочисленная квадратная матрица. Определить:

а) сумму элементов в тех столбцах, которые не содержат отрицательных


элементов;
б) минимум среди сумм модулей элементов диагоналей, параллельных
побочной диагонали матрицы.

6) Дана целочисленная прямоугольная матрица. Определить:

а) сумму элементов в тех строках, которые содержат хотя бы один


отрицательный элемент;

б) номера строк и столбцов всех седловых точек матрицы.

ПРИМЕЧАНИЕ:матрица А имеет седловую точку Аij, если Aij является


минимальным элементом в i-й строке и максимальным в j-м столбце.

7) Для заданной матрицы размером 8 на 8:

а) найти такие k, что k-я строка матрицы совпадает с k-м столбцом;

б) найти сумму элементов в тех строках, которые содержат хотя бы один


отрицательный элемент.

8) Характеристикой столбца целочисленной матрицы назовем сумму


модулей его отрицательных нечетных элементов:

а) переставляя столбцы заданной матрицы, расположить их в соответствии


с ростом характеристик;

б) найти сумму элементов в тех столбцах, которые содержат хотя бы один


отрицательный элемент.

9) Соседями элемента Аij в матрице назовем элементы Аi-1,j-1. Аi-1,j, Аi-


1,j+1, Аi,j-1, Аi,j+1, Аi+1,j-1. Аi+1,j, Аi+1,j+1Операция сглаживания матрицы дает новую
матрицу того же размера, каждый элемент которой получается как среднее
арифметическое имеющихся соседей соответствующего элемента исходной
матрицы.

а) Построить результат сглаживания заданной вещественной матрицы


размером 10 на 10 .

б) В сглаженной матрице найти сумму модулей элементов,


расположенных ниже главной диагонали.

10) Элемент матрицы называется локальным минимумом, если он строго


меньше всех имеющихся у него соседей.

а) подсчитать количество локальных минимумов заданной матрицы


размером 10 на 10;
б) найти сумму модулей элементов, расположенных выше главной
диагонали.

11) Коэффициенты системы линейных уравнений заданы в виде


прямоугольной матрицы.

а) с помощью допустимых преобразований привести систему к


треугольному виду;

б) найти количество строк, среднее арифметическое элементов которых


меньше заданной величины.

12) Дана действительная квадратная матрица порядка n.

а) уплотнить заданную матрицу, удаляя из нее строки и столбцы,


заполненные нулями;

б) найти номер первой из строк, содержащих хотя бы один положительный


элемент.

13) Дана действительная квадратная матрица порядка n.

а) осуществить циклический сдвиг элементов прямоугольной матрицы


на п элементов вправо или вниз (в зависимости от введенного режима). n может
быть больше количества элементов в строке или столбце;

б) найти номер последней из строк, содержащих хотя бы один ненулевой


элемент.

14) Дана действительная квадратная матрица порядка n.

а) осуществить циклический сдвиг элементов квадратной матрицы


размерности МхN вправо на k элементов таким образом: элементы 1-й строки
сдвигаются в последний столбец сверху вниз, из него - в последнюю строку
справа налево, из нее - в первый столбец снизу вверх, из него - в первую строку;
для остальных элементов - аналогично;

б) найти сумму положительных элементов нечетных строк.

15) Дана целочисленная прямоугольная матрица.

а) определить номер первого из столбцов, содержащих хотя бы один


нулевой элемент;

б) характеристикой строки целочисленной матрицы назовем сумму ее


отрицательных четных элементов. Переставляя строки заданной матрицы,
расположить их в соответствии с убыванием характеристик.
16) Дана целочисленная прямоугольная матрица.

а) упорядочить строки целочисленной прямоугольной матрицы по


возрастанию количества одинаковых элементов в каждой строке.

б) найти номер первого из столбцов, не содержащих ни одного


отрицательного элемента.

17) Дана квадратная вещественная матрица.

а) путем перестановки элементов матрицы добиться того, чтобы ее


максимальный элемент находился в левом верхнем углу, следующий по величине
- в позиции (2,2), следующий по величине - в позиции (3,3) и т. д., заполнив таким
образом всю главную диагональ.

б) найти номер первой из строк, не содержащих ни одного положительного


элемента.

18) Дана целочисленная прямоугольная матрица. Определить:

а) количество строк, содержащих хотя бы один нулевой элемент;

б) номер столбца, в которой находится самая длинная серия одинаковых


элементов.

19) Дана целочисленная квадратная матрица. Определить:

а) сумму элементов в тех строках, которые не содержат отрицательных


элементов;

б) минимум среди сумм элементов диагоналей, параллельных главной


диагонали матрицы.

20) Дана целочисленная прямоугольная матрица. Определить:

а) количество отрицательных элементов в тех строках, которые


содержат хотя бы один нулевой элемент;

б) номера строк и столбцов всех седловых точек матрицы.

ПРИМЕЧАНИЕ: матрица A имеет седловую точку Aij если Аij является


минимальным элементом в i-й строке и максимальным в j-м столбце.
Задание Б.

Составить программу обработки матрицы. Доступ к элементам матрицы


осуществлять с помощью указателя. Элементы матрицы заполнить, используя
функцию генератора случайных чисел.

Пример. Дана целочисленная матрица размером 8 на 8. Найти:

а) такие k, что k-я строка матрицы совпадает с k-м столбцом;

б) сумму элементов в тех строках, которые содержат хотя бы один


отрицательный элемент.

Пример решения задачи:

#include <stdio.h>

#include <stdlib.h>

#define m 8

#define n 8

void main()

{ int matrix[n][m]; /* Объявляем матрицу nхm */

int i, j, p; /* Счетчик и признак совпадения */

int *mat; /* Объявляем указатель на матрицу matrix[n][m] */

mat=&matrix[0][0]; /* указателю mat присваиваем адрес нулевого элемента


матрицы matrix[n][m] */

/* генератором случайных чисел заполняем матрицу */

for (i = 0; i < m; i++)

for (j = 0; j < n; j++)

{*mat=rand()%10-1;

mat++;

}
mat-= n*m; /* указателю mat присваиваем первоначальный адрес */

printf("\n Сгенерированная матрица имеет вид:\n ");

/* вывод матрицы */

for (i = 0; i < m; i++)

{ for (j = 0; j < n; j++)

{printf(“%d “,*mat);

mat++;

printf("\n ");

mat-= n*m;

printf("\n \t\t\tРЕЗУЛЬТАТ ПЕРВОЙ ЧАСТИ ЗАДАНИЯ");

printf("\n Совпавшие строки и столбцы ");

for (i = 0; i < m; i++)

{ p=1;

for (j = 0; j < n; j++)

{ /* Сравниваем элемент i-й строки j-го столбца с элементом j-й


строки i-го столбца. В случае их несоответствия присваиваем p значение нуль и
прерываем цикл по j конструкцией break */

if (*(mat+i * m + j) != *(mat+j * m + i))

{ p=0;

break;

/* В случае p=1 выводим на экран номер соответствующей строки */

if (p==1) printf("\n k = %d ", i);


}

if (p==0) printf("\n нет одинаковых строк и столбцов ");

printf("\n \t\t\tРЕЗУЛЬТАТ ВТОРОЙ ЧАСТИ ЗАДАНИЯ");

mat=&matrix[0][0];

int p1, iSumm; /* признак нахождение отрицательного элемента и


переменная для хранения суммы */

printf("\n\n");

for (i = 0; i < m; i++)

/* Присваеваем переменным исходные значения */

iSumm = 0;

p1=0;

for (j = 0; j < n; j++)

{ /* Суммируем значения элементов i-й строки */

iSumm += *mat;

/* При нахождение хотя бы одного отрицательного элемента


присваиваем p1=1, обозначающее необходимость вывода Суммы на экран */

if (*mat < 0) p1=1; mat++;

/* В случае нахождения в строке хотя бы одного


отрицательного элемента выводим на экран сумму элементов i-й строки
*/

if (p1==1) printf("Сумма элементов строки #%d = %d\n", i+1, iSumm);

system("PAUSE");/* задержка экрана*/

return 0;

}
Результат выполнения программы.

Результат решения имеет тот же вид, что и в задании А.

Варианты задания Б. Варианты задания Б соответствуют


вариантам задания А данной лабораторной работы.

Контрольные вопросы.

1) Каким образом определяются переменные типа массив?

2) Какие операторы языка Си используются при обработке элементов массива?

3) Как осуществляется доступ к отдельному элементу матрицы с помощью


указателя?

4) Каким образом выводятся элементы матрицы на экран?

5) Какой результат унарной операции &?

6) Какой результат унарной операции *?

7) Выражение uk=&a[0][0] эквивалентно uk=a?

8) Выражения &a[i][j] и a+i+j идентичны?

Вам также может понравиться