数据结构域算法设计-第11讲 字符串教案

上传人:woxinch****an2018 文档编号:39302258 上传时间:2018-05-14 格式:DOC 页数:28 大小:644KB
返回 下载 相关 举报
数据结构域算法设计-第11讲  字符串教案_第1页
第1页 / 共28页
数据结构域算法设计-第11讲  字符串教案_第2页
第2页 / 共28页
数据结构域算法设计-第11讲  字符串教案_第3页
第3页 / 共28页
数据结构域算法设计-第11讲  字符串教案_第4页
第4页 / 共28页
数据结构域算法设计-第11讲  字符串教案_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《数据结构域算法设计-第11讲 字符串教案》由会员分享,可在线阅读,更多相关《数据结构域算法设计-第11讲 字符串教案(28页珍藏版)》请在金锄头文库上搜索。

1、第第 11 讲讲 字符串字符串学习目标:学习目标: 1、掌握字符串常量和字符串变量的定义。 2、掌握字符串的输入输出。 3、识记常用的字符串函数。 4、灵活运用字符串函数解决实际的问题。 字符串,顾名思义,就是一串字符。在现实生活中,有很多数据都是以字符串的形式 存储的,例如姓名、指令等等。 将介绍字符串数据类型及其用法,借助字符串丰富的过程与函数可以使许多问题化难为易。一、一、问题导引分析问题导引分析统计单词(统计单词(countcount)【问题描述问题描述】 读入一段文章,以单独的一行“#”结束。统计这段文章出现的单词数(可以保证,文章的 单词以空格或回车作为分隔符,有可能在行末出现连字

2、符“” ,在这种情况下行末的单词 与下一行第一个单词算是一个单词) 。输入格式:若干行:表示一段文章。输出 式:一行: 一个整数,表示文章中的单词数。输入样例:WeareallChinese. I loveyou and you love me.We l-ove each other.#输出样例:15 【问题分析问题分析】题目中明确给出了单词之间的分隔符, 是如何获取单词呢?也许可以一个字符一 个字符地读入,边读入边判断是否读到了分隔符,然后统计单词的个数。这个方法固然 能解决问题,但是数据的存取还是麻烦。【算法描述算法描述】(1)单词计数器初始化为 0;(2)读入文章的一行当该行不是#时,重

3、复操作:找到分隔符,则计数器加 1;更新表达式;如果该行最后不是连字符,则计数器再加 1;读入下一行; (3)输出计数器的结果;(4)结束。【解决方案解决方案】从上例的分析中,可以看出:对于一长串字符的操作是问题的难点所在。 我们迫切需要一种新的数据类型,以方便处理这类操作。在+语言中,字符串就是 这样的数据类型:它仅可以作为一个整体进行输入、输出、运算等操作,还有很多标准过 程和标准函数,能够直接完成分析中的大部分操作。二、字符串二、字符串1 1、 字符串的定义字符串的定义字符串是由零个或多个字符组成的有限序列。它是表示文本的数据类型。在实际 应用中,通常以字符串的整体作为操作对象,如:在字

4、符串中查找某个子串、截取一个子 串、在字符串的某个位置上插入一个子串或者删除一个子串等。(1 1)字符串常量字符串常量+语言中,字符串常量是由两个双引号括起来的字符序列, 如China、The Great Wall等。事实上,在前面的学习中,为显示输入和输出的提示信息,经常用到字 符串常量,例如:printf(Please Input m,n(mn):);执行这句程序之后,双引号中的字符串常量就会按原样显示出来。+语言规定,以 字符0(ASCII 码为 0)作为字符串的结束。系统会自动给字符串加上结束标。例如,hello!共有 6 个字符,但是在内存中存储时,占 7 个字节,这是因为系统自动在

