《C语言课件 第4章 数组》由会员分享,可在线阅读,更多相关《C语言课件 第4章 数组(85页珍藏版)》请在人人文库网上搜索。
1、1,第4章,数字组,c语言编程,2020/7/5,2,第4章,数组,本章摘要:4.1一维数组4.2二维数组4.3字符数组和字符串4.4指针和数组4.5指针指向指针,2020/7/5,3,第4章数组,如何存储一个人在N门课中的分数如何存储和处理一堂课中N门课的分数?这些数据具有相同的数据类型。为了方便地使用这些数据,C语言提供了一种构造数据类型:数组。示例:用于存储学生分数的实数组scoe5,其中:score是数组名称。该数组可以存储五个分数,由下标变量表示:分数0、分数1和分数4。下标变量也称为数组元素。2020/7/5,4,4.1一维数组,例如:int a10浮动计分5;“数据类型”:数组元。
2、素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:指示数组中有多少元素,即数组的长度。它可以是整数常量、整数变量、整数表达式或返回值为整数的函数调用。指示元素的数量。4.1.1一维数组的定义,数据类型数组名整数常量表达式;2020/7/5,5,下列数组定义是正确的:#定义N 10浮点score1N,score2Nint num 10N;充电器c26,以下数组定义不正确:int数组(10);数组名后面应该有一个正方形的扩展名,而不是一个圆括号。浮动记分卡;平方扩展必须是整数常数,而不是整数变量。char字符串;数组名称后的方形扩展名不能为空。4.1.1一维数组的定义(续),2020。
3、/7/5,6,数组在内存中的存储,数组下标从0开始。一维数组的数组元素按顺序存储在内存中。数组名表示数组的第一个地址,即score的值与score0的地址值相同。分数数组,引用2020/7/5,7,4.1.2数组的元素,格式:例如,输入学生分数为(I=0;i5;I)扫描f(%f,例如:fibn=fibn-1 fibn-2;下标表达式的值必须是整数表达式。数组名下标表达式,2020/7/5,8,4.1.2数组元素引用(续),描述:下标从0开始(下限为0),数组的最大下标(上限)为数组长度减1。示例:int a10。Scanf (%d,/*下标越界*/,C编译系统不检查越界,如果引用的数组元素超出。
4、数组范围,它将破坏其他变量的值。2020/7/5,9,4.1.2数组元素的引用(续),是下标运算符。引用数组元素时,根据数组的第一个地址和下标号计算元素的实际地址,并取出地址的内容进行运算。例如,参考score2: (1)计算2000 2*4=2008 (2)取出2008的内容,并在2020年7月5日、10日和4月1.3日初始化数组。初始化:定义数组时给数组元素赋值。1定义数组时,为所有数组元素指定初始值,例如:int a5=0,1,2,3,4;2.省略数组长度,例如:int a=0,1,2,3,4;3定义数组时,给一些数组元素赋值,例如:int a5=1,2,3;其余的元素被赋值为0。4当原。
5、始值的数量大于数组元素的数量时,会出现编译错误,例如:int a5=0,1,2,3,4,5;2020/7/5,11,4.1.4一维数组应用示例(教科书),第124页,2020/7/5,12,4.1.4一维数组应用示例,示例4.1将10个人的结果输入计算机,并以相反的顺序显示。#定义N 10 main()int I;浮动记分卡;对于(I=0;I=0;i - ) printf(%6.1f,score I);操作情况如下:67 74 89 92 34 67 83 95 73 78 78.0 73.0 95.0 83.0 67.0 34.0 92.0 89.0 74.0 67.0,2020/7/5,1。
6、3,例4.2气泡分选(从小到大)。以6个数字为例:3,7,5,6,8和0。第一次排序如下:3 7 5 6 8 0第一次3和7比较,3 7 5 6 8 0第二次7和5比较,3 5 7 6 8 0第三次7和6比较,3 5 6 7 8 0第四次7和8比较,3 5 6 7 8 0第五次8和0比较,3 5 6 7 0 8第一次排序。,2020/7/5/14,按冒泡法排序(续),第二个排序如下:3 5 6 7 0 8第一个3和5个比较,3 5 6 7 0 8第二个5和6个比较,3 5 6 7 0 8第三个6和7个比较,3 5 6 7 0 8第四个7和0个比较,以及第二个排序中的3 5 6 0 7 8个排序。
7、,依此类推:第三次比较3次, 在6 7 8的第四遍中比较2次,在5 6 7 8的第五遍中比较1次,最后在3 5 6 7 8的第三遍中留下1个数字0,因此不需要再次比较。 排序结果如下:0.35678,2020/7/5,15,气泡排序(续)。上述数组元素的排序是通过双循环实现的。外循环重复N-1次,内循环重复N-1、N-2次,依次1次。每次要比较的两个元素,第一个元素与由aj标识的内部循环j相关,第二个元素与由aj 1标识的内部循环j相关。I的值是1,2,依次为N-1,对于每个I,j的值为0,1,反过来。2020/7/5/16,鼓泡法分选(续)。从上面的过程中,我们可以看到N个数字应该进行N-1。
8、次比较,在第I次比较中,N-1次应该成对比较。2020/7/5,17,#定义N6 main()int An;I,j,t;对于(I=0;iaj 1)t=aj;aj=aj 1;aj 1=t;打印(排序后的数字:n);/输出语句,程序运行如下:3 7 5 6 8 0 3 5 6 7 8,2020/7 5,18,例4.3按选择方法排序(从小到大)。选择方法的排序原则:一次选择数组中的每个数字,记下当前位置,假设它是当前位置的最小数字(min=i ),从下一个数字扫描到最后一个数字,并记录最小数字的位置(min)。如果扫描后min不等于I,则意味着假设是错误的,然后交换min和I上的数字位置。也就是说,。
9、10个数字中的最小数字首先与a0交换,然后a1到a9中的最小数字与a1交换。在第一轮比较中,找出未排序数字中最小的一个。总共应该比较9轮。2020/7/5/19,以6个数字为例:3、7、5、6、8和0。思路:第一遍:依次比较第一个数字和下面的数字。如果后一个数字小于第一个数字,则交换两个数字。比较后,第一个数字是最小的数字。第二遍:依次比较第二个数字和下面的数字。如果后一个数字小于第二个数字,则交换两个数字。比较后,第二个数字是下一个最小的数字。等等。例4.3按选择方法排序(从小到大)。2020/7/5/20,按选择方法排序(续),上述数组元素的排序通过双循环实现,外循环变量设置为1,内循环变。
10、量设置为J.外循环重复N-1次,内循环重复N-1、N-2次,依次1次。每次比较两个元素,第一个元素与外环1相关,由ai标识,第二个元素与内环J相关,由aj标识。I的值是0,1,反过来,对于每个I,J的值是i 1,i 2,依次5。2020/7/5/21,按选择方法排序(续),2020/7/5/22,# define n6 main()int an;I,j,t;对于(I=0;iaj)t=ai;ai=ajaj=t。打印(排序后的数字:n);程序运行如下:20 96 78 65 86 40排序数: 20 40 65 78 86 96,2020/7/5,23,4.2二维数组,数据类型数组名常量表达式1常。
11、量表达式2;例如:float x23,4.2.1二维数组的定义,int a3,4,b(3,4),c,d(3)(4);2020/7/5,24,地址值数组元素,二维数组元素按存储顺序:2020/7/5,25,x0为数组名,x00为数组地址,x1为数组名,x10为数组地址,二维数组可视为特殊的一维数组,x0 -浮动x23,2020/7/5,26,a34=3;/*下标越界*/a1,2=1;/*应写成a12=1;*/,4 . 2 . 2 2D数组元素的引用,例如:int a34a00=3;a01=a00 10,数组名称行下标表达式列下标表达式,数组元素表达式:2020/7/5,27,4.2.3二维数组的。
12、初始化,例如:int a23=1,2,3,4,5,6;1。根据线条指定初始值,例如:int a23=1,2,3,4,5,6;初始化后的结果:1 2 3 4 5 6,2根据内存中数组元素的排列顺序给每个元素赋值,3给一些元素赋值,例如:int a23=1,4;初始化后的结果:1 0 0 4 0 0,2020/7/5,28,4.2.3二维数组初始化(续)。初始化4个数组时,可以保存行长度,但不能保存列长度。例如,int a3=1,2,3,4,5,6,7;int b4=1,4,5;初始化结果:结果: A 0: 123 A 1: 456 A 2: 700,结果B 0: 1000 B 1: 4500,2。
13、020/7/5,29。以下二维数组的定义都是错误的:4.2.3二维数组的初始化,int a,b 2,C3;int m24=1,2,3,4,5,6,7,8,9;/*编译错误,初始值的个数大于数组元素的个数*/,2020/7/5,30,4.2.4二维数组应用示例(教材),P 130,2020/7/5,31,4.2.4二维数组应用示例,示例4.4为四行三列数组main() int a43,I,j,k;对于(I=0;i4;I)对于(j=0;J3;j)扫描(d),程序运行如下:1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 9 10 11 12,2020/7/5,32,。
14、4.2.4二维数组应用示例(续),示例4.5有一个NM矩阵,通过编程计算出绝对值最大的元素。图4.4查找最大元素,2020/7/5,33,# include math . h # define n 4 # define M5 main()int I,j,row,column,max,anm/*输入数据*/max=ABS(a00);row=column=0;对于(I=0;imax) max=abs(共同执行活动);row=I;col=j;/*输出数据*/,程序运行如下:34 56 12 67 23 12 67 43 98 54 65 45 66 16 24 37 83 25 64 19 max=。
15、98,row=1,column=3,2020/7/5,34,4.3字符数组和字符串,字符数组:可以存储多个字符。4.3.1基本概念,字符串:字符串末尾必须有0个字符,并且其ASCII码值为0。不是字符串,而是字符串,2020/7/5,35,另一个例子:char a35数组是二维字符数组,可以存储15个字符或3个长度不大于4的字符串。4.3.2字符数组的定义,例如:字符s10s数组是一个一维字符数组,可以容纳10个字符或长度不大于9的字符串。注意:字符串只能存储在字符数组中。2020/7/5,36,4.3.3字符数组的初始化,1使用字符常量来分配初始值,例如:char c5=C,h,I,n,a;。
16、另一个例子:char c6=C,h,I,n,a,0;是字符串,而不是字符串。2020年7月5日,37,4.3.3字符数组初始化(续),例如:char a310=basic,pascal,c;2,用字符串常量赋值初始值,例如:char str10=字符串;或char str10=字符串;是一根绳子吗?2020/7/5,38,4.3.3字符数组的初始化(续),例如:char s37=s,t,r,I,n,g;3初始化过程中省略了长度,例如:char s1=早上好!s10,s113,例如:char s2=s,t,r,I,n,g;思考:哪个数组存储字符串?2020/7/5,39,4.3.4。示例4.6将09分配给字符数组c1,将AZ分配给字符数组c2,然后输出c1和c2数组中的数据。1是对字符数组元素的引用,它可以为数组元素和元素的输入/输出值赋值。2020/7/5/40,程序如下:main() char c110,c226int I;对于(I=0;i10I)c1i=i48;对于(I=0;i26(I)c2i=1a;对于(I=0;i10i ) printf(%c,c1i);printf(n);对于(I=0;i26i ) printf(%c,c2i);printf(n。