①常用的函数及库
②小心使用全局变量
例如:
#include<cstdio>
int g = 0;
int f() { g++; return g; } //修改全局变量的函数
int main() {
int a = f();
int b = f();
printf("%d %d ", a, b);
return 0; }
运行后a!=b。
③精度问题
#include<cstdio>
int main() {
double f;
for(f = 2; f > 1; f -= 1e-6);
printf("%.7f ", f);
printf("%.7f ", f / 4);
printf("%.1f ", f / 4);
return 0; }
输出如下:
0.9999990
0.2499998
0.2
分析发现,在不断减1e-6的过程中出现了误差,使得循环终止时f并不等于1,而是比1小 一点。在除以4保留1位小数时成了0.2。如果不出现误差,正确答案应该是0.25四舍五入保留 一位小数,即0.3。有 一种方法可以缓解这种情况:加上一个EPS以后再输出。这里的EPS通常取一个比最低精度 还要小几个数量级的小实数。例如,要求保留3位小数时取EPS为1e-6。(但是不总是可行的)
④C++ string类型
C++提供了一个新的string类型,用来替代C语言中的字符数组。用户仍然可以继续用 字符数组当字符串用,但是如果希望程序更加简单、自然,string类型往往是更好的选择。 例如,C++的cin/cout可以直接读写string类型,却不能读写字符数组;string类型还可以像 整数那样“相加”,而在C语言里只能使用strcat函数。
例题:输入数据的每行包含若干个(至少一个)以空格隔开的整数,输出每行中所有整数之和。
#include<iostream> #include<string> #include<sstream> using namespace std; int main() { string line; while(getline(cin, line)) { int sum = 0, x; stringstream ss(line); while(ss >> x) sum += x; cout << sum << " "; } return 0; }
每行中所有整数之和。
string类在string头文件中,而stringstream在sstream头文件中。首先用getline函数读一行数 据(相当于C语言中的fgets,但由于使用string类,无须指定字符串的最大长度),然后用这 一行创建一个“字符串流”——ss。接下来只需像读取cin那样读取ss即可。
虽然string和sstream都很方便,但string很慢,sstream更慢,应谨慎使用