《面向对象程序设计》课程作业二
编写一个程序,要求根据给定的圆的半径求圆的面积,并将求得的结果打印出来。……建立一个工程,将程序写成两个.cpp和一个.h的形式。
这个问题倒是没什么难的,但对于同学们来说是一个上手模块化的好开端。从现在开始,不是只为了AC而写代码,而是要写“有质量的代码”、“让别人看得懂的代码”。在我看来,每行每业都有前人总结的“经验”。那“高内聚低耦合”、“模块化”,这两条就是编程中很重要的两条道理。第一个是问题的粒度,如果问题的规模很大,就应该将其分模块,然后逐个攻破。这样子做代码结构、脉络清晰,使得思路容易分析,然后方便debug、合作编程和迭代。电脑还是挺死板的,你怎么打代码它就按照你的代码做。但如果你只是为了AC写代码,写出来的代码杂乱、命名不规范、格式乱套、没有分模块……让别人想看的欲望都没有,那你就不适应合作编程的要求。巨大的工程很难由一个人单独完成,刷boss也得组几个队友对不对?
我之前的计算器作业中是有分多个文件的。但我在一个 .h 头文件中同时包括了函数声明和定义。这次的作业让我学到了一个只将声明放在 .h 中,而定义全放到新的 .cpp 文件中去。这样子做,如果别人想看你的代码能做到什么功能,只需看 .h 中的所有函数声明即可。
cin输入检测
基于栋哥上课提出的问题:
int a, b;
cin >> a >> b;
cout<< a + b;
/* 输入 3a5
输出 3 (a = 3,b = 0) */
下面节选自 人民邮电出版社《C++ Primer Plus》 第六版 第755页内容:
不同版本抽取运算符查看输入流的方式是相同的。跳过空白(空格、换行、制表符),直到遇到非空白字符。…… >> 运算符将读取一个指定类型的数据。
在上面这个例子中,输入 3a5
那么 3 赋值给了变量a
,输入中的字符a会留在输入流中等待下一条 cin
语句。输入时没有满足程序期望的情况,例如上面的变量b
,这种情况下,将不会改变变量b
的值(因此,如果b有初始化的话,那么b会保持初始化的值)。cin中有一些状态,会设置为false。这个false的返回值可以让if
、while
语句来判定输入是否满足要求。
C++ 的一个与 C 最大的区别就在于类。C语言中用 %d
、scanf
的返回值这样的东西来检测输入。而 C++ 将其封装成各种成员函数。详细可以看看这两篇博客:
-
cin.fail() 示例代码简洁易懂。
-
cin.get,cin.clear以及cin.sync 这篇比较详细。
Something else
这个例子(输入3a5
)让我想到了我之前的程序。我之前是写了挺多的输入检测方面的函数,比方说输入题目数量时可以检测出输入字符串并报错然后提示用户重新输入一遍。然后我猛地一想到好像类似于 3a5
的我没办法检测出来。
如图所示,在输入题目数量时,输入3a5
。程序会认为用户输入的题目数量为3,然后a5
留在缓冲区中等待下一条输入,并被检测答案输入的有效性的函数给挡住,并输出错误提示。
这是我之前的检测代码:
while (scanf_s("%d", &input) != 1)//输入的不是%d
{
while ((ch = getchar()) != '\n')
putchar(ch);//如果用户输入了字符串,就显示这个字符串,并且在显示“不符合要求”
}
在这段之后再加上这一条
while((ch = getchar()) != '\n' && ch != EOF);//清空缓存区