Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Salah_Addin
5 / 5 / 1
Регистрация: 03.10.2014
Сообщений: 76
#1

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

09.01.2016, 19:23. Просмотров 885. Ответов 30

Нужно найти среднее арифметическое элементов массива без учёта максимального и минимального элементов.
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
// Middle arithmetic without min and max elements of array.
#include <iostream>
int main()
{
    int n, a[n], min, max, summ, z;
    float mid;
    printf("Middle arithmetic without min and max elements of array.\n");
    printf("Input quantity of elements in array: ");
    std::cin>>n;
    printf("Input an array: \n");
    for(int i=0; i<n; i++)
    {
        printf("n[%i] -> ", i);
        std::cin>>a[i];
//      summ += a[i];
        if(a[i] != 0) z++;      
        
    }
    for (int j=0; j<n; j++)
    {
        summ += a[j];
        if(a[j] > max ) max = a[j];
        if(a[j]< min ) min = a[j];
    }       
    printf("\nSumm of elements is %i.\n", summ);
//  summ -= min;
    summ -= max;
    mid = summ / (n-2);
    printf("\nEntered array: ");
    for  ( int l = 0; l<n; l++)
        printf("%i ", a[l]);    
//  printf("\nMinimum element is %i.\n", min);
    printf("Maximum elenent is %i.\n", max);
 
    printf("Numbers that are bigger then 0: %i\n", z);
    printf("\nMiddle atithmetic without min and max: %.3f", mid);
 
    std::cin.get();
    return 0;
}
Что здесь сложного? Отдельно друг от друга сумма, мин., и макс. работают, сумма и макс. вместе тоже работают, а мин. приходится комментировать. Но вместе не работают:
C++
1
Process exited after 0.0179 seconds with return value 3221225725
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2016, 19:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти среднее арифметическое элементов массива без учёта максимального и минимального элементов (C++):

Найти среднее значение элементов массива (без учёта максимального и минимального) и вывести результат на экран - C++
Условие задачи (добавлено спустя сутки после начала обсуждения, так что не удивляйтесь): #include &lt;iostream&gt; #include &lt;stdio.h&gt; ...

Среднее арифметическое элементов массива без учета минимального и максимального элементов - C++
Написать программу, которая вычисляет среднее арифметическое элементов массива без учета минимального и максимального элементов массива....

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

Найти среднее арифметическое минимального и максимального элементов массива - C++
найти среднее арифметическое минимального и максимального элементов массива А(n),где 0&lt;=n&lt;=20.

Найти среднее арифметическое максимального и минимального элементов массива - C++
Всем доброго времени суток. Нужна ваша помощь, с C++ только начал знакомится, есть задача. Найти среднее арифметическое максимального и...

Найти среднее арифметическое индексов минимального и максимального элементов массива - C++
Определить среднее арифметическое индексов минимального и максимального элементов массива А, где 0&lt;=n&lt;=20. Визначити середнє...

30
jonson
234 / 207 / 61
Регистрация: 18.03.2010
Сообщений: 750
09.01.2016, 20:26 #16
Цитата Сообщение от Salah_Addin Посмотреть сообщение
А вот так ошибки нет:
Цитата Сообщение от Salah_Addin Посмотреть сообщение
int n, a[n], *min=2, max=0, summ=0, z;
В какой среде удалось это скомпилировать?
0
Salah_Addin
5 / 5 / 1
Регистрация: 03.10.2014
Сообщений: 76
09.01.2016, 20:34  [ТС] #17
"В чем разница между словами "инициализация" и "декларация"?"
"декларация":
C++
1
int i;
"инициализация":
C++
1
int i=0;
Проверка знаний это хорошо, но много не спрашивайте, я ничего не знаю.

Добавлено через 1 минуту
"В какой среде удалось ..."
Dev-C++
Win7

Добавлено через 5 минут
cyber-satyr, ваш пример у меня не запускается:

список ошибок

