Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 6
1

Многопоточность: найти в одномерном массиве максимум среди нечетных чисел

18.02.2021, 20:28. Показов 590. Ответов 6

Author24 — интернет-сервис помощи студентам
Дано задание: найти в одномерном массиве найти максимум среди нечетных чисел. Я набросал данный код:
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
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <algorithm>
#include <vector>
#include <mutex>
#include <Windows.h>
using namespace std;
const int COUNT = 110;
const int MAX_NTHREAD = 4;
mutex Mutex;
void init_array(int arr[])
{
    srand(GetTickCount());
    for (int i = 0; i < COUNT; i++)
    {
        arr[i] = rand() % 100;
        cout << arr[i] << endl;
    }
 
 
}
 
void search(int arr[], int start, int finish, int& result)
{
    int local_result = 0;
    int max = arr[0];
    for (int i = start; i < finish; i++)
    {
        if (arr[i] % 2 != 0)
        {
            if (arr[i] > max)
            {
                local_result = arr[i];
            }
        }
    }
    lock_guard<std::mutex> lock(Mutex);
    result = local_result;
    cout << this_thread::get_id() << ": " << result <<
        endl;
 
 
}
int search_threads(int arr[])
{
    unsigned int const min_block_size = 25;
    unsigned int const max_threads =
        (COUNT + min_block_size - 1) / min_block_size;
    unsigned int const hardware_threads =
        thread::hardware_concurrency();
    unsigned int const count_threads =
        min(hardware_threads != 0 ?
            hardware_threads : 2, max_threads);
    int block_size = COUNT / count_threads;
    vector <int> h;
    int result = 0;
    vector<thread> threads(count_threads - 1);
    for (unsigned int i = 0; i < count_threads - 1; i++)
    {
        threads[i] = thread(search, arr, block_size*i,
            block_size*(i + 1), ref(result));
        h.push_back(result);
    }
    search(arr, block_size*(count_threads - 1), COUNT, result);
    h.push_back(result);
    for (unsigned int i = 0; i < count_threads - 1; i++)
    {
        threads[i].join();
    }
    for (int i = 0; i < h.size(); i++)
    {
        cout << "res:" << h[i] << endl;
    }
    return result;
}
int main()
{
    int a[COUNT];
    init_array(a);
    cout << "Result = " << search_threads(a) << endl;
    cin.ignore();
    return 0;
}
Попробовал запихнуть нужные значения в вектор, чтобы потом в нем найти максимальное число, но он получает только 2 значения из 4. Прошу объяснить, где я ошибся и как это можно исправить.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2021, 20:28
Ответы с готовыми решениями:

Среди чисел на четных местах найти максимум,а среди нечетных найти минимум
Текст полной задачи: С клавиатуры вводится произвольная последовательность целых чисел.Числа...

В одномерном массиве целых чисел определить:количество нечетных среди N последних чисел;
В одномерном массиве целых чисел определить:количество нечетных среди N последних чисел;

Среди введенных четных чисел найдите максимум (М1), также найдите максимум (М2) среди нечетных чисел
На вычислительной практие дали такое задание: С клавиатуры вводится произвольная...

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

6
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
18.02.2021, 20:51 2
Цитата Сообщение от Pettizen Посмотреть сообщение
Попробовал запихнуть нужные значения в вектор, чтобы потом в нем найти максимальное число, но он получает только 2 значения из 4. Прошу объяснить, где я ошибся и как это можно исправить
C++
1
2
3
4
5
6
7
for (unsigned int i = 0; i < count_threads - 1; i++)
    {
h.push_back(0);
        threads[i] = thread(search, arr, block_size*i,
            block_size*(i + 1), ref(h.back()));
        
    }
Добавлено через 2 минуты
И не забудь сделать reserve
C++
1
2
3
4
5
vector <int> h;
 
h.reserve(count_threads)
    int result = 0;
    vector<thread> threads(count_threads - 1);
1
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 6
18.02.2021, 21:12  [ТС] 3
Спасибо, разобрался! Только заметил, что порой не находится максимальный нечетный элемент. В вектор он просто не записывается, хотя в логике поиска вроде все нормально. Не знаете, почему так получается?
0
Just Do It!
3841 / 2288 / 636
Регистрация: 23.09.2014
Сообщений: 7,084
Записей в блоге: 2
18.02.2021, 21:14 4
Цитата Сообщение от Pettizen Посмотреть сообщение
найти в одномерном массиве найти максимум среди нечетных чисел
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
#include <iostream>
#include <vector>
#include <thread>
 
int sum[10];
 
void foo(std::vector<int>& v, int i)
{   int a  = v.size() / 10;
    int b  = a * i;
    sum[i] = 0;
    for(int j = b; j < a*(i+1); ++j)
    {   if(v[j]%2) sum[i] += v[j];
    }
}
 
int main()
{
    std::vector<int> v(1000, 1); /// TODO: Заполните так, как вам нравится ...
    
    std::vector<std::thread> f;
    
    for(int i = 0; i < 10; ++i)
    {   f.push_back(std::thread(foo, std::ref(v), i));
    }
    
    int total = 0;
    for(int i = 0; i < 10; ++i)
    {   f[i].join();
        total += sum[i];
    }
 
    std::cout << "total: " << total << '\n';
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
18.02.2021, 21:15 5
Цитата Сообщение от Pettizen Посмотреть сообщение
Спасибо, разобрался! Только заметил, что порой не находится максимальный нечетный элемент. В вектор он просто не записывается, хотя в логике поиска вроде все нормально. Не знаете, почему так получается?
Цитата Сообщение от Pettizen Посмотреть сообщение
int max = arr[0];
for (int i = start; i < finish; i++)
Это неправильно, arr[0] может быть чётным. Сделай
C++
1
int max = INT_MIN;
и учти, что нечётного элемента может не быть вообще
0
Just Do It!
3841 / 2288 / 636
Регистрация: 23.09.2014
Сообщений: 7,084
Записей в блоге: 2
18.02.2021, 21:28 6
такой максимум:
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
#include <iostream>
#include <vector>
#include <thread>
 
int sum[10];
 
void init(std::vector<int>& v)
{   for (int i = 0; i < v.size(); i++)
    {   v[i] = rand() % 500;
    }
}
 
void foo(std::vector<int>& v, int i)
{   int a  = v.size() / 10;
    int b  = a * i;
    sum[i] = 0;
    for(int j = b; j < a*(i+1); ++j)
    {   if(v[j]%2 && sum[i] < v[j]) sum[i] = v[j];
    }
}
 
int main()
{
    std::vector<std::thread> f;
    std::vector<int> v(1000, 1);
    init(v); 
         v[777] = 2021; ///<--- яйцо!
    
    for(int i = 0; i < 10; ++i)
    {   f.push_back(std::thread(foo, std::ref(v), i));
    }
    
    int total = 0;
    for(int i = 0; i < 10; ++i)
    {   f[i].join();
        if(total < sum[i]) total = sum[i];
    }
 
    std::cout << "find: " << total << '\n';
}
0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 6
18.02.2021, 21:37  [ТС] 7
Код
int max = INT_MIN;
Поправил, но все равно порой максимум не находит.

Добавлено через 8 минут
Все, всем спасибо, нашел ошибку.
0
18.02.2021, 21:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2021, 21:37
Помогаю со студенческими работами здесь

В одномерном массиве найти количество нечетных чисел кратных 7
Добрый вечер! Необходимо написать программу по условиям: одномерный массив заполняется целыми...

В заданном одномерном массиве найти наименьшее из нечётных чисел, найти ошибку
Условие В заданном одномерном массиве N&lt;=40 найти наименьшее из нечётных чисел . Вот моя...

Найти сумму чётных чисел и произведение нечетных в одномерном массиве
С++ MV C++ Дан одномерный массив. Надо найти сумму чётных чисел и произведение нечетных. И, если...

В одномерном массиве целых чисел найти МАХ среди элементов являющихся четными и МИН среди элементов кратных А
В одномерном массиве целых чисел найти МАХ среди элементов являющихся четными и МИН среди элементов...

Найти минимальный элемент среди отрицательных чисел в одномерном массиве
Написал прожку, скажите ищет ли она минимальный элемент среди отрецательных чисел в массиве. Мне...

Найти минимум среди нечетных, и максимум - среди четных элементов массива
Помогите пожалуйста сделать так, чтобы эта программа брала min c нечетных, а max с четных...


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

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