Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中找到两个数组之间的差异?_C_Arrays_Array Difference - Fatal编程技术网

如何在C中找到两个数组之间的差异?

如何在C中找到两个数组之间的差异?,c,arrays,array-difference,C,Arrays,Array Difference,我一直在尝试编写c程序来查找两个数组之间的并集、交集和差分,虽然前两个结果很好,但我在查找两个数组之间的差分时遇到了一些困难。不同的是,我指的是数组1中的每个元素,而不是数组2中的每个元素 我希望第三个数组包含array1中不在array2中的所有元素,而不是vica。因此,如果array1是[1,2,3],arr2是[3,4,5],那么arr3是[1,2]。如果两个阵列的大小不同,我也不确定如何找到差异 我的输出是一组零和负数: 区别在于:1 区别是:2 差额为:-14200 差别是:0 差额

我一直在尝试编写c程序来查找两个数组之间的并集、交集和差分,虽然前两个结果很好,但我在查找两个数组之间的差分时遇到了一些困难。不同的是,我指的是数组1中的每个元素,而不是数组2中的每个元素

我希望第三个数组包含array1中不在array2中的所有元素,而不是vica。因此,如果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]);

}
#包括
int main()
{
int-arr1[100];
int-arr2[100];
int size1,size2,i,j,s=0;
//输入数组大小
printf(“\n请输入数组1大小:\n”);
scanf(“%d”和大小1);
printf(“\n请输入数组2大小:\n”);
printf(“\n------------------------------------\n”);
scanf(“%d”和&size2);
//设置第三个数组以包含差异
int tot_size=size1+size2;
int arr3[总尺寸];
//输入数组元素

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

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

    arr1=[3,5,7,0]

    arr2=[1,10,5]

    arr3=[arr1,arr2]==>[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中的数字?您的第一个代码更有意义

你应该做一些功能,使它对你来说容易

  • 生成一个“isNumberArray”函数

    布尔IsNumberInArray(整数、整数*数组、大小\u t数组大小)

我将实现留给您(如果数组被排序,您可以实现二分法搜索,否则您可以为它执行一个良好的旧循环)

  • 然后,对于arr1中的每个数字,如果isNumberArray(arr1[i],arr2,size2)为false,则在arr3中添加arr1[i]
基本上,这几乎就是你要做的。你的问题在于“反转”条件(数字是否在第二个数组中?)和“如何轻松地从第二个循环中断开”。函数将提供这一点

请注意,由于arr3只保留arr2中没有的arr1号,所以arr3大小可以为最大大小1。这就是为什么我首先假设您希望arr1和arr2中有uniq号,因为tot_大小为大小1+大小2


通常,我不会为“简单”问题提供代码,因为如果你不能自己解决它,这意味着你需要练习,给你答案对你来说没有用处,但既然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;
} 
#包括
#包括
#包括
#包括
布尔IsNumberInArray(整数、整数*数组、大小\u t数组大小)
{
对于(大小i=0;i

我不认为有一个更“有效”的实现,因为在编译器优化之后,生成的可执行文件将是完全相同的。如果没有激活编译器优化,sg7代码将更“有效”,因为它是straigthforward(我的代码有函数调用)。这取决于您选择哪一个。

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

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

    arr1=[3,5,7,0]

    arr2=[1,10,5]

    arr3=[arr1,arr2]==>[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中的数字?您的第一个代码更有意义

你应该做一些功能,使它对你来说容易

  • 生成一个“isNumberArray”函数

    布尔IsNumberInArray(整数、整数*数组、大小\u t数组大小)

我将实现留给您(如果数组被排序,您可以实现二分法搜索,否则您可以为它执行一个良好的旧循环)

  • 然后,对于arr1中的每个数字,如果isNumberArray(arr1[i],arr2,size2)为false,则在arr3中添加arr1[i]
基本上,这就是你要做的。哟
  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
#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