C语言程序设计重庆大学课件第章数组及其应用.ppt_第1页
C语言程序设计重庆大学课件第章数组及其应用.ppt_第2页
C语言程序设计重庆大学课件第章数组及其应用.ppt_第3页
C语言程序设计重庆大学课件第章数组及其应用.ppt_第4页
C语言程序设计重庆大学课件第章数组及其应用.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计技术,C语言数据描述和C程序设计初步结构化程序设计基础和C语言的控制结构数组及其应用函数与C程序结构指针与函数指针与数组字符串及其应用结构体类型和联合体类型C语言的文件处理及其应用位运算与枚举类型,数组及其应用,3.1一维数组3.1.1一维数组的定义和初始化3.1.2一维数组元素的引用方法3.2二维数组和多维数组3.2.1二维数组和多维数组的定义3.2.2二维数组和多维数组元素引用方法3.3数组的简单应用3.3.1数组元素值的随机生成3.3.2常用排序方法3.3.3常用查找方法,一维数组,数组是有序数据的集合。一维数组是一组按线性排列有序且个数有限的同类型变量构成的数据集合。每个数组有一个名称-数组名,数组中的每个数据元素有一个编号-下标,下标从0开始,是正整数。一维数组在存储时需要占用连续的内存空间,其每一个数据元素所占用的字节长度与它们的数据类型相关。,3.1.1一维数组的定义和初始化,一维数组的定义存储类型数据类型数组名常量表达式;存储类型:auto、static、extern数据类型:数组元素的数据类型(基本,构造,指针)常量表达式:指定数组的元素个数,也称数组长度。例如:ints30;/*定义了1个整型数组s*/把30个学生的成绩放在一维数组s中,数组中每个元素表示一个学生的某科成绩,如s5表示序号为5的学生成绩73。因序号从0开始,所以没有S30元素。,3.1.1一维数组的定义和初始化,一维数组的初始化数据类型数组名n=常量列表;其中:常量列表:可是逗号分隔的常量或常量表达式。n:数组长度,常量列表个数不能超过数组长度。例如:inta10=1,2,3,4,5,6,7,8,9,10;/*常量*/intb3=1,3*5,4*3-2;/*常量表达式*/intd5=1,2,3,4,5,6;/*超过数组长度*/注意:数组名代表数组存储区的首地址,即第一个数组元素的存储地址。即a等价于/*其余元素为0*/如果数组长度没有指定,以初始化数值个数作为数组的长度,或者说数据的个数是确定的,可以不指定数组的长度。floata1=10,20,30.9,40,50;/*数组长度为5*/将数组全部元素初始化为0值的简写形式例如:inta10=0;inta5=0*10;不能给数组整体赋值例如,inta5=1,1,1,1,1inta5=1;,3.1.2一维数组元素的引用,C语言规定:只能逐个引用数组元素而不能一次引用整个数组。数组元素(下标变量)表示形式:数组名下标下标:整型常量或整型表达式,实型下标自动取整。例:intb10;(定义数组b)b10=100;(下标越界)b=100;(整体操作数组)常将数组和循环配合使用。通过改变数组的下标值来访问数组的各个元素。举例如下:doublea10;for(i=0;i10;i+)scanf(“%lf”,/*将a数组第6个元素(序号5)赋值为300*/,3.1.2一维数组元素的引用,例3-1将一个整型数组中所有元素值在同一个数组中按逆序重新存放并输出。程序一次运行情况如下所示:InputtenvalueofArray:2123252729303234363838363432302927252321,Arr0,Arr9,3.1.2一维数组元素的引用,例3-4打印杨辉三角形的前10行(用一维数组处理)杨辉三角形的数列特点:即一行中某列的数是上一行该列上前两位数之和。比如第4行第2列的3等于第3行第1、2列的数1+2。每行第1列和最后1列都为1,行数=列数。,解题思路:利用数组具有保存数据的特点,将第1列初始化为1,第n行从第n列开始,从后往前计算该行中各列的值,在数组中已经保留了上一行的各列数据,利用此数据,可以计算新行的各列数据,然后输出。,3.1.2一维数组元素的引用,对每一行杨辉三角形值的具体处理方法为:首先用表达式yhrow=1将该行最后一个元素值置1,然后从后向前循环执行表达式:yhcol=yhcol+yhcol-1。即将一维数组yh上一行当前位置元素值与其前面一个位置的元素值相加作为本行当前位置上的元素值。row=1:yh1=1;利用它可将每行的第1列置为1。row=2:yh2=1;row=3:yh3=1;yh2=yh2+yh1=2;row=4:yh4=1;yh3=yh3+yh2=3;yh2=yh2+yh1=3;row=5:yh5=1;yh4=yh4+yh3=4;yh3=yh3+yh2=6;yh2=yh2+yh1=4;,3.1.2一维数组元素的引用,对每一行杨辉三角形值的具体处理方法为:首先用表达式yhrow=1将该行最后一个元素值置1,然后从后向前循环执行表达式:yhcol=yhcol+yhcol-1。即将一维数组yh上一行当前位置元素值与其前面一个位置的元素值相加作为本行当前位置上的元素值。row=1:yh1=1;row=2:yh2=1;row=3:yh3=1;yh2=yh2+yh1=2;row=4:yh4=1;yh3=yh3+yh2=3;yh2=yh2+yh1=3;row=5:yh5=1;yh4=yh4+yh3=4;yh3=yh3+yh2=6;yh2=yh2+yh1=4;,各行的第1列都置为1,各行的最后1列都置为1,倒数第2列开始处理,1yh111yh1yh2121yh1yh2yh31331yh1yh2yh3yh4,数组及其应用,3.1一维数组3.1.1一维数组的定义和初始化3.1.2一维数组元素的引用方法3.2二维数组和多维数组3.2.1二维数组和多维数组的定义3.2.2二维数组和多维数组元素引用方法3.3数组的简单应用3.3.1数组元素值的随机生成3.3.2常用排序方法3.3.3常用查找方法,3.2二维数组和多维数组,在程序设计中如果需要处理诸如矩阵、平面的或立体的图形等数据信息,使用一维数组显然不够,可以使用二维、三维以至更多维的数组。一维数组存储线性关系的数据,二维数组则可以存储平面关系的数据,三维数组可以存储立体信息,依次类推可以合理地使用更高维数的数组。,数组的几个实例,用二维数组做字模手机屏幕采用的字体称为“点阵”字体,如果不支持中文,则最小只需7*7点阵;程序要在屏幕上打出“A”时,则只需遍历该数组,然后在元素值为0的地方,打出空格,在元素值为1的地方,打出小点即可。对于这样一个点阵,对应的一个二维数组为:,数组的几个实例,多个班级的成绩管理如:某年级有4个班,每个班最多不超过40人。则该成绩数据对应于一个二维数组:intcj440;提问:2班24号的成绩是哪个数组元素?答案是:cj123;注意:C语言中的数组下标从0开始,所以2班24号对应数组元素的下标是1和23。,数组的几个实例,多个年级的成绩管理设有:年级总数为6;每个年级的班级数为4;每个班级的学生人数为40。利用三维数组实现多个年级的成绩管理intcj6440;将三年级、2班、20号学生的成绩赋值为78cj2119=78;,二维数组和多维数组的定义一个二维数组可以分解为多个一维数组,可以推论多维数组:n维数组的每个元素由n-1维数组构成。二维数组定义的一般形式为:数据类型数组名常量表达式常量表达式;多维数组定义的一般形式为:数据类型数组名常量表达式常量表达式;例如:inta34,ma1010;/*二维数组*/floatb333;/*三维数组*/a由3行4列共12个元素组成;ma由1010共100个元素组成。b是一个333共27个元素构成的三维数组。,行数,列数,3.2.1二维数组和多维数组的定义,C语言中规定数组按“行”存储,由于计算机系统内存是一个线性排列的存储单元集合,所以当需要存储二维或多维数组到内存时,必须进行二维空间或多维空间向一维空间的投影。例如:inta122,a2222;则数组a1和a2在内存的存放形式如图3.4和3.5所示。,3.2.1二维数组和多维数组的定义,根据多维数组在存储器中按行存储规则和行列顺序,计算多维数组元素在连续内存中的单元序号(以0开头)。设有mn(m行n列)的二维数组a,则二维数组元素aij在连续存储区域的单元序号计算公式为:in+j;(行号列数+列号)例如:inta22;则数组元素a11的序号为:12+1=3即二维空间中1行1列元素是一维空间中的3号元素三维数组部分省略,参看第3章要点。,3.2.1二维数组和多维数组的定义,3.2.1二维数组和多维数组的定义,二维和多维数组的初始化分行赋值初始化方式例如:inta23=1,1,1,2,2,2;inta1020=0;inta4=1,2,3,4,5,6,7,8,9,10,11,12;系统根据12个元素,二维长度为4,自动测算出一维长度3。单行赋值初始化方式例如:inta34=1,2,3,4,5,6,7,8,9,10,11,12;对部分数组元素赋初值例如:inta34=1,0,6,0,0,11;,二维数组元素的下标表示法数组名下标下标;数组元素也称为下标变量,其用法与一般变量相同。例:doublea55,y;a23=300;/*将a的2行3列元素赋值300*/y=500;/*将变量y赋值500*/a55=200;(下标越界)在程序设计中,二维数组不能作为一个整体进行处理,通常用双重for循环来逐个访问二维数组元素:外循环控制行、内循环控制列;外循环控制列,内循环控制行。例如:inta510,i,j;则a数组的输入输出基本形式如图3.8所示,3.2.1二维数组和多维数组的引用,3.2.2二维数组和多维数组元素引用,例3-5在二维数组a34中依次选出各行最大元素值存入一维数组b3对应元素中。程序运行结果:arraya:31687654321110810251227arrayb:8710827,数组及其应用,3.1一维数组3.1.1一维数组的定义和初始化3.1.2一维数组元素的引用方法3.2二维数组和多维数组3.2.1二维数组和多维数组的定义3.2.2二维数组和多维数组元素引用方法3.3数组的简单应用3.3.1数组元素值的随机生成3.3.2常用排序方法3.3.3常用查找方法,3.3.1数组元素值的随机生成,计算机自动生成“随机数”是一种较好的模拟数据法为在程序中产生随机数,需要使用标准库函数srand、rand和time,并将对应头文件包含到程序中。Srand函数是初始化随机数(即种子)发生器,种子可以当前的系统时间产生,函数原型在stdlib.h中声明。voidsrand(unsignedintseed);rand函数是随机产生一个0到RAND_MAX(0 x7fff)之间的正整数,函数原型在stdlib.h中声明。intrand(void);time函数是获取系统时间。函数原型在time.h中声明如下:time_ttime(time_t*timer);,3.3.1数组元素值的随机生成,例3-7随机生成20个3位以内的整数序列存放在一维数组中,然后按每行5个数输出所有数组元素。程序一次运行结果为:659100184135876348934293587338179243523799653234657439776297例3-8编程序实现如图3.10所示的矩阵转置功能,即将NM矩阵转换为MN矩阵;要求被处理的二维数组元素值(2位数以内)随机产生。,冒泡排序从待排数据序列中第一个位置开始,依次比较相邻两个位置上的数据,若是逆序则交换,一趟扫描后,关键字值最大(或最小)的数则交换到了最右边(或最下面);不考虑已排好序的数据,将剩下的数作为待排序列;重复、两步直到排序完成;n个数据的排序最多进行n-1趟比较,在第1趟比较中要进行n-1次两两比较,在第i趟比较中要进行n-i次的两两比较。例3-9编程实现冒泡排序算法,对随机生成的20个整数按升序排序并输出。,3.3.2数组的常用排序方法,将6个数进行冒泡排序第一趟比较中,进行了5次比较:(最大数下沉)5555556622222266669999991010101010333333101次2次3次4次5次结果,3.3.2数组的常用排序方法,余下5个数进行排序第二趟比较中,进行了4次比较:(次大数下沉)52222255556666699993333391次2次3次4次结果,3.3.2数组的常用排序方法,3.3.2数组的常用排序方法,选择排序(交换排序的优化)假设具有n个元素的数组a中用a0存放最小(或最大)的数,将此数与后面所有的数比较并用下标变量k记录最小(或最大)数所在位置。一趟比较完成后,将a0与ak交换。在剩下的N-1个数据(即a1到an-1的元素)中使用相同的方法寻找最大(或最小)的数,并将a1与ak交换;以此类推,直到将整个待排数据集合处理完。,例3-10编程序实现选择排序算法,对随机生成的20个整数按升序进行排序并输出。,将6个数进行选择排序在a0到a5数组元素中找最小数a0a1a2a3a4a55629103,3.3.2数组的常用排序方法,记下小数下标为2,将a0与a2交换在余下a1到a5数组元素中又找最小数a1a2a3a4a5659103将a1与a5交换,小

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论