《算法笔记》(胡凡)day1-C语言和C
引言
《算法笔记》是针对研究生复试上级,考取PAT等级,CCF的CSP认证编写的算法学习指导书籍,配合《算法笔记上级训练实战指南》效果更好。
写者作为一个CS专业的大学生马上面临着考研or保研的考验,因此对于能够抵机试成绩的算法等级考试具有浓厚兴趣,特此写文,记录自己学习算法的过程。
C/C++快速入门
一.简介
该部分是为了帮助读者快速上手编写程序所写,具有C/C++基础的读者,可以直接跳过了。
但是如果读者跟写者一样,学过C/C++的基础语法,但是对具体的细节不能熟练掌握可以按照需要选择合适的部分。
这里我们不再深究C/C++基础语法,只对算法中的常用部分进行说明。
另:这里我们以C语言为主,一方面是C++向下兼容C,可以用C处理C++的大部分问题,另一方面,相比C++,C的处理速度更快,能够一定程度上减少超时现象的出现。
二.数据类型的取值范围
这是很多人在写算法的时候容易忽视的一部分,因为在很多考试中,对于测试数据的范围往往有明确要求,了解这些变量的取值范围能够有效避免超出范围的情况。
1.整型
分为short,int,long long,其中short用到的比较少,不再赘述
对于int类,一个整数占据32bit,即4Byte,取值范围自然为
而对于long long类的长整型,一个整数占据64bit,也就是8Byte,取值范围为
2.浮点型
对单浮点型float来说,取值范围为
但是有效精度只有6~7位,对于精度要求高的问题不适用。
对于双精度double来说,取值范围为
有效位数为15~16位,比起float优秀得多。
二.常用的match函数
1.fabs(double x) 求绝对值
2.floor(double x)和ceil(double x)分别为向下和向上取整数
3.pow(double r, double p)求r的p次幂
4.sqrt(double x)算数平方根
5.log(double x)返回double型变量的以自然数为底的对数
6.sin(double x),cos(double x)和tan(double x)弧度制求三角函数
7.在第六条函数前加“a”会求反三角函数
8.round(double x)求x的四舍五入
三.数组
基础语法不再赘述,下面介绍数组中常用的函数
1.memset-对数组中每个元素赋一个相同的值
格式为:
memset(数组名,值,sizeof(数组名))
需要注意的是memset需要程序开头添加string.h头文件,只建议初学者只给数组赋值0或者-1。这是因为memset使用的是按字节赋值,即对每个字节赋相同的值,组成int型的4个字节会被赋成相同的值。如果要赋值为其他数字请使用fill函数,我们日后会说到。
2.字符数组
要注意字符数组会在末尾自动添加空字符“\0”,在使用gets和scanf输入时会自动添加到后面,并占据一个字符位置,而puts和printf就是通过识别\0来停止的。
特别提示1:结束符会占据一个字符长度,因此字符数组长度要比实际存储的字符串长度多1
特别提示2:如果不是使用scanf或gets输入字符串,例如使用getchar一定要在输入的每个字符串后手动添加\0,否则会有乱码。
3.string.h头文件
1.strlen()可以得到字符数组中第一个\0前的字符的个数
2.strcmp(字符数组1,字符数组2)返回两个字符串大小的比较结果,比较原则是按照字段顺序,如果1<2,返回一个负数;1==2,返回0;1>2,返回正整数。
3.strcpy(字符数组1,字符数组2)把2的内容复制给1,包括了结束符。
4.strcat(字符数组1,字符数组2)把2字符串接到1后面
四.指针与引用
1.引用与指针的区别
引用是C++中的语法。
众所周知,函数的参数是作为局部变量使用的,对局部变量的操作不会影响外部的变量,如果要修改传入的参数,就只能使用指针。但是引用可以不使用指针。引用实际不产生副本,而是给原变量起了一个别名。使用引用的方法很简单,只需要在函数的参数类型后面加一个&即可。