确定数组中元素的频率

时间:2016-02-21 19:29:44

标签: c

让我们说我有一个颜色数组,其中数组中的数字代表不同的颜色,我试图找出每种颜色出现在该数组中的次数 这是我的代码: 我已经声明了这个函数所需的变量:

我理解这部分,只是创建数组

printf("Enter the color combination , separated by a space:\n");
    for(i = 0; i<slots; i++){
    scanf("%d", &correct[i]);

这一部分做了什么?

    freq[i] = -1; 
    }
for(i=0; i<slots; i++){
count = 1;
    for(j=i+1; j<slots; j++){
        if(correct[i]==correct[j]){
            count++;
            freq[j]=0;
        }
    }

    if(freq[i]!= 0){
        freq[i] = count;
    }
}

printf("Correct combination:\n");
for(i=0;i<slots;i++){
    if(freq[i]!=0)
        printf("The color %d appears %d time(s).\n", correct[i], freq[i]);
}

如果数组正确[] = {3,3,4,2,4,1,3}

输出结果为:

颜色3出现3次。

颜色1出现1次。

颜色2出现1次。

颜色4出现2次。

我只需要逐步解释代码如何工作

1 个答案:

答案 0 :(得分:0)

我会尝试为您解释一下代码。:)

有两个大小相等的数组。

一个数组具有颜色值,例如

int correct[] = {3,3,4,2,4,1,3};

另一个数组称为freq

int freq[sizeof( correct ) / sizeof( *correct )]; 

相当于

int freq[7];

最后一个数组的所有元素最初都设置为-1(freq[i] = -1;

所以它也可以定义为

int freq[7] = { -1, -1, -1, -1, -1, -1, -1 };

然后在这些循环中

for(i=0; i<slots; i++){
count = 1;
    for(j=i+1; j<slots; j++){
        if(correct[i]==correct[j]){
            count++;
            freq[j]=0;
        }
    }

    if(freq[i]!= 0){
        freq[i] = count;
    }
}

可以而且应该像

一样重写
for(i=0; i<slots; i++)
{
    if ( freq[i] == -1 )
    {
        count = 1;
        for(j=i+1; j<slots; j++)
        {
            if(correct[i]==correct[j])
            {
                count++;
                freq[j]=0;
            }
        }

        freq[i] = count;
    }
}

执行以下操作。

例如,对于i = 0,如果在数组的以下元素中找到值正确[0],则数组freq的相应元素被设置为0.

所以最初你有类似

的东西
correct[] = {  3,  3,  4,  2,  4,  1,  3 };
freq[7]   = { -1, -1, -1, -1, -1, -1, -1 };

执行i的内部循环等于0后,你将有

correct[] = {  3,  3,  4,  2,  4,  1,  3 };
freq[7]   = { -1,  0, -1, -1, -1, -1,  0 };
                   ^                   ^

和值正确[0]遇到两次。所以变量count将等于3.它写在数组freq

的第一个元素中

你会得到

correct[] = {  3,  3,  4,  2,  4,  1,  3 };
freq[7]   = {  3,  0, -1, -1, -1, -1,  0 };

然后,对于i等于1,内部循环被跳过(我正在考虑修改后的代码片段,因为我重写了它)。

如果我等于2,你将在执行内循环

之后
correct[] = {  3,  3,  4,  2,  4,  1,  3 };
freq[7]   = {  3,  0, -1, -1,  0, -1,  0 };
                               ^

count等于2,其值将写入数组freq的第三个元素

correct[] = {  3,  3,  4,  2,  4,  1,  3 };
freq[7]   = {  3,  0,  2, -1,  0, -1,  0 };

执行外循环后,您将拥有

correct[] = {  3,  3,  4,  2,  4,  1,  3 };
freq[7]   = {  3,  0,  2,  1,  0,  1,  0 };

现在使用此循环

printf("Correct combination:\n");
for(i=0;i<slots;i++){
    if(freq[i]!=0)
        printf("The color %d appears %d time(s).\n", correct[i], freq[i]);
}

你会得到

The color 3 appears 3 time(s).
The color 4 appears 2 time(s).
The color 2 appears 1 time(s).
The color 1 appears 1 time(s).