C 入门 第五节 多维数组 字符串数组
#pragma mark ----------二维数组----------
int main(int argc, const char * argv[]) {
/*
1 . 二维数组的本质:将数组作为数组元素的数组,称为数组的数组
2 . 类如:管理一个班4个学生的年龄,将一维数组作为数组元素,存储到另一个数组中
int age[4] = {12,13,14,15};
12,13,14,15
21,22,23,24
31,32,33,34
3 . 为了形象化理解二维数组,通常将二维数组写成行和列的排列形式.
二维数组通常被称为:m*n数组,或 m行n列
m 二维数组中包含多少个一维数组,是第一维,表示第几行
n 一维数组包含多少个元素,是第二维,表示第几列
5 . 二维数组常称为矩阵.矩阵:纵横排列的数据表格.
定义二维数组
类型 数组名[行数][列数] = {值}
1 . 行和列使用常量表达式
2 . 行数可以省略,列数不可以省
3 . 设置初始值,使用{{},{},{}};形式
4 . 每一行元素不足,会自动补齐
1 . 定义一个二维数组,存储3个班级学生的年龄,每班的学生都是5人
int age[3][5] = {{12,13,14,15,16},{21,22,23,24,25},{31,32,33,34,35}};
2 . 定义二维数组形式2,省略行数
a[][3] = {{1,2,3}{1,2,3,4,5}};
3 . 定义二维数组形式3,不推荐,不容易看出每一行的开始和结束
int a[][3] = {1,2,3,4,5};
访问二维数组的元素
访问单个元素 必须指定俩个下标,下标1代表所在的行,下标2代表所在列;
注意越界问题
printf("%d",a[1][0]);
printf("%d",a[1][2]);
修改二维数组元素
a[0][1] = 6;
printf("%d",a[0][1]);
//遍历二维数组,需要使用俩层循环,第一层循环控制第几行,第二层循环控制第几列
int a[2][3] = {{1,21,3},{4,5}};
for (int i = 0; i < 2; i ++)
{
for (int j = 0; j < 3; j ++)
{
printf("%2d\t",a[i][j]); //%2d是打印出的每个字符占俩个格
}
printf("\n");
}
*/
/*
//练习 : 讲一个二维数组的行和列交换,存储到另一个数组
int arr[2][3] = {{1,2,3},{4,5}};
int brr[3][2] = {0};
for (int i = 0; i < 3; i ++)
{
for (int j = 0; j < 2; j ++)
{
//printf("%d ",arr[i][j]);
brr[i][j] = arr[j][i];
printf("%d ",brr[i][j]);
}
printf("\n");
}
// 练习: 定义一个3行4列的数组,找出数组的最大元素,打印出来,并打印所在的行和列
int a[3][4] = {{5,45,566,58},{4,15,65,456},{21,47,5,566,}};
int c = 0;
for (int i = 0; i < 3; i ++)
{
for (int j = 0; j < 4; j ++)
{
if (c < a[i][j])
{
c = a[i][j];
}
}
}
printf("%d \n",c);
for (int i = 0; i < 3; i ++)
{
for (int j = 0; j < 4; j ++)
{
if (c == a[i][j])
{
printf("第%d行第%d列 \n",i,j);
}
}
}
printf("\n\n\n");
*/
/*
#pragma mark ---------字符串数组---------
1. 字符数组: 数组元素是字符的数组,一维数组
2. 字符串数组: 数据元素是 字符串 的数组,二维数组.字符串本身也是字符组
定义字符串数组,赋值时有些不同
char name[3][30] = {"pengqifeng","caijingping","zhangdonghui"};
// 访问某个字符串, 数组名[第一维下标]
for (int i = 0; i < 3; i ++)
{
printf("%s\n",name[i]);
}
// 访问某个字符 数组名[第一维下标][第二维下标]
for (int i = 0; i < 3; i ++)
{
for (int j = 0; j < 30; j ++)
{
printf("%c ",name[i][j]);
}
printf("\n");
}
// 练习 : 创建一个字符串数组(内容是你周围人的姓名),输出最长字符串的长度
char a[4][50] = {"asdf","gadf","qwerejir","asdfxcv"};
int c = 0;
for (int i = 0; i < 4; i ++)
{
int d = (int)strlen(a[i]);
if (c < d)
{
c = d;
}
}
printf("%d \n",c);
// 练习 : 创建⼀一个字符串数组(内容是你周围⼀一圈人的姓名),对字符串 (英文)从⼩到大排序。
char a[3][30] = {"lvyao","gaolei","gaojinghong"};
for (int i = 0; i < 2; i ++)
{
for (int j = 0; j < 2 - i; j ++)
{
if (strcmp(a[j], a[j + 1]) > 0) //按ACCII碼排列
// if (strlen(a[j]) < strlen(a[j + 1])) //按字符串长度排列
{
char b[30]= {0};
strcpy(b, a[j]);
strcpy(a[j], a[j + 1]);
strcpy(a[j + 1], b);
}
}
}
for (int i = 0; i < 3; i ++)
{
printf("%s ",a[i]);
}
// 从控制台输入字符串
// 字符数组存储字符串
char a[100] = {0};
// gets从标准输入设备读取字符串,以回车结束读取,使用'\0'结尾,回车符'\n'被舍弃没有遗留在缓冲区.
// 可以用来输入带空格的字符串
// 可以无限读取,不会判断上限,因此使用gets不安全,可能造成溢出
printf("请输入字符串");
gets(a); //读取
printf("%s\n",a);
//scanf(%s\n,a);以空格或回车符结束读取,空格或是回车符会遗留在缓冲区
//不能直接输入带空格的字符串
//scanf("%[^\n]",argc); %[]输入字符集
//[^\n]表示除了'\n'之外的字符都接收,即可以接收空格,这个可以用来输入带空格的字符串.
printf("请输入字符串");
scanf("%[^\n]",a);
printf("%s\n",a);
//从控制台输入字符串
//字符串数组存储多个字符串
char names[6][30] = {};
printf("请输入字符串: \n");
for (int i = 0; i < 6; i ++)
{
scanf("%s",names[i]); //循环输入字符串
getchar();
}
printf("您输入字符串为: \n");
for (int i = 0; i < 6; i ++)
{
printf("%s\n",names[i]);
}
*/
#pragma mark ------多维数组 ------
// 多维数组;数组下标在2个以上
// 三维数组;立体的 层,行,列
// 定义三维数组 类型 数组名[层][行][列]
// int a[2][3][4] = [0];
// 遍历三维数组 需要三层循环
int ages[2][3][4] = {{{1,2,3,4},{4,5,6,7},{7,8,9,10}},{{12,13,14,15},{15,16,17,18},{21,22,23,24}}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 4; k++) {
printf("ages[%d][%d][%d] = %d\n",i,j,k,ages[i][j][k]);
}
}
}
// 多维数组访问元素,数组名[下标][下标]....
// 多维数组 元素个数 = 各位数个数 乘积
// 多为数组占用内存 = 元素个数 乘以 单个元素所占空间