程序片段(01):01.杨辉三角.c
内容概要:杨辉三角#include#include #define N 10//01.杨辉三角:// 1.图形转换:将标准杨辉三角採用标准数组进行模拟// 2.确定标准数组的图形描写叙述关系:// (1).数组其中第一列的全部元素以及正对角线的全部元素都为1// (2).数组其中的其他元素等于上一行左一列// 3.数组模拟杨辉三角的诀窍!// 将整个杨辉三角向左倾斜成为标准的二维数组int main01(void){ int intArrArr[N][N] = { 0 }; for (int i = 0; i < N; ++i) { for (int j = 0; j <= i; ++j) { if (0 == j || i == j) intArrArr[i][j] = 1; else//核心代码 intArrArr[i][j] = intArrArr[i - 1][j - 1] + intArrArr[i - 1][j]; } } //模拟杨辉三角的标准数组打印方式 for (int i = 0; i < N; ++i) { for (int j = 0; j <= i; ++j) { printf("%4d", intArrArr[i][j]); } printf("\n"); } //杨辉三角打印方式 for (int i = 0; i < N; ++i) { //19=10*4/2-1-i*2 printf("%*c", 19 - i*2, '\0');//printf();其中的*表示预订宽度,scanf();其中的*表示忽略宽度 for (int j = 0; j <= i; ++j) { printf("%4d", intArrArr[i][j]); } printf("\n"); } system("pause");}
程序片段(02):01.Array.c+02.二维数组实战.c+03.二维数组转置.c
内容概要:02.二维数组本质///01.Array.c#include#include //01.二维数组本质:// 1.二维数组的数组名本质:// 就是整个二维数组的首个数组元素首地址// 2.二维数组其中的数组元素和行元素区分:// 就二维数组总体而言:// 每一个数组元素都仅仅是一个数组元素// 每一个行元素其中包括有多个数组元素// 就一维数组总体而言:// 每一个数组元素都仅仅是一个行元素// 注意事项:// 1.全部数组的存储方式都是採取线程存储:// 存储特点:连续+类型同样// 2.全部线性存储方式的数据结构都可以採取// 线性方式进行顺序规律的初始化方式初始// 3.二维数组也是採取的静态初始初始化方式// 也就是长度必须採用常量进行标识// 4.数组的静态初始化特点:// (1).一个大括号代表一个维度// (2).仅仅要存在前置元素初始化,那么后面的全部数组元素// 都会默认进行初始化为0的操作// (前置:必须从首个"数组元素"開始,否则不会出现连续默认初始化为0的现象)int main01(void){ int intArrArr[3][4] = { { 1, 2 }, { 3, 4 }, { 5, 6 } }; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { //%p<==>%#x(将数值以16进制以及携带进制标识的方式进行打印) //&intArrArr[i][j]与intArr[i]+j等价的原因:intArrArr[i]表示的是二维数组其中每一个一维数组的首个元素的地址(也就是每一个一维数组的地址) printf("%2d,%p,%p", intArrArr[i][j], &intArrArr[i][j], intArrArr[i] + j); } printf("\n"); } //对二维数组的不同看待方式会有不同的效果! // 将二维数组看做为一维数组的处理方式, // 那么以一维数组的数组元素获取方式,就是在获取每一个数组元素的首地址 printf("%p,%p,%p \n", intArrArr[0], intArrArr[1], intArrArr[2]); system("pause");}
///02.二维数组实战.c#include#include #define N 10int intArrArr[N][N];//01.不引入不论什么变量实现二维矩阵数组的标准数据规律化赋值方式:// 表达式:intArrArr[i][j]=i*N+1+j;//从1開始进行的规律化赋值int main02(void){ for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { printf("%3d", intArrArr[i][j] = i * N + j + 1);//举行数组赋值的规律表达式(不引入不论什么其他变量) } printf("\n"); } system("pause");}//02.二维数组其中的特殊数据统计方式:// sumA:表示统计全部// sumB:统计每行// sumC:统计每列// sumD:统计正斜线// sumE:统计反斜线int main03(void){ int sumA = 0; int sumD = 0; int sumE = 0; for (int i = 0; i < N; ++i) { //表示行 int sumB = 0; for (int j = 0; j < N; ++j) { //表示列 printf("%4d", intArrArr[i][j] = i*N + 1 + j); sumA += intArrArr[i][j]; sumB += intArrArr[i][j]; //if (i == j) // sumD += intArrArr[i][j]; if (i + j == N - 1) sumE += intArrArr[i][j]; } printf("sumB = %d \n", sumB); sumD += intArrArr[i][i]; printf("\n"); } printf("\n\n"); for (int j = 0; j < N; ++j) { //表示列 int sumC = 0; for (int i = 0; i < N; ++i) { //表示行 sumC += intArrArr[i][j]; } printf("sumC = %d \n", sumC); } system("pause");}
///03.二维数组转置.c#include#include //01.对数组的各种转置操作:// 1.转置:正转置,翻转置,翻页转置// 相当于对二维平面的随意操作特点// 2.转置规律分析:// 就是直接将带转置的图形与// 转置之后的结果进行对照分析// 高速得出二维数组的转置规律//02.翻页转置效果总结:// 1.待转置数组与转置后数组特点:// 待转置数组:intArrArrA[N1][N2];// 转置后数组:intArrArrB[N2][N1];// 2.转置效果分类:转置线+翻页点// 反斜线转置:intArrArrA[j][i]// 上翻页:intArrArrB[i][j]// 下翻页:intArrArrB[N2-1-i][N1-1-j]// 正斜线转置:intArrArrA[N1-1-j][N2-1-j]// 上翻页:intArrArrB[i][j]// 下翻页:intArrArrB[N2-1-i][N1-1-j]// 规律:先确定转置线,再确定翻页点int main04(void){ /* //待转置数组 1 2 3 0 4 5 0 13 6 7 8 9 //正常打印待转置数组 */ int intArrArrA[3][4] = { { 1, 2, 3 }, { 4, 5, 0, 13 }, { 6, 7, 8, 9 } }; int intArrArrB[4][3] = { 0 }; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { //待转置数组 printf("%3d", intArrArrA[i][j]); } printf("\n"); } printf("\n"); //1 4 6 //2 5 7//反斜线转置 //3 0 8 //0 13 9 //特点:反斜线+以左下角下翻页: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 3; ++j) { //转置后数组:正确打印方式=intArrArrB[j][i]; printf("%3d", intArrArrB[i][j] = intArrArrA[j][i]);//以左下角为翻页点,反斜线为转置线,作为翻页转置效果 } printf("\n"); } printf("intArrArrB[i][j]<--intArrArrA[j][i] \n\n"); //特点:反斜线+以左下角上翻页 for (int i = 0; i < 4; ++i) { for (int j = 0; j < 3; ++j) { //转置后数组:逆向接收方式=intArrArrB[j][i]; printf("%3d", intArrArrB[3 - i][2 - j] = intArrArrA[j][i]);//以右上角为翻页点,反斜线为转置线,作为翻页转置效果 } printf("\n"); } printf("intArrArrB[3-i][2-j]=intArrArrA[j][i] \n\n"); //总结:翻页转置的效果类似,都是以斜对角线为基准进行转置,一个正向翻页,一个逆向翻页 //9 13 0 //8 0 3//正斜线转置 //7 5 2 //6 4 1 for (int i = 0; i < 4; ++i) { for (int j = 0; j < 3; ++j) { printf("%3d", intArrArrB[i][j] = intArrArrA[2 - j][3 - i]); } printf("\n"); } printf("intArrArrB[i][j]=intArrArrB[2-j][3-i] \n\n"); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 3; ++j) { printf("%3d", intArrArrB[3 - i][2 - j] = intArrArrA[2 - j][3 - i]); } printf("\n"); } printf("intArrArrB[3-i][2-j]=intArrArrB[2-j][3-i] \n\n"); system("pause");}#define row 2#define column 3//02.翻页转置规律大总结:// 先确定转置线,再确定翻页点int main05(void){ int intArrArrA[row][column] = { 1, 2, 3, 4, 5, 6 }; printf("原样输出: \n"); for (int i = 0; i < row; ++i) { for (int j = 0; j < column; ++j) { printf("%2d", intArrArrA[i][j]); } printf("\n"); } printf("\n"); int intArrArrB[column][row] = { 0 }; printf("以反斜线为转置线,以左下角为翻页点,进行翻页转置! \n"); for (int i = 0; i < column; ++i) { for (int j = 0; j < row; ++j) { printf("%2d", intArrArrB[i][j] = intArrArrA[j][i]); } printf("\n"); } printf("\n"); printf("以反斜线作为转置线,以右上角作为翻页点,进行翻页转置! \n"); for (int i = 0; i < column; ++i) { for (int j = 0; j < row; ++j) { printf("%2d", intArrArrB[column - 1 - i][row - 1 - j] = intArrArrA[j][i]); } printf("\n"); } printf("\n"); printf("以正斜线作为转置线,以右下角作为翻页点,进行翻页转置! \n"); for (int i = 0; i < column; ++i) { for (int j = 0; j < row; ++j) { printf("%2d", intArrArrB[i][j] = intArrArrA[row - 1 - j][column - 1 - i]); } printf("\n"); } printf("\n"); printf("以正斜线作为转置线,以左上角作为翻页点,进行翻页转置! \n"); for (int i = 0; i < column; ++i) { for (int j = 0; j < row; ++j) { printf("%2d", intArrArrB[column - 1 - i][row - 1 - j] = intArrArrA[row - 1 - j][column - 1 - i]); } printf("\n"); } printf("\n"); system("pause");}
程序片段(03):03.Time.c
内容概要:高维数组#include#include //01.二维数组的初始化方式:// 奥数技巧:线性初始化方式// 注:凡是线性存储的数据结构都存在着线性的初始化方式//02.线性初始化的规律总结:// 1.採用一个循环结构控制循环次数(实质就是数组其中所含元素的个数)// 2.操控数组的时候规律:// intArrArr[变化慢的][变化快的] = i + 1;// 变化慢的:求模最低维数// 变化快的:取余最低维数// i+1:使得线性初始化值为1,2,3...(可以避免不必要的改动循环控制变量的值)// 注:%p<==>%#X的打印实质等价int main01(void){ //A 0 1 2 3 //0 00 01 02 03 //1 10 11 12 13 //2 20 21 22 23 //3 30 31 32 33 int intArrArr[3][4] = { 0 }; for (int i = 0; i < 12; ++i) { intArrArr[12 / 4][12 % 4] = i + 1;//二维数组的线性初始化方式 } printf("%p \n", intArrArr); //printf("%#X \n", intArrArr); system("pause");}//03.三维数组的线性初始化总结:// 1.三维数组组成分析:// 本质:三维数组的具体模型-->立体结构(六个方向:上,下,左,右,前,后)// 特点:intArrArr[z][x][y];// z:代表立体结构纵坐标-->这是由二维到三维的转变维度// x:代表平面结构x坐标// y:代表平面结构y坐标// 2.三维数组的线性初始化方式具体解释:// intArrArrArr[z][x][y];// for (int i = 0; i < z*x*y; ++i)// intArrArrArr[i / (x*y)][i % (x*y) / y][i % (x*y) % y] =i + 1;// i / (x*y):代表当前索引所指向的立体结构(第几层)// i % (x*y) / y:代表当前索引所指向的立体结构的(不全然面)的第几行// i % (x*y) % y:代表当前索引所指向的立体结构的(不全然面)的第几列// 注:// 1.凡是数据结构为线性的存储结构,那么前置元素仅仅要初始化为0,后置存储便会// 默认初始化为0(尤其是数组的初始化特点)// 2.数组通性特点:// 元素类型一致,连续内存存储[数组都是以线性内存结果进行的数据存储,因此才可以进行线性初始化赋值操作]// 3.内层优化技巧:// 可以降低不必要的运算过程就应当尽量降低// 比方:三维数组的初始化技巧,不必要使用三层循环结构,降低不不要的两层循环结构,採用一层结构进行搞定int main02(void){ int intArrArrArr[3][4][5] = { 0 }; intArrArrArr[0][0][0] = 0; intArrArrArr[1][0][0] = 20;//intArrArrArr[1][2][0]=30;=>intArrArrArr[1][2][3]=33; intArrArrArr[2][0][0] = 40; printf("%p \n", intArrArrArr);//三维数组的首地址 for (int i = 0; i < 60; ++i) { //intArrArrArr[60 / 20][60 % 20 / 5][60 % 20 % 5] = i;//性能优化操作-->游戏开发其中,少一层循环结构,多提升一些效率 intArrArrArr[i / (4 * 5)][i % (4 * 5) / 5][i % (4 * 5) % 5] = i; //0,1,2-->0,1,2,3-->0,1,2,3,4 } //intArrArrArr[i][j][k]-->程序性能优化:可以降低的循环层数就一定要进行相应的降低 //intArrArrArr[(i*j*k)/(j*k)][(i*j*k)%(j*k)/k][(i*j*k)%(j*k)%k] system("pause");}//04.从0维数组到N维数组的推导过程:// 0维数组:就是一个变量// 实质:点// 1维数组:就是一个一维数组// 实质:线// 2维数组:就是一个二维数组// 实质:面// 3维数组:就是一个三维数组// 实质:立体// 4维数组:就是一个四维数组// 实质:立体+时间// 5维数组:就是一个五维数组// 实质:立体+时间+质量// 6维数组:就是一个六维数组// 实质:立体+时间+质量+能量// n维数组:就是一个N维数组// 实质:(n-1)维基础条件+第n维的条件//05.数组线性初始化特点:// 从第一层第一面第一个点開始进行逐个点的初始化// 从下层不断的往上层// 从一个面不断的往另外一个面// 从一个点不断的往一个点int main03(void){ int intArrArrArr[2][3][4] = { 0 }; int num = 0; for (int z = 0; z < 2; ++z)//层结构(包括面) { //遍历2个平面 for (int x = 0; x < 3; ++x)//面结构(包括行) { //遍历3个行数 for (int y = 0; y < 4; ++y)//线结构(包括点) { //遍历4个列数 printf("%3d, %p", intArrArrArr[z][x][y] = ++num, &intArrArrArr[z][x][y]); } printf("\n"); } printf("\n\n"); } system("pause");}
程序片段(04):01.Fun.c
内容概要:数组与函数#include#include //01.数组作为函数參数进行传递的特殊性质:// 数组作为函数的參数传递,会自己主动退化为指针,目的就是为了传递地址[数组-->指针-->地址]// 注:// 1.目的是为了节省资源,避免不必要的内存拷贝动作,提升程序性能(直接採用指针操作原始数据)// 2.数组名作为实參,就是指向首个数组元素的指针,数组名没有作为參数,就是表示整个数组的类型void testArrName(int intArr[10])//地址:数组是例外,数组传递的是指针,也就是地址,数组没有副本机制{ printf("%p \n", intArr); intArr[3] = 1000; printf("sizeof(intArr) = %d \n", sizeof(intArr));//这里的实质就是求取地址这个整数所占用的内存字节数 int intArrTest[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; printf("sizeof(intArrTest) = %d \n", sizeof(intArrTest));//数组没实用作函数实參进行传递,就是数据实际大小}int main01(void){ int intArr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; printf("%p \n", intArr); testArrName(intArr); for (int i = 0; i < 10; ++i) { printf("%d \n", intArr[i]); } system("pause");}
程序片段(05):01.枚举数组.c
内容概要:数组与枚举常量#include#include enum person{ 吴伟, lzq, zb, yc, 李波 };//0,1,2,3...默认匹配的整数形式double yanZhiBiao[5] = { 97.9, 93.9, 88.9, 60.9, 98.9 };//01.枚举数组的特点:枚举+数组=结合使用(类似于查表法的使用)// 让枚举数据具备一定的比較特性// 查表法:已知一个索引,在已经存在的相应表其中进行数据查询int main01(void){ //让枚举数据具备一定的比較特性 for (enum person people = 吴伟; people <= 李波; ++people) { printf("%lf \n", yanZhiBiao[people]); } system("pause");}
程序片段(06):01.命名.c
内容概要:起名工具#include#include #include #include //01.知识要点:// 1.随机数生成方式// 2.查表法的应用// 先定义表体内容,// 再定义查询内容int main01(void){ //time_t te;//定义时间类型 //unsigned int seed = (unsigned int)time(&te);//获取随机数种子 //srand(seed);//种植随机数种子 srand((unsigned int)time(NULL));//种植随机数种子 //int passLength = rand() % 10 + 6;//6~15:password长度 //2个字儿,3个字儿的password生成,定住姓氏,随机名字 char passChr[10] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' }; //for (int i = 0; i < passLength; ++i) //{ // int num = rand() % 10;//随机获取组成password的单个字符 // printf("%c", passChr[num]); //} for (int i = 0; i < rand() % 10 + 6; ++i) { printf("%c", passChr[rand() % 10]); } printf("\n"); system("pause");}//02.查表法非常重要!int main02(void){ setlocale(LC_ALL, "zh-CN"); wchar_t wcharS[8] = { L'龙', L'虎', L'大', L'伟', L'天', L'桂', L'三', L'財' }; //putwchar(wcharS[0]); putwchar(L'吴'); srand((unsigned int)time(NULL)); for (int i = 0; i < rand() % 2 + 1; ++i) { putwchar(wcharS[rand() % 8]); } system("pause");}
程序片段(07):01.洗牌.c
内容概要:07.洗牌#include#include #include //01.洗牌算法透析:// 原理:让不论什么一张牌有机会与其后面的随意一张牌进行交换// int randNum = 0;// for (int i = 0; i < 53; ++i)//仅仅须要让倒数第二张牌和倒数第一张牌有交换几率即可了,倒数第一张牌没有兴许的交换概率// {//因为最大索引为53-->然而前面已经保证了从后面一张牌開始-->因此须要1+X可以等于53-->rand()%(53-i)-->极限推理法// randNum = i + 1 + rand() % (53 - i);//(i+1)保证绝对不会发生本体交换特点a;rand()%(53-i)保证随机数合理,(53-i)防止出界// }int main01(void){ int intArr[54] = { 0 }; printf("洗牌之前:\n"); for (int i = 0; i < 54; ++i) { printf("%3d", intArr[i] = i + 1); } printf("\n\n"); srand((unsigned int)(time(NULL)));//种植随机数种子 for (int i = 0; i < 53; ++i)//少一次:为了避免最后一次没有交换对象 { int num = i + 1 + rand() % (53 - i); intArr[i] = intArr[i] ^ intArr[num]; intArr[num] = intArr[i] ^ intArr[num]; intArr[i] = intArr[i] ^ intArr[num]; } printf("洗牌之后:\n"); for (int i = 0; i < 54; ++i) { printf("%3d",intArr[i]); } system("pause");}