Я не мог справиться, чтобы написать гистограмму - PullRequest
0 голосов
/ 04 ноября 2019

Моя цель - создать гистограмму для повторяющихся чисел. Код работает хорошо, пока частота не станет больше 2.

Я думаю, я знаю, что не так с кодом (строка 9), но я не могу найти алгоритм для его решения. У меня проблема в том, что когда он пишет гистограмму, он разделяет и затем собирает ее снова.

Мой ввод:

5
5 6 6 6 7

Вывод:

6:2 6:2 6:3

номне нужен вывод

6:3

Я вижу проблему, но не могу ее решить.

#include <stdio.h>

int main(){

    int array[25];
    int i, j, num, count = 1;

    scanf("%d", &num);

    for (i = 0; i < num; i++) {
        scanf("%d", &array[i]);
        for (j = 0; j < i ; j++) {
            if (array [i] == array[j]) {
                count++;
                printf("%d:%d ", array[i], count);
              }
        }
        array [i] = array[j];

        count = 1;
    }

    return 0;
}

1 Ответ

1 голос
/ 04 ноября 2019

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

Вам необходимо получить все значения, прежде чем вы сможете сообщить о любых подсчетах. Затем для каждого значения в массиве проверьте, не произошло ли это значение раньше, и, если нет, выполните итерацию всего массива для подсчета вхождений:

#include <stdio.h>
#include <stdbool.h>

int main()
{
    // Get number of values
    int num = 0 ;
    scanf("%d", &num);

    // Get all values
    int array[25];
    for( int i = 0; i < num; i++) 
    {
        scanf("%d", &array[i]);
    }

    // For each value in array...
    for( int i = 0; i < num ; i++) 
    {
        // Check value not already counted
        bool counted = false ;
        for( int j = 0; !counted && j < i; j++ )
        {
            counted = array[j] == array[i] ;
        }

        // If current value has not previously been counted...
        if( !counted )
        {
            // Count occurnaces
            int count = 0 ;
            for( int j = 0; j < num; j++ )
            {
                if( array[j] == array[i] )
                {
                    count++ ;
                }
            }

            // Report
            printf("%d:%d ", array[i], count);
        }
    }

    return 0;
}

Для вашего примера ввода результат:

5                                                                                                                                              
5 6 6 6 7                                                                                                                                      
5:1 6:3 7:1  

Можно объединить две внутренние петли, выполняя оценку counted и count:

    // Count occurrences of current value, 
    bool counted = false ;
    int count = 0 ;
    for( int j = 0; !counted && j < num; j++ )
    {
        if( array[j] == array[i] )
        {
            count++;

            // Discard count if value occurs earlier - already counted
            counted = j < i ;
        }
    }

    // If current value has not previously been counted...
    if( !counted )
    {
        // Report
        printf("%d:%d ", array[i], count);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...