中央电大C语言A课程辅导Word格式文档下载.docx
《中央电大C语言A课程辅导Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《中央电大C语言A课程辅导Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
![中央电大C语言A课程辅导Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-2/1/4c6178c2-6dd3-40c8-9f76-f361adc7ca74/4c6178c2-6dd3-40c8-9f76-f361adc7ca741.gif)
类型关键字>
数组名>
[<
常量表达式>
][={<
初值表>
}];
类型关键字为已存在的一种数据类型。
数组名是用户定义的一个标识符,用它来表示一个数组。
常量表达式只能是通过#define命令定义的符号常量,不能是通过const语句定义,常量表达式的值是一个整数,由它标明该一维数组的长度,即数组中所含元素的个数。
每个元素具有类型关键字所指定的类型。
初值表是用逗号分开的一组表达式,每个表达式的值将被依次赋给数组中的相应元素。
●一维数组的存储空间分配
一个数组被定义后,系统将在内存中为它分配一块能够存储n个数据元素的存储空间,其中n为数组长度。
所以数组所占用的存储空间的字节数应等于元素的个数n乘于元素类型的长度。
如对于一个含有10个int型元素的数组,它将对应10*4=40个字节的存储空间。
●一维数组定义举例
(1)inta[20];
//定义整型数组a,含20个int元素,a[0]-a[19]
(2)doubleb[MS];
//假定MS为已定义的符号常量,b[0]-b[MS-1]
(3)intc[5]={1,2,3,4,0};
//c[0]=1,c[1]=2,c[2]=3,c[3]=4,c[4]=0
(4)chard[]={'
a'
'
b'
c'
d'
};
//d[0]='
d[1]='
d[2]='
d[3]='
(5)inte[8]={1,4,7};
//e[0]=1,e[1]=4,e[2]=7,e[3]-e[7]=0
(6)charf[10]={'
B'
A'
S'
I'
C'
//f[0]='
...,f[5]-f[9]=0,’\0’
(7)floath1[5],h2[10];
//定义2个单精度数组
(8)shortintx=1,y=2,z,w[4]={25+x,-10,x+2*y,44};
//既定义有简单变量,又定义有数组,w[0]=26,w[1]=-10,w[2]=5
●一维数组元素的访问
定义了一个数组,就相当于同时定义了它所含的每个元素。
数组中的每个元素又称为下标变量,是通过下标运算符(即一对中括号[])来指明和访问的,具体格式为:
<
[<
表达式>
]
中括号运算符内的表达式称为下标表达式,下标表达式的值称为该元素下标。
表面上看,这与数组的定义格式类似,但它们出现的位置是不同的,当出现在变量定义语句时则为数组定义,而当出现在一般表达式中时则为一个元素。
假定a[n]为一个已定义的数组,则下面都是访问该数组的每个元素(下标变量)的合法格式:
(1)a[5]//下标为一个常数5
(2)a[i]//下标为一个变量i
(3)a[j++]//下标为后增1表达式j++,若j=3,则为元素a[3]
(4)a[2*x+1]//下标为一般表达式2*x+1,若x=3,则为元素a[7]
●使用一维数组的程序举例
程序1:
#include<
stdio.h>
voidmain()
{
inti,a[6];
printf("
从键盘输入6个整数:
"
);
//提示信息
for(i=0;
i<
6;
i++)scanf("
%d"
&
a[i]);
//6个整数依次输入到数组
for(i=5;
i>
=0;
i--)printf("
%d"
a[i]);
//按相反次序输出元素值
\n"
}
若程序运行时,从键盘上输入3、8、12、6、20和15这6个常数,则得到的输入和运行结果为:
381262015//a[0]-a[5]
152061283//a[5]-a[0]
程序2:
#defineM10//符号常量M为10
inti,a[M+1];
//定义数组a[11]
a[0]=1;
a[1]=2;
for(i=2;
i<
=M;
++i)
a[i]=a[i-1]+a[i-2];
//a[2]=3,a[3]=5,a[4]=8,…
M;
%d,"
//输出a[0]-a[9]的值,用逗号分开
%d\n"
a[M]);
//输出a[10]的值
三、二维数组
●二维数组的定义格式
常量表达式1>
][<
常量表达式2>
]
[={{<
初值表1>
},{<
初值表2>
},...}];
常量表达式1指定该数组的行数,行下标的取值范围是0-常量表达式1的值减1,常量表达式2指定该数组的列数,列下标的取值范围是0-常量表达式2的值减1。
假定常量表达式1和常量表达式2的值分别为m和n,则行下标的取值范围是0~m-1之间的m个整数,列下标的取值范围是0~n-1之间的n个整数。
如假定一个整型二维数组a的定义为:
inta[3][4];
则所包含的全部12个元素如下:
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]
●二维数组中元素的个数
二维数组中所包含的元素个数又称为该二维数组的大小,它等于该二维数组的行数和列数的乘积。
如:
inta[10][5];
//个数:
10*5=50
doublea[5][8];
5*8=40
chara[5][M+1];
5*(M+1)
●存储空间分配
系统给一个二维数组中的所有元素分配存储空间时,是首先按行下标从小到大的次序,行下标相同时再按列下标从小到大的次序进行的。
例如,若定义了一个double型的二维数组c[M][N],则c[0][0]元素占有整个数组存储空间的第1个数据单元,c[0][1]元素占有整个数组存储空间的第2个数据单元,…,c[i][j]元素占有整个数组存储空间的第i*N+j个数据单元。
每个数据单元所包含的字节数有数据类型决定。
●格式举例:
(1)inta[3][3];
//3行×
3列共9个整数类型的元素
(2)doubleb[M][N];
//假定M和N为已定义的整型常量,共M×
N个元素
(3)intc[2][4]={{1,3,5,7},{2,4,6,8}};
//定义并初始化
(4)intd[][3]={{0,1,2},{3,4,5},{6,7,8}};
//省略行下标的上限,9元素
(5)inte[3][4]={{0},{1,2}};
//位被初始化的元素自动为0
(6)charg[10],h[10][5];
//定义一维和二维字符数组g和h
●二维数组元素的表示和访问
行下标表达式>
][<
列下标表达式>
数组元素又称下标变量,二维数组元素带有两个下标,又称双下标变量,每个下标分别用中括号括起来。
每个下标可以是常量,也可以是变量、函数或表达式。
(1)inta[4][5];
//定义二维数组a
(2)a[1][2]=6;
//向a[1][2]元素赋值6,每个下标为常量
(3)a[2][2]=3*a[1][2]+1;
//取出a[1][2]的值6参与运算,
//把赋值号右边表达式的值19赋给a[2][2]元素中
(4)a[i][j-1]=a[i][j];
//下标变量赋值,下标为变量或表达式
(5)printf("
a[1][2]*a[2][2]-3);
//输出表达式的值111到窗口
●遍历二维数组
就是先按行从小到大,再按列从小到大的次序依次访问每个元素。
例如:
inti,j,a[M][N];
for(i=0;
i++)//行下标依次递增
for(j=0;
j<
N;
j++)//列下标依次递增
s+=a[i][j];
//所有元素值被累加到s中
●使用二维数组的程序举例
intb[2][5]={{7,15,5,8,20},{12,25,37,16,28}};
//定义和初始化
inti,j,min=b[0][0];
//给min赋初值为数组的第1个元素值7
2;
i++)//外循环变量i依次取0,1,2
for(j=0;
5;
j++)//内循环变量j依次取0,1,2,3,4
if(b[i][j]<
min)min=b[i][j];
//比较每个元素,小者赋min
min);
//输出min的值为5
程序功能:
从数组b[2][5]中求出所有元素的最小值并输出。
#defineM4//定义符号常量M为4
intc[M]={0};
//定义一维整型数组c[4]并初始化为0
intd[M][3]={{1,5,7},{3,2,10},{6,7,9},{4,3,7}};
//定义二维整型数组d[4][3]并初始化
inti,j,sum=0;
//求和变量sum被初始为0
i++){
3;
j++)c[i]+=d[i][j];
//d中每行元素值被累加到c[i]
sum+=c[i];
//c中所有元素值被累加到sum中
i++)printf("
c[i]);
//依次输出13152214
sum);
//输出64
1.一维数组类型的定义语句
一维数组类型的定义语句的格式:
typedef<
元素类型关键字>
数组类型名>
];
格式举例:
(1)typedefintVector[10];
//定义Vector为包含10个int元素
//的一维数组类型:
int[10],若用Vectora;
则等价于inta[10];
(2)typedefcharStrings[80];
//定义Strings为包含80个字符元素
char[80],若用Stringsnc;
则等价于charnc[80];
(3)typedefshortintArray[N];
//定义Array为包含N个短整型元素
//的一维数组类型,若用Arrayd={2,4};
则等价于shortintd[N]={2,4};
2.二维数组类型的定义语句
二维数组类型的定义语句的格式:
元素类型>
(1)typedefintMatrix[5][5];
//定义Matrix为包含5×
5的二维
//整型数组类型:
int[5][5],若用Matrixa;
则等价于inta[5][5];
(2)typedefdoubleDataType[M+1][N+1];
//定义DataType为包含
//(M+1)×
(N+1)个双精度元素的二维数组类型,若用
//DataTypesd={{0}};
则等价于doublesd[M+1][N+1]={{0}};
3.对已有类型定义别名
利用typedef语句不仅能够定义数组类型,而且能够对已有类型定义出另一个类型名,以此作为原类型的一个别名。
(1)typedefintinData;
//定义inData为int的别名,
//若用inDataa=5;
则等价于inta=5;
(2)typedefcharElemType;
//定义ElemType为char的别名,
//若用ElemTypeb[8]={'
b'
则等价于charb[8]={'
(3)typedefchar*chPointer;
//定义chPointer为字符指针类型,
//若用chPointerpx=&
x;
则等价于char*px=&
小节:
一维数组、二维数组、定义数组类型
这一讲就到这里,同学们再见!
1.数值计算
利用一维或二维数组存储具有一维(向量)结构的数据或二维(矩阵、表格)结构的数组,然后按照一定的规则进行相应的计算。
举例:
已知有两个数值矩阵A和B,编一程序计算出它们的和。
7-5336-9
A=28-6B=2-83
1-4-25-2-7
分析:
由数学知识可知,行数和列数分别对应相同的两个矩阵可以做加法,它们的和仍为一个矩阵,并且与两个加数矩阵具有相同的行数和列数。
在此题中的两个矩阵均为3行×
3列,所以它们的和矩阵同样为3行×
3列。
两矩阵加法运算的规则是:
求和矩阵中每个元素的值等于两个加数矩阵中对应位置上的元素值之和,即Cij=Aij+Bij,其中A和B表示两个加数矩阵,C表示它们的和矩阵。
在编写的程序中,首先应定义三个二维数组,假定分别用标识符a、b和c表示,它们分别对应A、B和C这三个矩阵,并需要根据A和B的数据对a和b进行初始化;
接着根据a和b计算出c;
最后按照矩阵的行列结构输出二维数组c,它就是对应的矩阵C。
根据分析编写出程序如下:
#defineN3//定义矩阵的大小
inta[N][N]={{7,-5,3},{2,8,-6},{1,-4,-2}};
//用a保存矩阵A
intb[N][N]={{3,6,-9},{2,-8,3},{5,-2,-7}};
//用b保存矩阵B
intc[N][N];
//用c保存求和结果,即矩阵C
inti,j;
//用i和j分别作为行、列循环变量
i++)//计算矩阵C
j++)
c[i][j]=a[i][j]+b[i][j];
i++){//输出矩阵C
%5d"
c[i][j]);
//每个数值占5个字符位置
//每行数据后输出一个换行
该程序运行时得到的输出结果如下:
101-6
40-3
6-6-9
2.统计
利用一维数组中的每个元素作为统计(计数)变量,统计出相应区间内数据的个数,然后在输出统计结果。
举例:
假定需要对某个地区职工的工资状况进行调查,把工资划分为11个区段,每隔1000为一个区段,即0~999.99(不含0)为第1区段,1000~1999.99为第2区段,依次类推,9000~9999.99为第10区段,10000及以上为第11区段。
编一程序,首先把调查得到的一批职工的工资数据输入到一个数组中,然后分别统计出每个区段内的职工人数及占总职工数的百分比。
由题意可知,职工工资的统计区段共11个,为此定义一个统计数组,假定用c[11]表示,用它的第1个元素c[0]统计工资在0~999.99区段内(不含0)的职工数,用它的第2个元素c[1]统计工资在1000.00~1999.99区间内的职工数,依次类推,用它的第11个元素c[10]统计工资在10000及以上区段内的职工数。
另外,还需要设置一个保存所有职工工资的数组,假定为a[Num],用来最多保存Num个职工的工资,Num为一个符号常量。
在程序中,首先定义数组a[Num]并为它最多输入Num个工资数据,若工资小于0则结束输入;
接着定义数组c[11]并初始化每个元素值为0;
然后依次读取a数组中的每个元素值,通过对1000整除确定出相应的统计区段,使得统计数组c中相应的元素值增1;
最后计算出每个区段的统计结果的百分比并输出。
stdlib.h>
#defineNum20
doublea[Num]={0.0};
//定义保存工资的数组数组a并初始化为0.0
intc[11]={0};
//定义保存统计结果的数组c并初始化为0
inti=0,j;
doublex;
//定义相应的简单变量
输入一批职工的工资数据(小于等于0则结束):
while(i<
Num){//通过循环为数组a输入数据
scanf("
%lf"
x);
if(x<
=0.0){printf("
数据输入完毕!
break;
}
a[i++]=x;
i;
j++){//c中的相应下标变量的值加1,完成统计
intk=(int)a[j]/1000;
//求出a[j]工资所在的区间序号
if(a[j]<
10000)c[k]++;
elsec[10]++;
10;
j++){//输出前10个区间内的统计结果和百分比
%8.2Lf---%8.2Lf:
j*1000.0,j*1000.0+999.99);
%d,%5.2Lf%%\n"
c[j],c[j]*1.0/i*100);
}//输出最后一个区间内的统计结果和百分比
10000.00及以上:
c[10],c[10]*1.0/i*100);
3.排序
排序就是对一组杂乱无章的数据进行有序排列的过程。
首先把初始数据保存到一维数组中,然后按照一定的排序方法使数组中的数据值按下标次序排列有序,最后按下标次序输出结果。
举例:
已知有10个常数为42,65,80,74,36,44,28,70,94,72,编一程序,采用选择排序的方法,按照从小到大的顺序排列并输出。
首先需要把已知的10个常数存入到一维数组中,假定该数组被定义为a[10];
接着采用选择排序的方法对数组a[10]中的10个元素按照其值从小到大的顺序排序,使得元素值的排列次序与下标次序相同,即得到a[0]≤a[1]≤a[2]≤...≤a[9];
最后按照下标次序显示出每个元素的值,它们是按值的从小到大的次序排列的。
具体排序过程:
对数组a中的10个元素进行选择排序共需要进行9次选择和交换的过程,第1次从待排序区间a[0]~a[9]中通过顺序比较选择出一个最小值元素,把它与该区间的第1个元素a[0]交换后,a[0]就成为所有10个元素中的最小值。
0123456789
42658074364428709472//顺序比较查找出a[6]
↑最小值
28[658074364442709472]//a[6]与a[0]交换
第2次从新的待排序区间a[1]~a[9]中通过顺序比较选择出一个最小值元素,把它与当前区间的第1个元素a[1]交换后,a[1]就成为仅次于a[0]的最小值元素。
28[658074364442709472]//顺序比较查找出a[4]
2836[8074654442709472]//a[4]与a[1]交换
同理,在从a[2]~a[9]中通过顺序比较选择出一个最小值元素,把它与当前区间的第1个元素a[2]交换后,a[2]就成为仅次于a[0]和a[1]的最小值元素。
2836[8074654442709472]//顺序比较查找出a[6]
283642[74654480709472]//a[6]与a[2]交换,第3次
28364244[657480709472]//第4次结果
2836424465[7080749472]//第5次结果
根据以上分析,编写出此题的完整程序如下:
#definen10
inta[n]={42,65,80,74,36,44,28,65,94,72};
voidSelectSort()//选择排序算法
inti,j,k;
n-1;
i++){//进行n-1次选择和交换