算法笔记-C/C++快速入门

1.C/C++快速入门

stdio->standrad input output

1.1 变量

  • 绝对值在$10^9$范围以内的整数或者说32位整数都可以定义为int型

  • 如果在$10^{18}$范围以内的整数或者说364位整数都可以定义为long long型

  • 碰到浮点型数据都应该使用double来储存,float的有效精度只有6~7位

  • 0~9 -> 48-57

  • A~Z -> 65-90

  • 小写字母比大写字母的ascii码值大32

  • C语言的强制类型转换:(新类型名)变量名

  • 宏定义: #define 标识符 常量/任何语句或片段

  • 两整数相除,结果仍为整数

  • i++ 先使用i再将i加1; ++i先将i+1在使用i

  • 三目运算符: A ? B : C;

  • 位运算符的优先级没有算术运算符高

1.2 顺序结构

  • n/=m+1 等价于 n=n/(m+1)

  • double 输入的格式符为 %lf输出的格式符为 %f

  • 如果输入的是用空格隔开的数字,%d之间可以不加空格

  • 除了%c外,scanf对其他格式符的输入是以空白符(即空格、Tab)为结束判断标志的

  • 常用输出格式

%md -> 可以使不足m为的int型变量以m位进行 右对齐输出,其中高位用 空格补齐, 如果变量本身超过m位,则保持原样
%0md -> 与上面不同的是当变量不足m位时, 高位用0补而不是空格。
%.mf -> 让浮点数保留m为小数输出(如果是四舍五入,那么要用到round函数),因为该保留是“ 四舍六入五成双
  • getchar用来输入单个字符, putchar用来输出单个字符,要注意getchar会接受换行符作为输入

  • typedef long long LL; //给long long 起个别名LL

  • log(double x) 该函数返回double型变量的以自然对数为底的对数

1.3 循环结构

  • 如果文件保存为.cpp文件,那么可以在for循环里面定义临时变量

1.4 数组

  • 数组大小必须是整数常量,不可以是变量

  • 如果想要给整个数组都赋初值0,只需把第一个元素赋为0,或者只用一个大括号来表示,否则数组中的每个元素可能会是一个随机数。

  • 冒泡排序

核心思想: 每一趟通过交换的方式把当前剩余元素的最大值移动到一端,而当剩余元素减少为0时,排序结束
  • 如果数组大小较大(大概$10^6$级别),则需要将其定义在主函数外面。

  • memset ———— memset(数组名, 值, sizeof(数组名));

memset 使用的是 按字节赋值,所以最好 用memset赋0或-1
  • %s 通过空格或者换行来识别一个字符串的结束

  • gets识别换行符\n作为输入结束,因此scanf完一个整数后,如果要使用gets,需要先用getchar接受整数后的换行符。

  • 字符数组的长度一定要比实际存储的字符串的长度至少多1,同时puts和printf就是通过识别\0作为字符串的结尾来输出的。

  • strlen函数可以的到字符数组中第一个\0前的字符的个数。

  • strcpy(dst, scr), strcat(dst, scr)

  • sscanf与sprintf

sscanf(str, "%d", &n); -> 把字符数组str中的内容以"%d"的格式写到n中( 从左到右)
sprintf(str, "%d", n); -> 把n以"%d"的格式写到str字符数组中( 从右到左)
示例:
int n = 233; char str[100]; sprintf(str, "%d", n); printf("%s", str);
输出结果:
233

1.5 函数

  • main函数返回0的意义在于告知系统程序正常终止。

  • 数组作为参数时,在函数中对数组元素的修改就等同于是对原数组元素的修改。

1.6 指针

  • 变量的地址一般指它占用的字节中的第一个字节的地址。

  • C语言中用指针来表示内存地址(或者成指针指向了内存地址),而如果这个内存地址恰好是某个变量的地址,那么又称“这个指针指向该变量”。

  • 指针是一个unsigned类型的整数。

  • 指针变量用来存放指针,如同int型变量用来存放int型常量。

  • int *p1, p2;这种定义中只有p1是 int* 型的,p2是 int 型的。

  • int *p; p 保存地址,*p是这个地址中存放的元素。

