Консультация № 185848
17.04.2012, 18:03
79.00 руб.
0 7 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Написать систему из нескольких независимых процессов, совместно вычисляющих дисперсию выборки из трех чисел. Процессы или потоки должны
отображать на экране ход своего выполнения в виде отладочных сообщений. Система должны состоять из :
• главного процесса или потока , принимающего с клавиатуры исходные
данные и выводящего на экран результат;
• нескольких служебных процессов или потоков, способных по
отдельности выполнять элементарные арифметические действия - сложение,
вычитание, умножение , деление, вычисление квадратного корня и т. п.
При этом использовать способ синхронизации семафоры и способ
передачи данных между процессами или потоками - почтовые ячейки.

Обсуждение

Неизвестный
19.04.2012, 21:17
общий
скажите, хотя бы с чего начать?
Неизвестный
19.04.2012, 23:28
общий
Мм, а что такое дисперсия? Когда-то я, наверно, это знала)
Накидаю завтра скелет программы, а если Вы напомните, что такое дисперсия, то, может, и функционал. Полагаю, Win API?
Неизвестный
20.04.2012, 18:10
общий
Вот формула дисперсии
Прикрепленные файлы:
baf2eee6b2dae8d43a349180cb9d55c3.jpg
Неизвестный
22.04.2012, 21:42
общий
для чего нужен Ваш портал, если Вы все равно не помогаете...
Неизвестный
23.04.2012, 15:06
общий
Прошу прощения, но раньше не было времени.
Примерно так, наверно:
[code h=300]#include <Windows.h>
#include <math.h>
#include <iostream>
#include <WinError.h>
using namespace std;

HANDLE m_hSemaphore;

double Func (char c)
{
HANDLE Mailslot, ms1;
DWORD n;
double x, y, z;
char name [256];
sprintf (name, "\\\\.\\Mailslot\\slot%i", c);
ms1 = CreateFile( "\\\\.\\Mailslot\\slotres", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ((Mailslot = CreateMailslot(name, 0, MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE)
{
printf("Ошибка при создании ПЯ %d\n", GetLastError());
getchar();
return 0;
}
while (true) {
if (ReadFile(Mailslot, (LPVOID)&x, sizeof(x), &n, NULL)!= 0)
{
switch (c) {
case '+':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL);
z = x + y;
break;
case '-':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL);
z = x - y;
break;
case '*':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL);
z = x * y;
break;
case '/':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL);
if (y!=0) z = x / y;
else z = 0;
break;
case '2':
z = x * x;
break;
case '^':
if (x >= 0) z = sqrt(x);
else z = 0;
break;
}
if (WriteFile(ms1, (LPVOID)&z, sizeof(z), &n, NULL) == 0)
{
printf("Ошибка отправки %d\n", GetLastError());
} else {
printf ("Результат отправлен");
}
//ReleaseSemaphore (m_hSemaphore, 1, NULL);
}
}

}

DWORD WINAPI AddThread(void *pParam)
{
Func ('+');
return 0;
}

DWORD WINAPI MinusThread(void *pParam)
{
Func ('-');
return 0;
}

DWORD WINAPI MultThread(void *pParam)
{
Func ('*');
return 0;
}

DWORD WINAPI DivThread(void *pParam)
{
Func ('/');
return 0;
}

DWORD WINAPI SqrThread(void *pParam)
{
Func ('2');
return 0;
}

DWORD WINAPI SqrtThread(void *pParam)
{
Func ('^');
return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
setlocale (LC_ALL, "russian");
DWORD dwID;
HANDLE ms1, ms2, ms3, ms4, ms5, ms6, res;
if ((res = CreateMailslot("\\\\.\\Mailslot\\slotres", 0, MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE)
{
printf("Ошибка при создании ПЯ %d\n", GetLastError());
getchar();
return 0;
}
CloseHandle (CreateThread(NULL, 0, AddThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, MinusThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, MultThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, DivThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, SqrThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, SqrtThread, NULL, 0, &dwID)); //Создаём поток
cout << "Введите числа: ";
double x[3], t, t1, s = 3;
cin >> x[0] >> x[1] >> x[2];
m_hSemaphore = CreateSemaphore (NULL, 1, 1, NULL);; //Описатель семафора
DWORD n;
char name [256];
sprintf (name, "\\\\.\\Mailslot\\slot%i", '+');
if ((ms1 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))==INVALID_HANDLE_VALUE)
{
printf("Ошибка открытия слота %d\n", GetLastError());
getchar();
return 0;
}
//WaitForSingleObject (m_hSemaphore, INFINITE);
if (WriteFile(ms1, (LPVOID)&x[0], sizeof(double), &n, NULL) == 0 || WriteFile(ms1, (LPVOID)&x[1], sizeof(double), &n, NULL) == 0)
{
printf("Ошибка отправки %d\n", GetLastError());
getchar ();
return 0;
}
//WaitForSingleObject (m_hSemaphore, INFINITE);
if (ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL) != 0) {
if (WriteFile(ms1, (LPVOID)&t, sizeof(t), &n, NULL) == 0 || WriteFile(ms1, (LPVOID)&x[2], sizeof(double), &n, NULL) == 0)
{
printf("Ошибка отправки %d\n", GetLastError());
getchar ();
return 0;
}
}
//WaitForSingleObject (m_hSemaphore, INFINITE);
ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL);
sprintf (name, "\\\\.\\Mailslot\\slot%i", '/');
ms2 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(ms2, (LPVOID)&t, sizeof(t), &n, NULL);
WriteFile(ms2, (LPVOID)&s, sizeof(s), &n, NULL);
//WaitForSingleObject (m_hSemaphore, INFINITE);
ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL);
sprintf (name, "\\\\.\\Mailslot\\slot%i", '-');
ms3 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
sprintf (name, "\\\\.\\Mailslot\\slot%i", '2');
ms4 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
double sm = 0;
for (int i=0; i<s; i++)
{

WriteFile(ms3, (LPVOID)&t, sizeof(t), &n, NULL);
WriteFile(ms3, (LPVOID)&x[i], sizeof(double), &n, NULL);
//WaitForSingleObject (m_hSemaphore, INFINITE);
ReadFile(res, (LPVOID)&t1, sizeof(t1), &n, NULL);
WriteFile(ms4, (LPVOID)&t1, sizeof(t1), &n, NULL);
//WaitForSingleObject (m_hSemaphore, INFINITE);
ReadFile(res, (LPVOID)&t1, sizeof(t1), &n, NULL);
sm+=t1;
}
WriteFile(ms2, (LPVOID)&sm, sizeof(sm), &n, NULL);
WriteFile(ms2, (LPVOID)&s, sizeof(s), &n, NULL);
//WaitForSingleObject (m_hSemaphore, INFINITE);
ReadFile(res, (LPVOID)&t1, sizeof(t1), &n, NULL);
cout << "Дисперсия: " << t1;
sprintf (name, "\\\\.\\Mailslot\\slot%i", '^');
ms5 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(ms5, (LPVOID)&t1, sizeof(t1), &n, NULL);
//WaitForSingleObject (m_hSemaphore, INFINITE);
ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL);
cout << "Корень: " << t;
getchar ();
return 0;
}[/code]
Неизвестный
23.04.2012, 17:29
общий
это ответ
Здравствуйте, Плутон!
Один из вариантов - в приложении. Используются функции Win API. Собственно, там особо ничего сложного нет: для каждого потока создаётся его личный ящик для данных, а главный поток создаёт ящик для результатов и запускает все остальные потоки.
Проверялось на Visual Studio, вроде всё нормально считает. Если что-то не так поняла, или упустила, или есть ещё какие-то вопросы - в мини-форум.
Несколько ссылок о почтовых ящиках: Википедия, MSDN.
Удачи!

Приложение:
#include <Windows.h>
#include <math.h>
#include <iostream>
#include <WinError.h>
using namespace std;


double Func (char c) //функция для арифметических действий
{
HANDLE Mailslot, ms1;
DWORD n;
double x, y, z;
char name [256];
sprintf (name, "\\\\.\\Mailslot\\slot%i", c);
ms1 = CreateFile( "\\\\.\\Mailslot\\slotres", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //открываем ящик для результата
if ((Mailslot = CreateMailslot(name, 0, MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE) //создаём ящик для операндов
{
printf("Ошибка при создании ПЯ %d\n", GetLastError());
getchar();
return 0;
}
while (true) {
if (ReadFile(Mailslot, (LPVOID)&x, sizeof(x), &n, NULL)!= 0) //получаем первый операнд
{
switch (c) { //выбираем операцию
case '+':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL); //при бинарной - читаем второй операнд
z = x + y;
break;
case '-':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL);
z = x - y;
break;
case '*':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL);
z = x * y;
break;
case '/':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL);
if (y!=0) z = x / y;
else z = 0;
break;
case '2':
z = x * x;
break;
case '^':
if (x >= 0) z = sqrt(x);
else z = 0;
break;
}
if (WriteFile(ms1, (LPVOID)&z, sizeof(z), &n, NULL) == 0) //пишем результат
{
printf("Ошибка отправки %d\n", GetLastError());
} else {
printf ("Результат отправлен");
}
}
}

}

DWORD WINAPI AddThread(void *pParam) //поток сложение
{
Func ('+');
return 0;
}

DWORD WINAPI MinusThread(void *pParam) //поток вычитание
{
Func ('-');
return 0;
}

DWORD WINAPI MultThread(void *pParam) //поток умножение
{
Func ('*');
return 0;
}

DWORD WINAPI DivThread(void *pParam) //поток деление
{
Func ('/');
return 0;
}

DWORD WINAPI SqrThread(void *pParam) //поток квадрат
{
Func ('2');
return 0;
}

DWORD WINAPI SqrtThread(void *pParam) //поток корень
{
Func ('^');
return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
setlocale (LC_ALL, "russian");
DWORD dwID;
HANDLE ms1, ms2, ms3, ms4, ms5, ms6, res;
if ((res = CreateMailslot("\\\\.\\Mailslot\\slotres", 0, MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE) //создаём ящик для приёма результатов
{
printf("Ошибка при создании ПЯ %d\n", GetLastError());
getchar();
return 0;
}
CloseHandle (CreateThread(NULL, 0, AddThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, MinusThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, MultThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, DivThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, SqrThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, SqrtThread, NULL, 0, &dwID)); //Создаём поток
cout << "Введите числа: ";
double x[3], t, t1, s = 3;
cin >> x[0] >> x[1] >> x[2];
DWORD n;
char name [256];
sprintf (name, "\\\\.\\Mailslot\\slot%i", '+');
if ((ms1 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))==INVALID_HANDLE_VALUE)
{
printf("Ошибка открытия слота %d\n", GetLastError());
getchar();
return 0;
}
if (WriteFile(ms1, (LPVOID)&x[0], sizeof(double), &n, NULL) == 0 || WriteFile(ms1, (LPVOID)&x[1], sizeof(double), &n, NULL) == 0)
{
printf("Ошибка отправки %d\n", GetLastError());
getchar ();
return 0;
}
if (ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL) != 0) {
if (WriteFile(ms1, (LPVOID)&t, sizeof(t), &n, NULL) == 0 || WriteFile(ms1, (LPVOID)&x[2], sizeof(double), &n, NULL) == 0)
{
printf("Ошибка отправки %d\n", GetLastError());
getchar ();
return 0;
}
}
ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL);
sprintf (name, "\\\\.\\Mailslot\\slot%i", '/');
ms2 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(ms2, (LPVOID)&t, sizeof(t), &n, NULL);
WriteFile(ms2, (LPVOID)&s, sizeof(s), &n, NULL);
ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL);
sprintf (name, "\\\\.\\Mailslot\\slot%i", '-');
ms3 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
sprintf (name, "\\\\.\\Mailslot\\slot%i", '2');
ms4 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
double sm = 0;
for (int i=0; i<s; i++)
{

WriteFile(ms3, (LPVOID)&t, sizeof(t), &n, NULL);
WriteFile(ms3, (LPVOID)&x[i], sizeof(double), &n, NULL);
ReadFile(res, (LPVOID)&t1, sizeof(t1), &n, NULL);
WriteFile(ms4, (LPVOID)&t1, sizeof(t1), &n, NULL);
ReadFile(res, (LPVOID)&t1, sizeof(t1), &n, NULL);
sm+=t1;
}
WriteFile(ms2, (LPVOID)&sm, sizeof(sm), &n, NULL);
WriteFile(ms2, (LPVOID)&s, sizeof(s), &n, NULL);
ReadFile(res, (LPVOID)&t1, sizeof(t1), &n, NULL);
cout << "Дисперсия: " << t1;
sprintf (name, "\\\\.\\Mailslot\\slot%i", '^');
ms5 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(ms5, (LPVOID)&t1, sizeof(t1), &n, NULL);
ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL);
cout << "Корень: " << t;
getchar ();
CloseHandle (ms1);
CloseHandle (ms2);
CloseHandle (ms3);
CloseHandle (ms4);
CloseHandle (ms5);
CloseHandle (res);
return 0;
}
Неизвестный
23.04.2012, 19:24
общий
спасибо большое
Форма ответа