编译时错误(complie-time error)
TIPS
-
培养并保持一种编程风格
-
认真对待编译器给出的错误/警告信息
-
写代码三思而后行(先画流程图)
-
注意检查最基本的语法
-
把可能有问题的代码行注释
-
换一个环境或开发工具试试
-
检查自己是否已经把所有必要的头文件全部include进来
-
留意变量的作用域和命名空间
-
休息一下
-
使用调试工具
运行时错误
这时的错误往往倾向于逻辑漏洞,而不是语法错误。
避免错误的另一个好方法就是把调试好的代码另外保存起来并不再改动它,然后把代码划分成各个模块,用它们来搭建新的应用程序。
TIPS
-
培养保持良好编程风格
-
多用注释,用好注释
-
注意操作符的优先级
-
不要忘记对用户输入和文件输入进行合理性检查
-
不要做任何假设,想当然
-
把程序划分成一些比较小的单元模块来测试
让函数返回错误代码
由来
- 当我们在使用之前的阶乘函数时,从13开始,数值发生错误,原因是我们的计算数值已经超出了给定空间所能存储的最大值。这时候我们就要使用一些方法让使用者知道这个问题。
climits头文件
- 这个头文件是从C的 limits.h 头文件引用过来的。
- 它主要列出了各种数据类型在给定操作系统上的取值范围
- 它讲每种数据类型的最大可能值和最小可能值都分别定义为一个常量供我们比较
如:
SHORT_MAX-----短整数数据类型在给定操作系统上的最大可能值
SHOUR_MIN-----...
USHORT_MAX----无符号整数类型的最大可能值( unsigned short 的最大值)
编程思考
在C++语言中,for循环对比while循环来说有一定的优势。(C++可以在任何地方声明变量)
比如,当我们对一个输入的值num进行求阶乘,而且为了保证代码的稳定性,我们不希望对输入的num值进行改变。
我们用for循环的话
for(int i=num,i<0;i++)...
我们用whlile循环的话,
int i=num;
while(i)...
当代码过多的时候,for循环语句还是占优势的。
代码实现
#include <iostream>
#include <climits>
using namespace std;
class Factorial
{
public:
Factorial( unsigned short in );
unsigned long get_Factorial();
bool inrange();
private:
unsigned short num;
};
Factorial::Factorial( unsigned short in)
{
num=in;
}
unsigned long Factorial::get_Factorial()
{
unsigned long sum=1;
//在这里可以看出for循环的优势!!
for(int i=num;i>0;i--)
{
sum*=i;
}
/* unsigned int thenum=num;
while(thenum)
{
sum*=thenum;
thenum--;
}*/
return sum;
}
bool Factorial::inrange()
{
unsigned long themax=ULONG_MAX;
for(int i=num;i>0;i--)
{
themax/=i;
}
if(themax==0)
return false;
else
return true;
}
int main()
{
unsigned short temp;
cout << "请输入一个数值..." << endl;
cin >> temp;
Factorial a(temp);
if(!a.inrange())
cout << "数值过大" << endl;
else
cout << a.get_Factorial() <<endl;
return 0;
}