显然,该程序可以计算小数点后的位数。虽然可以,但是我很难理解。
布尔在这里到底做了什么?而if(ch =='。')f = true会怎样?在这里实现?
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
char ch;
bool f=false;
int num=0;
while((ch=getchar())!='\n')
{
if(f)
if(ch>='0' && ch<='9')
num++;
else
break;
if(ch=='.')
f=true;
}
if(num>0)
cout<<num<<endl;
else
cout<<"false"<<endl;
return 0;
}
它可以完美地给出结果。只是好奇为什么会起作用。
答案 0 :(得分:2)
我不怪你困惑。它表明了好的变量名的重要性。 UnregisterReceiver();
跟踪我们是否看过f
。应该将其命名为更具描述性的名称,例如'.'
。
haveSeenDecimalPoint
开头为false,表示我们还没有看到bool haveSeenDecimalPoint=false;
while((ch=getchar())!='\n')
{
if(haveSeenDecimalPoint)
if(ch>='0' && ch<='9')
num++;
else
break;
if(ch=='.')
haveSeenDecimalPoint=true;
}
。第一个.
语句始终为假。当我们看到if
时,第二条.
语句会将标志设置为true。之后,任何其他字符将触发内部的if
/ if
测试。小数点后的任何数字都会触发else
,一旦我们看到一个非数字,我们就会num++
完全退出循环。
答案 1 :(得分:1)
{f
是bool
类型的变量(不是函数,尽管它没有非常描述性的名称),在这种情况下,它标记了已经遇到.
个字符。它从false
开始,并在读取true
字符后切换到.
。这就是if (ch == '.') f = true
的目的。
一旦找到.
字符,它将开始对数字进行计数。这是这些行的用途:
if ('0' <= ch && ch <= '9') num++; // Count a digit character
else break; // If not a digit, break the loop
中断循环后,其余代码仅打印找到的位数。
答案 2 :(得分:0)
该答案应该是注释,但注释不允许呈现更复杂的代码...
John Kugelman已经给出了一个适当的answer,但是代码的结构仍然可以更好:
if(haveSeenDecimalPoint)
// while braces are optional in given case, they still better are placed
// as the following code is pretty complex; you gain better overview
{
if('0' <= ch && ch <= '9') // optional; ressembles closer mathematical
// expression 0 <= ch <= 9
// (which cannot be written that way in C++!)
num++;
else
break;
}
// if decimal point HAS been found already, no need to check any further
// so place the else to avoid unnecessary checks (if another period occures,
// it's already covered by breaking on ch < '0' || ch >= '9')
else if(ch == '.')
{ // due to the newly introduced else: recommendation: if one branch needs
// braces, place on all of them – some coding conventions even mandate
// ALWAYS placing braces
haveSeenDecimalPoint = true;
}
不带注释的代码:
if(haveSeenDecimalPoint)
{
if('0' <= ch && ch <= '9')
num++;
else
break;
}
else if(ch == '.')
{
haveSeenDecimalPoint = true;
}
注意额外放置的空间,它们也提高了可读性。
答案 3 :(得分:0)
该循环正在执行两种不同的操作,并使用f
来跟踪其正在执行的操作。这通常令人困惑,并且代码可能应该写成两个单独的循环:
// skip until the decimal point
while ((ch = getchar()) != '\n' && ch != '.')
; // nothing to do here
// check that we haven't hit the end of the input
if (ch != '\n')
// count digit characters
while ((ch = getchar()) >= '0' && ch <= '9')
++num;
请注意,在最后一个循环中,没有'\n'
的显式检查;不需要这样做,因为'\n'
不在'0'
和'9'
之间,因此获取'\n'
将结束循环。