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