浮点数的比较,可能是个坑,因为存在误差的存在,可以下列方式解决
- const double Pi = acos(-1.0) // 顺带提一下圆周率pi的定义
const double eps = 1e-8;
#define Equ(a, b) (fabs((a) - (b)) < (eps)) // ab相等返回true
#define More(a, b) (((a) - (b)) > (eps)) // a大于b返回true
#define Less(a, b) (((a) - (b)) < (-eps)) // a小于b返回true
#define MoreEqu(a, b) (((a) - (b)) > (-eps)) // a大于等于b返回true
#define LessEqu(a, b) (((a) - (b)) < (eps)) // a小于等于b返回true
数组
- 数组作为函数参数时,对数组中的元素进行修改就等同于对原数组进行了修改
void fun(int a[], int b[][5]) {}; 作为参数时,一维数组第一维不需要填写长度(二维数组第二维不用填写长度)
数组不能做返回类型
指针
- 指针定义:int *p1, *p2, *p3 = &a;
int *p = &a; p = &a; // p是a的地址,*p是a的内容
所以在传值的时候,可以将变量的地址传过去(如下):
定义:void fun(int *a){}; 使用:fun(&b) 这样就将b地址传过去了,或者下面这样
定义:void fun(int &a){}; 使用:fun(b) 这样叫引用(这里的&是引用、取别名,不是取地址),给变量b起一个别名a,但他们的地址是相同的
int a = 1; a是常量还是变量? a的地址(&a)是常量、不变的,a的内容是变量、是可以赋值的;所以a是变量
结构体
-
struct studentInfo {
int id; // 内部除了自己(studentInfo A;)其余的数据类型都可以定义
studentInfo *next; // 如:这里定义自身类型的指针变量
}A, B, stu[10]; // 可以在定义结构体的时候,直接定义表示这个结构体的变量或指针,和放在其他地方没区别
studentInfo A, B, stu[10]; // 这里就是在其他地方定义,没有区别 -
结构体的访问一般有两种方式,普通变量用’.’,指针变量用’->’
studentInfo a, *p; (访问方式:a.next, p->next) -
结构体初始化,可以定义结构体变量之后,逐一对内部成员赋值,此外还可以在结构体内写构造函数
struct studentInfo {
…
studentInfo(){} // 默认的构造函数
studentInfo(int a){} // 可以自定义多个构造函数
studentInfo(int a, int b){}
};
多点测试,数据输入问题
- 没有给定结束条件,默认读到文件尾:
对scanf来说如果读入2个数据,会返回2,没有读到数据返回-1,C语言中用EOF来代表-1
while(scanf("%d", &n) != EOF) {}
如果读入的是字符串,可以这么写:
while(scanf("%s", str) != EOF) {}
while(gets(str) != NULL) {}
参考:《算法笔记》