C 是否可以创建一个接受3个整数并在不使用数组的情况下输出奇偶整数的程序?

C 是否可以创建一个接受3个整数并在不使用数组的情况下输出奇偶整数的程序?,c,C,我们的老师给我们做了一个C语言的练习。我们必须创建一个程序,接受三个整数,如果它们是奇数或偶数,则在不使用数组的情况下输出它们,只能使用循环和条件语句。 我只允许使用scanf、printf、循环和条件语句。我不能有像odd1、odd2、odd3、even1、even2、even3这样的多个变量。而且我不能执行scanf%d%d,,因此我必须在一个循环中运行scanf%d三次。我想不出任何方法可以精确打印预期输出的相同格式。我希望有人能在这方面帮助我 #include <stdio.h&g

我们的老师给我们做了一个C语言的练习。我们必须创建一个程序,接受三个整数,如果它们是奇数或偶数,则在不使用数组的情况下输出它们,只能使用循环和条件语句。 我只允许使用scanf、printf、循环和条件语句。我不能有像odd1、odd2、odd3、even1、even2、even3这样的多个变量。而且我不能执行scanf%d%d,,因此我必须在一个循环中运行scanf%d三次。我想不出任何方法可以精确打印预期输出的相同格式。我希望有人能在这方面帮助我

#include <stdio.h>

int main() {

    int i, num;

    printf("Enter three integers: ");

    for(i=1;i<=3;i++)
    {
        scanf("%d", &num);

          if(!(num%2))
          {
            printf("\nEven: %d", num);    
          }
          if(num%2)
          {
            printf("\nOdd: %d\n", num);    
          }
    }
}
输出:

   Odd: 1 3
   Even: 2
   Odd:  
   Even: 2 4 6
输入:

   1 2 3
   2 4 6
   1 2 3
    1 3 5
输出:

   Odd: 1 3
   Even: 2
   Odd:  
   Even: 2 4 6
…但我唯一能做的就是

输入:

   1 2 3
   2 4 6
   1 2 3
    1 3 5
输出:

    Odd: 1
   Even: 2
    Odd: 3
    Odd: 1
    Odd: 3
    Odd: 5
输入:

   1 2 3
   2 4 6
   1 2 3
    1 3 5
输出:

    Odd: 1
   Even: 2
    Odd: 3
    Odd: 1
    Odd: 3
    Odd: 5
一种方法是:

int odd1, odd2, odd3, numOdd = 0; 

/* Code as above */

scanf("%d", &num);

if (num%2)
{
    if (numOdd == 0)
    {
        odd1 = num;
        numOdd++;
    }
    else if (numOdd == 1)
    {
        odd2 = num;
        numOdd++;
    }
    /* And continue */
}
else
{
    /* Repeat with even1, even2, even3 and numEven */
}

/* Print out numOdd oddn's */
/* Print out numEven evenn's */
这似乎是一个愚蠢的练习,但至少你会得到大量的练习,如果语句

我还想:

scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &num3);
可能较短,但不需要for循环,除非执行以下操作:

printf("Odd: ");
for (i = 0; i < 3; i++)
{
    int thisNum;
    if (i == 0) thisNum = num1;
    else if (i == 1) thisNum = num2;
    /* etc */
    if (thisNum % 2) printf("%d ", thisNum);
}

鉴于您正在学习C语言,也许您的老师想教您一些指针算术,而不是像以下代码中那样使用数组:

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

int main()
{
  int i = 0;
  int *odd = (int*)malloc(3 * sizeof(int));
  int odd_count = 0;
  int *even = (int*)malloc(3 * sizeof(int));
  int even_count = 0;

  printf("Enter three integers: ");

  for(i=0; i<3; i++)
  {
    int num = 0;
    scanf("%d", &num);
    if(!(num%2))
    {
        *even++ = num;
        even_count++;
    }
    if(num%2)
    {
        *odd++ = num;
        odd_count++;
    }
  }

  even -= even_count;
  odd -= odd_count;

  printf("\nEven: ");
  for(i=0; i<even_count; i++)
  {
     printf("%d ", *even++);
  }

  printf("\nOdd: ");
  for(i=0; i<odd_count; i++)
  {
     printf("%d ", *odd++);
  }

  free(odd);
  free(even);
  return 0;
}

如果你不介意把偶数颠倒过来的话,递归循环伪装成赢

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

void separate(int m, int n) {
    if (m == n) printf("Odd:");
    if (n == 0) { printf("\nEven:"); return; }
    int i;
    if (scanf("%d", &i) != 1) exit(EXIT_FAILURE);

    // print odd numbers before recursing; even numbers after recursing
    if (i % 2 == 1) printf(" %d", i);
    separate(m, n - 1);
    if (i % 2 == 0) printf(" %d", i);

    if (m == n) printf("\n\n");
}

问题在于不能使用数组。因此,不能使用字符串,它们是数组。允许使用scanf和printf是您的老师故意设置的陷阱-如果不使用数组,无论是显式的还是隐含的,都无法以有用的方式使用它们

因此,您必须这样做:

#include <stdio.h>
#include <ctype.h>


void print_number(int n)
{
    if (n < 0) {
        putchar('-');
        n = -n;
    }

    if (n == 0)
        putchar('0');

    if (n / 10)
        print_number(n / 10);

    putchar(n % 10 + '0');
}

int main(void) {
    putchar('E');
    putchar('n');
    putchar('t');
    putchar('e');
    putchar('r');
    putchar(' ');
    putchar('t');
    putchar('h');
    putchar('r');
    putchar('e');
    putchar('e');
    putchar(' ');
    putchar('i');
    putchar('n');
    putchar('t');
    putchar('e');
    putchar('g');
    putchar('e');
    putchar('r');
    putchar('s');
    putchar(':');
    putchar(' ');
    fflush(stdout);

    int odd1, odd2, odd3, odd_count = 0;
    int even1, even2, even3, even_count = 0;
    for(int i = 0; i < 3; i++)
    {
        int number = 0;
        int c;
        while (1) {
            c = getchar();
            if (isspace(c)) {
                if (c == '\n')
                    break;

                while ((c = getchar()) == ' ');
                ungetc(c, stdin);
                break;
            }
            else if (isdigit(c)) {
                number = number * 10 + c - '0';
            }
        }
        if (number % 2) {
            switch (odd_count) {
                case 0: odd1 = number; break;
                case 1: odd2 = number; break;
                case 2: odd3 = number; break;
            }
            odd_count ++;
        }
        else {
            switch (even_count) {
                case 0: even1 = number; break;
                case 1: even2 = number; break;
                case 2: even3 = number; break;
            }
            even_count ++;
        }
    }

    putchar('O');
    putchar('d');
    putchar('d');
    putchar(':');
    putchar(' ');

    if (odd_count >= 1) {
        print_number(odd1);
    }

    if (odd_count >= 2) {
        putchar(' ');
        print_number(odd2);
    }

    if (odd_count >= 3) {
        putchar(' ');
        print_number(odd3);
    }

    putchar('\n');
    putchar('E');
    putchar('v');
    putchar('e');
    putchar('n');
    putchar(':');
    putchar(' ');

    if (even_count >= 1) {
        print_number(even1);
    }

    if (even_count >= 2) {
        putchar(' ');
        print_number(even2);
    }

    if (even_count >= 3) {
        putchar(' ');
        print_number(even3);
    }

    putchar('\n');
}
此代码不使用任何数组

如果不能定义main以外的函数,则必须在6个位置内联print_编号,将递归更改为迭代。祝你好运


但是,如果老师接受在不允许使用数组的任务中使用字符串,您可以将其视为无视他们设置的所有愚蠢限制的许可。

@KenY-N,这也是我所做的,先生。但是老师没有接受这个准则。对我来说,这似乎是不可能的。运行你的循环两次。首先选择奇数,然后选择偶数。我假设写入字符串是作弊,因为它们是字符数组。告诉你的老师,教你使用数组比不使用数组更有意义。你的程序使用4个字符数组。那仍然使用数组,只是动态分配的数组。3不是malloct的正确论点这里没有必要在C中使用malloc。而且,你把错误的指针传递给free。对不起,先生。“但是我们不允许使用指针或malloc函数,我希望它会打印奇数:在扫描所有3个数字之前,这是一个简单的改变,”AjithCNarayanan说。我的答案的核心是在递归调用之前或之后打印数字。玩得高兴我只是想把它全部塞进一个函数中,将函数从递归函数中移开使它更简单:我认为这是唯一满足要求的答案,尽管我不知道它对OP来说是否太高级。我很想看看老师想到的答案。它仍然使用数组。@AnttiHaapala:没有数组版本,递归函数根据OPs问题简化,不能使用多个变量。请看:我不能有像odd1,odd2,odd3,even1,even2,even3这样的多个变量。你应该使用is*函数的参数:isdigitunsigned charc:Haha,但我不需要:这是一个陷阱OPs问题,不能使用多个变量。请参阅:我不能有多个变量,如odd1、odd2、odd3、even1、even2、even3。