Как найти произведение диагонали массива в с

0 / 0 / 0

Регистрация: 25.10.2017

Сообщений: 27

1

Найти произведение элементов главной диагонали матрицы

26.10.2017, 15:13. Показов 21389. Ответов 13


Студворк — интернет-сервис помощи студентам

Я новичок, не получается ( Буду очень благодарна за помощь в написании кода))
Дана матрица D [6, 6]. Вычислить и вывести произведение элементов главной диагонали. Если это произведение равно 0, то в каждой строке заменить первый элемент на 0, иначе последний на 12. Вывести полученную матрицу.



0



afront

1493 / 1208 / 821

Регистрация: 29.02.2016

Сообщений: 3,597

26.10.2017, 15:36

2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <ctime>
 
using namespace std;
 
int main()
{
    srand(time(NULL));
 
    int n = 6, prod = 1;
 
    int**a = new int*[n];
    for (int i = 0; i < n; ++i)
        a[i] = new int[n];
 
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            a[i][j] = rand() % 5;
 
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
            cout << a[i][j] << "t";
        cout << endl;
    }
    cout << endl;
    for (int i = 0; i < n; ++i)
        prod *= a[i][i];
    cout << "prod = " << prod << endl;
    if (prod == 0)
        for (int i = 0; i < n; ++i)
            a[i][0] = 0;
    else
        for (int i = 0; i < n; ++i)
            a[i][n-1] = 12;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
            cout << a[i][j] << "t";
        cout << endl;
    }
    return 0;
}



0



Fezoo

2 / 2 / 2

Регистрация: 09.10.2016

Сообщений: 12

26.10.2017, 15:50

3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <time.h>
 
using namespace std;
 
#define COLSROWS 6
 
int main(){
    
    int D[COLSROWS][COLSROWS] = { 0 };
    int i, j;
 
    long multiply = 1;
 
    srand (time (NULL));
 
    for (i = 0; i < COLSROWS; i++) {
        for (j = 0; j < COLSROWS; j++) {
            D[i][j] = -25 + rand ()%50; // Заполняем матрицу случайными целыми значениями от -25 до +24
            cout << D[i][j] << 't';    // Сразу же ее выводим на экран.
            if (i == j)                 // Если это диагональные элементы,
                multiply *= D[i][j];    // сразу же подсчитываем произведение.
        }
        cout << endl;
    }
 
    cout << endl << "Total multiply: " << multiply << endl << endl;
 
    // Вывод результата с установкой значений.
    for (i = 0; i < COLSROWS; i++) {
        if (multiply)                   // Если произведение не равно 0, то
            D[i][COLSROWS - 1] = 12;    // устанавливаем значение последнего элемента = 12.
        else                            // иначе
            D[i][0] = 0;                // значение первого элемента = 0.
 
        for (j = 0; j < COLSROWS; j++) {
            cout << D[i][j] << 't';
        }
        cout << endl;
    }
    
    return 0;
}



0



3575 / 2243 / 406

Регистрация: 09.09.2017

Сообщений: 9,392

26.10.2017, 16:05

4

Цитата
Сообщение от afront
Посмотреть сообщение

int**a = new int*[n];
for (int i = 0; i < n; ++i) a[i] = new int[n];

яркий пример как делать не надо.



0



1493 / 1208 / 821

Регистрация: 29.02.2016

Сообщений: 3,597

26.10.2017, 16:19

5

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

яркий пример как делать не надо

а что собственно »не надо»? стандартная инициализация динамического массива



0



0 / 0 / 0

Регистрация: 25.10.2017

Сообщений: 27

26.10.2017, 16:26

 [ТС]

6

Спасибо Вам огромное!!! Очень сильно помогли, сейчас разбираюсь в коде. Спасибо, ребят. Очень Вам признательна.



0



3575 / 2243 / 406

Регистрация: 09.09.2017

Сообщений: 9,392

26.10.2017, 17:37

7

afront, Стандартное объявление массива это int *a = new int[n*n]; а то что вы написали это массив массивов. Он размазан тонким слоем по всей памяти, для обращения к каждому элементу приходится искать адрес подмассива, а потом адрес элемента в нем. Это хуже и по памяти, и по скорости, и по надежности.
Если уж очень хочется удобства в работе с двумерными массивами, лучше использовать классы или макросы #define A(x,y) a[(x)+(y)*(n)]



1



Fezoo

2 / 2 / 2

Регистрация: 09.10.2016

Сообщений: 12

26.10.2017, 18:38

8

afront, во-первых, размеры массива заранее известны и неизменны, поэтому нет смысла в его динамическом выделении.
Во-вторых, соглашусь с COKPOWEHEU про хранение в памяти.
А, в-третьих, если уж использовать ваш вариант, то не надо забывать

C++
1
2
for (int i = 0; i < n; ++i) delete a[i];
delete a;



0



1493 / 1208 / 821

Регистрация: 29.02.2016

Сообщений: 3,597

26.10.2017, 19:02

9

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

int *a = new int[n*n];

это одномерный массив, а я написал двумерный, массива массивов в с++ вообще не существует, про остальной вымысел и писать не хочется

Цитата
Сообщение от Fezoo
Посмотреть сообщение

размеры массива заранее известны

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



1



3575 / 2243 / 406

Регистрация: 09.09.2017

Сообщений: 9,392

26.10.2017, 19:54

10

Цитата
Сообщение от afront
Посмотреть сообщение

это одномерный массив, а я написал двумерный, массива массивов в с++ вообще не существует

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

Цитата
Сообщение от afront
Посмотреть сообщение

в задании ничего не сказано какой массив нужно использовать,

Цитата
Сообщение от Angelina_Koneva
Посмотреть сообщение

Дана матрица D [6, 6].

то есть размер известен еще на этапе компиляции. В этом вариант Fezoo, идеален.

Цитата
Сообщение от afront
Посмотреть сообщение

писать delete в такой программе вообще бессмысленная затея, программа маленькая и массив автоматически удалится при окончании ее работы

