@Risa345

Как написать формулу для вычисления среднего значения без минимального элемента?

Задание выглядит след образом : Составить программу для консольного процесса, который состоит из двух потоков: main и worker. Поток main должен выполнить следующие действия: • Создать массив целых чисел, размерность и элементы которого вводятся с консоли. • Создать поток worker. • Найти минимальный и максимальный элементы массива и вывести их на консоль. После каждого сравнения элементов «спать» 7 миллисекунд. • Дождаться завершения потока worker. • Подсчитать количество элементов в массиве, значение которых больше среднего значения элементов массива, и вывести его на консоль. • Завершить работу.
Поток worker должен выполнить следующие действия: • Найти среднее значение элементов массива. После каждого суммирования элементов «спать» 12 миллисекунд. • Завершить свою работу.

Оно реализовано, но есть еще одна подзадача, с которой я не могу справиться. А именно: Поток worker должен найти значение среднее значение элементов массива, исключая минимальный элемент.

как это реализовать, если минимальное значение ищется в int main, а среднее значение ищется в Worker?

Код программы:

#include <windows.h>
#include <iostream>
#include <locale.h>

using namespace std;

int n;
int *arr;
int min;

void Worker(LPVOID W)
{
float sum = 0;
float Srmin = 0; // переменная для сред.значения без минимального элемента
float SrZn; // переменная для ср. значения
int count = 0;
int max = 0;
int min;

for (int i = 0; i < n; i++)
{
sum=sum+arr[i];

{
Srmin = (sum-min)/n; ?????????????????
}
Sleep(12);
}

SrZn= sum/n;
for(int i=0; i<n; i++)
{
if(arr[i]>SrZn)
{
count++;
}
}
cout << "\nСреднее значение элементов без минимального =" << Srmin;
cout << "\nСреднее значение элементов массива =" << SrZn;
cout <<"\nКоличество элементов больше среднего =" << count;
}

int main()
{
setlocale(LC_ALL, "Russian");
HANDLE hThread;
DWORD IDThread;
int inc = 10;
int max = 0;
int min;
cout << "Введите размер масcива : ";
cin >> n;
cout << "Введите элементы массива: ";

int *tmp;
arr = new int[n];
tmp = arr;
for (int i = 0; i < n; i++, *tmp++)
{
cin >> *tmp;
}
cout << "Исходный массив: " << endl;
tmp = arr;

for (int i = 0; i < n; i++, *tmp++)
{
cout << *tmp << endl;
}
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Worker, 0, inc, &IDThread);
if (hThread == NULL)
return GetLastError();
cout << endl;

tmp = arr;
min = *tmp;
for (int i = 0; i < n; i++, *tmp++)
{
if (*tmp < min)
{
min = *tmp;
}
if (*tmp > max)
{
max = *tmp;
}
Sleep(7);
}


cout << "Минимальный элемент = " << min;
cout << "\nМаксимальный элемент = " << max;
// ждем, пока поток Add закончит работу
WaitForSingleObject(hThread, INFINITE);
// закрываем дескриптор потока Add
CloseHandle(hThread);
cout << endl;
}
  • Вопрос задан
  • 1113 просмотров
Пригласить эксперта
Ответы на вопрос 1
Либо находить минимальный элемент в потоке worker, либо передавать его в функцию Worker
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы