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