C_Language_06
C_Language_06
二维数组:
1.二维数组的本质:将数组作为数组元素的数组。称为数组的数组。
2.类如:管理一个班级4个学生的年龄。
int age[4] = {12,13,14,15};
12,13,14,15
21,22,23,24
31,32,33,34
3.为了形象化理解二维数组,通常将二维数组写成行和列的排列形式
4.二维数组通常被称为:m*n,或m行n列
m二维数组中包含多少个一维数组,是第一维,表示第几行
n一维数组包含多少个元素,是第二维,表示第几列
5.二维数组常称为矩阵。矩阵:纵横排列的数据表格
定义二维数组
1.类型名 数组名[行数][列数] = [值];
行和列使用常量表达式
2.行数可以省略,列数不可以省
3.设置初始值,使用{{},{},{}};形式
4.每一行元素不足,会自动补齐
定义:
1.定义二维数组形式1
定义一个二维数组,存储3个班级学生的年龄,每个班的学生都是5人
int age[3][5] = {{12,13,14,15,16},
{21,22,23,24,25},
{31,32,33,34,35}};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
printf("%d ",age[i][j]);
}
printf("\n");
}
2.定义二维数组形式2,省略行数,列数不可以省
int a[][3] = {{1,2,3},{4,5,6},{7,8,9}};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
3.定义二维数组形式3,不推荐,不容易看出每一行的开始和结束
int a1[][3] = {1,2,3,4,5};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ",a1[i][j]);
}
printf("\n");
}
访问二维数组的元素:
访问单个元素 必须指定两个下标,下标1代表所在的行,下标2代表所在的列。
注意越界问题:
int a[][3] = {{1,2,3},{4,5,6},{7,8,9}};
printf("%d\n",a[1][0]);
printf("%d\n",a[1][3]);
修改二维数组的元素:
a[0][1] = 6;
printf("%d\n",a[0][1]);
遍历:需要使用两层循环,第一层循环控制第几行,第二层循环控制第几列
int str[2][3] = {{1,2,3},{4,5}};
for (int i = 0 ; i < 2; i ++)
{
for (int j = 0; j < 3; j ++)
{
printf("%2d ",str[i][j]);//%2d是打印出的每个字符占两个格
}
printf("\n");
}
示例:将一个二维数组的行和列交换,存储到另一个数组
int arr1[2][3] = {{1,2,3,},{4,5}};
int arr2[3][2] = {0};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
arr2[i][j] = arr1[j][i];
printf("%2d ",arr2[i][j]);
}
printf("\n");
}
示例:定义一个3行4列的数组,找出数组的最大元素所在行和列
方法一 只能找一个最大的,有两个以上最大值则打印第一个
int a[3][4] = {{1,2,3,245},
{4,5,1333,7},
{99,10,11,1333}};
int max = a[0][0], im = 0, jm = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
if (max < a[i][j]) {
max = a[i][j];
im = i;
jm = j;
}
}
}
printf("最大元素%d所在行为%d 列为%d",max,im,jm);
方法二 可以查找多个相同的最大值
int a[3][4] = {{1333,2,3,245},
{4,5,1333,7},
{99,10,11,1333}};
int max = a[0][0];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
if (max < a[i][j]) {
max = a[i][j];
}
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
if (a[i][j] == max) {
printf("最大元素%d所在行为%d、列为%d\n",a[i][j],i,j);
}
}
}
字符串数组:
1.字符数组:数组元素是字符的数组,一维数组
2.字符串数组:数据元素是 字符串 的数组,二维数组。字符串本身也是字符数组
定义:定义字符串数组,赋值时有些不同
示例:char names[3][30] = {
"pengqifeng",
"caijianping",
"zhangdonghui"
};
printf("%s \n",names[2]);
for (int i = 0; i < 3; i++) {
printf("%s ",names[i]);
}
printf("\n");
访问某个字符:数组名[第一维下标][第二维下标]
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 30; j++) {
printf("%c ",names[i][j]);
}
printf("\n");
}
示例:创建一个字符串数组(内容是你周围人的姓名),输出最长字符串的长度
方法一:char a[4][20] = {
"liudehua",
"zhangxueyou",
"lilianjieg",
"chenglong"
};
int lengthMax = 0;
for (int i = 0; i < 4; i++) {
int length = (int)strlen(a[i]);
if (length > lengthMax) {
lengthMax = length;
}
}
printf("%d ",lengthMax);
for (int i = 0; i < 4; i++) {
if (lengthMax == (int)strlen(a[i])) {
printf("%s",a[i]);
}
}
方法二:char a[6][20] = {
"liudehua",
"liuhuan",
"lilianjieg",
"chenglong",
"naying",
"zhangxueyou"
};
int lMax = 0, n = 0;
for (int i = 0; i < 6; i++) {
for (int j = 0; j <20; j++) {
if (a[i][j] != '0' && a[i][j] != '\0') {
n++;
}else{
lMax = lMax < n ? n : lMax;
n = 0;
}
}
}
n = 0;
printf("%d ",lMax);
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 20; j++) {
if (a[i][j] != '0' && a[i][j] != '\0') {
n++;
if(n == lMax){
printf("%s ",a[i]);
}
}else{
n = 0;
}
}
}
printf("\n");
示例:创建一个字符串数组,对字符串(英文)从小到大排列
char names[5][20] = {"zhangsanfeng","yangguo","xiaobaima","angnababy","sixdf"};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4 - i; j++) {
if (strcmp(names[j], names[j+1]) > 0){
char name[20] = {0};
strcpy(name,names[j]);
strcpy(names[j],names[j+1]);
strcpy(names[j+1],name);
}
}
}
for (int i = 0; i < 5; i++) {
printf("%s ",names[i]);
}
从后台输入字符串
字符数组存储字符串
char a22[100] = {0};
gets 从标准输入设备读取字符串,以回车结束读取,使用‘\0’结尾,回车符‘\n’被舍弃没有遗留在缓冲区。可以用来输入带空格的字符
可以无限读取,不会判断上限,因此使用gets不安全,可能造成溢出
printf("请输入字符串:");
gets(a22);
printf("%s\n",a22);
sccanf("%s\n",a);以空格或回车符结束读取,空格或是回车符会遗留在缓冲区,不能直接输入带空格的字符串
scanf("%[^\n]",a); %[]输入字符集
[^\n]表示除了‘\n’之外的字符都接收,即可以空格,这个可以用来输入带空格的字符串。
printf("请输入字符串:");
char a22[100] = {0};
scanf("%[^\n]",a22);
printf("%s",a22);
从控制台输入字符串
字符串数组存储多个字符串
char names3[6][30] = {};
printf("请输入字符串:\n");
for (int i = 0; i < 6; i++) {
scanf("%s",names3[i]);//循环输入字符串
getchar();
}
printf("您输入的字符串为:");
for (int i = 0; i < 6; i++) {
printf("%s\n",names3[i]);
}
多维数组(了解):
多维数组:数组下标在2个以上
三维数组:立体的层,行,列
定义三维数组 类型 数组名[层][行][列]
int a11[2][3][4] ={0};
遍历三维数组 需要三层循环
int ages[2][3][4] = {{{1,2,3,4},{4,5,6,7},{7,8,9,}},
{{12,13,14,15},{15,16,17,18},{21,22,23,24}}};
for (int i = 0; i < 2; i++) {
printf("第%d层\n",i);
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 4; k++) {
printf("ages[%d][%d][%d] = %d ",i,j,k,ages[i][j][k]);
}
printf("\n");
}
printf("\n");
}
多维数组访问元素,数组名[下标][下标]...
多维数组 元素个数 = 各位数个数 乘积
多维数组占用内存 = 元素个数 乘以单个元素所占空间

浙公网安备 33010602011771号