C语言程序设计教程第08章一维数组的应用.ppt

上传人:wuy****n92 文档编号:70107003 上传时间:2023-01-16 格式:PPT 页数:51 大小:235.49KB
返回 下载 相关 举报
C语言程序设计教程第08章一维数组的应用.ppt_第1页
第1页 / 共51页
C语言程序设计教程第08章一维数组的应用.ppt_第2页
第2页 / 共51页
点击查看更多>>
资源描述

《C语言程序设计教程第08章一维数组的应用.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计教程第08章一维数组的应用.ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第8章章 一维数组的应用一维数组的应用8.1 了解一维数组了解一维数组8.2 一维数组的简单应用一维数组的简单应用8.3 利用地址和指针访问数组元素利用地址和指针访问数组元素8.4 与一维数组有关的参数传递与一维数组有关的参数传递8.5 一维数组操作中的常用算法介绍一维数组操作中的常用算法介绍8.1 了解一维数组了解一维数组8.1.18.1.1一维数组的用途一维数组的用途8.1.28.1.2一维数组的定义一维数组的定义在在C语语言言中中,数数组组必必须须先先定定义义才才可可以以使使用用。当当定定义义数数组组时时,要要传传递递给给编编译译器器两两方面的信息:方面的信息:数组共有多少个元素?数组

2、共有多少个元素?每个元素占多少个字节?每个元素占多少个字节?根根据据以以上上信信息息,编编译译器器决决定定分分配配多多大大的存储空间给该数组使用。例如:的存储空间给该数组使用。例如:int a10;这这里里a是是数数组组的的名名称称,方方括括号号中中的的10表表明明数数组组一一共共有有10个个元元素素,下下标标应应该该从从0开开始始到到9结结束束;类类型型名名int限限定定数数组组a的的每每个个元元素素中中只只能能存存放放整整型型数数。根根据据这这一一定定义义,系系统统将将为为数数组组a开开辟辟能能容容纳纳10个个整整型型数数的的连连续续存存储单元。储单元。一维数组定义语句的语法形式为:一维数

3、组定义语句的语法形式为:类类型型名名 数数组组名名常常量量表表达达式式,;说明说明(1)“类类型型名名”决决定定了了数数组组中中可可以以存存放放的数据的类型。的数据的类型。(2)“数数组组名名”和和变变量量名名相相同同,必必须须遵遵循标识符的命名规则。循标识符的命名规则。(3)“常常量量表表达达式式”代代表表的的是是数数组组元元素素的的个个数数,也也就就是是数数组组的的长长度度。它它必必须须是是无无符符号号整整型型常常量量,不不允允许许是是0、负负数数和和浮浮点点数数,也不允许是变量。也不允许是变量。(4)C语语言言中中规规定定:每每个个数数组组第第一一个个元元素素的的下下标标固固定定为为0,

4、称称为为下下标标的的下下界界;最最后后一一个个元元素素的的下下标标为为元元素素个个数数减减1,称称为为下下标的上界。标的上界。(5)数数组组的的定定义义可可以以和和普普通通变变量量的的定定义出现在同一个定义语句中。例如:义出现在同一个定义语句中。例如:float k,x5,y20;以以上上语语句句在在定定义义单单精精度度变变量量k的的同同时时,定定义义了了两两个个单单精精度度型型的的一一维维数数组组x和和y。数数组组x共共有有5个个元元素素,下下标标的的使使用用范范围围是是04;数数组组y共共有有20个个元元素素,下下标标的的使使用用范范围围是是019。8.1.38.1.3一维数组元素的引用一

5、维数组元素的引用数数组组一一经经建建立立,在在内内存存中中就就占占据据着着一一串连续的存储单元。串连续的存储单元。8.1.48.1.4一维数组的初始化一维数组的初始化8.2 一维数组的简单应用一维数组的简单应用例例8.18.1 编编写写程程序序,在在数数组组x中中存存储储自自然数然数120,然后按以下要求输出数据:,然后按以下要求输出数据:按逆序分两行输出元素值。按逆序分两行输出元素值。在在一一行行上上输输出出所所有有下下标标为为偶偶数数的的数数组元素。组元素。在在一一行行上上输输出出所所有有值值为为偶偶数数的的数数组组元素。元素。问题分析问题分析本本例例题题涉涉及及的的是是对对数数组组元元素

