繁体   English   中英

基本编程C问题

[英]Basic programming C Question

好的,所以我试图编写一个程序来检查数字是否可以被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整除”

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

我做错了什么?

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);
}

如果我可能建议一个稍微不同的方法:

#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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM