一、编译器

简单地说,编译器地任务就是把人类可以看懂地源代码编程机器可以直接执行地指令。

二、NOIP支持的C标准

从NOI官网上查到的标准竞赛环境中提到对于G++使用的是G++ 4.4.5,编译命令g++ test.cpp -o test,虽然是2012年3月20日更新的,不过估计这几年CCF也不会对编译器版本做了什么调整(调整了也会在官网说的)。

实际上NOIP考的大多是算法嘛,用C++最基本的一些功能和特性就好,不要去在考场上尝试那些复杂的东西,事实证明这样既没有开发效率也没有运行效率……
顺便,STL在前几年可以在考场上使用了,所以个人感觉C++对于NOIP来说最大的意义在于C with STL,嗯就酱

所以老老实实学习C++99的标准就好了。

三、换行

  1. \n

n = newline

四、stdio

stdio 是 standard I/O 的缩写,stdio.h 是一个头文件,这个头文件只包含了相关函数的声明和一些宏定义,而真正的函数定义是在库中,程序编译时用不上,程序运行时会连接到库。

五、float & double

C语言中,float和double都属于浮点数。区别在于:double所表示的范围,整数部分范围大于float,小数部分,精度也高于float。

举个例子:圆周率3.1415926535 这个数字,如果用float来表示,最多只能精确到小数点后面的6位。而double大约能精确到小数点后面的15位左右。具体精确到几位,跟所用的编译器有关,但是各个编辑器编译器之间,也是相差不大的。

至于整数部分,float表示的整数部分的范围,就已经够大了,能表示到万亿级别,已经大到没边了。而double所表示的整数范围,大到更没边了。实际开发中,除了个别高精领域,基本上,使用float就足够了。

六、 int

int类型在C语言中占4个字节,即32个二进制位。

当表示正数时,最高位为符号位(符号位为0),最大的正数是 0111 1111 1111 1111 1111 1111 1111 1111 即2^31 -1 = 2147483647

当表示负数时,最高位为符号位(符号位为1),最小的负数是 1000 0000 0000 0000 0000 0000 0000 0000 而在计算机中是以补码的形式存储的,C语言规定 1000 0000 0000 0000 0000 0000 0000 0000 的补码为-2147483648

所以C语言中int的取值范围为:-2147483648 ~ 2147483647

七、程序鲁棒性

鲁棒是Robust的音译,也就是健壮和强壮的意思。

鲁棒性(robustness)就是系统的健壮性。它是指一个程序中对可能导致程序崩溃的各种情况都充分考虑到,并且作相应的处理,在程序遇到异常情况时还能正常工作,而不至于死机。

比如说,计算机软件在输入错误、磁盘故 障、网络过载或有意攻击情况下,能否不死机、不崩溃,就是该软件的鲁棒性。

相应的处理,例如有异常处理 捕获异常,避免发生越界读写等等,这些要靠程序员的经验来完成。

八、黑盒测试

算法竞赛一般采取黑盒测试,事先准备好一些测试用例,然后用它们测试选手程序,根据运行结果评分。

九、随机数

1. rand()

C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand()。
不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随机的伪随机数。

rand()会返回一随机数值,范围在0~RAND_MAX间,RAND_MAX定义在stdlib.h,其值为2147483647。

  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. int main()
  5. {
  6. for (int i = 0; i < 10; i++)
  7. {
  8. cout << rand()%100 << " "; // 0 ~ 99
  9. }
  10. return 0;
  11. }

在100中产生随机数, 但是因为没有随机种子所以,下一次运行也是这个数,因此就要引出srand。

2. srand()

srand()可用来设置rand()产生随机数时的随机数种子。通过设置不同的种子,我们可以获取不同的随机数序列。

可以利用srand((int)(time(NULL))的方法,利用系统时钟,产生不同的随机数种子。不过要调用time(),需要加入头文件< ctime >。

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. using namespace std;
  5. int main()
  6. {
  7. srand((int)time(0)); // 产生随机种子 把 0 换成 NULL 也行
  8. for (int i = 0; i < 10; i++)
  9. {
  10. cout << rand()%100<< " ";
  11. }
  12. return 0;
  13. }

两次产生的数据就不一样了。。。

3. 宏定义替换rand()

为了方便的使用我们可以用宏定义来替换 rand函数。

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #define random(x) rand()%(x)
  5. using namespace std;
  6. int main()
  7. {
  8. srand((int)time(0)); // 产生随机种子 把0换成NULL也行
  9. for (int i = 0; i < 10; i++)
  10. {
  11. cout << random(100) << " ";
  12. }
  13. return 0;
  14. }