C语言程序设计教程课件(07662-7) 第6章 数组与字符串

上传人:E**** 文档编号:89385934 上传时间:2019-05-24 格式:PPT 页数:67 大小:460KB
返回 下载 相关 举报
C语言程序设计教程课件(07662-7) 第6章  数组与字符串_第1页
第1页 / 共67页
C语言程序设计教程课件(07662-7) 第6章  数组与字符串_第2页
第2页 / 共67页
C语言程序设计教程课件(07662-7) 第6章  数组与字符串_第3页
第3页 / 共67页
C语言程序设计教程课件(07662-7) 第6章  数组与字符串_第4页
第4页 / 共67页
C语言程序设计教程课件(07662-7) 第6章  数组与字符串_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《C语言程序设计教程课件(07662-7) 第6章 数组与字符串》由会员分享,可在线阅读,更多相关《C语言程序设计教程课件(07662-7) 第6章 数组与字符串(67页珍藏版)》请在金锄头文库上搜索。

1、第1页 共67页,第 6 章 数组与字符串,概述 一维数组 数组排序 多维数组 数组的应用 字符串与字符数组 最常用的字符串库函数 实例老鼠走迷宫问题,第2页 共67页,6.1 概述,假设要处理100个学生的某一门课程的成绩,例如,将它们从高分到低分排序,并计算它们的平均分和不及格率。这是一个很简单的问题。但是,如果读者仅用前面所学的知识,试图写出一个程序来完成这一工作,还是相当复杂的。然而,这个问题如果用数组来求解简直是“小菜一碟”。数组是求解这一类问题的利器。事实上,就上面这个例子而言,我们可以定义一个名为grades的量,它不是代表某个学生的一门成绩,而是代表整个“组”(100个学生)的

2、同一门课程的成绩。学生个体只是这个“组”中的一个元素。我们称grades为数组,grades就是数组名。数组中的每一个元素都可以由一个被称为“下标”的数字来标明,以反映该学生的成绩存放在数组中的位置。,第3页 共67页,在数学中,带下标的变量ai写作C语言的等价形式是: ai 类似地,表达式 grades10 表示数组grades的中的第11个元素。注意,它的第1个元素是grades0。 由以上讨论可知,数组是C语言组织和描述较复杂的数据对象的基本工具之一。数组作为一种构造数据类型,它是由具有相同数据类型的一串元素组成的。,第4页 共67页,6.2 一维数组,一维数组的定义 数组名与指针 一维

3、数组的初始化 引用数组元素,第5页 共67页,6.2.1 一维数组的定义,程序员只有在定义了数组元素的类型和个数以后,编译器才会为该数组分配空间。如果要求编译器为名为grades的数组分配100个整数空间,使用如下定义语句: int grades100; 其中,方括号中的100表示数组最多可以有100个元素,即数组长度或称数组大小为100,它必须是一个整数或整型常量表达式;grades前面的int表示数组的元素类型。 一个数组中的所有元素都被分配在一片连续的内存空间中。在C语言中,表示数组元素位置的“下标”总是从0开始,即数组grades的第1个元素是grades0,它的最后一个元素是grad

4、es99,如图所示。,第6页 共67页,有100个元素的数组,第7页 共67页,也可以用同一条定义语句定义多个数组,并为这些数组的元素指定你所需要的任何数据类型。例如,语句: float x15,y10; 定义了元素类型为float的名为x和y的两个数组,它们的元素个数分别是15和10。 下面来详细地探讨图6-1中的数组grades。 在C语言中,封闭数组下标的一对方括号实际上被定义为运算符,它与圆括号具有相同的优先级。表达式grades0代表数组grades的第1个元素,它有一个确定的存储位置。读者可以根据需要给它赋值。例如: grades0 = 85;,第8页 共67页,其含义是数组gra

