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...else
if(条件){
主体1;
} else {
主体2;
}
//else if
if (条件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] = {} //初始化为0
int a[5] = {1,2} //初始化为1,2,0,0,0
//读取
a[i];
复制
#include<cstring>
memcpy(b,a,sizeof(a)) //a复制到b
memcpy(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");//定义输入流fin
ofstream fout("huaiye.out");//定义输出流fout
int 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(){
;
}
};