#include
math.h数学函数
string.h跟字符串有关的函数-strlen、strcmp、strcpy、strcat、memset
等价写法 如cstdio,把“.h”换成 “c”开头
c/c++混合写法,命名.cpp。选择语言C++ 或G++
#include
using namespace std; //c++使用
ASCII码,0是48 A是65 a是97
一、数据类型
整数型:int (绝对值在109 即-231- - (231-1),109绝对值 ,用%d) 、long long(%lld)等 %md,%0md
字符型:char(-128~127) %c
浮点型:float(6~7位)、 %f %.1f保留一位
double(15~16位)等 scanf 读取时 %lf 输出还是%f
布尔型:bool 0‘false’ or 1(非零)‘true’ //.c文件需要加stdbool.h , .cpp则不用加头文件
字符串:char数组 %c
char字符串(%s) 读取时不用&,以空格和换行键为结束标志
int来说,一个整数占32bit(位)即4Byte(字节)
unsigned 表示无符号型(就是输出都是非负数):unsingned int 范围是0~232-1,,剪掉了负数位
两种写法char c=117,c='u' 输出都是u
字符常量使用CSAII码同一编码。
小写字母比大写字母的ASCII码值大32
0‘false’ or 1‘true’--程序员可以用1或者说是非零来表示true,但对计算机来说true存储时只用1
十六进制 ,以(这是数字零)0x开头a~f (10-11-12-13-14-15) 代码写法:\0x 或 \x
八进制:以(这是数字零)0开头 代码写法: \0数字 或 \数字
科学计数法e:小数e整数 表示“小数x10整数”
为什么是31不是32?因为只要不是unsigned无符号类型,那么有一位就需要存放0或1来表示正负号。0表示正数,1表示负数
值为整数类型(包括char类型)
c++输入的时候,不用写这些%d ,所以方便许多
二、赋值的运用
1、强制转换,以代码为例
#includeint main() { double r=12.96; int a=3; printf("%d\n",(int)r/a);//这种方法是在运算前转换 //如果不加(int),虽也会转换,但是是在运算后 ,将结果转换 }
2、符号常量与const常量
符号常量,例:#define pi 3.14
const常量,例:const float pi = 3.13;
注意谁用 “ ;”,推荐const常量
pi=pi+1写法错误。
#define 还可以定义语句或片段。(算法笔记13页有写到)
#defind CAL(x) (x*2+2) int a=2; printf(”%d“,CAL(x+1);
3、别名typedef
例:typedef long long LL;
作用:降低编码效率
4、c++中有 数据类型的自动转换,(兼容的是指都是一个数据类型,如:int 和short;不兼容的如 int 和float)
等号右边的会按照等号左边的类型转换
三、输入输出
1、
cin和cout消耗的时间比scanf和printf多的多。不要在同一个程序使用cout和printf。
2、
scanf("格式控制",变量地址);
scanf("%d"&n); //&取地址运算符。字符串:char数组 不加&
//双引号内的内容其实是整个输入如 “scanf(%d:%d:%d,&a&b&c);”输入需输入“24:28:46”才可正确运行。
//%c和%s都可读入空格,慎用。
3、
单个字符的输入输出:getchar与putchar。
重点是只能单个字符,多了也不读不写~
char c;
c=getchar();
四、运算符
算数运算符、关系运算符、逻辑运算符、条件运算符、位运算符、sizeof运算符
1、算数运算符
“/” 除法运算符,两个整型相除,结果不会是浮点型,而是舍去小数部分(即向下取整,如:5/6 结果为0)
a++ 和 ++a
a++是先用原来值,再加1(int a=1;//a++后,虽然a是2,但是如果将a++赋值给n1,那么n1是当前a 的值-1,即 上一数1)
++a先赋值再使用。(将其赋值,++a后a=2,赋值给n1,n1是当前a的值2)
score += 20 等于 score=score+20
以此类推 -= *= /= %=
上面这几种两个运算符组合的都是复合运算符
2、关系运算符
关系运算符只返回1或0
3.逻辑运算符
&&
||
!
4、条件运算符
条件运算符是三目运算符。( A?B:C //A为真执行B否则执行C,可写“c=a>b?7:11”)
目数:运算符所用到的操作数的个数 ,如“+”需要用到两个操作数,故程双目运算符。
5、位运算符
有时候需要对整数类型变量中的某一位bit进行操作。判断或改变
可参照计算机组成原理
都是转换成二进制对比
<< 左移 a<
>> 友移
& 按位与 a&=
| 按位或 a|=
^ 按位异或 a^b
~ 取反 ~a 将操作数中的二进制位 0变1 、1变0
6、sizeof
sizeof(变量名/类型名)变量名/类型名所占的字节数
PS:优先级未写完
从最优先到最后
:: 作用域限定运算符
后置++ 后置-- [] () . ->
前置++ 前置-- +(正号) - ! ~ *(取指针内容) &(取地址) (类型名) sizeof new delete
算数运算符
<< >>
逻辑运算符
位运算符
关系运算符
条件运算符
复合运算符
,(逗号)
五、数组
5.5、字符串
1)输入的字符串不超bai过限定大小
get(str,Size):读取所有字符du,遇到'\n'时止,并且将zhi'\n'留在输入缓冲区中,其将被下一个读取输入的操作捕获,影响该输入处理;
getline(str,Size):读取所有字符,遇到'\n'时止,并且将'\n'直接从输入缓冲区中删除掉,不会影响下面的输入处理。
2)输入的字符数超出限定的大小
get(str,Size):读取Size-1个字符,并将str[Size-1]置为'\0',然后将剩余字符(包括'\n')留在输入缓冲区中,这些字符将被下一个读取输入的操作捕获,影响该输入处理;
getline(str,Size):读取Size-1个字符,并将str[Size-1]置为'\0',剩余字符(包括'\n')留在输入缓冲区中,随即设置cin实效位(即if(!cin)的判断为真),关闭输入。其后的所有输入都无法得到任何东西,当然也无法得到输入缓冲区中剩余的字符串。但如果象本例一样用clear()重置cin,其后的输入便可用并会得到遗留在输入缓冲区中的字符。
3)输入一个空行(即直接回车)
get(str,Size):str将得到'\0',并设置cin实效位,关闭输入,但回车依然留在输入缓冲区中,因此如果我们用clear()重置cin,其下一个读取输入的操作将捕获'\n';
getline(str,Size):str将得到'\0',并将'\n'删除掉,不置实效位,不关闭输入。所以对于cin.getline来说空行是合法的输入,且不会影响下面的输入处理。
至于使用那个更好,可能因人习惯不同而不同,仁者见仁智者见智。对于我们编程来说,总希望能有更好的容错性,即便用户输入了不合理的输入,程序也应该能够 提示并能够重新输入或继续正常处理,而因为用户的输入问题而导致程序错误或其后的所有输入都不可用显然不是我们希望的。使用get(str,Size)和 getline(str,Size),都可能碰到设置失效位,关闭输入的情况,故都是需要考虑到相应的防错处理的。
六、结构体
结构体定义理解:以已有的数据类型为原料,做出的自己的数据类型。
typedef struct { int a; char b; float c; }TypeA;
自己所定义的新的数据类型:TypeA(如:int、char、TypeA一样)
在函数中定义TypeA 类型的变量:
TypeA a; //好比一维数组 //类似定义了一个数组,又三个数据类型构成,a.a ;a.b;a.c // 类似定义数组 int a[3];包含的a[0],a[1],a[2] TypeA a[3]; //好比一个二维数组,每个a[1]都包含了一组a.a ;a.b;a.c 。
七、指针
指针:保存地址的东西(指针是专门保存地址的一种变量)
向系统申请一节身体的空间
系统返回这块空间的地址
定义一个指针来保存这个地址
八、函数
1、math数学函数
fabs(double x) 取绝对值函数
floor(double x) 向下取整
ceil(double x) 向上取整
round(double x) 四舍五入
sqrt(double x) 算数平方根
pow(double r,double p) rp
log(double x) 返回以自然对数e为底的对数 ,因为无logab这样子的函数,所以曲线救国,用换底公式:logab=logeb/logea
sin(double x)、cos(double x)、tan(double x) 参数要求是弧度制
asin(double x)、acos(double x)、atan(double x) 反正弦···
九、条件
if() { …… } else if() { …… } else{ …… }
两种表达if(n)=if(n!=0),即是说条件为真。if(!n)=if(n==0)即是说条件为假
十、多重选择
int a=1,b=2; switch(a+b){ //switch(表达式){……} case 常量表达式1: …… break; case 常量表达式2: …… break; case 2: printf("2"); break; case 3: printf("3"); break; ……
case n:
printf("n");
//最后一个没有 break;
}
输出结果:
3
break:强制退出,不再进行选择或循环。(循环选择都适用)
continue:结束当前循环,进入下一轮循环。
goto:用于无条件转到某个指定的位置。goto使程序可读性变差,一般不使用
十一、循环
1、while
while(条件A){ }
和 if 一样可省略 !=
2、do···while
do{ …… }while(条件);
与while的区别:先执行内容再判断条件;先判断条件再执行内容
注意while末尾的“;”
3、for
for(循环变量赋初值;循环条件;循环变量改变) { …… }
顺序:循环变量赋初值->循环条件->······->循环变量改变
PS:for(表达式省略)省略问题没有说。
break:强制退出,不再进行选择或循环。(循环选择都适用)
continue:结束当前循环,进入下一轮循环。
goto:用于无条件转到某个指定的位置。goto使程序可读性变差,一般不使用
十二、freopen读取文档(可用于程序试调)
可在多次需要输入数据时,把数据事先存进文档然后调用。
freopen("c:\\tmp\\test.txt","r",stdin); //字符串中的“\”要写两次 //r 代表读取文件 //stdin 标准输入 //c教材 第五版357页
十三、数组
int a[]; 一维数组 ,不赋值的话只是一个随机数 不是0
int b[][]; 二维数组,,赋值之外的没赋值的,默认为0
除此之外还有三维、四维和五维。
如果数组大小较大106级别,需定义在主函数外才可。因函数内部申请的空间来自系统栈,函数外部申请的空间来自静态存储空间。
对每个元素赋相同的值:memset和fill函数 (memset执行的快,但是memset容易搞错赋值)
memset(数组名,值,sizeof(数字名));//需要加头文件 string.h //memset按字节赋值 -1和0不会被搞错
fill 出自STL的algorithm
字符数组
赋值:char a[]={'a','d','a'};或char a[]="ada";直接赋值整个字符串 输出都是用%c
、正则表达
https://www.runoob.com/regexp/regexp-syntax.html