簡體   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