c++\Help from forum.cpp In function 'int main(int, char**)':
7 20 c++\Help from forum.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
7 48 с++\Help from forum.cpp [Error] in C++98 'v' must be initialized by constructor, not by '{...}'
7 48 c++\Help from forum.cpp [Error] no matching function for call to 'std::vector<int>::vector(<brace-enclosed initializer list>)'
7 48 c++\Help from forum.cpp [Note] candidates are:
64 0 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\vector In file included from c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\vector
2 c++\Help from forum.cpp from c++\Help from forum.cpp
398 9 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_vector.h [Note] template<class _InputIterator> std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator, const allocator_type&)
398 9 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_vector.h [Note] template argument deduction/substitution failed:
7 48 c++\Help from forum.cpp [Note] cannot convert '3' (type 'int') to type 'const allocator_type& {aka const std::allocator<int>&}'
64 0 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\vector In file included from c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\vector
2 c++\Help from forum.cpp from c++\Help from forum.cpp
310 7 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_vector.h [Note] std::vector<_Tp, _Alloc>::vector(const std::vector<_Tp, _Alloc>&) [with _Tp = int; _Alloc = std::allocator<int>]
310 7 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_vector.h [Note] candidate expects 1 argument, 9 provided
295 7 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_vector.h [Note] std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type, const value_type&, const allocator_type&) [with _Tp = int; _Alloc = std::allocator<int>; std::vector<_Tp, _Alloc>::size_type = long long unsigned int; std::vector<_Tp, _Alloc>::value_type = int; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<int>]
295 7 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_vector.h [Note] candidate expects 3 arguments, 9 provided
256 7 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_vector.h [Note] std::vector<_Tp, _Alloc>::vector(const allocator_type&) [with _Tp = int; _Alloc = std::allocator<int>; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<int>]
256 7 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_vector.h [Note] candidate expects 1 argument, 9 provided
248 7 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_vector.h [Note] std::vector<_Tp, _Alloc>::vector() [with _Tp = int; _Alloc = std::allocator<int>]
248 7 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_vector.h [Note] candidate expects 0 arguments, 9 provided
9 13 с++\Help from forum.cpp [Error] 'accumulate' is not a member of 'std'
10 8 c++\Help from forum.cpp [Error] 'minmax' does not name a type
12 11 c++\Help from forum.cpp [Error] 'minmax' was not declared in this scope
0
Даценд
Модератор
Эксперт .NET
4039 / 3878 / 1953
Регистрация: 20.04.2015
Сообщений: 7,042
09.01.2016, 20:41 #18
Цитата Сообщение от Salah_Addin Посмотреть сообщение
почему в вашем случае всё работает.
Потому что у меня размер массива известен до его создания.
0
cyber-satyr
393 / 164 / 28
Регистрация: 10.12.2015
Сообщений: 717
09.01.2016, 20:42 #19
Цитата Сообщение от Salah_Addin Посмотреть сообщение
ваш пример у меня не запускается
флаг компиляции --std=c++14
0
Salah_Addin
5 / 5 / 1
Регистрация: 03.10.2014
Сообщений: 76
09.01.2016, 20:59  [ТС] #20
"флаг компиляции --std=c++14"
Что делать с этой информацией?

Добавлено через 2 минуты
" размер массива известен до его создания."
Это понятно, меняется всего лишь строка инициализации размера массива. А что под капотом? Почему в данном случае иные варианты неприемлемы?

Добавлено через 11 минут
cyber-satyr, я настаиваю на том, что мой вариант рабочий, и хочу знать, почему это не так. Вот программа, которая находит средне арифметическое, сумму элементов. Реализована также, половину я взял из неё, и всё работает.
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
// Middle atithmetic of array elements that are bigger then zero.
#include <iostream>
 
int main()
{
    int n, a[n], i, summ = 0, z;
    float mid;
    printf("Middle atithmetic of array elements that are bigger then zero.\n");
    printf("Input quantity of elements in array: ");
    std::cin>>n;
    printf("Input an array: \n");
    for( i; i<n; i++)
    {
        printf("a[%i] -> ", i);
        std::cin>>a[i];
        if(a[i] != 0) z++;
        summ += a[i];
    }
    mid = summ / n;
    printf("\nEntered array: ");
    for  ( int l = 0; l<n; l++)
        printf("%i ", a[l]);    
    printf("\nSumm of elements is %i.\n", summ);
    printf("\nNumbers that are bigger then 0: %i\n", z);
    printf("Middle atithmetic of array elements: %.3f", mid);
    std::cin.get();
    return 0;
}
0
Даценд
Модератор
Эксперт .NET
4039 / 3878 / 1953
Регистрация: 20.04.2015
Сообщений: 7,042
09.01.2016, 21:05 #21
Цитата Сообщение от Salah_Addin Посмотреть сообщение
А что под капотом?
Если в двух словах, то при создании массива выделяется память по смежным адресам под его элементы. У меня в коде количество элементов зависит от константы n=5. Память под 5 элементов выделяется и закрепляется, т.е. по выделенным адресам ничего другого записано не будет. Ваш компилятор позволяет объявить массив без указания его размера. При создании массива его идентификатор содержит адрес его нулевого элемента. Сдвигая через индексацию указатель к следующим адресам памяти можно получать значения в них хранящиеся. Но так как память не была выделена под элементы (а главное не закреплена), то по этим адресам хранится мусор, который интерпретируется как значения типа int. Поэтому программа работает неверно.
0
Salah_Addin
5 / 5 / 1
Регистрация: 03.10.2014
Сообщений: 76
09.01.2016, 21:14  [ТС] #22
1)"Ваш компилятор позволяет объявить массив без указания его размера. "
Это свойство только моего компилятора?
2) Допустим, я признаю, что из-за отсутствия инициализации размера массива не была выделена и закреплена память. Как в таком случае, вы объясните, что программа работает, если нахождение минимального закомментировать? Функция нахождения макс. и суммы могут работать в суровых условиях отсутствия размера массива, а мин. особенная?
0
cyber-satyr
393 / 164 / 28
Регистрация: 10.12.2015
Сообщений: 717
09.01.2016, 21:30 #23
Цитата Сообщение от Salah_Addin Посмотреть сообщение
Это свойство только моего компилятора?
А тут нет никакой синтаксической ошибки. Это семантическая ошибка. Компилятор такие и не должен отлавливать.
0
Salah_Addin
5 / 5 / 1
Регистрация: 03.10.2014
Сообщений: 76
09.01.2016, 21:35  [ТС] #24
Среднее арифметическое элементов массива без учета минимального и максимального элементов
Здесь взял код от MILAN, заменил здесь:
C++
1
2
3
4
5
6
7
8
setlocale(LC_ALL,"Russian");
        int n, a[n];
        int sum=0, max,min;
        float sr;
        printf("Input quantity of elements in array: ");
    std::cin>>n;
        cout<<" Введите...
        ...
И тоже перестало работать. До замены запустилось и посчитало успешно. Но почему тогда, если код не работает из-за отсутствия инициализации размера массива, выделеной и закрепленой памяти, в моём коде мы убираем нахождение минимального и это самое отсутствие уже не мешает???
0
Даценд
Модератор
Эксперт .NET
4039 / 3878 / 1953
Регистрация: 20.04.2015
Сообщений: 7,042
09.01.2016, 21:37 #25
Цитата Сообщение от Salah_Addin Посмотреть сообщение
Это свойство только моего компилятора?
Мой бы такого не допустил.
Цитата Сообщение от Salah_Addin Посмотреть сообщение
Как в таком случае, вы объясните, что программа работает, если нахождение минимального закомментировать?
Есть предположение, но нужно проверять. Проведем эксперимент. В своей версии (код из первого сообщения темы, ничего не меняя) задайте размер массива 4, каждому элементу задайте значение 100, затем между 18 и 19 строкой выведите значения min, max, summ, z.
0
Salah_Addin
5 / 5 / 1
Регистрация: 03.10.2014
Сообщений: 76
09.01.2016, 21:50  [ТС] #26
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
// Middle arithmetic without min and max elements of array.
#include <iostream>
int main()
{
        int n;
    int a[n];
    int min, max, summ, z;
    float mid;
    printf("Middle arithmetic without min and max elements of array.\n");
    printf("Input quantity of elements in array: ");
    std::cin>>n;
    printf("Input an array: \n");
    for(int i=0; i<n; i++)
    {
        printf("n[%i] -> ", i);
        std::cin>>a[i];
//      summ += a[i];
        if(a[i] != 0) z++;      
        
    }
    printf("\nMinimum element is %i.\n", min);
    printf("Maximum elenent is %i.\n", max);
 
    printf("Numbers that are bigger then 0: %i\n", z);
    for (int j=0; j<n; j++)
    {
        summ += a[j];
        if(a[j] > max ) max = a[j];
//        if(a[j]< min ) min = a[j];
    }       
    printf("\nSumm of elements is %i.\n", summ);
//  summ -= min;
    summ -= max;
    mid = summ / n;
    printf("\nEntered array: ");
    for  ( int l = 0; l<n; l++)
        printf("%i ", a[l]);    
    printf("\nMinimum element is %i.\n", min);
    printf("Maximum elenent is %i.\n", max);
 
    printf("Numbers that are bigger then 0: %i\n", z);
    printf("\nMiddle atithmetic without min and max: %.3f", mid);
 
    std::cin.get();
    return 0;
}
Получаем:

Middle arithmetic without min and max elements of array.
Input quantity of elements in array: 4
Input an array:
n[0] -> 100
n[1] -> 100
n[2] -> 100
n[3] -> 100

Minimum element is 0.
Maximum elenent is 0.
Numbers that are bigger then 0: 4

Summ of elements is 400.

Entered array: 100 100 100 100
Minimum element is 0.
Maximum elenent is 100.
Numbers that are bigger then 0: 4

Middle atithmetic without min and max: 75.000
0
marat_miaki
148 / 137 / 50
Регистрация: 08.04.2013
Сообщений: 549
09.01.2016, 21:51 #27
Пример когда n заранее не известен можешь переделать под себя
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>
using namespace std;
int main()
{
setlocale(LC_ALL,"Rus");
int i, n, max;
do /*начало проверки условия*/
{
cout<<" Введите количество чисел в массиве (n>0) "; cin>>n;
}while (n<=0); /*конец проверки условия*/
int *mas=new int[n];
cout<<"Введите элементы массива:\n";
for (i=0; i<n; i++)
{
cin>>mas[i];
}
max=mas[0];
for (i=1; i<n; i++)
{
if (mas[i]>max)
{
max=mas[i];
}
}
cout<<" Максимальный элемент массива "<<max;
delete []mas;
return 0;
}
1
cyber-satyr
393 / 164 / 28
Регистрация: 10.12.2015
Сообщений: 717
09.01.2016, 21:59 #28
Цитата Сообщение от Даценд Посмотреть сообщение
Мой бы такого не допустил
а подробней с сообщениями об ошибках.
0
Даценд
Модератор
Эксперт .NET
4039 / 3878 / 1953
Регистрация: 20.04.2015
Сообщений: 7,042
09.01.2016, 22:24 #29
cyber-satyr,
Коды: C2057, C2466, C2133.
Описание долго набирать.

Добавлено через 16 минут
Salah_Addin,
Так и не понял, где хранятся элементы массива, но чтобы работало нужно после ввода массива инициализировать min не нулем, а значением нулевого элемента массива:
C++
1
min=a[0];
0
Salah_Addin
5 / 5 / 1
Регистрация: 03.10.2014
Сообщений: 76
10.01.2016, 11:48  [ТС] #30
1)"флаг компиляции --std=c++14"
Что делать с этой информацией? Я понимаю, что ошибка с моей стороны. Как лечить?
2)"Ваш компилятор позволяет объявить массив без указания его размера. "
Это свойство только моего компилятора?
"А тут нет никакой синтаксической ошибки. Это семантическая ошибка. Компилятор такие и не должен отлавливать."
"Мой бы такого не допустил."
Подробнее кто виноват и почему. И если можно настроить компилятор, чтобы он находил такие ошибки, как это сделать?
3) Объясните эту строку:
C++
1
int *mas=new int[n];
Со звездочкой - указатели. А дальше?

Добавлено через 2 минуты
"Коды: C2057, C2466, C2133.
Описание долго набирать."
Где можно посмотреть что это значит?

Добавлено через 29 минут
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
#include <iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL,"Rus");
    int i, n, max, min, summ=0, z; // Если не инициализировать
    // сумму, то он её не находит - мусор выдаёт.
    float mid;
    //do /*начало проверки условия*/
    //{
    cout<<" Введите количество чисел в массиве "; 
    cin>>n;
    //}while (n<=0); /*конец проверки условия*/
    int *mas=new int[n];
    cout<<"Введите элементы массива:\n";
    for (i=0; i<n; i++)
    {
        cin>>mas[i];
        if(mas[i] != 0) z++;
        summ += mas[i];
    }   
    max=mas[0];
    min=mas[0];
    for (i=1; i<n; i++)
    {
        if (mas[i]>max) max=mas[i];
        if (mas[i]<min) min=mas[i];
    }
    mid = (float)(summ-max-min) / (n-2);// Если не указать (float),
    // то среднее арифметическое сильно округляет. Почему?
    printf("\nEntered array: ");
    for  ( int l = 0; l<n; l++)
        printf("%i ", mas[l]);  
    printf("\nSumm of elements is %i.\n", summ);
    printf("Minimum element is %i.\n", min);
    printf("Maximum elenent is %i.\n", max);
    printf("Numbers that are bigger then 0: %i\n", z);
    printf("\nMiddle atithmetic without min and max: %.3f", mid);
//  cout<<" Максимальный элемент массива "<<max;
    std::cin.get();
    delete []mas; // Зачем удалять в конце?
    return 0;
}
Добавлено через 26 минут
При замене в коде из первого поста таких строк
C++
1
2
3
4
5
6
7
8
9
10
11
        ...
    std::cin>>a[i];
//      summ += a[i];
        if(a[i] != 0) z++;      
        
    }
    [I]max=a[0];
    min=a[0];[/I]
    for (int j=1; j<n; j++)
    {
        sum...
Программа всё равно выдаёт ошибку. Так что же это за объявление массива, и в чём его преимущество?
C++
1
int *mas=new int[n];
Добавлено через 10 минут

Не по теме:


На сайте есть тесты только по С#?

0
10.01.2016, 11:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2016, 11:48
Привет! Вот еще темы с ответами:

Вычислите среднее арифметическое элементов последовательности без учета минимального и максимального - C++
Дана последовательность из n целых чисел (n&lt;=200). Вычислите среднее арифметическое элементов последовательности без учета минимального и...

Высчитать среднее арифметическое элементов масива без учета минимального и максимального элемента - C++
Помогите решить задачи( Вторая задача: Написать программу которая считает среднее арифметическое элементов масива без учета...

Найти среднее арифметическое, и разность минимального и максимального элементов последовательности - C++
Дана последовательность целых чисел, за которой следует 0. Найти среднее арифметическое этой последовательности. Дана...

Составит пограмму, которая вычисляет среднее арифметическое максимального и минимального значения элементов одномерного массива Х - C++
Составит пограмму, которая вычисляет среднее арифметическое максимального и минимального значения элементов одномерного массива Х, который...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru