Найти Реднеарифметическое Двух Элементов Равное Х

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Avicii
Сообщения: 5
Зарегистрирован: 21 дек 2012, 15:06

Здравствуйте,помогите с программой. Задание: В массиве найти два члена,среднее арифметическое которых ближе всего к Х.
Есть программа,но она ищет только 1 пару таких чисел, а надо все возможные

Код: Выделить всё

#include <iostream>
#include <cmath>
int main()
{
   const unsigned n = 10;
   float X = 5.45;
   int A[n] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
   unsigned first = 0;
   unsigned second = 1;
   float diff = std::abs(((A[first] + A[second]) / 2) - X);
   for (unsigned i = 0; i < n-1; ++i)
   {
      for (unsigned j = i+1; j < n; ++j)
      {
         float calc = std::abs(((A[i] + A[j]) / 2) - X);
         if (calc < diff)
         {
            diff = calc;
            first = i;
            second = j;
         }
      }
   }
   std::cout << "A[" << first << "] = " << A[first] << std::endl;
   std::cout << "A[" << second << "] = " << A[second] << std::endl;
   std::cout << "average = " << ((A[first] + A[second]) / 2) << std::endl;
   return 0;
}
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Чтобы выводило всё, нужно операцию вывода перенести в цикл.
Avicii
Сообщения: 5
Зарегистрирован: 21 дек 2012, 15:06

Пробовал, в итоге просто пишет один и тот же итог несколько раз.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Avicii писал(а):Пробовал, в итоге просто пишет один и тот же итог несколько раз.

Код: Выделить всё

if (calc < diff)
         {
            diff = calc;
            first = i;
            second = j;
          // Сюда ставил?
         }
Avicii
Сообщения: 5
Зарегистрирован: 21 дек 2012, 15:06

Ставил,в итоге :
А[0] = 1
A[2] = 3
average = 2
А[0] = 1
А[4] = 5
average = 3
А[0] = 1
А[6] = 7
average = 4
А[0] = 1
А[8] = 9

Не то что нужно...
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Вывод среднего арифметического

Код: Выделить всё

std::cout << "average = " << (A[first] + A[first]) / 2.0f << std::endl;
а так как у вас, будет отображаться целое. Над алгоритмом тоже нужно поработать - если требуются все пары, тогда наверное нужно хранить где-то промежуточные результаты в виде индексов исходного массива, а для "наиболее близкого" значения нужно 2 переменных, одна из которых будет содержать ближайшее(минимальное) большее, а другая - ближайшее(максимальное) меньшее. Как-то так.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Всё верно. По той причине, что определить самое близкое число к указанному можно только проверив все комбинации, следует хранить, скажем, std::vector<std: :p air<int, int>> - вектор пар индексов, среднее арифметическое из которых ближе всего, а так же сама это ближайшее среднее. В цикле проверки пары:

- Если текущее среднее ближе, чем предыдущее найденное ближайшее среднее, то обновляем переменную, хранящую ближайшее среднее новым значением, чистим вектор и заносим найденную пару индексов в него.
- Если текущее среднее такое же, как найденное ранее ближайшее среднее, то просто добавляем пару индексов в вектор.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить