《算法竞赛入门经典 第2版》知识点总结

1.整数 - 浮点数 = 浮点数。

2.圆周率表示:const double pi = acos(-1.0)。(其中"acos"为求反余弦)。注:尽量用const关键字声明常数

3.在算法竞赛中,不要使用头文件conio.h,包括getch()、clrscr()等函数。

4.在算法竞赛中,每行输出均应与回车符结束,包括最后一行。输出的每两个数或者字符串之间应与单个空格隔开。

5.如果有多个并列、情况不交叉的条件需要一一处理,可以用else if语句。

6.建议尽量缩短变量的定义范围。例如,在for循环的初始化部分定义循环变量。

7.目前几乎在所有的比赛平台上,int都是32位整数。

8.因为只要末6位,所以输出时对10的6次方取模

9.scanf("%d, &x)的输入格式:空格、TAB和回车符都是无关紧要的,按Enter键并不意味着输入的结束。

10.如何将程序输入结束:在windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后再按Enter键,即可输入结束。

在Linux下,输入完毕后按Ctrl+D键即可结束输入。

11."scanf("%s",s)"会读入一个不含空格、TAB和回车符的字符串,它遇到空白字符会停下来

12.变量在为赋值之前的值是不确定的。特别地,它不一定等于0。

13.在算法竞赛中,常常难以精确计算出需要的数组大小,数组一般会声明得稍大一些。在空间够用的前提下,

浪费一点不会有太大影响。

14.比较大的数组应尽量声明在main函数外,否则程序可能无法运行。

15.数组不能够进行赋值操作。(数组a = 数组b,错误)

16.如果要从数组a复制k个元素到数组b:memcpy(b,a,sizeof(int)*k)。如果数组a和b都是浮点型,复制时要写成"memcpy(b,a,sizeof(double)*k)"。如果需要把数组a全部复制到数组b中:memcpy(b,a,sizeof(a))。另外,使用memcpy函数要包含头文件string.h

17.memset(a,0,sizeof(a))的作用是把数组a清零,在string.h中定义。

18.空字符"\0"是C语言中字符串的结束标志。

19.在语法上可以把字符当作int型使用。

20.printf输出到屏幕fprintf输出到文件sprintf输出到字符串(包含在头文件string.h中)。

注意:应保证字符串足够大,可以容纳输出信息。

21.strchr的作用是在一个字符串中查找单个字符。包含在头文件string.h中。

22.C语言中的字符串是以"\0"结尾的字符数组,可以用strlen(s)返回字符串s中结束标记之前的字符个数。

字符串中的各个字符是s[0],s[1],…,s[strlen(s)-1]。

23.由于字符串的本质是数组,它也不是“一等公民”,只能用strcpy(a,b),strcmp(a,b),strcat(a,b)来执行“赋值”、“比较”和“连接”操作,而不能用"="、"=="、"<="、"+"等运算符。上述函数都在string.h中声明。

24.滥用"++"、"--"、"+="等可以修改变量值的运算符很容易带来隐蔽的错误。建议每条语句最多只用一次这种运算符,并且所修

改的变量在整条语句中只出现一次。

举例:

#include
int main()
{
    int count = 0;
    printf("%d %d %d\n",count++,count++,count++);
    return 0;
}

运行结果:

《算法竞赛入门经典 第2版》知识点总结_第1张图片

解释:unspecificed行为,在函数的多个参数里多次改变同一个变量的值,其改变的顺序是没定义的,可能从前往后算,也可能从后往前。即:对count的运算可能是没有定义的。

解决方法:可以利用编译器减少这种错误。用-Wall命令编译,编译器会发出警告。

25.函数floor(x)返回不超过x的最大整数。所在头文件:#include <math.h>。

26.使用fgetc(fin)可以从打开的文件fin读取一个字符。一般情况下应当在检查它不是EOF后再将其转换成char值。从标准输入读取一个字符可以用getchar,它等价于fgetc(stdin)

27.“fgets(buf,maxn,fin)”将读取完整的一行放在字符数组buf中。应当保证buf足够存放下文件的一行内容。除了在文件结束前没有遇到“\n”这种特殊情况外,buf总是以“\n”结尾。当一个字符都没有读到时,fgets返回NULL标准输入版:gets(s)

28.2 ^ 8 - 1用C语言表示:(1<<8) - 1。注意:括号是必需的,因为“<<”运算符的优先级没有减法高。

29.为了使用方便,往往用“typedef struct { 域定义; }类型名;”的方式定义一个新类型名。这样,就可以像原生数据类型一样使用这个自定义类型

用法举例:

①“struct 结构体名称{ 域定义; };”:

    struct Point{double x, y;};
     
    double dist(struct Point a, struct Point b)
    {
        return hypot(a.x - b.x, a.y - b.y);
    }

②“typedef struct { 域定义; }类型名;”:

    typedef struct{double x, y;}Point;
    
    double dist(Point a, Point b)
    {
        return hypot(a.x - b.x, a.y - b.y);
    }

 

你可能感兴趣的:(C/C++,算法/数据结构)