一、二维数组
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;
}