3 / 3 / 0
Регистрация: 02.04.2016
Сообщений: 127
1

Обработать параллельным способом матрицу с механизмом замков

23.11.2020, 03:39. Показов 600. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброй ночи! Подскажите, пожалуйста, почему у меня после выполнения 3 пункта в 2 пункт выполняется всё только в 0 потоке? Если просто выполнить 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using namespace std;
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
 
// Создать программу, которая должна реализовать следующие действия:
//1.Створиты матрицу А размером m * n, элементы которой заполняются рандомно, m задает
// количество строк, n задает количество столбцов. Переменные могут задаваться в программном
// коде или вводиться с клавиатуры.
 
const int m = 5, n = 5;
int A[m][n], B[m];
bool visible = true;
omp_lock_t lock; int thread_num;
ofstream out;
 
 
void Mas_A() {
    printf("Массив А: \n");
    for (int i = 0; i < n; i++)
    {
        visible ? printf("Ряд - %d:\t", i + 1) : true;
        for (int j = 0; j < n; j++)
        {
            A[i][j] = GetRandomValue(0, 99);
            if (visible) {printf("%d\t", A[i][j]);}
        }
        visible ? printf("\n") : true;
    }
    cout << endl;
}
 
// 2. Обработать параллельным способом матрицу по своему варианту. каждый поток
// должен обрабатывать несколько строк матрицы. Результаты обработки вывести в текстовый
// файл. При этом перед выводом каждый поток должен выставить блокировки с
// помощью механизма замков.
 
void Par_Min_Value_From_Row(int num) {
    printf("\n\nПоток - %d\n\n", omp_get_thread_num());
#pragma omp parallel num_threads(8)
    {
#pragma omp for 
        for (int i = 0; i < m; i++)
        {
            int min = A[0][0];
            min = A[i][0];
            for (int j = 0; j < n; j++)
            {
                if (A[i][j] < min) {
                    min = A[i][j];
                }
            }
            B[i] = min;
            printf("Строка - %d\t Значение - %d\t поток - %d\n", i + 1, B[i], omp_get_thread_num());
            out << "Строка - " << i + 1 << "\t Значение - " << B[i] << "\t поток - " << omp_get_thread_num() << endl;
        }
    }
}
 
 
// 3. В текстовый файл все потоки по очереди должны вывести сообщение "Начало
// закрытой секции ... "и" Конец закрытой секции ... ". Если при этом между двумя
// сообщениями от одного потока встретятся сообщения от других потоков о
// неудачную попытку войти в закрытой секции, они также должны быть записаны в файл.
 
void writing_to_file() {
 
    omp_init_lock(&lock);
#pragma omp parallel private (thread_num)
    {
        thread_num = omp_get_thread_num();
        while (!omp_test_lock(&lock))
        {
            printf("Секция закрыта, обратился поток %d\n", thread_num);
            out << "Секция закрыта, обратился поток " << thread_num << endl;
            Sleep(2);
        }
 
        printf("Начало закрытой секции, поток %d\n\n", thread_num);
        out << "Начало закрытой секции, поток " << thread_num << endl << endl;
 
        Par_Min_Value_From_Row(thread_num);
        Sleep(5);
        omp_unset_lock(&lock);
        printf("\nКонец закрытой секции, поток %d\n", thread_num);
        out << endl << "Конец закрытой секции, поток " << thread_num << endl;
    }
    omp_destroy_lock(&lock);
}
 
int main()
{
    out.open("lab3.txt", std::ios::app);
    setlocale(0, "rus");
r:
    system("cls");
    Mas_A();
    //Par_Min_Value_From_Row();
    writing_to_file();
 
    char repl;
    cout << "Для повтора введите 'R': "; cin >> repl;
    if (repl == 'R' or repl == 'r') {
        goto r;
    }
    else {
        return 0;
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2020, 03:39
Ответы с готовыми решениями:

Как обработать параллельным способом матрицу?
Всем доброго времени суток, подскажите как можно обработать параллельным способом матрицу? Каждый...

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

Получить матрицу из чисел, заполняющих матрицу по линиям, параллельным главной диагонали
Получить матрицу A=(aij), i,j=1..n, n&lt;=100, элементами которой является ряд натуральных чисел,...

Каким способом можно так обработать голос?
Если кто-то знает, каким способом можно так обработать голос? Вот ссылка: ...

11
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 09:47 2
Цитата Сообщение от DmitriyStroy Посмотреть сообщение
Доброй ночи! Подскажите, пожалуйста, почему у меня после выполнения 3 пункта в 2 пункт выполняется всё только в 0 потоке? Если просто выполнить 2 пункт все срабатывает вроде как надо. Как мне тогда их распределить?)
Сделать блокировку внутри функции Par_Min_Value_From_Row, а не снаружи
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
void Par_Min_Value_From_Row(int num) 
{
 omp_init_lock(&lock);
    printf("\n\nПоток - %d\n\n", omp_get_thread_num());
#pragma omp parallel num_threads(8)
    {
#pragma omp for 
        for (int i = 0; i < m; i++)
        {
            int min = A[0][0];
            min = A[i][0];
            for (int j = 0; j < n; j++)
            {
                if (A[i][j] < min) {
                    min = A[i][j];
                }
            }
            B[i] = min;
            printf("Строка - %d\t Значение - %d\t поток - %d\n", i + 1, B[i], omp_get_thread_num());
            out << "Строка - " << i + 1 << "\t Значение - " << B[i] << "\t поток - " << omp_get_thread_num() << endl;
        }
omp_test_lock(&lock)
 
.................................................................
omp_unset_lock(&lock);
    }
 
omp_destroy_lock(&lock);
}
Добавлено через 18 секунд
writing_to_file() вообще убрать
0
3 / 3 / 0
Регистрация: 02.04.2016
Сообщений: 127
23.11.2020, 13:03  [ТС] 3
oleg-m1973, мне просто объединить как-то их writing_to_file() и Par_Min_Value_From_Row()? Мне же нужно еще выполнить задачу поставленную в 3 пункте:

Цитата Сообщение от DmitriyStroy Посмотреть сообщение
// 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
void Par_Min_Value_From_Row() {
    omp_init_lock(&lock);
#pragma omp parallel num_threads(4)
    {
#pragma omp for 
        for (int i = 0; i < m; i++)
        {
            int min = A[0][0];
            min = A[i][0];
            for (int j = 0; j < n; j++)
            {
                if (A[i][j] < min) {
                    min = A[i][j];
                }
            }
            B[i] = min;
            printf("Строка - %d\t Значение - %d\t поток - %d\n", i + 1, B[i], omp_get_thread_num());
            out << "Строка - " << i + 1 << "\t Значение - " << B[i] << "\t поток - " << omp_get_thread_num() << endl;
 
        }
        thread_num = omp_get_thread_num();
        while (!omp_test_lock(&lock))
        {
            printf("Секция закрыта, обратился поток %d\n", thread_num);
            out << "Секция закрыта, обратился поток " << thread_num << endl;
            Sleep(2);
        }
        printf("Начало закрытой секции, поток %d\n\n", thread_num);
        out << "Начало закрытой секции, поток " << thread_num << endl << endl;
        Sleep(5);
        printf("\nКонец закрытой секции, поток %d\n", thread_num);
        out << endl << "Конец закрытой секции, поток " << thread_num << endl;
        omp_unset_lock(&lock);
    }
    omp_destroy_lock(&lock);
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 13:06 4
Цитата Сообщение от DmitriyStroy Посмотреть сообщение
oleg-m1973, мне просто объединить как-то их writing_to_file() и Par_Min_Value_From_Row()? Мне же нужно еще выполнить задачу поставленную в 3 пункте:
Я ж тебе вроде показал где это всё должно делаться. Там и делай

Добавлено через 40 секунд
Цитата Сообщение от DmitriyStroy Посмотреть сообщение
Вариант объединить:
Ну да, как то так. Опять не работает?

Добавлено через 26 секунд
Покажи весь код
0
3 / 3 / 0
Регистрация: 02.04.2016
Сообщений: 127
23.11.2020, 13:12  [ТС] 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну да, как то так. Опять не работает?
Такой результат получается:
Миниатюры
Обработать параллельным способом матрицу с механизмом замков  
0
3 / 3 / 0
Регистрация: 02.04.2016
Сообщений: 127
23.11.2020, 13:13  [ТС] 6
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну да, как то так. Опять не работает?
Такой результат получается:
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 13:16 7
Цитата Сообщение от DmitriyStroy Посмотреть сообщение
Такой результат получается:
Вроде всё правильно

Добавлено через 32 секунды
Цитата Сообщение от DmitriyStroy Посмотреть сообщение
out << "Секция закрыта, обратился поток " << thread_num << endl;
Вот это должно быть под блокировкой, иначе перемешается
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
23.11.2020, 13:36 8
thread_num - глобальная переменная!!! она должна или быть объявленной внутри параллельной секции или помечена как private

Всё printf/out<< должны быть синхронизированы, т.к. работают с общими данными, например окружены критической секцией.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 13:38 9
Цитата Сообщение от AlexVRud Посмотреть сообщение
Всё printf/out<< должны быть синхронизированы, т.к. работают с общими данными, например окружены критической секцией.
Только <<.
printf и так синхронизируется
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
23.11.2020, 13:39 10
Т.е.

C++
1
2
3
4
5
#pragma omp critical (print)
         {
            printf("Строка - %d\t Значение - %d\t поток - %d\n", i + 1, B[i], omp_get_thread_num());
            out << "Строка - " << i + 1 << "\t Значение - " << B[i] << "\t поток - " << omp_get_thread_num() << endl;
         }
0
3 / 3 / 0
Регистрация: 02.04.2016
Сообщений: 127
23.11.2020, 13:48  [ТС] 11
oleg-m1973, я представлял что оно как то должно отработать по другому)
Как-то так:
Начало закрытой секции, поток 2
//выводим обработку
Строка - 4 Значение - 49 поток - 2
//и выводим сообщения если другие потоки попадают
Секция закрыта, обратился поток 1
Секция закрыта, обратился поток 0
Секция закрыта, обратился поток 3
Секция закрыта, обратился поток 0
Конец закрытой секции, поток 2

Можно ли как то так реализовать?

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Вот это должно быть под блокировкой, иначе перемешается
А как я его могу заблокировать?) оно вроде и так выдается по мере надобности)

удалил: thread_num = omp_get_thread_num();
и заменил thread_num сразу на omp_get_thread_num();
теперь выводится лучше.

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
44
45
void Par_Min_Value_From_Row() {
    omp_init_lock(&lock);
#pragma omp parallel num_threads(4)
    {
#pragma omp for 
        for (int i = 0; i < m; i++)
        {
            int min = A[0][0];
            min = A[i][0];
            for (int j = 0; j < n; j++)
            {
                if (A[i][j] < min) {
                    min = A[i][j];
                }
            }
            B[i] = min;
            SetConsoleTextAttribute(console, (Black | LightMagenta));
#pragma omp critical (print)
            {
                printf("Строка - %d\t Значение - %d\t поток - %d\n", i + 1, B[i], omp_get_thread_num());
                out << "Строка - " << i + 1 << "\t Значение - " << B[i] << "\t поток - " << omp_get_thread_num() << endl;
            }
        }
        while (!omp_test_lock(&lock))
        {
#pragma omp critical (print)
            {
                printf("Секция закрыта, обратился поток %d\n", omp_get_thread_num());
                out << "Секция закрыта, обратился поток " << omp_get_thread_num() << endl;
            }
        }
#pragma omp critical (print)
        {
            printf("Начало закрытой секции, поток %d\n\n", omp_get_thread_num());
            out << "Начало закрытой секции, поток " << omp_get_thread_num() << endl << endl;
        }
#pragma omp critical (print)
        {
            printf("\nКонец закрытой секции, поток %d\n", omp_get_thread_num());
            out << endl << "Конец закрытой секции, поток " << omp_get_thread_num() << endl;
        }
        omp_unset_lock(&lock);
    }
    omp_destroy_lock(&lock);
}
Миниатюры
Обработать параллельным способом матрицу с механизмом замков  
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
24.11.2020, 17:28 12
DmitriyStroy, не знаю на сколько вся это будет тебе полезно. Попытался не использовать чего-то страшного в виде шаблонов. Но некоторые элементы C++11 и дополнительный класс для матрицы, по мне, так более уместны.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
#include <chrono>
#include <exception>
#include <iostream>
#include <random>
#include <thread>
#include <vector>
 
#include <omp.h>
 
// Простой класс для матрицы, который будет хранить данные построчно в
// одномерном массиве.
class Matrix {
public:
  Matrix(size_t rows, size_t cols)
      : m_rows(rows), m_cols(cols), m_data(rows * cols) {}
 
  double *operator[](size_t row) { return &m_data[row * m_cols]; }
  const double *operator[](size_t row) const { return &m_data[row * m_cols]; }
 
  size_t rows() const { return m_rows; }
  size_t cols() const { return m_cols; }
 
private:
  size_t m_rows;
  size_t m_cols;
  std::vector<double> m_data;
};
 
//
// Создать программу, которая должна реализовать следующие действия:
//
 
// 1.Створиты матрицу А размером m * n, элементы которой заполняются рандомно, m
// задает количество строк, n задает количество столбцов. Переменные могут
// задаваться в программном коде или вводиться с клавиатуры.
//
Matrix random_matrix(size_t rows, size_t cols) {
  Matrix A(rows, cols);
  #pragma omp parallel
  {
    // Каждый поток создаёт свою версию объектов для генерации случайных чисел.
    std::mt19937 gen(std::random_device{}());
    std::normal_distribution<> dist;
    #pragma omp for collapse(2)
    for (size_t i = 0; i < rows; ++i) {
      for (size_t j = 0; j < cols; ++j) {
        A[i][j] = dist(gen);
      }
    }
  }
  return A;
}
 
// 2. Обработать параллельным способом матрицу по своему варианту. каждый поток
// должен обрабатывать несколько строк матрицы. Результаты обработки вывести в
// текстовый файл. При этом перед выводом каждый поток должен выставить
// блокировки с помощью механизма замков.
//
// Минимальный элемент для каждой строки с сохранением в файл.
//
// out - поток для записи, может быть или std::cout или std::fostream.
//       Это упростит написание кода.
// A   - матрица для обработки.
//       Нам не надо передавать N и M, т.к. они уже хранятся в классе Matrix.
//
void min_value_from_row(std::ostream &out, const Matrix &A) {
 
  // Локальный замок. Он нужен только для этой задачи. И так будет проще не
  // забыть его уничтожить.
  omp_lock_t lock;
  omp_init_lock(&lock);
 
  #pragma omp parallel
  {
    // Сохраняем номер потока в приватную локальную переменную
    // (она объявлена внутри параллельной секции).
    int thread_num = omp_get_thread_num();
 
    #pragma omp for
    for (size_t i = 0; i < A.rows(); ++i) {
      double min = A[i][0];
      for (size_t j = 1; j < A.cols(); ++j) {
        if (min > A[i][j])
          min = A[i][j];
      }
 
      // Просто блокируем вывод, нас пока попросили только это.
      // Вариант с объединением пунктов 2 и 3 будет позже
      omp_set_lock(&lock);
      out << "thread " << thread_num << ":\t" //
          << "row = " << i << ", \t"          //
          << "min = " << min << "\n";
      omp_unset_lock(&lock);
    }
  }
  omp_destroy_lock(&lock);
}
 
// 3. В текстовый файл все потоки по очереди должны вывести сообщение "Начало
// закрытой секции ... " и " Конец закрытой секции ... ". Если при этом между
// двумя сообщениями от одного потока встретятся сообщения от других потоков о
// неудачную попытку войти в закрытой секции, они также должны быть записаны в
// файл.
//
// Обратим внимание, что в файл потоки должны писать в независимости от того,
// внутри они закрытой секции или нет. Т.к. файл - это общий ресурс, то
// необходимо синхронизировать доступ к нему отдельно от замка. Например,
// использовать второй замок или именованную критическую секцию OpenMP.
// Рассмотрим второй вариант.
//
// При этом надо понимать, что нам не гарантируется вывод сообщений "Ожидаю ..."
// только между "Начало ..." и "Конец ...". Поток может не успеть узнать, что
// закрытая секция уже освободилась.
//
void using_lock_with_messages(std::ostream &out) {
  // Локальный замок. Он нужен только для этой задачи. И так будет проще не
  // забыть его уничтожить.
  omp_lock_t lock;
  omp_init_lock(&lock);
 
  #pragma omp parallel
  {
    // Сохраняем номер потока в приватную локальную переменную
    // (она объявлена внутри параллельной секции).
    int thread_num = omp_get_thread_num();
 
    while (!omp_test_lock(&lock)) {
      #pragma omp critical(write_to_out)
      {
        out << "thread " << thread_num << ":\t" //
            << "\tОжидаю закрытую секцию\n";
      }
 
      std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
 
    #pragma omp critical(write_to_out)
    {
      out << "thread " << thread_num << ":\t" //
          << "Начало закрытой секции\n";
    }
 
    // Немного поработаем
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
 
    #pragma omp critical(write_to_out)
    {
      out << "thread " << thread_num << ":\t" //
          << "Конец закрытой секции\n";
    }
 
    omp_unset_lock(&lock);
  }
 
  omp_destroy_lock(&lock);
}
 
void task_2_and_3(std::ostream &out, const Matrix &A) {
  // Локальный замок. Он нужен только для этой задачи. И так будет проще не
  // забыть его уничтожить.
  omp_lock_t lock;
  omp_init_lock(&lock);
 
  #pragma omp parallel
  {
    // Сохраняем номер потока в приватную локальную переменную
    // (она объявлена внутри параллельной секции).
    int thread_num = omp_get_thread_num();
 
    #pragma omp for
    for (size_t i = 0; i < A.rows(); ++i) {
      double min = A[i][0];
      for (size_t j = 1; j < A.cols(); ++j) {
        if (min > A[i][j])
          min = A[i][j];
      }
 
      // Будет выводить только одно сообщение об ожидании
      bool is_error_message_writed = false;
      while (!omp_test_lock(&lock)) {
        if (!is_error_message_writed) {
          #pragma omp critical(write_to_out)
          {
            out << "thread " << thread_num << ":\t" //
                << "\tОжидаю закрытую секцию\n";
          }
          is_error_message_writed = true;
        }
      }
 
      #pragma omp critical(write_to_out)
      {
        out << "thread " << thread_num << ":\t" //
            << "Начало закрытой секции\n";
      }
 
      #pragma omp critical(write_to_out)
      {
        out << "thread " << thread_num << ":\t" //
            << "\trow = " << i << ", \t"        //
            << "min = " << min << "\n";
      }
 
      #pragma omp critical(write_to_out)
      {
        out << "thread " << thread_num << ":\t" //
            << "Конец закрытой секции\n";
      }
 
      omp_unset_lock(&lock);
    }
  }
  omp_destroy_lock(&lock);
}
 
//////////////////////////////////////////////////////////////////////////////
// Следующие константы удобно использовать для задания размеров массивов,
// которые будут равномерно распределены между потоками.
 
// НОК наиболее популярного числа ядер процессора
const size_t lcm_1_2_4_6_8_10_12_16_20 = 240;
// НОК чисел от 1 до 10
const size_t lcm_1___10 = 2520;
// НОК чисел от 1 до 16
const size_t lcm_1___16 = 720720;
// НОК чисел от 1 до 20
const size_t lcm_1___20 = 232792560;
 
int main() {
  const size_t N = lcm_1_2_4_6_8_10_12_16_20;
  const size_t M = 1000;
 
  std::cout << "---------------------------------------------------------\n"
            << " Шаг 1.\n\n";
  Matrix A = random_matrix(N, M);
 
  std::cout << "---------------------------------------------------------\n"
            << " Шаг 2.\n\n";
  min_value_from_row(std::cout, A);
 
  std::cout << "---------------------------------------------------------\n"
            << " Шаг 3.\n\n";
  using_lock_with_messages(std::cout);
 
  std::cout << "---------------------------------------------------------\n"
            << " Шаги 2 и 3.\n\n";
  task_2_and_3(std::cout, A);
 
  return 0;
}
0
24.11.2020, 17:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2020, 17:28
Помогаю со студенческими работами здесь

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

Заполнить квадратную матрицу следующим способом
Собственно, кто сможет помочь? :-|

Заполнить квадратную матрицу следующим способом
Нужно заполнить матрицу вот таким способом Y\X 0 1 2 3 4 5 6 7 8 ...

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

Обработать на компьютере матрицу
Обработать на компьютере матрицу D(N,M): вычислить и запомнить в однородных массивах P(N) и K(N) ...

Обработать квадратную матрицу
Обработать на компьютере квадратную матрицу E(N,N): найти в каждой строке максимальный элемент и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru