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

Среднее значение полученных чисел, количество значений в массиве, превышающих среднее - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
24.06.2012, 14:13     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #1
Вот решаю одну задачку из книги Праты:
"Напишите программу, читающую в массив double до 10 значений пожертвований. Программа должна прекращать ввод при получении нечисловой величины. Она должна выдавать среднее значение полученных чисел, а также количество значений в массиве, превышающих среднее."
Что-то нахимичил очень громоздкое, но вот пока проблема на счёт получения нечисловой величины.
Пока идея 1: проверять посимвольно через isalpha и ispunct, чтобы вводились только цифры и знаки препинания. Но является ли это рационально?
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
#include <iostream>
#include <cctype>
const int MAX=10;
int main()
{   using namespace std;
    setlocale (LC_ALL, "Russian");
    double pay[MAX];
    double money;
    int k=0;
    cout << "Введите сумму пожертвований ";
    cin >> money;
    while (k<MAX && money>=0)
    {
     pay[k]=money;
     ++k;
        if(k<MAX)
        {
            
         cout << "Следующая сумма пожертвований ";
         cin >> money;
        }
    }
    double sum=0;
    int j=0;
    for (j; j<k; j++)
        sum +=pay[j];
    cout << "Общая сумма пожертвований " << sum << endl;
    double sr=sum/j;
    cout << "Средняя сумма " << j << " пожертвований " << sr << endl;
    int count =0;
    for (int l=0; l<k; l++)
 
        if (pay[l]>sr)
            count++;
    cout << count << " пожертвований больше средней суммы";
    for (int i=0; i<100; i++)
        cin.get();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2012, 14:13     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее
Посмотрите здесь:

C++ Определить количество простых чисел в каждом массиве. Вычислить среднее арифметическое всех элементов массивов
C++ Определить, сколько значений в массиве превышают среднее значение [-50.120]
Подскажите как добавить вычесленное среднее значение из подпрограммы 1, в подпрограмму 2, а то в подпрограмме 2 берет среднее значение = 0 C++
Найти в массиве количество элементов, превышающих среднее арифметическое C++
Найти количество элементов превышающих среднее арифметическое всех элементов массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
24.06.2012, 14:14     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #2
Fooly, Главное чтоб работало. оптимизация потом)
lamerr
9 / 9 / 1
Регистрация: 05.04.2012
Сообщений: 26
24.06.2012, 14:17     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #3
Измени 13ю строчку так:

C++
1
while (cin && k<MAX && money>=0)
Если будет введено нечисловое значение, поток cin окажется в состоянии ошибки, проверка его значения вернёт ноль и программа выйдет из цикла
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.06.2012, 14:21     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #4
Цитата Сообщение от Fooly Посмотреть сообщение
Но является ли это рационально?
А у тебя выбора нет. Нужно считывать строку и преобразовывать её в число, либо прекращать цикл.
Либо выполнять чтение посимвольно (средствами Си).
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
24.06.2012, 14:28  [ТС]     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #5
Я тут подумал, что можно создать новый массив (допустим proverka). При вводе первого символа проверить: является ли он цифрой, а далее уже проверять на знак пунктуаци (в случае дробной суммы). Также организовать невозможность введения повторной точки или запятой, чтобы в сумме не оказалось несколкьо знаков пунктуации.
Далее money тоже переделать в массив, и после каждого вводе числа в proverka, перебрасывать значение в money ( чтобы 100% было только цифры в нём) и очищать массив proverka и загружать новое значение суммы.
Вот эту всю байду думаю всунуть вместо cin >> money и потом немного переделать код, который ниже.
Так нормально?

Добавлено через 3 минуты
Цитата Сообщение от lamerr Посмотреть сообщение
Измени 13ю строчку так:

C++
1
while (cin && k<MAX && money>=0)
Если будет введено нечисловое значение, поток cin окажется в состоянии ошибки, проверка его значения вернёт ноль и программа выйдет из цикла
программа ведёт себя также... вроде бы Я просто не успеваю углядеть, она сразу же закрывается Я помню можно что-то ввести в конце программы, что не позволяет консоли закрываться, вроде break или что-то подобного. Напомните-ка мне
lamerr
9 / 9 / 1
Регистрация: 05.04.2012
Сообщений: 26
24.06.2012, 15:00     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #6
Цитата Сообщение от Fooly Посмотреть сообщение
помню можно что-то ввести в конце программы, что не позволяет консоли закрываться, вроде break или что-то подобного. Напомните-ка мне
например,
C++
1
cin.getchar();
т.к. ты, видимо, в VS пишешь, то можно также
C++
1
system("pause");
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
24.06.2012, 15:05     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #7
Может быть вот так?:
C++
1
2
3
4
5
6
7
8
9
10
cout << "Введите сумму пожертвований ";
while ( (cin >> money) && money>=0 && k<MAX )
{
   ++k;
   pay[k] = money;
   cout << "Следующая сумма пожертвований ";
}
 
cin.get();
while ( cin.get() != '\n' ) continue;
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
24.06.2012, 15:22  [ТС]     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #8
g-h
что-то не захотело у меня адекватно программка работать с этим куском кода, сейчас посмотрю, подправлю что-нить, а то совсем абракадабра какая-то вышла

update: я что-то не пойму каким образом она проверит является ли числом? это свойство cin? Т.е получается в цикле должно выполняться 3 условия и первой (cin >> money) оказывается верным только в случае, если введено значение типа double? Я правильно понял?
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
24.06.2012, 15:41     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #9
Цитата Сообщение от Fooly Посмотреть сообщение
(cin >> money) оказывается верным только в случае, если введено значение типа double?
Да. Если будет введена буква или еще что-то, тогда это условие будет false и произойдет выход из цикла. При этом будет установлен флаг ошибки ввода (вроде так это называется ) А следующие две строчки
C++
1
2
cin.clear();
while ( cin.get() != '\n' ) continue;
Сбрасывают флаг ошибки и удаляют всё, что находится во входном потоке.

Я в предыдущем посте ошибся. Нужно написать cin.clear();
koldya
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 26
15.10.2013, 22:00     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #10
Я в общем сейчас решаю туже задачу и что бы не создавать новую тему пишу свой код здесь.
В общем запарка у меня в проверке условия цикла, подскажите что не так! Спасибо.
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 <cctype>
using namespace std;
int main()
{   
    setlocale (LC_ALL, "Russian");
    int i = 0, Size = 10;
    double ch = 0, E = 0, S = 0, array[Size];
    cout << "Введите пожертвование:" << endl;
    cin >> ch;
    while(isalpha(ch) && i<Size)
    {
        array[i] = ch;
        E += ch;
        i++;
        cout << "Следующее пожертвование:" << endl;
        cin >> ch;
    }
    S = E / i;
    cout << "Среднее значение: " << E << " / " << i << " = " << S << endl;
    for(int z=0; z < i; z++)
    {
        if (array[z] < S)
        continue;
        cout << array[z] << ";" << endl;
    }
    return 0;
}
B@R_LOG
 Аватар для B@R_LOG
18 / 18 / 0
Регистрация: 03.07.2013
Сообщений: 49
16.10.2013, 02:56     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #11
По int isalpha( int character ):
- Возвращает значение, отличное от нуля (т.е. истинно), если аргумент функции — это буква алфавита.
- Ноль (т.е. ложь), в противном случае.

Ch у тебя double, он его преобразовывает в int (о чём собственно компилятор и предупреждает, т.к. 3.2 != 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "stdafx.h"
#include <iostream>
using namespace std;
 
void skip_to_int()
{
    if (cin.fail() )
        { 
          cin.clear();
          char ch;
          while ( cin >> ch && !( isdigit(ch) ) );
           if (!cin) cerr << ("Is not input");
           cin.unget();
         }  
}
 
double the_control_input()
{   double n=0;
    while (true) 
    { if (cin >> n) return n;
    cout << "It is not number. Repeat input!\n";
    skip_to_int();
    }
}
 
int main()
{   
    setlocale (LC_ALL, "Russian");
    int i = 0; const int Size = 10;
    double ch = 0, E = 0, S = 0;
    
    double array[Size];
    
    while(i<Size)
    {
        cout << "Введите пожертвование №" << i+1 << endl;
        array[i++] = the_control_input();
        E += ch;
    }
    S = E / i;
    cout << "Среднее значение: " << E << " / " << i << " = " << S << endl;
    for(int z=0; z < i; z++)
    {
        if (array[z] < S) continue;
        cout << array[z] << ";" << endl;
    }
    return 0;
}
gr0mazeka
5 / 2 / 1
Регистрация: 28.05.2014
Сообщений: 6
28.05.2014, 23:22     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #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
35
36
37
38
39
#include <iostream>
#include <array>
int main()
{
    using namespace std;
    const int Max = 10;
    array<double, Max> mas;
    cout << "Enter the numbers: \n First: ";
    int i = 0;
    while (i < Max && cin >> mas[i])
    {
        if (++i < Max)
            cout << " Next: ";
    }
    double total = 0.0;
    
    for (int j = 0; j < i; j++)
        total += mas[j];
 
    double avrg = total/i;
 
    if (i == 0)
        cout << "No value.\n"; 
    else
        cout << avrg << " = average  of "<< i << " number(s).\n"; 
 
    int count = 0;
    for (int j = 0; j < i; j++)
    {
        if (mas[j] > avrg)
            count++;
    }
    if (i != 0)
        cout << count << " number(s) more than " << avrg << endl;
    cout << "Done.\n";
    cin.get();
    cin.get();
    return 0;
}
elvis66666
Сообщений: n/a
10.07.2014, 12:19     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #13
Более простое и приятное решение :

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
#include <iostream>
#include <cctype>
 
using namespace std;
 
int main()
{
    int i = 0;
    double summa = 0.0;
    double chisla[10] {0.0};
    
    while (cin >> chisla[i] && cin.get() != '\n')
        i++;
 
    for (double x : chisla) 
        summa += x;
 
    cout << "Сумма элементов = " << summa << endl;
    cout << "Количество элементов = " << sizeof(chisla)/sizeof(chisla[0]) << endl;
    cout << "Среднее значение = " << summa / (sizeof(chisla) / sizeof(chisla[0])) << endl;
 
    system("pause");
    return 0;
}
Chang875
1 / 1 / 0
Регистрация: 14.01.2015
Сообщений: 12
01.03.2015, 18:25     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #14
Вот мой вариант решения задачи, потратил на нее более 5 часов, перебирая прочитанный материал, может кому пригодится.
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
#include <iostream>
#include <cctype>
#include <string>
using namespace std;
const int size = 10;
int main()
{
    setlocale(LC_ALL, "russian");
        
    double pojert[size];
    double toatal = 0.0;
    int i = 0;
    double srednee = 0;
    
     cout << "Введите " << size << " пожертвований, для выхода нажмите q \n";
        
     while (i < 10 && cin >> pojert[i])
 
              i++;
            for (int j = 1; j < i; j++)
                toatal += pojert[j];
            srednee = toatal / i;
                 cout << "среднее пожертвование равно " << srednee << endl;
                 for (int a = 0; a < i; a++)
                 {
                     if (a > srednee)
                         cout << pojert[a] << endl;
 
                 }
                 
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2015, 18:45     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее
Еще ссылки по теме:

Найти среднее значение чисел, а также количество значений в массиве, превышающих среднее C++
Найти среднее арифметическое элементов массива, и количество чисел внутри массива, не превышающих найденное C++
C++ Найти среднее арифметическое значений в массиве

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

Или воспользуйтесь поиском по форуму:
Rick26rus
0 / 0 / 0
Регистрация: 12.06.2015
Сообщений: 10
03.10.2015, 18:45     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее #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
#include <iostream>
const int Max=10;
int main()
{
    using namespace std;
    double donation[Max];
    cout<<"Please enter sum of donation. You can enter "<<Max<<" sum."<<endl;
    cout<<"Sum #1:"<<endl;
    int i=0;
        while (i<Max&&cin>>donation[i])
    {
        if (++i<Max)
        cout<<"Sum #"<<i+1<<":\n";
    }
        double total=0.0;
    for (int j=0; j<i; j++)
    total+=donation[j];
    if (i==0)
    cout<<"No donation!\n";
    double average=total/i;
    cout<<average<<" =average sum of "<<i<<" donation.";
    int count=0;
      for (int l=0; l<i; l++)
      {
        if (donation[l]>average)
            count++;
      }
    cout << count << " is the number of donations of more than average values."<<endl;
    cout<<"Done!\n";
}
Это работает. Сравни со своей прогой.
Yandex
Объявления
03.10.2015, 18:45     Среднее значение полученных чисел, количество значений в массиве, превышающих среднее
Ответ Создать тему
Опции темы

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