对于 int* 型的指针变量p来说, p+1是指p所指的int型变量的下一个int型变量地址,其中跨越了一整个int型(即4Byte)。
  • 对于指针变量来说,把其存储的地址的类型称为基类型

  • C语言中,数组名称也作为数组的首地址使用。

  • 如果指针作为函数参数类型,这时视为把变量的地址传入函数。如果函数中对这个地址中的元素进行改边,原先的数据就会确实地被改变。

交换两个数的错误写法:
void swap(int* a, int* b){ int *temp = a; a = b; b = temp; }
这种写法是错误的,原因在于main函数传给swap函数的" 地址" 其实是一个"无符号整型"的数,其本身也跟普通变量一样只是"值传递",swap函数对地址本身进行修改并不能对main函数里面的地址进行修改,能够使main函数里的数据发生变化的只能是swap函数中对地址指向的数据进行的修改。
正确的写法应该是:
void swap(int* a,int* b){ int temp = *a; *a = *b; *b = temp;
  • C++里面的引用可以达到不使用指针也能修改传入参数。

引用就相当于给原来变量又取了一个别名,同时新旧名字都指向同一个东西,所以对引用变量的操作就是对原变量的操作 ,要注意常量不可使用引用。
引用实例如下:(由于用了C++的语法,因此文件必须保存为.cpp类型)
#include<stdio.h> void change(int& x){ x = 1; } int main(){ int x = 10; change(x); printf("%d\n", x); return 0; }

输出结果:

1
  • 要把引用的&跟取地址的运算符&区分开,引用并不是取地址的意思.(这两个符号虽然一样,但是用法不一样),也可以对指针进行引用,只需要在变量名前加上&即可。

1.7 结构体

  • 结构体里面能够定义自身类型的指针变量,不能定义自身。

  • 访问结构体内的元素:

对于结构体普通变量(struct stu)来说,访问的写法为: stu.id
对于结构体指针变量(struct *p)来说,访问的写法为: (*p).id 或者 p->id
  • 结构体的初始化——使用构造函数进行初始化赋值。

  • 构造函数在结构体内,函数名与结构体名相同且不需要写返回类型。

  • 对于一个结构体,内部会默认生成一个构造函数(但不可见),但这个构造函数里面什么也没有。

  • 也可以自己手动提供内部元素的初始化参数。

struct studentInfo{ int id; char gender; //下面的参数用以对结构体内部变量进行赋值 studentInfo(int _id, char _gender): id(_id),gender(_gender){} //这是对构造函数的简化写法。 //其表示的含义是 : id = _id; gender = _gender; //其中_id与_gender是自己命名的变量名,只要不和已有变量冲突就可以用。 };

这样就可以在需要时直接对结构体变量进行赋值了:

studentInfostu = studentInfo(10086, 'M');

需要注意的是,自己重新定义了构造函数,则不能不经初始化就定义结构体变量。同时只要参数个数和类型不完全相同,就可以定义多个构造函数。

1.8 补充

1.8.1 cin与cout

  • 首先需要添加头文件"#include "和"using namespace std;"才能使用。

1.cin
  • cin的输入不指定格式,也不需要取地址运算符&,直接写变量名就可以。

cin >> n >>db >>c;

// 其中n为int型,db为double型,c为char型

  • 想要读入一整行,则需要使用getline函数:

char str[100];
cin.getline(str, 100);
  • 而如果是string容器,则需要用下面的方式输入:

string str;
getline(cin, str);
2.cout
  • 输出格式跟cin相似,但在输出时各变量中间没有空格或者换行符,需要自行加上去。

cout << n <<"" << db << "" << c; //加上空格

换行符可以用\n来表示或者使用endl来表示换行

cout << n << "\n" << db << endl;
  • cin和cout在输入/输出大量数据的情况下表现非常糟糕,会占用大量时间。

1.8.2 浮点数比较

  • 由于计算机中采用有限位的二进制编码,因此浮点数在计算机中的存储并不总是精确的。

  • 所以对于浮点数的比较,要引入一个区间范围eps,通常eps取$10^{-8}$。

a == b ---------> fabs(a-b) < eps
a > b ---------> a - b > eps

写在最后

以上是我个人在学习算法笔记时对于第一章做的笔记。由于我已经学习过C语言,所以记录的内容是对以前学习的查漏补缺,只是一些知识点记录。以后也会不定时更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值