




已阅读5页,还剩74页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章数组,6.1数组的概念6.2一维数组6.3二维数组6.4字符数组与字符串,6.1数组的概念,数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。,如,全班40个学生成绩都是单精度类型,并且按照学号的顺序排列组合而成一个数组。为了区分不同的数组,每个数组用一个名字来表示,称为数组名。40个学生的成绩可表示为:a0,a1,a39,用它们分别来存放第一个学生的成绩、第二个学生的成绩、第四十个学生的成绩。,数组有两个特点:(1)其长度是确定的,在定义的同时确定了其大小,在程序中不允许随机变动。(2)其元素必须是相同类型,不允许出现混合类型。,6.2一维数组,6.2.1一维数组的定义【例6.1】已知全班40个学生的计算机基础课的考试成绩,求全班的平均成绩。,#includemain()floata41;/*定义一个一维实型数组a*/floatsum=0,aver;inti;for(i=1;i=40;i+)scanf(%f,i+),sum+=a40;aver=sum/40;printf(全班平均成绩:%f,aver);在上例中,“floata41;”是一个一维数组的说明语句,说明数组名为a,它由41个元素组成,每个数组元素为单精度实型。任何一个数组在使用之前必须先定义。,一维数组的定义格式为例如:autointnum40;staticfloatscore40,average40;charch20;,说明:(1):如前面章节的有关规定,可以为auto,static,extern等。(2):说明了数组元素所属的数据类型,可以为int,float,char等。(3):其命名规则和变量名相同,同样遵循标识符命名规则。,图6-1数组元素存储形式,(4):表示数组元素的个数,即数组长度。例如,b20表示b数组有20个元素,最小下标为0,最大下标为19,不能使用b20。常量表达式中只能是常量和符号常量,不允许使用变量。例如:intan;/*定义错误:常量表达式不能是变量n*/是错误的。(5)在说明一个数组后,系统会在内存中分配一片连续的存储空间用于存放数组元素,如说明语句“inta10;”,它在内存中的存放形式如图6-1所示,其下标取值范围是09。,6.2.2一维数组的引用C语言规定只能逐个引用数组元素而不能一次引用整个数组。数组元素的引用形式为数组名下标表达式其中,“下标表达式”可以是整型常量、整型变量或整型表达式,其值均为非负数。例如,在说明语句“inta10;”中,a5表示数组中第6个数组元素;a2*4表示数组中第8个数组元素;ai(0i10)表示数组中第i个数组元素。,【例6.2】求数组中最大值和最小值。程序如下:#includemain()inta10;inti,max,min;printf(请输入10个整数:);for(i=0;i10;i+)scanf(%d,max=min=a0;for(i=1;imax)max=ai;printf(最大数为%d,max);printf(最小数为%d,min);,6.2.3一维数组的初始化在定义数组元素时,系统为其分配了一定的存储空间,所有的存储空间的赋初始值可以在程序运行之前,即在编译阶段进行,也可在运行期间,用赋值语句或输入语句使数组中元素得到初始值。,1在编译阶段赋初值(1)对全部数组元素赋初值。例如:staticinta6=1,2,3,4,5,6;其中,数组元素的个数和花括号中初值的个数是相同的,并且花括号中的初值从左到右依次赋给每个数组元素,即a0=1,a1=2,a2=3,a3=4,a4=5,a5=6。,(2)只给一部分元素赋初值。例如:staticinta10=0,1,2,3,4;此语句定义a数组有10个元素,但花括号中只提供了5个初值,表示只给前5个数组元素a0a4赋初值,后面5个元素a5a9系统自动赋0。,(3)给数组全部元素赋初值时,可以省略数组长度。例如:inta=10,20,30,40,50;省略数组长度时,系统将根据赋初值的个数确定数组长度。上述大括号内共有5个初值,说明数组a的元素个数为5,即数组长度为5。,2在运行阶段赋初值举例如下:inta10;inti;for(i=0;i10;i+)scanf(%d,6.2.4一维数组应用举例【例6.3】用数组的方法求Fibonacci数列。程序如下:#includemain()inti;staticintf20=1,1;for(i=2;i20;i+),fi=fi-2+fi-1;for(i=0;iaj)/*进行交换的条件*/,t=aj-1;aj-1=aj;aj=t;printf(排序结果为:);for(i=0;in;i+)printf(%d,ai);运行结果如下:排序结果为:1345791020,6.3二维数组,引例:全班40个学生,每人有四门功课:高数、计算机、英语、政治的成绩,现求成绩最高的三个学生的成绩。对于这样一个问题,若用一维数组描述,就要用到四个数组。这种表示方法不能很好地反映它们之间的密切关系,因此引入了二维数组来表示。,6.3.1二维数组的定义二维数组的定义格式:例如:inta25;二维数组的说明和一维数组的说明形式基本相同,只不过它的有两个,第一个表示二维数组的行数,第二个表示二维数组的列数。,在C语言中,把二维数组看成一个数组的数组,即可以把二维数组看作是一个特殊的一维数组,该一维数组的每个数据元素也是一个一维数组。二维数组在内存中的存放顺序是按行存放,即先存放第一行的元素,再存放第二行的元素。,6.3.2二维数组的引用二维数组元素的引用的一般形式为数组名下标表达式1下标表达式2引用二维数组元素的下标表达式的值只能取0到定义数组时所规定的下标上界之间的整数。即行下标的取值范围是0下标表达式1-1,列下标的取值范围是0下标表达式2-1。例如:inta35;这个二维数组的最小下标的元素是a00,最大下标的元素是a24。,【例6.5】通过键盘给2*3的二维数组输入数据,第一行赋1、3、5,第二行赋2、4、6,然后按行输出此二维数组。程序如下:,#includemain()inta23,i,j;printf(Enterdatabyline:n);for(i=0;i2;i+)for(j=0;j3;j+)scanf(%d,printf(Outputaarray:n);for(j=0;j2;j+)for(i=0;i3;i+)printf(%4d,aij);printf(n);,6.3.3二维数组的初始化二维数组同样存在初始化的问题。二维数组的初始化有以下四种形式:(1)按行依次对二维数组赋初值。例如:staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;(2)将所有数据写在一个花括号内,按数组排列顺序对各数组元素赋初值。例如:staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;(3)同一维数组一样,可以对部分元素显式赋初值。例如:staticinta34=1,2,3;,它的作用只对各行第一列的元素赋初值,其余元素值自动为0,故相当于:staticinta34=1,0,0,2,0,0,3,0,0;思考题:staticinta34=1,5,6;的含义是什么?(4)若对全部元素显式赋初值,则数组第一维的元素个数在说明时可以不指定,但第二维的元素个数仍然不能缺省。例如:staticinta4=1,2,3,4,5,6,7,8;,6.3.4二维数组应用举例【例6.6】有一个3*4的矩阵,要求编程序以求出其中值最大的那个元素的值以及其所在的行号和列号。程序如下:main()inti,j,row=0,colum=0,max;staticinta34=1,2,3,4,9,8,7,6,-10,10,-5,2;max=a00;for(i=0;i=2;i+)for(j=0;jmax)max=aij;row=i;colum=j;printf(max=%d,row=%d,colum=%dn,max,row,colum);输出结果:max=10,row=2,colum=1,【例6.7】编写程序,打印出以下形式的杨辉三角形。111121133114641151010511615201561,分析:可以将杨辉三角形的值放在一个方形矩阵的下半三角中,如果需打印7行杨辉三角形,应该定义等于或大于77的方形矩阵,只是矩阵的上半部和其余部分并不使用。杨辉三角形的特点如下:(1)第0列和对角线上的元素都为1;(2)除第0列和对角线上的元素以外,其他元素的值均为前一行上的同列元素和前一列元素之和。,定义函数setdata,按上述规律给数组元素置数,定义函数outdata以输出杨辉三角形。程序如下:#includestdio.h#defineN10main()intyNN,n=7;setdata(y,n);outdata(y,n);,setdata(intsN,intn)inti,j;for(i=0;in;i+)sii=1;si0=1;for(i=2;in;i+)for(j=1;ji;j+)sij=si-1j-1+si-1j;outdata(intsN,intn)inti,j;,printf(杨辉三角形:n);for(i=0;in;i+)for(j=0;j=i;j+)printf(n);,【例6.8】有M个学生,学习N门课程,已知所有学生的各科成绩。编程:分别求每个学生的平均成绩和每门课程的平均成绩。设各学生成绩如表6.1所示。,表6.1学生成绩表,程序如下:/*功能:计算个人平均成绩与各科平均成绩,并在屏幕上显示出来。*/#defineN5/*定义符号常量人数为5*/#defineM4/*定义符号常量课程为4*/#includestdio.hmain()inti,j;,staticfloatscoreN+1M+1=78,85,83,65,88,91,89,93,72,65,54,75,86,88,75,60,69,60,50,72;for(i=0;iN;i+)for(j=0;jM;j+)scoreiM+=scoreij;/*求第i个人的总成绩*/scoreNj+=scoreij;/*求第j门课的总成绩*/,scoreiM/=M;/*求第i个人的平均成绩*/for(j=0;jM;j+)scoreNj/=N;/*求第j门课的平均成绩*/clrscr();/*输出表头*/printf(学生编号课程1课程2课程3课程4个人平均n);/*输出一条短划线*/,for(j=0;j8*(M+2);j+)printf(-);/*输出每个学生的各科成绩和平均成绩*/for(i=0;iN;i+)printf(学生%dt,i+1);for(j=0;jM+1,j+)print(%6.1ft,scoreij;printf(n);/*输出一条短划线*/,for(j=0;j8*(M+2);j+)printf(-);printf(n课程平均);/*输出每门课程的平均成绩*/for(j=0;j=0;j-)printf(%c,cj);程序运行结果如下:abefhjjhfeba,6.4.2字符数组的整体操作1字符串和字符结束符字符串是一组字符数据,在C语言中没有提供字符串数据类型,因而需通过字符数组来处理字符串。经常有一种情况,如当定义一个字符数组为40时,而实际存入的有效字符只有20个。为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符0代表。,有了结束标志0,字符数组的长度就显得不那么重要了。在程序中往往依靠检测0来确定字符串是否结束,而不是根据数组长度来确定字符串是否结束。0代表ASCII码为0的字符,它不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作字符串结束标志不会产生附加的操作或增加无效字符,只起一个供辨别的标志。字符串的说明形式与字符数组是一样的,考虑到字符串有一个串结束符,因此为了存放一个有N个字符的字符串,字符数组的元素个数至少应说明为N+1。,2字符串的初始化形式(1)在赋初值时直接赋字符串常量。例如:charstr10=string;习惯上省略花括号,简写成:charstr10=string!;在这里,由于string是字符串常量,系统自动在最后加入0,所以不必人为加入。还可以用以下形式进行定义:charstr=string;系统将按字符串中实际的字符个数来定义数组的大小。,(2)在执行过程中给一维字符数组赋值。例如:chars20;scanf(%s,s);printf(%s,s);其中,scanf()函数中的输入项s是数组名。从键盘输入的字符串应短于已定义的字符数组的长度。,【例6.10】将二维字符数组初始化,并在屏幕上输出。程序如下:/*功能:将二维字符数组进行初始化,并在屏幕上输出*/main()inti;charname59=zhao,qian,sun,li,wang;for(i=0;i字符串2,函数值是正整数,为两个字符中第一个不同字符的ASCII码的差值。在字符串比较时,字符结束符0也参加比较,下同。(3)若字符串1字符串2,函数值是负整数,为两字符串中第一个不同字符的ASCII码的差值。例如:printf(%d,strcmp(Book,Boat);的输出结果为14。,5gets(字符数组)gets()函数用于从键盘输入一个字符串到字符数组中,并得到一个返回值,该函数值是字符数组的首地址。此函数与用scanf()的%s的格式化输入稍有差别,接收的字符串可以包含空格。6puts(字符数组)puts函数用于将一个字符串输出到终端上,它的功能与printf()函数的%s的功能基本相同。由于printf()可以同时输出多个字符串,所以该函数使用不多。,6.4.4程序举例【例6.11】从键盘
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 系统架构设计师考试的知识延展考题试题及答案
- 卫生管理政策变动对考试的影响题
- 医院排名面试题及答案
- 药剂临床事件报告系统题及答案
- 职业健康护理知识试题及答案
- 激光技术提升产品附加值的研究试题及答案
- 海南物流考试题及答案
- 围棋级数测试题及答案
- 网络规划设计师考试实施方案解读试题及答案
- 组件销售面试题及答案
- 离职体检免责协议书
- 光电工程师需掌握的常用计算试题及答案
- 3D打印在康复辅具中的应用-全面剖析
- 县级安全生产大讲堂课件
- 北京市门头沟区2025届高三一模考试生物试题(原卷版+解析版)
- 安徽省合肥市2024-2025学年高三下学期第二次教学质量检测生物学试卷(含答案)
- 2025年中国诗词大会知识竞赛模拟题库及答案(215题)
- 物业部团队建设与管理
- 焊接知识培训课件模板
- 棱柱棱锥棱台的表面积与体积课件-高一下学期数学人教A版
- 广东省深圳市宝安区2023-2024学年七年级下学期数学期中试卷(含答案)
评论
0/150
提交评论