Основные свойства матриц

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

ствительно, если рассматривать квадратную матрицу размером 5x5 элементов (п — 1 = 4), то согласно примеру, приведенному в начале главы 8, видно, что элементы, имеющие координаты А0о, А11; А22, А3з, А44, находятся на главной диагонали. Следовательно, для того чтобы в реальной задаче найти элемент, находящийся на главной диагонали, следует проверить условие (1==з). Основные свойства матриц сведены в табл. 24.

Таблица 24. Основные свойства матриц

Номер строки = номеру столбца і = і

Элемент матрицы находится на главной диагонали

Номер строки > номера столбца і > і

Элемент матрицы находится ниже главной диагонали

Номер столбца > номера строки і < і

Элемент матрицы находится выше главной диагонали

Базовые алгоритмы обработки двумерных массивов

В силу принятого нами подхода к работе с одномерными массивами можно выделить ряд приемов, позволяющих реализовать основные задачи обработки двумерных массивов, а именно:

  • 1. Нахождение количества элементов матрицы при заданном условии.
  • 2. Нахождение суммы значений элементов матрицы при заданном условии.
  • 3. Нахождение произведения значений элементов матрицы при заданном условии.
  • 4. Поиск экстремальных значений элементов матрицы (поиск максимального и/или минимального значения).
  • 5. Обмен столбцов элементов матрицы.
  • 6. Обмен строк элементов матрицы.
  • 7. Удаление заданной строки матрицы.
  • 8. Замена значений элементов матрицы.
  • 9. Формирование матрицы в соответствии с определенными правилами.
  • 10. Транспонирование матриц.
  • 11. Произведение двух матриц.

Ниже описывается реализация перечисленных алгоритмов обработки двумерных массивов. Первые четыре способа чрезвычайно просты, данные алгоритмы неоднократно рассматривались при решении задач в предыдущих разделах и в настоящее время не требуют комментариев. Однако стоит отметить, что в листингах 110, 111, 112 очередной элемент матрицы сравнивается с числом 10, но на практике лучше организовать запрос условия, например, с помощью функции InputBox.

Нахождение количества элементов матрицы при заданном условии Листинг 110

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e) {

Random a = new Random(); int[,] b;

b = new int[5, 5];

int kol = 0;

textBoxl.Clear();

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

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(1, 30);

textBoxl.AppendText(b[i , j] + " ");

if (b[i, j ]>=10)

kol = kol + 1 ;

}

}

MessageBox.Show("Количество элементов матрицы при заданном условии = " + kol.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

Application.Exit();

}

}

}

Нахождение суммы значений элементов матрицы при заданном условии

Листинг 111

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5];

int sum - 0;

textBoxl.Clear();

for (int i — 0; i < 5; i++)

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(1, 12);

textBoxl.AppendText(b[i, j] + " ");

if (b[i, j ]>=10)

sum = sum + b[i, j] ;

}

}

MessageBox.Show("Сумма значений элементов матрицы при заданном условии = " + sum.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

Application.Exit();

}

}

}

Нахождение произведения значений элементов матрицы при заданном условии

Листинг 112

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5];

int proizv = 1;

textBoxl.Clear();

for (int i — 0; i < 5; i++)

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(l, 11);

textBoxl.AppendText(b[i, j] + " ");

if (b[i, j ]>=10)

proizv = proizv * b[i, j];

}

}

MessageBox.Show("Произведение значений элементов матрицы при заданном условии = " + proizv.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

Application.Exit();

}

}

}

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

Листинг 113

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5];

int max = -32768;

int min = 32767;

textBoxl.Clear();

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

{

textBoxl.AppendText(" " + " "); for (int j =0; j <5; j++)

{

b[i, j] = a.Next(10, 70);

textBoxl.AppendText(b[i, j] + " ");

if (b [ i , j ] > max)

max = b[i,j]; if (b[i,j] < min) min = b[i,j];

}

}

MessageBox.Show("Максимальный элемент матрицы = " + max.ToString("n"), "Заголовок окна", MessageBoxButtons.OK,

MessageBoxIcon.Information);

MessageBox.Show("Минимальный элемент матрицы = " + min.ToString("n"), "Заголовок окна", MessageBoxButtons.OK,

MessageBoxIcon.Information);

Application.Exit();

}

}

}

Обмен столбцов элементов матрицы

Задача. В двумерном массиве произвольных чисел обменяйте местами второй и пятый столбцы. Выведите обе матрицы на экран.

Комментарий: после ввода элементов матрицы следует организовать цикл и выполнить в нем три оператора, отвечающие за перестановку столбцов массива:

n = b[i, 1] ; b[i, 1] = b [i, 4] ; b [i, 4] = n ;

Поскольку при первом вхождении в цикл параметр цикла i примет значение, равное 0, то во вспомогательную ячейку п отправляется первый элемент второго столбца, т.е. элемент, имеющий координаты b0i. На его место приходит элемент с координатами Ь04- На освободившееся место приходит элемент, находящийся в ячейке п. Произошел обмен. Поскольку все действия осуществляются в цикле for (int i = 0; i < 5; i++), то происходит обмен элементов второго и пятого столбцов. Разработка алгоритма решения задачи представлена на рис. 137.

В листинге 114 приведен код процедуры, отвечающий за решение задачи.

Листинг 114

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5]; textBoxl.Clear();

textBox2.Сіеаг();

ііог (int і = 0; і < 5; і++)

{

textBoxl.AppendText("гп" + "гп"); ііог (іпЬ і = 0; і < 5; ]++)

{

Ь[і, j] = a.Next(10, 70); textBoxl. AppendText (Ь [ і, :і ] + "

}

}

ііог (іпі: і = 0; і < 5; і++)

іпЬ п = Ь[і, 1 ] ;

Ь[і, 1] = Ь [ і, 4];

Ь[і, 4] = п;

}

ііог (іпЬ і = 0; і < 5; і++)

{

1;ехЬВох2 . Аррег^ТехЬ ("гп" + "гп"); ііог (іпЬ і = 0; і < 5; ]++)

textBox2 . AppendText (Ь [ і , j] + "і;")

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

Результат работы программы

Рис. 138. Результат работы программы: 2-й столбец исходной матрицы

обменен с 5-м столбцом

Обмен строк элементов матрицы

В данной задаче происходит обмен тех строк, номера которых (n_st_l и n_st_2) задает пользователь. Алгоритмически метод ничем не отличается от рассмотренного выше: при обмене следует воспользоваться третьей ячейкой (bufer). В листинге 115 приведен код процедуры, отвечающий за решение задачи.

Листинг 115

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5];

string n_st_l_, n_st_2_;

textBoxl.Clear();

textBox2.Clear();

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

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(10, 70);

textBoxl.AppendText(b[i, j] + " ");

}

}

n_s t_l_ =

Microsoft.VisualBasic.Interaction.InputBox("Введите номер строки, которая подлежит замене", "Окно ввода данных", -1, -1);

int n_st_l= Convert.ToIntl6(n_st_l_);

n_st_2_ =

Microsoft.VisualBasic.Interaction.InputBox("Введите номер строки, которую обменяем", "Окно ввода данных", -1, -1);

int n_st_2= Convert.Tolntl6(n_st_2_); for (int j = 0; j < 5; j++)

{

int bufer = b[n_st_2, j] ; b[n_st_2, j] = b[n_st_l, j] ; b[n_st_l, j] = bufer ;

}

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

{

textBox2.AppendText(" " + " "); for (int j = 0; j < 5; j++)

textBox2.AppendText(b[i, j] + " ");

}

}

}

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

Ш

Обмен

строк

?И х

Исходная матрица

Результирующая матрица

I

40

61 48

52

22

68

22

25

36

51

35

67 28

23

59

35

67

28

23

59

21

58 34

41

24

21

58

34

41

24

10

28 57

68

20

10

28

57

68

20

68

22 25

36

51

40

61

48

52

22

_

Ok

ZI

Рис. 139. Результат работы программы: 0-я строка исходной матрицы обменена с 4-й строкой

Удаление заданной строки матрицы

Удаление заданной строки с номером n_st происходит с помощью сдвига на один шаг вверх всех последующих строк, начиная с n_st+l. Задачу удаления столбца можно решить аналогично.

В листинге 116 приведен код процедуры, отвечающий за решение задачи.

Листинг 116

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5]; string n_st_;

textBoxl.Clear(); textBox2.Clear(); for (int i = 0; i < 5; i++)

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(10, 70);

textBoxl.AppendText(b[i, j] + " ");

}

}

n_st_ =

Microsoft.VisualBasic.Interaction.InputBox("Введите номер строки, которую хотите удалить", "Окно ввода данных", -1, -1);

int n_st = Convert.ToIntl6(n_st_);

//Удаление заданной строки for (int i = n_st + 1; i < 5; i++) for (int j = 0; j < 5; j++) b[i-1,j] - b[i,j] ;

//Вывод результирующей матрицы for (int i = 0; i < 4; i++)

{

textBox2.AppendText(" " + " "); for (int j = 0; j < 5; j++)

textBox2.AppendText(b[i, j] + " ");

}

}

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

Результирующая матрица

25

32

47

31

33

52

52

25

47

31

25

22

27

23

ЗО

61

54

27

60

64

Удаление строки

Исходная матрица

57

40

24

58

39

25

32

47

31

33

52

52

25

47

31

25

22

27

23

ЗО

61

54

27

60

64

Ok

Рис. 140. Удалена нулевая строка исходной матрицы

Замена значений элементов матрицы

Задача. Все элементы исходной матрицы замените нулем, а каждый элемент главной диагонали замените его номером.

Вполне логично первоначально выполнить проверку условия: «Находится ли элемент матрицы на главной диагонали?», т.е. ^ (!==]), а затем выполнить прямое присваивание Ь[У]=ц (где [ — номер элемента на главной диагонали) или оператор Ь[У]=0 ;, который заменит элементы исходной матрицы нулем.

В листинге 117 приведен код процедуры, отвечающий за решение задачи.

Листинг 117

namespace WindowsApplicationl {

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5];

string n_st_;

textBoxl.Clear();

textBox2.Clear();

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

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(10, 70);

textBoxl.AppendText(b[i, j] + " ");

}

}

for (int i = 0; i < 5; i + + ) for (int j = 0; j < 5; j++)

if (i == j) //Проверка: находится элемент на главной диагонали матрицы или нет

b [ i , j ] = i; else

b[i, j] = 0 ; //Замена остальных элементов

матрицы на нуль

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

{

textBox2.AppendText(" " + " "); for (int j = 0; j < 5; j++)

textBox2.AppendText(b[i, j] + " ");

}

}

}

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

Все элементы матрицы заменены нулем, элементы главной диагонали — порядковыми номерами

Рис. 141. Все элементы матрицы заменены нулем, элементы главной диагонали — порядковыми номерами

Транспонирование матрицы

Транспонирование — одна из важных операций линейной алгебры, предметом которой является рассмотрение операции над прямоугольными числовыми таблицами. В результате транспонирования столбцы матрицы становятся строками и, наоборот, строки — столбцами.

В листинге 118 приведен код процедуры, отвечающий за решение задачи.

Листинг 118 namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random();

int[,] b, c;

b = new int[5, 5];

c = new int[5, 5];

textBoxl.Clear();

textBox2.Clear();

for (int і = 0; і < 5; i++)

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(10, 70);

textBoxl.AppendText(b[i, j] + " ");

}

}

for (int і = 0; і < 5; i++) for (int j = 0; j < 5; j++) c[j, i] = b[і, j] ; for (int і = 0; і < 5; i++)

{

textBox2.AppendText(" " + " "); for (int j = 0; j < 5; j++)

textBox2.AppendText(c[i, j] + " ");

}

}

}

}

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

Транспонирование матрицы

в

Sjjj

Исходная матрица

Результирующая матрица

63

18

23

18

51

63

35

57

CK

ww

26

35

37

*0

15

43

18

37

56

30

62

57

56

48

60

49

23

40

48

14

25

cc

w w

30

14

57

46

18

15

60

57

48

26

62

25

48

57

51

43

43

46

57

L_

Ok

—i

Рис. 142. Транспонированная матрица

Произведение двух матриц

В соответствии с правилами линейной алгебры произведением двух исходных матриц В и С одинаковых размеров (число строк равно числу столбцов) называется третья матрица D, каждый элемент которой равен сумме произведений соответствующих элементов i-строки матрицы В и j-ro столбца матрицы С.

В листинге 119 приведен код процедуры, отвечающий за решение задачи.

Листинг 119

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b,c,d; b = new int[4, 4]; c = new int[4, 4]; d = new int[4, 4]; textBoxl.Clear(); textBox2.Clear(); textBox3.Clear();

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

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 4; j++)

{

b[i, j] = a.Next(1, 4) ;

textBoxl.AppendText(b[i, j] + " ");

}

}

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

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

{

textBox2.AppendText(" " + " "); for (int j = 0; j < 4; j++)

{

с[i, j] = a.Next(1, 4); textBox2.AppendText(c[i, j] +

}

}

//Умножение двух матриц

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

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

{

d[i, j] - 0;

for (int к = 0; к < 4; k++)

d[i, j] = d[i, j] + b[i, k] * c[k, j];

}

//Вывод результирующей матрицы for (int i = 0; i < 4; i++)

{

textBox3.AppendText(" " + " "); for (int j = 0; j < 4; j++)

textBox3.AppendText(d[i, j] + " ");

Формирование первой строки матрицы Э, представленной на рис. 143, показано в табл. 25.

Таблица 25. Формирование первой строки матрицы

a0i*boi=6

а02*Ьп=2

аоз*Ь2і=4

ао4*Ь31=2

aoi*bo2-6

a02*bi2=2

аоз*Ь22=2

ао4*Ь32=3

aoi*b03=4

а02*Ь13=2

а0з*Ь23=4

а0433=1

aoi*b04=6

a02*bi4=2

аоз*Ь24=6

а0434=2

0)1=14

О

О

II

С03=11

О

О

4-

II

Os

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

Результат выполненного перемножения двух матриц

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

Формирование матрицы в соответствии с определенными правилами

Выше рассматривался способ заполнения матрицы с помощью генератора случайных чисел, однако возможен вариант заполнения двумерного массива в соответствии с определенными правилами, например, как в данной задаче. Задача. Сформируйте двумерный массив Ь [5,5] по следующему правилу:

b[i, j] = 2 • (i - 2)! - O’ - 2)!

Найдите максимальный элемент, лежащий ниже главной диагонали, и минимальный элемент, лежащий выше главной диагонали. Найденные максимальный и минимальный элементы обменяйте местами.

В листинге 120 приведен код процедуры, отвечающий за решение задачи.

Листинг 120 namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5];

int str_min = 0;

int stol_min = 0;

int str_max = 0;

int stol_max = 0;

textBoxl.Clear();

textBox2.Clear();

for (int i — 0; i < 5; i++)

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i,j] - 2 * (i—2)*(i—2)—(j—2)*(j—2) ; textBoxl.AppendText(b[i, j] + " ");

}

}

//Находим минимальный элемент, лежащий выше главной

диагонали

int min = b[0,0];

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

for (int j = 1; j < 5; j++)

if (i < j)

if (b[i, j] < min)

{

min = b[i, j]; str_min = i; stol_min = j;

}

//Находим максимальный элемент, лежащий ниже главной

диагонали

int max = b[0,0] ;

for (int i = 1; i < 5; i++) for (int j = 0; j < 4; j++) if (b[i, j] > max)

{

max = b[i, j];

str_max = і; stol_max = j;

}

MessageBox.Show("Максимальный элемент, лежащий ниже главной диагонали = " + max.ToString("п"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

MessageBox.Show("Минимальный элемент, лежащий выше главной диагонали = " + min.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

//Обмен элементов

int bufer = b[str_min, stol_min];

b[str_min, stol_min] = b[str_max, stol_max]; b[str_max, stol_max] = bufer;

//Вывод результирующей матрицы for (int і = 0; і < 5; і++)

{

textBox2.AppendText(" " + " "); for (int j = 0; j < 5; j++)

textBox2.AppendText(b[і, j] + " ");

}

}

}

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

Формирование матрицы в соответствии с правилом

Исходная матрица

Результирующая матрица

4

7

8

7

4

4

7

8

7

4

•2

1

2

1

-2

-2

1

2

1

-2

-4

•1

0

•1

4

4

-1

0

-1

8

•2

1

2

1

-2

-2

1

2

1

-2

і

7

8

7

4

4

7

4

7

4

_

Ok

_

Рис. 144. Максимальный (8) и минимальный (-4) элементы, лежащие соответственно ниже

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

8.3. Примеры решения задач

Задача 1. В двумерном массиве произвольных чисел найдите максимальный элемент на главной диагонали и его номер (индекс).

Разработка алгоритма решения задачи представлена на рис. 145.

Комментарий: элементы главной диагонали рассматриваемой матрицы имеют следующие индексы: Ь[0,0], Ь[1Д], Ь[2,2], Ь[3,3], Ь[4,4], поэтому для поиска максимального элемента применим следующий алгоритм решения задачи: максимальным считается первый элемент главной диагонали, а именно: Ь[0,0]. В программе за это действие отвечает оператор шах=Ь[0, 0]. В программе осуществляется сравнение очередного элемента главной диагонали с тем элементом, который хранится в ячейке шах, и если он больше него, то данный элемент заносится в ячейку шах оператором шах=Ь[1,1].

Алгоритм решения задачи

Рис. 145. Алгоритм решения задачи

В листинге 121 приведен код процедуры, отвечающий за решение задачи.

Листинг 121

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5];

textBoxl.Clear();

for (int i — 0; i < 5; i++)

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(10, 70);

textBoxl.AppendText(b[i, j] + " ");

}

}

int max = b[0,О] ; //Максимальным считается первый элемент

главной диагонали

int index = 0 ; //Его номер на главной диагонали - О for (int і = 1; і < 5; і++)

if (b[i, і] > max) //Поиск максимального элемента главной диагонали

{

max = b[і, і]; index = і;

}

MessageBox.Show("Максимальный элемент главной диагонали =

" + max.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

MessageBox.Show("Его индекс = " + index.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

}

Задача 2. Из двумерного массива произвольных чисел сформируйте другой массив, содержащий квадраты чисел исходного массива.

Разработка алгоритма решения задачи представлена на рис. 146. Комментарий: нахождение квадратов чисел исходной матрицы осуществляется в цикле оператором c[i,j] = b[i,j]*b[i,j].

Алгоритм решения задачи

Рис. 146. Алгоритм решения задачи

В листинге 122 приведен код процедуры, отвечающий за решение задачи.

Листинг 122

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e) {

Random a = new Random();

int[,] b,c;

b = new int[5, 5];

c = new int[5, 5];

textBoxl.Clear();

textBox2.Clear();

for (int i — 0; i < 5; i++)

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(1, 10); textBoxl.AppendText(b[i, j] + " "); c[i, j] =b[i, j] *b[i, j]; //Нахождение квадратов чисел исходной матрицы

}

}

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

{

textBox2.AppendText(" " + " "); for (int j = 0; j < 5; j++)

textBox2.AppendText(c[i, j] + " ");

}

}

}

}

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

матрицы на равенство нулю и в случае истинности проверяемого условия увеличиваем счетчик на единицу оператором kol = kol + 1. Затем проверяем каждый элемент матрицы: является ли он положительным числом? В случае истинности условия накапливаем сумму положительных чисел оператором sum = sum + b[i, j] и увеличиваем счетчик на единицу оператором pol = pol + 1. В программе предусмотрена защита на случай, если в матрице нет положительных чисел. В этом случае выводится надпись: «Положительных элементов в массиве нет», в противном случае находится среднее арифметическое положительных элементов.

