Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторный практикум

.pdf
Скачиваний:
50
Добавлен:
15.06.2021
Размер:
3 Mб
Скачать

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

Инициализация элементов матрицы:

тип идентификатор[кол-во_строк][кол-во_столбцов]=

{

{значение 00, …, <значение 0, кол-во столбцов - 1},

..,

{значение кол-во_строк, 0, …, значение кол-во строк - 1,, кол-во столбцов - 1}

}

Значения при инициализации задаются по строкам. Сначала значения первой строки, затем второй и т.д. Значения каждой строки объединяются с помощью операторных фигурных скобок { }.

Пример инициализации:

int a[2][3]={{2,6,–1},{–2,1,9}};

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

const int n=2,m=3; int a[n][m];

cout<<"Исходная матрица"<<endl; for(int i=0;i<n;i++)

{

cout<<"Введите "<<i+1<<"строку>"; for(int j=0;j<m;j++)cin>>a[i][j];

}

В данном фрагменте сначала выводится на экран сообщение «Введите номер_строки строку». Например: «Введите 1 строку». После этого компьютер ожидает ввода элементов текущей строки.

Формирование значений для элементов матрицы с помощью датчика случайных чисел. Элементы матрицы можно сформировать с помощью датчика случайных чисел. Инициализация датчика рассмотрена в лабораторной работе № 4. Фрагмент программы, формирующей матрицу, представлен ниже:

83

int a[5][6]; srand((unsigned)time(NULL)); for(int i=0;i<5;i++)

for(int j=0;j<6m;j++) a[i][j]=rand()/100-100;

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

cout<<"Массив>"<<endl; for(int i=0;i<n;i++)

{

for(int j=0;j<m;j++) cout<<a[i][j]<<setw(3); cout<<endl;

}

В данном фрагменте значения элементов матрицы выводятся построчно.

Основные типы задач, решаемых с использованием матриц.

Можно выделить пять основных типов задач по обработке матриц.

1.Поиск каких-либо значений среди элементов всей матрицы.

2.Поиск каких-либо значений в каждой строке матрицы и формирование одномерного массива из этих значений.

3.Поиск каких-либо значений в каждом столбце матрицы и формирование одномерного массива из этих значений.

4.Поиск каких-либо элементов матрицы и формирование одномерного массива из значений компонентов матрицы с заранее неизвестным количеством формируемого одномерного массива.

5.Обработка квадратных матриц.

Примеры программирования для задач каждого типа

При решении задач типа 1, где необходимо найти какое-либо значение среди всех элементов матрицы, начальные значения искомых величин задаются до циклов.

Пример 1. Дана целочисленная матрица 4 5. Найти наименьший элемент и его местоположение.

Решение. Определим номер строки и номер столбца минимального элемента матрицы. Алгоритм поиска минимального элемента в матрице аналогичен алгоритму поиска минимального элемента в одномерном массиве, за исключением того, что при работе с матрицей используются два вложенных цикла: по строкам и по столбцам. Схема алгоритма представлена на рис.1.

84

Текст программы:

#include <iostream> #include <iomanip> #include <time.h>

using namespace std; void main()

{

setlocale(LC_CTYPE, "Russian"); srand((unsigned)time(NULL)); const int n = 4, m = 5;

int a[n][m];

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

for(int j=0;j<m;j++)a[i][j]=rand()/100-100; int min = a[0][0], n_min = 0, m_min = 0;

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

{

for (int j = 0; j<m; j++) if (a[i][j]<min)

{

min = a[i][j]; n_min = i; m_min = j;

}

}

cout << "Матрица>" << endl; for (int i = 0; i<n; i++)

{

for (int j = 0; j<m; j++)

cout << setw(6) << a[i][j]; cout << endl;

}

cout << "Минимальный элемент=" << min << " в стро-

ке=" << n_min + 1 << " в столбце=" << m_min + 1 << endl;

}

85

Рис.1. Схема алгоритма к примеру 1

86

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

Рис.2. Результат выполнения программы к примеру 1

Пример 2. Написать программу для вычисления среднего арифметического значения среди всех положительных элементов матрицы.

Решение. Вычислим сумму положительных элементов матрицы и их количества, а затем разделим найденную сумму на количество. Как и в примере 1, при работе с матрицей использовались вложенные циклы.

Текст программы:

#include <iostream> #include <iomanip> #include <time.h>

using namespace std; void main()

{

setlocale(LC_CTYPE, "Russian"); srand((unsigned)time(NULL));

const int n = 4, m = 5;// количество строк и столбцов

int a[n][m];

//Формирование матрицы for (int i = 0; i<n; i++)

for (int j = 0; j<m; j++)a[i][j]=rand()/100-100;

//Нахождение среднего арифметического значения

int sum = 0, k = 0;

for (int j = 0; j<m; j++)

{

for (int i = 0; i<n; i++) if (a[i][j]>0)

{

87

k++; sum += a[i][j];

}

}

double sr = sum*1.0 / k;

// Вывод матрицы на экран cout << "Матрица>" << endl; for (int i = 0; i<n; i++)

{

for(int j=0;j<m;j++)cout << setw(6) << a[i][j]; cout << endl;

}

cout << "Среднее арифметическое значение =" << sr << endl;

}

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

Рис.3. Результат выполнения программы к примеру 2

Особенностью решения задач типа 2 является то, что начальные значения искомых величин задаются перед заголовком второго - внутреннего цикла.

Пример 3. Сформировать одномерный массив из количества отрицательных элементов каждой строки матрицы 3 4.

Решение. Поскольку необходимо сформировать одномерный массив из количества отрицательных элементов каждой строки матрицы, количество формируемого одномерного массива будет равно количеству строк исходной матрицы, а именно трем.

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

88

строки, равное нулю, и далее во внутреннем цикле, если текущий элемент матрицы отрицателен, количество элементов увеличивается на единицу. За внутренним циклом, перед переходом к следующему шагу внешнего цикла, элементу одномерного массива присваивается значение, равное количеству отрицательных элементов. Схема алгоритма представлена на рис. 4, результат выполнения программы - на рис.5.

Рис.4. Схема алгоритма к примеру 3

Рис.5. Результат выполнения программы к примеру 3

89

Текст программы:

#include <iostream> #include <iomanip> #include <time.h>

using namespace std; void main()

{

setlocale(LC_CTYPE, "Russian"); srand((unsigned)time(NULL));

const int n = 3, m = 4;// количество строк и //столбцов матрицы

int a[n][m], b[n];

//Формирование матрицы for (int i = 0; i<n; i++)

for (int j = 0; j<m; j++)

a[i][j] = rand() / 100 - 100;

//Формирование одномерного массива

int kol;

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

{

kol = 0;// начальное значение

//количества отрицательных элементов for (int j = 0; j<m; j++)

if (a[i][j]<0)

{

kol++;

}

b[i] = kol;

}

//Вывод матрицы на экран cout << "Матрица" << endl; for (int i = 0; i<n; i++)

{

for (int j = 0; j<m; j++)

cout << setw(6) << a[i][j]; cout << endl;

}

//Вывод массива на экран

cout << "Массив" << endl;

for (int i = 0; i<n; i++) cout << setw(4) << b[i]; cout << endl;

}

90

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

Пример 4. Сформировать одномерный массив из наибольших элементов каждого столбца матрицы 3 4.

Решение. Поскольку необходимо сформировать одномерный массив из количества наибольших элементов каждого столбца матрицы, количество элементов формируемого одномерного массива будет равно количеству столбцов исходной матрицы, а именно четырем. Начальное значение наибольшего элемента столбца задается перед заголовком внутреннего цикла, который организован по строкам, внешний цикл организован по столбцам. Результат представлен на рис.6.

Рис.6. Результат выполнения программы к примеру 4

Текст программы:

#include <iostream> #include <iomanip> #include <time.h>

using namespace std; void main()

{

setlocale(LC_CTYPE, "Russian"); srand((unsigned)time(NULL));

const int n = 4, m = 5;// количество строк и //столбцов

int a[n][m], b[m];

// Формирование матрицы

91

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

for(int j=0;j<m;j++)a[i][j]= and() / 100 - 100; // Формирование одномерного массива

int max;

 

for (int j = 0; j<m; j++)

 

{

 

max = a[0][j];

 

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

 

if (a[i][j]>max)

max = a[i][j];

b[j] = max;

 

}

 

//Вывод матрицы на экран cout << "Матрица" << endl; for (int i = 0; i<n; i++)

{

for (int j = 0; j<m; j++)

cout << setw(6) << a[i][j]; cout << endl;

}

//Вывод массива на экран

cout << "Массив" << endl;

for (int i = 0; i<m; i++) cout << setw(4) << b[i]; cout << endl;

}

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

Пример 5. Сформировать одномерный массив из элементов массива F 4 5, которые попадают в диапазон [d; l].

Решение. Объявим одномерный массив, состоящий из 20 элементов, и до вычислений зададим начальное значение количества элементов массива, равное нулю. Формировать одномерный массив будем с использованием двух вложенных циклов (по строкам и по столбцам), и если значение текущего элемента матрицы попадает в заданный интервал от d до l, то занесем это значение в одномерный массив и увеличим количество его элементов на единицу. Результат представлен на рис.7.

92