新编C语言程序设计教程PPT第6章数组2_第1页
新编C语言程序设计教程PPT第6章数组2_第2页
新编C语言程序设计教程PPT第6章数组2_第3页
新编C语言程序设计教程PPT第6章数组2_第4页
新编C语言程序设计教程PPT第6章数组2_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、新编c语言程序设计教程 清华大学出版社周二强 软件学院 计算机科学与工程系配套视频:配套视频: 博客:博客: 6章章 数组数组u6.3 6.3 字符数组和字符串字符数组和字符串6.3.1 字符数组6.3.2 字符串6.3.3 字符串输入输出6.3.4 字符串相关程序示例u6.4 6.4 综合示例:求大数的阶乘综合示例:求大数的阶乘 6.3.1 6.3.1 字符数组字符数组u字符数组是元素类型为字符型的数组,既有一维字符数字符数组是元素类型为字符型的数组,既有一维字符数组,又有多维字符数组。数组具有的特征,字符数组也不组,又有多维字符数组。数组具有的特征,字符数组也不例外。由于字符型的特殊性,在

2、使用字符数组时需注意:例外。由于字符型的特殊性,在使用字符数组时需注意:u1.1.虽然初始化数组时可以用各种形式的字符型字面量,虽然初始化数组时可以用各种形式的字符型字面量,但要考虑程序的可读性。如有但要考虑程序的可读性。如有char ca6=char ca6=c c, 72, , 72, 111111, , x4ex4e, , x41x41, , nn;语句时,字符型数组语句时,字符型数组caca的的各元素为各元素为u2. 2. 字符型与整型的区别与联系。字符型与整型的区别与联系。例6-11u例例6-11 6-11 输入由数字组成的一串字符,输出与这个数字输入由数字组成的一串字符,输出与这个

3、数字串相对应的整数。如输入串相对应的整数。如输入523523回车(回车(5 5,2 2,3 3),则输),则输出出523523(五百二十三)。(五百二十三)。u分析:用字符数组存储这个数字串;用循环获得输入,分析:用字符数组存储这个数字串;用循环获得输入,遇到回车符时结束。为了便于处理,可在这个数字串的末遇到回车符时结束。为了便于处理,可在这个数字串的末尾加一个空字符(尾加一个空字符(nullnull)作为结束标志。)作为结束标志。 例6-11return6.3.2 字符串u前面指出,字符串就是用一对双撇号(前面指出,字符串就是用一对双撇号()括起来的一)括起来的一串字符型字面量。这样理解字符

4、串不太确切。串字符型字面量。这样理解字符串不太确切。c c语言规定,语言规定,字符串必须以空字符字符串必须以空字符00结束。因此,字符串是用一对双结束。因此,字符串是用一对双撇号(撇号()括起来的以空字符)括起来的以空字符00结束的一串字符型字面结束的一串字符型字面量。量。u作为结束标志的空字符作为结束标志的空字符00显然不能出现在字符串的中显然不能出现在字符串的中间,因为在字符串中只要遇到空字符间,因为在字符串中只要遇到空字符00,就认为字符串,就认为字符串已经结束。已经结束。字符串u为简便在书写时经常忽略字符串的结束标志为简便在书写时经常忽略字符串的结束标志00,但在,但在使用时系统会自动

5、在字符串后面加上结束标志。如字符串使用时系统会自动在字符串后面加上结束标志。如字符串chinachina的实际长度(包括空字符的实际长度(包括空字符00)为)为6 6,有效长度是,有效长度是5 5。字符串u在在c c语言中常用字符数组存储字符串。存放在字符数组语言中常用字符数组存储字符串。存放在字符数组中的字符串分散成了一个个字符变量,因此很容易进行与中的字符串分散成了一个个字符变量,因此很容易进行与字符串相关的操作,如查找某个字符是否包含在字符串等。字符串相关的操作,如查找某个字符是否包含在字符串等。uc c语言中,字符串可以用来初始化字符数组。如语言中,字符串可以用来初始化字符数组。如ch

6、ar char c = china;c = china;或直接写成或直接写成char c = china;char c = china;。注意u1. 1. 上面的初始化语句与上面的初始化语句与char c = char c = c c,h h,i i,n n,a a ;并不等价,;并不等价,u而与而与char c6=char c6=c c,h h,i i,n n,a a,00 ;等价;等价(最后一个空字符可以省略而自动赋值为(最后一个空字符可以省略而自动赋值为00)。)。u2. 2. 设设c c是一个长度为是一个长度为1010的字符数组,则赋值语句的字符数组,则赋值语句c = c = chin

7、achina;并不正确,;并不正确,u用字符串直接给字符数组赋值的格式只能用于初始化语用字符串直接给字符数组赋值的格式只能用于初始化语句。句。char c = china;char c = china;return6.3.3 6.3.3 字符串的输入输出字符串的输入输出u用用printfprintf函数和函数和scanfscanf函数输入输出字符串时用格式符函数输入输出字符串时用格式符串串“%s”%s”。如有。如有char c = china;char c = china;,则语句,则语句printf(%s, c);printf(%s, c);的输出结果为的输出结果为chinachina,在用

8、,在用printfprintf函数函数输出字符串时需注意:输出字符串时需注意:u1.1.与格式符串与格式符串“%s”%s”对应的变量为数组名对应的变量为数组名c c,而非数组,而非数组元素元素c0c0u(c0c0是一个字符变量与格式符串是一个字符变量与格式符串“%c”%c”相对应)。相对应)。u2.2.字符串中的结束标志空字符字符串中的结束标志空字符00并不输出。并不输出。注意:unownowu输出字符串时,遇到结束标志空字符输出字符串时,遇到结束标志空字符00时输出就结束时输出就结束了。了。字符串的输入字符串的输入u如有如有char c = i am ready!; scanf(%s, c)

9、 char c = i am ready!; scanf(%s, c) ,则从键盘输入则从键盘输入chinachina并回车后,数组并回车后,数组c c的状态为的状态为 一次输入多个字符串u一次输入多个字符串时,空格符可用来分隔字符串一次输入多个字符串时,空格符可用来分隔字符串u如有如有char str010, str110, str210;char str010, str110, str210;uscanf(%s%s%s, str0, str1, str2);scanf(%s%s%s, str0, str1, str2);u则输入则输入are you readyare you ready?回

10、车时,各个数组的状态为?回车时,各个数组的状态为scanf函数遇到空格符便认为一个字符串输入结束有时会带来不便,如无法通过scanf (%s, str);语句,把字符串are you ready?输入到字符数组str中。 专用的输入输出函数u 标准函数库(标准函数库(stdio.hstdio.h)中也为字符串提供了专用的输)中也为字符串提供了专用的输入输出函数:入输出函数:putsputs函数和函数和getsgets函数。函数。 uputsputs函数的使用形式为:函数的使用形式为: putsputs(字符数组变量);(字符数组变量);u其作用是将字符数组中存储的字符串输出到输出设备上。其作用

11、是将字符数组中存储的字符串输出到输出设备上。u如有如有char str =henannchinachar str =henannchina;,则;,则puts(str)puts(str);的输出结果为:的输出结果为:henanhenan china chinauputsputs函数输出完字符串后会自动换行,也就是说函数输出完字符串后会自动换行,也就是说putsputs(strstr);与);与printfprintf(%sn%sn,strstr);等价。);等价。 gets函数ugetsgets函数的使用形式为:函数的使用形式为:gets(gets(字符数组变量字符数组变量) );u其作用是把

12、输入设备输入的字符串存储到字符数组中。其作用是把输入设备输入的字符串存储到字符数组中。如有语句如有语句gets(str)gets(str);,从键盘输入:;,从键盘输入:uare you readyare you ready?回车?回车u则字符数组则字符数组strstr中的字符串为中的字符串为are you readyare you ready? 。也就。也就是说是说getsgets函数认为空格符只是字符串中的一个普通字符,函数认为空格符只是字符串中的一个普通字符,回车才是一个字符串输入结束的唯一标志,这是它与回车才是一个字符串输入结束的唯一标志,这是它与scanfscanf函数的最大区别。函

13、数的最大区别。return6.3.4 6.3.4 字符串相关程序示例字符串相关程序示例u例例6-12 6-12 有语句有语句scanf(%d%d, &m, &n);scanf(%d%d, &m, &n);,当用键盘输,当用键盘输入入23 5223 52回车时,变量回车时,变量m,nm,n的值分别为的值分别为2323和和5252。整个过程可。整个过程可简单地理解为:系统首先把来自键盘的输入放在一个字符简单地理解为:系统首先把来自键盘的输入放在一个字符数组中,遇到回车符后就把该字符数组交由数组中,遇到回车符后就把该字符数组交由scanfscanf函数处函数处理。理。scanfscanf函数根据格式

14、符,把字符串转换成相对应类型函数根据格式符,把字符串转换成相对应类型的数据,并赋给对应的变量。的数据,并赋给对应的变量。uscanfscanf函数的本次处理过程可简单模拟如下:函数的本次处理过程可简单模拟如下:例6-12例6-13 比较两个字符串的大小。u分析:比较两个字符时,分析:比较两个字符时,asciiascii码大的字符大于码大的字符大于asciiascii码码小的字符。比较两个字符串的大小时,从左向右依次比较小的字符。比较两个字符串的大小时,从左向右依次比较它们所含的字符,它们所含的字符,u如果相应位置上的字符不相同,如果相应位置上的字符不相同,u则停止比较且相关字符串的大小就看此位

15、置上的字符的则停止比较且相关字符串的大小就看此位置上的字符的大小。两个字符串完全一样时,显然它们相等。大小。两个字符串完全一样时,显然它们相等。例6-13return6.4 6.4 综合示例:求大数的阶乘综合示例:求大数的阶乘u求阶乘的算法比较简单,但由于基本数据类型取值范围求阶乘的算法比较简单,但由于基本数据类型取值范围的限制,无法求出稍大数的阶乘。的限制,无法求出稍大数的阶乘。u无符号长整型的最大取值约为无符号长整型的最大取值约为4343亿即亿即1010位整数;双精度位整数;双精度浮点数的最大取值虽然可以达到浮点数的最大取值虽然可以达到300300位,但它的精度有限,位,但它的精度有限,只

16、能准确表示约只能准确表示约1616位的数。一个稍大点整数的阶乘往往成位的数。一个稍大点整数的阶乘往往成百上千位,显然不能用百上千位,显然不能用c c语言中的基本数据类型表示。语言中的基本数据类型表示。 大整数的表示如何表示大整数呢?如何表示大整数呢?258520167388849766400002585201673888497664000025852 01673 88849 76640 00025852 01673 88849 76640 000258 52016 73888 49766 40000258 52016 73888 49766 40000258522585201673016738

17、88498884976640766400000004000040000497664976673888738885201652016258258大整数的表示u数组的长度可以很大,因此可以用无符号长整型的一维数组的长度可以很大,因此可以用无符号长整型的一维数组一个大整数。数组的每个元素表示整数的一位或几位。数组一个大整数。数组的每个元素表示整数的一位或几位。如定义一个长度为如定义一个长度为1010万的无符号长整型一维数组,让每个万的无符号长整型一维数组,让每个数组元素表示整数的数组元素表示整数的5 5位,则该数组可以表示一个长达位,则该数组可以表示一个长达5050万位的大整数。万位的大整数。u现有

18、现有unsigned long result50000 = 0unsigned long result50000 = 0;,如果用;,如果用数组数组resultresult存储整数存储整数1212的阶乘的阶乘479001600479001600,则数组,则数组resultresult的状态为:的状态为:输出大整数u注意:整数注意:整数5 5位一组,由低位到高位依次存储在数组中。位一组,由低位到高位依次存储在数组中。result0result0的值为的值为16001600(并非(并非0160001600),输出时),输出时u用语句用语句printf(%5d%05dprintf(%5d%05d,r

19、esult1result1,result0)result0);就可输出整数就可输出整数479001600479001600。 计算过程u1313的阶乘的阶乘62270208006227020800,数组,数组resultresult计算过程u设数组设数组resultresult中的值为中的值为1313的阶乘的阶乘62270208006227020800,此时,此时result0result0的值为的值为2080020800,result1result1的值为的值为6227062270。u设整型变量设整型变量ivalidivalid的值为数组的值为数组resultresult中非零元素的最大中非

20、零元素的最大下标,则这里下标,则这里ivalidivalid的值为的值为1 1。用数组。用数组resultresult存储的大整存储的大整数乘以数乘以1414得到得到1414的阶乘的过程如下:的阶乘的过程如下:第一步u第一步:第一步:resultresult中的有效元素(非零元素)分别乘以中的有效元素(非零元素)分别乘以1414;u此为循环,循环变量此为循环,循环变量j j由由0 0至至ivalidivalid,对于第,对于第j j次循环有次循环有resultj resultj * *= 14= 14。( (相乘后,相乘后,result0result0的值为的值为291200291200,result1result1的值为的值为871780)871780)第二步:“进位”处理。u相乘后,相乘后,result0result0的值为的值为291200291200,result1result1的值为的值为871780871780uresultresult中的每位数组元素只能存中的每位数组元素只能存5 5位,相乘后多出的位

温馨提示

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

评论

0/150

提交评论