在C中搜索数组

时间:2015-10-20 08:16:11

标签: c arrays pointers search

我很难进行这样的练习:

  

编写一个程序,计算数组中每个不同数字的出现次数。整数是介于0到9之间的数字。以此数组为例:

int numbers[] = {1, 5, 4, 7, 1, 4, 1, 7, 5, 5, 3, 1};
  

创建一个指向数组第一个元素的指针。循环遍历数组并计算指向数字的出现次数。在计算出数字1的出现次数后,指针将指向数字5.计算出现的数量为5,依此类推。在您循环几次并且指针再次指向1(数组的元素4)之后,程序可能不会再次计数1,因此您需要将分数保持在您已计算的数字的某个位置。

     

输出应如下所示:

     

1的出现量是:4

     

3的出现量是:1

     

4的出现量是:2

     

出现的数量为5:3

     

7的出现量是:2

我现在的代码计算了每个元素的外观:

int main()
{   
    int getallen[] = {1, 5, 4, 7, 1, 4, 1, 7, 5, 5, 3, 1};
    int i , j, *aimedNumber, appearance = 0, arraySize = sizeof(getallen) / sizeof(int);

    for(i=0;i<arraySize;i++)                        
    {
        aimedNumber = getallen[i];                  // every loop, the pointer points to the next element

        for(j=0; j<arraySize; j++)                  // loops through the array comparing the pointer
        {
            if(getallen[j]==aimedNumber)            // if the element of the array == pointer
            {
                appearance++;                       // +1 to the appearance
            }
        }

        printf("the appearance of %i in the array is: %i\n", aimedNumber, appearance);
        appearance = 0;                             // after checking the appearance of the pointed number...
    }                                               // reset the appearance variable

    return 0;
}

但是我仍然需要检查一下我是否已经计算了一个数字,如果我这样做了,请确保该数字不再计算在内。

提前致谢!

5 个答案:

答案 0 :(得分:1)

你有一些限制,数组中的数字只能在0到9之间(含),这实际上使它更简单,因为那时你可以有一个十个整数的“计数器”数组(每个整数一个)您“搜索”的数组中的数字,并且对于主数组中的每个数字,您可以在计数器数组中增加相应的值(使用数字作为索引)。然后只需打印出计数器数组中非零的值。

如下所示

int count[10] = { 0 };  // Initialize all to zero

for (i = 0; i < arraySize; ++i)
    ++count[getallen[i]];

// Now print out all non-zero values from count,
// and the index is the number in getallen

答案 1 :(得分:0)

由于您在计数后似乎不需要getallen数组,因此您可以在计数时修改它,即每次查找数组中的所有1时你读了1你可以设置它,让我们说-1(你知道你的所有号码都在[0,9]范围内)以便当你回来时在外部循环中,您可以跳过值为-1

的条目

编辑:如果你必须遵循你的例子中描述的那种行为,这就是答案;否则,像Joachim Pileborg的那样,有一个额外阵列的解决方案会更好。

答案 2 :(得分:0)

您的程序应如下所示:

#include <stdio.h>

int main(void)
{
    //Original array of numbers
    int numbers[] = {1, 5, 4, 7, 1, 4, 1, 7, 5, 5, 3, 1};

    //array of 10 integers to count the number of occurences
    int num_of_occ[10] = {0};

    int *ptr = numbers;

    //tmp variable to hold the value of numbers array in the loop
    int tmp ,n = 0 ;

    while( n < 12 )
    {
        tmp = *ptr;
        num_of_occ[tmp]++;
        ptr++;
        n++;
    }

    //print the occurences
    for( int n = 0 ; n < 10 ; n++ )
    {
        if( num_of_occ[n] != 0 )
        {
            printf("The ammount of appearences of %d : %d\n", n , num_of_occ[n]);
        }
    }
}

答案 3 :(得分:0)

你需要创建另一个名为tempArr的数组,例如,使用getallen数组的大小,用10来初始化它(因为getallen数组中的数字在0-9之间)并且在计算下一个数字之前,扫描tempArr并检查数字是否已经存在,如果存在,则跳到下一个数字。

答案 4 :(得分:0)

在设置了目标编号之后但是在进入内部循环以检查数据的先前值与目标编号

之前,我只是放入了另一个循环
skip = 0;
for (j=0; j < i; j++) {
  if (getallen[j] == aimedNumber) {
    skip = 1;
    break;
  }
}
if (skip) {
  continue;
}