如何在C中正确比较和打印出这个数组中的匹配元素?

时间:2014-07-28 06:24:52

标签: c arrays loops nested-loops

我有这个简单的问题,我试图在C中编写解决方案。

If an array arr contains n elements, then write a program to check 
if arr[0] = arr[n-1], arr[1] = arr[n-2] and so on.

我的代码看起来像这样 -

#include<stdio.h>
int main()
{
    int arr[10],i=0,j;
    int k=0;
    printf("\n Enter 10 positive integers: \n");
    for(k=0;k<=9;k++)
    scanf("%d",&arr[k]);

    while(i<=9)
    {
        for(j=9;j>=0;j--)
        {
            if(arr[i]==arr[j])
            {
                printf("\n The array element %d is equal to array element %d\n", arr[i],arr[j]);
            }

            i++;
            continue;
        }
    }

    return 0;
}

输入此输入 -

 Enter 10 positive integers:
10
20
30
40
50
60
40
80
20
90

我得到的输出是 -

 The array element 20 is equal to array element 20

 The array element 40 is equal to array element 40

 The array element 40 is equal to array element 40

 The array element 20 is equal to array element 20

现在,此代码存在两个问题 -

  1. 如您所见,程序打印出匹配的数组元素两次。这是因为,一旦变量i从第一个元素到最后一个元素循环遍历数组,我构建程序的方式,然后j从最后一个元素循环到第一个元素。因此每个都会打印出匹配的数组元素一次,从而产生两组值。
  2. 我的第二个问题是 - 在我的代码中,我已经在for循环(0 to 9 for an array of 10 elements)中对数组的长度进行了硬编码。可以进行哪些更改,以便用户输入的数组长度可以直接用于for循环?
  3. 我已经读过,在C中,array dimensions(声明时)不能是variable。所以,这样的declaration(这是我的第一个想法)是行不通的 -

    int n; // n is no. of elements entered by the user
    
    int arr[n];
    

    我是编程的新手,所以如果问题听起来太简单,质量低,我很抱歉。

    谢谢。

5 个答案:

答案 0 :(得分:0)

第一次查询

for(i=0;i<n/2;i++)
{
     if(a[i]==a[n-(i+1)])
     {
         printf("\n The array element %d is equal to array element %d\n",a[i],a[n-(i+1)]);
     }
}

对于第二个查询,您可以使用条件i&lt;(n / 2)(运行循环(n / 2)-1次)对于n = 10的情况,它将从0运行到4。

如果要从0循环到9,可以使用

for(i=0;i<n;i++)             

为了制作n个元素的数组,其中n是一个变量,或者创建一个总是大于n的元素数组,或者通过制作一个动态数组来做它。

http://www.cs.swarthmore.edu/~newhall/unixhelp/C_arrays.html

答案 1 :(得分:0)

1)您可以遍历数组一半,只获得一次打印。您可以使用for(j=9;j>=0;j--)而不是for(j=9;j>=9/2;j--)

2)

int n;
int arr[n].

最近编译器支持此声明。如果您不想使用它,可以为阵列进行动态内存分配。

答案 2 :(得分:0)

My second question is- In my code, I've hard-coded the length of the array in the for loops(0 to 9 for an array of 10 elements). What change can be done so that the length of the array, as entered by the user, can directly be used in the for loops?

使用动态内存分配。使用 malloc()

所以代码将是

{
 int num_elements;
 int* arr;
 printf("Enter number of elements\n");
 scanf("%d", &num_elements);

 arr = (int *) malloc(num_elements * sizeof(int));  // Use this 'arr' for holding input data from user

 // Your remaining code comes here


 free(arr);  // Free the pointer in the end of program
}

答案 3 :(得分:0)

更正:

#include<stdio.h>
int main()
{
    int i=0, size; // size of array
    int k=0;       // counter

    printf("enter size of array\n");
    scanf("%d", &size);                    // ask user for desired size
    int *arr = malloc(size * sizeof(int)); // allocate memory for array

    printf("\n Enter 10 positive integers: \n"); // fill your array of size size
    for(k=0;k<size;k++)
    scanf("%d",&arr[k]);

    k = 0;                           // reset this counter
    for(i=0; i<size/2; i++)          // check only for half of it
    {
        if(arr[i] == arr[size-i-1])   // try it with paper and pincil
        {
           printf("match arr[%d]=arr[%d]=%d\n", i,size-i-1, arr[i]);
           k++;
        }
    }

    if(k==0) printf("No matching");
    return 0;
}

答案 4 :(得分:0)

变长创建对我有用:

#include<stdio.h>

int main(){
   int a, i;
   scanf("%i", &a);
   int blah[a];

   for (i = 0; i < a; i++){
      printf("/n%i", blah[a]);
   }
}

另一种方法是创建最大长度数组,而不是简单地使用前n个元素。

正如之前的回答所述,您需要确保仅检查每个元素一次,因此停止在元素n / 2处。将n / 2舍入为最接近的较小整数可能很重要,因此乍一看奇数个参数可能会有不同的处理方式。但由于它只省略了中间元素,因此它与自身相同。