5、 最后加上了一个字符0存放在了最后一个字节里。单个的字符也可以被看作是字符串常量,如G、甚至连(空串)也是 一个字符串常量(它的长度是 1)。这时,需要注意字符常量和字符串常量是有区别的:两者的定界符不同。字符常量由单引号括起来,字符串常量由双引号括起来。字符常量只能是单个字符,字符串常量则可以是多个字符。可以把一个字符常量赋予一个字符变量,但不能把一个单个字符构成的字符串常量 赋予一个字符变量。字符常量占一个字节的内存空间,而字符串常量占的内存字节数等于字符串中字节 数加。增加的一个字节中存放字符0这个字符串结束标志。 例如: 符常量a和字符串常量a虽然都只有一个字符,但在内存中的情况是不

6、同的。 a在内存中占一个字节;在内存中占两个字节。(2)(2)字符串变量字符串变量在+语言中,字符串是作为一维数组存放在内存中的。事实上,最常用的字符数组 就是字符串。因此,字符串可以用如下格式定义:char 字符串名字符串长度;例如:char a30;这种定义的方式和数组基本相同,第一个元素同样是从 a0开始,而不是 a1。只是在初始化的时候,字符串的末尾,要加上结束标志字符0 ,用来表示这是一个字符 串,否则它就和普通的字符数组无异。例如:char s13=a, b, c ;char s23=a, b, 0 ; 其中,s2 是一个字符串,而 s1 是一般的一维字符数组。这是在实际操作中,要

7、特别注意 的地方:虽然字符串是一维数组,但是一维字符数组不等于字符串。在定义字符串时,要注意将字符串的长度足够大, 到这个字符串和终止字符0 都能装在这个字符数组中。除了上面与普通数组一样的初始化方法,还可以直接将一个字符串常量赋给一个字符 数组。例如:char s33=ab; 系统自动给 s3 添加一个字符串结束符0 。2 2、 字符串的输入输出字符串的输入输出既然字符串被作为一维字符数组来处理。那么字符串的输入和数组当然也可以按 照数组元素的输入和处理。本节仅介绍将字符串作为一个整体进行输入和输出的语句。(1 1)输入)输入 从键盘输入一个字符数组可以使用 scanf 语句或 gets 语

8、句。 scanfscanf 语句语句格式:scanf(%s,符串名称) ;说明:说明:这里的字符串名称之前不加是错误的。0标志, 因此输入时,仅输入字符串的内容即可。输入多个字符串时,以空格分隔。例如:scanf(%s%s%s,s1,s2,s3);从键盘分别输入 Let us go则三个字符串分别获取了三个单词。反过来可以想到,如果仅有一个输入字符串名称 的情况下,字符串变量仅获取空格前的内容。例如: scanf(%s,s1); 从键盘分别输入 Let us go,则仅有第一个单词被获取。 getsgets 语句语句格式:格式:gets(字符串名称);说明: 用 gets 只能输入一个字符串。

9、例如:gets(s1,s2);是错误的。使用 gets,是从光标开始的地方读到换行符也就是说读入的是一整行,使用 scanf, 是从光标开始的地方到空格,如果这一行没有空格,才读到行尾。例如:scanf(%s,s1);gets(s2);对于相同的输入 Hello World! s1 获取的结果仅仅是 Hello,而 s2 获取的结果则是 Hello World! 从文件输入字符串可以使用 fscanf 语句,与前面的介绍类似,不再重复。(2 2)输出)输出 向屏幕输出一个字符串可以使用 printf 语句或者 puts 语句。 printfprintf 语句语句格式:格式:printf(%s,

10、字符串名称) ;说明:用%s 格式输出时,printf 的输出项只能是字符串(字符数组)名称,而不能是数组 元素。例如:printf(%s,a5); 是错误的。输出字符不包括字符串结束标志符0 。如果字符数组的长度大于字符串的实际长度, 出时,只输出到0结束。例如:char a10=hello;printf(%s,a); 输出的内容仅有 hello 这 5 个字符, 不是 10 个字符。 putsputs 语句语句格式:格式:puts(字符串名称);说明:puts 语句输出一个字符串和一个换行符。对于已经声明过的字符串 a, puts(a)和 printf(“%sn” , )是等价的。 向文件

11、写字符串可以fprintf 语句, 体可参考前面章节的介绍。3 3、字符串函数、字符串函数 +语言提供了很多对字符串进行操作的标准函数,使用这些函数,需要在程序开头 加上头文件 string.h。常用的字符串函数见表 11.1表表 11.111.1 常用字符串函数常用字符串函数函数格式函数格式函数功能函数功能strcat(字符串名 1,字符串名 2)将字符串 2 连接到字符串 1 后边,返回字符串 1 的 值strncat(字符串名 1,字符串名 2)将字符串 s2 的前 n 个字符连接到字符串 1 后边, 回字符串 1 的值长度)strcpy(字符串名 1,字符串名 2)将字符串 2 复制到

12、字符串 1 中,返回字符串 1 的值strncpy(字符串名 1,字符串名 2, 长度) 将字符串中的至多前个字符复制到字符串中, 返回字符串 1 的值strcmp(字符串名 1,字符串名 2)比较字符串 1 和字符串 2 的大小,比较的结果由函 数带回:如果字符串 1字符串 2,返回一个正整数;如果字符串=字符串 2,返回 0;如果字符串 1canada,thisthat,her123)s2=good;必须相应地写成如下形式:srcpy(s1,s2);if(strcmp(s1,s2)=0) printf(OK!); if(strcmp(s1,123)0) s2=good;【实例实例 11.1

13、】11.1】 写出下面程序的运行结果。写出下面程序的运行结果。#include#include#include#includeusing namespace std;int main( )char s120,s220,s320,s420,s520;long answer;gets(s1);gets(s2);gets(s3);gets(s4);gets(s5);/体验 strcat 的用法strcat(s1,s2);printf(“%sn“,s1);/体验 strncat 的用法strncat(s2,s3,4);printf(“%sn“,s2);/体验 strcpy 的用法strcpy(s3,s

14、4);printf(“%sn“,s3);/体验 strncpy 的用法strncpy(s3,s4,4);printf(“%sn“,s3);/体验 strcmy 的用法answer=strcmp(s4,s5);printf(“%dn“,answer);/体验 strncmp 的用法answer=strncmp(s4,s5,5);printf(“%dn“,answer);/体验 strlen 的用法answer=strlen(s4);printf(“%dn“,answer);strcat(s4,s5);printf(“%sn“,s1);answer=strlen(s4);printf(“%dn“,

15、answer);/体验 strlwr 和 strupr 的用法printf(“%sn“,s5,strlwr(s5);printf(“%sn“,s5,strupr(s5);system(“pause“);return 0;输入为:输入为:输出为:输出为:三三 、字符串的应用、字符串的应用【实例实例 11.2】11.2】表达式求值(表达式求值(evaluationevaluation)【问题描述问题描述】计算仅含有加法计算的表达式的值。该表达式长度不超过 250,中间没有空格与括号, 并且计算结果在整数范围内。输入格式:一行: 一个仅含有加法计算的表达式。输出格式:一行: 一个整数,表示计算结果。输入样例:12+23+21输出样例:56 【问题分析问题分析】如果确定了操作数和操作符的位置,进行加法计算并不难。但是,本题的困难恰在 于如何区分操作数与操作符。根据分析,解决这个问题只是用字符串存储读入数据后,模 拟加法的操作,一步一步计算出最后的结果。事实上,很多问题都是如此,很难建立递推、回溯等算法,甚至建立不了数学模型, 但是问题的描述和解决方法已经很清楚,只需要按照描述一步一步执行就能得出最终的解 答。这种方法就是计算机解决问题的一种最普遍、最直接的方法模拟法。模拟法解题,过程清晰,但是问题规模不能大,否则,就要考虑采用其他高效的策略。 【

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

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