Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмизация и ОП / 5 Лабораторная работа №5.doc
Скачиваний:
25
Добавлен:
09.02.2016
Размер:
100.35 Кб
Скачать

2.5 Лабораторная работа №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;

}

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

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

2 7 2 7 1 4 0 3

1 0 7 6 0 -8 3 5

2 7 1 8 1 4 9 3

9 2 8 5 2 0 0 6

7 1 1 3 9 3 9 1

8 2 4 9 1 -6 4 9

0 3 9 0 9 4 8 8

1 8 3 2 8 2 8 0

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

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

k = 2

k = 6

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. произведение элементов в тех строках, которые не содержат отрицательных элементов;

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

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

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

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

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