c++程序设计
by:小鸭呀
来源:信息学奥赛一本通+菜鸟教程+oiwiki+我的脑袋
本文章遵循cc协议,转载请署名
对于本文章的建议或纠错可以发表评论哦(=^^)
[TOC]
(如果支持的话应该上面会显示个目录)
让程序不闪退的神奇代码
system("pause")版本4.99以前
getchar() 约等于 system(“pause”)
注释
//这是一行注释/*这是有头有尾的注释*/标识符
含义:标识实体(变量名,函数名,对象名)
由大小写字母,下划线和数字0~9组成
必须以大小写字母和下划线开头
运算符
| 啥子运算符 | 干啥的 | 长啥样 |
|---|---|---|
| 算数运算符 | 数值运算 | +,-,*,/(如果俩操作数是整数,则为整除),% (俩操作数必须是整数) ,++,—(七种) |
| 关系运算符 | 比较运算 | >,<,==,<=,>=,!=(六种) 返回布尔值 |
| 逻辑运算符 | 逻辑运算 | &&,||,! |
| 位操作运算符 | 二进制运算 | &,|,~(非),^(异或),<<,>>(六种) |
| 赋值运算符 | 赋值运算 | 简单赋值(=),复合算数赋值(+=,-=,*=,/=,%=),复合位运算赋值(&=,|=,^=,<<=,>>=)三类共十一种 |
| 条件运算符 | 条件求值 | 条件?结果a:结果b 条件成立,用结果a,否则用结果b |
| 逗号运算符 | 把若干个表达式组合成一个表达式 | , |
| 指针运算符 | 取内容,取地址 | 取内容(*),取地址(&) |
| 求字节数运算符 | 数据类型所占字节数 | sizeof(数据类型) |
| 特殊运算符 | 玛卡巴卡 | ( ) [ ] . -> |
优先级
自己打括号
常用库函数
依赖cmath库:
| 格式 | 功能 |
|---|---|
| abs(x)/fabs(x) | 绝对值 |
| exp(x) | e的x次方 |
| floor(x) | 向下取整 |
| ceil(x) | 向上取整 |
| log(x) | x的自然对数 |
| pow(x,y) | x的y次方 |
| sqrt(x) | 根号 |
| round(x) | 四舍五入 |
| sin,cos,tan,acos,asin,atan | 三角函数 |
依赖cstdlib库
| 格式 | 功能 |
|---|---|
| rand() | 0到RAND-MAX之间随机取一个整数 |
依赖ctime库
| 格式 | 功能 |
|---|---|
| clock() | 返回程序从开始运行了多少秒 |
依赖algorithm库
| 格式 | 功能 |
|---|---|
| sort(a,a+n,cmp) | 对长度为n的a数组排序,用cmp方法 |
常量
定义常量
#define 变量名 数据
const 类型 变量名 = 数据;
常量初始化后不可以改变
整型常量
十进制形式
如:99,-1
八进制形式
0开头
如:012
十六进制形式
0x开头
如:0x12A
变量
int i = 5,j,k(5); //i,j,k为整型变量,i,k是5,j未知
a = b = c = 2 等同于 c = 2;b = c;a = b;
标准数据类型
整型与实型
| 数据类型 | 定义标识符 |
|---|---|
| 短整型 | short [int] |
| 整型 | [long] int |
| 长整型 | long [int] |
| 超长整型 | long long [int] |
| 无符号整型 | unsigned [int] |
| 无符号短整型 | unsigned short [int] |
| 无符号长整型 | unsigned long [int] |
| 无符号超长整型 | unsigned long long |
| 单精度实型 | float |
| 双精度实型 | double |
| 长双精度实型 | long double |
| 布尔 | bool |
| 枚举类型 | enum |
注:科学计数法是指数形式的表示方法,十进制小数E整数指数,例如
就是1.2E+5
枚举类型
enum 枚举名{ 标识符,标识符,标识符(=整型常数)} 枚举变量;//举个栗子enum food{drink,eat=5}c;c=drink;重定义数据类型
typedef int metre;转义字符
| 转义字符 | 含义 |
|---|---|
| \b | 退格 |
| \r | 不换行的回车 |
| \0 | 空 |
| \n | 回车 |
char类型里+32是大写转小写,-32是小写转大写
强制类型转换:类型名(被转换的可怜变量)
输入输出
事先说明:
#include<iostream>#include<cstdio> //这个章节的内容必须有这些语句using namespace std;cout用小于,cin用大于
getchar
输入单个字符,无参
char ch;ch=getchar();
putchar
输出单个字符,有参
putchar(66) 根据ASCII码66是字符B,输出B
cout
setw
要导入iomanip库
#include<iomanip>cout<<setw(6)<<a;setw控制输出的宽度
cstdio 库
输入
scanf("%类型",&变量名)
格式符:
| 格式符 | 说明 |
|---|---|
| d,i | 十进制整数 |
| u | 无符号十进制整数 |
| o | 八进制整数 |
| x | 十六进制整数 |
| c | 单个字符 |
| s | 字符串(非空格开始,空格结束) |
| f,e | 实数 |
附加格式说明符:
| 附加格式 | 说明 |
|---|---|
| l(L字母) | 长整型或double型 |
| h | 短型数 |
| 域宽(一个整数) | 输入多少东西 |
| * | 不赋值给变量 |
scanf(“%4d,%4d”,&a,&b);
cout<<a<<’,‘<<b<<endl;
如果输入的是12345678,则输入为1234,5678
scanf有返回值!!!!!
返回了成功读取的变量的个数哦!!!
while(scanf("%d",&x) != EOF){ 语句}如果成功读取,就执行语句
输出
printf(格式控制符,输出列表)
格式符
| 格式符 | 说明 |
|---|---|
| d或i | 十进制整数 |
| u | 无符号十进制整数 |
| x或X | 十六进制无符号整数(没有前导符0x) |
| o | 八进制无符号整数(没有前导符0) |
| c | 字符 |
| s | 字符串 |
| f | 单、双精度小数,一般6位 |
| e或E | 单、双精度以指数形式输出小数,一般6位 |
d格式符
| 参数 | 说明 |
|---|---|
| d | 数字本身长度 |
| md | 输出m位 |
| -md | 同上,但左对齐 |
| ld | 长整型 |
| mld | 输出m位,左补空格 |
| 0md或0mld | 位数不足m位补0 |
f格式符
| 参数 | 说明 |
|---|---|
| f | 实数格式,小数6位 |
| m.nf | 总位数m(含小数点),n位小数 |
| -m.nf | 同上,左对齐 |
s格式符
| 参数 | 说明 |
|---|---|
| s | 字符串 |
| ms | 指定宽度m |
| -ms | 同上,左对齐 |
| m.ns | 输出m个字符位置,字符数最多n个 |
| -m.ns | 同上,左对齐 |
分支
if
//基本if(条件){ 主体;}
//if...elseif(条件){ 主体1;} else { 主体2;}
//else ifif (条件1) { 主体1;} else if (条件2) { 主体2;} else if (条件3) { 主体3;} else { 主体4;}switch
case后面要加break哦
//实例switch (a){ case 1:{ xxx; break; } case 2:{ xxx; break; } default :{ xxx; }}循环
for
for(初始化;条件;更新){ 循环体;}while
while(条件){ 循环体;}do…while
do { 循环体;} while (条件);break 和 continue
break跳出循环,continue结束本次循环,前往下次循环
数组
初始化:
int a[5] = {1,2,3,4,5} //初始化int a[5] = {} //初始化为0int a[5] = {1,2} //初始化为1,2,0,0,0//读取a[i];复制
#include<cstring>memcpy(b,a,sizeof(a)) //a复制到bmemcpy(b,a,sizeof(/*a的数据类型*/)*k) //a复制k个元素到数组b清零
#include<cstring>int a[5];memset(a,0/*除了str类型的数组其它只能为0和-1*/,sizeof(a)) //清零二维数组
数组的数组
格式
数据类 数组名 [常量表达式1] [常量表达式2]
创造后为:常量表达式1行,常量表达式2列
程序运行时间
#include<ctime>#include<iostream>using namespace std;int main(){ ...代码 cout<<clock()/CLOCKS_PER_SEC<<endl; //输出用时}字符类型、字符数组和字符串
| 序号 | 函数 & 目的 |
|---|---|
| 1 | strcpy(s1, s2); 复制字符串 s2 到字符串 s1。 |
| 2 | strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。连接字符串也可以用 + 号,例如: string str1 = "runoob"; string str2 = "google"; string str = str1 + str2; |
| 3 | strlen(s1); 返回字符串 s1 的长度。 |
| 4 | strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。 |
| 5 | strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
| 6 | strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。 |
字符类型
一个字符
字符数组
装字符的数组
输入
gets(字符串名称);
getchar(); //返回字符,回车后才输入
只能输入一个字符串!!!
输出
puts(字符串名称);
putchar(一个字符);
输入后会自动换行
字符串
结尾为”\0“,不计入字符串的实际长度
字符串的输入输出
cin:输入、忽略开头的制表符、换行符、空格。遇到空格或换行停止(不会读取空字符)
getline:输入、直接读取一行内所有内容,包括空格。格式为getline(cin,字符串变量)
字符串的常用操作
| 字符串s的操作 | 意义 |
|---|---|
| s.empty() | s空?返回true否则false |
| s.size() | s中字符个数 |
| s[i] | s中第i个,从0开始 |
| s1+s2 | 连接s1和s2 |
| s1=s2 | s1替换为s2的副本 |
| s1==s2 | 一样true,否则false |
| !=,<,<=,>,>= | 原意,不变 |
| s.insert(pos,s2) | s里面pos位置前插入s2 |
| s.substr(pos,n) | 返回从pos起的n个字符,返回string |
| s.erase(pos,n) | 删除从pos起的n个字符 |
| s.replace(pos,n,s2) | 替换从pos起的n个字符为s2 |
| s.find(s2,pos) | 寻从pos下标起查找s2第一次出现的位置,找不到返回string::npos |
| s.c_str | 返回与s内容相同的C语言风格的字符串临时指针 |
| sscanf(s,“%d”,%N) | 约等于n=int(s) |
| sprintf(s,“%d”,N) | 约等于s=str(n) |
| s.substr(2,4) | python中s[2,2+4-1] |
字典序
定义
从前往后,挨个比较。第i不同,用i比较。如果相等,谁长谁大。一样的话,相等。
方法
s1.compare(s2)
如果相等返回0,s1小于s2返回小于0,s1大于s2返回大于0
注意
字符串和字符数组的区别在于字符串的结尾是’\0’
函数
定义
void swap(int &a,int &b);//声明//主体void swap(int &a,int &b){ int tmp = a;a = b;b = tmp;}传址调用
匿名函数
[闭包](参数){函数体} //不指定返回值类型[闭包](参数) -> 返回值类型 {函数体} //指定返回值类型闭包
[] //未定义变量.试图在Lambda内使用任何外部变量都是错误的.[x, &y] //x 按值捕获, y 按引用捕获.[&] //用到的任何外部变量都隐式按引用捕获[=] //用到的任何外部变量都隐式按值捕获[&, x] //x显式地按值捕获. 其它变量按引用捕获[=, &z] //z按引用捕获. 其它变量按值捕获//来源:https://www.cnblogs.com/pzhfei/archive/2013/01/14/lambda_expression.html文件操作
freopen
需要导入cstdio库
#include<cstdio>freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);fclose(stdin);fclose(stdout);/*freopen("CON","r",stdin);freopen("CON","w",stdout);*/fopen
fopen版本
//定义文件指针FILE *fin,*fout;fin=fopen("in.txt","rb");fout=fopen("out.txt","wb");fscanf(fin,"%d",&temp);fprintf(fout,"%d\n",sum);fclose(fin);fclose(fout);//切换回标准输入输出fin=stdin;fout=stdout;fscanf(fin,"%d",&temp);fprintf(fout,"%d\n",sum);流
#include<cstdio>#include<fstream>ifstream fin("haoye.in");//定义输入流finofstream fout("huaiye.out");//定义输出流foutint main(){ //fin输入,fout输出,用法和cin,cout一样 fin.close(); fout.close(); return 0;}结构体
建立
struct 名字 { 类型名 变量名; 结构体名字指针 变量名;} 变量名;访问
名字.元素指针->元素(*指针).元素指针
定义和运算
| 说明 | 样例 |
|---|---|
| 定义:类型 *变量名 | int a=10;int *p; |
| 取地址运算符:& | p = &a; |
| 间接运算符:* | *p = 20; |
指针可以和整数加减,每加一,偏移一个类型的长度
初始化
| 方法 | 说明 |
|---|---|
| int *p = NULL; | 声明零指针 |
| int a;int *p=&a; | p初始化为a的地址 |
| int *p = new(int); | 申请一个空间给p,*p内容不确定 |
无类型指针
void *p;int a = 10;p = &a;cout<<*(int*)p<<endl;指针作为函数参数
void swap(int *x,int *y){ int t=*x; *x=*y; *y=t;}函数指针
int t(int a){ return a;}int main(){ cout<<t<<endl; int (*p)(int a);//定义函数指针变量,不能写成*p(int a) p=t; cout<<p(5)<<","<<(*p)(10)<<endl; return 0;}还有一种定义的方法
void t1(){cout<<"1";}void t2(){cout<<"2";}void t3(){cout<<"3";}void t4(){cout<<"4";}int sum(int a,int b){return a+b;}typedef int (*LP)(int,int);typedef void(*aa)();int main(){ aa a[]={t1,t2,t3,t4} a[1](); //输出2 LP p = sum; cout<<p(2,5); //返回7}结构体指针
struct a{ float b;} *p;//这个可以a *p;//这个也行//应用结构体指针变量p->b(*p).score动态
int *p = new int(1234);delete p;int *p = new int[114514];delete[] p;类(oop)
//基本:class 类名{ //访问修饰符:private/public/protected //变量 //方法 返回类型 operator/*跟上要改的运算符号*/(参数){ 阿巴阿巴; }; virtual int haoye(){//调用函数的时候都用子类的,不用这个函数 ; }};//派生类class 好耶 : public/*访问修饰符*/ 坏耶 ,其他父类...{ 阿巴阿巴; int haoye(){ ; }};