知识点

①常用的函数及库

②小心使用全局变量

例如:

#include<cstdio>

int g = 0;

int f() { g++; return g; } //修改全局变量的函数

int main() {

   int a = f();

   int b = f();

   printf("%d %d\n", a, b);

return 0; }

运行后a!=b。

③精度问题

#include<cstdio>

int main() {

double f;

for(f = 2; f > 1; f -= 1e-6);

printf("%.7f\n", f);

printf("%.7f\n", f / 4);

printf("%.1f\n", 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 << "\n";
    }
return 0;
}

 

 

每行中所有整数之和。

string类在string头文件中,而stringstream在sstream头文件中。首先用getline函数读一行数 据(相当于C语言中的fgets,但由于使用string类,无须指定字符串的最大长度),然后用这 一行创建一个“字符串流”——ss。接下来只需像读取cin那样读取ss即可。

虽然string和sstream都很方便,但string很慢,sstream更慢,应谨慎使用

 

posted @ 2019-02-21 15:04  芩溪儿  阅读(212)  评论(0编辑  收藏  举报