Угу. А еще бессмысленно заниматься оптимизацией, писать комментарии, использовать осмысленные названия, закрывать файлы, проверять входные данные, рассчитывать задачи аналитически. Действительно, это ведь не учебные задачи, где все это надо отрабатывать, а отчетные, которые надо тупо сдать и забыть.



0



1493 / 1208 / 821

Регистрация: 29.02.2016

Сообщений: 3,597

26.10.2017, 20:42

11

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

В этом вариант Fezoo, идеален.

всегда на мой взгляд лучше использовать динамический массив

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

А еще бессмысленно заниматься оптимизацией, писать комментарии, использовать осмысленные

бессмысленно заниматься морализаторством

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

В С++ не существует многомерным массивов

я имел в виду массив массивов в сшарповском смысле
Вот посмотрите открытый код для решения систем уравнений в частных производных методом конечных элементов, ты не поверишь — вовсю используют многомерные массивы
https://en.wikipedia.org/wiki/Deal.II



0



3575 / 2243 / 406

Регистрация: 09.09.2017

Сообщений: 9,392

26.10.2017, 21:27

12

Цитата
Сообщение от afront
Посмотреть сообщение

всегда на мой взгляд лучше использовать динамический массив

Напрасно. Если размер невелик и известен на этапе компиляции — всегда лучше использовать статическое выделение.

Цитата
Сообщение от afront
Посмотреть сообщение

бессмысленно заниматься морализаторством

А учить плохому стилю еще и вредно.

Цитата
Сообщение от afront
Посмотреть сообщение

Я не знаю что за «массив в шарповском стиле», перекапывать все ссылки в поисках куска кода, который ты имеешь в виду лень.
Лучше приведи пример когда твой подход с массивом массивов вместо нормального массива обладает хоть каким-нибудь преимуществом.



0



1493 / 1208 / 821

Регистрация: 29.02.2016

Сообщений: 3,597

26.10.2017, 21:32

13

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

А учить плохому стилю еще и вредно.

препод?



0



3575 / 2243 / 406

Регистрация: 09.09.2017

Сообщений: 9,392

27.10.2017, 09:32

14

Просто имел дело с контроллерами и имею представление во что это разворачивается. И не люблю подобных кривых решений



0



Ранее был создан 2-мерный массив.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Insert N");
            int N = int.Parse(Console.ReadLine());
            Console.WriteLine("Insert K");
            int K = int.Parse(Console.ReadLine());

            for (int i = 1; i <= N; i++)
            {
                for (int j = 1; j <= K; j++)
                {
                    if (i == j)
                    {
                        double[] z = { i * Math.Cos(K * K + 1) - Math.Abs(Math.Sin(2 * K) - 5.76) * i };
                        foreach (double a in z)
                        {

                            Console.WriteLine(a);
                            Console.ReadKey();
                        }
                    }
                }
            }
        }
    }
}

Найти произведение диагональных элементов массива и количество отрицательных элементов.

Yaroslav's user avatar

Yaroslav

1,8777 серебряных знаков23 бронзовых знака

задан 30 окт 2018 в 14:21

Мася Пуся's user avatar

Kоличество отрицательных элементов:

N * K

Произведение диагональных элементов:

Math.Min(N, K)! * (Math.Cos(K * K + 1) - Math.Abs(Math.Sin(2 * K) - 5.76))

ответ дан 30 окт 2018 в 14:45

Лабораторные работы си шарп и задания по теме «Язык программирования c sharp: двумерные массивы»

Содержание:

  • Теория
  • Задания и лабораторные работы
    • Дополнительные задания

Теория

    В примере ниже показан код для объявления двумерного массива из пяти строк и трех столбцов (5 х 3).

  • Объявление массива:
  • int[,] arr = new int[5, 3];
  • Инициализация массива значениями:
  • // 1. Инициализация массива при объявлении:
    int[,] arr1 = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
    // Тот же массив с заданными размерами:
    int[,] arr1 = new int[4, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
     
    // 2. Инициализация массива без указания размерности:
    int[,] arr2 = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
     
    // 3. Инициализация массива после его объявления:
    int[,] arr;
    arr = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
     
    // Присваивание значения конкретному элементу массива:
    arr[2, 1] = 25;
  • Доступ к элементам массива:
  • int[,] arr1 = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
    System.Console.WriteLine(arr1[0, 0]); //1
    System.Console.WriteLine(arr1[0, 1]); //2
    System.Console.WriteLine(arr1[1, 0]); //3
    System.Console.WriteLine(arr1[1, 1]); //4
    System.Console.WriteLine(arr1[3, 0]); //7
  • Получение значения определенного элемента массива и присвоение его переменной:
  • int elementValue = arr1[2, 1];
  • Получение общего количества элементов (или размерности массива):
  • int[,] arr = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
    var arrayLength = arr.Length;
    var total = 1;
    for (int i = 0; i < arr.Rank; i++) {
        total *= arr.GetLength(i);
    }
    System.Console.WriteLine("{0} равно {1}", arrayLength, total); // 8 равно 8
  • Получение количества строк и столбцов:
  • int[,] matrix = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
    int r=matrix.GetLength(0); // строки
    int c=matrix.GetLength(1); // столбцы

Задания и лабораторные работы

Лабораторная работа 1.

  
Выполнить: Инициализируйте двумерный массив* с именем arr2d заданными целочисленными значениями: ((1, 2); (3, 4); (5, 6)).
1) Сначала выведите все элементы массива.
2) После этого выведите следующие элементы в консоль (элементы для вывода отмечены синим цветом):

(1, 2)
(3, 4) 
(5, 6)

* Двумерный массив может называться матрицей.

Пример выполнения:

Массив:
1  2
3  4
5  6
1-й элемент = 3, 2-й элемент = 5

[Название проекта: Lesson_10Lab1, название файла L10Lab1.cs]

