Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296

Работа с обсчетом членов ряда потоками

04.10.2011, 01:02. Показов 2415. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите пожалуйста разобраться.
Задача такая:
Обсчитать сумму ряда по частям, с помощью потоков. Каждый поток считает свою часть ряда, и в итоге главный поток возвращает всю сумму. Вроде бы все правильно, но почему криво считает.
К примеру:

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
#include <iostream>
#include <wait.h>
#include <math.h>
using namespace std;
 
float calcSum(float);   // прототип функции вычисления суммы
int n = 0;              // количество потоков
 
struct thread_arg
{
    float sum;  // сумма
    int id;     // id потока
    int start;  
    int end;
    int kol;    // количество членов ряда, которые нужно обсчитать
};
// потоковая функция
void *thread_f (void *arg)
{
    struct thread_arg *targ = (struct thread_arg*) arg;
    int id_t = targ->id; // id текущего потока
    cout << "id-------------------------------------"<< id_t <<endl;
    float s = 0.0;
    for (int i=targ->start; i<targ->end; i++)
    {
        float a = i;
        float b = i+1;
        s += a/b;
    }
    targ->sum = s;
    cout <<"schital s "<< (targ->start) <<" po "<< (targ->end) <<endl;
    cout <<"summa chasti "<< targ->sum <<" moi id "<< id_t << endl;
}
 
int main() 
{
    struct thread_arg *targ1;
    
    cout << "Enter the amount of pthread" << endl;
    cin >> n;               // вводим кол-во потоков
    cout << "Entre the term amount value of sum" << endl;
    cin >> targ1->kol;      // вводим кол-во членов ряда
    
    int step = (targ1->kol-targ1->kol%n)/n; // вычисляем шаг
    int ost = targ1->kol%n;                 // вычисляем остаток
    
    int start = 0;      
    int end = step;
    
    pthread_t thread[n];
    thread_arg num[n];
    
    for (int i=0; i<=n, end<=targ1->kol; i++, start+=step, end+=step)
    { 
        num[i].id = i;        // передаем id потока
        num[i].start = start; // передаем начало части ряда
        num[i].end = end + 1; // передаем конец части ряда
    
        pthread_create(&thread[i], NULL, &thread_f, &num[i]);
    
        if (ost > 0)
        {
            start++;
            end++;
            ost--;
        }
        sleep(1);
    }
    float totalSum = 0.0;
    for (int i=0; i<n; i++)
    {
        pthread_join(thread[i],NULL);
        totalSum += num[i].sum;
    }
    cout << "summa "<< totalSum << endl; 
return 0;
}
Почему с 7го по 11й? Просто уже запутался... но спать нельзя.
Миниатюры
Работа с обсчетом членов ряда потоками  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.10.2011, 01:02
Ответы с готовыми решениями:

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

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

Определить число членов ряда, необходимых для расчета с заданной погрешностью суммы членов ряда
определить число членов ряда, необходимых для расчета с заданной погрешностью суммы членов ряда: 1-1/3+1/5-1/7+…..: (-1)^N/(2*N+1);...

21
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
06.10.2011, 11:46  [ТС]
Студворк — интернет-сервис помощи студентам
Теперь другая проблема, просто написал тест:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main()
{
    float s = 0.0;
    int n = 10  ;
    for (float i=0; i<n; i++)
    {
        
        s += i/(i+1.0);
    }
    cout << s << endl;
    return 0;
}
Сумму считает неверно. Решил выложить весь код.
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
#include <iostream>
#include <wait.h>
#include <math.h>
using namespace std;
 
float calcSum(float);   // прототип функции вычисления суммы
int n = 0;              // количество потоков
 
struct thread_arg
{
    float sum;  // сумма
    int id;     // id потока
    int start;  
    int end;
    int kol;    // количество членов ряда, которые нужно обсчитать
};
 
// потоковая функция
void *thread_f (void *arg)
{
    struct thread_arg *targ = (struct thread_arg*) arg;
    int id_t = targ->id; // id текущего потока
    cout << "id-------------------------------------"<< id_t <<endl;
    float s = 0.0;
    for (int i=targ->start; i<targ->end; i++)
    {
        float a = i;
        float b = i+1;s 
        s += a/b;
    }
    targ->sum = s;
    cout <<"schital s "<< (targ->start) <<" po "<< (targ->end) <<endl;
    cout <<"summa chasti "<< targ->sum <<" moi id "<< id_t << endl;
}
 
int main() 
{
    struct thread_arg targ1;
    
    cout << "Enter the amount of pthread" << endl;
    cin >> n;               // вводим кол-во потоков
    cout << "Entre the term amount value of sum" << endl;
    cin >> targ1.kol;       // вводим кол-во членов ряда
    
    int step = targ1.kol / n;
    int ost = targ1.kol % n;
    
    int start = 0;      
    int end = step-1;
    
    pthread_t thread[n];
    thread_arg num[n];
    
    for (int i=0; i<=n, end<=targ1.kol; i++, start+=step, end+=step)
    { 
    
        num[i].id = i;  
        if (ost > 0)
        { 
            end++;
            num[i].end = end; // передаем конец части ряда 
            num[i].start = start; // передаем начало части ряда
            pthread_create(&thread[i], NULL, &thread_f, &num[i]);
            start++;
            ost--;
        }
        else
        {
            num[i].start = start; // передаем начало части ряда
            num[i].end = end; // передаем конец части ряда
            pthread_create(&thread[i], NULL, &thread_f, &num[i]);
        }
        sleep(1);
    }
    float totalSum = 0.0;
    
    for (int i=0; i<n; i++)
    {
        totalSum += num[i].sum;
    }
    
    for (int i=0; i<n; i++)
    {
        pthread_join(thread[i],NULL);
 
    }
    cout << "summa "<< totalSum << endl; 
return 0;
}
Помогите пожалуйста разобраться, где я ошибся?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.10.2011, 02:08
Работа с обсчетом членов ряда потоками
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.10.2011, 02:08
Помогаю со студенческими работами здесь

Выполнить суммирование членов бесконечного ряда по точности та по колическву членов ряда
Выполнить суммирование членов бесконечного ряда по точности та по колическву членов ряда

Найти сумму четных членов ряда, и произведение нечетных членов ряда
Почему не работает,кто объяснит? Ввести массив А(N) из членов ряда А(i) = i ^ (1 / 3) Число элементов ограничены по условию А(I)...

Найти сумму четных членов ряда и произведение нечетных членов ряда
Пожалуйста, помогите. Задача такая:ввести массив A(N) из члена ряда A(I)=I^(1/3).Число элементов ограничены по условию A(I)&lt;=M,где...

Подсчитать сумму членов ряда и сумме первых 10 членов ряда
Для ряда, члены которого вычисляются по формуле(ниже формула). Подсчитать сумму членов ряда с точностью до 0.000001 и сумму первых 10...

Подсчитать сумму членов ряда с точностью до 0.000001 и сумму первых 10 членов ряда
Добавлено через 10 часов 32 минуты Для ряда, члены которого вычисляются по формуле, соответствующей Вашему индивидуальному заданию,...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru