算法笔记的笔记——第2章 C/C++快速入门

  • 头文件:stdio.h写成等价的cstdio
  • 主函数

基本数据类型

变量定义

  • 不能是标识符
  • 第一个字符是字母或下划线
  • 区分大小写

变量类型

  • int:32位整数,输出用%d
  • long long:64位整数。如果赋大于231-1的初值要在后面加LL
  • float:32位浮点数(实际精度6-7位)。别用
  • double:64位浮点数(实际精度15-16位),输出用%f
  • char:8位整数,输出用%c。小写字母比大写字母ASCII值大32
  • 字符串常量:双引号标记的字符集,可以作为初值赋给字符数组,用%s输出
  • bool:0(false)和1(true),在C++中直接用,在C中必须添加stdbool.h

强制类型转换

(新类型名)变量名

符号常量和const常量

  • 符号常量:#define 标识符 常量
  • const常量:const 数据类型 变量名 = 常量;

宏定义是直接将对应部分替换,所以要注意括号的问题

运算符

算术运算符

  • +
  • -
  • *
  • /:被除数和除数都是整型时会舍去小数部分(向下取整)
  • %
  • ++i++先用i再加1,++i先加1再用i
  • --

关系运算符

  • <
  • >
  • <=
  • >=
  • ==
  • !=

逻辑运算符

  • &&
  • ||
  • !

条件运算符

  • A ? B : C:唯一的三目运算符

位运算符

  • <<
  • >>
  • &
  • |
  • ^
  • ~

位运算优先级没有算术运算高

顺序结构

赋值表达式

  • =
  • 可以把其他运算符放在前面实现赋值操作简化

使用scanfprintf

  • scanfscanf("格式", 变量地址)%c可以读入空格和换行,读double%lf
  • printfprintf("格式", 变量名称),输出double%f

实用输出格式

  • %md:不足m位的int变量以m位右对齐输出,高位用空格补齐;超过m位保持原样
  • %0md:不足m位时加前导0
  • %.mf:浮点数保留m位小数(四舍六入五成双)

使用getcharputchar

注释

  • /* */
  • //

typedef

  • 给复杂的数据类型起一个别名

常用math函数

需要加上math.h头文件(cmath

  • fabs(double x):取double的绝对值
  • floor(double x)ceil(double x)double的向下和向上取整,返回double
  • pow(double r, double p):rp,要求都是double
  • sqrt(double x):返回double型变量的算术平方根
  • log(double x):自然对数,任意底数需要用换底公式
  • sin(double x)cos(double x)tan(double x):参数是弧度制
  • asin(double x)acos(double x)atan(double x):反三角函数
  • round(double x):四舍五入,返回double,需要取整

选择结构

if语句

switch语句

switch(表达式) {
    case 常量表达式1:
        ...
        break;
    case 常量表达式2:
        ...
        break;
    case 常量表达式n:
        ...
        break;
    default:
        ...
}

循环结构

while语句

do... while语句

  • 会先执行括号里的语句一次,然后再判断条件是否成立

for语句

breakcontinue语句

数组

一维数组

  • 从某个地址开始连续若干位置形成的元素集合
  • 数组大小必须是整数常量,不能是变量
  • 初始化时需要给出用逗号隔开的从第一个元素开始的若干元素的初值
  • 整个数组都赋初值0,只需第一个元素赋0,或者只用一个大括号

冒泡排序

  • 每次通过交换的方式把当前剩余元素的最大值移动到另一端,剩余元素减少为0时排序结束
  • 整个过程执行(n-1)趟,每趟从左到右比较相邻的两个数
for (i = 1; i <= n - 1; i++) {
    for (j = 0; j < n - i; j++) {
        if (a[j] > a[j + 1]) {
            temp = a[j];
            a[j] = a[j + 1];
            a[j + 1] = temp;
        }
    }
}

二维数组

  • 一维数组的每个元素都是一个一维数组
  • 初始化时按第一维的顺序依次用大括号给出第二维初始化情况
  • 未初始化的全部赋值为0
  • 数组太大就写在全局变量(静态存储区)

memset

  • memset(数组名, 值, sizeof(数组名))
  • 头文件string.hcstring
  • 按字节赋值
  • 如果要按整数赋值用fill

字符数组

  • 初始化时可以用大括号老办法,也可以直接用字符串(仅限初始化
  • 输入:scanfgetchargets
  • 输出:printfputcharputs
  • 字符数组结尾是'\0'

string.h头文件

  • strlen(字符数组)
  • strcmp(字符数组1, 字符数组2):字典序,1<2负数,1=2零,1>2正数
  • strcpy(字符数组1, 字符数组2):1是destination,2是source,包括'\0'

sscanfsprintf

  • 都在stdio.h
  • sscanf(源, "格式", 目标):把源以格式发送到目标
  • sprintf(目标, "格式", 源):把源以格式发送到目标

函数

定义

数组作为函数参数

  • 参数中数组的第一位不需要填写长度,第二位需要填写长度
  • 实际调用时只写数组名
  • 数组作为参数时在函数中直接修改原数组

指针

定义

  • 基类型

指针与数组

  • 数组名称作为数组首地址使用
  • 指针可以加减、自增自减

指针变量作为函数参数

  • 传入地址,改变指针指向的值
  • 传入的地址是副本

引用

  • 在函数的参数类型后面加&
  • 不产生副本,相当于别名
  • 对引用变量的操作就是对原变量的操作

结构体

定义

struct node {
    ...
    node* next;
};
  • 结构体内部不能定义自己,用指针代替
  • 定义结构体变量可以按基本类型定义或者直接在结构体定义后面定义

访问结构体内的元素

  • (*p).xxx等价于p->xxx

结构体初始化

  • 构造函数:直接定义在结构体中,不需要返回类型,函数名与结构体名相同
struct studentInfo {
    int id;
    char gender;
    studentInfo(int _id, char _gender) {
        id = _id;
        gender = _gender;
    }
}
struct studentInfo {
    int id;
    char gender;
    studentInfo(int _id, char _gender): id(_id), gender(_gender) {}
}

如果重新定义了构造函数,则不能不经初始化就定义结构体变量,除非把默认无参构造器加上。

浮点数的比较

引入精度误差值const double eps = 1e-8

  • 相等:差的绝对值小于eps
  • 大于:差大于eps
  • 小于:差小于-eps
  • 大于等于:差大于-eps
  • 小于等于:差小于eps
  • 圆周率:const double pi = acos(-1.0)

复杂度

时间复杂度

  • 系数省略
  • 高幂次覆盖低幂次
  • 对数省略底数
posted @ 2023-03-20 21:16  Secant1006  阅读(44)  评论(0)    收藏  举报