字符串匹配实验
- 格式:doc
- 大小:43.50 KB
- 文档页数:5
字符及字符串输入输出与顺序程序设计实验实验报告2.2.1 实验目的1、学习和掌握字符及字符串的输入输出方法。
2、掌握顺序程序的设计方法。
3、进一步掌握调试工具的使用方法。
2.2.2 实验预习要求1、复习DOS功能调用中用于字符输入(功能号01H)、字符输出(功能号02H)、字符串输入(功能号为0AH)以及字符串输出(功能号09H)的调用方法(详见教材5.5.6)。
2、复习BCD码运算调整指令。
3、根据“2.2.3 实验内容”中给出的源程序框架编写完整的源程序,以便实验时调试。
4、从“2.2.4 实验习题”中任选一道题目,编写源程序,以便上机调试。
2.2.3实验内容从键盘输入两个一位十进制数,计算这两个数之和,并将结果在屏幕上显示出来。
1、问题分析比如使用功能号为01H的用于实现单个字符输入的DOS功能调用接收从键盘输入的两个十进制数8和6,这时计算机内部得到的是这两个数的ASCII码值38H和36H。
由于数字0 9的ASCII码值与其代表的数值之间相差30H,因此将其减去30H即可得到以非压缩型BCD数形式表示的十进制数08H和06H,使用ADD指令对它们进行相加后结果为0EH(00001110B),显然需要用非压缩型BCD数加法调整指令对ADD的运算结果进行调整,调整后得到两个非压缩型BCD数01H和04H,将它们分别加上30H后变为其对应的ASCII码31H(1的ASCII码)和34H(4的ASCII码),然后调用功能号为02H用于单个字符输出的DOS功能调用将它们显示出来。
综上所述,需要考虑以下问题。
(1)从键盘输入一个一位十进制数的方法通过功能号为1的DOS功能调用实现从键盘输入一个字符,格式如下:MOV AH, 01HINT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中SUB AL, 30H ;减去30H后得到键入数字所代表的数值(2)提示信息字符串的显示通过功能号为9的DOS功能调用实现字符串显示,注意字符串的最后一个字符必需为’$’。
VBA中常用的字符串匹配和替换方法在VBA中,字符串匹配和替换是常见的操作,可以帮助我们实现对文本的处理和转换。
本文将介绍VBA中常用的字符串匹配和替换方法,帮助读者更好地应用这些技巧。
在VBA中,实现字符串匹配和替换有多种方式,取决于我们的需求和具体的情况。
下面将介绍一些常用的方法。
1. 使用InStr函数进行字符串匹配InStr函数用于在一个字符串中查找子字符串的位置。
它返回子字符串在主字符串中第一次出现的位置。
我们可以利用这个函数来判断一个字符串是否包含某个特定的子字符串。
例如,我们可以使用以下代码来判断一个字符串变量str1是否包含子字符串"abc":```If InStr(str1, "abc") > 0 Then' 字符串包含子字符串"abc"Else' 字符串不包含子字符串"abc"End If```2. 使用Replace函数进行字符串替换Replace函数用于将一个字符串中的某个子字符串替换为另一个字符串。
它接受三个参数:原始字符串、被替换的子字符串和替换的字符串。
以下是一个简单的示例:```Dim str2 As Stringstr2 = "Hello, World!"str2 = Replace(str2, "Hello", "Hi")' 将"Hello"替换为"Hi"```在替换过程中,VBA会从左到右依次匹配并替换每一个子字符串。
如果替换的子字符串在原始字符串中出现多次,那么所有的匹配都会被替换。
需要注意的是,Replace函数是区分大小写的。
如果需要进行不区分大小写的替换,可以使用StrComp函数进行比较。
3. 使用Regular Expressions对象进行正则表达式匹配VBA中的正则表达式匹配可以使用Regular Expressions对象实现。
汇编语言实验7实验报告一、实验目的本次实验旨在通过汇编语言编写程序,实现对字符串的操作和输出。
二、实验内容1. 编写一个汇编程序,要求从键盘输入一个字符串,并将其逆序输出到屏幕上;2. 编写一个汇编程序,要求从键盘输入两个字符串,并将它们拼接起来后输出到屏幕上。
三、实验过程1. 字符串逆序输出程序首先,需要从键盘输入一个字符串。
为了方便起见,我们可以先规定字符串的最大长度为100。
接着,我们需要定义两个变量:```buffer db 100 ; 用于存储输入的字符串length dw ? ; 存储输入的字符串长度```其中,db代表定义字节型变量,dw代表定义双字节型变量。
然后,我们需要使用INT 21H中断来读取用户输入的字符串。
具体而言,我们可以使用下面这段代码:```mov ah, 0Ah ; 设置INT 21H功能号为0Ahmov dx, offset buffer ; 将buffer的地址传给DX寄存器int 21h ; 调用INT 21H中断```该代码会将用户输入的字符串存储在buffer中,并且将其长度存储在length变量中。
接着,我们需要将该字符串逆序输出到屏幕上。
为了实现这个功能,我们可以使用栈来存储字符串中的每个字符,并逐个弹出来输出。
具体而言,我们可以使用下面这段代码:```mov si, offset buffer + 1 ; 将si寄存器指向字符串的第一个字符mov cx, length ; 将cx寄存器设置为字符串长度dec cx ; 字符串长度需要减1reverse:push byte ptr [si] ; 将当前字符压入栈中inc si ; 指向下一个字符loop reverse ; 循环直到所有字符都被压入栈中mov ah, 02h ; 设置INT 21H功能号为02h,表示输出一个字符print:pop dx ; 弹出栈顶元素int 21h ; 输出该字符loop print ; 循环直到所有字符都被弹出并输出完毕```2. 字符串拼接程序首先,需要从键盘输入两个字符串。
Python字符串匹配之6种⽅法的使⽤详解1. re.match 尝试从字符串的起始位置匹配⼀个模式,如果不是起始位置匹配成功的话,match()就返回none。
import reline="this hdr-biz 123 model server 456"pattern=r"123"matchObj = re.match( pattern, line)2. re.search 扫描整个字符串并返回第⼀个成功的匹配。
import reline="this hdr-biz model server"pattern=r"hdr-biz"m = re.search(pattern, line)3. Python 的re模块提供了re.sub⽤于替换字符串中的匹配项。
import reline="this hdr-biz model args= server"patt=r'args='name = re.sub(patt, "", line)4. compile 函数⽤于编译正则表达式,⽣成⼀个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使⽤。
import repattern = pile(r'\d+')5. re.findall 在字符串中找到正则表达式所匹配的所有⼦串,并返回⼀个列表,如果没有找到匹配的,则返回空列表。
import reline="this hdr-biz model args= server"patt=r'server'pattern = pile(patt)result = pattern.findall(line)6. re.finditer 和 findall 类似,在字符串中找到正则表达式所匹配的所有⼦串,并把它们作为⼀个迭代器返回。
实验一串匹配程序设计(2学时)一、实验目的(1). 熟练掌握串匹配的含义(2). 掌握BF算法匹配的过程并编程实现(3). 熟悉C++编译环境的基本操作二、实验内容给定两个字符串S和T,用BF算法,在主串S中查找字串T,输出结果,输出时要求有文字说明。
请编写程序。
三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(匹配成功或不成功)(3)、写出完整的程序四、实验结果实验二排序问题程序设计(2学时)一、实验目的(1). 掌握选择排序和起泡排序的基本思想(2). 掌握两种排序方法的具体实现过程(3). 在掌握的基础上编程实现两种排序方法二、实验内容输入一个待排序的序列,分别用选择排序和起泡排序两种排序方法将其变换成有序的序列,输出结果,输出时要求有文字说明。
请编写程序。
三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(序列本身已是有序序列,序列不是有序序列)(3)、写出完整程序四、实验结果实验三数字旋转方阵程序设计(2学时)一、实验目的(1). 掌握分治法的设计思想(2). 掌握数字旋转方阵的具体实现过程(3). 熟练掌握二维数组的使用方法(4). 在掌握的基础上编程实现数字旋转方阵的实现过程二、实验内容给出一个初始数据,在此数据的基础上由外层向里层填写数据,完成一个数字旋转方阵,输出结果,输出时要求有文字说明。
请编写程序。
三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(方阵有一层,两层或更多层)(3)、写出完整程序四、实验结果实验四排序中分治法的程序设计(2学时)一、实验目的(1). 掌握归并排序和快速排序的划分方法(2). 掌握归并排序和快速排序的具体分治策略(3). 在掌握的基础上编程两种排序方法的实现过程二、实验内容给出一个初始序列,分别用归并排序和快速排序两种分治法将所给序列变换为有序序列,输出结果,输出时要求有文字说明。
大数据预处理字符串与字段操作实验报告一、实验目的。
咱们这次做这个实验啊,主要就是想学会怎么处理电商用户评论数据里的字符串和字段。
比如说,把用户那些乱七八糟的评论整理得清楚一点,把有用的信息挑出来,方便后面分析用户到底喜欢啥,不喜欢啥。
二、实验数据。
三、实验步骤。
# (一)数据清洗。
1. 去除重复数据。
为啥要去除重复数据呢?因为有时候可能因为网络问题或者其他原因,会有一些评论重复出现。
比如说,有个用户不小心点了两次提交评论,那我们就只需要保留一条就够了。
具体操作就是用一些工具或者编程语言里的函数,把重复的评论找出来删掉。
像Python里的pandas库就有很方便的方法可以做到这个。
2. 处理缺失值。
有些评论可能因为用户没写完或者其他原因,会有信息缺失的情况。
比如说,评论里只写了“挺好的”,但是没说具体是哪个方面挺好的。
这时候我们可以选择把这些缺失值填充上一些默认的值,比如“无”,或者根据其他评论的情况来推测一个合理的值填上去。
# (二)字符串操作。
1. 大小写转换。
有些用户写评论的时候可能大小写不规范,一会儿大写一会儿小写的。
为了方便统一处理,我们可以把所有的评论都转换成小写或者大写。
比如说,“Good”和“good”其实表达的是一个意思,转换成一样的形式后,后面分析起来就不容易出错。
在Python里,用字符串的lower()或者upper()方法就能轻松实现大小写转换。
2. 去除特殊字符。
评论里可能会有一些特殊字符,像标点符号、表情符号啥的。
这些字符对我们分析内容可能没什么帮助,还会增加处理的难度。
所以我们要把它们去掉。
比如说,“这个产品 真不错!”,经过处理后就变成“这个产品真不错”。
可以用正则表达式来匹配这些特殊字符,然后替换掉。
# (三)字段操作。
1. 提取关键信息。
从评论里提取出关键信息很重要哦。
比如说,我们想知道用户对产品的评价是正面的还是负面的,那就可以根据评论里的一些关键词来判断。
java string matches方法Java string matches方法是一种用于查找字符串匹配的方法,通常用于在程序中执行字符串匹配操作。
下面是该方法的详细信息和示例。
## 方法名称string matches方法## 方法简介返回一个布尔值,表示指定的字符串是否与另一个字符串匹配。
如果两个字符串匹配,则返回true;如果两个字符串不匹配,则返回false。
## 方法参数str : 要匹配的字符串## 方法示例以下是一个简单的示例,演示了如何使用Java string matches方法来查找字符串中的子串:```String str1 = "hello world";String str2 = "hello";boolean match = str1.matches(str2);System.out.println(match); // 输出: true```在这个示例中,我们要查找"hello world"和"hello"中的子串"world"。
结果,"hello world"和"hello"都匹配,因此返回true。
## 方法拓展除了查找子串,string matches方法还可以用于查找整个字符串中的子串。
以下是一个简单的示例,演示了如何使用Java string matches方法来查找字符串中的子串:```String str1 = "hello world";String str2 = "hello";boolean match = str1.matches(str2);System.out.println(match); // 输出: true```在这个示例中,我们要查找"hello world"和"hello"中的子串"world"。
string match lua 匹配规则Lua是一种快速、轻量级和可扩展的脚本语言,广泛应用于游戏开发、Web开发和其他领域。
在Lua中,字符串匹配是一项非常重要的操作,用于搜索、替换和验证文本数据。
Lua提供了一些内置函数,如string.match()和string.gmatch(),用于匹配字符串。
这些函数使用一种称为模式匹配的语法来描述匹配规则。
下面是一些常用的模式匹配符号:- ^:表示匹配字符串的开头- $:表示匹配字符串的结尾- .:表示匹配任意字符- %a:表示匹配任意字母- %d:表示匹配任意数字- %s:表示匹配任意空白字符- %w:表示匹配任意字母和数字- +:表示匹配前一个字符的一个或多个重复- *:表示匹配前一个字符的零个或多个重复- ?:表示匹配前一个字符的零个或一个重复- []:用于匹配一组字符中的任何一个字符- [^]:用于匹配不在一组字符中的任何一个字符例如,以下代码将匹配字符串'hello world'中的'world':local str = 'hello world'local matchStr = string.match(str, 'world$')print(matchStr) -- 输出: world在模式匹配中,还可以使用括号来捕获匹配的子字符串。
以下代码将匹配字符串'hello world'中的'hello'和'world':local str = 'hello world'local matchStr1, matchStr2 = string.match(str, '(%w+) (%w+)')print(matchStr1, matchStr2) -- 输出: hello world 除了单个字符串的匹配,Lua还支持在字符串中查找所有匹配的子字符串。
CC++下scanf的%匹配以及过滤字符串问题最近在写⼀个测试的⼩程序,由于⽤到了sscanf函数对字符串进⾏标准读⼊,⽽sscanf在很多⽅⾯都与scanf⽐较相像,于是对scanf进⾏了⼀番测试,遇到了⼀系列基础性的问题,恶补基础的同时也体现了⾃⼰的薄弱。
话不多说,直接附上问题吧。
问题描述#include<stdio.h>#include<string.h>int main(){while(1){char str[256]={0};int a=0;char b='\0';printf("please input the num:\n");scanf("%[^,],%[^,],%d",str,&b,&a);printf("input is str: %s b: %c a: %d And str length is %u, the first character is %u\n",str,b,a,strlen(str),str[0]);//gets(str);}return 0;}在这段代码⾥,如果我初始输⼊"a,a,0",输出正确。
但输⼊",,0"的话,接下来会⾃动不需要输⼊然后循环着不断的输出,想问⼀下这个是什么原因。
还有⼀个是我将代码改成了如下:#include<stdio.h>#include<string.h>int main(){while(1){char str[256]={0};int a=0;char b='\0';printf("please input the num:\n");scanf("%*[\n\r\t]%[^,],%[^,],%d",str,&b,&a);printf("input is str: %s b: %c a: %d And str length is %u, the first character is %u\n",str,b,a,strlen(str),str[0]);//gets(str);}return 0;}本来⽬的是过滤输⼊的回车,其中%*是过滤满⾜条件的字符,但是如果直接输⼊"a,a,0",也会出现不需要输⼊然后不断地循环输出的现象。
(此文档为word格式,下载后您可任意编辑修改!)华北电力大学实验报告||实验名称汇编语言程序设计课程实验课程名称汇编语言程序设计||专业班级:网络1002 学生姓名:学号:成绩:指导教师:王保义实验日期:2013.1实验1 用表格形式显示字符1、实验目的及要求(1)实验目的学习用汇编语言设计与编写循环程序。
(2)实验要求按15行×16列的表格形式显示ASCII码为10H---100H的所有字符,即以行为主的顺序及 ASCII码递增的次序一次显示对应的字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。
2、所用仪器、设备Masm for windows集成实验环境3、实验原理利用dos的02号显示输出功能调用,显示字符4、实验方法与步骤(1)编程思路:把dl初始化为10H,然后不断使其加一以取得下一个字符的ASCII码,直到dl 为100为止。
换行时用cx计数。
显示空白符时,用其ASCII码0置入dl寄存器,每行结束时,用显示回车和换行来结束本行并开始下一行。
由于逐个显示相继的字符时,需要保存并修改寄存器内容,而显示空格,回车,换行时,也要使用寄存器,用堆栈保存相继的字符。
(2)流程图5、分析与结论用表格形式显示字符这个程序做起来比较简单,用语句:mov bl,15,mov cx, 16来定义15行*16列的表格,loop lie语句循环输出每行的16个字符,先比较每一行的字符是否输出16个,如果是,则转到exit用mov ax,4c00h ,int 21h输出此行的字符,同时,行计数器随之增1,当行计数器增至15,证明字符表已经输完,完全显示出来,程序结束。
由于这个实验比较易于实现,先画出程序框图,之后就比较好编写,编程简单也比较快,所以没有遇到什么问题,最后的输出结果也是正确的。
实验二查找匹配字符串一、实验目的及要求(1)实验目的学习用汇编语言设计与编写循环程序。
第1篇一、引言随着信息技术的飞速发展,编程已经成为现代教育的重要组成部分。
字符串是编程语言中最基本的数据类型之一,它广泛应用于各种编程场景。
为了提高学生编程能力和实际应用能力,我校引入了头歌实践教学平台,该平台提供了丰富的教学资源和实践环境。
本文将针对头歌实践教学平台中的字符串模块进行教学实践,分析其教学效果和改进措施。
二、头歌实践教学平台字符串模块简介头歌实践教学平台字符串模块主要包括以下几个方面:1. 字符串基础操作:包括字符串的创建、拼接、截取、查找、替换等基本操作。
2. 字符串常用函数:如字符串长度计算、字符串大小写转换、字符串格式化等。
3. 字符串处理算法:如字符串排序、字符串匹配、字符串压缩等。
4. 字符串应用实例:如密码加密、数据校验、文本处理等。
三、教学实践过程1. 教学准备(1)熟悉头歌实践教学平台,了解字符串模块的功能和操作方法。
(2)查阅相关资料,整理字符串模块的教学内容。
(3)制定教学计划,确定教学进度。
2. 教学实施(1)导入:通过实例引入字符串的概念,让学生了解字符串在编程中的应用。
(2)讲解:讲解字符串的基本操作、常用函数、处理算法等知识,结合实例进行演示。
(3)练习:让学生在头歌实践教学平台上完成相关练习题,巩固所学知识。
(4)讨论:组织学生进行小组讨论,分享学习心得和遇到的问题。
(5)总结:总结本节课所学内容,布置课后作业。
3. 教学评价(1)课堂表现:观察学生在课堂上的参与度、提问和回答问题的积极性。
(2)作业完成情况:检查学生课后作业的完成质量,了解学生对知识的掌握程度。
(3)实践操作:在头歌实践教学平台上进行实践操作,检验学生的实际应用能力。
四、教学效果分析1. 学生对字符串模块的兴趣提高通过头歌实践教学平台,学生可以直观地看到字符串在编程中的应用,从而提高了学生对字符串模块的兴趣。
2. 学生编程能力得到提升在头歌实践教学平台进行字符串模块的学习,学生可以熟练掌握字符串的基本操作、常用函数、处理算法等知识,提高了编程能力。
第1篇一、实验目的本次实验旨在通过实际操作,加深对栈这一数据结构的理解,掌握栈的基本操作,包括初始化、入栈、出栈、取栈顶元素、判栈空等。
同时,通过实验练习,提高编程能力和问题解决能力。
二、实验内容1. 栈的定义及特点2. 栈的顺序存储结构3. 栈的链式存储结构4. 栈的基本操作5. 栈的应用实例三、实验过程1. 栈的定义及特点栈是一种后进先出(LIFO)的数据结构,它只允许在一端进行插入和删除操作。
栈的顶元素总是最后被插入的元素,也是最先被删除的元素。
2. 栈的顺序存储结构顺序存储结构是使用数组来实现栈。
定义一个数组作为栈的存储空间,同时定义一个指针top来指示栈顶元素的位置。
3. 栈的链式存储结构链式存储结构是使用链表来实现栈。
定义一个节点结构体,其中包含数据和指向下一个节点的指针。
头节点作为栈顶元素。
4. 栈的基本操作(1)初始化:创建一个空栈,top指针指向栈底。
(2)入栈:将新元素插入到栈顶。
如果栈满,则进行扩容。
(3)出栈:删除栈顶元素,并将其返回。
如果栈空,则返回错误信息。
(4)取栈顶元素:返回栈顶元素的值,但不删除栈顶元素。
(5)判栈空:判断栈是否为空,如果为空,则返回true;否则,返回false。
5. 栈的应用实例(1)括号匹配检验:利用栈判断一个字符串中的括号是否匹配。
(2)算术表达式求值:利用栈实现算术表达式求值,包括四则运算和括号。
四、实验结果与分析1. 初始化栈初始化栈后,栈为空,top指针指向栈底。
2. 入栈操作将元素1、2、3依次入栈,栈的状态如下:```top -> 3 -> 2 -> 1```3. 出栈操作依次出栈元素,栈的状态如下:```top -> 2 -> 1```4. 取栈顶元素取栈顶元素2,栈的状态不变。
5. 判栈空当栈中只有一个元素时,判断栈为空,返回false。
6. 括号匹配检验对于字符串"((()))",括号匹配检验结果为true;对于字符串"(()))",括号匹配检验结果为false。
数据结构字符串实验班级:计算机应用技术10-1 学号:10602101048 姓名:姚福刚一、实验目的及要求:掌握有关字符串的基本操作和存储结构,并编写相应的基本操作算法。
二、实验内容:(1) 求字符串的长度算法(2) 求字符串的拷贝算法(3) 字符串的连接算法(4) 字符串的比较算法(5) 字符串的逆置算法(6) 用strtok( )函数分离单词。
(选做)三、实验准备:1) 计算机设备;2) 程序调试环境的准备,如VC6或WIN-TC环境;3) 实验内容的算法分析与代码设计准备。
四、函数实现1、长度函数int strlen(char *p){ int count=0;while(*p!='\0'){ count++;p++;}return count;}2、拷贝函数void scopy(char *s1,char*s2) /* s1<---s2 */ { int len,i;len=strlen(s2);for(i=0;i<len;i++)s1[i]=s2[i];s1[i]='\0';return ;}3、连接函数void strcat(char *s1,char *s2){ int len1,len2;len1=strlen(s1);scopy(s1+len1,s2);return ;}4、比较函数int trcmp(char *s1,char *s2){ int i=0;while(s1[i]==s2[i]){ if(s1[i]=='\0') return 0;i++;}return (s1[i]-s2[i]);}5、逆置函数void ReverseStr(char *s){ int i,j;char t;for(i=0,j=strlen(s)-1;i<j;i++,j--){ t=s[i];s[i]=s[j];s[j]=t;}}五、测试(在主函数中调用函数测试功能)#include<stdio.h>#include<conio.h>#define MAXSIZE 80int main(void){ char p1[]="",p2[]="";printf("\n\t (1)p1->length=%d p2->length=%d\n",StrLen(p1),StrLen(p2)); Strcat(p1,p2);printf("\n\t (2)p1=%s\n",p1);printf("\n\t (3)the result is %d\n",Strcmp(p1,p2) );ReverseStr(p1);printf("\n\t (4)p1=%s\n",p1);getch();return 0;}实验截图:六、心得体会通过这次实验让我了解了什么是字符串,他是一种特殊的线性表,并了解有关字符串的基本操作和存储结构,并编写相应的基本操作算法。
现代网络搜索引擎一般使用基于字符串匹配的搜索方式,使用的软件核心之一是字符串模式匹配算法。
网络特别是Internet 的信息量极大,在相同的信息采集方式下网络搜索的时间主要取决于所使用的串匹配算法的效率。
改善串匹配算法的特性或者时间复杂度,将有效提高网络搜索引擎的性能。
所以算法的提出和后续改进的算法称为研究的重点。
模式匹配主要有BF 算法,KMP 算法,BM 算法及其改进算法,尤其是BM 算法,在实际应用中非常著名,在此我们将对这几种算法做简单分析,分析前,我们做如下假定:文本:]1..0[-n text n 为文本长度模式:]1..0[-m pat m 为模式长度2.1 BF 算法BF (Brute Force )算法又称为蛮力匹配算法[2],这是一种效率很低的算法,其算法主要思想是模式的第一个字符与文本的第一个字符进行比较,如果相同,就继续比较后面的字符,否则,文本的起始位置加1,即模式右移一个位置,再进行比较,如果模式与文本中一段连续字符串都相同,则匹配成功,返回当时文本的起始比较位置,否则匹配不成功,实现过程:在串text 和串pat 中比较的起始下标i 和j ;循环直到text 中所剩字符小于pat 的长度或pat 的所有字符均比较完(如果text[i]=pat[j],则继续比较text 和pat 的下一个字符;否则将i 和j 回溯,准备下趟比较);如果pat 中所有字符均比较完,则匹配成功,返回匹配的起始下标;否则匹配失败,返回0。
BF 算法如下:Algorithm BFk=0;j=0;while ((j<=m)&&(k<=n-m)){ if (pat[j]==text[k]){ k++;j++;}Else{k=k-j+1;j=0;}}if (j= =m) Match found at text[k-m]else No match found例子1:文本:astringsearchingexamplelienvolingrelatively模式串:relative1. astringsearchingexamplelienvolingrelativelyrelative2. astringsearchingexamplelienvolingrelativelyrelative3. astringsearchingexamplelienvolingrelativelyrelative4. astringsearchingexamplelienvolingrelativelyrelative:32. astringsearchingexamplelienvolingrelativelyrelative该算法简单,但是效率较低。
8086汇编语言程序实验:实验二、字符串匹配实验题目:1、(必做题)编程实现:从键盘分别输入两个字符串(不必等长),然后进行比较,若两个字符串有相同的字符,则显示“MATCH”,若字符都不相同则显示“NO MATCH”。
2、(选做题)编程实现:从键盘分别输入两个字符串,然后进行比较,若两个字符串的长度和对应字符都完全相同,则显示“MATCH”,否则显示“NO MATCH”。
对应程序如下所示:;第1题;====================================HUICHE MACRO ;定义一个具有回车、换行功能的宏,为程序多次回车换行所调用。
MOV DL,0DH ;用2号功能“显示”回车。
MOV AH,02HINT 21HMOV DL,0AH ;用2号功能“显示”换行。
MOV AH,02HINT 21HENDMDA TA SEGMENTMESSAGE1 DB 'MATCH','$' ;定义“MATCH”提示信息,“$”作为调用9号功能的结束符。
MESSAGE2 DB 'NO MATCH','$' ;定义“NO MATCH”提示信息。
TISHI1 DB 'Please input the first string:','$' ;提示输入第1个字符串的提示信息。
TISHI2 DB 'Please input the second string:','$' ;提示输入第1个字符串的提示信息。
STRING1 DB 100 ; 100为存第一个字符串的最大可用空间的字节数。
DB ? ;预留字节,存储将要输入的第1个字符串的实际长度。
DB 100 DUP(?) ;预留100个字节空间,用于存放第1个字符串。
STRING2 DB 100DB ?DB 100 DUP(?)DA TA ENDSSTACK SEGMENT ;定义一个50字节大小的堆栈段空间。
ZHAN DB 50 DUP(?)ZHANDING EQU LENGTH ZHANSTACK ENDSCODE SEGMENT ;代码段开始。
ASSUME CS:CODE,DS:DATA,ES:DA TA,SS:STACKSTARTUP: MOV AX,DA TA ;程序开始,首先将几个段寄存器初始化为各段的首地址。
MOV DS,AX ;MOV ES,AX ;MOV AX,STACK ;MOV SS,AX ;MOV SP,ZHANDING ;栈顶指针赋初值。
MOV DX, OFFSET TISHI1 ;用9功能显示提示输入第1个字符串的提示信息。
MOV AH,9INT 21HHUICHE ;调用宏定义的“回车换行”功能,程序运行到此处时进行回车换行。
MOV DX, OFFSET STRING1MOV AH,0AH ;用10号功能输入第1个字符串。
INT 21HHUICHEMOV DX, OFFSET TISHI2MOV AH,9INT 21HHUICHEMOV DX, OFFSET STRING2 ;输入第2个字符串。
MOV AH,0AHINT 21HHUICHECLD ; 方向标志位清0,按增址方向操作。
MOV SI, OFFSET STRING1[2] ;将第1个字符串第1个字符偏移地址传送给SI,为串搜索做准备。
MOV BX,0 ; BX为后面“记下第1个字符串已经被搜索过的字符的个数”做准备。
MOV CL, STRING1[1]MOV CH,0 ;将第1个字符串的实际长度赋给CX。
L1: PUSH CX ;先将第1个字符串的实际长度压入堆栈,保留,为后面备用。
MOV DI, OFFSET STRING2[2] ;将第2个字符串第1个字符偏移地址传送给DI,为串搜索做准备。
MOV CL, STRING2[1] ;将第2个字符串的实际长度传送给CX。
MOV CH,0MOV AL,[SI]REPNZ SCASB ;进行串搜索,将第2个字符串中的字符与第1个字符串的一个字符进行比较。
JZ XXX1INC SI ;SI加1,指向第1个字符串的下一个字符。
INC BX ;记下第1个字符串已经被搜索过的字符的个数。
POP CXCMP CX,BX ;“已经被搜索过的字符个数”BX与“第1个字符串实际长度”CX进行比较。
JNZ L1 ;若BX与CX不等,则进行“第1字符串的下一字符”与“第2字符串中的字符”的比较。
;若BX与CX相等,则进行执行下面的语句,显示“NO MACTH”。
MOV DX, OFFSET MESSAGE2 ;显示“NO MACTH”。
MOV AH,9INT 21HJMP XXX2 ;显示“NO MACTH”后,跳转到XXX2,准备返回DOS系统。
XXX1: MOV DX, OFFSET MESSAGE1 ;显示“MACTH”。
MOV AH,9INT 21HXXX2: MOV AH,1INT 21H ;等待键盘响应,准备返回DOS系统。
MOV AH,4CH ;返回DOS系统,准备结束程序。
INT 21HCODE ENDSEND STARTUP ;程序从此处结束。
;===============================================================;第2题;=======================HUICHE MACRO ;定义一个具有回车、换行功能的宏,为程序多次回车换行所调用。
MOV DL,0DHMOV AH,02HINT 21HMOV DL,0AHMOV AH,02HINT 21HENDMDA TA SEGMENTMESSAGE1 DB 'MATCH','$'MESSAGE2 DB 'NO MA TCH','$'TISHI1 DB 'Please input the first string:','$'TISHI2 DB 'Please input the second string:','$'STRING1 DB 100DB ?DB 100 DUP(?)STRING2 DB 100DB ?DB 100 DUP(?)DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DA TASTARTUP: MOV AX,DA TAMOV DS,AXMOV ES,AXMOV DX, OFFSET TISHI1MOV AH,9INT 21HHUICHE ;调用宏定义的“回车换行”功能,程序运行到此处时进行回车换行。
MOV DX,OFFSET STRING1MOV AH,0AHINT 21HHUICHEMOV DX, OFFSET TISHI2MOV AH,9INT 21HHUICHEMOV DX,OFFSET STRING2MOV AH,0AHINT 21HHUICHECLDMOV SI,OFFSET STRING1[2] ;将第1个字符串第1个字符偏移地址传送给SI,为串比较做准备。
MOV BL, STRING1[1]MOV BH,0 ; 将第1个字符串的实际长度赋给BX。
MOV DI,OFFSET STRING2[2] ;将第2个字符串第1个字符偏移地址传送给DI,为串比较做准备。
MOV CL, STRING2[1]MOV CH,0 ; 将第2个字符串的实际长度赋给CX。
CMP BX,CX ;比较两个字符串的长度JNE XXX0 ;若两个字符串的长度不相等,则转到XXX0处,显示“NO MACTH”。
REPE CMPSB ;进行串比较,将第2个字符串与第1个字符串按字符逐一进行比较。
JE XXX1 ;若经过比较,两字符串完全相等,则跳到XXX1处,显示“MACTH”。
;否则到XXX0处,显示“NO MACTH”。
XXX0: MOV DX, OFFSET MESSAGE2 ;显示“NO MACTH”。
MOV AH,9INT 21HJMP XXX2 ;显示“NO MACTH”后,跳转到XXX2,准备返回DOS系统。
XXX1: MOV DX, OFFSET MESSAGE1 ;显示“MACTH”。
MOV AH,9INT 21HXXX2: MOV AH,1 ;等待键盘响应,准备返回DOS系统。
INT 21HMOV AH,4CHINT 21H ;返回DOS系统,准备结束程序。
CODE ENDSEND STARTUP ;程序从此处结束。
;=====================================================。