嵌入式学习的第九天-二维数组

一、二维数组

1.二维数组的存储
  • 连续性:存放空间使连续的,数组在内存中存储相邻元素之间无断点
  • 有序性:取地址时元素下标越大地址越小
  • 单一性:数组中说有元素的类型必须相同
2.二维数组的定义

        一般形式:数组名[常量表达式][常量表达式];

3.二维数组的引用

        一般形式:数组名[下标][下标]

  • 下表可以为整形表达式,如a[2-1][2*2-1],不能写成a[2,3]、a[2-1,2*2-1]形式
  • 数组元素可以出现在表达式中 ,也可以被赋初值,如b[1][2]=a[2][3]/2
4.初始化

(1)全部初始化

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};

 (2)局部初始化

int a[3][4] = {{1},{5},{9}};
int a[3][4] = {1,5,9};

        没有给定初值的元素,其初始化值为0

(3)默认初始化:行能省略,列不能省略,否则编译报错

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

二、排序

1.二维字符型数组的逆序

#include<stdio.h>
#include<string.h>
int main(void)
{
	char s[][100] = {"Hello","World","China"};
	char t[100];
	int i;
	int rows = sizeof(s) / sizeof(s[0]);

	for (i = 0;i < rows / 2;++i)
	{
		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;
}

二维整形数组的逆序

#include<stdio.h>
int main(void)
{
	int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int sum = 0;
	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 tmp;
			tmp = a[i][j];
			a[i][j] = a[i][cols - j - 1];
			a[i][cols - j - 1] = tmp;
		}
	}

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

2.二维数组的选择排序

#include<stdio.h>
#include<string.h>
int main(void)
{
	char s[][100] = {"Hello","World","China","Amercia"};
	int i,j;
	int rows = sizeof(s) / sizeof(s[0]);
	char t[100];

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

3.二维数组的冒泡排序

#include<stdio.h>
#include<string.h>
int main(void)
{
	char s[][100] = {"Hello","World","China","Amercia"};
	int i,j;
	int rows = sizeof(s) / sizeof(s[0]);
	char t[100];

	for(j = rows - 1;j > 0;--j)
	{
		for(i = 0;i < j ;++i)
		{
			if(strcmp(s[i],s[i + 1]) > 0)
			{
				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;
}

4.二维数组的插入法排序

#include<stdio.h>
#include<string.h>
int main(void)
{
	char s[][100] = {"Hello","World","China","Amercia"};
	int i,j;
	int rows = sizeof(s) / sizeof(s[0]);

	for(i = 1;i < rows;++i)
	{
		char t[100];
		strcpy(t,s[i]);
		int j = i;
		while(j > 0 && strcmp(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;
}

三、二维数组的查找

#include<stdio.h>
#include<string.h>
int main(void)
{
	char s[][100] = {"Hello","World","China","Amercia"};
	int i,j;
	int rows = sizeof(s) / sizeof(s[0]);
	char t[100];

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

	 while(begin <= end)
	 {
		int mid;
		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)
	{
		printf("found");
	}
	else
	{
		printf("not found");
	}

	return 0;
}

四、例题

1.魔方阵

#include<stdio.h>
int main(void)
{
	int a[3][3] = {0};
	int i = 0;
	int j = 1; 
	a[i][j] = 1;
	int n;

	for(n = 2;n < 10;++n)
	{
		int t = i,m = j;
		++j;
		if (j > 2)
		{
			j = 0;			
		}
		--i;
		if(i < 0)
		{
			i = 2;
		}
		if(a[i][j] != 0)
		{
			t = i;
			m = j;
			++i;
			if(i > 2)
			{
				i = 0;
			}
		}
		a[i][j] = n;
		
	}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值