5、des的第1个元素所对应的那个学生的成绩是85分。事实上,我们可以通过类似下面的循环完成对100个学生成绩的输入: for(i = 0;i 100; +i) scanf(“%d“, gradesi); 细心的读者也许已经发现,本章开篇提到的计算100个学生的平均分和不及格率的问题,因为引进数组而变得非常简单。读者很快就会看到,排序也将不成问题。,第9页 共67页,6.2.2 数组名与指针,表达式grades0是一个左值,它的类型是整型。在C语言中,数组名不是变量而是一个地址常量,它的值是数组第1个元素的地址。也就是说,数组名grades的含义是grades0在内存中的存储位置。这也就意味着下列

6、等式成立: grades= 则下面两个赋值表达式不但是合法的,而且它们的结果也是一样的: p=&a0 p=a,第10页 共67页,因为表达式,第11页 共67页,我们说数组名是一个常量指针,但读者不要根据这个事实得出数组名和指针是一回事的结论。数组名与指针有太多的相似点,甚至很多时候,数组名可以作为指针使用。但是,我们也有太多的理由,证明数组名不是指针。 首先,数组名的内涵在于其表征的实体是一种数据结构,而且我们称这种数据结构为数组。下面例子证明了这一点。,第12页 共67页,【例】数组名不是指针。 #include int main() char aStr10; char *psz = aS

