c++语法快速入门
准备研究生复试,刷算法题前看了看书前的语法快速入门
本着随便看看的态度来看的,但还是发现了很多以前的盲点,我列举如下
- c++的cout和cin看似简单许多,且不用填写类型,可实际上运行起来极为耗时,所以c与c++混用时,不应偷懒用cout,cin,而是要用scanf和printf
- 建议使用.cpp文件进行编辑
- 浮点数优先double类型,因为其精度更高
- scanf对于double是“%lf”,而printf对于double是“%f”
- 字符是“%c”,字符串是“%s”
- 一般的常量定义用const而不是#define,如果用#define,尽量只用于常量定义,如果硬是要用来实现类似函数的功能,括号千万别忘
- 三目运算符 ?:
- ^是位异或
- long long才是长整型其对应的为“%lld”
- 在scanf中要加&(表地址),char数组(也即字符串)例外【因为数组的名称即地址】
- 几种实用的输出格式
- %md
m位右对齐输出(对齐的位补 空格 ),超出m位则原样 - %0md
m位右对齐输出(对齐的位补 0 ),超出m位则原样 - %.mf
即保留小数点后m位(此类题目即用该表示方法!)
- %md
- 常用的math函数
首先要加一个<math.h>的头文件-
fabs(double x)
绝对值 -
floor(double x)
–向下取整,ceil(double x)
–向上取整 -
pow(double r,double p)
,次幂,返回值为r^p -
sqrt(double x)
返回算术平方根 -
log(double x)
即lnx,如果要计算以非e为底数的对数,应该用换底公式:
(log(a)B)=log(B)/log(a) -
sin(double x)
、cos(double x)
、tan(double x)
注意这三个函数的参数是弧度制!
所以一般用法是:const double pi = acos(-1.0) //可以表示pi的大致精准值 double db1 = sin(pi * 45 /180)//表示四分之pi
-
asin(double x)
、acos(double x)
、atan(double x)
反正弦函数 -
round(double x)
对变量四舍五入
-
- 对于
for
循环,c语言不允许在表达式第一部分定义变量,即for(int i = 0;;)
非法,而c++允许,所以后缀是cpp很重要 - 定义数组时的数组大小应为整数常量,不可以是变量,即
int n = 10; int a[n]
错误 - 数组初始化时如果想全赋值为0有两个办法:
//有大括号便给没有赋值的数默认赋值0 int a[10] = {}; //但是更加推荐使用memset函数 int b[10]; memset(b,0,sizeof(b));//这里千万要注意第二个参数,只推荐用0或-1,因为它的作用是补码全为某值,如果是1,对于一个int类型而言,那就是“11111111 11111111 11111111 11111111”
- 字符数组的初始化才允许用一个字符串赋值,其他情况不允许
char str[10] = "good story";//right char str1[10]; str1 = "sad story" //wrong
scanf()
和gets()
都会自动添加\0
作为结尾,所以用这两个函数输入的时候要注意数组大小,比如说:一个大小为10的数组,那么就只能放9个字符,最后一个用来结尾
另外,scanf()
以空格和换行作为输入结束,而gets()
只以换行作为输入结束,
所以输入”link start“对scanf()
而言是”link“,对gets()
而言是“link start”
还有一点就是,scanf()
和gets()
各有千秋,要视情况而用<string.h>
头文件-
strlen(char str[])
即数组长度 -
strcmp(char str1[],char str2[])
按字典序比较两个字符串的大小str1 < str2 则返回负整数(不一定-1)
str1 = str2 则返回0
str1 > str2 则返回正整数(不一定+1) -
strcpy(char str1[],char str2[])
把str2复制给str1(包括了结束字符) -
strcat(char str1[],char str2[])
把str2接到str1后面
-
sscanf()
和sprintf()
sscanf()可以使得屏幕输入变成字符数组输入,即把一个字符数组的值输入到某个变量中
sprinf()则是同理,可以使得屏幕输出变成输出到字符串中int n; char str[100] = "123"; sscanf(str,"%d",&n); //可以做到字符串和整型的类型转换
如此则可以实现其他类型到字符串类型的转换- 结构体里面可以定义除了自己本身以外地任何数据类型。不过虽然不可以定义自己本身,但可以定义自身类型的指针变量。
struct node{ node n;//wrong node* next;//right }
21.浮点数比较时的精度修正(5种情况)
所用方法是引进一个极小数,用偏差与其比较即可
1. ==
```
const double eps = 1e-8 //即10的负8次方
#define Equ(a,b) ((fabs((a)-(b)))<(eps))
//功能段
if(Equ(a,b)) return true;
else return false;
```
2. >
`#define More(a,b) (((a)-(b))>(eps))`
3. <
`#define Less(a,b) (((a)-(b))<(-eps))`
4. >=
`#define MoreEqu(a,b) (((a)-(b))>(-eps))`
5. <=
`#define LessEqu(a,b) (((a)-(b))<(eps))`
22.单点测试和多点测试
单点测试就是把你的程序执行多次来测试
多点测试是你的程序支持多次输入
重点谈多点测试:
有几种类型:
1. while…EOF型
题目没有给出输入的结束条件
while(scanf("%d",&n) != EOF){...}//Ctrl+Z可退出
2. while…break型
当要求输入数据满足某个条件时停止输入
while(scanf("%d",&n) != EOF){if(n = 0) break;....}
3. while(T–)型
题目说明会给定组数
scanf("%d",&T);
while(T--){....}