Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/133: Рейтинг темы: голосов - 133, средняя оценка - 4.66
2 / 2 / 0
Регистрация: 01.09.2010
Сообщений: 11
1

Написать шаблон функции для поиска среднего арифметического массива

02.09.2010, 16:15. Показов 27004. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написать шаблон функции для поиска среднего арифметического значений массива
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.09.2010, 16:15
Ответы с готовыми решениями:

Написать шаблон функции для поиска среднего арифметического значений массива
Кто знает как решить задачу на С++, при помощи шаблонов функций? Написать шаблон функции для...

Написать шаблон функции для поиска среднего арифметического значений массива
#include <iostream> #include <windows.h> using namespace std; template <typename T> int arifm(...

Шаблон функции для поиска среднего арифметического элементов двумерной матрицы
Как сделать шаблон функции для поиска среднего арифметического для двумерной матрицы для...

В программе написать функции: вставки элемента, поиска максимального элемента, определения среднего арифметического элементов массива
В целочисленном массиве Х(N) после каждого четного числа вставить максимальный элемент массива....

17
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
02.09.2010, 16:34 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
#include <iostream>
#include <iterator>
#include <vector>
 
template <typename Iterator>
double average(Iterator first, Iterator last)
{
    int n = 0;
    double sum = 0;
    
    while(first != last) { 
        sum += *first++;
        ++n;
    }
   
    return sum/n;
}
 
int main() 
{
   std::vector<int> v = { 1, 2, 3, 4 };    
   std::cout << average(v.begin(), v.end());
}
Шаблон функции.. кхех..
0
2 / 2 / 0
Регистрация: 01.09.2010
Сообщений: 11
02.09.2010, 16:52  [ТС] 3
Спасибо но при компиляции выдает вот что!
Error 1 error C2552: 'v' : non-aggregates cannot be initialized with initializer list c:\users\александр\documents\visual studio 2008\projects\3\3\3.cpp 21 3
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
02.09.2010, 17:12 4
Aleksandr1, компилятор у тебя не тот
Используй .push_back(...) или конструируй вектор на основе массива.
Или просто передай в шаблонную функцию указатели на первый элемент массива и на элемент за последним элементом массива
0
2 / 2 / 0
Регистрация: 01.09.2010
Сообщений: 11
02.09.2010, 17:20  [ТС] 5
Компилирую в Visual Studio 2008!
Если есть лучший вариант подскажите буду очень благодарен
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
02.09.2010, 17:25 6
Цитата Сообщение от Nameless One Посмотреть сообщение
компилятор у тебя не тот
Не надо вводить человека в заблуждение, текущий стандарт не поддерживает такую инициализацию. Так что c компилятором у него всё в порядке.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
02.09.2010, 17:30 7
Aleksandr1, вроде gcc свежий уже поддерживает такую инициализацию, а вот msvs еще нет. Точно не знаю.
Для тебя это не суть важно. Можешь заменить строку 21 на это:
C++
1
2
3
std::vector<int> v;
for(size_t i = 1; i < 5; ++i)
    v.push_back(i);
Или на вот это:
C++
1
2
3
const size_t size = 4;
int ivec[4] = {1, 2, 3, 4};
std::vector<int> v(ivec, ivec + size);
А можешь вообще заменить содержимое функции main:
C++
1
2
3
4
const size_t size = 4;
int ivec[4] = {1, 2, 3, 4};
// И никакие векторы здесь не нужны :)
std::cout << average(ivec, ivec + size);
rangerx, gcc и msvs уже поддерживают некоторые фичи нового стандарта. И где-то мне на форуме говорили, по-моему fasked, что gcc как раз-таки поддерживает конкретно эту функцию.
Но заранее извиняюсь, если не прав
0
2 / 2 / 0
Регистрация: 01.09.2010
Сообщений: 11
02.09.2010, 17:33  [ТС] 8
Подскажите пожалуйста как сделать правильно новичку
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
02.09.2010, 17:35 9
Aleksandr1, я тебе уже три варианта предложил. Что непонятно-то?
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
02.09.2010, 17:38 10
Вариант бзе векторов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
template <typename T>
double average(const T *MAS, const size_t SIZE)
{
    double sum=0;
    for (int i=0; i<SIZE; i++)
        sum+=MAS[i];
 
    return sum/SIZE;
}
int main (void)
{
    const int SIZE=10;
    int MAS[SIZE]={1,2,3,4,5,6,7,8,9,10};
 
    std::cout << "Average: " << average (MAS, SIZE);
    std::cout << std::endl;
 
    return 0;
}
1
2 / 2 / 0
Регистрация: 01.09.2010
Сообщений: 11
02.09.2010, 17:38  [ТС] 11
Всем большое спасибо за помощь!!!
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.09.2010, 20:36 12
В догонку. Вдруг пригодится.

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
#include <iostream>
#include <algorithm>
#include <vector>
 
template<class T>
class Average
{
public:
   Average():sum(0), num(0){}
   ~Average(){}
   void operator()(T elem)
   {
      sum+=elem;
      num++;
   }
   double Aver()
   {
      return sum/num;
   }
 
private:
   double sum;
   int num;
};
 
int main()
{
   std::vector<int> Vec;
   for(int i=1; i<=10; ++i)
      Vec.push_back(i);
   Average<int> Ob=std::for_each(Vec.begin(), Vec.end(), Average<int>());
   std::cout<< Ob.Aver() <<'\n';
   return 0;
}
1
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
02.09.2010, 21:50 13
И на добивку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <numeric>
#include <cstddef>
 
template<typename T>
double Average(const T* arr, std::size_t size) {
  return static_cast<double>(std::accumulate(arr, arr + size, 0)) / size;
}
 
int main() {
  int arr[] = { 1, 2, 3, 4, 5, 6 };
  std::cout << Average(arr, sizeof(arr) / sizeof(arr[0])) << std::endl;
  return 0;
}
1
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
02.09.2010, 22:13 14
Также очень интересный вариант решения с помощью boost::accumulators:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cstddef>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/mean.hpp>
 
template<typename T>
double Average(const T* arr, std::size_t size) {
  using namespace boost::accumulators;
 
  accumulator_set<T, stats<tag::mean>> acc;
  for (std::size_t i = 0; i < size; ++i)
    acc(arr[i]);
 
  return mean(acc);
}
 
int main() {
  int arr[] = { 1, 2, 3, 4, 5, 6 };
  std::cout << Average(arr, sizeof(arr) / sizeof(arr[0])) << std::endl;
  return 0;
}
1
18 / 18 / 5
Регистрация: 18.01.2013
Сообщений: 17
31.01.2013, 00:52 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
#include <iostream>
using namespace std;
 
template <typename T> double srednee (T A[], int size)
{
    double sr=0;
    for (int i=0; i<size; i++)
    {
        sr+=A[i];
    }
 
    cout <<"Среднее арифметическое значение массива: " <<sr/size <<endl;
    
    return sr/size;
}
 
void main()
{
    setlocale (LC_ALL,"");
 
    int const SIZE=5;
 
    float A[SIZE]={1.3,2.4,3.78,4.79,6.56};
 
    srednee (A, SIZE);
    
}
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
31.01.2013, 09:55 16
Ruzhin, не компилируется
0
1 / 1 / 3
Регистрация: 31.10.2012
Сообщений: 93
30.08.2014, 16:04 17
Вариант со случайно сгенерированным массивом

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
38
39
40
41
#include <iostream>
#include <stdlib.h>
#include<time.h>
 
using namespace std;
 
template <typename T> double srednee (T A[], int size)
{
    double sr=0;
    for (int i=0; i<size; i++)
    {
        sr+=A[i];
    }
 
    cout <<" Среднее арифметическое значение массива: " <<sr/size<< " \n ";
    
    return sr/size;
}
 
void main()
{
    setlocale (LC_ALL,"");
    srand(time(NULL));
 
    int const SIZE=5;
 
    double A[SIZE]={};
 
    cout<<" Сгенерированный массив: ";
 
    for (int j = 0; j < SIZE; j++)  
        
    {
        A[j]=rand()%100;
        cout.width(2); cout<<A[j]<< "  ";       
    }
 
    cout<<" \n";
    srednee (A, SIZE);
    
}
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
30.08.2014, 16:16 18
krigan, к твоему коду есть несколько замечаний.
  1. Выполнять I/O в функциях без особой необходимости — плохо.
  2. Сишные заголовочные файлы подключаются без суффикса ".h", но с префиксом "с". Например, вместо <time.h> нужно использовать <ctime>.
  3. Твой код работает только с массивами и не может контейнеры STL.
  4. Называть функции транслитом — моветон. arith_mean куда лучше подходит для названия функции вычисления среднего арифметического.
  5. Некропостинг — плохо.
1
30.08.2014, 16:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2014, 16:16
Помогаю со студенческими работами здесь

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

Шаблон функции вычисляющей квадрат среднего арифметического четных элементов массива
Шаблон функции в которую передается массив и поворачивается квадрат среднего арифметического всех...

Написать простую программу на С для поиска среднего арифметического массива
Задача: Дано двумерный массив целых чисел. Необходимо найти среднее арифметическое непарных...

Написать подпрограмму поиска среднего арифметического элементов массива
Написать подпрограмму поиска среднего арифметического элементов массива. Для проверки подпрограммы...


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

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