c语言程序设计与项目实践第7章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第7章数组本章的学习重点◆一维数组的定义◆一维数组的应用◆二维数组的定义与初始化◆二维数组的应用◆字符数组的定义与赋值◆字符数组的应用7.1一维数组数组必须先定义后使用。一维数组的一般定义形式为:类型说明符数组名[常量表达式];其中,类型说明符指任何一种基本数据类型如int、char、float或double等,也可以是特殊类型或构造类型数组名类似于定义变量时的变量名,是用户自定义标识符。用户标识符的命名应遵循变量名的命名规则。常量表达式用于指定数组元素的个数,也称为数组的长度。这里请注意,常量表达式一定是常量或常量构成的表达式,不能使用变量或变量构成的表达式。例如,定义长度为5的int型数组a,定义方式为:inta[5];7.1.1一维数组的定义1.定义数组注意事项:(1)定义数组应遵循数组定义格式。其中类型说明符与数组名之间应该有一个或多个空格。(2)数组名和左中括号之间不能有空格。(3)常量表达式只能是常量或由常量构成的表达式。例如下面的定义是非法的:inta=3;intb[a+3];(4)常量表达式的值表示数组的长度,即表示数组共有多少元素。一旦数组长度确定,就不能修改。(5)数组名不能和其他变量重名。7.1.1一维数组的定义2.一维数组的含义通常,数组用于表示几个数据类型相同的变量,即数组元素。C语言中,一般使用数组名和下标来引用数组元素,并且下标从0开始顺次增加。例如有下列定义:inta[5];上述语句定义了一个int型数组a,共有5个元素,分别为a[0]、a[1]、a[2]、a[3]和a[4]。这5个元素都是int型,等同于5个int型变量。这里一定注意,数组下标是从0开始,而不是1,因此,最大下标的数组元素是a[4],而不是a[5]。此外,还可以以指针类型引用数组,例如元素a[1]也可以使用*(a+1)来引用,本书将在后续章节作详细介绍。7.1.1一维数组的定义3.数组在内存中的存放方式数组在内存中是连续存放的,占据连续的内存单元。例如,定义数组:chara[4];表示定义了包含4个元素的数组a。它在内存中占4个字节,存储逻辑结构如下图所示。a[0]a[1]a[2]a[3]数组a0x0012ff780x0012ff790x0012ff7a0x0012ff7b内存地址7.1.1一维数组的定义数组类型不同,它所占的内存字节数也不相同,但其各元素的存放是连续的。通常,数组在内存中所占的字节数为:数组内存字节数=数组元素数据类型所占字节数*数组长度例如:shortm[5];intn[3];如图所示为内存结构图:CCCCCCCCCC数组m0x0012ff740x0012ff750x0012ff760x0012ff770x0012ff78内存地址CCCCCCCCCC0x0012ff790x0012ff7a0x0012ff7b0x0012ff7c0x0012ff7dm[0]m[1]m[2]m[3]m[4]CCCCCCCCCC数组n0x0012ff680x0012ff690x0012ff6a0x0012ff6b0x0012ff6c内存地址CCCCCCCCCC0x0012ff6d0x0012ff6e0x0012ff6f0x0012ff700x0012ff71n[0]n[1]CCCC0x0012ff720x0012ff73n[2](a)数组m内存逻辑结构(b)数组n内存逻辑结构元素元素7.1.2一维数组赋值与引用数组一定要先定义后使用,数组在引用时使用数组下标来引用数组,例如定义数组:floatff[N];则可以使用ff[0]、ff[1]、……、ff[N-2]和ff[N-1]索引每个数组元素。1.数组下标越界引用数组下标最大为N-1。C语言并没有对数组作下标越界检查,假如使用ff[N]或ff[N+5]等方式引用数组,C语言将在编译时提示程序运行者这样操作的警告,但并不影响程序编译。范例7.1OutputArrayValueWithoutSet.c数组在使用时经常出现越界使用的情况,这种情况会导致输出错误结果。例如,要存储5个学生成绩时,使用数组来存储,在输入这5个学生成绩之前,通过打印数组元素的值先验证数组中存储的内容。7.1.2一维数组赋值与引用2.数组定义赋初值数组可以在定义时赋初值,例如:inta[5]={10,20,30,40,50};数组定义时赋初值使用大括号将各元素的初始值封装,各初始值之间使用逗号分隔。也可以不给出数组的长度,例如,下面的定义也是正确的:inta[]={10,30,20,15,80};这种方式系统将数组a的长度默认为5。范例7.2InitialValueDefineArray.c数组在定义赋初值时,若只对前面一部分元素赋值,那么没有赋值的元素将被系统自动赋值为0。定义一个有5个元素的数组,验证这一说法。7.1.2一维数组赋值与引用3.数组元素赋值数组也可以先定义后赋值,此时只能对某个元素赋值,不能对整个数组赋值。例如,下面的执行是错误的:inta[5];a={4,5,7,10,21};C语言不支持对整个数组作引用。正确的赋值方式为:inta[5];a[0]=4;a[1]=5;a[2]=7;a[3]=10;a[4]=21;7.1.2一维数组赋值与引用4.数组的输出数组输出只能按元素输出,而不能一次输出数组中所有的元素。例如:inta[3]={12,22,35};printf(“%d”,a);5.数组首地址与数组元素地址数组首地址是指该数组在内存中的起始位置,通常使用数组名表示数组首地址。若定义:inta[10];则数组a的首地址为a。范例7.3SetElementValueOfArray.c设计两个数组,分别使用两种不同的索引方式输入数组的值,然后计算第一个数组元素的和与第二个数组元素的积。7.1.3一维数组的应用数组在定义时不允许使用变量或含有变量的表达式作为常量表达式,但在数组引用时可以使用变量作数组下标。例如:inti=3;//定义数组下标引用变量intaa[5]={0};//定义数组aa并对各元素符初值0aa[i]=44;//使用变量i作下标引用数组aa的元素aa[i+1]=55;//使用表达式引用数组aa的元素范例7.4GetMaxMinvalueInArray.c按倒序输出数组array中所有元素的值。并输出数组中的最大值和最小值。(提示:需要按倒序输出数组中各元素时,可以从最后一个元素开始遍历数组,直到第一个元素)实训7.1——数列排序定义一组无序的整型数列,共10个数值,经过一定的处理,使该数列由大到小排列,并输出到屏幕上。定义int型数组arrayorder并赋初值0,长度为10,以承载该数列。1.需求分析:需求1:定义数组arrayorder,赋初值0。需求2:使用恰当的方法对数组由大到小排序2.技术应用对于需求1,按照定义数组的一般表达形式以及动态输入数组元素值的操作实现。对于需求2,使用选择法,首先遍历数组,求出最大的一个元素值,将其与第一个元素交换;然后,从第二个元素再次遍历数组,求出剩余元素中最大的元素,将其与第二个元素交换,依次执行,直到最后一个元素为止。源代码:PrintArrayWithOrder.c7.2二维数组二维数组的一般表达形式为:类型说明符数组名[常量表达式1][常量表达式2];其中:类型说明符、数组名和常量表达式1及常量表达式2与一维数组的类型说明符、数组名和常量表达式规则相同。1.常量表达式和元素个数常量表达式1表示数组的第一维长度,常量表达式2表示数组的第二维长度。第一维称为行标,第二维称为列标。数组元素的总数为:数组元素个数=行数*列数。例如:inta[2][3];7.2二维数组2.二维数组的逻辑结构二维数组的逻辑结构为矩阵结构,以行和列分别表示二维数组的行和列。例如:intb[3][4];逻辑结构如下表所示:第1列第2列第3列第4列第1行b[0][0]b[0][1]b[0][2]b[0][3]第2行b[1][0]b[1][1]b[1][2]b[1][3]第3行b[2][0]b[2][1]b[2][2]b[2][3]7.2二维数组3.二维数组的内存结构与二维数组的逻辑结构有所不同,二维数组在内存中是线性存储的,即在内存中将各元素连续存储。例如:intaa[2][3];系统将二维数组按顺序将元素存放到内存中,采用按行排列的方式,即先排一行,然后再依次排列第二行,依次类推。如图所示为二维数组aa的内存结构图。aa[0][0]aa[0][1]aa[0][2]aa[1][0]aa[1][1]数组aa0x0012ff680x0012ff6c0x0012ff700x0012ff740x0012ff78内存地址aa[1][2]0x0012ff7c第1行第2行7.2.2二维数组的赋值与引用1.二维数组分段方式赋初值定义二维数组的同时也可以对数组各元素赋初值。例如:inta[2][4]={{12,13,45,10},{30,-15,19,28}}也可以不指定数组的行数,例如:inta[][4]={{12,13,45,10},{30,-15,19,28}};范例7.5TwoDimensionalArrayInitial.c二维数组的定义赋初值可以按行进行全部赋值,也可以对部分赋值。定义一个数组,对一部分元素赋值,打印出全部元素的值,检查没有赋值的元素是否为0。7.2.2二维数组的赋值与引用2.二维数组连续赋初值二维数组也可以按照连续赋值方式对所有元素赋值,数值使用大括号封装,各数值之间使用逗号隔开。例如:intaa[2][4]={20,18,-60,99,85,1115,66,80};也可以只对部分元素赋值,例如:intaa[2][4]={20,18,-60,99};3.二维数组元素赋值若二维数组在定义时没有进行赋值,则只能在引用时分别对每个元素赋值,此时未被赋值的元素为不确定值。例如:intaa[2][3];aa[0][0]=10;aa[1][2]=18;注意,不能试图使用数组名对整个元素赋值,例如:intb[3][4];b[3][4]={{14,15,18},{25,-100,90}};b={{14,15,18},{25,-100,90}};7.2.2二维数组的赋值与引用4.二维数组的引用二维数组定义之后,可以引用数组各元素进行赋值和引用等操作。二维数组的引用可以使用行标和列标实现,且行标和列标都是从0开始。范例7.6CalcSumMatrixArg.c矩阵是代数数学中的典型数据结构。通过数组可以很方便的表达各种不同的矩阵结构。定义一个数组,用于存储矩阵中各元素的值,键盘输入这些矩阵的元素的值,输出该矩阵的对角线元素之和。7.2.3二维数组的应用范例7.7MatrixTransferm.c将4x4矩阵转置。使用4行3列的数组存储待转置的矩阵,使用矩阵转置的性质,将原矩阵的转置矩阵存储于另外一个数组中。实训7.2——学员平均成绩计算一个学习小队共有四个成员,小张、小李、小赵和小王。每人有三门学习成绩:英语、数学和语文,求各人的平均成绩和各科平均总成绩。1.需求分析:需求1:存储各小组成员各科成绩需求2:计算各人平均成绩需求3:计算各科平均总成绩2.技术应用对于需求1,定义二维数组,用于存储各小组组员各科成绩。对于需求2,利用二维数组性质计算各人平均成绩,并定义一维数组存储各人平均成绩。对于需求3,利用二维数组性质计算各科平均总成绩,并定义一维数组存储各人平均成绩。源代码:CalcAverageScore.c实训7.3——输出杨辉三角杨辉三角由多项式(a+b)n打开括号后的各个项的二次项系数构成,实现方法为使n由0递增至n-1,并依次展开多项式(a+b)n,然后将各项系数分行排列,得到的三角形数列就是杨辉三角。1.需求分析:需求1:计算构成杨辉三角的各行数字,并存储需求2:输出杨辉三角,行数为102.技术应用:对于需求1,杨辉三角第一行数字为1,第二行数字为数列11,从第三行开始,每一行中的

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功