Как узнать, сколько раз конкретный элемент повторяется в массиве?

Я создал массив из 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);
}

Что делает if (bucket[10]==1) своими словами? Почему x не используется в цикле? Почему каждое условие цикла отличается (i<10 от x<=10)? Почему entropy_calculator ничего не возвращает? Почему i является глобальной переменной? Какие предупреждения выдает вам ваш компилятор?

Oka 22.04.2022 20:57

извините за такой некачественный код, я действительно борюсь, так как я студент 1-го курса

Ahmet Caner Karaca 22.04.2022 21:33

Поскольку числа находятся в диапазоне [1..10], почему бы не использовать array [11] подсчет по числам как индексу?

जलजनक 22.04.2022 21:50

Рассмотрите возможность использования массива colors[6] вместо countcolor1 до 6. Тогда ваше тело цикла станет простым colors[bucket[x] - 1]++;

Allan Wind 22.04.2022 22:34

@AhmetCanerKaraca, не сожалей и не расстраивайся. Мы все начали, ничего не зная. Иногда мы задаем вам вопросы, чтобы помочь вам подумать о проблеме. Мы делаем это, потому что думаем, что это поможет вам больше, чем просто дать вам ответ.

Allan Wind 22.04.2022 22:42

@AhmetCanerKaraca Пожалуйста, дайте мне знать, полезен мой ответ или нет!

oda 23.04.2022 14:18

большое спасибо @oda, ваш ответ очень полезен!

Ahmet Caner Karaca 23.04.2022 16:43

@AhmetCanerKaraca Рад, что могу помочь! Пожалуйста, примите мой ответ (щелкнув галочку рядом с сообщением) и/или проголосуйте за него (щелкнув стрелку вверх рядом с сообщением), если он решит вашу проблему. Это совершенно необязательно, иначе любовь не будет потеряна!

oda 23.04.2022 17:05
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
8
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Примечания к вашему коду

  • Тип возврата entropy_calculatordouble, но вы ничего не возвращаете. Если вы не хотите ничего возвращать, установите тип возврата void.

  • В main вы пытаетесь присвоить возвращаемое значение entropy_calculatorint с именем 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.

Решение

Я предполагаю, что ваша задача состоит в том, чтобы

  • сгенерировать 10 случайных целых чисел в [1, 10] и сохранить их в массиве int, скажем, bucket.
  • создайте функцию, которая принимает в качестве аргумента массив из 10 ints (то есть указатель на int) и печатает количество вхождений 1s, 2s, ..., 10s в массиве.

Чтобы сделать программу немного более общей, мы определяем макрос MAX_LEN и заставляем его представлять число 10.

В main сначала мы инициализируем генератор случайных чисел, установив начальное значение на текущее время. Во-вторых, мы определяем массив MAX_LENint с именем bucket. В-третьих, мы заполняем каждый элемент bucket псевдослучайным целым числом из [1, MAX_LEN]. Наконец, мы вызываем функциюentropy_calculator, передавая bucket в качестве единственного аргумента, а затем return 0.

В функции entropy_calculator мы определяем массив MAX_LENint с именем 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 представляет количество случайно сгенерированных ns для 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];

Charandeep Kumar 23.04.2022 13:54

Сбрасывать код без объяснения причин бесполезно. Кроме того, ваш код неверен: вы должны сравнивать bucket[x] вместо bucket[9]. Также удалите глобальную переменную i и измените тип возвращаемого значения entropy_calculator на void.

chqrlie 23.04.2022 15:18

Другие вопросы по теме