Я создал массив из 10 целых чисел. Мне нужно найти, сколько раз повторялся элемент, но я всегда получаю 0
в качестве результата. Здесь, в этом коде, переменные countcolor
— это мои значения счетчика. Например, countcolor1
— это мое значение счетчика для целого числа 1
. Вот что у меня есть до сих пор:
#include <stdio.h>
#include <time.h>
int i;
double entropy_calculator(int bucket[10]);
int main() {
srand(time(NULL));
int countings;
int bucket[10];
for (i = 0; i < 10; ++i) {
bucket[i] = 1 + rand() % 10;
printf("%d \n", bucket[i]);
}
countings = entropy_calculator(bucket);
return 0;
}
double entropy_calculator(int bucket[10]) {
int x;
int countcolor1 = 0, countcolor2 = 0, countcolor3 = 0,
countcolor4 = 0, countcolor5 = 0, countcolor6 = 0;
for (x = 0; x <= 10; ++x) {
if (bucket[10] == 1)
countcolor1++;
if (bucket[10] == 2)
countcolor2++;
if (bucket[10] == 3)
countcolor3++;
if (bucket[10] == 4)
countcolor4++;
if (bucket[10] == 5)
countcolor5++;
if (bucket[10] == 6)
countcolor6++;
}
printf("%d,%d,%d,%d,%d,%d",
countcolor1, countcolor2, countcolor3,
countcolor4, countcolor5, countcolor6);
}
извините за такой некачественный код, я действительно борюсь, так как я студент 1-го курса
Поскольку числа находятся в диапазоне [1..10]
, почему бы не использовать array [11]
подсчет по числам как индексу?
Рассмотрите возможность использования массива colors[6]
вместо countcolor1 до 6. Тогда ваше тело цикла станет простым colors[bucket[x] - 1]++;
@AhmetCanerKaraca, не сожалей и не расстраивайся. Мы все начали, ничего не зная. Иногда мы задаем вам вопросы, чтобы помочь вам подумать о проблеме. Мы делаем это, потому что думаем, что это поможет вам больше, чем просто дать вам ответ.
@AhmetCanerKaraca Пожалуйста, дайте мне знать, полезен мой ответ или нет!
большое спасибо @oda, ваш ответ очень полезен!
@AhmetCanerKaraca Рад, что могу помочь! Пожалуйста, примите мой ответ (щелкнув галочку рядом с сообщением) и/или проголосуйте за него (щелкнув стрелку вверх рядом с сообщением), если он решит вашу проблему. Это совершенно необязательно, иначе любовь не будет потеряна!
Примечания к вашему коду
Тип возврата entropy_calculator
— double
, но вы ничего не возвращаете. Если вы не хотите ничего возвращать, установите тип возврата void
.
В main
вы пытаетесь присвоить возвращаемое значение entropy_calculator
int
с именем countings
. Если вы собираетесь вернуть какое-то значение double
, countings
должно быть double
.
Неопределенное поведение. Согласно стандарту C, поведение программы не определено, если индекс массива выходит за допустимые пределы. bucket
— это массив из 10 целых чисел. Допустимые индексы массива с N
элементами обычно 0, 1, 2, ..., N - 1
; другими словами, первому элементу присваивается индекс 0
, второму элементу присваивается индекс 1
, ..., N
-му элементу присваивается индекс N - 1
. Таким образом, допустимыми индексами в массиве bucket
являются любые целые числа в замкнутом интервале [0, 10 - 1] = [0, 9]
. В вашей функции entropy_calculator
вы пытаетесь получить доступ к элементу bucket
с индексом 10
; единственные действительные индексы - один из 0, 1, ..., 9
.
Предположим, что в entropy_calculator
мы заменили все 10 на 9, чтобы цикл начинался с x = 0
, x = 1
, .. . , x = 9
и проверки вида ([bucket[10] == j)
для некоторых j
в [1, 6]
заменяются на ([bucket[9] == j)
. Все эти шесть проверок просто проверяют, является ли 10-й элемент bucket
одним из 1, 2, ... или 6. Вы проигнорировали остальные 9 случайно сгенерированных чисел в bucket
, поэтому вы никогда не вовлекаете их в подсчет. Вы также игнорируете другие возможные случайно сгенерированные значения, а именно 7, 8, 9 и 10, поскольку в настоящее время вы сравниваете только 10-й элемент bucket
с 1, 2, ... и 6.
Решение
Я предполагаю, что ваша задача состоит в том, чтобы
[1, 10]
и сохранить их в массиве int
, скажем, bucket
.int
s (то есть указатель на int
) и печатает количество вхождений 1
s, 2
s, ..., 10
s в массиве.Чтобы сделать программу немного более общей, мы определяем макрос MAX_LEN
и заставляем его представлять число 10.
В main
сначала мы инициализируем генератор случайных чисел, установив начальное значение на текущее время. Во-вторых, мы определяем массив MAX_LEN
int
с именем bucket
. В-третьих, мы заполняем каждый элемент bucket
псевдослучайным целым числом из [1, MAX_LEN]
. Наконец, мы вызываем функциюentropy_calculator
, передавая bucket
в качестве единственного аргумента, а затем return 0
.
В функции entropy_calculator
мы определяем массив MAX_LEN
int
с именем counts
, где каждый элемент инициализируется нулем. Мы создаем собственный внутреннее отображение таким образом, чтобы n
-й элемент counts
представлял количество n
, найденных в bucket
, для каждого n
в {1, 2, ..., MAX_LEN}
. Эквивалентно, для каждого n
в {1, 2, ..., MAX_LEN}
количество n
, найденных в ведре, представлено элементом counts
с индексом n - 1
. Затем мы перебираем элементы массива bucket
и, используя наше сопоставление, увеличиваем соответствующий элемент в массиве counts
. Затем мы распечатываем все элементы counts
.
i
в наборе допустимых индексов массивов в нашей программе, т. е. {0, 1, ..., MAX_LEN - 1}
, если мы обнаружим, что bucket[i]
равно 5
, то мы хотим увеличить 5
-й элемент counts
(поскольку n
-й элемент counts
считает количество сгенерированных n
), что равно counts[5 - 1]
или, в более общем смысле, counts[bucket[i] - 1]
.Программа
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_LEN 10
void entropy_calculator(int bucket[]);
int main(void) {
/* initialize random number generator */
srand((unsigned) time(NULL));
/* will contain MAX_LEN random ints in [1, MAX_LEN] */
int bucket[MAX_LEN];
/* generate pseudo-random ints in [1, MAX_LEN], storing them in bucket */
for (int i = 0; i < MAX_LEN; i++) {
bucket[i] = 1 + rand() % MAX_LEN;
printf("%d\n", bucket[i]);
}
entropy_calculator(bucket);
return 0;
}
/****************************************************************************
* entropy_calculator: given an array of MAX_LEN integers in [1, MAX_LEN], * *
* prints the number of occurrences of each integer in *
* [1, MAX_LEN] in the supplied array *
****************************************************************************/
void entropy_calculator(int bucket[]) {
int counts[MAX_LEN] = {0}; /* initialize counts to all 0s */
int i; /* loop variable */
for (i = 0; i < MAX_LEN; i++)
counts[bucket[i] - 1]++;
/* printing all elements of counts */
for (i = 0; i < MAX_LEN; i++) {
if (i % 4 == 0) printf("\n");
printf(" %2d*: %d", i + 1, counts[i]);
}
printf("\n");
}
Пример сеанса
3
9
2
6
10
9
3
8
3
1
1*: 1 2*: 1 3*: 3 4*: 0
5*: 0 6*: 1 7*: 0 8*: 1
9*: 2 10*: 1
Упрощенная версия
Если задача состоит в том, чтобы просто сгенерировать MAX_LEN
(макрос, представляющий значение 10) случайных целых чисел в [1, MAX_LEN]
и подсчитать, сколько 1s, 2s, ..., (MAX_LEN - 1), MAX_LENs
сгенерировано, то это можно просто сделать следующим образом.
Мы создаем массив MAX_LEN
целых чисел, называемый counts
. Допустимые индексы, связанные с counts
, это 0, 1, ..., MAX_LEN - 1
. Мы формируем наше собственное внутреннее отображение таким образом, что элемент counts
с индексом n - 1
представляет количество случайно сгенерированных n
s для n
в {1, 2, ..., MAX_LEN}
.
Когда мы генерируем случайное целое число в [1, MAX_LEN]
, мы присваиваем его cur
и увеличиваем элемент counts
с индексом cur - 1
, поскольку этот элемент представляет количество вхождений числа cur
.
Программа
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_LEN 10
int main(void) {
srand((unsigned) time(NULL)); /* initialize random number generator */
int counts[MAX_LEN] = {0}; /* initialize counts to all 0s */
int i, cur;
for (i = 0; i < MAX_LEN; i++) {
cur = 1 + rand() % MAX_LEN; /* pseudo-random int in [1, MAX_LEN] */
printf("%d\n", cur);
counts[cur - 1]++;
}
/* printing all elements of counts */
for (i = 0; i < MAX_LEN; i++) {
if (i % 4 == 0) printf("\n");
printf(" %2d*: %d", i + 1, counts[i]);
}
printf("\n");
return 0;
}
Пример сеанса
8
4
6
2
4
1
10
9
2
10
1*: 1 2*: 2 3*: 0 4*: 2
5*: 0 6*: 1 7*: 0 8*: 1
9*: 1 10*: 2
#include<stdio.h>
#include<time.h>
int i;
double entropy_calculator(int bucket[10]);
int main()
{
srand(time(NULL));
int countings;
int bucket[10];
for(i=0; i<10; ++i)
{
bucket[i] = 1 + rand() % 10;
printf("%d ", bucket[i]);
}
printf("\n");
countings = entropy_calculator(bucket);
return 0;
}
double entropy_calculator(int bucket[10])
{
int x;
int countcolor1=0, countcolor2=0, countcolor3=0, countcolor4=0, countcolor5=0, countcolor6=0;
for(x=0; x<10; ++x)
{
if (bucket[9]==1)
countcolor1++;
if (bucket[9]==2)
countcolor2++;
if (bucket[9]==3)
countcolor3++;
if (bucket[9]==4)
countcolor4++;
if (bucket[9]==5)
countcolor5++;
if (bucket[9]==6)
countcolor6++;
}
printf("%d,%d,%d,%d,%d,%d",countcolor1,countcolor2,countcolor3,countcolor4,countcolor5,countcolor6);
}
Вы объявили массив размером 10, а индекс массива основан на 0. Итак, последний элемент не является arr[10]. Это обр[9];
Сбрасывать код без объяснения причин бесполезно. Кроме того, ваш код неверен: вы должны сравнивать bucket[x]
вместо bucket[9]
. Также удалите глобальную переменную i
и измените тип возвращаемого значения entropy_calculator
на void
.
Что делает
if (bucket[10]==1)
своими словами? Почемуx
не используется в цикле? Почему каждое условие цикла отличается (i<10
отx<=10
)? Почемуentropy_calculator
ничего не возвращает? Почемуi
является глобальной переменной? Какие предупреждения выдает вам ваш компилятор?