嵌入式学习C语言(八)二维数组及排序算法

目录

一、二维数组

二、二维字符数组


一、二维数组

1.定义形式 类型说明符 数组名[常量表达式1][常量表达式2]; 连续性、有序性、单一性

表达式1可以理解为行,表达式2可以理解为列。

int a[3][4]; //表示有3个 长度为4的一维数组。

//此时,a[0],a[1],a[2]为一个一维数组的数组名。

int a[3][4][5]; // 可理解为,有三个元素,每个元素都是一个二维数组 。

依次类推,但一般只用到二维数组

2.a[0]为一维数组数组名,等价&a[0][0](整型变量的4个字节首地址);此时为整形指针

a为二维数组数组名,等价&a[0](一维数组16个字节的首地址);此时为数组指针

3.二维数组初始化

int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

未全部赋初值的数组剩余元素会自动赋值为0

int a[3][4] = {{1,2,3,4},{5,6,7},{9,10,11,12}} ;//因为第二个数组只有3个数据,此时会在 a[1][3] //自动赋值0。

int a[3][4] = {1,2,3,4,5,6,7,9,10,11,12}; //因为数组需要3X4个数据,而此时只有11个,因此会

//最后一个空间中写入0即在a[2][3]中赋值0。

int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //二维数组定义时,只有第一个[]内的数可以省略,会跟据 //初始化数据量,默认分配大小。

eg1 二维数组元素遍历

cpp 复制代码
	int a[][4] = {1,2,3,4, 5,6,7, 8, 9,10,11,12};
	int i, j;

	int rows = sizeof(a) / sizeof(a[0]);
	int cols = sizeof(a[0]) / sizeof(a[0][0]);

	int sum = 0;
	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			sum += a[i][j];
			printf("%2d ", a[i][j]);
		}
		puts("");
	}

eg2 计算二维数组元素和

cpp 复制代码
int main(void)
{
	int a[][4] = {1,2,3,4, 5,6,7, 8, 9,10,11,12};
	int i, j;

	int rows = sizeof(a) / sizeof(a[0]);
	int cols = sizeof(a[0]) / sizeof(a[0][0]);

	int sum = 0;
	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			sum += a[i][j];
		//	printf("%2d ", a[i][j]);
		}
		//puts("");
	}
	
	printf("%d\n", sum);
	return 0;
}

eg3 每行元素逆序

cpp 复制代码
int main(void)
{
	int a[][4] = {1,2,3,4, 5,6,7, 8, 9,10,11,12};
	int i, j;
	int rows = sizeof(a) / sizeof(a[0]);
	int cols = sizeof(a[0]) / sizeof(a[0][0]);

	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols / 2;++j)
		{
			int t;
			t = a[i][j];
			a[i][j] = a[i][cols - j - 1];
			a[i][cols - j - 1] = t;
		}
	}

	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			printf("%2d ", a[i][j]);
		}
		puts("");
	}
	return 0;
}

eg4 计算二维数组边框数的和。

cpp 复制代码
int main(void)
{
	int a[][4] = {1,2,3,4, 5,6,7, 8, 9,10,11,12};
	int i, j;
	int sum = 0;
	int rows = sizeof(a) / sizeof(a[0]);
	int cols = sizeof(a[0]) / sizeof(a[0][0]);

	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			if(0 == i || 0 == j || rows - 1 == i || cols - 1 == j)
			{
				sum += a[i][j];
			}
		}
	}
	printf("%d\n", sum);

	return 0;
}

eg5 输出魔方数

cpp 复制代码
int main(void)
{
	int a[3][3] = {0};
	int i = 0, j = 1;
	int n;
	a[i][j] = 1;

	for(n = 2;n < 10;++n)
	{
		int x = i;
		int y = j;
		++j;
		if(j > 2)
		{
			j = 0;
		}
		--i;
		if(i < 0)
		{
			i = 2;
		}

		if(a[i][j] != 0)
		{
			i = x;
			j = y;
			++i;
			if(i > 2)
			{
				i = 0;
			}
		}

		a[i][j] = n;
	}

	for(i = 0;i < 3;++i)
	{
		for(j = 0;j < 3;++j)
		{
			printf("%2d ", a[i][j]);
		}
		puts("");
	}

	return 0;
}