6、素进进行行操操作作的的基基本本算算法法。对对一一维维数数组组各各元元素素的的访访问问,通通常常是是在在单单重重循循环环中中实实现现。通通过过循循环环变变量量与与循循环环体体内内语语句句的的配配合合,可可以以灵灵活活地地、有有选择地访问指定元素。选择地访问指定元素。读读者者在在阅阅读读以以下下程程序序时时,应应理理解解数数组组元元素素下下标标与与数数组组元元素素值值的的区区别别;掌掌握握如如何何用用循循环环变变量量控控制制数数组组元元素素的的下下标标;以以及及如如何在连续输出的过程中控制输出换行。何在连续输出的过程中控制输出换行。源程序如下:源程序如下:main()int x20,i;for(i

7、=0;i=0;i)/*控制从数组尾部开始输出控制从数组尾部开始输出*/printf(%3d,xi);if(i%10=0)printf(n);/*控制每输出控制每输出10个元素后换行个元素后换行*/printf(输出下标为偶数的元素:输出下标为偶数的元素:n);for(i=2;i20;i+=2)printf(%3d,xi);printf(n);printf(输出值为偶数的元素:输出值为偶数的元素:n);for(i=0;i20;i+)if(xi%2=0)printf(%3d,xi);printf(n);程序的运行结果如下:程序的运行结果如下:分两行逆序输出:分两行逆序输出:20 19 18 17

8、16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1输出下标为偶数的元素:输出下标为偶数的元素:3 5 7 9 11 13 15 17 19输出值为偶数的元素:输出值为偶数的元素:2 4 6 8 10 12 14 16 18 208.3 利用地址和指针访问利用地址和指针访问数组元素数组元素8.3.18.3.18.3.18.3.1数组名、元素地址及指针的关系数组名、元素地址及指针的关系数组名、元素地址及指针的关系数组名、元素地址及指针的关系通通过过前前面面的的知知识识积积累累和和本本节节的的进进一一步步介绍,读者应该建立起如下概念。介绍,读者应该建立起如下概念。(1)数数

9、组组是是一一种种构构造造数数据据类类型型。数数组组名名代代表表着着这这个个数数组组所所占占连连续续存存储储空空间间的的起始地址。起始地址。这这个个地地址址是是在在定定义义数数组组时时由由系系统统所所分分配配的的,不不可可以以人人为为改改变变。因因此此,可可以以认认为为数组名是一个地址常量。数组名是一个地址常量。如有定义:如有定义:int x5,y5,m=3;则语句:则语句:x=&m;x=y;y+;都都是是错错误误的的。数数组组名名x和和y作作为为地地址址常常量可以使用,不可以重新赋值。而表达式:量可以使用,不可以重新赋值。而表达式:x+1、y+2则则是是合合法法的的。它它们们表表示示以以数数组

10、组名名为为首首地址增加一个偏移量后的地址值。地址增加一个偏移量后的地址值。(2)就就整整体体而而言言,每每个个数数组组元元素素都都是是数数组组这这个个集集合合中中的的一一分分子子,由由于于数数组组所所占占地地址址空空间间是是连连续续的的,通通过过数数组组名名这这个个首首地地址址就就可可以以找找到到数数组组中中的的所所有有元元素素;就就个个体体而而言言,每每个个数数组组元元素素都都可可以以看看作作是是一一个个带带下下标标的的变变量量,它它完完全全可可以以像像普普通通变变量量一一样样进进行行求求地地址址运运算算。因因此此,用用数数组组名名表表示示的的地地址址与与数数组组元元素素的的地地址址之之间间

11、就就有有如如下下关关系:系:x+1等价于等价于&x1、y+2等价于等价于&y2(3)指指针针变变量量是是用用来来存存放放地地址址值值的的,它它可可以以通通过过加加、减减一一个个整整数数在在一一串串连连续续的的存存储储单单元元中中移移动动,并并可可以以利利用用间间接接访访问问运运算算符符得得到到指指针针所所指指单单元元的的内内容容。因因此此,数数组组名名、数数组组元元素素和和指指针针变变量量之之间间可可以以通通过过数数组组元元素素的的地地址址建建立立起起关关系系。若若有有如如下下定定义:义:int a6=1,2,3,4,5,6,*p;则语句:则语句:p=a;等价于等价于 p=&a0;都都使使指指

12、针针变变量量p中中存存放放了了数数组组a的的首首地地址址,即即p指指向向了了数数组组a的的第第一一个个元元素素a0。在在这一前提下,表达式:这一前提下,表达式:*p 等价于等价于*a都代表数组的第一个元素都代表数组的第一个元素a0。而:而:*(p+2)等价于等价于*(a+2)都代表数组的第三个元素都代表数组的第三个元素a2。语句:语句:p+;表表示示将将指指针针p移移动动一一个个位位置置,指指向向数数组组a的第二个元素的第二个元素a1。但语句:但语句:a+;则是非法的,因为则是非法的,因为a是常量。是常量。由由此此可可见见:数数组组名名是是地地址址常常量量;指指针针是是存存放放地地址址的的变变

13、量量,它它们们都都可可以以用用来来描描述述数数组组元元素素的的地地址址,进进而而可可以以得得到到元元素素的的内内容容。所所以以,我我们们不不仅仅可可以以直直接接用用带带下下标标的的变变量量形形式式来来访访问问数数组组元元素素,还还可可以以通通过过数数组组的的首首地地址址(数数组组名名)和和指指针针来来访访问问数数组组元元素素,从从而而大大大大地地增增加加了了数数组组使使用用的的灵灵活活性性,但但也也同同时时增增加加了了初初学学者者全全面面掌掌握握C语语言的难度。言的难度。8.3.28.3.2 通通过过数数组组首首地地址址访访问问数组元素数组元素设有如下定义:设有如下定义:int x10,i;通

14、通过过上上一一节节的的叙叙述述已已知知:数数组组名名是是数数组的首地址,从而有:组的首地址,从而有:x+0 等价于等价于&x0 x+1 等价于等价于&x1 x+i 等价于等价于&xi在在得得到到地地址址后后,可可以以通通过过间间接接访访问问运运算符来引用地址所在的存储单元。因此有:算符来引用地址所在的存储单元。因此有:*(x+0)或或*x 等价于等价于*&x0 即即x0 *(x+1)等价于等价于*&x1 即即x1 *(x+i)等价于等价于*&xi 即即xi如如果果要要利利用用数数组组首首地地址址对对x数数组组的的所所有有元元素素逐逐个个输输入入输输出出,则则可可由由以以下下程程序序段段实实现:

15、现:for(i=0;i10;i+)scanf(%d,x+i);for(i=0;i10;i+)printf(%3d,*(x+i);注注意意:在在上上面面的的程程序序段段中中,我我们们只只是是使使用用了了代代表表数数组组首首地地址址的的数数组组名名x,并并没没有有(也不允许)改变它的值。(也不允许)改变它的值。8.3.38.3.3 通通过过指指针针访访问问数数组组元元素素通通过过地地址址常常量量数数组组名名可可以以访访问问数数组组元元素素,显显然然,通通过过存存放放地地址址的的变变量量指指针针也也可可以以访访问问数数组组元元素素,而而且且更更具具灵灵活活性。性。若有如下定义:若有如下定义:int

16、x10,*p,i;在在执执行行了了语语句句:p=x;或或p=&x0;后后,指针指针p中存放的是数组中存放的是数组x的首地址。的首地址。如如果果不不移移动动指指针针,也也可可以以采采用用首首地地址址+位移量的形式逐个输入输出数组元素:位移量的形式逐个输入输出数组元素:p=x;for(i=0;i10;i+)scanf(%d,p+i);for(i=0;i10;i+)printf(%3d,*(p+i);在在上上一一小小节节的的讨讨论论中中,我我们们曾曾经经得得出出结结论论:*(x+i)等等价价于于xi。细细心心的的读读者者可可能能会会问问:在在这这里里*(p+i)是是否否也也等等价价于于pi呢呢?确确

17、实实如如此此。事事实实上上方方括括号号 也也是是一一种种运运算算符。符。概括起来,如果有如下定义和语句:概括起来,如果有如下定义和语句:int x10,*p,i;p=x;则则表表示示数数组组x中中的的元元素素可可以以有有以以下下四四种种形式:形式:xi *(x+i)*(p+i)pi当当然然,这这里里的的i必必须须满满足足条条件件:0i10,否则下标就越界了。否则下标就越界了。与与数数组组名名不不同同,指指针针是是变变量量,它它可可以以通通过过赋赋值值语语句句移移动动位位置置。因因此此可可以以采采用用以以下下方方法法,通通过过顺顺序序移移动动指指针针来来逐逐个个输输入入输输出数组元素:出数组元素

18、:p=x;for(i=0;i10;i+)scanf(%d,p);p+;p=x;for(i=0;i10;i+)printf(%3d,*p);p+;注注意意:由由于于在在输输入入时时移移动动了了指指针针,输输出出前前还还应应通通过过赋赋值值操操作作使使指指针针再再次次指指向向数数组的第一个元素。组的第一个元素。8.4 与一维数组有关的参数传递与一维数组有关的参数传递8.4.18.4.1数组元素作实参数组元素作实参数数组组元元素素就就是是带带下下标标的的变变量量。所所以以,数数组组元元素素作作实实参参与与简简单单变变量量作作实实参参一一样样,对应的形参应该是同类型的简单变量。对应的形参应该是同类型的

19、简单变量。例例8.38.3 编编写写程程序序:利利用用随随机机函函数数产产生生6个个50以以内内的的整整数数存存入入数数组组a中中,然然后后调调用用自自定定义义函函数数isodd依依次次判判断断数数组组a中中的的元元素素是否为奇数。是否为奇数。程序如下程序如下#include stdlib.hint isodd(int x)/*形参是与实参相同类型的普通变量形参是与实参相同类型的普通变量x*/if(x%2=1)return 1;else return 0;main()int a6,i;for(i=0;i6;i+)ai=rand()%50;printf(%4d,ai);printf(n);for

20、(i=0;i6;i+)if(isodd(ai)/*数组元素数组元素ai作实参作实参*/printf(a%d is odd.n,i);else printf(a%d is not odd.n,i);运行结果如下:运行结果如下:46 30 32 40 6 17a0 is not odd.a1 is not odd.a2 is not odd.a3 is not odd.a4 is not odd.a5 is odd.8.4.28.4.2数组名作实参数组名作实参数数组组名名作作为为实实参参传传递递时时,传传送送给给形形参参的的是是数数组组的的首首地地址址。因因此此,对对应应的的形形参参必必须是基类型

21、相同的指针变量。须是基类型相同的指针变量。例例8.48.4 编编写写程程序序:利利用用自自定定义义函函数数ArrIn和和ArrOut实实现现数数组组元元素素的的输输入入和和输输出。出。源程序如下:源程序如下:#define N 100void ArrIn(int*x,int n)/*对应的形参对应的形参x是指针变量是指针变量*/int i;for(i=0;in;i+)scanf(%d,x+i);void ArrOut(int*x,int n)int i;for(i=0;in;i+)printf(%4d,*(x+i);if(i+1)%5=0)printf(n);/*控制输出控制输出5个元素后换行

22、个元素后换行*/main()int aN;ArrIn(a,20);/*数组名数组名a作实参作实参*/ArrOut(a,10);主主函函数数中中调调用用ArrIn和和ArrOut函函数数时时,都都将将数数组组名名a作作为为实实参参传传递递给给了了形形参参指指针针x,使使x得得到到了了主主函函数数中中所所定定义义的的数数组组a的的首首地地址址,仍仍旧旧遵遵循循了了“按按值值”传传递递这这惟惟一一的的参参数数传传递递原原则则。接接下下来来,在在自自定定义义函函数数中中,通过指针通过指针x所操作的就是主函数中的数组所操作的就是主函数中的数组a。另另外外,在在主主函函数数中中定定义义的的数数组组a一一共

23、共可可以以容容纳纳100个个整整数数,但但在在调调用用ArrIn函函数数时时,将将常常量量20传传给给了了形形参参n,因因此此只只给给数数组组的的前前20个个元元素素输输入入了了数数据据。调调用用ArrOut函函数时,则只输出了数组数时,则只输出了数组a的前的前10个元素。个元素。需需要要说说明明的的是是:当当数数组组名名作作为为实实参参时时,对对应应的的形形参参应应该该是是指指针针,但但还还允允许许其其他他表表示示形形式式。以以ArrIn函函数数为为例例,对对于于调调用用语语句句:ArrIn(a,20);,相相应应的的函函数数首首部部允允许许是是以以下下三种形式:三种形式:void ArrI

24、n(int*x,int n)void ArrIn(int x,int n)void ArrIn(int xN,int n)无无论论表表示示形形式式如如何何,C编编译译器器都都将将x按按指针处理。指针处理。8.4.38.4.3 数数组组元元素素的的地地址址作作实实参参数数组组元元素素的的地地址址作作实实参参,与与数数组组名名作作实实参参一一样样,传传递递的的也也是是地地址址值值,所所以以对对应应的的形形参参也也应应当当是是基基类类型型相相同同的的指指针针变变量量。但但这这种种方方式式带带给给了了程程序序设设计计者者更更大大的的灵灵活活度。度。我我们们在在不不改改变变例例题题8.4中中自自定定义义

25、函函数数的的前前提提下下,通通过过传传递递数数组组元元素素的的地地址址,可可以以实实现现对对主主函函数数中中数数组组a的的任任意意一一段段连连续续空空间间中数组元素的输入和输出。中数组元素的输入和输出。例如:例如:#define N 100void ArrIn(int*x,int n)int i;for(i=0;in;i+)scanf(%d,x+i);main()int aN;ArrIn(&a10,10);/*调用函数为调用函数为a10a19输入数据输入数据*/ArrIn(&a50,5);/*调用函数为调用函数为a50a54输入数据输入数据*/结结 合合 主主 函函 数数 中中 的的 调调 用

26、用 语语 句句ArrIn(&a10,10);可以看出:可以看出:(1)第第1个个实实参参&a10是是数数组组元元素素a10的的地地址址,将将它它对对应应传传给给函函数数ArrIn中中的的形形参参x,使使x指指向向了了数数组组元元素素a10,用用来来控制输入数据时存放的起始地址;控制输入数据时存放的起始地址;(2)第第2个个实实参参10对对应应传传递递给给了了函函数数ArrIn的的形形参参n,用用来来控控制制为为10个个元元素素输输入入数据;数据;(3)在在函函数数ArrIn中中,由由于于指指针针变变量量x初初始始指指向向的的是是数数组组元元素素a10,所所以以当当i=0时时,scanf语语句句

27、中中的的x+0就就是是a10的的地地址址;当当i=1时时,scanf语语句句中中的的x+1就就是是a11的的地地址址;从从而而实实现现为为a10a19这这10个个元元素素输输入数据的目的。入数据的目的。8.5 一维数组操作中的常用一维数组操作中的常用算法介绍算法介绍8.5.18.5.1查找查找查查找找是是数数据据处处理理中中最最基基本本且且重重要要的的操操作作之之一一。最最常常用用的的算算法法有有“找找最最大大(小小)值值”、“顺顺序序查查找找”指指定定值值和和“二二分分法法查查找找”指定值等。指定值等。8.5.28.5.2插入插入插插入入是是数数组组的的基基本本操操作作之之一一。在在实实际际

28、应应用用中中,有有时时要要求求“在在某某一一数数值值前前(或或后后)插插入入一一个个元元素素”;有有时时则则需需要要“在在有有序序表表中中插插入入一一个个元元素素,插插入入后后仍仍保保持持表表有有序序”。不不论论是是哪哪一一种种情情况况,都都首首先先要要找找到到应应插插入入的的位位置置,这这一一操操作作可可通通过过前前面面介介绍绍的的查查找找算算法法实实现现。因因此此,插插入入操操作作的的关关键键应应该该是是如何实现如何实现“在指定位置上插入一个元素在指定位置上插入一个元素”。8.5.38.5.3删除删除删删除除也也是是一一维维数数组组的的基基本本操操作作之之一一。常常见见的的应应用用有有“删

29、删除除值值为为x的的元元素素”、“删删除除数数组组中中值值相相同同的的元元素素(去去偶偶)”等等。和和插插入入相相似似,删删除除也也应应先先查查找找到到待待删删元元素素的的位位置置,下下一一步步的的关关键键就就是是“删删除除指指定定位位置置上的元素上的元素”。8.5.48.5.4排序排序排排序序是是计计算算机机程程序序设设计计中中的的一一种种重重要要操操作作,其其功功能能是是将将一一个个无无序序的的数数据据序序列列调调整整为为有有序序。在在计计算算机机系系统统中中,花花在在排排序序上上的的时时间间,在在CPU的的运运行行时时间间中中占占有有很很大大比比重重,应应用用十十分分广广泛泛,也也因因此此而而产产生生了了很很多多比比较较成成熟熟的的算算法法。常常见见的的有有:比比较较交交换换法法、冒冒泡泡法法、选选择择法法、插插入入法法、希希尔尔法法以以及及快快速排序等。速排序等。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