说在前面
既然周末,就再来一篇吧,之后隔一天更一篇。
本篇总结自《算法笔记》2.5-2.7
正文
知识点1:数组(一维)
数据类型 数组名[数组大小]
数组大小不能是变量,所以该定义要求定死了。
数组初始化
int a[10] = {5, 3, 2, 6, 8, 4};
上方数组没有全部初始化,未初始化部分默认值为很大的随机数或0(看编译器不同赋值不同)。
若完全不初始化如int a[10],数组中每个元素都可能是随机数,不一定默认为0。
所以需要整个数组都赋初值为0,则只要把第一个赋为0即可,如int a[10] = {0};
知识点2:冒泡排序
总体说:进行n-1轮排序,忽略上一轮的最大值,每轮都把最大的“沉底”后移,其它的数像“冒泡”一样前移。
具体说:
比如5个数,从第1位第2位开始两两比较,前者大则交换,一直到第4位第5位比较算一轮,得到第5位为最大;
继续下一轮两两比较不过到第3位和第4位比较完为止,因为第5位已经是最大值了;
继续下一轮两两比较到第2位第3位为止,因为第4位也已经确定了;
继续下一轮两两比较第1位第2位。
程序员不知道这个就有点说不过去了,直接上代码吧。
知识点3:数组(二维)
数据类型 数组名[第一维大小][第二维大小]
数组初始化
int a[5][6] = {{3, 1, 2}, {8, 4}, {}, {1, 2, 3, 4, 5}};
代码示例:两个数组对应值累加,存入第一个数组。
输入两个3×3的矩阵,输出一个3×3的结果矩阵。
注:如果数组长度过大超过106则将其定义在主函数外(静态存储区),否则在主函数中申明(系统栈)程序会异常退出。
三维数组及更高维度的数组与二维类似,定义要三个[],赋值要三层循环。如int a[3][3][3];
这一部分比较简单就不自己敲了,后面难的部分手打代码。
知识点4:memset对数组每个元素赋相同值(需string.h头文件)
memset(数组名, 值, sizeof(数组名));
建议只赋值为0或-1(因为memset按字节赋值,组成int的四个字节会被赋成相同值,而0和-1的二进制补码全为0和1,不容易出错,如果赋别的数则会不准确,所以别的数用fill函数,后面会讲)
memset速度快于fill
知识点5:字符数组
字符数组定义和初始化和普通数组一样
char str[15] = {'G', 'o', 'o', 'd', '', 's', 't', 'o', 'r', 'y', '!'};
也可以直接初始化字符串给字符数组(仅限初始化,其他地方赋值不行)
char str[15] = "Good Story!"
输入输出:
scanf,getchar,gets
printf,putchar,puts
gets
用来输入一行字符串;
gets识别换行符 作为输入结束;
若前面有整数等输入则要先使用getchar把换行符接受掉,再进行gets,否则读空了;
存放于一维数组/二维数组的一维中;
puts
用来输出一行字符串;
将一维数组/二维数组的一维输出在界面上(并拼上一个换行符);
说明:二维字符数组可以当作字符串数组
字符数组的存放方式
一维字符数组/二维字符数组的二维末尾都有一个空字符 表示存放字符串的结尾(作用是给puts和printf识别输出结束)
特别注意1: