【问题标题】:Basic programming C Question基本编程C题
【发布时间】:2015-07-12 03:46:55
【问题描述】:

好的,所以我正在尝试编写一个程序来检查一个数字是否可以被 2、3、4 或 5 整除。

例如,如果用户输入 8,输出将是:

“8 能被 2 整除” “8 能被 4 整除”

我的程序:

#include<stdio.h>
#include<conio.h>


main(){

    int num, even, oddThree, evenFour, oddFive;



    printf("Please Enter A number: ");
    scanf("%d",&num);

    even = (num % 2 == 0);

    oddThree = (num % 3 == 0);

    evenFour = (num % 4 == 0);

    oddFive = (num % 5 == 0);


    if (even){ 

    printf("%d is divisible by 2\n",num);

    }

    if(oddThree) {

    printf("%d is divisible by 3\n",num);

    }


    if (evenFour){ 

    printf("%d is divisible by 4\n", num);

    }

    if (oddFive){ 

    printf("%d is divisible by 5\n", num);

    }

    else { 

    printf("%d is not divisible by 2,3,4 or 5\n", num);

    }

getch(); 

}

由于某种原因,当我输入某些数字时,例如 12。我的输出是:

"12 能被 2 整除" “12 能被 4 整除” "12 不能被 2,3,4 或 5 整除"

前两个陈述是正确的,但第三个是错误的。

我做错了什么?

【问题讨论】:

  • 您应该在编译时包含所有警告和调试信息 (gcc -Wall -Wextra -g),并且您应该学习如何使用调试器 (gdb)。顺便说一句,&lt;conio.h&gt; 是非标准标头,getch 是非标准函数。所以你也许应该用一些额外的标签来标记你的问题。

标签: c


【解决方案1】:
printf("%d is not divisible by 2,3,4 or 5\n", num);

会一直运行

(oddFive)

是假的。 也许

if (!(even || oddThree || evenFour || oddFive)) {
    printf("%d is not divisible by 2,3,4 or 5\n", num);
}

【讨论】:

    【解决方案2】:

    如果我可以提出一个稍微不同的方法:

    #include <stdio.h>
    
    int main( void )
    {
      int num;
      int divisors[] = {2, 3, 4, 5};
      size_t numDivisors = sizeof divisors / sizeof divisors[0];
      int isDivisible = 0;
    
      printf( "Gimme a number: " );
      fflush( stdout );
    
      if ( scanf( "%d", &num ) == 1 )
      {
        size_t i;
        for ( i = 0; i < numDivisors; i++ )
        {
          if ( !(num % divisors[i]) )
          {
            printf( "%d is divisible by %d\n", num, divisors[i] );
            isDivisible = 1;
          }
        }
      }
      else
      {
        fprintf( stderr, "Bad input, exiting\n" );
        exit( 0 );
      }
    
      if ( !isDivisible )
      {
        char *sep = "";
        size_t i;
    
        printf( "%d is not divisible by any of ", num );
        for ( i = 0; i < numDivisors; i++ )
        {
          printf( "%s%d", sep, divisors[i] );
          if ( i == numDivisors - 2 )
            sep = ", or ";
          else
            sep = ", ";
        }
        putchar( '\n' );
      }
    
      return 0;
    }
    

    样本输出:

    [fbgo448@n9dvap997]~/prototypes/div: ./div
    Gimme a number: 19
    19 is not divisible by any of 2, 3, 4, or 5
    
    [fbgo448@n9dvap997]~/prototypes/div: ./div
    Gimme a number: 18
    18 is divisible by 2
    18 is divisible by 3
    

    我们没有为每个测试的结果创建单独的变量,而是简单地循环遍历除数列表,并在执行过程中打印结果。我们使用isDivisible 标志跟踪是否有任何除数起作用。

    这种方法有两个优点。首先,它更紧凑,更易于维护。其次,您可以通过简单地向divisors 初始化程序添加更多项目来更改除数的数量及其值,而无需更改任何程序逻辑本身(无论如何)。例如,如果您想添加对 7 的检查,您只需更改

    int divisors[] = {2, 3, 4, 5};
    

    int divisors[] = {2, 3, 4, 5, 7};
    

    并重新编译。

    鉴于您使用的是conio.h,您显然是在使用 MSVC 或 Turbo C 或类似工具的 DOS/Windows 平台上。此代码应该在这些编译器下编译,尽管您可能需要包含 stdlib.h 或其他内容才能获得 size_t 的定义。

    就本练习而言,您不需要来自conio 的任何内容。如果您在命令行窗口中启动程序(而不是从 IDE 启动它),则不需要 getch 语句来保持窗口打开。

    编辑

    这个版本更简洁一些 - 我将输入和处理与输出分开。它需要将isDivisible 变成一个数组并添加一个计数器,但我认为从风格的角度来看它会更好。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main( void )
    {
      int num;
      int divisors[] = {2, 3, 4, 5};
      size_t numDivisors = sizeof divisors / sizeof divisors[0];
      int isDivisible[sizeof divisors/sizeof divisors[0]] = {0};
      size_t divCount = 0;
      size_t i;
    
      /**
       * INPUT
       */
      printf( "Gimme a number: " );
      fflush( stdout );
    
      if ( scanf( "%d", &num ) != 1 )
      {
        fprintf( stderr, "Bad input\n" );
        exit( 0 );
      }
    
      /**
       * PROCESSING
       */
      for ( i = 0; i < numDivisors; i++ )
      {
        divCount += (isDivisible[i] = !(num % divisors[i]));
      }
    
      /**
       * OUTPUT
       */
      printf( "%d is ", num );
    
      if ( !divCount )
      {
        char *sep = "";
        printf( "not divisible by any of " );
        for ( i = 0; i < numDivisors; i++ )
        {
          printf( "%s%d", sep, divisors[i] );
          if ( i == numDivisors - 2 )
            sep = ", or ";
          else
            sep = ", ";
        }
      }
      else
      {
        printf( "divisible by " );
        char *sep = "";
    
        for ( i = 0; i < numDivisors; i++ )
        {
          if ( isDivisible[i] )
          {
            printf( "%s%d", sep, divisors[i] );
    
            if ( --divCount > 1 )
              sep = ", ";
            else
              sep = " and ";
          }
        }
      }
    
      putchar( '\n' );
    
      return 0;
    }
    

    样本输出:

    [fbgo448@n9dvap997]~/prototypes/div: ./div
    Gimme a number: 20
    20 is divisible by 2, 4 and 5
    [fbgo448@n9dvap997]~/prototypes/div: ./div
    Gimme a number: 19
    19 is not divisible by any of 2, 3, 4, or 5
    

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2021-06-02
      相关资源
      最近更新 更多