[英]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.