一、概念
数组 array:是多个相同类型数据按一定顺序排列的集合,并使用一个标识符命名。并通过编号(索引,亦称为下标或角标)的方式对这些数据进行统一管理。
数组的长度 = 元素的个数
标号角标是从0开始。
二、define_array.c
定义数组的三种形式:
1.定义数组,可以先确定数组的元素个数、类型,再进行赋值。
int(数组内元素类型) arr(数组名字) [3](元素个数)
int arr[ 3 ];
int arr[0]=100;
int arr[1]=200;
int arr[2]=300;
通过编号访问赋值。
2.直接赋值。
double arr1[5]={1.1,2.2,3.3,4.4,5.5}
3.与第二种相似,但不指定数组的元素长度。
float arr2[ ]={ },元素个数上不封顶
三、访问数组的元素
(1)通过角标进行访问
printf("数组的第0号元素:%d\n",arr[0]);
代码示例:
#include <stdio.h>
int main()
{
int arr[5]={10,20,30,40,50};
printf("第一号元素是%d",arr[1]);
return 0;
}
(2)数组内对应元素数值进行修改
代码示例:
#include <stdio.h>
int main()
{
int arr[5]={10,20,30,40,50};
printf("第一号元素是%d\n",arr[1]);
arr[1]=999;
printf("第一号元素是%d",arr[1]);
return 0;
}
四、越界操作(不允许)
数组下标必须在指定范围内使用,超出范围视为越界。
代码示例:
#include <stdio.h>
int main()
{
int arr[5]={10,20,30,40,50};
printf("第6号元素是%d",arr[5]);
return 0;
}
显而易见,越界操作系统会给垃圾值,一定不允许!!!
五、计算数组长度
重申知识点:数组长度也就是数组内元素的个数。
数组内的元素都是同一类型,因此用sizeof( )寻求数组的字节长度,再除以类型字节长度,可得元素个数。
#include <stdio.h>
int main()
{
int arr[5]={10,20,30,40,50};
int length=sizeof arr/(sizeof arr[0]);//用整个数组的字节长度除以单个元素的字节长度
//sizeof(arr)/sizeof(int)
printf("%d",length);// printf("%zu",sizeof(arr)/sizeof(int))
return 0;
}
六、遍历数组
遍历数组是指按顺序访问数组中的每个元素,以便读取或修改它们,编程中一般使用循环结构对数组进行遍历。
案例:循环遍历数组[0--5]
#include <stdio.h>
int main()
{
//定义数组
int arr[5]={10,20,30,40,50};
//算出长度
int length=sizeof(arr)/(sizeof(int));//用整个数组的字节长度除以单个元素的字节长度
for(int a=0;a<=length-1;a++)
{
printf("%d\n",arr[a]);
}
return 0;
}
七、计算数组中所有元素的和以及平均数
//计算数组中所有元素的和以及平均数
#include <stdio.h>
int main()
{
//定义数组
int arr[5]={10,20,30,40,50};
double sum=0;
//算出长度
int length=sizeof(arr)/(sizeof(int));//用整个数组的字节长度除以单个元素的字节长度
for(int a=0;a<=length-1;a++)
{
sum=sum+arr[a];
}
printf("和为%.2f\n",sum);
printf("平均数为%.2f",sum/length);
}
八、取出数组中最大/最小元素
#include <stdio.h>
int main()
{
int arr[]={10,20,30,40,50,-21,1234,89,1};
int max;//定义最大值
int min;//定义最小值
int len=sizeof(arr)/sizeof(int);
for(int a=0;a<=len-1;a++)
{
if(max<arr[a])//遇到大的值便抢过来为自己赋值
{
max=arr[a];
}
}
for(int a=0;a<=len-1;a++)
{
if(min>arr[a])
{
min=arr[a];//遇到小的值便抢过来为自己赋值
}
}
printf("最大为:%d 最小为:%d",max,min);
return 0;
}
九、字符数组(字符串)
1.介绍
用来存放字符的数组称为字符数组,也可以称为字符串。字符串的输入输出格式占位符是%s 。
字符串结尾,会自动添加一个 \0 作为字符串结束的标志,所以字符数组最后一个元素必须是 \0。
\0 是ASCII码表中的第0个字符,用NUL表示,称为空字符,该字符既不能显示,也不是控制字符,输出该字符不会有任何效果,它在C语言中仅作为字符串的结束标志。
2.定义
(1)char str[12]={'H','e','l','l','o',',','w','o','r','l','d','!','\0'}
(2)char str1[4]={'a','b','c'};这种方式会在最后自动添置上\0。
(3) char str2[4]={'J','a','c','k'};没有结束标志\0,就会找最近的\0。
字符串的简写方式:
char str[12]={"hello,world!"} 不常用!
char str[ ]="hello,kity!"; 常用!
3.遍历
#include <stdio.h>
int main()
{
char str[]="hello!";
int len=sizeof(str)/sizeof(char);//字符串数组长度
for(int a=0;a<=len-1;a++)
{
printf("%c\n",str[a]);
}
return 0;
}
4.课后练习
(1)从终端循环输入5个成绩,保存到double数组,并输出。
#include <stdio.h>
int main()
{
double arr[5];
for(int a=0;a<5;a++)
{
scanf("%lf",&arr[a]);//循环输入
}
for(int b=0;b<5;b++)
{
printf("%lf\n",arr[b]);//循环输出
}
return 0;
}
(2)一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,3.4kg,2kg,50kg。请问这六只鸡的总体重是多少?平均体重是多少?
//一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,3.4kg,2kg,50kg。请问这六只鸡的总体重是多少?平均体重是多少?
#include <stdio.h>
int main()
{
//定义鸡体重的数组
double arr[6]={3,5,1,3.4,2,50};
//定义总体重和平均值
double sum=0;
for(int a=0;a<=5;a++)
{
sum=sum+arr[a];
}
printf("总体重:%f\n",sum);
printf("平均体重:%f",sum/6);
return 0;
}
(3)创建一个char类型的26个元素的数组,分别放置'A'-'Z‘。使用for循环访问所有元素并打印出来。
//创建一个char类型的26个元素的数组,分别放置'A'-'Z‘。使用for循环访问所有元素并打印出来。
#include <stdio.h>
int main()
{
//定义
char arr[26];
for(int a=0;a<=25;a++)
{
arr[a]='A'+a;
printf("%c\n",arr[a]);
}
return 0;
}
(4)请求出一个数组的最小值,并得到对应的索引。
//请求出一个数组的最小值,并得到对应的索引。
#include <stdio.h>
int main()
{
double arr[]={};
double min;
int len=sizeof(arr)/sizeof(double);
for(int a=0;a<=len-1;a++)
{
if(min>arr[a])
{
min=arr[a];
}
}
printf("%f\n",min);
for(int b=0;b<=len-1;b++)
{
if(min==arr[b])
{
printf("%d",b);
}
}
return 0;
}
//请求出一个数组的最小值,并得到对应的索引。
#include <stdio.h>
int main()
{
int arr[7]={90,30,20,40,50,60,100};
int min=arr[0];
int min1=0;
int len=sizeof(arr)/sizeof(int);
for(int a=0;a<len;a++)
{
if(min>arr[a])
{
min=arr[a];
min1=a;
}
}
printf("%d\n",min);
printf("%d\n",min1);
return 0;
}
十、多维数组
1.二维数组
2.二维数组的定义方式
(1)先定义行数、列数,再进行赋值
int arr[3][4];//定义
arr[0][1]=100;
``````//赋值
(2)先定义行列,同时赋值
int arr1[3][4]={ {10,20,30,40},{50,60,70,80},{90,100,110,120} };
(3)编译器自动给出行与列
int arr2[3][4]={ 10,20,30,40,50,60,70,80,90,100,110,120 };
(4)能在整除的情况下省略行
int arr3[ ][4]={10,20,30,40,50,60,70,80,90,100,110,120};
3.二维数组的访问与遍历
使用两个下标。
#include <stdio.h>
int main()
{
int arr[2][3]={1,2,3,4,5,6};
printf("%d",arr[0][2]);
return 0;
}
遍历:
外层遍历行数,内层遍历列数。
二维数组的行占字长,row=sizeof(arr)/sizeof(arr[0])
列占字长,col=sizeof(arr[0])/sizeof(int)
#include <stdio.h>
int main()
{
int arr[2][3]={1,2,3,4,5,6};
//二维数组的长度
int row=sizeof(arr)/sizeof(arr[0]);
int col=sizeof(arr[0])/sizeof(int);
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf("第%d行,第%d列的%d\n",i+1,j+1,arr[i][j]);
}
}
return 0;
}
4.二维数组的内存分析
用矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。
C语言中,二维数组中元素排列的顺序是按行存放的。即:先顺序存放第一行的元素,再存放第二行的元素。
比如,举例,数组a[3][4] 在内存中的存放:
5.二维数组应用案例
现在有三个班,每个班五名同学,用二维数组保存他们的成绩,并求出每个班级平均分、以及所有班级平均分,数据要求从控制台输入。
思路分析:(1)三个班五名同学,要求用二位数组保存他们的成绩。可以说明有15组成绩,三行五列的数组。定义为arr[3][5]。
(2)可设成绩:arr[3][5]={ {67,78,87,89,98},{67,78,68,89,59},{34,45,67,89,99} }
(3)要求计算每个班级的平均分、以及所有班级的平均分。
//arr[3][5]={ {67,78,87,89,98},{67,78,68,89,59},{34,45,67,89,99} }
#include <stdio.h>
int main()
{
double arr[3][5];
double sum=0;
double sum1=0;//班级平均分的和
for(int a=0;a<3;a++)
{
for(int b=0;b<5;b++)
{
printf("请输入成绩:");
scanf("%lf",&arr[a][b]);
sum+=arr[a][b];
}
printf("第%d个班级的平均分是%lf\n",a+1,sum/5);
sum1+=sum/5;
}
printf("所有班级的平均分是%lf\n",sum1/3);
return 0;
}
十一、今日测试
1.输出结果。
输出:7
2.如何计算数组的长度
数组的字节长度/元素字节长度
3.字符数组的最后一个元素
\0
4.算出程序结果
break终止就近的循环语句,外层继续进行。
结果:1 1
2 1
3 1