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

Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива - C++

Восстановить пароль Регистрация
 
valenti2
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 18
07.04.2013, 21:00     Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива #1
Дано задание
1)Вывести массив в диапазоне -128..257
2)Найти Min & Max эл-ты
3)Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элем-в массива.

Третью задачу решить не удалось.Использовал код отсюда же,из параллельных тем.
Если не трудно, покажите ньюби как нужно. Комментарии не обязательны,но желательны

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
#include <iostream>
#include <vector>
#include <iomanip>
#include <cstdlib>
 
int main(){
    const int ROWS=7;
    const int COLS=7;
    std::vector< std::vector<int> > mas(ROWS, std::vector<int>(COLS));
 
    srand(time(NULL));
    int min=257;
    int max=-128;
 
    for (int i=0; i<ROWS; i++){
        for (int j=0; j<COLS; j++){
            mas[i][j]=-128+rand()%385;
            std::cout<<std::setw(5)<<mas[i][j];
            if (max<mas[i][j])
            max=mas[i][j];
            if (min>mas[i][j])
                min=mas[i][j];
 
        }
        std::cout<<std::endl;
    }
 
    std::cout<<"Maximum= "<<max<<" ; ";
    std::cout<<"Minimum= "<<min<<" ; ";
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2013, 21:00     Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива
Посмотрите здесь:

C++ Найти элемент массива наиболее близкий к заданному числу.
C++ Найти в массиве элемент, наиболее близкий к среднему рифметическому суммы его элементов
Найти номера строки и столбца для элемента матрицы, наиболее близкого к среднему значению всех ее элементов. C++
Удалить из последовательности первый по порядку элемент, наиболее близкий по значению к среднему арифметическому C++
Вычислить номер элемента, значение которого близкое к среднему арифметическому всех элементов массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.04.2013, 21:06     Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива #2
Вы уточняйте, массив одномерный или двумерный?
valenti2
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 18
08.04.2013, 12:51  [ТС]     Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива #3
двумерный

Добавлено через 15 часов 43 минуты
Дописал, но есть один нюанс. Выводит наиболее близкое к среднему арифметическому по модулю. А нужно естественно само число

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
42
43
44
45
#include <iostream>
#include <vector>
#include <iomanip>
#include <cstdlib>
 
int main(){
    const int ROWS=7;
    const int COLS=7;
    const int kolvo=49;
    std::vector< std::vector<int> > mas(ROWS, std::vector<int>(COLS));
 
    srand(time(NULL));
    int min=257;
    int max=-128;
    int sum=0;
    for (int i=0; i<ROWS; i++){
        for (int j=0; j<COLS; j++){
            mas[i][j]=-128+rand()%385;
            std::cout<<std::setw(5)<<mas[i][j];
            sum += mas[i][j];
            if (max<mas[i][j])
            max=mas[i][j];
            if (min>mas[i][j])
                min=mas[i][j];
        
        }
        std::cout<<std::endl;
 
    }
   double ac=sum/kolvo;
   double minim=257;
   double bn;
    for (int i=0; i<ROWS; i++){
        for (int j=0; j<COLS; j++){
            if (minim>abs(mas[i][j]-ac))
            minim=abs(mas[i][j]-ac);}
    }
    bn=minim+ac;
    std::cout<<"Maximum= "<<max<<" ; ";
    std::cout<<"Minimum= "<<min<<" ; ";
    std::cout<<"summa= "<<sum<<" ; ";
    std::cout<<"minim= "<<bn<<" ; "<<std::endl;
    system("pause");
    return 0;
}
valenti2
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 18
10.04.2013, 16:45  [ТС]     Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива #4
Подниму, кроме как по формуле abs(mas[i][j]-ac)=bn-ac ,вариантов не нашёл
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.04.2013, 01:24     Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива #5
valenti2, такие задаче с матрицами легко решать если создать свой класс для матриц с поддержкой итераторов. После этого можно будет оперировать ею с любыми алгоритмами из STL как с обычным контейнером. Это гораздо упростит код. А вот писать все эти циклы по перебору элементов вручную сложно и утомительно. Вот как может выглядеть пример решения вашей задачи:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#include <ctime>
#include <iterator>
 
template<typename T>
class matrix
{
    int m_rows, m_cols, m_size;
    T** m_matrix;
public:
    typedef T*          iterator;
    typedef const T*    const_iterator;
    iterator        begin()         {return m_matrix[0];}
    iterator        end()           {return m_matrix[0]+m_size;}
    const_iterator  begin() const   {return m_matrix[0];}
    const_iterator  end()   const   {return m_matrix[0]+m_size;}
 
    size_t size() const {return m_size;}
 
    const T* operator[](const int index) const {return m_matrix[index];}
    T* operator[](const int index) {return m_matrix[index];}
    
    explicit matrix(const int rows = 0, const int cols = 0): m_rows(rows), m_cols(cols), m_size(rows*cols)
    {
        if (m_rows <= 0 || m_cols <= 0)
            m_matrix = nullptr;
        m_matrix = new T*[m_rows];
        m_matrix[0] = new T[m_size];
        for (size_t i = 1; i<m_rows; ++i)
            m_matrix[i] = m_matrix[i-1]+m_cols;
    }
    
    ~matrix()
    {
        if (m_matrix)
        {
            delete[] m_matrix[0];
            delete m_matrix;
        }
        else
            delete[] m_matrix;
    }
    
    void print(const int length = 3) const
    {
        for (size_t i = 0; i<m_rows; ++i)
        {
            for (size_t j = 0; j<m_cols; ++j) std::cout<<std::setw(length)<<m_matrix[i][j]<<" ";
            std::cout<<"\n";
        }
    }
};
 
int main() 
{
    setlocale(0,"");
    
    const int R = 5;
    const int C = 5;
    
    std::mt19937 gen;
    gen.seed(time(nullptr));
    auto rand = std::bind(std::uniform_int_distribution<>(-128,257), gen);
    
    matrix<int> matr(R, C);
  
    for (int& val : matr) val = rand();
    matr.print(4);
    std::cout<<"\n";
    
    auto minmax = std::minmax_element(matr.begin(), matr.end());
    std::cout<<"Min = "<<*minmax.first<<"\nMax = "<<*minmax.second<<"\n";
    
    int average = std::accumulate(matr.begin(), matr.end(), 0)/(R*C);
    std::cout<<"Averege = "<<average<<"\n";
    
    std::sort(matr.begin(), matr.end());
  
    auto candidate = std::find_if(matr.begin(), matr.end(), std::bind(std::greater_equal<int>(), std::placeholders::_1, average));
    std::cout<<"\n\nНаиболее близкий к среднему арифметическому: ";
  
    if (*candidate == average)
        std::cout<<*candidate;
    else if ((*candidate - average) < (average - *std::prev(candidate,1)))
            std::cout<<*candidate;
    else
        std::cout<<*std::prev(candidate,1);
  
    std::cout<<"\n\n";
    
    return 0;
}
http://liveworkspace.org/code/hihL2
valenti2
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 18
23.04.2013, 18:46  [ТС]     Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива #6
Очень уж объёмный код, трудно понять.
Кто-нибудь,можете найти ошибку в коде?
Три -четыре раза подряд всё выводится верно,затем 1-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
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
#include <iomanip>
#include <cstdlib>
 
 
int main(){
    const int ROWS=7;
    const int COLS=7;
    const int kolvo=49;
    std::vector< std::vector<int> > mas(ROWS, std::vector<int>(COLS));
 
 
    srand((unsigned)time(NULL));
    int min=257;
    int max=-128;
    int sum=0;
    for (int i=0; i<ROWS; i++){
        for (int j=0; j<COLS; j++){
            mas[i][j]=-128+rand()%385;
            std::cout<<std::setw(5)<<mas[i][j];
            sum += mas[i][j];
            if (max<mas[i][j])
            max=mas[i][j];
            if (min>mas[i][j])
                min=mas[i][j];
        
        }
        std::cout<<std::endl;
 
    }
   double ac=sum/kolvo;
   double minim=257;
   double bn;
    for (int i=0; i<ROWS; i++){
        for (int j=0; j<COLS; j++){
            if (minim>abs(mas[i][j]-ac))
            minim=abs(mas[i][j]-ac);
        }
    }       
 
    bn=minim+abs(ac);
    std::cout<<"ac= "<<ac<<" ; ";
    std::cout<<"Maximum= "<<max<<" ; ";
    std::cout<<"Minimum= "<<min<<" ; ";
    std::cout<<"summa= "<<sum<<" ; ";
    std::cout<<"Modul naibolee blizkogo= "<<bn<<" ; "<<std::endl;
    system("pause");
    return 0;
}
Миниатюры
Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2013, 20:48     Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива
Еще ссылки по теме:

Найти элемент массива, наиболее близкий к среднему значению всех элементов массива C++
C++ Найти в файле, число равное среднему арифметическому всех элементов массива
C++ Найти номера строки и столбца для элемента матрицы, наиболее близкого к среднему значению всех элементов

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

Или воспользуйтесь поиском по форуму:
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
23.04.2013, 20:48     Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива #7
В 32 идёт целочисленное деление, нужно скастовать чего-нибудь к типу с плавающей точкой:
C++
1
double ac = (double)sum / kolvo;
Yandex
Объявления
23.04.2013, 20:48     Найти и вывести элемент,наиболее близкий к среднему арифметическому всех элементов массива
Ответ Создать тему
Опции темы

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