Алгоритм решения задачи

Рис. 147. Алгоритм решения задачи

В листинге 123 приведен код процедуры, отвечающий за решение задачи.

Листинг 123

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random();

int[,] b;

b = new int[5, 5];

int kol = 0;

int pol = 0;

float sum = 0;

textBoxl.Clear();

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

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(-10, 10);

textBoxl.AppendText(b[i, j] + " ");

if (b[i,j] == 0) //Поиск элементов матрицы равных нулю

ко1 = ко1 + 1 ; //Увеличение счетчика на единицу в случае истинности условия

^ (Ь[1, j] >0) //Поиск положительных элементов матрицы

{

pol = pol + 1; //Увеличение счетчика на единицу в случае истинности условия

sum = sum + b[i, j]; //Нахождение суммы положительных чисел

}

}

}

if (pol == 0)

MessageBox.Show("Положительных элементов в массиве нет", "Заголовок окна", MessageBoxButtons.ОК,

MessageBoxIcon.Information);

else {

float sr = sum / pol;

MessageBox.Show("Среднее арифметическое положительных элементов =" + sr.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

}

}

Задача 4. В двумерном массиве произвольных чисел найдите четные элементы и выведите их как одномерный массив.

Разработка алгоритма решения задачи представлена на рис. 148.

Комментарий: проверка на четность очередного элемента матрицы происходит оператором ИЧЬПЛ % 2 == 0). Переменная к необходима для формирования очередного элемента результирующего массива. Поскольку она будет увеличиваться на единицу оператором к = к + 1, то последовательно формируются элементы результирующего массива с[1], с[2], с[3] и т.д.

Алгоритм решения задачи

Рис. 148. Алгоритм решения задачи

В листинге 124 приведен код процедуры, отвечающий за решение задачи.

Листинг 124

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5]; int[] c = new int[25];

int k = 0 ; //Переменная k необходима для формирования порядковых номеров элементов результирующего массива

textBoxl.Clear(); textBox2.Clear(); for (int i — 0; i < 5; i++)

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(10, 40); textBoxl.AppendText(b[i, j] + " "); if (b[i, j] % 2 == 0) //Проверка: является ли очередной элемент матрицы четным числом

{

к = к + 1; //В случае истинности проверяемого условия к увеличивается на единицу

с[к] = Ь[1, з]; //Формирование результирующего массива четных чисел

}

}

" ");

+

for (int і = 1; і < к; і++) textBox2.AppendText(с[і]

}

Задача 5. В двумерном массиве произвольных чисел вычислите сумму элементов, сумма индексов которых равна 4.

Разработка алгоритма решения задачи представлена на рис. 149.

Начало *< і = 0.5 >

?< І = 0,5 >

/ b[,j] /

Алгоритм решения задачи

Рис. 149. Алгоритм решения задачи

Комментарий: в данной программе перебирать все элементы матрицы не следует. По сути, требуется найти сумму элементов матрицы Ь04, Ьв, Ьг2, Ьзі, Й4о. Именно у этих элементов сумма индексов равна четырем. Поскольку индексация начинается с нуля, то первый индекс (номер строки, за который отвечает параметр цикла і) может принимать значения от 0 до 5, а второй (номер столбца, за который отвечает параметр цикла j) — от 4 до 0. Для решения задачи достаточно организовать один цикл. В нем будет вычисляться первый индекс элемента, второй индекс будет вычисляться в цикле оператором j = 4 — і.

В листинге 125 приведен код процедуры, отвечающий за решение задачи.

Листинг 125

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b;

b = new int[5, 5];

int sum = 0 ;

textBoxl.Clear();

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

{

textBoxl.AppendText(" " + " "); for (int j = 0; j < 5; j++)

{

b[i, j] = a.Next(l, 10);

textBoxl.AppendText(b[i, j] + " ");

}

}

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

{

int j = 4 - i ; sum = sum + b[i,j]

}

MessageBox.Show("Сумма элементов, сумма индексов которых равна четырем = " + sum.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

}

 
< Пред   СОДЕРЖАНИЕ     След >