程序片段(01):01.杨辉三角.c

内容概要:杨辉三角

#include <stdio.h>
#include <stdlib.h> #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 <stdio.h>
#include <stdlib.h> //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 <stdio.h>
#include <stdlib.h> #define N 10
int 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 <stdio.h>
#include <stdlib.h> //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 <stdio.h>
#include <stdlib.h> //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 <stdio.h>
#include <stdlib.h> //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 <stdio.h>
#include <stdlib.h> 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 <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h> //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:密码长度
//2个字儿,3个字儿的密码生成,定住姓氏,随机名字
char passChr[10] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' };
//for (int i = 0; i < passLength; ++i)
//{
// int num = rand() % 10;//随机获取组成密码的单个字符
// 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 <stdio.h>
#include <stdlib.h>
#include <time.h> //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");
}

20160205.CCPP体系详解(0015天)的更多相关文章

  1. 20160129.CCPP体系详解(0008天)

    程序片段(01):函数.c+call.c+测试.cpp 内容概要:函数 ///函数.c #include <stdio.h> #include <stdlib.h> //01. ...

  2. 20160226.CCPP体系详解(0036天)

    程序片段(01):01.多线程.c+02.多线程操作.c 内容概要:多线程 ///01.多线程.c #include <stdio.h> #include <stdlib.h> ...

  3. 20160208.CCPP体系详解(0018天)

    程序片段(01):main.c 内容概要:PointWithOutInit #include <stdio.h> #include <stdlib.h> //01.野指针详解: ...

  4. 20160206.CCPP体系详解(0016天)

    代码片段(01):.指针.c+02.间接赋值.c 内容概要:内存 ///01.指针 #include <stdio.h> #include <stdlib.h> //01.取地 ...

  5. 20160204.CCPP体系详解(0014天)

    程序片段(01):define.h+data.h&data.c+control.h&control.c+view.h&view.c+AI.h&AI.c+main.c 内 ...

  6. 20160203.CCPP体系详解(0013天)

    程序片段(01):数组.c+02.数组初始化语法.c 内容概要:数组 ///01.数组.c #include <stdio.h> #include <stdlib.h> //0 ...

  7. 20160128.CCPP体系详解(0007天)

    以下内容有所摘取,进行了某些整理和补充 论浮点数的存储原理:float浮点数与double浮点数的二进制存储原理–>阶码 浮点数转二进制 1.整数int类型和浮点数float类型都是占用4个字节 ...

  8. 20160127.CCPP体系详解(0006天)

    程序片段(01):msg.c 内容概要:线程概念 #include <stdio.h> #include <stdlib.h> #include <Windows.h&g ...

  9. 20160217.CCPP体系详解(0027天)

    程序片段(01):TestCmd.c 内容概要:管道_字符串 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include < ...

随机推荐

  1. 2015年4月 15款免费jQuery插件

    点这里 We have collected for you the 15 fresh, free and handy jQuery plugins that will help to speed up ...

  2. HDU 1385 Minimum Transport Cost (Dijstra 最短路)

    Minimum Transport Cost http://acm.hdu.edu.cn/showproblem.php?pid=1385 Problem Description These are ...

  3. eclipse工程设置的问题

  4. Android核心分析之二十二Android应用框架之Activity

    3 Activity设计框架 3.1 外特性空间的Activity    我们先来看看,android应用开发人员接触的外特性空间中的Activity,对于AMS来讲,这个Activity就是客服端的 ...

  5. 常见的css3缩放效果

    transform的属性scale(x,y) 对元素进行缩放,x表示水平方向缩放倍数,y表示垂直方向的缩放倍数,y是可选参数,不设置,则表示两个方向的倍数是一样的,基点一样在元素的中心位置. 还有单向 ...

  6. WordPress定位当前使用模版

    把下面代码插入到wp-includes/template-loader.php,66行 if($_GET[tpl]=='die'){ die($template); } 浏览任意页面,在网址后加上&a ...

  7. 【重走Android之路】【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder

    [重走Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder   1.String String是Java中的一个final ...

  8. 学习了初级的Python

    今天傍晚完成了Code Academy上Python的所有练习,感觉Python的原力在我身体里流淌......下面要学习一些进阶的东西.之前Zhi哥跟我说Python比较简单,我还不太信.其实早在四 ...

  9. 311. Sparse Matrix Multiplication

    题目: Given two sparse matrices A and B, return the result of AB. You may assume that A's column numbe ...

  10. Linux系统监视资源与进程管理

    Linux 系统中时刻运行着许多的进程,如果能够合理的管理它们,有益于系统性能的优化, 系统进程总共有五种不同的状态: 命令一:ps命令,用于查看系统中进程状态 格式:ps [参数] 查看进程与状态: ...