✍ Алгоритм:

  • Создайте новый проект с именем файла, как указано в задаче.
  • Подключите следующую библиотеку, чтобы не печатать каждый раз название класса console:
  • using static System.Console;
    
  • Чтобы объявить двумерный массив целочисленного типа с именем arr2d, мы можем использовать оператор int[,] arr2;. Сразу в этой же строке инициализируем массив значениями. Для этого добавьте следующий код в функцию Main:
  • int[,] arr2d= { {1, 2}, {3, 4}, {5, 6} };
    

    Теперь у нас есть двумерный массив со значениями.

  • Чтобы вывести все элементы массива, мы должны использовать вложенные циклы; внешний цикл должен перебирать строки, а внутренний цикл должен перебирать элементы в каждой строке. Внутри внутреннего цикла будем выводить значения элементов. Чтобы получить доступ к каждому элементу по его индексу, необходимо использовать счетчики цикла в качестве индексов элемента:
  • for (int i = 0; i < arr2d.GetLength(0); i++)
                {
                    for (int j = 0; j < arr2d.GetLength(1); j++)
                    {
                        Console.Write($"{arr2d[i, j]}  ");
                    }
                    Console.WriteLine();
                }
    

    Чтобы вывести значение конкретного элемента в окно консоли, нам нужно понять, в какой строке и столбце находится элемент. Обратите внимание, что индексы начинаются со значения 0. Итак, к элементу со значением 3 можно получить доступ как arr2[1,0] (где 1 — строка и 0 — столбец), а к элементу со значением 5 можно получить доступ так: arr2[2,0].

  • Вывод элементов:
  • Console.WriteLine($"1-й элемент = {arr2d[1,0]}, 2-й элемент = {arr2d[2, 0]}");
    
  • Запустите приложение еще раз и проверьте выходные данные.
  • Поэкспериментируйте с различными значениями.
  • Добавьте комментарий с текстом задачи и сохраните проект.

Задание 1:
Приведены значения температуры воздуха за 4 дня; значения взяты с трех метеостанций, расположенных в разных регионах страны:

Station number 1-й день 2-й день 3-й день 4-й день
1 -8 -14 -19 -18
2 25 28 26 20
3 11 18 20 25

То есть в двумерном массиве это выглядело бы так:

t[0,0]=-8; t[0,1]=-14; t[0,2]=-19; t[0,3]=-18;
t[1,0]=25; t[1,1]=28; t[1,2]=26; t[1,3]=20;
t[2,0]=11; t[2,1]=18; t[2,2]=20; t[2,3]=25;

  
Указание: Инициализация массива:

 int [,] t = {
                {-8,-14,-19,-18},
                { 25,28, 26, 20},
                { 11,18, 20, 25}
                };

Выполнить:

  1. Выведите значение температуры на 2-й метеостанции в течение 4-го дня и на 3-й метеостанции в течение 1-го дня (результат должен быть 20 и 11).
  2. Выведите значения температуры всех метеостанций в течение 2-го дня (необходим for цикла).
  3. Выведите значения температуры всех метеостанций в течение всех дней.
  4. Рассчитайте среднюю температуру на 3-й метеостанции (необходим for цикла).
  5. Выведите дни и номера метеостанций, где температура была в диапазоне 2426 градусов.

  
Пример вывода:

1-е задание: 20  and  11
2-е задание: 25 28 26 20
3-е задание:
-8  -14  -19  -18
25   28   26   20
11   18   20   25

4-е задание: 18
5-е задание:
станция 1  день 0
станция 1  день 2
станция 2  день 3
     
[Название проекта: Lesson_10Task1, название файла L10Task1.cs]

Задание 2:

To do: Вводятся элементы двумерного массива 2 х 3 ([2,3]). Посчитайте сумму элементов.

   
Указание 1: Для объявления массива размерностью 2 х 3 используйте код: 

int[,] arr=new int[2, 3];

 
Указание 2: Для ввода значений элементов массива и перебора элементов, воспользуйтесь вложенными циклами:

for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                   ...
                }
            }

  
Пример вывода:

Введите 6 значений для матрицы 2 х 3
2
5
1
6
7
8
Матрица:
2  5  1
6  7  8
Сумма =  29

[Название проекта: Lesson_10Task2, название файла L10Task2.cs]

Задание 3:

Выполнить: Вводятся элементы двумерного массива 4 х 3. Посчитайте количество положительных элементов.

 
Пример вывода:

Пожалуйста, введите значения матрицы 4 х 3
2  5  -1  6  7  8  1  8  6  -3  1  -6
Матрица:
2   5  -1
6   7   8
1   8   6
-3  1  -6
кол-во положительных = 9

[Название проекта: Lesson_10Task3, название файла L10Task3.cs]

Лабораторная работа 2. Использование функции Random

Выполнить: Создайте метод FillMatrix для заполнения двумерного массива случайными числами в диапазоне от -10 до 10.

Указание: Заголовок функции FillMatrix должен быть таким:

FillMatrix(matrix, minValue, maxValue);

Пример выполнения:

Введите кол-во строк:
3
Введите кол-во столбцов:
4
Массив:
-10 -7 -3 -4
-6   1  4  0
-5  -8 -1 -5

[Название проекта: Lesson_10Lab2, название файла L10Lab2.cs]

✍ Алгоритм:

  • Создайте новый проект с названием файла, которое указано в задании.
  • Подключите следующую библиотеку чтобы не указывать название класса console:
  • using static System.Console;
    
  • В функции Main добавьте код для того, чтобы попросить пользователя ввести количество строк и количество столбцов матрицы. Присвойте введенные значения переменным:
  • ...
    Console.WriteLine("введите кол-во строк");
    int rows = int.Parse(ReadLine());
    Console.WriteLine("введите кол-во столбцов");
    int columns = int.Parse(ReadLine());
    
  • Объявите матрицу:
  • int[,] matrix = new int[rows,columns];
    
  • Инициализируйте значениями переменные для границ генерируемого диапазона:
  •   int minValue=-10;
      int maxValue=10;
    

    Чтобы сделать программу более эффективной лучше использовать ReSharper (для инициализации метода):

  • Вызовите метод FillMatrix в коде функции Main (несмотря на то, что мы еще ее не создали). В функцию Main() введите следующий код:
  • FillMatrix(matrix, minValue, maxValue);
    
  • Название функции подчеркнуто. Если поднести курсор мыши, вы увидите изображение с желтой лампочкой. Значит, мы можем использовать ReSharper comments, щелкнув по лампочке (или Alt+Enter). Следует выбрать пункт «Генерировать метод Program.FillMatrix».
  • Заголовок функции есть в задании.
  • Change the code:
  • FillMatrix(int[,] matrix, int minValue = -10, int maxValue = 10); 
    
  • Метод с тремя параметрами:
  • matrix — a declared matrix without initialization;
    minValue -устанавливать нижнюю границу для функции Random, значение по умолчанию — -10
    maxValue — устанавливать верхнюю границу для функции Random, значение по умолчанию 10

  • Внутри созданной функции установите генератор случайных чисел:
  • Random rand = new Random();
    
  • Сгенерируйте значения для матрицы и присвойте их элементам (границы генерируемых чисел: от minValue до maxValue):
  • ...
    for (int i = 0; i < matrix.GetLength(0); i++)
                {
                    for (int j = 0; j < matrix.GetLength(1); j++)
                    {
                        matrix[i, j] = rand.Next(minValue, maxValue);
                        Write(matrix[i, j].ToString().PadLeft(4));
                    }
                    WriteLine();
                }
    

    Обратите внимание, что matrix.GetLength(0) означает число столбцов, а matrix.GetLength(1)означает число столбцов.

    Для прохода по элементам матрицы необходимо использовать вложенный цикл. Счетчики циклов должны быть разными переменными, можно использовать для их названий i и j. Метод GetLength(0) возвращает кол-во строк матрицы, метод GetLength(1) возвращает кол-во столбцов.

  • Щелкните CTRL+a, CTRL+k, CTRL+F для форматирования вашего кода.
  • Запустите программу.
  • Добавьте комментарии. Загрузите файл L10Lab2.cs.

Задание 4:

Выполнить: Создайте метод FillMatrix для заполнения двумерного массива случайными числами от -15 до 15. Создайте еще один метод для нахождения минимального и максимального элементов массива (FindMinMaxArr).

   
Указание 1: Сигнатура (заголовок) метода FindMinMaxArr должен быть таким: 

private static void FindMinMaxArr(int[,] matrix, ref int min, ref int max)

  
Указание 2: Алгоритм поиска минимального и максимального элемента можно посмотреть в одном из прошлых уроков Урок 5 -> Лаб. раб. 4.

  
Пример вывода:

введите кол-во строк
4
введите кол-во столбцов
5
Массив:
10   2   9  3  4
-3 -10 -14 -4  2
 2  -9  11  3 -10
-1 -13  -5 -2  3
min = -14, max = 11

[Название проекта: Lesson_10Task4, название файла L10Task4.cs]

Лабораторная работа 3. Обмен определенных столбцов матрицы

Выполнить: Создайте метод ChangeColumns для обмена определенных столбцов матрицы размера 3 х 4 (порядковые номера столбцов вводятся).

Указание: Помимо метода ChangeColumns необходимо создать метод FillMatrix для заполнения матрицы случайными числами, и метод PrintMatrix для вывода элементов матрицы.

Пример вывода:

Матрица:
-10 -7 -3 -4
-6   1  4  0
-5  -8 -1 -5
введите номера столбцов для обмена (первый столбец - 0-й):
1
2
Результирующая матрица:
-10 -3 -7 -4
-6   4  1  0
-5  -1 -8 -5

[Название проекта: Lesson_10Lab3, название файла L10Lab3.cs]

✍ Fkujhbnv:

  • Создайте новый проект и переименуйте главный файл согласно заданию.
  • Необходимо создать матрицу с тремя строками и четырьмя столбцами. Объявите матрицу в функции Main:
  • int[,] matrix = new int[3, 4];
  • Скопируйте код метода FillMatrix из Лабораторной работы 2 и вставьте его в текущий проект. Или создайте метод заново. После этого у Вас будет код:
  • static void FillMatrix(int[,] matrix, int minValue = -10, int maxValue = 10) {
                Random rand = new Random();
                for (int i = 0; i < matrix.GetLength(0); i++)
                {
                    for (int j = 0; j < matrix.GetLength(1); j++)
                    {
                        matrix[i, j] = rand.Next(minValue, maxValue);
                     }
                }
            }
    
  • Создайте метод PrintMatrix для вывода элементов матрицы. Метод принимает один параметр — саму матрицу:
  • static void PrintMatrix(int[,] m)
            {
                for (int i = 0; i < m.GetLength(0); i++)
                {
                    for (int j = 0; j < m.GetLength(1); j++)
                    {
                       Console.Write(m[i, j].ToString().PadLeft(4));
                    }
                    Console.WriteLine();
                }
            }
    

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

  • Затем в функции Main необходимо вызвать созданные методы: сначала — метод FillMatrix и затем — метод PrintMatrix.
  • ...
    FillMatrix(matrix);
    Console.WriteLine("Матрица 3 x 4: ");
    PrintMatrix(matrix);
    
  • Затем необходимо ввести номера столбцов для обмена:
  • ...
    Console.WriteLine("введите номера столбцов для обмена (первый столбец - 0-й):");
    int col1= int.Parse(Console.ReadLine());
    int col2 = int.Parse(Console.ReadLine());
    
  • Создайте метод ChangeColumns для обмена столбцов с указанными номерами:
  • static void ChangeColumns(int[,] matrix, int col1, int col2)
            {
                System.Diagnostics.Debug.Assert((col1 < matrix.GetLength(1)) && (col2 < matrix.GetLength(1)), "указанный номер столбца выходит за границы размерности массива!");
                for (int i = 0; i < matrix.GetLength(0); i++)
                {
                    int temp = matrix[i, col1];
                    matrix[i, col1] = matrix[i, col2];
                    matrix[i, col2] = temp;
                   // если используется Visual studio 2019:
                   // (matrix[i, col1], matrix[i, col2]) = (matrix[i, col2], matrix[i, col1]);
                }
            }
    

    Счетчик i цикла проходится по строкам матрицы и в то же время каждый элемент col1 обменивается значениями с элементом col2 в каждой строке.

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

  • Вызовите метод в функции main. Затем вызовите метод PrintMatrix , чтобы увидеть результат:
  • ...
    ChangeColumns(matrix, col1, col2);
    Console.WriteLine("The resulting matrix:");
    PrintMatrix(matrix);
    
  • Запустите программу, нажав горячие клавиши CTRL+F5.
  • Загрузите файл L10Lab3.cs.

Задание 5:

To do: Создайте метод PlaceZero, который замещает некоторые элементы матрицы (5 х 5) нулями (0). Посмотрите на пример вывода, чтобы понять, какие элементы должны быть замещены нулями.

   
Указание 1: Создайте методы для заполнения и вывода матрицы.
Указание 2: Заголовок метода PlaceZero должен быть следующим: 

static void PlaceZero(int[,] matrix)
  

Указание 3: Для замены элементов нулями используйте циклы.

  
Пример вывода:

Матрица:
10 2  9  3  6 
3  10 14 4  8
2  9  11 3  2
1  13 5  2  7
12 3  11 4  5

Результирующая матрица:
0  0  0  0  0 
0  10 14 4  0
0  9  11 3  0
0  13 5  2  0
0  0  0  0  0

[Название проекта: Lesson_10Task5, название файла L10Task5.cs]

Задание 6:

To do: Создайте метод FindProductOfColumn для нахождения произведения элементов матрицы M-го столбца (матрица 3 х 4) (M вводится). M — это параметр out (вывода).

Note: Сигнатура метода FindProductOfColumn должна быть следующей:

static void FindProductOfColumn(int[,] matrix, int M,out int product)

Пример вывода:

Матрица:
-10 -3 -7 -4
-6   4  1  0
-5  -1 -8 -5
Введите номер столбца (первый столбец - 0-й):
2
Произведение элементов 2-го столбца = -64

[Название проекта: Lesson_10Task6, название файла L10Task6.cs]

Главная и побочная диагонали

  
В алгебре главная диагональ матрицы A — это все элементы матрицы Ai,j , для которых i=j. Элементы вне главной диагонали обозначены нулями, а элементы главной диагонали обозначены красными единицами:

Побочная диагональ матрицы B размерности N — это элементы Bi,j, для которых i+j=N+1 для всех 1<=i,j<=N. Но если i и j начинаются с нуля, то формула будет i+j=N-1:

Лабораторная работа 4. Работа с диагоналями матрицы

Выполнить: Создайте квадратную матрицу M-х-M (значение M вводится). Посчитайте сумму элементов побочной диагонали матрицы.

Примерный вывод:

Введите размерность матрицы:
3 
Матрица 3-х-3:
10 -7 -3 
6   1  4 
5  -8 -1 
сумма элементов побочной диагонали = 3

[Название проекта: Lesson_10Lab4, название файла L10Lab4.cs]

✍ Алгоритм:

  • Создайте новый проект и измените название главного файла согласно заданию.
  • Попросите пользователя ввести размерность матрицы и присвойте введенное значение переменной M:
  • Console.WriteLine("Введите размерность матрицы:");
    int M = int.Parse(Console.ReadLine());
    
  • Мы собираемся создать матрицу размерностью M-х-M. Объявите матрицу в коде функции Main:
  • int[,] matrix = new int[M, M];
    
  • Скопируйте код метода FillMatrix с предыдущей лабораторной работы и вставьте его до или после функции Main.
  • Скопируйте код метода PrintMatrix и также вставьте его после метода FillMatrix.
  • Создайте метод AntidiagonalSum, который будет суммировать элементы побочной диагонали матрицы.
  • static int AntidiagonalSum(int[,] matrix) 
    {
    ...
    }
    
  • Вспомним, что для индексов элементов побочной диагонали следует использовать формулу: i+j=M-1. Для прохода по элементам матрицы будем использовать вложенные циклы:
  • ...
    int sum = 0;
    for (int i = 0; i < matrix.GetLength(0); i++)
                {
                    for (int j = 0; j < matrix.GetLength(1); j++)
                    {
                        if ((i+j == M-1)
                           {
                             sum+ = matrix[i,j];
                           }
                     }
                }
    
  • Метод должен возвратить значение суммы, поэтому будем использовать ключевое слово return:
  • ...
    return sum;
    
  • Вызовите метод внутри функции Main:
  • int result = AntidiagonalSum(matrix);
    Console.WriteLine($"сумма элементов побочной диагонали = {result}");
    
  • Запустите программу без отладки (CTRL+F5) и проверьте результат.
  • Добавьте комментарий с заданием и загрузите главный файл.

Задание 7:

Выполнить: Create square matrix M-by-M (M is inputted). Calculate a product of its elements within a main diagonal.

Указание: a main diagonal elements are such as i=j.

Примерный вывод:

Введите размерность матрицы:
3 
Матрица 3-х-3:
10 -7 -3 
6   1  4 
5  -8 -1 
Произведение элементов главной диагонали = -10

[Название проекта: Lesson_10Task7, название файла L10Task7.cs]

Дополнительные задания

Доп. задание 1:

Выполнить: Запрашиваются натуральные M и N. Создайте метод FillMatrix для заполнения матрицы размерностью M-х-N; все элементы J-го столбца вычисляются по формуле X*J (J — номер столбца, J = 1, …, N), а X — число — аргумент метода.

  
Указание: заголовок метода должен быть следующим:

static int[,] FillMatrix(int M, int N, int X)

Примерный вывод:

введите кол-во строк:
3
введите кол-во столбцов:
4
Введите значение множителя (аргумента):
3 
Матрица 3-х-3:
3 6 9 12
3 6 9 12
3 6 9 12 

 
[Название проекта: Lesson_10ExTask1, название файла L10ExTask1.cs]

Доп. задание 2:

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

  
Указание: Заголовок метода:

static int[,] SumMat(int[,] a, int[,] b)

Примерный вывод:

Matrix 1:
-3 8 3
-9 -6 4
6 4 -2
Matrix 2:
4 -4 1
-5 1 -1
4 8 -10
Result matrix:
1 4 4
-14 -5 3
10 12 -12

 
[Название проекта: Lesson_10ExTask2, название файла L10ExTask2.cs]

using System;
 
namespace Matrix_001
{
    class Program
    {
        static void Main(string[] args)
        {
            //Параметры матрицы
            const int SizeMatrix = 5;
            const int MaxValue = 100;
            const int MinValue = 0;
 
            //Инициализация переменных
            Random random = new Random();
            int[,] Matrix = new int[SizeMatrix, SizeMatrix];
            int result = 1;
 
            //Заполнение массива
            for (int i = 0; i < SizeMatrix; i++)
                for (int j = 0; j < SizeMatrix; j++)
                    Matrix[i, j] = random.Next() % (MaxValue - MinValue) + MinValue; //Форула пригодна только для диапазона положительных чисел
 
            //Вычисление произведения
            for (int i = SizeMatrix - 1; i > 0; i--)
                result *= Matrix[i, SizeMatrix - (i + 1)];
 
            //Вывод результата
            Console.WriteLine("Результат: {0}", result);
            Console.ReadKey();
        }
    }
}

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

190

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

Основной способ работы с динамическими матрицами базируется на

использовании двойных указателей. Рассмотрим следующий фрагмент программы. int main()

{

int N,M; float **a;

a=new float *[N];

}

С помощью оператора new создан массив из n элементов39, в котором каждый

элемент является адресом, по которому хранится указатель (фактически каждый указатель – адрес строки матрицы). Осталось определить значение элементов массива. Для этого организуем цикл (переменная цикла i изменяется от 0 до N-1), в котором

будет выделяться память для хранения очередной строки матрицы. Адрес этой строки будет записываться в a[i].

for(i=0;i<N;i++) a[i]=new float(M);

После этого определен массив N указателей, каждый из которых адресует массив из M чисел (в данном случае вещественных типа float). Фактически создана

динамическая матрица размера NxM. Обращение к элементу динамической матрицы идет так же, как и к элементу статической матрицы. Для того, чтобы обратиться к элементу ai , j в программе на C++ необходимо указать ее имя, и в квадратных скобках номер строки и столбца a[i][j].

Рассмотрим

основные

операции,

выполняемые

над

матрицами

(статическими

и

динамическими)

при

решении

задач.

Матрицы, как и

массивы,

нужно

вводить

(выводить)

поэлементно. Блок-схема ввода

элементов

матрицы

x[n][m]

изображена на рис. 6.3.

При

выводе

матрицы

элементы

располагаются

построчно, например:

6

9

7

13

5

8

3

8 .

3

7

88

33

55

77

88

37

Рисунок 6.3 Ввод элементов матрицы

Алгоритм построчного вывода элементов матрицы приведен на рис. 6.4.

39 В данном случае массив указателей на float.

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

191

Рисунок 6.4. Блоксхема построчного вывода матрицы

Ниже приведен текст программы, в которой организован ввод и вывод матрицы.

#include <iostream> using namespace std; int main()

{

int i,j,N,M,a[20][20];

cout<<«N=»;

//Ввод количества строк

cin>>N;

cout<<«M=»;

//Ввод количества столбцов

cin>>M;

cout<<«Ввод матрицы A»<<endl;

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

//Цикл по строкам

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

//Цикл по столбцам

cin>>a[i][j];

//Ввод элемента матрицы

cout<<«Вывод матрицы A»<<endl;

//Цикл по строкам

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

{

//Цикл по столбцам

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

cout<<a[i][j]<<«t»;

//Вывод элемента матрицы

cout<<endl;

//Переход на новую строку

}

}

Цикл для построчного вывода матрицы можно записать и так: for(i=0;i<N;cout<<endl,i++)

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

cout<<a[i][j]<<«t»;

При вводе матрицы элементы каждой строки можно разделять пробелами, символами табуляции или Enter40. На рис. 6.5 представлены результаты работы программы.

40 Можно между элементы каждой строки можно разделять пробелами или символами табуляции, а в конце строки нажимать Enter.

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

192

Рисунок 6.5. Вывод матрицы в виде таблицы.

Далее на примерах решения практических задач будут рассмотрены основные алгоритмы обработки матриц и их реализация в C++. Перед этим, напомним некоторые свойства матриц (рис. 6.6):

если номер строки элемента совпадает с номером столбца ( i= j ), это означает что элемент лежит на главной диагонали матрицы;

Рисунок 6.6 Свойства элементов матрицы

если номер строки превышает номер столбца ( i> j ), то элемент находится ниже главной диагонали;

если номер столбца больше номера строки ( i< j ), то элемент находится выше главной диагонали.

элемент лежит на побочной диагонали, если его индексы удовлетворяют

равенству i+ j=n1 ;

неравенство i+ j<n1 характерно для элемента находящегося выше побочной диагонали;

соответственно, элементу лежащему ниже побочной диагонали соответствует выражение i+ j>n1 .

ЗАДАЧА 6.1. Найти сумму элементов матрицы, лежащих выше главной диагонали.

Алгоритм решения данной задачи (рис. 6.7) построен следующим образом: обнуляется ячейка для накапливания суммы (переменная s). Затем с помощью двух

циклов (первый по строкам, второй по столбцам) просматривается каждый элемент матрицы, но суммирование происходит только в том случае если, этот элемент находится выше главной диагонали (при выполнении условия i< j ).

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

193

Рисунок 6.7: Блоксхема задачи 6.1 (алгоритм 1)

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

#include <iostream> using namespace std; int main()

{

int s,i,j,n,m,a[20][20]; cout<<«N=»; cin>>n; cout<<«M=»; cin>>m; cout<<«Input Matrix A»<<endl; for(i=0;i<n;i++)

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

cin>>a[i][j];

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

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

if (j>i) s+=a[i][j]; //Если элемент выше //главной диагонали, //то наращиваем сумму.

cout<<«S=»<<s<<endl;

}

На рисунке 6.8 изображен еще один вариант решения данной задачи. В нем проверка условия i< j не выполняется, но, тем не менее, в нем так же суммируются элементы матрицы, находящиеся выше главной диагонали. В нулевой строке заданной матрицы необходимо сложить все элементы, начиная с первого. Во первой – все, начиная со второго, в i–й строке процесс начнется с (i+1)–го элемента и так далее.

Таким образом, внешний цикл работает от 0 до N-1, а второй от i+1 до M. Авторы

надеются, что читатель самостоятельно составит программу, соответствующую описанному алгоритму.

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

194

Рисунок 6.8: Блоксхема задачи 6.1 (алгоритм 2)

ЗАДАЧА 6.2. Вычислить количество положительных элементов квадратной матрицы, расположенных по ее периметру и на диагоналях. Напомним, что в квадратной матрице число строк равно числу столбцов.

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

Рисунок 6.9:Рисунок к задаче 6.2

Из условия задачи понятно, что не нужно рассматривать все элементы заданной матрицы. Достаточно просмотреть первую и последнюю строки, первый и последний столбцы, а так же диагонали. Все эти элементы отмечены на схеме, причем черным цветом выделены элементы, обращение к которым может произойти дважды. Например, элемент с номером (0,0) принадлежит как к нулевой строке, так и к нклевому столбцу, а элемент с номером (N-1,N-1) находится в последней строке и последнем столбце одновременно. Кроме того, если N – число нечетное (на рисунке 7.8 эта матрица расположена слева), то существует элемент с номером (N/2, N/2), который находится на пересечении главной и побочной диагоналей. При нечетном значении N (матрица справа на рис. 6.9) диагонали не пересекаются.

Итак, разобрав подробно постановку задачи, рассмотрим алгоритм ее решения. Для обращения к элементам главной диагонали вспомним, что номера строк этих элементов всегда равны номерам столбцов. Поэтому, если параметр i изменяется

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

195

циклически от 0 до N-1, то A[i][i] – элемент главной диагонали. Воспользовавшись свойством, характерным для элементов побочной диагонали получим:

i + j+ 1= N → j = N- i-1,

следовательно, для i=0,1,…,N-1 элемент А[i][N-i-1] – элемент побочной диагонали. Элементы, находящиеся по периметру матрицы записываются следующим образом: А[0][i] – нулевая строка, А[N-1][i] – последняя строка и соответственно А[i][0] – нулевой столбец, А[i][N-1] – последний столбец.

Текст программы решения задачи с пояснениями:

#include <iostream> using namespace std; int main()

{

int k,i,j,N,a[20][20]; cout<<«N=»; cin>>N; cout<<«Input Matrix A»<<endl; for(i=0;i<N;i++)

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

cin>>a[i][j];

//k — количество положительных элементов матрицы, //расположенных по ее периметру и на диагоналях. for(i=k=0;i<N;i++)

{

//Элемент лежит на главной диагонали. if(a[i][i]>0)k++;

//Элемент лежит на побочной диагонали. if(a[i][N-i-1]>0)k++;

}

for(i=1;i<N-1;i++)

{

//Элемент находится в нулевой строке. if(a[0][i]>0)k++;

//Элемент находится в последней строке. if(a[N-1][i]>0)k++;

//Элемент находится в нулевом столбце. if(a[i][0]>0)k++;

//Элемент находится в последнем столбце. if(a[i][N-1]>0)k++;

}

//Если элемент, находящийся на пересечении диагоналей //подсчитан дважды, то уменьшить вычисленное значение //к на один.

if ((N%2!=0)&&(a[N/2][N/2]>0))k—; cout<<«k=»<<k<<endl;

}

ЗАДАЧА 6.3. Проверить, является ли заданная квадратная матрица единичной.

Единичной называют матрицу, у которой элементы главной диагонали – единицы, а все остальные – нули. Например,

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

196

1

0

0

0

0

0

1

0

0

0

0

0

1

0

0 .

0

0

0

1

0

(0

0

0

0

1)

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

соединить в одно и составить программу, текст которой приведён далее:

#include <iostream> using namespace std; int main()

{

int pr,i,j,N, **a;

cout<<«N=»; cin>>N;

//Создаём квадратную

a=new int *[N];

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

//динамическую матрицу

a[i]=new int [N];

cout<<«Ввод элементов матрицы A»<<endl; for(i=0;i<N;i++)

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

cin>>a[i][j];

//Предположим, что матрица единичная и присвоим //переменной pr значение 1 (истина). Если значение этой //переменной при выходе из цикла не изменится, это будет //означать, что матрица действительно единичная. for(pr=1,i=0;i<N;i++)

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

if (((i==j) && (a[i][j]!=1)) || ((i!=j) && (a[i][j]!=0))) //Если элемент лежит на главной диагонали и не равен //единице или элемент лежит вне главной диагонали и не //равен нулю, то

{

//Переменной pr присвоить значение 0 (ложь), это будет //означать, что матрица единичной не является, //и выйти из цикла.

pr=0;

break;

}

//Проверка значения переменной pr и вывод соответствующего //сообщения.

if (pr) cout<<«Единичная матрицаn»;

else cout<<«Матрица не является единичнойn»;

}

ЗАДАЧА 6.4. Преобразовать исходную матрицу так, чтобы нулевой элемент каждой строки был заменен средним арифметическим элементов этой строки.

Для решения данной задачи необходимо найти в каждой строке сумму элементов,

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

197

которую разделить на их количество. Полученный результат записать в нулевой

элемент соответствующей строки. Текст программы:

#include <iostream> using namespace std; int main()

{

int i,j,N,M; double S, **a;

//Ввод размерности матрицы. cout<<«N=»; cin>>N; cout<<«M=»; cin>>M; //Выделение памяти под матрицу a=new double *[N];

for(i=0;i<N;a[i]=new double [M],i++); cout<<«Ввод элементов матрицы A»<<endl; for(i=0;i<N;i++)

for(j=0;j<M;cin>>a[i][j],j++);

//Цикл по i завершается записью среднего значения в //нулевой элемент строки и наращиванием i. for(i=0;i<N;a[i][0]=S/M,i++)

for(S=j=0;j<M;j++)

//Вычисление суммы

S+=a[i][j];

//элементов строки.

cout<<«Output Matrix A»<<endl; for(i=0;i<N;cout<<endl,i++)

for(j=0;j<M;cout<<a[i][j]<<«t»,j++);

}

ЗАДАЧА 6.5. Задана матрица A(n,m). Поменять местами ее максимальный и минимальный элементы.

Алгоритм решения этой задачи следующий: находим максимальный элемент матрицы (max) и его индексы (imax, jmax), а также минимальный (min) и его индексы (imin, jmin). После чего элементы A[imax][jmax] и A[imin][jmin] поменяем местами. Для поиска максимального элемента и его индексов в переменную max запишем A[0][0], в переменные imax, jmax, (номер строки и столбца, где находятся максимальный элемент) запишем 0. Затем в двойном цикле (цикл по переменной i – по строкам, цикл по переменной j – по столбцам) перебираем все элементы, и каждый из них сравниваем с максимальным (со значением переменной max). Если текущий элемент массива оказывается больше максимального, то его переписываем в переменную max, а в переменную imax – текущее значение индекса i, в переменную jmax – текущее значение j. Поиск минимального элемента матрицы аналогичен, и отличается только знаком.

Далее представлен текст программы решения задачи 6.5.

#include <iostream> using namespace std; int main()

{

int i,j,imax,jmax,imin,jmin,N,M; double min,max,b, **a; cout<<«N=»; cin>>N;

cout<<«M=»; cin>>M; a=new double *[N]; for(i=0;i<N;i++)

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

198

a[i]=new double [M];

cout<<«Ввод элементов матрицы A»<<endl; for(i=0;i<N;i++)

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

cin>>a[i][j];

//Двойной цикл для поиска максимального элемента для

//поиска максимального, минимального элементов и их

//индексов.

for(max=min=a[0][0],imax=jmax=imin=jmin=i=0;i<N;i++)

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

{

if (a[i][j]>max) {max=a[i][j]; imax=i;jmax=j;} if (a[i][j]<min) {min=a[i][j]; imin=i;jmin=j;}

}

//Обмен двух элементов матрицы. b=a[imax][jmax]; a[imax][jmax]=a[imin][jmin]; a[imin][jmin]=b;

//Вывод преобразованной матрицы. cout<<«Output Matrix A»<<endl; for(i=0;i<N;cout<<endl,i++)

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

cout<<a[i][j]<<«t»;

}

ЗАДАЧА 6.6. Преобразовать матрицу A(m,n) так, чтобы строки с нечетными индексами были упорядочены по убыванию, c четными – по возрастанию.

В связи с нумерацией строк в C++ с 0, необходимо помнить, что нулевая, вторая, четвертая строки упорядочиваются по убыванию, а первая, третья, пятая и т.д. – по возрастанию. Алгоритм решения этой задачи сводится к тому, что уже известный нам по предыдущей главе алгоритм упорядочивания элементов в массиве выполняется для каждой строки матрицы. Блок-схема приведена на рис. 6.10. Текст программы с

комментариями приведён далее.

#include <iostream> using namespace std; int main()

{

int i,j,k,N,M; double b, **a; cout<<«M=»; cin>>M; cout<<«N=»; cin>>N; a=new double *[N]; for(i=0;i<N;i++)

a[i]=new double [M];

cout<<«Ввод элементов матрицы A»<<endl; for(i=0;i<M;i++)

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

cin>>a[i][j];

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

199

Рисунок 6.10: Блоксхема алгоритма задачи 6.6

//Цикл по i — для перебора строк матрицы. for(i=0;i<M;i++)

//Если строка четна, то if(i%2==0)

{

//упорядочиваем элементы строки по возрастанию, for(k=1;k<N;k++)

for(j=0;j<N-k;j++) if(a[i][j]>a[i][j+1])

{

b=a[i][j];

a[i][j]=a[i][j+1];

a[i][j+1]=b;

}

}

else

//иначе, нечетные строки, упорядочиваем по убыванию. for(k=1;k<N;k++)

for(j=0;j<N-k;j++) if(a[i][j]<a[i][j+1])

{

b=a[i][j];

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

200

a[i][j]=a[i][j+1];

a[i][j+1]=b;

}

//Вывод преобразованной матрицы. cout<<«Преобразованная матрица A»<<endl; for(i=0;i<M;cout<<endl,i++)

for(j=0;j<N;cout<<a[i][j]<<«t»,j++);

}

ЗАДАЧА 6.7. Поменять местами элементы главной и побочной диагонали матрицы A(k,k).

Алгоритм решения задачи следующий: перебираем все строки матрицы (цикл по переменной i от 0 до k-1), и в каждой строке меняем местами элементы, расположенные на главной и побочной диагоналях (в i-й строке надо поменять местами элементы A[i]

[i] и А[i][k-i-1]). Текст программы с комментариями:

#include <iostream> using namespace std; int main()

{

int i,j,k; double b,**a;

cout<<«k=»; cin>>k; a=new double *[k];

for(i=0;i<k;a[i]=new double [k],i++); cout<<«Ввод элементов матрицы A»<<endl; for(i=0;i<k;i++)

for(j=0;j<k;cin>>a[i][j],j++); for(i=0;i<k;i++) //Цикл по строкам.

{

//В каждой строке обмен между элементами, лежащими на //главной и побочной диагоналях.

b=a[i][i]; a[i][i]=a[i][k-1-i]; a[i][k-1-i]=b;

}

//Вывод преобразованной матрицы. cout<<«Преобразованная матрица A»<<endl; for(i=0;i<k;cout<<endl,i++)

for(j=0;j<k;cout<<a[i][j]<<«t»,j++);

}

ЗАДАЧА 6.8. Заполнить матрицу A(6,6) числами 1 до 36 следующим образом

1

2

3

4

5

6

12

11

10

9

8

7

13

14

15

16

17

18 .

24

23

22

21

20

19

25

26

27

28

29

30

(36

35

34

33

32

31)

Последовательно построчно заполняем матрицу возрастающей арифметической последовательностью 1,2,3,… , 36 . Четные строки заполняем от 0-го элемента

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Понравилась статья? Поделить с друзьями:
  • Как составить слово в слове натюрморт
  • Как составить протокол об административном задержании образец
  • Telegram как найти контакты
  • Как найти системные файлы на айфоне
  • Как найти свой билет по фамилии победа