引言迄今为止,我们使用的都是属于基本类型的数据(整型,字符型,实型),c语言还提供了构造类型,构造类型由基本类型按一定规则组成。数组就属于构造类型。数组是处理多个数据时十分有用的工具。数组可分为数值数组、字符数组、指针数组、结构数组等。引言•数组是包含相关数据项并且这些数据项具有相同的数据类型的一种数据结构。•数组是一种静态的实体,在程序的整个执行过程中所占存储空间的大小不变(当然,他们可能具有自动存储类别,因此能够在每次进入或退出定义他们的函数(程序块)时建立或撤销).第六章问题:给一组数排序,这组数该如何存放呢???这些数据如何存放才便于排序82945637617188888888881111111111111118888888888这便是本章所要解决的问题之一本章要点•掌握一维、二维数组的定义和引用方法、存储结构和初始化方法。•掌握有关一维数组的有关算法•掌握数组的运算。主要内容6.1为什么要用数组6.2定义和引用一维数组6.3二维数组的定义和引用6.4字符数组6.5提高部分6.1为什么要用数组C语言为这些数据,提供了一种构造数据类型--数组。•一个班学生的学习成绩•一行文字•一个矩阵这些数据的特点是:1、具有相同的数据类型2、使用过程中需要保留原始数据1.用案例说明为什么使用数组【例1】设计一个程序,将n个人某门课程的成绩输入计算机,求平均成绩和高于平均成绩的人数。•如果不使用数组,以5个人的成绩为例,使用a1、a2、a3、a4、a5来存放5个成绩,程序代码如下:程序代码:#includestdio.hvoidmain(){intn=0;//高于平均成绩的人数floats,ave,a1,a2,a3,a4,a5;//5个人的成绩scanf(%f%f%f%f%f,&a1,&a2,&a3,&a4,&a5);s=a1+a2+a3+a4+a5;ave=s/5;if(a1ave)n++;//5个if语句if(a2ave)n++;if(a3ave)n++;if(a4ave)n++;if(a5ave)n++;printf(%f%d\n,ave,n);}如果要统计100个人的成绩呢?#includestdio.hvoidmain(){intn=0,i;floats=0,ave,a[100];//定义一个含有100个元素的数组for(i=0;i100;i++)//通过循环依次给每个元素赋值{scanf(%f,&a[i]);s=s+a[i];}ave=s/100;for(i=0;i100;i++)//通过循环依次将每个元素的值与平均值做比较if(a[i]ave)n++;printf(平均成绩为:%.1f\n高于平均成绩的人数为:%d\n,ave,n);}使用数组来存储100个人的数据,用循环结构实现!程序代码如下:6.1为什么要用数组1.所谓数组就是一组具有相同数据类型的数据的有序集合,占用内存连续的存储单元。表现在:•这些存储单元具有相同的名字和数据结构;•要引用数组的某个特定的存储单元(元素)需要说明数组名和该特定元素在数组中的序号。数组的特点是有序:数据有序号存储也按顺序存放2.数组与数组元素的概念•数组名:是用一个名字表示的一组相同类型的数据的集合,这个名字就称为数组名。如定义:floata[100];a是数组名。•下标变量(或数组元素):数组中的数据分别存储在用下标区分的变量中,这些变量称为下标变量或数组元素。如:a[0]、a[1]…a[i]。•每个下标变量相当于一个简单变量,数组的类型也就是该数组的下标变量的数据类型。•数组属于构造类型。构造类型的数据是由基本类型数据按一定规则构成的。6.2定义和引用一维数组一.一维数组的定义:只有一个下标的数组称为一维数组.使用数组之前必须先进行定义。格式:类型说明符数组名[常量表达式];①类型说明符标明数组的类型,可以是任一种数据类型②数组名是用户定义的数组标识符,与变量名的起法相同③方括号中的常量或常量表达式指定数组元素的个数,也称为数组的长度。常量表达式只能是符号常量或直接常量,不能是变量。例1:inta[10];表示定义了一个一维数组,数组名为a,数组有10个元素:a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]数组中每一个元素的数据类型均为int型。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]-4560721543-89062-31数组名:a。数组名的起法与变量名相同。数组a中的元素的序号•左图是一数组名为a的整型数组的存储情况。•该数组包含10个元素。数组元素的编号从0开始,因此用a[0]引用数组的第1个元素,用a[1]引用数组的第2个元素,…,一般的,用a[i-1]引用数组a的第i个元素。元素占用内存连续的存储空间。低地址高地址以下数组定义是正确的:#defineN10……floatscore1[N],score2[N];intnum[10+N];charc[26];以下数组定义是不正确的:intarray(10);//错误原因:[]intn;floatscore[n];//错误原因:不能用变量说明数组大小floata[0];//数组大小为0没有意义charstr[];//错误原因:[]中不能为空•注意:•“数组的第7个元素”和“下标为7的数组元素”之间的差别。•包含数组下标的方括号实际上被认为是一个运算符,与圆括号均为1级运算符。•说明:1)数组名不能与程序中的其它变量同名;如;intb[5],b;2)数组的第一个元素的下标为0;3)数组的存储特点:1)数组占用内存连续的存储空间2)数组名表示数组的首地址(地址常量),即a的值为&a[0]a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]二.一维数组的引用:在C语言中,对于数值型数组,只能逐个地使用数组元素,而不能一次引用整个数组。下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例1:单独使用一个数组元素:inta[10];/*数组定义时不能用如a[i]的形式*/a[0]=6;a[1]=a[0]+2;printf(“%d”,a[0]);例2:使用循环语句逐个给元素赋值(赋值语句):for(i=0;i10;i++)a[i]=i*i;//引用数组元素时,数组元素的下标可以是变量例3:使用循环语句逐个给元素赋值(scanf):for(i=0;i10;i++)scanf(%f,&a[i]);例4:使用循环语句逐个输出元素的值(printf)for(i=0;i10;i++)printf(“%d”,a[i]);错误例1:inta[10],i;scanf(%d,&a[10]);/*下标越界*/错误例2:inta[10];a[10]={1,2,3,4,5,6,7,8,9,10};C编译系统不做越界检查。注意:定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“数组名[下标]”是不同的。例如inta[10];//这里的10表示元素个数为10个。t=a[6];//这里的6表示数组中第7个元素。例6.1引用数组元素#includestdio.hvoidmain(){inti,a[10];//定义变量和数组for(i=0;i=9;i++)a[i]=i;//通过循环依次给每个变量赋值*for(i=9;i=0;i--)printf(“%3d”,a[i]);//逆序依次输出每个变量的值}*******由于数组元素的下标可以使用变量,甚至是更一般的表达式,这就为我们提供了一种十分灵活的程序设计手段,我们可以着手解决一些更复杂的问题了。这也是数组被广泛使用的原因之一。从本章开始,学习重点为算法*******一维数组应用举例【例:】设计一个程序,将n个人某门课程的成绩输入计算机后输出最高分和最低分。思路:1.首先将n个人的成绩输入到一个一维数组中。2.求若干个数的最大值或最小值常采用打擂台的方法:首先指定某数为最大值或最小值的擂主:如:max=a[0],min=a[0];再将其他各数依次与擂主进行比较(循环嵌套着分支),3.当所有的数都比较完之后,输出max和min的值。程序如下:#includestdio.h#defineN5voidmain(){inta[N],max,min,i;//定义for(i=0;iN;i++)//赋值scanf(%d,&a[i]);min=max=a[0];//设擂主for(i=1;iN;i++)//打擂if(a[i]min)min=a[i];/*min存放最小值*/elseif(a[i]max)max=a[i];/*max存放最大值*/printf(“最高分:%d最低分:%d\n”,max,min);//输出}程序运行情况如下:7898658245最高分:98最低分:45【例:】将5个数存放到一维数组中,再将这5个数按逆序存放在同一数组中并输出。交换n/2次a[0]a[1]a[2]a[3]a[4]1357997531交换前交换后a[i]与a[n-1-i]交换程序如下:#defineN5#includestdio.hvoidmain(){inti,t,a[N];for(i=0;iN;i++)scanf(%d,&a[i]);for(i=0;iN/2;i++){t=a[i];a[i]=a[N-1-i];a[N-1-i]=t;}for(i=0;iN;i++)//输出数据printf(%d,a[i]);}程序运行情况如下:1113151719逆序存放后的结果是:1917151311课上练习•从键盘输入46个学生的数分成绩(定义整型数组inta[46];)1.求他们的平均分(保留2位小数)、最高分、最低分;(定义变量intmax,min;floataver;)1.求90-100的人数、80-89的人数、70-79的人数和60-69的人数(定义变量intn1,n2,n3,n4;)。输出哪个分数段的人数最多。2.求不及格的人数占总人数的百分比(定义变量intn5),如输出“5%的学生不及格”。三.数组的初始化在对数组进行定义时,就给数组中各个元素一个值的方法叫做“数组初始化赋值”。格式:数据类型数组名[常量]={值1,值2,......,值n-1};在{}中的各数据值即为各元素的初值。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};相当于:inta[10];a[0]=0;a[1]=1,...,a[9]=9;也可以省略为:inta[]={0,1,2,3,4,5,6,7,8,9};对数组的初始赋值还有以下几点规定:(1)可以只给部分元素赋初值。当{}中值的个数少于元素个数时,只给最前面部分元素赋给定值,其余元素赋给0。例如:intb[10]={0,2,3,4,5};表示:b[0]=0;b[1]=2;b[2]=3;b[3]=4;b[4]=5;b[5],b[6],b[7],b[8],b[9]的值为0(2)对于数值型数组只能给元素逐个赋值,不能给数组整体赋值。例如:inta[10]={1,1,1,1,1,1,1,1,1,1};不能写为:inta[10]=1;/*错错错*/main(){inti;longf[41]={0,1,1};clrscr();for(i=3;i=40;i++)f[i]=f[i-2]+f[i-1];for(i=1;i=40;i++){printf(%12ld,f[i]);if(i%5==0)printf(\n);}}四.一维数组程序举例P.142例6.2用数组来处理Fibonacci数列的前40项main(){inti;longf[40]={1,1};clrscr();for(i=2;i=39;i++)f[i]=f[i-2]+f[i-1];for(i=0;i=39;i++){printf(%12ld,f[i]);if(i%5==0)printf(\n);}}筛法求素数1234567891011121