7、tr; printf(“%dn“, sizeof(aStr); printf(“%dn“, sizeof(psz); return(); ,第13页 共67页,在Win32系统中,指针长度为4。因此,如果数组名是指针,那么例子中的两个输出语句的输出都应该是4,但实际情况是,前者输出为10,后者输出才是4。这说明数组名所表征的实体是一种数据结构,这种数据结构即数组aStr所需的空间长度是10个字节。可见,数组名不是指针。 现在分析下面这两个语句: char aStr10; char *psz;,第14页 共67页,前者请求编译器预留10个字节的位置,并用名“aStr”表示,也就是说,有一个特定的

8、名为aStr的位置,可以存放10个字符,用户不能要求对数组aStr重新分配空间或改变大小,即用户不能改变aStr的值,可见数组名不是左值;后者请求预留一个名为psz指针的位置用来存放地址。这个指针几乎可以指向任何位置:指向任何字符或任何字符串,或什么也不指向。用户几乎可以随时随意重新改变指针的值,这说明指针是左值。由此可见,数组的属性和指针的属性大相径庭:当定义一个数组时,它同时也分配了一些存储空间,用于存储数组元素,当定义一个指针时,它只分配用于容纳指针本身的空间;数组名的值是不可变的,但指针的值是随时可变的。,第15页 共67页,如果把数组地址赋给指针,例如,执行语句: psz = aSt

9、r; 表达式psz5和aStr5访问的是同一个元素,但实现访问的途径不同:当编译器遇到表达式psz5时,它生成代码找到指针psz的位置,取出其中的指针值,在指针上加“5”形成最终的访问位置;当它遇到表达式aStr5时,它生成代码直接从aStr开始跳过“5”个元素便是最终的访问位置。可见,尽管访问的是同一存储位置,但本质的区别在于数组aStr和指针psz一旦在表达式中出现就会按照不同的方法计算,无论它们是否带有下标。,第16页 共67页,6.2.3 一维数组的初始化,读者对下面两个语句的含义应该非常明确: int a; Int b = 10; 前者定义变量a,但通常情况下,a的值是不确定的;后者

10、定义变量b,并将其值初始化为10。数组也可以像变量b一样,在定义它的同时将其初始化,但初始化的方法不同。因为数组不同于简单变量b,它往往包含许多值。具体做法是,在初始化时,从第一个元素开始列出其初值。所列出的值用逗号分隔,所有这些值放在一对花括号中。如下面的例子所示: int nCounter5 = 1,2,3,4,5;,第17页 共67页,将这一对花括号组成的初值序列称为初始化列表。上面这个语句中,初始化列表给出的值逐个赋值给数组的各个元素,即将1赋值给nCounter0,2赋值给nCounter1等。它相当于下列语句: nCounter0 = 1; nCounter1 = 2; nCoun

11、ter2 = 3; nCounter3 = 4; nCounter4 = 5;,第18页 共67页,对数组初始化时,若初始化列表中所列初始数据个数少于数组元素个数,剩余的那部分元素被置为0;若所列初始值个数超出数组元素个数,则会出错。例如,语句: int nCounter5=1,2,3,4,5,6; 是错误的。因为编译器没有办法把6个整数存放到5个整数位置中。但下面的语句却合法: int nCounter5=4,5,6;,第19页 共67页,它把3个整数存放到数组前3个元素位置,最后两个元素则被初始化为0。 利用“剩余的元素被自动初始化为0”这一特性,可以用下面的语句将具有100个元素的数组初

12、始化为0: int a100=0; 该语句初始化列表中唯一的“0”用于将数组的第一个元素初始化为0。因为初始化列表中初始值的个数比数组元素的个数少,所以剩下的99个元素被自动初始化为0。,第20页 共67页,有些编译器允许用逗号表示相应数组元素的初值为0,如下面的例子: Int nCounter5 = ,2,8; 我们不提倡这种方法,因为它是不可移植的。这个语句所产生的效果相当于下列语句: nCounter0 = 0; nCounter1 = 2; nCounter2 = 0; nCounter3 = 8; nCounter4 = 0;,第21页 共67页,特别地,ANSI C允许这样定义数组

13、: int nCounter =1,2,3,4,5,6; 在这个定义语句中没有指定数组长度,但这难不倒编译器,它会把数组长度设置为初始化列表中的数据个数。因此,这种定义语句必须带有初始化列表,以便编译器确认该数组元素的个数。显然,如果一个数组的初始化列表需要经常修改,那么这种技巧尤其有用。,第22页 共67页,最后,我们考虑下面这几个定义语句: char aStr1 = “Hello“; char aStr2 = H, e, l, l, o, 0 ; char aStr3 = H, e, l, l, o ; char *psz = “Hello“; 这几个语句告诉了我们如何初始化字符数组。第一

14、个语句中的“Hello”看上去是一个字符串常量,但它不是,它实际上是第二个语句中的初始化列表的另一种简便写法。,第23页 共67页,注意,第二个语句的初始化列表的最后加了一个零,它是串结束符。因此,前两个语句完成的是同一项工作。aStr2 和aStr3是两个类型不同的数组,前者用来存储一个字符串,后者用来存储一串字符。最后一个语句将指针psz初始化为指向一个真正的字符串常量。第一个语句与最后一个语句也是不同的,二者的区别分别如图(a)和图(b)所示。,第24页 共67页,指针与数组,第25页 共67页,6.2.4 引用数组元素,通过改变数组下标变量的值,可以很容易地顺序访问数组中的所有元素。例

15、如,语句: for( i=0; i100; +i ) nSun=nSum+gradesi; 将顺序访问数组grades的前100个元素。当该循环结束时,变量nSum将包括grades数组中前100个元素值的累加和(假设在循环前nSum的值为0)。 在方括号内除了使用整型常量外,也可以使用整型表达式来引用数组中的具体元素。所以,如果确定变量low = 0和 high = 99,那么表达式: grades(low + high)/2 指的是数组元素grades49,因为(0 + 99)/2的结果是49。,第26页 共67页,【例】一个存在问题的程序段。 int a5 = 1,2,3,4,5; for( k = 0; k 6; k+ ) ak += ak; printf( “a%d = %d n“, k, a k ); 输出结果为: a0=2 a1=4 a2=6 a3=8 a4=10 a5=一个不确定的值,第27页 共67页,6.3 数组排序,在这里先介绍其中较初等的“简单选择排序”(Simple Selection Sort)法。 假设要求对n个整数序列: a0,a1,an-1 按升序排序,即排序完后,对任意的i满足:ai-1ai。简单选择排序的基本思想是,第i次在n-i+1(i=1,2,n-1)个整数序列中选取值最小的那个数作为有序序列中的第i个整数。不失一

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号