Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
igor_man
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 12
#1

Все элементы, кроме первого, заменить средним арифметическим всех предыдущих - C++

27.09.2012, 01:51. Просмотров 1131. Ответов 15
Метки нет (Все метки)

Все элементы, кроме первого, заменить средним арифметическим всех предыдущих.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2012, 01:51     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих
Посмотрите здесь:

C++ Заменить в массиве все отрицательные элементы средним арифметическим значением всех положительных, вывести оба массива
Заменить все элементы с отрицательными значениями средним арифметическим значением всех положительных элементов. C++
В массиве B(n) каждый элемент,кроме первого, заменить суммой всех предедущих элементов C++
C++ Первый элемент каждого четного столбца заменить средним арифметическим
Заменить все нули средним арифметическим. C++
Заменить все элементы с отрицательными значениями средним арифметическим значением всех положительных элементов C++
C++ В массиве каждый элемент, равный нулю, заменить средним арифметическим всех элементов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ProNoooob
72 / 72 / 6
Регистрация: 14.10.2009
Сообщений: 121
27.09.2012, 03:54     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #2
Простейшая задача.
Вот код. Написал за минуту.

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
#include <windows.h>
#include <iostream>
 
// вычисляет среднее арифмитическое последнего элемента
template <typename I, typename T>
void hip(I b, I e, T sum, int count)
{
    b != e ? hip<I, T>(b + 1, e, sum + *b, ++count) : *e = (sum + *b) / count;
}
 
// проходит по массивчику задом наперед
template <typename I, typename T>
void hop(I begin, I end)
{
    if(end - begin) (hip<I, T>(begin, end, 0, 1), hop<I, T>(begin, end - 1));
}
 
// печатает результат
template <typename I>
void print_array(I begin, I end)
{
    while(begin < end) std::cout << *begin++ << ' ';
}
 
int main()
{
    double m[5] = {1, 2, 3, 4, 5};
 
    print_array(m, m + 5); std::cout << std::endl;
 
    hop<double *, double>(m, m + 4);
 
    print_array(m, m + 5); std::cout << std::endl;
 
    system("pause");
    return 0;
}
Байт
Эксперт C
15536 / 9878 / 1484
Регистрация: 24.12.2010
Сообщений: 18,475
27.09.2012, 11:02     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C
1
2
3
4
5
for(i=n-2, s=0; i>=0; i--) s+= m[i];
for(i=n-1; i>=1; i--) {
  m[i] = s/i;
  s -= m[i-1];
}
main, объявление переменных, ввод-вывод добавь сам
Avadd
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 17
27.09.2012, 12:35     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #4
если использовать результат отт предыдущей итерации, то все элементы массива станут равными первому
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.09.2012, 12:40     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #5
Цитата Сообщение от igor_man Посмотреть сообщение
Все элементы, кроме первого, заменить средним арифметическим всех предыдущих.
Второй станет равен первому, так как предыдущий у него один, а когда элемент один, то среднее арифметическое одного элемента равно ему самому. Далее третий тоже станет равен первому, так как первые два равны, а предыдущие - только они и при равенстве всех элементов их среднее арифметическое равно им самим. И так до последнего. Ну и смысл такой сложной формулировки? Можно же проще: "раскопировать первый элемент по всему массиву".

Добавлено через 1 минуту
C++
1
2
3
4
for (i=1; i<n; ++i)
{
 a[i]=a[0];
}
Thinker
Эксперт C++
4220 / 2194 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 12:43     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #6
taras atavin, имеется ввиду другое. поэтому для корректной работы алгоритм от Байт самое то
Байт
Эксперт C
15536 / 9878 / 1484
Регистрация: 24.12.2010
Сообщений: 18,475
27.09.2012, 12:53     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #7
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#define N 5
main()
{ double m[N] = { 1,2,3,4,5 }, s; int i;
 
  for(i=N-2, s=0; i>=0; i--) s+= m[i];
  for(i=N-1; i>=1; i--) {
    m[i] = s/i;
    s -= m[i-1];
  }
  for(i=0; i<N; i++) printf("i=%d m=%f\n", i, m[i]);
}
Результат
Код
 i=0 m=1.000000
i=1 m=1.000000
i=2 m=1.500000
i=3 m=2.000000
i=4 m=2.500000
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.09.2012, 13:43     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #8
Цитата Сообщение от Thinker Посмотреть сообщение
taras atavin, имеется ввиду другое.
определение арифметического среднего достаточно чётко. Или вы из другой галактики?
Thinker
Эксперт C++
4220 / 2194 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 14:46     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #9
Цитата Сообщение от taras atavin Посмотреть сообщение
определение арифметического среднего достаточно чётко. Или вы из другой галактики?
странно, что вы не понимаете условие. Одно дела, когда необходимо найти средние арифметические исходного массива, а другое - модифицированного. Наверняка имеется ввиду первое, так как для второго необходимо дополнительное условие в задаче.
ProNoooob
72 / 72 / 6
Регистрация: 14.10.2009
Сообщений: 121
27.09.2012, 15:58     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #10
Цитата Сообщение от Байт Посмотреть сообщение
C
1
double m[N] = { 1,2,3,4,5 };
Результат
Код
 i=0 m=1.000000
i=1 m=1.000000
i=2 m=1.500000
i=3 m=2.000000
i=4 m=2.500000
Ваш код не верен. Подсчитайте сами.
0 + 1 + 2 + 3 = 6
6 / 4 != 2

В задании явно сказано, что вычислить надо среднее арифметическое от всех предыдущих.
Avadd
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 17
27.09.2012, 16:02     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #11
где ты элемент с значением 0 нашел?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.09.2012, 16:10     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #12
Цитата Сообщение от Thinker Посмотреть сообщение
странно, что вы не понимаете условие. Одно дела, когда необходимо найти средние арифметические исходного массива, а другое - модифицированного. Наверняка имеется ввиду первое, так как для второго необходимо дополнительное условие в задаче.
То есть скользящее среднее с растущим окном?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void f(double *Data, size_t n)
{
 double *p1, *p2;
 double s;
 for (p1=Data+n-1; p1>Data; --p1)
 {
  for (p2=p1-1, s=0.0; p2>=Data; --p2)
  {
   s+=*p2;
  }
  *p1=s/(p1-Data);
 }
}
Добавлено через 1 минуту
Цитата Сообщение от ProNoooob Посмотреть сообщение
6 / 4 != 2
На 3, а не 4.
ProNoooob
72 / 72 / 6
Регистрация: 14.10.2009
Сообщений: 121
27.09.2012, 16:23     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #13
Цитата Сообщение от Avadd Посмотреть сообщение
где ты элемент с значением 0 нашел?
Цитата Сообщение от taras atavin Посмотреть сообщение
На 3, а не 4.
Точно напутал.
Но решение все-равно не верное.
Например последний элемент должен равняться 3, а не 2.5
Байт
Эксперт C
15536 / 9878 / 1484
Регистрация: 24.12.2010
Сообщений: 18,475
27.09.2012, 17:34     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #14
ProNoooob, Спорить не буду. Оставляю вас на растерзание другим участникам этого прелюбопытнейшего топика.

Добавлено через 2 минуты
Цитата Сообщение от ProNoooob Посмотреть сообщение
Например последний элемент должен равняться 3, а не 2.5
1+2+3+4/4 = 10/4= ?
ProNoooob
72 / 72 / 6
Регистрация: 14.10.2009
Сообщений: 121
27.09.2012, 17:48     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #15
Цитата Сообщение от Байт Посмотреть сообщение
Спорить не буду.
Точно, вы правы. Нам же нужно считать среднее арифметическое от всех ПРЕДЫДУЩИХ элементов.
Вот исправленный вариант.

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
#include <windows.h>
#include <iostream>
 
// вычисляет среднее арифметическое последнего элемента
template <typename I, typename T>
void hip(I b, I e, T sum, int count)
{
    b != e ? hip<I, T>(b + 1, e, sum + *b, ++count) : *e = sum / count;
}
 
// проходит по массивчику задом наперед
template <typename I, typename T>
void hop(I begin, I end)
{
    if(end - begin) (hip<I, T>(begin, end, 0, 0), hop<I, T>(begin, end - 1));
}
 
// печатает результат
template <typename I>
void print(I begin, I end)
{
    if(begin < end) print((std::cout << *begin++ << ' ', begin), end);
}
 
int main()
{
    double m[5] = {1, 2, 3, 4, 5};
 
    print(m, m + 5); std::cout << std::endl;
 
    hop<double *, double>(m, m + 4);
 
    print(m, m + 5); std::cout << std::endl;
 
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2012, 18:06     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих
Еще ссылки по теме:

все элементы в массиве, кроме 1, нужно заменить суммой предыдущих элементов C++
C++ Заменить нечетные элементы вектора Т средним арифметическим элементов, которые делятся на 5 с остатком 3
В массиве A (n) каждый элемент, кроме первого заменить суммой всех предыдущих элементов C++
Нулевые элементы массива заменить средним арифметическим всех элементов C++
Каждый элемент массива, кроме первого, заменить суммой всех его предыдущих элементов C++

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

Или воспользуйтесь поиском по форуму:
Байт
Эксперт C
15536 / 9878 / 1484
Регистрация: 24.12.2010
Сообщений: 18,475
27.09.2012, 18:06     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих #16
Цитата Сообщение от ProNoooob Посмотреть сообщение
Точно, вы правы.
Ну слава Богу!
Yandex
Объявления
27.09.2012, 18:06     Все элементы, кроме первого, заменить средним арифметическим всех предыдущих
Ответ Создать тему
Опции темы

Текущее время: 04:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru