我的c++笔记-本部(暂时更新到树)
宇宙安全声明:如有侵权必删除
有遗漏的知识点请大佬指出
数据结构见-这里
更新进度—普及组:树的基本概念
include<iostream>
using namespace std std的命名空间\ int main()主函数\
基础(指一般第一节课学的内容)
cout<< 输出\ cin>> 输入
定义变量
类型 变量名\ const<数据类型><常量名> 定义常量\ sizeof 查看数据类型
类型:
字符型 char\ 整形 int 最大2,147,483,647\ 浮点形 floot\ 双精度浮点形 double\ 布尔 bool\ string字符串
if语句
if(条件){ 满足条件执行\ 执行的程序\ }
if(){ 满足执行if中的,不满足执行else里的\ 执行的程序\ }\ else{\ 执行的程序\ }
if(){ 满足执行if中的,不满足判断else if里的,都不满足执行else内的\ 执行的程序\ }\ else if(){\ 执行的程序\ }\ else{ 注:else可要可不要\ 执行的程序\ }
逻辑运算符
! 非\ && 与\ || 或
判断条件1?判断条件2:判断条件3
简易版的if elseif else\ 满足1执行2\ 不满足执行3
switch语句:(哥们,你有什么用处?)
switch(条件){\ case 条件:\ 执行的程序;\ case 条件:\ 执行的程序;\ break不在进行下面的判断\ }
\ case判断switch条件\ break结束switch语句\ default条件全部不满足执行
while循环:
while(条件){满足条件执行\ 执行的程序 }
do{执行1次后判断条件\ 执行的程序\ }while(条件)
for循环:
for(初始化变量;条件;改变变量){\ 执行的程序\ }\ 换种说法:\ for(起点;终点;经过){\ 执行的程序\ }
例如:for(int i=1;i<=100;i++)
数组
常规定义
- 数组类型 数组名称[个数]={元素1,元素2,元素3}\
- 数组类型 数组名称[个数]={}全为0\
- 数组类型 数组名称[个数]={元素1}处声明的元素1外其余为0\
- 数组类型 数组名称[个数]随机分配数\ 索引从0开始,而个数从1开始(索引用于调用,个数用于建立)
字符数组
『
见 include<cstring>』快捷输出
int a[gs]; for(int i=0;i<gs;i++){ cout<<a[i]; }快捷输入
int a[gs]; for(int i=0;i<gs;i++){ cin>>a[i]; }二维数组
定义:类型 数组名[行长度][列长度]={元素1,元素2,元素3}{元素1,元素2,元素3}\ {}数量为行长度,{}里元素数为列长度\ 当数量不等于长度时,自动生成补足
调用
数组名[行索引][列索引]\ 行索引和列索引都以0开始\ |a[0][0]|a[1][0]|a[2][0]|a[3][0]|\ |a[0][1]|a[1][1]|a[2][1]|a[3][1]|\ |a[0][2]|a[1][2]|a[2][2]|a[3][2]|
快捷输出
int a[行长度][列长度]; for(int j=0;j<行长度;j++) { for(int i=0;i<列长度;i++) { cout<<a[j][i]; } }快捷输入
int a[行长度][列长度]; for(int j=0;j<行长度;j++) { for(int i=0;i<列长度;i++) { cin>>a[j][i]; } }处理高精度数据
使用字符型数组进行储存\ 运算时转换成整型数组进行运算
读入
static const int LEN = 1004; int a[LEN], b[LEN], c[LEN], d[LEN]; void clear(int a[]) { for (int i = 0; i < LEN; ++i) a[i] = 0; } void read(int a[]) { static char s[LEN + 1]; scanf("%s", s); clear(a); int len = strlen(s); for (int i = 0; i < len; ++i) a[len - i - 1] = s[i] - '0'; }
read(b)输出
void print(int a[]) { int i; for (i = LEN - 1; i >= 1; --i) if (a[i] != 0) break; for (; i >= 0; --i) putchar(a[i] + '0'); putchar('\n'); }
print(c)加法
void add(int a[], int b[], int c[]) { clear(c); for (int i = 0; i < LEN - 1; ++i) { c[i] += a[i] + b[i]; if (c[i] >= 10) { c[i + 1] += 1; c[i] -= 10; } } }
add(a,b,c)乘法
void mul(int a[], int b[], int c[]) { clear(c); for (int i = 0; i < LEN - 1; ++i) { for (int j = 0; j <= i; ++j) c[i] += a[j] * b[i - j]; if (c[i] >= 10) { c[i + 1] += c[i] / 10; c[i] %= 10; } } }
mul(a,b,c)减法
void sub(int a[], int b[], int c[]) { clear(c); for (int i = 0; i < LEN - 1; ++i) { c[i] += a[i] - b[i]; if (c[i] < 0) { c[i + 1] -= 1; c[i] += 10; } } }
sub(a,b,c)除法(带余)
bool greater_eq(int a[], int b[], int last_dg, int len) { if (a[last_dg + len] != 0) return true; for (int i = len - 1; i >= 0; --i) { if (a[last_dg + i] > b[i]) return true; if (a[last_dg + i] < b[i]) return false; } return true; } void div(int a[], int b[], int c[], int d[]) { clear(c); clear(d); int la, lb; for (la = LEN - 1; la > 0; --la) if (a[la - 1] != 0) break; for (lb = LEN - 1; lb > 0; --lb) if (b[lb - 1] != 0) break; if (lb == 0) { puts("> <"); return; } for (int i = 0; i < la; ++i) d[i] = a[i]; for (int i = la - lb; i >= 0; --i) { while (greater_eq(d, b, i, lb)) { for (int j = 0; j < lb; ++j) { d[i + j] -= b[j]; if (d[i + j] < 0) { d[i + j + 1] -= 1; d[i + j] += 10; } } c[i] += 1; } } }
div(a,b,c,d)//d为余数\输出时需单独print(d)函数
定义:返回值类型 函数名(参数类型 参数1,参数类型 参数2){参数数量按需要来定\ 执行的程序;\ return;\ }\ 注:定义结束需要个return
返回值类型填写:
void 没有返回值\ int 整型\ char 字符型
指针:(这也是个没有用的哥们)
定义:
int 指针名
注:指针为指向某一个数值的地址如:int pp为指针赋值:
指针名=&变量名
此时这个指针指向这个数值变量或int 指针名=&变量名定义的同时使其指向这个数值变量如:p=&ap指向a如:int p=&a定义p的同时使其指向a指针名=数组名
此时这个指针指向整个数组或指针名=&数组名[0]此时这个指针指向整个数组如:p=ap指向数组a如:p=&a[0]p指向数组a注:数组名就是一个指针结构体
结构体创建
struct 结构体名字\ {\ 变量1\ 变量2\ 变量3\ }
结构体赋值
struct 结构体名字 名字
结构体使用
名字.结构体内容之一
struct niao{ char a[10]; bool xb; int age; }; niao s; gets(s.a); //输入:麻雀 cout<<s.a结构体指针
结构体名 *指针名定义指针\ 指针名=&使用结构体的名字指针指向\ 指针名->结构体内容结构体数据
cstdio
一定要将文件放一起
<fstream>
重新定向型
freopen("文件名","r",stdin)重新定向读取方式\ ps:重新定向后输入函数都会以文件为目标,不会让你输入\ freopen("文件名","w",stdout)重新定向输出方式\ ps:重新定向后输出函数都会以文件为目标,不会显示在屏幕上
文件输入输出流
ifstream 输入函数名(文件名)定义输入流\ ofstream 输出函数名(文件名)定义输出流\ ps:定义后可使用定义的函数操作文件,原来的函数不变
bits/stdc++.h
万能
algorithm
sort(地址,地址)对数组进行排序,前一个是起点,后一个是终点\ reverse(地址,地址)对数组进行反转,前一个是起点,后一个是终点
cstring
字符数组
『剩余见 数组--字符数组』
- strlen(a)数数组中的字符个数(不含\0)
- strcat(a,b)连接2个数组,改变a的值
- strncat(a,b,n)连接a和b的前n项,改变a的值
- strcpy(a,b)将b的內容复制到a中,使a=b
- strcmp(a,b)比较a,b的大小
- strlwr(a)全部字母替换为大写
- strupr(a)全部字母替换为小写
- puts(a)输出数组全部
- gets(a)向数组里填充内容(包括空格)
string
- string 字符串名定义字符串(不会有\0)
- getline(cin,字符串名)向字符串里填充内容(包括空格)
- 变量名=字符串名.size()数数组中的字符个数(不含\0)
cmath
abs(整数)求绝对值\ sqrt(整数)求平方根
math.h
fabs(数)求绝对值\ ceil(数)向上取整\ floor(数)向下取整\ pow(底数,指数)求几的几次方\ sqrt(数)求平方根
stdio.h
输入输出:
scanf("%d",&变量)输入内容\ printf(内容%d",变量)输出内容
%字母
%dint\ %cchar\ %ffloat\ %lldlonglong\ %lfdouble
stdlib.h
system(“cmd的指令”)
cmd:
pause暂停 \ TITLE设置窗口名称\ dir列出此目录的内容
color改变颜色
颜色属性由两个十六进制数字指定 -- 第一个 对应于背景,第二个对应于前景。每个数字 可以为以下任何值:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
cstdlib
srand()设置随机种子\ 变量=rand()根据随机种子生成随机数\ 变量=rand()%b-a+1+ab-a+1为第一个范围,a为第2个范围
ctime
time(0)调取系统时间
示例程序:
示例程序1 高精度——计算器:
输入:一个形如 a <op> b 的表达式。\ a、b 分别是长度不超过 1000 的十进制非负整数;\ <op> 是一个字符(+、-、 或 /),表示运算。\ 整数与运算符之间由一个空格分隔。\ 输出:运算结果。\ 对于 +、-、 运算,输出一行表示结果;\ 对于 / 运算,输出两行分别表示商和余数。\ 保证结果均为非负整数。
#include <bits/stdc++.h>
static const int LEN = 1004;
int a[LEN], b[LEN], c[LEN], d[LEN];
void clear(int a[]) {
for (int i = 0; i < LEN; ++i) a[i] = 0;
}
void read(int a[]) {
static char s[LEN + 1];
scanf("%s", s);
clear(a);
int len = strlen(s);
for (int i = 0; i < len; ++i) a[len - i - 1] = s[i] - '0';
}
void print(int a[]) {
int i;
for (i = LEN - 1; i >= 1; --i)
if (a[i] != 0) break;
for (; i >= 0; --i) putchar(a[i] + '0');
putchar('\n');
}
void add(int a[], int b[], int c[]) {
clear(c);
for (int i = 0; i < LEN - 1; ++i) {
c[i] += a[i] + b[i];
if (c[i] >= 10) {
c[i + 1] += 1;
c[i] -= 10;
}
}
}
void sub(int a[], int b[], int c[]) {
clear(c);
for (int i = 0; i < LEN - 1; ++i) {
c[i] += a[i] - b[i];
if (c[i] < 0) {
c[i + 1] -= 1;
c[i] += 10;
}
}
}
void mul(int a[], int b[], int c[]) {
clear(c);
for (int i = 0; i < LEN - 1; ++i) {
for (int j = 0; j <= i; ++j) c[i] += a[j] * b[i - j];
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
}
bool greater_eq(int a[], int b[], int last_dg, int len) {
if (a[last_dg + len] != 0) return true;
for (int i = len - 1; i >= 0; --i) {
if (a[last_dg + i] > b[i]) return true;
if (a[last_dg + i] < b[i]) return false;
}
return true;
}
void div(int a[], int b[], int c[], int d[]) {
clear(c);
clear(d);
int la, lb;
for (la = LEN - 1; la > 0; --la)
if (a[la - 1] != 0) break;
for (lb = LEN - 1; lb > 0; --lb)
if (b[lb - 1] != 0) break;
if (lb == 0) {
puts("> <");
return;
}
for (int i = 0; i < la; ++i) d[i] = a[i];
for (int i = la - lb; i >= 0; --i) {
while (greater_eq(d, b, i, lb)) {
for (int j = 0; j < lb; ++j) {
d[i + j] -= b[j];
if (d[i + j] < 0) {
d[i + j + 1] -= 1;
d[i + j] += 10;
}
}
c[i] += 1;
}
}
}
int main() {
read(a);
char op[4];
scanf("%s", op);
read(b);
switch (op[0]) {
case '+':
add(a, b, c);
print(c);
break;
case '-':
sub(a, b, c);
print(c);
break;
case '*':
mul(a, b, c);
print(c);
break;
case '/':
div(a, b, c, d);
print(c);
print(d);
break;
default:
puts("> <");
}
return 0;
}
示例程序——约瑟夫问题——队列【数组】:
#include <bits/stdc++.h>
using namespace std;
int a[1000000]={},n,m,f,r,num;
int main(){
cin>>n,m;//n个人
for(int i=0;i<n;i++)
{
a[r++]=i+1;
}
while(n!=1)
{
for(int i=0;i<m;i++)
{
a[r++]=a[f++];
}
f++;
n--;
}
cout<<f;
return 0;
}
尾声
额(⊙o⊙)…好像没有什么要说的了\ 对了还有这个!
部分内容改编或选自↓
二叉树的遍历,博客园-Luv3\ OIWIKI