我的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

字符数组

『剩余见 数组--字符数组』

string

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