0

问题是:编写一个读取整数数组的程序。程序应分别显示出现在偶数和奇数下标位置的元素。这是书中的程序,但我不明白为什么这个程序会这样输出。而不是在奇数位置打印奇数,在偶数位置打印偶数,这里的输出完全不同。'''

#include <stdio.h>

int main()
{
    int even,odd,i,n,a[50];
    printf("Enter the number of terms: ");
    scanf("%d",&n); //input
    for(i=0;i<n;i++)
    {
        printf("Enter number %d:",i+1);
        scanf("%d",&a[i]);
    }
    printf("\nOdd\tEven\n");
    for(i=0;i<n;i++)
     {
       /*if(a[i]%2!=0) */  
        if(i%2!=0) //array index starts from 0.
        printf("\n%d\t",a[i]);
         else 
           printf("%d\t",a[i]);
        }
     return 0;
}

预期的答案

在此处输入图像描述

4

3 回答 3

0

您希望按列打印偶数和奇数数组下标值,其中奇数下标值应在偶数下标值之前打印。这意味着,i + 1第 th下标值应该在i第 th下标值之前打印(前提是ii + 1下标都有效,即在数组大小内)。几点:

  • 输出的行数将是half数组的大小,如果数组的大小为half + 1偶数,则为数组的大小,如果数组的大小为奇数。
  • 需要考虑的情况是,如果数组的大小为奇数,则输出的最后一行应仅打印偶数值,奇数列应留空。

执行:

#include <stdio.h>

#define ARR_SZ 50

int main(void) {
    int n, a[ARR_SZ];

    printf("Enter the number of terms: ");
    scanf("%d",&n);

    // Add input validation code.
    // Below code based on assumption that 
    // input is valid i.e. 0 <= n <= ARR_SZ.

    for(int i = 0; i < n; ++i) {
        printf("Enter number %d:", i + 1);
        scanf("%d", &a[i]);
    }

    int count = n % 2 ? n/2 + 1 : n/2;
    int i = 0;

    printf("\nOdd\tEven\n");
    while (count--) {
        if (i + 1 < n) {
            printf ("%d", a[i + 1]);
        }
        printf ("\t%d\n", a[i]);
        i = i + 2;
    }

    return 0;
}

输出:

# ./a.out
Enter the number of terms: 6
Enter number 1:2
Enter number 2:3
Enter number 3:4
Enter number 4:5
Enter number 5:6
Enter number 6:7

Odd Even
3   2
5   4
7   6

# ./a.out
Enter the number of terms: 1
Enter number 1:5

Odd Even
    5

# ./a.out
Enter the number of terms: 3
Enter number 1:7
Enter number 2:6 
Enter number 3:5

Odd Even
6   7
    5
于 2020-12-28T05:16:26.010 回答
0

我像这样格式化输出:

printf("%5s%5s\n", "Odd", "Even");
for(i=0;i<n;++i)
{
    printf(i%2?"%5d\n" : "%5d" , a[i]);
}
return 0;

结果是:

Success #stdin #stdout 0s 4844KB
  Odd Even
    2    3
    4    5
    6    7
于 2020-12-28T04:21:23.137 回答
0

哟!

您使用以下方式打印数字:

 for(i=0;i<n;i++)
 {
   /*if(a[i]%2!=0) */  
    if(i%2!=0) //array index starts from 0.
    printf("\n%d\t",a[i]);
     else 
       printf("%d\t",a[i]);
    }

错误的原因有几个,首先:在第 16 行(我的段中的第 3 行),您将数组中值的条件替换为数组中索引的条件,这意味着无论您输入的数字如何,输出将始终具有相同的形式:

(with nX the Xth number you input)
n1
n2 n3
n4 n5
...
nn

然后,即使解决了这个问题,你最终还是会在左边打印第一个数字,修复取决于你想要的输出。

为了 :

Odd Even
    2
3
    4
5
    6

你可以简单地替换printf("%d\t",a[i]);printf("\n\t%d",a[i]);

然而,对于

Odd Even
    2
3   4
5   6

您需要跟踪最后是否打印了奇数,并采取相应的行动,您可以自己弄清楚如何做。

学习愉快。

编辑:OP提供了预期的格式,相应地更新了我的答案:

为了:

Odd Even
3   2
5   4
    6

您可以保留两个索引来跟踪要打印的内容,并分别搜索下一个奇数或下一个偶数,或者重新排序数字以适应格式。无论哪种方式,您都需要处理更多的类型,这在第一种情况下通过与数字分开处理换行符来完成,这为您提供类似于:

 for(o=0, e=0; o < n || e < n;) {
    // Skip all even numbers and print next odd one, if any
    while (o < n && a[o] % 2 == 0) 
        ++o;
    if (o < n)
        printf("%d", a[o]);
    // Skip all odd numbers and print next even one, if any
    while (e < n && a[e] % 2 != 0)
        ++e;
    if (e < n)
        printf("\t%d", a[e]);
    printf("\n");
 }
于 2020-12-28T04:31:19.147 回答