如何在C中找到两个数组之间的区别?

时间:2018-03-07 14:52:58

标签: c arrays array-difference

我一直在尝试编写用于查找两个数组之间的并集,交集和差异的c程序,虽然前两个数组运行正常,但我在查找两个数组之间的区别时遇到了一些麻烦。区别是指array1中的每个元素,而不是array2中的元素。

我希望第三个数组包含array1中不在array2中的每个元素,而不是反之亦然。因此,如果array1是[1,2,3],并且arr2是[3,4,5],那么arr3是[1,2]。如果两个阵列的大小不同,我也不确定如何找到差异。

我的输出是一堆零和负数:

区别在于:1

区别在于:2

区别在于:-14200

区别在于:0

区别在于:-14340

区别在于:0

这是我一直在使用的代码:

#include <stdio.h>

int main()
{
  int arr1[100];
  int arr2[100];
  int size1, size2, i, j, s=0;

  //enter array size
  printf("\nPlease enter array1 size: \n");
  scanf("%d", &size1);
  printf("\nPlease enter array2 size: \n");
  printf("\n--------------------------- \n");
  scanf("%d", &size2);

  //setting up a third array to contain the difference
  int tot_size = size1+size2;
  int arr3[tot_size];


  //enter array elements
  for(i=0;i<size1;++i)
  {
    printf("\nPlease enter array1 element %d:\n", i);
    scanf("%d", &arr1[i]);
  }
  printf("\n--------------------------- \n");
  for(i=0;i<size2;++i)
  {
    printf("\nPlease enter array2 element %d:\n", i);
    scanf("%d", &arr2[i]);
  }

  printf("\n--------------------------- \n");


  //compare the two arrays, if two elements are not equal
  //store them in a third array
  for(i = 0; i < size1; i++)
  {
    for(j = 0; j < size2; j++)
    {
      if(arr1[i] != arr2[j])
      {
        arr3[s] = arr1[i];
        ++i;
        ++j;
        ++s;
      }
    }
  }

  for(i=0;i<s;++i)
    printf("\nThe difference is: %d\n", arr3[i]);

}

任何帮助都会非常感激,因为我是C的新手,还有很多需要学习的地方。

3 个答案:

答案 0 :(得分:2)

如果两个数组之间的差异是第一个不在第二个数组中的数字而第二个数字不在第一个数组中,则可以简单地执行以下操作:

  • 创建一个结果数组,并复制第一个和第二个数组。

    arr1 = [3,5,7,0]

    arr2 = [1,10,5]

    arr3 = [arr1,arr2] ==&gt; [3,5,7,0,1,10,5]

  • 然后,对数组进行排序(使用qsort或任何其他排序函数)

    arr3 = [0,1,3,5,5,7,10]

  • 最后,删除多次出现的数字(排序步骤只需一次通过即可轻松实现)

    arr3 = [0,1,3,7,10]

评论之后:那么,arr1和arr2之间的区别是arr1中的数字不是arr2中的数字?你的第一个代码更有意义。

你应该做一些功能,以方便你。

  • 制作&#34; IsNumberInArray&#34;功能

    bool IsNumberInArray(int number,int * array,size_t arraySize)

我将实现留给你(如果数组已经排序,你可以实现二分法搜索,否则你可以做一个好的旧循环)。

  • 然后,对于arr1中的每个数字,如果IsNumberInArray(arr1 [i],arr2,size2)为false,则在arr3中添加arr1 [i]。

基本上,它几乎就是你所做的。你的问题出在&#34;倒置&#34; condition(数字是在第二个数组中?)和&#34;如何打破&#34;很容易从第二个循环。该功能将提供。

请注意,由于arr3只保留不在arr2中的arr1号,因此arr3的大小可以是max size1。这就是为什么我首先假设你想要arr1和arr2中的uniq号,因为tot_size是size1 + size2。

通常,我不会为#34; easy&#34;提供代码。问题,因为如果你不能自己解决,这意味着你需要练习并给你答案对你没有用,但是因为sg7做到了,握住它是没有意义的(和你一样)暂时不能使用房间了,所以这里是算法的实现:

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

bool IsNumberInArray(int number, int *array, size_t arraySize)
{
    for (size_t i = 0; i < arraySize; ++i) {
       if (array[i] == number) {
           return (true);
       }
    }

    return (false);
}

void DumpArrayContent(int *array, size_t arraySize, char *arrayName)
{
    printf("%s has %zu elements:\n", arrayName ? arrayName : "array", arraySize);               
    for (size_t i = 0; i < arraySize; ++i) {
        printf("%d ",array[i]);
    }
    printf("\n");    
}

int main(void)
{
    int arr1[] = {1,2,3,4,7,8,9};
    int arr2[] = {3,4,5};

    size_t s1 = sizeof(arr1)/sizeof(*arr1);
    size_t s2 = sizeof(arr2)/sizeof(*arr2);

    int    arr3[s1];
    int    s3 = 0;

    for (size_t i = 0; i < s1; ++i) {
        if (!IsNumberInArray(arr1[i], arr2, s2)) {
           arr3[s3] = arr1[i];
           s3++;
        }
    }

    DumpArrayContent(arr1, s1, "arr1");
    DumpArrayContent(arr2, s2, "arr2");
    DumpArrayContent(arr3, s3, "arr3");

    return 0;
} 

我不认为有更多的&#34;有效的&#34;实现,因为在编译器优化之后,生成的可执行文件将完全相同。如果没有激活编译器优化,sg7代码将更有效&#34;因为它很困难(我有函数调用)。由你来决定你喜欢哪一个。

答案 1 :(得分:2)

  

我希望第三个数组包含array1中不包含的每个元素   在array2中,而不是反之亦然。所以如果array1是[1,2,3],那么arr2是   [3,4,5],然后arr3是[1,2]。

假设array1已被处理为不包含重复项,
看起来你需要这个:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(void)
{
    size_t i,j,k;
    int s3;

    int arr1[] = {1,2,3,4,7,8,9};
    int arr2[] = {3,4,5};

    size_t s1 = sizeof(arr1)/sizeof(int);
    size_t s2 = sizeof(arr2)/sizeof(int);

    int arr3[s1];
    int e;
    int found = 0;
    k = 0;

    for(i=0; i<s1; i++)
    {
        e = arr1[i]; 
        found = 0;

        for(j=0; j<s2; j++){

           if(e == arr2[j])
           {
               found = 1;
               break;
           }
        }

        if(found == 0){
           arr3[k] = e;
           k++;
        }
    }


    printf("arr1 has %d elements:\n",s1);
    for(i=0;i<s1; i++)
    {
        printf("%d ",arr1[i]);
    }

    printf("\narr2 has %d elements:\n",s2);
    for(i=0;i<s2; i++)
    {
        printf("%d ",arr2[i]);
    }

    printf("\narr3 has %d elements:\n",k);               
    for(i=0;i<k; i++)
    {
        printf("%d ",arr3[i]);
    }

    return 0;
}

输出:

arr1 has 7 elements:                                                                                                                         
1 2 3 4 7 8 9                                                                                                                               
arr2 has 3 elements:                                                                                                                        
3 4 5                                                                                                                                       
arr3 has 5 elements:                                                                                                                        
1 2 7 8 9 

答案 2 :(得分:1)

看看你的循环,注意内部for循环j 在每次迭代时都被初始化为0。

  for(i = 0; i < size1; i++)
  {
    for(j = 0; j < size2; j++)
    {
      if(arr1[i] != arr2[j])
      {
        arr3[s] = arr1[i];
        ++i;
        ++j;  // so what does this do?
        ++s;
      }
    }
  }

让我们试着看看两个具有不同值的数组会发生什么

arr1 : {1,2}
arr2 : {3,4}


           i   j   s
iteration  0   0   0  => arr3[0] = 1; 
           1   1   1
               2                        j==2 since j++, leaving inner loop j==size2
iteration  2   0   1                    i==2 since i++, leaving outer loop i==size1

最好是在纸上写下你的步骤并完成你的算法,从一开始 简单的例子,然后为它创建一个原型例程,如果它的工作继续扩大 数组,不同的长度数组,相同的数组等等。