第4章_数组ppt课件.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《第4章_数组ppt课件.ppt》由会员分享,可在线阅读,更多相关《第4章_数组ppt课件.ppt(72页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第4章_数组书名:高级语言程序设计及应用第第4章章 数组数组书名:高级语言程序设计及应用本章学习重点v了解数组的概念v了解字符串的概念v掌握数组的常规操作,定义、引用、初始化v掌握数组和字符串的联系和区别v掌握使用数组解决简单问题书名:高级语言程序设计及应用4.1 一维数组一维数组v一维数组的定义和引用v4.1.2 一数组元素的赋值v4.1.3 一维数组的应用举例一维数组的应用举例书名:高级语言程序设计及应用一维数组的定义和引用v当数组中每个数组元素的只有一个下标时,称这种数组为一维数组。数组同变量一样,也必须先定义、后使用。在C语言中,定义一维数组的一般形式为:v类型名 数组名常量表达式,;
2、v其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。 方括号中的常量表达式表示数据元素的个数,也称为数组的长度。书名:高级语言程序设计及应用v例如:int a8;v在这里,int是类型说明符,a8就是一维数组说明符。通过以上语句可以得到以下几点:v1定义了一个名为a的一维数组。v2方括号中的10规定了数组a中有8个数组元素,他们分别是a0 ,a1 ,a2 ,a7。v3类型名int说明a数组中的10个数组元素都是整型,在每个数组元素中只能存放整型数据。v4每个元素只有一个下标,数组元素的下标是元素相对于数组起始地址的偏移量,在C语言中数组的第一个元素的下标为0,也
3、称为数组下标的下界;数组的下标也有一个上界,也就是最后一个元素的下标,在本例中a数组的最后一个元素的下标为7。 书名:高级语言程序设计及应用v5C语言的编译系统将为a数组在内存中开辟一段连续的存储单元,如图4.1所示。在图中标明了每个存储单元的名字,可以用该名字直接引用每个存储单元。a数组在内存中一共分配了8个int型的存储单元,而每个int型数据占用2个字节,所以,a数组一共占用了16个字节的连续存储单元。v6数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元,如图所示。a0a1a2a3a4a5a6a7书名:高级语言程序设计及应用
4、数组类型说明注意数组类型说明注意(1)v1数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。例如上例中10个数组元素都是int型的。v2数组名的命名规则应符合标识符的命名规定。v3数组名不能与其它变量名相同。v例如:vint a;vfloat a10;v这是错误的,定义了整型变量a,就不能又定义一个相同名称的数组变量a10。书名:高级语言程序设计及应用数组类型说明注意数组类型说明注意(2)v4在方括号中可以用符号常数或常量表达式来表示数组元素的个数, 但是不能用变量来表示元素的个数。 v5允许在同一个类型说明中,说明多个数组和多个变量,中间用逗号隔开。v例
5、如: int a,b,c,x5,y8;v以上语句定义了3个整型变量a,b,c和2个整型数组x,y,其中x数组包含5个元素,数组上标为4;y数组包含8个元素,数组上标为7。v6数组名后是方括号( ,不能用圆括号)。v7方括号中常量表达式表示数组中元素的个数,即数组的长度,例如a20表示数组a共有20个元素:a0,a1,a2,a18,a19。请注意,元素编号总是从0开始,直到n-l为止,因此,不能使用a20。 书名:高级语言程序设计及应用一维数组的引用一维数组的引用v引用数组中的任意一个元素的形式:v数组名下标表达式v例如,若有以下定义语句:v double a8;v则a0,ai,ai+k都是对数
6、组a中的元素的合法引用形式;其中0,i和i+k称为下标表表达式,由于定义了a数组有8个元素,因此下标表表达式的值必须大于等于0,并且小于8。注意:在数组元素ai+k中,i+k只是一个下标表表达式,不能认为是i和k两个下标。书名:高级语言程序设计及应用数组的引用注意数组的引用注意 v1“下标表达式”可以是任何非负整型数据,如果为小数时,C编译将自动取整。取值范围是0到n-1(n是元素个数)。v在运行C语言程序过程中,系统并不自动检验数组元素的下标是否越界,允许数组下标越界。如果下标表表达式的值越界可能破坏了其他存储单元中的数据,甚至破坏了程序代码。因此在编写程序时,保证数组下标不越界是十分重要的
7、。v2一个数组元素,实质上就是一个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。v3在C语言中,数组作为一个整体,不能参加数据运算,只能对单个的元素进行处理。例如上面定义的数组a,不能用a代表a0到a7这8个元素。 书名:高级语言程序设计及应用4.1.2 一数组元素的赋值一数组元素的赋值 v当系统为所定义的数组在内存中开辟一段连续的存储单元时,这些存储单元中并没有确定的值;可以采用以下形式对一维数组进行初始化赋值:v类型名 数组名常量表达式初值表v例如:vint a8=5,4,8,9,2,6,7,1;v所赋的初值放在赋值号的后面的一对花括号中,数值型必须与所说明的类
8、型一致,所赋初值之间用逗号隔开,系统将按先后顺序依次将给定的值赋给a0,a1,a7这8个元素。所以a0的值为5,a1的值为4,a2的值为8,a7的值为1。书名:高级语言程序设计及应用数组的初始化注意数组的初始化注意 v1“初值表”中的初值个数,可以少于元素个数,即允许只给部分元素赋初值,后面的元素将自动补初值0。v2如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动确定)。如果被定义数组的长度,与初值个数不同,则数组长度不能省略。v3只能给元素逐个赋值,不能给数组整体赋值。 v4如不给可初始化的数组赋初值,则全部元素均为0值。v5为数组中若干元素赋相同初值时,要注意不
9、能随意简化。 v6允许以赋值方式为数组各元素赋初值。 书名:高级语言程序设计及应用4.1.3 一维数组的应用举例一维数组的应用举例v例例4-2 编一个程序,程序的功能是把数组中的内容逆置。在操作时只能借助一个临时存储单元,不允许另外开辟数组。如:数组中原有的内容为:abcdefg,则内容逆置后,数组中的内容为:gfedcba,同时输出到屏幕。v数组a中的原始数据如图4.2所示。v内容逆置后数组a中的数据如图4.3所示。aa0ba1ca2da3ea4fa5ga6ga0fa1ea2da3ca4ba5aa6书名:高级语言程序设计及应用v程序代码如下:v#define M 7vmain()v vcha
10、r aM=a ,b ,c ,d ,e ,f ,g; /*对数组进行初始化赋值*/v int i,n=M-1;vchar t;vprintf(数组中原有的内容:);v for (i=0;iM;i+) printf(“%c”,ai); /*屏幕输出原有内容*/vprintf(n);v for (i=0;in;i+,n-) vt=ai;ai=an;an=t; /*将i位置和n位置的内容进行交换*/vprintf(数组中逆置后内容:);vfor (i=0;iM;i+) printf(“%c”,ai); /*屏幕输出逆置后的内容*/vv程序的运行结果如下:v数组中原有的内容:abcdefgv数组中逆置后
11、内容:gfedcbav程序说明:程序说明:v(1)将第1个元素和最后一个元素进行交换,即将a0和a6中的值互换;在将第2个元素和倒数第2个元素交换,即将a1和a5中的值互换;同理,将a2和a4中的值互换,只剩下a3一个元素,不需要进行互换操作。v(2)程序中用for()循环来控制。用变量i作为前面元素的下标,用n作为后面元素的下标。开始i=0,n=6,将第i个元素和第n个元素进行交换;接着,将i的值加1,将n的值减1,再进行交换;依次交换下去,当i=n时结束交换。书名:高级语言程序设计及应用v例例4-3 用冒泡法对数组中的10个数进行排序(由小到大)。v冒泡法是排序的一种方法,它将两个相邻数进
12、行比较,把小的数调到前面。其排序过程如图4.4所示。原始数据 第一次交换后 第二次交换后 第三次交换后a5 6 2 2 2a4 7 6 3 3a3 3 7 6 5a2 8 3 7 6a1 2 8 5 7a0 5 5 8 8书名:高级语言程序设计及应用v程序代码如下:vmain()v vint a10=20,12,78,50,40,60,70,55,80,9; /*定义数组a有10个元素,使用09*/vint i,j ,k;printf(The old numbers are:n);for(i=0;i=9;i+) /*屏幕输出排序前的数据*/v printf(%5d,ai);vfor(j=0;j
13、=8;j+) /*比较的趟数*/v for(i=0;iai+1)k=ai;ai=ai+1;ai+1=k;vprintf(nThe sorted numbers are:n);vfor(i=0;ia1,则交换;然后比较第二个数与第三个数;依次类推,直至第9个数和第10个数比较为止,结果最大的数被安置在最后一个元素位置上,完成第一趟冒泡排序。v(2)对前9个数进行第二趟冒泡排序,结果使次大的数被安置在第9个元素位置。v(3)重复上述过程,共经过9趟冒泡排序后,排序结束。v以上冒泡排序可以进行优化,如果在某一趟比较中没有发生了数据交换,则说明排序已经完成了,就不需要继续进行下一趟排序。引入一个标志变
14、量flag,其初值为1,如果在某一趟比较中发生了数据交换,则flag赋值为0,否则为1。在某一趟比较结束后,flag始终为1,说明数组已排好序,可结束排序。书名:高级语言程序设计及应用v例例4-4 请编一个函数fun(int *a,int n,int *odd,int *even),函数的功能是分别求出数组中所有奇数之和以及所有偶数之和。形参n给了数组中数据的个数;利用指针odd返回奇数之和,利用指针even返回偶娄这和。v例如:数组中的值依次为:1,9,2,3,11,6;则利用指针odd返回奇数之和24;利用指针even返回偶数之和8。 书名:高级语言程序设计及应用v#define N 20
15、vfun(int *a,int n,int *odd,int *even)vint i; *even=0;*odd=0;vfor(i=0;in;i+)vif(!(ai%2) /*如果是奇数*/v *even+=ai; /*将数组中该奇数加到奇数之和中*/velsev *odd+=ai; /*将数组中该偶数加到偶数之和中*/vvmain()vint aN=1,9,2,3,11,6,i,n=6,odd,even;vprintf(The original data is:n);vfor(i=0;in;i+) printf(%4d,*(a+i); /*输出数组中原有的数据*/vprintf(n);vf
16、un(a,n,&odd,&even); /*调用函数fun,求出奇数之和odd、偶数之和even */vprintf(The sum of odd numbers:%dn,odd);vprintf(The sum of even number:%dn,even);vv程序的输出结果是:vThe original data is:v1 923116vThe sum of odd numbers: 24vThe sum of even number: 6v程序说明:程序说明:v该题的算法是:用for()循环一步一步地找元素,用if(!ai%2)来判断是否是奇数,%运算是求余运算,当对2求余为1时表
17、示原数为奇数,否则为偶数。从而可以对奇数和偶数分别求和。书名:高级语言程序设计及应用例例4-5 请编写函数fun,对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按降序排列。例如,原来的字符串为CEAedca,排序后输出为CedcEAa。书名:高级语言程序设计及应用v程序代码如下:vfun(char *s,int num)vint i,j,t;vfor(i=1;inum-2;i+) /*除去首尾字符,所以从1开始,到num-2即可*/v for(j=i+1;jnum-1;j+) /*在第i个字符后找出最小的字符与第i个字符进行换位*/v if(sisj)v t=si;si=sj;sj=
18、t;vvmain()vint i;vchar s10=C,E,A,e,d,c,a;vprintf(The original data is:);vfor(i=0;i10;i+)v printf(%c,si);vfun(s,7);vprintf(nThe sorted data is:);v for(i=0;i10;i+)v printf(%c,si);vv程序运行结果如下:vThe original data is: CEAedcavThe sorted data is: CedcEAav程序说明:程序说明:v(1)该例采用的排序法是选择法进行降序排序,算法是用外for()循环从字符串的前端往
19、后端访问,每访问一个字符都用内嵌的for()循环在该字符后找出最小的字符与该字符进行换位。直到外for()循环走到最后一个字符。v(2)注意把首尾字符除开,即在最外层for()循环中从1开始,只到num-2即可。书名:高级语言程序设计及应用v例例4-6 编写函数void fun(int x,int pp,int *n),它的功能是:求出能整除x且不是偶数的各整数,并放在pp所指的数组中,这些除数的个数通过形参n返回。v例如,若x中的值为30,则有4个数符合要求,它们是1,3,5,15。书名:高级语言程序设计及应用v程序代码如下:vvoid fun(int x, int pp, int *n)v
20、int i,j=0;vfor( i=1;i=x; i=i+2) /*从1开始每次步长为2*/v if( x%i=0) /*如果能够整除x,则将该数保存到数组pp中*/v ppj+=i; /*同时将j的值加1,保存满足条件的数的个数*/v*n=j; vvmain()vint x, aa1000, n, i;vprintf(please enter an integer number:); vscanf(%d,&x); /*输入被除数*/vfun(x,aa,&n); /*调用fun函数,获得满足条件的奇数*/v printf(The odd numbers:);vfor(i=0;in;i+) /*
21、根据满足条件的奇数的次数进行循环,输出这些奇数*/v printf(%4d, aai);vprintf(n);vv程序运行结果如下:v30v1 3 5 15v程序说明:程序说明:v由于要求的数不能是偶数故编程时从1开始循环而步长为2这样正好保正i永远是奇数。而i能整除x的条件是x除以i的余数为0,使用if( x%i=0)可以判断i能否整除x。书名:高级语言程序设计及应用4.2二维数组二维数组v4.2.1 二维数组的定义和引用v4.2.2 二维数组的赋值v4.2.3 二维数组的应用举例二维数组的应用举例书名:高级语言程序设计及应用4.2.1 二维数组的定义和引用二维数组的定义和引用v二维数组类型
22、说明二维数组类型定义的一般形式是:v 类型说明符 数组名常量表达式常量表达式;v其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。v例如:vfloat a34,b46;v定义数组a为3行4列,b为4行6列。注意不能写成:a3,4或b4,6。a数组的下标变量共有34个,即:v第0列 第1列 第2列 第3列va00 a01 a02 a03 第0行va10 a11 a12 a13 第1行va20 a21 a22 a23 第2行书名:高级语言程序设计及应用二维数组的引用二维数组的引用v引用二维数组元素时必须带有2个下标。引用形式如下:v 数组名下标表达式1 下标表达式2v例如,有
23、定义如下:v int a34;v则a00,aij,ai+1j+k都是合法的引用形式,必须要求每个下标是整数,且不能好过上下界。如a30,a24,a34都是不合法的引用形式,因为下标都超出了上下界,数组a的上下界分别是02和03。v同时,注意不要把2个下标放到一个方括号内,如a0,0,ai,j,ai+1,j+k都是不合法的引用形式。书名:高级语言程序设计及应用4.2.2 二维数组的赋值二维数组的赋值v二维数组初始化方法主要有以下几种方式:v1分行给二维数组赋初值 v2将所有数据一起写在一个花括号内,省略了行花括号 v3对部分元素赋值,其他元素自动补充0 v4如果对全部元素都赋值,则数组第一维大小
24、可以不指定,但第二维大小必须指定 v5所赋初值行数少于数组的行数 书名:高级语言程序设计及应用v1分行给二维数组赋初值,例如:vint a34l ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,1l ,12;v这种赋值方法非常直观,第一个花括号中数据赋给二维数值的第一行,第二个花括号中数据赋给第二行。v2将所有数据一起写在一个花括号内,省略了行花括号。效果不如第一种好,尤其数据较多时,易于遗漏,也不易检查,例如:vint a341 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12;v3对部分元素赋值,其他元素自动补充0,例如: vint a341,5 ,2 ,3
25、,4 书名:高级语言程序设计及应用v4如果对全部元素都赋值,则数组第一维大小可以不指定,但第二维大小必须指定,例如:vint a 4=1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9,10 v数组a的行数可以通过所赋的初值个数计算得到为3。赋初值后,数组a中元素为:v5所赋初值行数少于数组的行数vint a341,5 ,2,9,6 ;1 5 0 02 9 6 00 0 0 0v赋初值后,数组a中元素为: 1 5 0 02 9 6 0 0 0 0 01 2 3 45 6 7 8 9 10 0 0书名:高级语言程序设计及应用v如果所赋初值中没有行花括号时,第一维大小的确定方法如下,例如定义语句如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 ppt 课件
![提示](https://www.deliwenku.com/images/bang_tan.gif)
限制150内