一、前提说明
笔者刚开始接触CCF,在看过一些大牛博客后,开始了学习之旅,该篇博客将记录本人在学习相关资料时一些零碎知识,以供以后的学习避免出现相似问题,同时贴出也为分享给有共同想法的博友进行参考,该篇博客会不定时更新,如有博友有补充可留言讨论。
二、知识笔记(C及C++)
1.定义较大数组(大概是10^6级别)时,需将其定义在主函数外,做全局变量,原因是函数内部申请的局部变量来自系统栈,允许申请空间较小,而函数外部申请的全局变量来自静态存储区,允许申请空间较大。
2.C的scanf()与printf()比C++中的cin和cout所消耗时间少得多;一个程序中使用cout和printf有时候会出现问题。
3.给一个数组中所有元素赋相同值有两种函数,memset和fill。
- memset需要函数头string.h;而fill在STL的algorithm头文件中。
- 使用memset函数赋0或-1,因为该函数按字节赋值(对每个字节赋同样的值,而0,-1的二进制补码分别均为0和1)不易出 错;若要对数组赋其他值,用fill函数。
- memset执行速度更快
4.在scanf完后,若要使用gets,应先在scanf后使用一次getchar接受换行符,再使用gets。因为gets识别换行符\n作为结束符。
5.数组做参数时,在函数中对数组元素修改操作就等同于对原数组元素进行修改操作,函数无法返回数组,但可以通过该种方法实现对数组的操作。
6.善用sscanf和sprintf
7.若想要影响原变量,可以通过借助函数的地址传递或借助C++中的引用。(注意:引用中的&并非地址运算符&,无取地址含义)
8.由于计算机采用有限位的二进制编码,因此浮点数在计算机中的存储并不总是精确的,故需引入一个极小数eps进行修正。经验表明eps取10^-8是一个合适的数字,如下使用代码片段,定义在全局中。
9.对于考虑到精度误差的浮点数关系运算符的解决方法(精度误差主要发生在浮点数比较)
#include<math.h>
const double eps =le-8; //误差控制
const double Pi=acos(-1.0); //圆周率3.1415926...
#define Equ(a,b) (fabs((a)-(b))<(eps)) //相当于a=b
#define More(a,b) (((a)-(b))>(eps)) //相当于 a>b
#define Less(a,b) (((a)-(b))<(-eps)) //相当于 a<b
#define MoreEqu(a,b) (((a)-(b))>(-eps)) //相当于 a>=b
#define MoreEqu(a,b) (((a)-(b))<(eps)) //相当于 a<=b
10.对于结构体的初始化,可以借助“构造函数”来进行,对于一个普通定义的结构体,其内部会生成一个默认的函数名与结构体名相同的构造函数(但不可见),该构造函数无需返回值。可借助如下代码片段理解。
struct studentInfo{
int id;
char gender;
//默认生成的构造函数,不可见
studentInfo(){}
};
11.结构体初始化之构造函数法,如下展示代码片段。
struct studentInfo{
int id;
char gender;
//通过重写(java中面向对象的概念),使该构造函数适应多种初始化情况
studentInfo(){}
//只初始化gender
studentInfo(char _gender)
{
gender=_gender;
}
//同时初始化gender和id
studentInfo(int _id ,char _gender)
{
id=_id;
gender=_gender;
}
};