掌握一维数组,二维数组的定义,初始化和数组元素的引用
掌握字符数组的定义,初始化和数组元素的引用
掌握字符串的存储方式和应用
掌握有关处理字符串
【问题】从键盘接收10个数,求平均数并输出所有小于平均数的数
【分析】从键盘接收10个数,求平均数很简单,可以采用边接收边求和的方法,最后根据综合求平均数。下面的程序可以做到:
int a;
float s;
for(i=0,s=0;i<10;i++)
{
scanf("%d,&a");
s = s + a;
}
平均数就是S/10了,但是输出小于平均数的数就比较麻烦了,因为从键盘接收的10个数在求和以后没有保存起来,输出比平均数小的数已经无法实现。要解决此问题,必须将10个数存储下来,而利用数组就可以解决这个问题。
所谓数组,就是一组类型相同的变量。它用一个数组名标识,每个数组元素都是通过数组名和元素的相对位置——下标来引用的。数组可以是一维的,也可以是多为的。
观察以下系列变量:
int a1,a2,a3,…,a10
这是一组int类型变量,可以定义以下数组来代替这些变量:
int a[10];
这就是数组,该元素包括以下元素:
a[1],a[1],a[3],…,a[9]
其中下标从0开始,和前面不同的是,这些变量统一共享一个数组名a。
下面具体研究。
一维数组用于存储一行或一列的数据。定义方式如下:
<类型> <数组名> [<常量表达式>];
<类型>:数组元素的数据类型,可以是int,char,float等简单类型,以及后面我们要学到的结构体,共用体等复杂类型。
<数组名>:数组的标识,命名规则同变量名。
<常量表达式>:用于定义数组的长度,因为数组也必须先定义后使用。
例如:
int a[10];
char s[100];
定义数组时需要注意:
(1)C语言不允许对数组的大小作动态定义,即定义行中的数组长度可以包括常量和符号常量,但不能包括变量。例如,下面的定义是错误的。
int n=10;
int a[n]; /*因为n为变量*/
而下面的定义是正确的:
#define N 10
void main()
{
int a[N];
……
}
(2)定义数组 的同时可以对数组初始化。以下初始化的方法都是允许的:
int a[10]={1,2,3,4,5,6,7,8,9,10}; //全部元素都初始化
int a[]={1,2,3,4,5,6,7,8,9,10}; //全部元素都初始化,可以省略长度说明
int a[10]={1,2,,4,5}; //部分元素a[0],a[1],a[3],a[4]初始化
使用数组时需要注意:
(1)数组元素的下标从0开始。
int a[10];
则自然计数的第i个元素是:a[i-1],例如第5个元素是a[4]。有的书上也称第一个元素为第0元素,这种说法将会导致歧义,a[4]变成第4元素,但不是第4个元素。
n个元素的数组,其最大下标是n-1,如上面的数组,最后一个元素是a[9],不存在a[10]这个元素。
(2)数组名不能像变量一样进行赋值操作。以下用法是错误的:
int a[10],b[10];
a=b; //错误
下面是常见的一维数组的定义:
int a[10]; /*定义整形数组a,它有10 个yuansu*/
char s[20]; /*定义字符型数组s,它有20 个元素*/
float f[5],g[10]; /*定义实型数组f和g,f数组有5个元素,g数组有10个元素*/
编程求10个数中的最大值,最小值,平均值。输出所有小于平均值的数。
#include
void main()
{
int a[10],i;
int max,min;
float s=0,average;
printf("Input 10 numbers: ");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
s = max = min = a[0];
for(i=1;i<10;i++)
{
if (a[i]>max)
max=a[i];
else
if(a[i
运行后输入68 88 95 75 82 95 56 76 86 92<回车>,程序的结果如下所示。
Input 10 numbers:68 88 95 75 82 95 56 76 86 92
max is 95
min is 56
averagr is 81.30
68 75 56 76
程序中先将a[0]的值赋给max,然后利用for循环将剩余9个元素逐个与max比较,如果发现比max大的元素,则用该元素的值替换max,从而保证max总是最大值。
计算出平均值aver后,再把数组中的10个元素与aver逐个比较,输出其中小于平均值的数。
程序中的变量aver可能是小数,定义的类型不能是int类型。s可以定义成int类型,过如果定义成int类型,语句aver=s/10;需要写成aver=s/10.0;,因为s/10是整除了。通过上面的程序可以看出,数组的最大优点就是:下标可以是变量甚至是表达式,从而给访问和操作一组变量带来了极大的方便。
二维数组用于存放矩阵形式的数据,如二维表格等数据。
定义二维数组的格式如下:
<类型> <数组名> [<常量表达式1>] [<常量表达式2>];
例如:
int a[3][4]; //3x4的矩阵,共12个元素
float f[5][10];
以上和一维数组相似,定义了一组变量,只不过这些变量有行和列的排序。如int a[3][4]的排列如下:
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
以上是便于理解和引用的逻辑排列结构,在计算机的内存中,其物理存储结构会因为系统不同而不同,例如下图的物理存储结构。
注意图中每个元素占4个字节的存储空间,这是因为32位机器的int型的长度为4字节,如果是16位机器就是2个字节了,不同类型不同机器每个元素的长度不一样。
二维数组的初始化可以有:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; /*完全初始化*/
int a[][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}}; /*分行完全初始化,可读性较好*/
int a[3][4]={1,2,3,4}; /*部分初始化*/
引用二维数组元素的方法与一维数组类似,只不过多了一个下标。
演示二维数组的定义及元素引用
#include
void main()
{
int i,j,k=0;
int a[3][4];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
a[i][j]=k;
printf("a[%d][%d]=%d\t",i,j,a[i][j]);
k++;
}
}
printf("\n");
}
程序的运行结果如下所示:
a[0][0]=0 a[0][1]=1 a[0][2]=2 a[0][3]=3
a[1][0]=4 a[1][1]=5 a[1][2]=6 a[1][3]=7
a[2][0]=8 a[2][1]=9 a[2][2]=10 a[2][3]=11
Press any key to continue
输入3位学生的计算机,数学成绩,计算每门课程 的平均分。
#include
void main()
{
float score[3][2],average[3],temp;
char info[2][10]={"Computer","English"};
int i,j;
for( i = 0 ; i < 3 ; i++ )
{
printf("No:%d\n",i+1);
for( j = 0 ; j < 2 ; j++ )
{
printf("%s:",info[j]);
scanf("%f",&score[i][j]);
}
}
for(i=0;i<2;i++) /*课程循环*/
{
temp = 0;
for(j=0;j<3;j++)
temp = temp + score[j][i]; /*j学生的i课程成绩*/
average[i] = temp / 3;
printf("%s:%.2f\n",info[i],average[i]);
}
}
程序的运行结果如下所示。
No:1
Computer:90
English:85
No:2
Computer:82
English:88
No:3
Computer:68
English:73
Computer:80.00
English:82.00
Press any key to continue
二维数组的引用需要两重循环来分别控制行和列,程序中需要注意行和列的关系。
上面程序中定义和使用了字符型数组char info[3][10],下一节将详细介绍。
作者主页: 正函数的个人主页
文章收录专栏: C语言
欢迎大家点赞 收藏 ⭐ 加关注哦!
如果你认为这篇文章对你有帮助,请给正函数点个赞吧,如果发现什么问题,欢迎评论区留言!!