Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
2 / 2 / 0
Регистрация: 12.12.2013
Сообщений: 83
1

Алгоритм, который находит и выводит среднее арифметическое всех элементов массива, имеющих нечётное значение

06.05.2014, 15:18. Показов 4557. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дан целочисленный массив из 30 элементов. Элементы массива могут принимать значения от 0 до 1000. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит среднее арифметическое всех элементов массива, имеющих нечётное значение.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2014, 15:18
Ответы с готовыми решениями:

Посчитать среднее арифметическое значение всех отрицательное элементов массива
Разработать алгоритм который дозволяэ в одномерном масивидийсних числе длиной N посчитать среднее...

Массивы. Среднее арифметическое всех элементов массива, имеющих нечётное значение
Дан целочисленный массив из 30 элементов. Элементы массива могут принимать значения от 0 до 1000....

Найти среднее арифметическое всех элементов массива, имеющих нечётное значение
2) Дан целочисленный массив из 30 элементов. Элементы массива могут принимать значения от 0 до...

Найдите среднее арифметическое элементов матрицы, имеющих нечётное значение
Тема: Двумерные числовые массивы. Указание: Заполните двумерный числовой массив B(9,9) случайными...

38
_Ivana
05.01.2015, 17:21     Алгоритм, который находит и выводит среднее арифметическое всех элементов массива, имеющих нечётное значение
  #21

Не по теме:

Average() это конечно сильно.

0
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
05.01.2015, 17:31 22
Ну если генерировать массив колбэком, то, например, так:
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#coding: utf-8
 
sum = 0
count = 0
rnd = Random.new
 
Array.new(30) {
  rnd.rand(50)
}.reject { |item|
  item.even?
}.each { |item|
  sum += item
  count += 1
}
 
print "Среднее = #{sum.to_f / count}\n"
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.01.2015, 00:32 23
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
#include <iostream>
#include <random>
 
int main()
{
    const int N = 30;
    int A[N], numberOfOddVars = 0, sumOfOddVars = 0;
    std::mt19937 gen { std::random_device()() };
    std::uniform_int_distribution<> dist(0, 1000);
 
    for (auto &x : A)
    {
        x = dist(gen);
        std::cout << x << " ";
        const bool isOdd = x & 1;
        if (isOdd)
        {
            sumOfOddVars += x;
            numberOfOddVars++;
        }
    }
    std::cout << "\n";
 
    if (numberOfOddVars != 0)
        std::cout << "Average of odd vars: " << static_cast<double>(sumOfOddVars) / numberOfOddVars;
    else
        std::cout << "No odd vars";
}
Добавлено через 2 минуты
Цитата Сообщение от ildwine Посмотреть сообщение
C++
1
2
// заполнение массива сличайными числами от 0 до 1000
for (int i = 0; i < 30; i++) array[i] = rand() % 1000 + 1;
Приоритет % выше приоритета сложения. Будет считать сначала СЧ от 0 до 999, а потом добавлять 1. Получается от 1 до 1000.

Добавлено через 2 минуты
Цитата Сообщение от Новичок Посмотреть сообщение
Не то что код _Ivana.
Не всем можно такой сахар, у некоторых диабет)

Мне нравится. Коротко и по делу. Меньше букв - меньше ошибок.
1
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
06.01.2015, 00:58 24
Цитата Сообщение от MrGluck Посмотреть сообщение
Меньше букв - меньше ошибок.
Всегда?!
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
06.01.2015, 01:38 25
FraidZZ, можно еще так, например
Ruby
1
2
arr = (0..1000).to_a.shuffle.take(30).select{|x| x.odd?}
puts arr.inject(:+).to_f / arr.size
На лиспе можно так (наверняка есть лучше, давно не использовал данный ЯП)
Lisp
1
2
(setf arr (loop for n from 0 to 29 collect (random 1001)))
(format t "~,5f" (/ (apply #'+ (remove-if #'evenp arr)) (count-if #'oddp arr)))
2
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
06.01.2015, 01:54 26
MrGluck, честно говоря, ожидал от вас пары строчек с мультисет-контейнерами, мапированием и еще чем-нибудь эдаким, как вы умеете Очень нужен пример программы в Си++
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
06.01.2015, 17:35 27
_Ivana, нечто заумное, но бесполезное?) Такое не сойдет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <algorithm>
#include <iterator>
 
int main(int argc, char *argv[])
{
    const int N = 30;
    int A[N];
    std::mt19937 gen { std::random_device()() };
    std::uniform_int_distribution<> dist(0, 1000);
 
    std::generate(std::begin(A), std::end(A), [&]{ return dist(gen); });
 
    std::copy(std::begin(A), std::end(A), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    std::cout << std::endl << 
        std::accumulate(std::begin(A), std::end(A), 0., [](int res, int x){return x % 2 ? x + res : res;}) /
        std::count_if(std::begin(A), std::end(A), [](int x) { return x % 2; })
     << std::endl;
}
если заюзать константу "по полной", можно чуть укоротить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <algorithm>
#include <iterator>
 
int main(int argc, char *argv[])
{
    const int N = 30;
    int A[N];
    std::mt19937 gen { std::random_device()() };
    std::uniform_int_distribution<> dist(0, 1000);
 
    std::generate(A, A + N, [&]{ return dist(gen); });
 
    std::copy(A, A + N, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    std::cout << std::endl << 
        std::accumulate(A, A + N, 0., [](int res, int x){return x % 2 ? x + res : res;}) /
        std::count_if(A, A + N, [](int x) { return x % 2; })
     << std::endl;
}
1
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
06.01.2015, 17:36 28
KOPOJI, во-во, что-то наподобие У нас же тут конкурс на самое интересное решение простейшей задачи!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
06.01.2015, 18:22 29
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <algorithm>
#include <numeric>
 
bool isOdd(int n) {
    return n & 1;
}
 
int addIfOdd(int a, int b) {
    return a + ( ( isOdd(b) ) ? b : 0 );
}
 
int main() {
    const int COUNT = 5;
    int array[COUNT] = { 1, 2, 3, 4, 5 };
    
    std::cout << "Odd elements mean: " << ( std::accumulate(array, array + COUNT, 0, addIfOdd) / (double)std::count_if(array, array + COUNT, isOdd) ) << std::endl;
    
    return 0;
}
1
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
07.01.2015, 13:41 30
Цитата Сообщение от Ashmotev Посмотреть сообщение
Можно на VB.NET
VB.NET
1
2
3
4
5
6
7
Module All
  Public Sub Main()
    Dim Rand As New Random()
    Console.WriteLine(Enumerable.Range(0, 30).Select(Function(I) Rand.Next(1001)).Where(Function(X) X And 1).Average())
    Console.ReadKey()
  End Sub
End Module
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.01.2015, 14:25 31
_Ivana, я вначале так и сделал, но потом понял что любое решение, требующее более одного цикла - убого и будет строиться лишь на понтах. В итоге 2 из 3 вариантов потёр и оставил лишь самый простой.

У меня правда для счётчика использовался "захват" переменной извне. Но такой вариант требует if-else, а хотелось бы хотя бы на тернарке

Добавлено через 2 минуты
Мне кстати вариант easybudda с побитовым и больше нравится) Я его и использовал, правда вот так:
C++
1
a + (b & 1) * b;
Добавлено через 1 минуту
KOPOJI, хедеры кстати потёр. Нужен numeric и random.

Добавлено через 2 минуты
Да, ещё смутило потенциальное деление на ноль.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
12.01.2015, 14:43 32
Цитата Сообщение от MrGluck Посмотреть сообщение
хедеры кстати потёр. Нужен numeric и random.
У меня не нужны gcc 4.8.1, ubuntu
Алгоритм, который находит и выводит среднее арифметическое всех элементов массива, имеющих нечётное значение


Цитата Сообщение от MrGluck Посмотреть сообщение
Да, ещё смутило потенциальное деление на ноль.
эмм.. Это где? Там же не % x, а % 2 везде.. А, да, понял, count_if..
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.01.2015, 14:55 33
Цитата Сообщение от KOPOJI Посмотреть сообщение
У меня не нужны gcc 4.8.1, ubuntu
Тем не менее, ничто не гарантирует что в другой версии компилятора (разумеется с поддержкой фич С++11) данный код заработает. accumulate определена в numeric, ГСЧ и распределения в random.

Добавлено через 1 минуту

Не по теме:

И всё-таки коподжи :D

0
KOPOJI
12.01.2015, 14:59
  #34

Не по теме:

а нефиг запускать код в другой версии компилятора :D

0
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
12.01.2015, 18:19 35
MrGluck, у меня тоже с битами, и тоже без проверки на 0 элементов...
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
13.01.2015, 01:04 36
Цитата Сообщение от MrGluck Посмотреть сообщение
_Ivana, я вначале так и сделал, но потом понял что любое решение, требующее более одного цикла - убого и будет строиться лишь на понтах. В итоге 2 из 3 вариантов потёр и оставил лишь самый простой.
Ну а что еще кроме понтов в такой теме может быть интересного? У меня в половине моих однострочников массив по 3 раза пробегается - фильтрация нечетных а потом сумма и количество элементов, хотя конечно могу и за один пробег сахаром написать. Хотел через моноид извратиться, но операция суммирования нечетных не моноидальна, хотя я знаю как протащить эту формально не удовлетворяющую условиям операцию через моноид.
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
14.01.2015, 17:38 37
На Python вроде бы не было...
Python
1
2
3
4
5
from random import randint
 
arr = [randint(0, 1000) for x in range(30)]
avg = sum([x for x in arr if x % 2 != 0]) / 30.0
print(avg)
0
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
15.01.2015, 08:31 38
Совершенно необязательно создавать списки, можно использовать генераторы.

Python
from random import randint
n = 30
print(sum(x for x in (randint(0, 1000) for _ in xrange(n)) if x % 2 == 0) / float(n))
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
15.01.2015, 14:00 39
tezaurismosis, Vtulhu, надо посчитать среднее арифмитическое элементов, имеющих нечётное значение, а не отношение их суммы к общему количеству элементов. В знаменателе тоже нужно отсев делать.
2
15.01.2015, 14:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2015, 14:00
Помогаю со студенческими работами здесь

Подсчитать среднее арифметическое элементов массива. имеющее нечётное значение
Дан массив из 30 элементов.Элементы принимают значения от 0 до 1000.Как подсчитать среднее...

Алгоритм поиска количества элементов одномерного массива больших, чем среднее арифметическое значение всех
7. Алгоритм поиска количества элементов одномерного мас- сива больших, чем среднее арифметическое...

Найти среднее арифметическое всех элементов массива х и номера элементов, имеющих минимальное и максимальное значения
Сгенерировать массив из 18 элементов случайных чисел от 0 до 100. Вывести массив на экран в три...

Найти среднее арифметическое элементов массива, имеющих нечетное значение
Дан массив А(25) на промежутке -20, 10. Найти среднее арифметическое элементов, имеющих несет ное...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru