C语言 第六章 数组与字符串.ppt_第1页
C语言 第六章 数组与字符串.ppt_第2页
C语言 第六章 数组与字符串.ppt_第3页
C语言 第六章 数组与字符串.ppt_第4页
C语言 第六章 数组与字符串.ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

1、第6章 数组和字符串,6.0 本章学习目标 6.1 一维数组 6.2 二维数组 6.3 数值数组的应用举例 6.4 字符数组与字符串函数 6.5 字符串处理应用举例,开 始,结 束,本章学习目标,一维数组的定义、初始化方式,以及元素引用方式; 二维数组的定义、初始化方式,以及元素引用方式; 数值数组的应用; 字符数组与字符串函数,以及字符串处理应用。,返回本章首页,6.1 一维数组,6.1.1 一维数组的定义与初始化 6.1.2 一维数组元素的引用,返回本章首页,6.1.1 一维数组的定义与初始化,一、一维数组的定义 在C语言中,同变量一样,数组也必须先定义后使用。一维数组的定义形式为: 类型

2、标识符 数组名常量表达式; 例如: int a10; 它表明数组名为a,数组中有10个元素。,返回本节,说明: 1数组名要遵循标识符命名规则。数组名表示数组存储区域的首地址,不能向它赋值。 2数组名后是用方括号括起来的常量表达式。 3常量表达式中可以包括字面常量和符号常量,但不能包含变量。 4常量表达式表示数组中元素的个数,即数组的长度。C语言规定,数组元素的下标从0开始,并且下标必须是整数类型。 5数组的类型就是它所有的元素变量的类型。在定义数组时,应在数组名前对数组的类型加以确定。,返回本节,二、一维数组的初始化 对数组进行初始化,就是在定义数组时对数组元素赋初值。 例如: int a10

3、=0,1,2,3,4,5,6,7,8,9; 经过上面的定义和初始化后,a00,a11,a22,a33,a44,a55,a66,a77,a88,a99。,返回本节,说明: 1可以只给一部分元素赋值。 例如: static int a5=0,1,2; 2在对数组初始化时,如果给出了全部数组元素的初值,则可以省略数组长度。 例如:static int a =0,1,2,3,4; 3C语言中不允许给数组整体赋初值。 例如:如果要给数组a的全部元素赋同一个值1,不能写成:static int a5=1; 或:static int a5=1*5;,下一页,而应该写成: static int a5=1,1,

4、1,1,1; 但如果要给数组a的全部元素赋值0,则可以简写成: int a10=0; 系统会对所有数组元素赋值为0。 4不能用赋值语句给数组整体赋值(经常出现的错误)。 如:a50,1,2,3,4;是错误的。 5若赋值数据个数超过数组元素个数则会出现语法错误。,返回本节,6.1.2 一维数组元素的引用,C语言规定,只能逐个引用数组元素,而不能一次引用整个数组。 数组元素的引用形式为: 数组名下标 C语言规定,数组元素的下标从0开始,并且下标必须是整数类型的常量或表达式。,返回本节,例6.1 # include main() int i, a10; for (i=0; i=0; i-) prin

5、tf(“%d ”,ai); ,返回本节,运行结果如下: 0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0 程序先给数组的10个元素a0a9依次赋初值09,然后正序输出,最后逆序输出。,返回本节,6.2 二维数组,6.2.1 二维数组的定义与初始化 6.2.2 二维数组元素的引用,返回本章首页,6.2.1 二维数组的定义与初始化,一、二维数组的定义 二维数组定义的一般形式为: 类型标识符 数组名常量表达式1常量表达式2; 例如: int a23; 注意,不能写成: int a2,3; 或 int a2*3;,返回本节,二维数组在内存中的存储是按行优先存储所有元素的,

6、即先顺序存储第一行的元素,再存储第二行的元素,依此类推,最后存储最后一行的元素。而在存储每一行的元素时,是按照一维数组的存储方法存储的。 因此上面定义的23的整型数组a中所有元素在内存中的排列顺序是:a00,a01,a02,a10,a11,a12。,下一页,因此,我们可以把二维数组看作是一种特殊的一维数组,它的每一个元素都是一个一维数组。 例如,可以把上面定义的数组a看作是一个一维数组,它有2个元素:a0、a1,每一个元素又是一个包含3个元素的一维数组。 如图6.1所示。,返回本节,二、二维数组的初始化 对二维数组初始化的方法有: 1分行初始化。 例如: static int a23=1,2,

7、3,4,5,6; 可以对部分元素赋初值,如: static int a23=1,2,4;,下一页,2统一初始化,即将元素的初值按数组元素的排列顺序统一写在一个花括号内。例如: static int a23=1,2,3,4,5,6; 此时,则按照数组元素的排列顺序依次将各初值赋给对应元素。 如果全部元素的初值都已提供,则数组的第一维长度可以不指定,但第二维长度不能省略。 如:static int a 3=1,2,3,4,5,6;,返回本节,6.2.2 二维数组元素的引用,二维数组元素的引用形式为: 数组名下标下标 这里,下标可以是整型常量或整型表达式。例如:a12,a2-01+2都是允许的。而a

8、1,2和a2-0,1+2都是错误的引用。 与一维数组一样,在引用数组元素时,要注意下标不能越界。,返回本节,例6.2 # include main() int i, j; int a34=1,2,3,4,5,6,7,8, 9,10,11,12; for (i=0; i3; i+) for (j=0; i4; i+) printf(“%4d”,aij); printf(“n”); ,返回本节,运行结果如下: 1 2 3 4 5 6 7 8 910 11 12 程序先给数组的12个元素依次赋初值为012,然后按行输出每一个数组元素。,返回本节,6.3 数值数组的应用举例,6.3.1 统计问题 6.

9、3.2 最大值(最小值)问题 6.3.3 查找、排序问题,返回本章首页,6.3.1 统计问题,例6.3 从键盘输入一维数组,找出其中3的倍数的元素个数。(源程序:L0603.c) 例6.4 统计二维数组中所有元素的平均值。 (源程序:L0604.c ),返回本节,6.3.2 最大值(最小值)问题,例6.5找出一维数组中的最大值和最小值,并输出它们在数组中的位置。 例6.6在MN的二维数组中,找出每一行的最大值,并存入一维数组maxM中。 (源程序:L0605.c ) (源程序:L0606.c ),返回本节,6.3.3 查找、排序问题,例6.7输入一个数,用二分查找法在一维数组中查找该数,并输出

10、其在数组中首次出现的位置。如果该数不在数组中,输出“无此数”。,返回本节,二分查找要求数组中的元素必须按照值的大小递增或递减顺序排列。 它首先用要查找的关键字x与中间位置的元素比较,这个中间位置的元素把查找范围一分为二,若比较结果相等则查找成功;若不相等,再根据x与该中间位置的元素比较的结果确定下一步查找的范围: 如果x比中间位置元素大,说明如果x存在,则一定是在中间位置元素右边的诸元素中,所以下一步查找的范围应该是中间位置的右半边;否则,如果x比中间位置元素小,说明如果x存在,则一定是在中间位置元素左边的诸元素中,下一步查找的范围应该是中间位置的左半边。 这样不断进行下去,直到找到满足条件的

11、元素或者该数组中没有这样的元素为止。 (源程序:L0607.c ),返回本节,例6.8用直接选择排序法对5个整数进行升序排序。 直接选择排序的基本思想是:每一次从待排序的整数中选出关键字最小的整数,顺序放在已排好序的那些整数的末尾(即与待排序的整数中的第一个整数交换位置),直到全部整数排序完毕。(举例)(源程序:L0608.c ),返回本节,例6.9 用起泡法对10个数排序(从小到大)。 设要被排序的数组R0到Rn1垂直竖立,将每个记录Ri看作是重量为Ri的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上“漂浮”,如此反复进行,直到最后任何两个

12、气泡都是轻者在上,重者在下为止。因此,起泡法排序的口诀是:从下往上,两两比较,轻者上冒。 (板书举例),返回本节,注意: 1初始情况下,所有关键字均在无序区内。每一趟排序的结果是将无序区中的最小值“上浮”到无序区的最上面,从而不断缩小无序区,扩大有序区,直至所有关键字排列有序。 2在排序的过程中,一定是相邻的两个元素两两比较,只有当违反“轻气泡不能在重气泡之下”原则时,才将这两个相邻元素交换位置。,下一页,3用起泡法对n个整数进行排序,不是一定要进行n1趟排序后,才可以得到排序结果。如果在中间某一趟排序过程中,没有发现任何两个元素违反“轻气泡不能在重气泡之下”原则,即所有元素均已排列有序,则排

13、序结束。如上例中,7个关键字,只经过了4趟排序。 (源程序:L0609.c ),返回本节,6.4 字符数组与字符串函数,6.4.1 字符数组的定义与初始化 6.4.2 字符串 6.4.3 字符数组与字符串的输入、输出 6.4.4 字符串处理函数,返回本章首页,6.4.1 字符数组的定义与初始化,一、字符数组的定义 定义方法与前面介绍的类似,只是类型标识符是char。例如: char c6; 定义c为字符数组,包含6个元素。每个元素均为字符型,因此可以将字符常量(用单引号括起)赋值给各个元素。,返回本节,二、字符数组的初始化 与一维数组和二维数组类似。需要注意两点: 1给各元素赋初值时,因初值是

14、字符常量,所以要用单引号括起来。如: char c6=h, e, l, l, o, ! ; 2如果花括号中提供的初值个数(即字符个数)大于数组长度,则语法错误。如果初值个数小于数组长度,则只将这些字符依次赋给数组中前面的那些元素,其余的元素自动赋值为空字符(0)。,返回本节,例6.10输出一个字符数组。 # include main() int i; char str6; for (i=0; i6; i+) scanf(“%c ”, 运行结果: 输入:hello!(回车) 输出:hello!,返回本节,6.4.2 字符串,C语言不具有像BASIC语言那样的字符串变量。C语言是使用字符数组对字符

15、串进行存储和处理的。字符数组的一个元素对应了字符串中的一个字符。 需要强调的是,C语言规定字符串(C字符串)的末尾都带有一个隐含的“字符串结束标志”,以字符0代表(空操作符)。用0来作为字符串结束标志,不会产生任何操作或增加任何实际字符,只起到一个标志作用。,返回本节,因此,对于长度(字符个数)为n的C字符串,其占用内存为n1个字节空间。根据这一特点,用字符数组处理C字符串时,数组的元素个数(数组长度)也必须比C字符串中实际字符的个数多1。例如,C字符串“program”用字符数组str存储和处理时,数组长度应该比这个C字符串的7个字符数多1,即应该有8个数组元素 。,下一页,我们对字符数组初

16、始化的方法加以补充。这种方法就是用字符串常量来给字符数组初始化。 例如: char str =”program”; 也可以省略花括号,直接写成 static char str =”program”; 系统在字符串常量的最后,自动加上一个0。 所以,上面的初始化等价于: static char str =p,r,o,g,r,a,m,0;,下一页,此外,在程序的执行语句部分,不允许把字符串赋值给一个数组。例如,下面的程序段中后两个语句是错误的: char str8; str8=”program”; /*错误在于这里的str8仅可以表示一个数组元素*/ str=”program”; /*错误在于st

17、r是地址常量,不能赋值*/,返回本节,6.4.3 字符数组与字符串的输入、输出,主要有两种方法: 1逐个字符输入输出。用格式符“c”输入和输出一个字符。 2将整个字符串一次输入和输出。用格式符“s”。,返回本节,说明以下几点: 1字符串结束标志0不输出。 2用格式符“s”输出整个字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。 3如果字符数组长度大于字符串的实际长度,则只输出到第一个0结束。如 static char c10=“good”; printf(“%s”, c); 也只输出“good”四个字符,而不是10个字符。,下一页,4用格式符“s”输入整个字符串时,scan

18、f函数中的输入项是字符数组名。数组名代表了该数组的存储区域的首地址,因此无需在字符数组名前加取地址符是不对的。 5如果利用一个scanf函数输入多个字符串,则各字符串以空格、回车或tab键分隔。,返回本节,6.4.4 字符串处理函数,1字符串输入函数gets() 调用形式:gets(字符数组); 其中,参数是用来接收输入字符串的字符数组名。 函数作用:该函数从键盘上输入一个字符串,存放到字符数组。输入的字符串以回车符作为结束符。在将输入的字符串存入内存时,字符串末尾的回车符自动变换成0,从而使它成为字符串。,返回本节,例6.11使用gets()函数输入一个字符串后,再将其输出到屏幕上。 # i

19、nclude main() char line81; printf( Input a string: ); gets( line ); printf(The line entered was: %sn,line ); ,返回本节,2字符串输出函数puts() 调用形式:puts(字符数组) 其中,参数可以是字符数组名或合法的地址;也可以是用双引号括起来的字符串常量。 函数作用:将参数中的字符串输出到屏幕上。 例如: puts(“hello”); 可以将“hello”字符串输出到屏幕。,返回本节,例6.12将例6.11中读到的字符串改用puts()函数输出。 # include main() c

20、har line81; printf( Input a string: ); gets(line ); puts(line ); ,返回本节,3字符串连接函数strcat() 调用形式:strcat(字符数组1,字符数组2) 函数作用:连接两个字符数组中的字符串,把字符串2接到字符串1的后面,连接的结果放在字符数组1中,函数调用后的返回值为字符数组1的地址。 static char str120=“very ”; static char str2 =“good”; puts(strcat(str1, str2); 输出为: very good,返回本节,这里要注意两点: (1)在定义字符数组1

21、时,数组长度要足够大,要能容纳连接后的新字符串。 (2)连接之前,两个字符串的后面都有一个0,连接时字符串1后面的0被字符串2的第一个字符取代,只在新串最后保留一个0。,返回本节,4字符串拷贝函数strcpy() 调用形式:strcpy(字符数组1,字符数组2) 函数作用:将字符串2拷贝到字符串1中。 例如: static char str110, str2 =”good”; strcpy(str1,str2); puts(str1); 输出为 good,返回本节,说明: (1)字符数组1的长度要足够大,以容纳拷贝过来的字符串。 (2)第一个参数,即字符数组1,必须写成数组名形式,而字符数组2

22、可以是数组名形式,也可以是一个字符串常量。如 strcpy(str1, “good”);与前例作用相同。 (3)拷贝时,字符数组2最后的串结束标志符0被一起拷贝到字符数组1中。 (4)不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。如: str1=“good”;str2=str1; 两条语句都是不合法的。,返回本节,5字符串比较函数strcmp() 调用形式:strcmp(字符数组1,字符数组2) 函数作用:比较字符串1和字符串2。 字符串的比较规则是:对两个字符串自左向右逐个字符按照ASCII码大小进行比较,直到出现不同的字符或遇到0为止。如果全部字符均相同,则认为两个字符串相

23、等;若出现不同的字符,则以第一个不相同的字符的比较结果作为两个字符串的比较结果,并由函数值返回。,下一页,字符的比较: (1)若字符串1字符串2, 函数值为0。 (2)若字符串1字符串2, 函数值为一个正整数。 (3)若字符串1字符串2, 函数值为一个负整数。,返回本节,6字符串求长度函数strlen() 调用形式:strlen(字符数组) 其中,参数字符数组可以写成字符数组名形式,也可以是字符串常量。 函数作用:计算字符串的实际长度,即不包含0。 如:printf(“%d”, strlen(“good”); 输出结果为4。,返回本节,6.5 字符串处理应用举例,6.5.1 字符串处理函数应用

24、 6.5.2 字符串查找 6.5.3 字符串插入 6.5.4 字符串删除,返回本章首页,6.5.1 字符串处理函数应用,例6.13字符串处理函数应用举例 (源程序:L0613.c ),返回本节,6.5.2 字符串查找,例6.14在字符串中查找一个字符,输出该字符在串中第一次出现的位置,若串中没有该字符,则输出1。 分析:要在字符串中查找某一个字符,必须从串首位置开始,依次拿字符串中的元素与该字符进行比较。如果字符串中存在该字符,那么只需找到该字符在串中出现的第一个位置,就可以退出循环,而不必继续查找至串尾。 (源程序:L0614.c ),返回本节,例6.15在字符串S中查找子串T,返回子串T在主串S中首次出现的位置。 (板书讲解)(源程序:L0615.c ) 例6.16程序的功能是:统计字符串s2在字符串s1中出现的次数并得到第一次出现的位置,请填空。(Page:108-109) (源程序:L0616.c ),返回本节,6.5.3 字符串插入,例6.17在字符串s的第i个位置插入字符ch(ch0)。 在含有n个元素的数组中插入一个元素,插入位置i的取值范围是1in+1。当in+1时,是在数组尾部直接插入新元素。而字符串的第n个字符是0字符,不能在0后面插入

温馨提示

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

评论

0/150

提交评论