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

Инкрементирование элементов массива-счётчика - C++

Восстановить пароль Регистрация
 
kalonord
 Аватар для kalonord
26 / 26 / 3
Регистрация: 27.01.2014
Сообщений: 767
05.01.2016, 20:58     Инкрементирование элементов массива-счётчика #1
Здравствуйте.

К примеру, есть массив:
C++
1
2
3
4
5
6
7
8
const int stablePay = 200;                 // dollars
    const double rate = 0.09;                  // 9 %
 
    const int totalPaySize = 20;
    double totalPay[totalPaySize];
 
    for(int i = 0; i < totalPaySize; i++)
        totalPay[i] = round((25 + rand() % 10000) * rate + stablePay);
Забит случайными значениями (длина числа может быть любой).

Нужно создать массив-счётчик, который выведет диаграмму чисел в опр. диапазоне. Что-то типа:

200$ - 299$ = 4
300$ - 399$ = 7
400$ - 499$ = 8
500$ - 599$ = 1

Если бы я знал длину чисел элементов первого массива, было бы проще, а что делать в этом случае? Конечно, можно через if-ы сделать, но как-то громоздко, как мне кажется. Есть другие варианты?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2016, 20:58     Инкрементирование элементов массива-счётчика
Посмотрите здесь:

Функция должна вычислять разницы между суммой положительных элементов массива и суммой модулей отрицательных элементов массива C++
Каждый из элементов массива заменить средним значением первых элементов этого массива. C++
C++ Каждый из элементов x[SUB]i[/SUB] массива X(n) заменить средним значением первых i элементов этого массива
C++ В одномерном массиве, вычислить: а) количество элементов массива б) произведение элементов массива в) От - к +
Обновление счётчика при записи в файл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Горелый
69 / 43 / 11
Регистрация: 20.03.2014
Сообщений: 173
05.01.2016, 21:10     Инкрементирование элементов массива-счётчика #2
Как я понимаю может быть и ситуация 200-299 а потом 600-699, то есть отсутствовать какой то из диапазонов?
Я бы сделал так
1. Находим минимум и максимум.
2. запускаем цикл от минимума к максимуму с шагом в 100. Тут скорее не от минимума к максимуму а от приведенных с кратности 100 их значений. например нашли мин 231 макс 5673, то запускаем цикл от 200 до 5600
3. запускаем внутри ещё один вложенный цикл который проходит по всему массиву значений
4. переменную внешнего цикла используем для условия в теле 2-го цикла if(totalPay[j] >= i && totalPay[j] < i+100)
5. увеличиваем счётчик
6. выводим диапазон и счётчик
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
05.01.2016, 21:16     Инкрементирование элементов массива-счётчика #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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <random>
 
using namespace std;
 
class Ranger {
    std::vector<unsigned long> counts;
    double offset;
    double width;
    int count;
public:
    Ranger( double offset, double width, int count ) {
        this->offset = offset;
        this->width = width;
        this->count = count;
        for( int i = 0; i < count + 1; i++ ) {
            counts.push_back( 0 );
        }
    }
    vector<unsigned long>& getData() {
        return counts;
    }
    Ranger& operator<<( double value ) {
        int pos = int(value / this->width);
        if( pos > counts.size() - 1 ) {
            ++counts[counts.size() - 1];
            return *this;
        }
        ++counts[pos];
        return *this;
    }
    void debugPrint() {
        for( auto& it : counts )
            cout << it << endl;
    }
};
 
int main() {
 
    std::default_random_engine rn1;
    std::exponential_distribution<double> distribution( 1.0 );
 
    int tests = 0;
 
    cout << "Enter number of tests" << endl;
    cin >> tests;
 
    Ranger table( 0.0, 0.5, 20 );
    
    for( int i = 0; i < tests; i++ ) {
        table << distribution( rn1 );
    }
 
    //table.debugPrint();
 
    for( auto & i : table.getData() ) {
        const int WIDTH = 80;
        double coef = double(WIDTH) / double(tests);
        for( int j = 0; j < i * coef; j++ ) {
            cout << "*";
        }
        cout << endl;
        
    }
 
    return 0;
 
}
Собственно класс Range этим занимается. В конструктор подается - смещение от нуля (значение 1 столбца), ширина столбца, количество столбцов.
В вашем случае будет Range( 200.0, 99.0, 4 )
Не уверен на счет работоспособности, так что пробуйте запустить у себя
Горелый
69 / 43 / 11
Регистрация: 20.03.2014
Сообщений: 173
05.01.2016, 21:33     Инкрементирование элементов массива-счётчика #4
И как то так
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
#include <iostream>
#include <cmath>
#include <algorithm>
 
using namespace std;
 
int main()
{
    const int stablePay = 200;                 // dollars
    const double rate = 0.03;                  // 9 %
 
    const int totalPaySize = 20;
    double totalPay[totalPaySize];
 
    srand(time(0));
    for(int i = 0; i < totalPaySize; i++)
    {
        totalPay[i] = round((25 + rand() % 10000) * rate + stablePay);
        cout << totalPay[i] << ' ';
    }
    cout << endl;
   
    double dmin = *min_element(totalPay, totalPay + totalPaySize);
    double dmax = *max_element(totalPay, totalPay + totalPaySize);
   
    int imin = (int)dmin / 100 * 100;
    int imax = (int)dmax / 100 * 100;
    cout << imin << " " << imax << endl;
    for(int i = imin; i <= imax; i += 100)
    {
        int n = 0;
        for(int j = 0; j < totalPaySize; ++j)
        {
            if(totalPay[j] >= i && totalPay[j] < i + 100)
                ++n;
        }
        if(n > 0)
            cout << "$" << i << " - $" << i + 99 << " = " << n << endl;
    }
   
    return 0;
}
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
05.01.2016, 21:45     Инкрементирование элементов массива-счётчика #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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <random>
 
using namespace std;
 
class Ranger {
    std::vector<unsigned long> counts;
    double offset;
    double width;
    int count;
public:
    Ranger( double offset, double width, int count ) {
        this->offset = offset;
        this->width = width;
        this->count = count;
        for( int i = 0; i < count + 1; i++ ) {
            counts.push_back( 0 );
        }
    }
    vector<unsigned long>& getData() {
        return counts;
    }
    Ranger& operator<<( double value ) {
        int pos = int((value - offset) / this->width);
        if( pos > counts.size() - 1 ) {
            ++counts[counts.size() - 1];
        } else {
            ++counts[pos];
        }
        return *this;
    }
    void debugPrint() {
        for( int i = 0; i < counts.size(); i++ ) {
            double left = offset + width * i;
            double right = left + width;
            if(i+1 == counts.size()) {
                cout << left << "-inf" << ": " << counts[i] << endl;
            } else {
                cout << left << "-" << right << ": " << counts[i] << endl;
            }
        }
    }
};
 
int main() {
 
    Ranger table( 200.0, 100.0, 4 );
    
    table << 250 << 299 << 301 << 800 << 700 << 267 << 645 << 222 << 450;
 
    table.debugPrint();
 
    return 0;
 
}
Yandex
Объявления
05.01.2016, 21:45     Инкрементирование элементов массива-счётчика
Ответ Создать тему
Опции темы

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