C++ 求实数绝对值 测试数据半对半错

C++疑问
【问题描述】求实数的绝对值。

【输入形式】输入数据包含一个实数。

【输出形式】对于输入数据,输出它的绝对值,结果保留两位小数。

【样例输入】123

【样例输出】123.00

有两个正确输出,分别是23.00和345.12

# include
int main()
{
    float a;
    float b;
    scanf("%f",&a);
    if (a>0) printf("%.2f",a);
    else
    b=0;
    b=-a;
    printf("%.2f",b);
    return 0;
}

错误输出①:
234.00-234.00
期望输出:
234.00
错误输出②:
12343457792.00-12343457792.00
期望输出:
12343457678.99

为啥错了?

参考GPT和自己的思路:

你的代码有两个问题:

  1. 当输入为正数时,你只输出了 a 的值,但没有加上小数点后两位的格式化输出语句,导致输出缺少小数点后两位。正确代码应该为:
    if (a > 0) { 
       printf("%.2f", a); 
    } 
    
  2. 当输入为负数时,你的 else 语句只使 b 置为0,然后你在下一行再次对 b 进行赋值,所以实际上你求出了-a的值,但你没有输出它。正确代码应该为:
    if (a > 0) { 
       printf("%.2f", a); 
    } else { 
       float b = -a; 
       printf("%.2f", b); 
    } 
    
    这样就能正确输出题目要求的绝对值了。

参考GPT和自己的思路:

这个问题的错误在于在else语句下只给b赋了初始值0,而没有加上大括号来限定语句执行的范围。因此,当a小于等于0时,只有b=0这一句代码被执行,然后程序继续往下执行,b的值被赋为-a,导致最终输出的结果是负数。修复方法是在else语句下加上大括号来限定执行的语句范围。以下是修复后的代码:

#include <stdio.h> 
int main() { 
    float a, b; 
    scanf("%f", &a); 
    if (a >= 0) { 
        printf("%.2f", a); 
    } else { 
        b = -a; 
        printf("%.2f", b); 
    } 
    return 0; 
}

这样的话,当a小于等于0时,else后面的所有语句都会被执行,保证b的值正确。