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

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

Войти
Регистрация
Восстановить пароль
 
kalonord
28 / 28 / 4
Регистрация: 27.01.2014
Сообщений: 785
#1

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

05.01.2016, 20:58. Просмотров 246. Ответов 4
Метки нет (Все метки)

Здравствуйте.

К примеру, есть массив:
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-ы сделать, но как-то громоздко, как мне кажется. Есть другие варианты?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2016, 20:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инкрементирование элементов массива-счётчика (C++):

Как работает инкрементирование указателя? - C++
#include &lt;iostream&gt; #include &lt;cctype&gt; using namespace std; int main(){ char *p; char str=&quot;This Is A Test&quot;; cout &lt;&lt; &quot;исходная...

Подскажите как создать конструктор класса в котором производится инкрементирование статической переменной! - C++
Ребят Всем Добрых Суток!!! Запнулся на создании перегруженного конструктора, компилятор ни как не хочет принимать мой класс - ругается на...

Обновление счётчика при записи в файл - C++
Товарищи форумчане! Бросаю Вам флаг помощи. Проблема такого плана: ведётся запись массива структур в файл. В начале файла записывается...

Тип переменной для счётчика цикла - C++
Нужна переменная для счётика цикла for примерно байт на 8. В том году находил тип такой переменной, а щас не могу найти. long и long...

В одномерном массиве, состоящем из n вещественных элементов вычислить минимальный элемент массива и сумму элементов массива. [CPP] - C++
В одномерном массиве, состоящем из n вещественных элементов вычислить минимальный элемент массива и сумму элементов массива, расположенных...

Записать положительные элементы массива X подряд в массив Y. Определить k – количество положительных элементов. Вычислит сумму элементов массива Y - C++
Записать положительные элементы массива X=(x1,x2,…, xn) подряд в массив Y=(y1,y2,…, yk). Определить k – количество положительных...

4
Горелый
70 / 44 / 11
Регистрация: 20.03.2014
Сообщений: 186
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. выводим диапазон и счётчик
1
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 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 )
Не уверен на счет работоспособности, так что пробуйте запустить у себя
1
Горелый
70 / 44 / 11
Регистрация: 20.03.2014
Сообщений: 186
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;
}
1
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 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;
 
}
1
05.01.2016, 21:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2016, 21:45
Привет! Вот еще темы с ответами:

Вычислить количество положительных элементов массива и сумму элементов массива, расположенных после последнего элемента, равного нулю - C++
В одномерном массиве, состоящем из n вещественных элементов, вычислить: количество положительных элементов массива; сумму элементов...

В одномерном массиве, состоящем из n целых элементов, 1) номер максимального элемента массива; 2) произведение элементов массива, расположенных между - C++
Помогите исправить программу Задание: В одномерном массиве, состоящем из n целых элементов, 1) номер максимального элемента...

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

Определить кол-во элементов массива, которые больше среднеарифметического значения всех элементов массива - C++
Сделать программу, к-рая случайно заполняет массив А (n&lt;30) целыми значениями. Определить кол-во элементов массива, которые больше...


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

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

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