Почему я получаю сообщение об ошибке при записи значений в массив? - PullRequest
0 голосов
/ 27 ноября 2011

Я пытаюсь определить, почему запись случайных значений в массив вызывает проблемы.

Я на самом деле прошу r and() сгенерировать числа от 1 до 10 (rand() %10 +1, с srand(time(NULL)) перед), и первое значение ВСЕГДА больше 10: это тоже случайное значение, между 10 и 20. I на самом деле не знаю, как это исправить, так как похоже на проблему с функциями rand и srand. Тем не менее это мой код:

Редактировать: правильный код, теперь

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZEA 100
#define SIZEFREQ 10

int main()
{
    int a[SIZEA]={0},frequency[SIZEFREQ]={0};
    int i,temp,gothrough;

    srand(time(NULL));

    for(i=0;i<=SIZEA-1;i++)
    {
        a[i]=rand() %10 +1;
        ++frequency[a[i]-1];
    }

    printf("These are the elements in the vector:\n");
    for(i=0;i<=SIZEA-1;i++)
    {
        printf("%3d,",a[i]);
    }

    printf("\nLet's try to put them in order\n");
    for(gothrough=0;gothrough<=SIZEA-1;gothrough++)
    {
        for(i=0;i<=SIZEA-2;i++)
    {
        if (a[i]>a[i+1])
        {
            temp=a[i];
            a[i]=a[i+1];
            a[i+1]=temp;
        }
    }
}

for(i=0;i<=SIZEA-1;i++)
{
    printf("%3d,",a[i]);
}

printf("\n\nValue Frequency\n");
for(i=0;i<=SIZEFREQ-1;i++)
{
    printf("%5d%10d\n",i+1,frequency[i]);
}

return 0;
}`

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

Причина проста.

a[i] находится между 1 и 10 и, следовательно, когда вы пишете:

++frequency[a[i]+1];

Вы заполняете индексы от 2 до 11 из frequency. Однако frequency имеет только индексы от 0 до 10. Поэтому вы перебираете массив frequency и в массив a и записываете a[0]. Это случается, когда a[i] равно 10. Поскольку при 100 числах есть 10% -ный шанс, что вы получите 10, вы увеличиваете a[0] (увеличивая frequency[11]) примерно в 10 раз. Поскольку первое значение также было в диапазоне от 1 до 10, конечное значение составляет от 10 до 20.

Редактировать: По той же причине, по которой вы индексируете a от 0 до SIZE-1, вы также должны индексировать frequency от 0 до 10. Что вы делаете, это создаете индексы от 1 до 10, и также +1 их! Например это здесь:

for(i=1;i<=10;i++)
    printf("%5d%10d\n",i,frequency[i+1]);

должно быть

for(i=0;i<10;i++)
    printf("%5d%10d\n",i,frequency[i]);

Обратите внимание, что начиная с 0, не до 10, и индексируя frequency на i вместо i+1

В качестве альтернативы, вы могли бы иметь

for(i=1;i<=10;i++)
    printf("%5d%10d\n",i,frequency[i-1]);

, который индексирует frequency на i-1, чтобы сделать индекс правильным.

0 голосов
/ 27 ноября 2011

Я скомпилировал ваш код, и он генерирует от 1 до 10. НЕТ никакого способа преодолеть диапазон 0-9 (или 1 - 10 с +1) с использованием %, поскольку, как только он достигнет 10,это будет означать, что / будет на 1 больше И по модулю придется начинать заново с 0. РЕДАКТИРОВАТЬ: Вы не можете разделить 30 на 10 и сказать, что это 2 с остатком 10, так как этот остаток будет переводиться в +1 из10-е, то есть 30, деленное на 10 = 3 и остаток 0.

...