二、二维字符数组

1. char s[3][100] = {"Hello","World","China"}; 与整型类似

eg1 遍历输出

cpp 复制代码
int rows = sizeof(a)  / sizeof(a[0]) 定义行号的个数
int cols = sizeof(a[0]) / sizeof(a[0][0]) 定义列号的个数

for(i = 0;i < rows;++i)

     {

            puts(s[i]);

     }

eg2 字符串比较求最大。

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China", "america"};
	char max[100];
	int i;
	int rows = sizeof(s) / sizeof(s[0]);

	strcpy(max, s[0]);
	
	for(i = 1;i < rows;++i)
	{
		if(strcmp(max, s[i]) < 0)
		{
			strcpy(max, s[i]);		
		}
	}

	puts(max);

	return 0;
}

eg 3 字符串逆序

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China"};
	int rows = sizeof(s) / sizeof(s[0]);
	int i;
	for(i = 0;i < rows / 2;++i)
	{
		char t[100];
		strcpy(t, s[i]);
		strcpy(s[i], s[rows - i - 1]);
		strcpy(s[rows - i - 1], t);
	}
	
	for(i = 0;i < rows;++i)
	{
		puts(s[i]);
	}

	return 0;
}

eg4 字符串选择排序

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China", "America"};
	int rows = sizeof(s) / sizeof(s[0]);
	
	int i, j;

	for(i = 0;i < rows - 1;++i)
	{
		for(j = i + 1;j < rows;++j)
		{
			if(strcmp(s[i], s[j]) > 0)
			{
				char t[100];
				strcpy(t, s[i]);
				strcpy(s[i], s[j]);
				strcpy(s[j], t);
			}
		}
	}

	for(i = 0;i < rows;++i)
	{
		puts(s[i]);
	}
	return 0;
}

eg5 字符串冒泡排序

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China", "America"};
	int rows = sizeof(s) / sizeof(s[0]);

	int i, j;
	for(j = rows - 1;j > 0;--j)
	{
		for(i = 0;i < j;++i)
		{
			if(strcmp(s[i], s[i + 1]) > 0)
			{
				char t[100];
				strcpy(t, s[i]);
				strcpy(s[i], s[i + 1]);
				strcpy(s[i + 1], t);
			}
		}
	}

	for(i = 0;i < rows;++i)
	{
		puts(s[i]);
	}
	return 0;
}

eg6 字符串插入排序

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China", "America"};
	int rows = sizeof(s) / sizeof(s[0]);
	
	int i, j;

	for(i = 0;i < rows ;++i)
	{
        char t[100];
        strcpy(t,s[i]);
        j=i;
        while(j>0 && strcpy(s[j-1],t)>0)
        {
            strcpy(s[j],s[j-1]);
            --j;
        }
        strcpy(s[j],t);
    }
    for(i=0;i<rows;++i)
    {
        puts(s[i]);
    }
    return 0;
}

eg7 字符串的二分查找法 前提也是排好顺序的

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China", "America"};
	int rows = sizeof(s) / sizeof(s[0]);

	int i, j;
	for(j = rows - 1;j > 0;--j)
	{
		for(i = 0;i < j;++i)
		{
			if(strcmp(s[i], s[i + 1]) > 0)
			{
				char t[100];
				strcpy(t, s[i]);
				strcpy(s[i], s[i + 1]);
				strcpy(s[i + 1], t);
			}
		}
	}


	char n[100] = "China!";
	int begin = 0;
	int end = rows - 1;
	int mid;

	while(begin <= end)
	{
		mid = (begin + end) / 2;
		if(strcmp(s[mid], n) > 0)
		{
			end = mid - 1;
		}
		else if(strcmp(s[mid], n) < 0)
		{
			begin = mid + 1;
		}
		else
		{
			break;
		}
	}

	if(begin <= end)
	{
		puts("found");
	}
	else
	{
		puts("not found");
	}


	

	return 0;
}
相关推荐
董董灿是个攻城狮1 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
RuoZoe6 小时前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
AI软著研究员8 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish9 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱10 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习