float a, b, c;
printf( "Enter three nonzero values:\n" );
scanf( "%f%f%f", &a, &b, &c );
当我输入a = 2,b = 2和c = 4时,为什么...
if( a < ( b + c ))
{
if( b < ( a + c ))
{
if( c < ( a + b ))
{
printf( "This is a triangle." );
}
else
{
printf( "This is not a triangle." );
}
}
}
return 0;
}
...打印“这不是三角形”,但是...
if( a < ( b + c ))
{
if( b < ( a + c ))
{
if( c < ( a + b ))
{
printf( "This is a triangle." );
}
}
}
else
{
printf( "This is not a triangle." );
}
...不是吗?我正在寻找的解决方案使用后一个代码。但是,在运行程序时,命令提示符中“这不是三角形”应为空白的行。
我正在将Notepad ++与VS 2019的Developer Command Prompt一起使用。
vvvvvvv已解决vvvvvvvv
如果与我处于同一学习阶段的任何人感兴趣,这就是我解决练习的方法。我正在使用一本书来学习c编程,而我只读了三章。因此,我只想使用从前三章中学到的知识。
float a, b, c, temp, no = 0, count = 1;
printf( "Enter three nonzero values:\n" );
scanf( "%f%f%f", &a, &b, &c );
while ( count < 3 ) {
if(a + b > c){
/* Switch place of a and b */
temp = a;
a = b;
b = temp;
/* Switch place of b and c */
temp = c;
c = b;
b = temp;
count++;
}
else {
no++;
/* Switch place of a and b */
temp = a;
a = b;
b = temp;
/* Switch place of b and c */
temp = c;
c = b;
b = temp;
count++;
}
}
if ( no > 0 ) {
printf ( "This is not a valid triangle." );
}
else {
printf ( "This is a valid triangle." );
}
return 0;
此解决方案使用while循环来确定三角形的边是否可以是有效三角形。我使用变量temp来切换边的位置,然后如果其中一种组合不是有效的三角形,则在变量no处添加一个。
我还想补充一点,在chegg.com上进行此练习的解决方案是错误的。这让我很困惑。
vvvvvvvv另一个解决方案vvvvvvv
我书中的下一个练习是计算三个值是否可以是直角三角形的边。当我解决了这个问题时,我意识到同样的代码也可以用于规则的三角形。
float a, b, largest, temp;
printf( "Enter three nonzero values:\n" );
scanf( "%f%f%f", &largest, &a , &b );
if ( a > largest ) {
temp = largest;
largest = a;
a = temp;
}
if ( b > largest ) {
temp = largest;
largest = b;
b = temp;
}
/* a + b > largest if it's a regular triangle */
if ( a * a + b * b == largest * largest ) {
printf( "This is a valid right triangle" );
}
else {
printf( "This is not a valid right triangle" );
}
return 0;
因此,无需循环,只需将变量a和b与最大变量进行比较,以找出哪个变量最大。然后使用勾股定理找出边是否可以代表直角三角形,或者如果a + b> c是正三角形,则找出边。
我更喜欢这种方式,而不是使用不必要的循环。
答案 0 :(得分:6)
因为这是错误的:if( c < ( a + b ))
因为4 < (2 + 2)
是错误的。因此,else
分支将执行。在第二个变体中,它将仅打印“这不是三角形”。当第一个if
为假时,否则为假。试试这个
if ( (a < ( b + c )) && (b < ( a + c )) && (c < ( a + b )) )
printf( "This is a triangle.");
else
printf( "This is not a triangle.");
注意:这也会打印"This is not a triangle."
,因为按照您的逻辑使用这些值,它始终不是三角形。
答案 1 :(得分:2)
您缺少括号
if( c < ( a + b ))
{
printf( "This is a triangle." );
}else {
printf( "This is not a triangle." );
}
如果之前没有关闭
答案 2 :(得分:0)
注意大括号和缩进。
在第一个示例中:
if(...)
if(...)
if( c < ( a + b ))
{
printf( "This is a triangle." );
}
else
{
printf( "This is not a triangle." );
}
要获得第三个if
语句,前两个if
(第一个 AND 第二个if
)必须为真。我们的第三个if
语句有一个else
分支,如果第三个条件为false,则将执行该分支。
在第二个示例中:
if( a < ( b + c ))
{
// some more code
}
else
{
printf( "This is not a triangle." );
}
else
分支仅在第一个条件为false时才会执行。如果第一个条件为true,则此else
将永远不会执行。
话虽如此,第一个例子翻译为:
如果
a
小于b+c
并且b
小于a+c
AND < / strong>c
小于a+b
然后 这是一个三角形
其他 这不是三角形
第二个示例翻译为:
如果
a
小于b+c
然后检查其他条件
其他 这不是三角形
请注意,comparing float
的数字是