Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2011, 21:07   #1
Я спрошу?
 
Аватар для Я спрошу?
 
Регистрация: 02.12.2011
Сообщений: 7
По умолчанию Потоки. Распараллеливание вычислений.

Здравствуйте.

Есть программа, которая перебирает все варианты размена суммы денег монетами. Подпрограмма реализуется с помощью рекурсии:

Код:

#include <iostream>
#include <string.h>
#include <sstream>

using namespace std;

int totalMoney; // Значение размениваемой суммы
int numberMoney; // Количество купюр
string s = "";

int Banknotes[9] = { 5000, 1000, 500, 100, 50, 10, 5, 2, 1 };
int massBank [1000];

int exchange(int totalMoney, int pos, int lastBanknotes)
{

	if(totalMoney == 0)
	{
		
		for(int i = 0; i < pos; i++)
		{
			cout<<massBank[i]<<' ';
		}

		cout<<endl;
		return 0;
	}
	
	for(int i = 0; i < 9; i++)
	{
		if(totalMoney - Banknotes[i] >= 0)
		{
			massBank[pos] = Banknotes[i];

			exchange(totalMoney - Banknotes[i], pos + 1 );
		}
	}
	
}	
	
int main()
{
	setlocale(0, "rus");
	cout<<"Введите значение размениваемой суммы:"<<endl;
	cin>>totalMoney;
	exchange(totalMoney, 0);
	return 0;
}
Необходимо распараллелить подпрограмму, т.е. избавиться от рекурсии.
Есть наработки быдло-кода (естественно не рабочего):
Код:
#include <iostream>
#include <string.h>
#include <sstream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define n 2000

using namespace std;

struct argThreads // Параметры функции
{
	int totalMoney, next;
};


int Banknotes[9] = { 5000, 1000, 500, 100, 50, 10, 5, 2, 1 };
int massBank [1000];
DWORD WINAPI exchange(void * param)
{
	int pos = ((argThreads*)param)->next;
	int totalMoney = ((argThreads*)param)->totalMoney;
	HANDLE hndThreads[n];
	argThreads paramForThread[n + 1];
	int threadNumber = 0;
	
	if(totalMoney == 0)
	{
		for(int i = 0; i < pos; i++)
		{
			cout<<massBank[i]<<' ';
		}

		cout<<endl;
		return 0;
	}
	
	for(int i = 0; i < 9; i++)
	{
		if(totalMoney - Banknotes[i] >= 0)
		{
			massBank[pos] = Banknotes[i];
			paramForThread[threadNumber].totalMoney = totalMoney - Banknotes[i]; 
			paramForThread[threadNumber].next = pos + 1;
			hndThreads[threadNumber] = CreateThread(0,0,exchange, (&(paramForThread[threadNumber])),0,0);
			threadNumber++;
		}
	}
	for (int i = 0; i < threadNumber; i++)
		WaitForSingleObject(hndThreads[i],INFINITE);
}	
	
int main()
{
	setlocale(0, "rus");
	cout<<"Введите значение размениваемой суммы:"<<endl;
	argThreads firstParam;
	cin>>firstParam.totalMoney;
	firstParam.next = 0;
	exchange(&firstParam);
	getch();
	return 0;
}
Подскажите как это, конкретно для данного примера, вообще реализовать можно?
Я спрошу? вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распараллеливание выражений на fortran H1ghlander Фриланс 2 16.10.2011 10:39
Точность вычислений aly-lucenko Фриланс 1 02.05.2011 21:38
Параллельные вычислений Иллидан Общие вопросы C/C++ 1 22.11.2010 13:07
Распараллеливание процессов Zooleen Общие вопросы C/C++ 0 16.06.2010 16:59
Распараллеливание потока eXa Общие вопросы Delphi 3 19.07.2007 20:11