您好,欢迎访问三七文档
单片机接口技术(C51版)第三章数组内容概述数组是一种构造类型的数据,通常用来处理具有相同属性的一批数据。本章主要介绍一维数组、二维数组、多维数组以及字符数组的定义、初始化、引用及应用。教学目标1.理解数组的概念,能定义、初始化一维数组,利用一维数组进行简单的程序设计。2.能定义、初始化二维数组,利用二维数组进行相关的程序设计。在此基础上理解三维数组以及多维数组的定义与使用方法。3.理解字符数组的概念,能定义、初始化字符数组,能利用一维数组进行字符串的处理。C51语言还提供了构造类型的数据,它们有:数组类型、结构体类型、共用体类型。构造类型数据是由基本类型数据按一定规则组成的,因此有的书称它们为“导出类型”。3.1一维数组3.1.1一维数组的定义一维数组的定义方式为:类型说明符数组名[常量表达式];例如:inta[10];它表示数组名为a,此数组有10个元素。说明:1)数组名的定名规则和变量名相同,遵循标识符定名规则;2)数组名后是用方括弧括起来的常量表达式,不能用圆括弧,下面用法不对:inta(10);3)常量表达式表示元素的个数,即数组长度。例如,在a[10]中,10表示a数组有10个元素,下标从0开始,这10个元素是,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]。注意不能使用数组元素a[10];(4)常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C51不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的:intn;scanf(%d,&n);inta[n];3.1.2一维数组元素的引用数组必须先定义,后使用。C51语言规定只能逐个引用数组元素而不能一次引用整个数组。数组元素的表示形式为:数组名[下标]下标可以是整型常量或整型表达式。例如:a[0]=a[5]+a[7]-a[2*3]例3-1-1数组元素的引用#includestdio.h#includerreg51.hvoidmain(void){inti,a[10];#ifndefMONITOR51/*需要串口输出时请作如下设置*/SCON=0x50;/*方式1,允许接收*/TMOD|=0x20;/*TMOD:定时器1方式2*/TH1=221;/*1200bps@16MHz*/TR1=1;/*启动定时器1*/TI=1;/*KeilC自带的puchar()函数需要设置TI=1*/#endiffor(i=0;i=9;i++)a[i]=i;for(i=9;i=0;i--)printf(%d,a[i]);}3.1.3一维数组的初始化对数组元素的初始化可以用以下方法实现:1)在定义数组时对数组元素赋以初值。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};2)可以只给一部分元素赋值。例如:inta[10]={0,1,2,3,4};定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。3)如果想使一个数组中全部元素值为0,可以写成inta[10]={0,0,0,0,0,0,0,0,0,0};不能写成inta[10]={0*10};4)在对全部数组元素赋初值时,可以不指定数组长度。例如:inta[5]={1,2,3,4,5};可以写成inta[]={1,2,3,4,5}3.1.4一维数组应用举例例3-1-2已知某课程的平时、实习、测验和期末成绩,求该课程的总评成绩。其中平时、实习、测验和期末分别占10%、20%、20%、50%。#includereg51.h#includestdio.hvoidmain(void){inti=1,j;charcon_key='\x20';//‘\x20’空格键的ASCII码floatscore[5],ratio[4]={0.1,0.2,0.2,0.5};/*定义成绩、比例系数数组*/#ifndefMONITOR51/*需要从串口1输出时请作如下设置*/SCON=0x50;/*方式1,允许接收*/TMOD|=0x20;/*TMOD:定时器1方式2*/TH1=221;/*1200bps@16MHz*/TR1=1;/*启动定时器1*/TI=1;/*KeilC自带的puchar()函数需要设置TI=1*/#endifwhile(con_key=='\x20'){printf(输入第%2d个学生的成绩\n,i++);printf(平时实习测验期末成绩\n);score[4]=0;/*score[4]:存储总评成绩*/\for(j=0;j4;j++){scanf(%f,&score[j]);score[4]+=score[j]*ratio[j];}printf(总评成绩为:%6.1f\n,score[4]);getchar();}}3.2二维数组3.2.1二维数组的定义二维数组定义的一般形式为类型说明符数组名[常量表达式][常量表达式]例如:floata[3][4],b[5][10];不能写成floata[3,4],b[5,10];3.2.2二维数组元素的引用引用二2维数组元素的形式为:数组名[行下标表达式][列下标表达式]1“行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量。2“行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。假设有数组x[3][4],则可用的行下标范围为0~2,列下标范围为0~3。3对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的二维数组元素。3.2.3二维数组的初始化1按行赋初值数据类型数组名[行常量表达式][列常量表达式]={{第0行初值表},{第1行初值表},……,{最后1行初值表}};赋值规则:将”第0行初值表”中的数据,依次赋给第0行中各元素;将“第1行初值表”中的数据,依次赋给第1行各元素;以此类推。2按二维数组在内存中的排列顺序给各元素赋初值数据类型数组名[行常量表达式][列常量表达式]={初值表};赋值规则:按二维数组在内存中的排列顺序,将初值表中的数据,依次赋给各元素。如果对全部元素都赋初值,则“行数”可以省略。注意:只能省略“行数”。3.2.4二维数组应用举例例3-2-1有M个学生,学习N门课程,已知所有学生的各科成绩,编程:分别求每个学生的平均成绩和每门课程的平均成绩。#defineNUM_std5/*定义符号常量人数为5*/#defineNUM_course4/*定义符号常量课程为4*/#includestdio.hmain(){inti,j;staticxdatafloatscore[NUM_std+1][NUM_course+1]={{78,85,83,65},{88,91,89,93},{72,65,54,75},{86,88,75,60},{69,60,50,72}};for(i=0;iNUM_std;i++){for(j=0;jNUM_course;j++){score[i][NUM_course]+=score[i][j];/*求第i个人的总成绩*/score[NUM_std][j]+=score[i][j];/*求第j门课的总成绩*/}score[i][NUM_course]/=NUM_course;/*求第i个人的平均成绩*/}for(j=0;jNUM_course;j++)score[NUM_std][j]/=NUM_std;/*求第j门课的平均成绩*//*输出表头*/printf(学生编号课程1课程2课程3课程4个人平均\n);/*输出每个学生的各科成绩和平均成绩*/for(i=0;iNUM_std;i++){printf(学生%d\t,i+1);for(j=0;jNUM_course+1;j++)printf(%6.1f\t,score[i][j]);printf(\n);}/*输出1条短划线*/for(j=0;j8*(NUM_course+2);j++)printf(-);printf(\n课程平均);/*输出每门课程的平均成绩*/for(j=0;jNUM_course;j++)printf(%6.1f\t,score[NUM_std][j]);printf(\n);}3.3字符数组用来存放字符量的数组称为字符数组。字符数组类型说明的形式与前面介绍的数值数组相同。例如:1.charc[10];2.charc[5][10];//即为二维字符数组。字符数组也允许在类型说明时作初始化赋值。3.staticcharc[]={`c`,``,`p`,`r`,`o`,`g`,`r`,`a`,`m`};//当对全体元素赋初值时也可以省去长度说明例3-3-1定义一个二维数组,在放字符串“BASIC”、“DBASE”,并输出。#includestdio.hvoidmain(void){inti,j;chara[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};for(i=0;i=1;i++){for(j=0;j=4;j++)printf(%c,a[i][j]);printf(\n);}}字符串在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以‘\0’作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符‘\0’存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。C51语言允许用字符串的方式对数组作初始化赋值。例如:staticcharc[]={'c','','p','r','o','g','r','a','m'};可写为:staticcharc[]={Cprogram};或去掉{}写为:sraticcharc[]=Cprogram;用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。voidmain(){staticcharc[]=BASIC\ndBASE;printf(%s\n,c);}注意在本例的printf函数中,使用的格式字符串为“%s”,表示输出的是一个字符串。而在输出表列中给出数组名则可。不能写为:printf(%s,c[]);3.4多维数组多维数组的一般说明格式是:类型数组名[第n维长度][第n-1维长度]......[第1维长度];例如:intm[3][2];/*定义一个整数型的二维数组*/charc[2][2][3];/*定义一个字符型的三维数组*/数组m[3][2]共有3*2=6个元素,顺序为:m[0][0],m[0][1],m[1][0],m[1][1],m[2][0],m[2][1];数组c[2][2][3]共有2*2*3=12个元素,顺序为:c[0][0][0],c[0][0][1],c[0][0][2],c[0][1][0],c[0][1][1],c[0][1][2],c[1][0][0],c[1][0][1],c[1][0][2],c[1][1][0],c[1][1][1],c[1][1][2],数组占用的内存空间(即字节数)的计算式为:字节数=第1维长度*第2维长度*...*第n维长度*该数组数据类型占用的字节数C51中数组进行初始化有下述规则:1)数组的每一行初始化赋值用“{}”并用“,”分开,总的再加一对“{}”括起来,最后以;表示结束。2)多维数组存储是连续的,因此可以用一维数组初始化的办法来初始化多维数组。3)对数组初始化时,如果初值表中的数据个数比数组元素少,则不足的数组元素用0来填补。
本文标题:C51-数组
链接地址:https://www.777doc.com/doc-5274388 .html