67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
1

Массивы: функция rand() и размер массива. Совместимости

23.02.2016, 22:57. Показов 4533. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте уважаемые программисты! Всех с праздником!)
В общем переписываю одну и ту же программу который раз, ну чуть модифицирую, и сталкиваюсь с одной и той же проблемой, программа по поиску всех наиболее повторяющихся чисел в массиве. А проблема в том, что если я забиваю размер массива случайными числами как a[i]=rand()%10; то все работает отлично, а если я поставлю что-то типа a[i]=rand()%100; получается какая-то бяка, проблема я так понял с рандомом и размером самого массива? Подскажите пожалуйста что у меня не так, и чтоб я мог ставить любой размер массива и любые коэффициенты чисел на рандом и все работало корректно!

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
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<ctime>
 
void print(const int [], int);//функция вывода
void mode(const int [], int);//функция нахождения наиболее часто встречаемых значений в массиве
void randMassive(int [], int);//функция заполнения массива случайными числами
void sort(int [], int);//функция сортировки массива
 
int main()
{
    setlocale(LC_ALL, "Russian");
    system("mode con cols=100 lines=70");
    srand(time(0));
//-----------------------------------------
    const int arraySize=10;
    int a[arraySize]={0};
//----------------------------------------------------------------------
    randMassive(a, arraySize);//заполняем массив случайными числами
    print(a, arraySize);//вывод массива
    sort(a, arraySize);//сортировка массива
    print(a, arraySize);//вывод массива
    mode(a, arraySize);//нахождение моды
//----------------------------------------------------------------------
    return 0;
}
void randMassive(int a[], int size)//функция заполнения массива случайными числами
{
    for(int i=0; i<size; i++)
    {
        a[i]=rand()%10;
    }
}
 
void mode(const int a[], int size)
{
    int largest=0;
    int mode=0;
    int counter=0;
    int emptyArray[size]={0};
    //-------------------------------------------------------------------
    for(int rating=0; rating<size; rating++)//обнуление массива
    {
        std::cout<<emptyArray[rating]<<" ";
    }
    std::cout<<std::endl;
    for(int i=0; i<size; i++)//подсчет кол-ва повторений чисел в массиве
    {
        emptyArray[a[i]]++;
        std::cout<<emptyArray[a[i]]<<" ";
    }
    std::cout<<std::endl<<"---------------------------"<<std::endl;
    for(int rating=0; rating<size; rating++)//поиск одного наиболее частого повторения значения
    {
        std::cout<<rating<<" - "<<emptyArray[rating]<<std::endl;
        if(emptyArray[rating]>largest){
            largest=emptyArray[rating];
            mode=rating;
            }
    }
    std::cout<<"Наиболее часто встречающиеся значения(числа): ";
    for(int rating=0; rating<size; rating++)//поиск всех наиболее часто повторяемых значений
    {
        if(emptyArray[rating]==largest){
            counter=rating;
            std::cout<<"["<<counter<<"]";
            }
    }
    std::cout<<std::endl;
             std::cout<<"повторы "<<largest<<" раз(а)"<<std::endl;
}   
void sort(int a[], int size)
{
    int hold=0;
    for(int pass=1; pass<size; pass++){
        for(int j=0; j<size; j++)
        if(a[j]>a[j+1]){
            hold=a[j];
            a[j]=a[j+1];
            a[j+1]=hold;}}
            
}
void print(const int a[], int size)
{
    for(int i=0; i<size; i++)
    std::cout<<a[i]<<" ";
    std::cout<<std::endl;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2016, 22:57
Ответы с готовыми решениями:

Функция с применением динамического массива, чтобы размер массива увеличивался по мере необходимости
Ребята, подскажите, кто может, каким образом создать функцию с применением динамического массива,...

Функция, которая удаляет из целочисленного одномерного массива все, и возвращает новый размер массива
Разработать и испытать функцию, которая удаляет из целочисленного одномерного массива все, и...

Массивы: Если размер массива неизвестен
Здравствуйте уважаемые программисты! Объясните пожалуйста, как правильно(по стандартам С++)...

Заменить статические массивы на динамические; размер массива запрашивать у пользователя
#include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; const int n=10; int first, last;...

26
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.02.2016, 23:22 2
Цитата Сообщение от vikiroy Посмотреть сообщение
получается какая-то бяка,
И как она выглядит?
Цитата Сообщение от vikiroy Посмотреть сообщение
проблема я так понял с рандомом и размером самого массива?
Маловероятно. Среда какая, что такое компилируется?
0
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
23.02.2016, 23:29  [ТС] 3
Бяка в том что неправильно считает после этого, а среда dev c++ но среда точно не причем...
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.02.2016, 23:35 4
Цитата Сообщение от vikiroy Посмотреть сообщение
а среда dev c++ но среда точно не причем...
Я вот об этом:
Цитата Сообщение от vikiroy Посмотреть сообщение
int emptyArray[size]={0};
Нестандарт, однако...
Цитата Сообщение от vikiroy Посмотреть сообщение
Бяка в том что неправильно считает после этого
Скорее всего, код кривой, вот и считает неправильно, rand()%100 здесь ни при чём.
0
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
23.02.2016, 23:39  [ТС] 5
int emptyArray[size]={0};
Не стандартно однако
Да как это не стандартно??? обычная инициализация массива в ноль...

Добавлено через 1 минуту
ничего кривого в этом не вижу...
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.02.2016, 23:42 6
Цитата Сообщение от vikiroy Посмотреть сообщение
Да как это не стандартно???
По стандарту, размер массива - константное выражение. Нестандартное расширение компилятора (mingw) позволяет такое компилировать.

Добавлено через 55 секунд
Цитата Сообщение от vikiroy Посмотреть сообщение
ничего кривого в этом не вижу...
Я не эту кривизну имел в виду.
0
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
23.02.2016, 23:55  [ТС] 7
По стандарту, размер массива - константное выражение. Нестандартное расширение компилятора (mingw) позволяет такое компилировать.
Ну вообще да! Вы правы!) Т.е. типа от этого плясать по-ходу скорее всего?

Добавлено через 1 минуту
Я не эту кривизну имел ввиду.
Подскажите пожалуйста что кривое в коде, я очень хочу писать хорошие программы!!!

Добавлено через 5 минут
Вы говорите по стандарту размер массива константный, ну вообще-то он не меняется у меня, он остается константным, а именно 10, а какие числа в него входят это уже не размер

Добавлено через 2 минуты
ведь разница какая? что я так напишу
C++
1
2
3
4
const int arraySize=10;
    int a[arraySize]={0};
..................................
        a[i]=rand()%10;
что так
C++
1
2
3
4
const int arraySize=10;
    int a[arraySize]={0};
..................................
        a[i]=rand()%100;
Добавлено через 1 минуту
в первом случае работает, а во втором фигню выдает, еще и коэффициент некоторых чисел не различает...

Добавлено через 45 секунд
а должен работать в обоих случаях...
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.02.2016, 23:58 8
Цитата Сообщение от vikiroy Посмотреть сообщение
что кривое в коде,
Пока вижу, что sort() криво работает.
Цитата Сообщение от vikiroy Посмотреть сообщение
Вы говорите по стандарту размер массива константный, ну вообще-то он не меняется у меня,
Константное выражение - значение известно на этапе компиляции, изменить его нельзя. А у тебя переменная size, которой можно любое значение задать.

Добавлено через 1 минуту
Цитата Сообщение от vikiroy Посмотреть сообщение
в первом случае работает,
У меня и в первом не работает, исключение выбрасывает.
0
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
24.02.2016, 00:04  [ТС] 9
Пока вижу, что sort() криво работает.
C++
1
2
3
4
5
6
7
8
9
10
11
void sort(int a[], int size)
{
    int hold=0;
    for(int pass=1; pass<size; pass++){
        for(int j=0; j<size-1; j++)
        if(a[j]>a[j+1]){
            hold=a[j];
            a[j]=a[j+1];
            a[j+1]=hold;}}
            
}
вроде исправил...спасибо

Добавлено через 2 минуты
У меня и в первом не работает, исключение выбрасывает.
странно...а у меня работает на ура!

Добавлено через 1 минуту
не может быть чтоб не работал...
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
24.02.2016, 00:04 10
Вот здесь у тебя обращение по индексу, который хранится в массиве a:
C++
1
emptyArray[a[i]]++;
Значит размер emptyArray должен быть не меньше, что число, на которое ты делишь rand().
0
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
24.02.2016, 00:12  [ТС] 11
Значит размер emptyArray должен быть не меньше, что число, на которое ты делишь rand().
Все, я кажется понял) если только в этом проблема, можно что-нибудь придумать...Спасибо! Большое!

Добавлено через 3 минуты
это мне типа нужно дополнительный массив инициализировать который будет поддерживать размер 10 если мне нужно только десять чисел, а основной могу потом ставить на сколько хочу, я правильно понял?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
24.02.2016, 00:12 12
Лучший ответ Сообщение было отмечено vikiroy как решение

Решение

Цитата Сообщение от vikiroy Посмотреть сообщение
если только в этом проблема,
Может и не только, но одна, из возможных ошибок, здесь.
1
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
24.02.2016, 21:13  [ТС] 13
Спасибо! буду исправлять хотя-бы этот случай, а дальше посмотрим!

Добавлено через 20 часов 54 минуты
Доработал код! Заливаю рабочую версию программы, где можно ставить любое значение размера массива и любой диапазон данных в массиве. Работает со случайными числами. Размер массива и диапазон значений указывается в константных глобальных переменных. Спасибо за помощь!!!

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
96
97
98
99
100
101
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<ctime>
 
const int additionalArraySize=100;//диапазон значений массива 
const int arraySize=1000;//размер массива
int N=0;
 
void print(const int [], int);
void mode(const int [], int);
void randMassive(int [], int);
void sort(int [], int);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    system("mode con cols=100 lines=50");
    srand(time(0));
//-----------------------------------------
    int a[arraySize]={0};
//----------------------------------------------------------------------
    randMassive(a, arraySize);//заполняем массив случайными числами
    print(a, arraySize);//вывод массива
    sort(a, arraySize);//сортировка массива
    print(a, arraySize);//вывод массива
    mode(a, arraySize);//поиск значений
//----------------------------------------------------------------------
    return 0;
}
void randMassive(int a[], int size)//функция заполнения массива случайными числами
{
    for(int i=0; i<size; i++)
    {
        a[i]=rand()%additionalArraySize;
    }
}
 
void mode(const int a[], int size)
{
    int largest=0;
    int mode=0;
    int counter=0;
 
    if(additionalArraySize>=size){
    N=additionalArraySize;
    }
    if(additionalArraySize<=size){
    N=size;
    }
    int emptyArray[N]={0};
//--------------------------------------------------------------------------------------------
    for(int rating=0; rating<size; rating++)//дополнительный массив с нулевыми значениями
    {
        std::cout<<emptyArray[rating]<<" ";
    }
    std::cout<<std::endl<<std::endl;
    for(int i=0; i<size; i++)//подсчет кол-ва повторений чисел в массиве
    {
        emptyArray[a[i]]++;
        std::cout<<emptyArray[a[i]]<<" ";
    }
    std::cout<<std::endl<<std::endl;
    for(int rating=0; rating<additionalArraySize; rating++)//поиск одного наиболее частого повторения значения
    {
        std::cout<<rating<<" - "<<emptyArray[rating]<<"|";
        if(rating%10==0)
        std::cout<<std::endl;
        if(emptyArray[rating]>largest){
            largest=emptyArray[rating];
            mode=rating;
            }
    }
    std::cout<<std::endl<<std::endl<<"Наиболее часто встречающиеся значения(числа): ";
    for(int rating=0; rating<additionalArraySize; rating++)//поиск всех наиболее часто повторяемых значений
    {
        if(emptyArray[rating]==largest){
            counter=rating;
            std::cout<<"["<<counter<<"]";
            }
    }
    std::cout<<std::endl;
             std::cout<<"повторы "<<largest<<" раз(а)"<<std::endl;
}   
void sort(int a[], int size)//сортировка массива
{
    int hold=0;
    for(int pass=1; pass<size; pass++){
        for(int j=0; j<size-1; j++)
        if(a[j]>a[j+1]){
            hold=a[j];
            a[j]=a[j+1];
            a[j+1]=hold;}}
            
}
void print(const int a[], int size)//вывод массива
{
    for(int i=0; i<size; i++)
    std::cout<<a[i]<<" ";
    std::cout<<std::endl<<std::endl;
}
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
25.02.2016, 02:06 14
Опять:
Цитата Сообщение от vikiroy Посмотреть сообщение
int emptyArray[N]={0};
Цитата Сообщение от nd2 Посмотреть сообщение
Нестандарт, однако...
0
Вездепух
Эксперт CЭксперт С++
11721 / 6400 / 1725
Регистрация: 18.10.2014
Сообщений: 16,135
25.02.2016, 02:24 15
Цитата Сообщение от nd2 Посмотреть сообщение
Нестандарт, однако...
Ну, справедливости ради надо заметить, что в С++, начиная с версии С++14, уже не требуется константности размеров массивов. Локальные массивы в С++14 могут иметь runtime размер. При этом спецификация arrays of runtime bound в С++14 существенно отличается от спецификации VLA в С.

С точки зрения современного С++ нет никакой ошибки в

C++
1
int emptyArray[size]={0};
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
25.02.2016, 02:53 16
Лучший ответ Сообщение было отмечено vikiroy как решение

Решение

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
96
const int additionalArraySize=100;//диапазон значений массива 
const int arraySize=20;//размер массива
//int N=0;
 
void print(const int [], int);
void mode(const int [], int);
void randMassive(int [], int);
void sort(int [], int);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    system("mode con cols=100 lines=50");
    srand(time(0));
//-----------------------------------------
    int a[arraySize]={0};
//----------------------------------------------------------------------
    randMassive(a, arraySize);//заполняем массив случайными числами
    print(a, arraySize);//вывод массива
    sort(a, arraySize);//сортировка массива
    print(a, arraySize);//вывод массива
    mode(a, arraySize);//поиск значений
//----------------------------------------------------------------------
    return 0;
}
void randMassive(int a[], int size)//функция заполнения массива случайными числами
{
    for(int i=0; i<size; i++)
    {
        a[i]=rand()%additionalArraySize;
    }
}
 
void mode(const int a[], int size)
{
    int largest=0;
    int mode=0;
    int counter=0;
 
    /*if(additionalArraySize>=size){
    N=additionalArraySize;
    }
    if(additionalArraySize<=size){
    N=size;
    }*/
    int emptyArray[additionalArraySize]={0};
//--------------------------------------------------------------------------------------------
    for(int rating=0; rating<additionalArraySize; rating++)//дополнительный массив с нулевыми значениями
    {
        std::cout<<emptyArray[rating]<<" ";
    }
    std::cout<<std::endl<<std::endl;
    for(int i=0; i<size; i++)//подсчет кол-ва повторений чисел в массиве
    {
        emptyArray[a[i]]++;
        std::cout<<emptyArray[a[i]]<<" ";
    }
    std::cout<<std::endl<<std::endl;
    for(int rating=0; rating<additionalArraySize; rating++)//поиск одного наиболее частого повторения значения
    {
        std::cout<<rating<<" - "<<emptyArray[rating]<<"|";
        if(rating%10==0)
        std::cout<<std::endl;
        if(emptyArray[rating]>largest){
            largest=emptyArray[rating];
            mode=rating;
            }
    }
    std::cout<<std::endl<<std::endl<<"Наиболее часто встречающиеся значения(числа): ";
    for(int rating=0; rating<additionalArraySize; rating++)//поиск всех наиболее часто повторяемых значений
    {
        if(emptyArray[rating]==largest){
            counter=rating;
            std::cout<<"["<<counter<<"]";
            }
    }
    std::cout<<std::endl;
             std::cout<<"повторы "<<largest<<" раз(а)"<<std::endl;
}   
void sort(int a[], int size)//сортировка массива
{
    int hold=0;
    for(int pass=1; pass<size; pass++){
        for(int j=0; j<size-1; j++)
        if(a[j]>a[j+1]){
            hold=a[j];
            a[j]=a[j+1];
            a[j+1]=hold;}}
            
}
void print(const int a[], int size)//вывод массива
{
    for(int i=0; i<size; i++)
    std::cout<<a[i]<<" ";
    std::cout<<std::endl<<std::endl;
}
Добавлено через 24 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
arrays of runtime bound в С++14
Почему я этого в черновике N3797 не нахожу?
1
Вездепух
Эксперт CЭксперт С++
11721 / 6400 / 1725
Регистрация: 18.10.2014
Сообщений: 16,135
25.02.2016, 03:05 17
Цитата Сообщение от nd2 Посмотреть сообщение
Почему я этого в черновике N3797 не нахожу?
Похоже, мои сведения устарели. Я, ничего не подозревая, пялился в N3690. А к N3797 их уже выкосили нафиг. Тогда да, согласен. Нестандарт.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
25.02.2016, 03:09 18
Понятно.
0
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
25.02.2016, 16:26  [ТС] 19
Не стандарт однако...
блин...до меня теперь только дошло)))

Добавлено через 8 минут
если я хочу к примеру такое выражение int emptyArray[size]={0}; то мне функцию написать нужно так:
C++
1
void mode(const int a[], const int size)
либо тоже самое можно сделать определив сначала какую-то константу в данном случае
C++
1
const int additionalArraySize=100;
и потом можно использовать эту константу как размер int emptyArray[additionalArraySize]={0};
в общем все что ни делается с массивом по стандарту рамер всегда должен быть константой? Правильно я понял?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
25.02.2016, 16:36 20
Цитата Сообщение от vikiroy Посмотреть сообщение
либо тоже самое можно сделать определив сначала какую-то константу в данном случае
Это не тоже самое: то (const int size), что передаётся через параметры функции, не есть константное выражение.
Цитата Сообщение от vikiroy Посмотреть сообщение
const int additionalArraySize=100; // константное выражение
0
25.02.2016, 16:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2016, 16:36
Помогаю со студенческими работами здесь

Задача.Массивы.rand.
Всем привет! Учусь на 1 курсе, делаю лабараторные работы.с++ Задача: Дана матрица f из целых малых...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru