实验三 数据串传送和查表程序
数据结构顺序串基本操作实验报告
数据结构顺序串基本操作实验报告实验目的:1.掌握顺序串的定义和基本操作;2.掌握顺序串的插入、删除、查找等基本操作。
实验内容:实现顺序串的基本操作,包括串的初始化、插入、删除、查找、输出等操作,并通过实例测试验证操作的正确性。
实验原理:顺序串是一种以连续的存储空间来存储字符序列的数据结构。
在顺序串中,字符串的字符元素依次存储在一组连续的存储单元中,可以通过下标来访问和修改元素。
顺序串的基本操作包括初始化、插入、删除、查找等。
1.串的初始化:初始化一个空串,即将串的长度设置为0。
2.串的插入:在指定位置插入一个字符或字符串。
首先需要判断插入位置的合法性,即位置不能超过当前串的长度,并将插入位置后的元素后移一位,然后将要插入的元素放入指定位置。
3.串的删除:删除指定位置的字符或字符串。
首先需要判断删除位置的合法性,即位置不能超过当前串的长度,然后将删除位置后的元素前移一位。
4.串的查找:在串中查找指定字符或子串第一次出现的位置。
遍历串中的每个元素,检查是否与要查找的字符或子串相等,若相等则返回其位置。
5.串的输出:将串中的元素打印出来。
实验步骤:1.定义顺序串的数据结构。
使用数组来存储字符序列,并定义一个变量用于记录串的长度。
2.初始化一个空串。
将串的长度设置为0。
3.实现插入操作。
根据插入位置的合法性,判断是否需要进行插入操作。
如果插入位置超过了当前串的长度,则将元素插入到串末尾;否则,将插入位置后的元素后移一位,并将要插入的元素放入指定位置。
4.实现删除操作。
根据删除位置的合法性,判断是否需要进行删除操作。
如果删除位置超过了当前串的长度,则无需删除;否则,将删除位置后的元素前移一位。
5.实现查找操作。
遍历串中的每个元素,检查是否与要查找的字符或子串相等,若相等则返回其位置。
6.实现输出操作。
遍历串中的每个元素,将其打印出来。
7.构造测试实例,并进行验证。
实验结果:以插入、删除、查找等操作为例,构造测试实例进行验证:假设有一个空串,插入字符'A'到位置0:结果为"A";在串的末尾插入字符'B':结果为"AB";在位置1插入字符'C':结果为"ACB";删除位置3的字符:结果为"AC";查找字符'C'的位置:结果为1实验总结:本次实验主要是对顺序串的基本操作进行了实现和验证。
实验三 数据串传送和查表程序
实验三数据串传送和查表程序实验目的通过实验掌握下列知识:1、堆栈。
堆栈指示器SP和堆栈操作指令PUSH和POP。
2、段寄存器和物理地址计算。
3、查表法和查表指令XLAT。
4、数据串传送程序和数据串传送指令MOVS、STOS及重复前辍REP。
5、循环指令ROL、逻辑与指令AND和清方向位指令CLD。
6、伪操作指令DB。
实验内容及步骤一、利用查表方法把DX的内容(十六进制数)转换成ASCII码1、用A命令键入下列程序:MOV BX,1000MOV DI,2000MOV CX,4LOP: PUSH CXMOV CL,4ROL DX,CLPOP CXMOV AL,DLAND AL,0FXLATCLDSTOSBLOOP LOPINT 202、用A命令在1000H处键入下列ASCII码并用D命令检查之:DB ‘0123456789ABCDEF’用D命令检查时注意左边的ASCII码值和右边的字符。
3、用R命令给DX送一个四位的十六进制数(例7F8E)。
4、用T命令逐条运行这程序到LOOP指令处,观察并记录每次运行结果,特别是SP和堆栈内容(用D命令检查)。
5、用G命令将此程序运行到结束,并用D命令检查2000H处所转换的结果。
可注意屏幕右边的ASCII字符与DX是否一致。
二、数据串搬家程序:1、用A命令键入下列程序:MOV SI,1000MOV DI,1500MOV CX,0FLOP: MOV AL,[SI]MOV [DI],ALINC SIINC DILOOP LOPINT 202、用A命令DB伪指令在1000H键入下列字符串:‘IBM_PC COMPUTER'3、用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致。
4、若此程序中的目的地址改为1002H,再运行此程序,看能不能把1000H开始的字符串搬到1002H开始的地方去?修改程序以做到这一点。
三、段寄存器概念及字符串传送指令练习1、用A命令键入下列程序:MOV SI,0MOV DI,0MOV AX,1000MOV DS,AXMOV AX,1500MOV ES,AXMOV CX,0FCLDREP MOVSBINT 202、用A命令DB伪指令在1000:0000处键入字符串'IBM_PC COMPUTER',并用D命检查之。
串操作实验报告
串操作实验报告
《串操作实验报告》
实验目的:通过对串操作的实验,掌握串的基本操作方法,提高对串操作的理解和掌握。
实验材料:计算机、编程软件、实验指导书。
实验步骤:
1. 字符串的输入输出:首先,我们学习了如何通过编程软件向计算机输入字符串,并且通过编程实现将字符串输出到屏幕上。
这一步骤帮助我们了解了如何使用编程语言来操作字符串。
2. 字符串的拼接:接着,我们学习了如何将两个字符串进行拼接。
通过实验,我们发现可以通过简单的加号操作符来实现字符串的拼接,这为我们在日后的编程中提供了很大的便利。
3. 字符串的截取:在实验中,我们还学习了如何通过编程语言来截取字符串的部分内容。
这一步骤让我们对于字符串的操作更加灵活,可以根据需要来截取所需的内容。
4. 字符串的比较:最后,我们学习了如何通过编程语言来比较两个字符串的内容。
这一步骤让我们对于字符串的比较有了更深入的理解,可以通过比较来判断字符串是否相等,或者哪个字符串的内容更大。
实验结果:通过这次实验,我们对于串操作有了更加深入的理解和掌握。
我们可以通过编程语言来实现对字符串的输入输出、拼接、截取和比较等操作,为日后的编程工作打下了坚实的基础。
结论:串操作是编程中非常重要的一部分,通过这次实验,我们对于串操作有
了更加深入的理解和掌握。
希望在日后的编程工作中能够更加灵活地运用串操作,提高编程效率和质量。
串-数据结构实验报告
串-数据结构实验报告串数据结构实验报告一、实验目的本次实验的主要目的是深入理解和掌握串这种数据结构的基本概念、存储方式以及相关的操作算法。
通过实际编程实现串的基本操作,提高对数据结构的理解和编程能力,培养解决实际问题的思维和方法。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理(一)串的定义串是由零个或多个字符组成的有限序列。
在本次实验中,我们主要关注的是字符串。
(二)串的存储方式1、顺序存储定长顺序存储:使用固定长度的数组来存储字符串,长度不足时用特定字符填充。
堆分配存储:根据字符串的实际长度动态分配存储空间。
2、链式存储每个节点存储一个字符,并通过指针链接起来。
(三)串的基本操作1、串的创建和初始化2、串的赋值3、串的连接4、串的比较5、求子串6、串的插入和删除四、实验内容及步骤(一)顺序存储方式下串的实现1、定义一个结构体来表示顺序存储的字符串,包含字符数组和字符串的实际长度。
```cppstruct SeqString {char str;int length;};```2、实现串的创建和初始化函数```cppSeqString createSeqString(const char initStr) {int len = strlen(initStr);SeqString s;sstr = new charlen + 1;strcpy(sstr, initStr);slength = len;return s;}```3、串的赋值函数```cppvoid assignSeqString(SeqString& s, const char newStr) {delete sstr;int len = strlen(newStr);sstr = new charlen + 1;strcpy(sstr, newStr);slength = len;}```4、串的连接函数```cppSeqString concatSeqString(const SeqString& s1, const SeqString& s2) {SeqString result;resultlength = s1length + s2length;resultstr = new charresultlength + 1;strcpy(resultstr, s1str);strcat(resultstr, s2str);return result;}```5、串的比较函数```cppint compareSeqString(const SeqString& s1, const SeqString& s2) {return strcmp(s1str, s2str);}```6、求子串函数```cppSeqString subSeqString(const SeqString& s, int start, int len) {SeqString sub;sublength = len;substr = new charlen + 1;strncpy(substr, sstr + start, len);substrlen ='\0';return sub;}```7、串的插入函数```cppvoid insertSeqString(SeqString& s, int pos, const SeqString& insertStr) {int newLength = slength + insertStrlength;char newStr = new charnewLength + 1;strncpy(newStr, sstr, pos);strcpy(newStr + pos, insertStrstr);strcpy(newStr + pos + insertStrlength, sstr + pos);delete sstr;sstr = newStr;slength = newLength;}```8、串的删除函数```cppvoid deleteSeqString(SeqString& s, int start, int len) {int newLength = slength len;char newStr = new charnewLength + 1;strncpy(newStr, sstr, start);strcpy(newStr + start, sstr + start + len);delete sstr;sstr = newStr;slength = newLength;}```(二)链式存储方式下串的实现1、定义一个节点结构体```cppstruct LinkNode {char data;LinkNode next;LinkNode(char c) : data(c), next(NULL) {}};```2、定义一个链式存储的字符串类```cppclass LinkString {private:LinkNode head;int length;public:LinkString(const char initStr);~LinkString();void assign(const char newStr);LinkString concat(const LinkString& other);int compare(const LinkString& other);LinkString subString(int start, int len);void insert(int pos, const LinkString& insertStr);void deleteSub(int start, int len);};```3、实现各个函数```cppLinkString::LinkString(const char initStr) {length = strlen(initStr);head = NULL;LinkNode p = NULL;for (int i = 0; i < length; i++){LinkNode newNode = new LinkNode(initStri);if (head == NULL) {head = newNode;p = head;} else {p>next = newNode;p = p>next;}}}LinkString::~LinkString(){LinkNode p = head;while (p) {LinkNode temp = p;p = p>next;delete temp;}}void LinkString::assign(const char newStr) {//先释放原有的链表LinkNode p = head;while (p) {LinkNode temp = p;p = p>next;delete temp;}length = strlen(newStr);head = NULL;p = NULL;for (int i = 0; i < length; i++){LinkNode newNode = new LinkNode(newStri);if (head == NULL) {head = newNode;p = head;} else {p>next = newNode;p = p>next;}}}LinkString LinkString::concat(const LinkString& other) {LinkString result;LinkNode p1 = head;LinkNode p2 = otherhead;LinkNode p = NULL;while (p1) {LinkNode newNode = new LinkNode(p1->data);if (resulthead == NULL) {resulthead = newNode;p = resulthead;} else {p>next = newNode;p = p>next;}p1 = p1->next;}while (p2) {LinkNode newNode = new LinkNode(p2->data);if (resulthead == NULL) {resulthead = newNode;p = resulthead;} else {p>next = newNode;p = p>next;}p2 = p2->next;}resultlength = length + otherlength;return result;}int LinkString::compare(const LinkString& other) {LinkNode p1 = head;LinkNode p2 = otherhead;while (p1 && p2 && p1->data == p2->data) {p1 = p1->next;p2 = p2->next;}if (p1 == NULL && p2 == NULL) {return 0;} else if (p1 == NULL) {return -1;} else if (p2 == NULL) {return 1;} else {return p1->data p2->data;}}LinkString LinkString::subString(int start, int len) {LinkString sub;LinkNode p = head;for (int i = 0; i < start; i++){p = p>next;}for (int i = 0; i < len; i++){LinkNode newNode = new LinkNode(p>data);if (subhead == NULL) {subhead = newNode;} else {LinkNode temp = subhead;while (temp>next) {temp = temp>next;}temp>next = newNode;}p = p>next;}sublength = len;return sub;}void LinkString::insert(int pos, const LinkString& insertStr) {LinkNode p = head;for (int i = 0; i < pos 1; i++){p = p>next;}LinkNode insertHead = insertStrhead;while (insertHead) {LinkNode newNode = new LinkNode(insertHead>data);newNode>next = p>next;p>next = newNode;p = p>next;insertHead = insertHead>next;}length += insertStrlength;}void LinkString::deleteSub(int start, int len) {LinkNode p = head;for (int i = 0; i < start 1; i++){p = p>next;}LinkNode temp = p>next;for (int i = 0; i < len; i++){LinkNode delNode = temp;temp = temp>next;delete delNode;}p>next = temp;length = len;}```(三)测试用例1、顺序存储方式的测试```cppint main(){SeqString s1 = createSeqString("Hello");SeqString s2 = createSeqString("World");SeqString s3 = concatSeqString(s1, s2);std::cout <<"连接后的字符串: "<< s3str << std::endl; int cmpResult = compareSeqString(s1, s2);if (cmpResult < 0) {std::cout <<"s1 小于 s2" << std::endl;} else if (cmpResult == 0) {std::cout <<"s1 等于 s2" << std::endl;} else {std::cout <<"s1 大于 s2" << std::endl;}SeqString sub = subSeqString(s1, 1, 3);std::cout <<"子串: "<< substr << std::endl; insertSeqString(s1, 2, s2);std::cout <<"插入后的字符串: "<< s1str << std::endl; deleteSeqString(s1, 3, 2);std::cout <<"删除后的字符串: "<< s1str << std::endl; return 0;}```2、链式存储方式的测试```cppint main(){LinkString ls1("Hello");LinkString ls2("World");LinkString ls3 = ls1concat(ls2);std::cout <<"连接后的字符串: ";LinkNode p = ls3head;while (p) {std::cout << p>data;p = p>next;}std::cout << std::endl;int cmpResult = ls1compare(ls2);if (cmpResult < 0) {std::cout <<"ls1 小于 ls2" << std::endl;} else if (cmpResult == 0) {std::cout <<"ls1 等于 ls2" << std::endl;} else {std::cout <<"ls1 大于 ls2" << std::endl;}LinkString sub = ls1subString(1, 3);std::cout <<"子串: ";p = subhead;while (p) {std::cout << p>data;p = p>next;}std::cout << std::endl;ls1insert(2, ls2);std::cout <<"插入后的字符串: ";p = ls1head;while (p) {std::cout << p>data;p = p>next;}std::cout << std::endl;ls1deleteSub(3, 2);std::cout <<"删除后的字符串: ";p = ls1head;while (p) {std::cout << p>data;p = p>next;}std::cout << std::endl;return 0;}```五、实验结果及分析(一)顺序存储方式1、连接操作成功实现,输出了正确连接后的字符串。
上机实验报告
微机原理与接口技术实验报告实验汇编实验专业:电力系统自动化班级:电力1203 学号: 0911 姓名:李国杰预习报告成绩实验成绩:机位号:试验一:数据块传送1.将数据段中2000H单元开始存放的的10个数(8位数)传送到3000H开始的10个字节中。
源程序:DATAS SEGMENT;此处输入数据段代码ORG 2000HDATA1 DB 1,2,3,4,5,6,7,8,9,10ORG 3000HDATA2 DB 10 DUP(0)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV SI,2000HMOV DI,3000HMOV CX,10NEXT:MOV AL,[SI]MOV [DI],ALINC DIINC SIDEC CXJNZ NEXTMOV AH,4CHINT 21HCODES ENDSEND START结果展示:2.将数据段中2000H单元开始存放的10个数(16位数)传送到3000H开始到的10个字节中。
源程序:DATAS SEGMENT;此处输入数据段代码ORG 2000HDATA1 DW 1,2,3,4,5,6,7,8,9,10ORG 3000HDATA2 DW 10 DUP(0)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV SI,2000HMOV DI,3000HMOV CX,10NEXT:MOV AL,[SI]MOV [DI],ALINC DIINC SIDEC CXJNZ NEXTMOV AH,4CHINT 21HCODES ENDSEND START结果展示:3.将数据DATA1中的10个字节数据传送到数据段DATA2中源程序:DATAS SEGMENT;此处输入数据段代码DATA1 DB 1,2,3,4,5,6,7,8,9,10DATA2 DB 10 DUP(0)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV SI,OFFSET DATA1MOV DI,OFFSET DATA2MOV CX,10NEXT:MOV AL,[SI]MOV [DI],ALINC DIINC SIDEC CXJNZ NEXTMOV AH,4CHINT 21HCODES ENDSEND START结果展示:4.将数据段中2000H开始的20个数据传送到2010H开始的20个单元中。
MCS-51单片机实验4-3数据区传送
如此反复,第一次将20H内容 送A至CC30H,R000FF,FEDHHR1R各0 加1,222变012HHH 成第R2二11次H,将312H331,012HHH内R7容减R送71,至变31100成HF0E,1HHH5, R200,H R1各0加FFH1,变30成H 0FFH 2将222H12H,H32内H容,R0F送7E变H至成3213H14H,, R第0,三0FR次E1H 各2加2H1,变0成FD2H3H,3323HH ,R7变 成…1..3….
第21FH6次,将0F20HFH内3容FH送至3FH,
R0,R1变成30,40, R7=0H,
执行判断后,结束。
实验三、数据区传送子程序
【思考题1】
修改程序,把片内RAM的20H起始的10连续单元的数 据传送到30H地址开始的空间。
答:修改判断次数,将MOV R7,#16修改为 MOV R7,#10即可
实验三、数据区传送子程序
【实验目的】
掌握循环指令的使用 掌握间接寻址的用途
【接线方式】
本实验无需连接仿真机,点击“取消”进入仿真软件 界面即可。
实验三、数据区传送子程序
【实验内容及要求】
编写程序,实现以下功能 将片内RAM的20H起始的16个连续单元的数据传 送到30H地址开始的空间。
【实验流程图】
【思考题2】
编写程序,绘制流程图,把片内RAM的20H起始的20 个连续单元的数据传送到2000H地址开始的外部数据空 间。
答:修改指令,R1赋初值00H,并将P2赋值20H,则片 外首地址为2000H 将MOV @R1,A 修改为 MOVX @R1,A 即可 也可用DPTR做地址指针,程序如下
ORG 0M0O00VHR0,#20H MOV DPTR,#2000H LOOP: MMOOVV R7,#20 A,@R0MOVX INC R@0DPTR ,A INC DPTR DJNZ R7, LOOP END
数据结构-顺序串基本操作实验报告
数据结构\顺序串基本操作实验报告实验报告数据结构\顺序串基本操作一、实验目的本实验旨在通过实践,掌握顺序串的基本操作,包括顺序串的初始化、销毁、插入、删除和查找等。
二、实验内容1\初始化顺序串2\销毁顺序串3\插入元素到顺序串4\删除顺序串中的指定元素5\查找顺序串中的指定元素三、实验步骤1\初始化顺序串顺序串的初始化就是创建一个空顺序串,可以通过创建一个定长数组来实现。
具体步骤如下:(1)定义一个定长数组,例如a[MAX_SIZE],用于存储顺序串的元素。
(2)定义一个变量len,用于记录顺序串的当前长度,初值为0。
2\销毁顺序串销毁顺序串就是释放顺序串占用的内存空间,具体步骤如下:(1)释放数组a所占用的内存空间。
(2)将len重置为0。
3\插入元素到顺序串插入元素到顺序串就是在指定位置插入一个元素。
具体步骤如下:(1)判断插入位置的合法性,如果位置小于0或大于当前顺序串的长度,即为非法操作。
(2)将len加1,表示顺序串的长度增加了一个。
(3)将插入位置及其之后的元素依次后移一位。
(4)将需要插入的元素存放到插入位置处。
4\删除顺序串中的指定元素删除顺序串中的指定元素就是将顺序串中某个位置的元素删除。
具体步骤如下:(1)判断被删除位置的合法性,如果位置小于0或大于等于当前顺序串的长度,即为非法操作。
(2)将被删除位置之后的元素依次前移一位。
(3)将len减1,表示顺序串的长度减少了一个。
5\查找顺序串中的指定元素查找顺序串中的指定元素就是找出顺序串中第一个与给定元素相等的元素的位置。
具体步骤如下:(1)从顺序串的第一个元素开始逐个与给定元素比较,直到找到相等的元素或搜索到顺序串的末尾。
(2)返回相等元素的位置。
四、实验结果与分析根据实验步骤,我们可以完成顺序串的初始化、销毁、插入、删除和查找等基本操作。
通过这些操作,我们可以对顺序串进行各种元素的插入、删除和查找操作,方便实现顺序串的各种功能。
实验三 数据传送类指令练习
实验三:数据传送类指令练习实验目的:进一步熟悉常用DEBUG命令、数据寻址方式;掌握80x86数据传送类指令的使用方法、汇编语言源程序完整段定义格式。
实验内容:练习数据传送类指令:MOV、PUSH、POP、XCHG、LEA、LDS、LES、XLAT、PUSHF、POPF、LAHF、SAHF,注意观察指令执行结果、弄清指令的功能。
实验步骤:1、练习MOV传送指令,掌握MOV传送指令的格式:在代码段中添加以下指令,对源程序汇编检查指令的正误,如果有错误请写出错误原因。
MOV CX, DL (操作数类型不匹配)MOV CS, DX (CS不能作为目的操做数)MOV 35H, DX (立即数不能为目的操作数)MOV CX, [DX] (间接寻址的寄存器只能是BX,SI,DI,BP)MOV [SP], DX (间接寻址的寄存器只能是BX,SI,DI,BP)MOV AL, 1234H (操作数类型不匹配)MOV ES, [DX][SI] (必须是一个基址一个变址)MOV AX, BX+DI (【BX+DI】)MOV [SI], [DI] (不能同时为内存操作数);[MOV CX, D X;(操作数类型不匹配)MOV C X, DX ;(CS不能作为目的操做数)MOV BYTE PTR[BX],35H ;(立即数不能为目的操作数)MOV CX, [DI] ;(间接寻址的寄存器只能是BX,SI,DI,BP)MOV [BP], DX ;(间接寻址的寄存器只能是BX,SI,DI,BP)MOV A X, 1234H ;(操作数类型不匹配)MOV ES, [BX][SI] ; (必须是一个基址一个变址)MOV AX, [BX+DI] ;(【BX+DI】)MOV [SI], DI ; (不能同时为内存操作数)]2、练习PUSH、POP指令的使用方法,参考过程如下:①在代码段中添加以下指令,汇编连接源程序,用DEBUG调试程序:用U命令对其反汇编,用T命令逐条执行指令,并记录结果。
单片机实验报告
单片机与嵌入式系统实验报告一、软件模拟调试实验:本部分实验内容主要为指令系统和汇编语言程序设计。
采用软件模拟调试的方法,目的在于通过这些实验使学生巩固所学知识,加深对MCS-51单片机内部结构、指令系统的理解,更进一步掌握汇编语言程序设计的方法和技巧。
实验一数据传送实验实验目的1、熟悉软件模拟调试环境。
2、掌握汇编语言程序设计的方法,加深对指令的理解。
3、学会软件模拟调试和察看、验证结果方法。
4、印证数据传送指令的功能、寻址方式以及PC指针、SP指针、DPTR指针、Ri指针分别对代码段、堆栈段、外扩数据存储器段、位寻址区等不同存储器的访问方式。
实验步骤1、进入调试软件环境,输入源程序;2、汇编源程序;3、用单步方式运行程序;4、检查并记录各寄存器和存储单元内容的变化。
实验内容:将8031内部RAM 40H—4FH单元置初值A0H—AFH,然后将片内RAM 40H—4FH单元中的数据传送到片内RAM 50H—5FH单元。
将程序经模拟调试通过后,运行程序,检查相应的存储单元的内容。
源程序清单:ORG 0000HRESET:AJMP MAINORG 003FHMAIN:MOV R0,#40HMOV R2,#10HMOV A,#0A0HA1:MOV @R0,AINC R0INC ADJNZ R2, A1MOV R1,#10HMOV R0, #50HMOV R2, #10HA3: MOV A, @R1MOV @R0, AINC R1INC R2DJNZ R2, A3SJMP $END实验结果与分析:1、按照实验内容补全程序。
2、对源程序进行编译并查看相应程序存储器的内容,将源程序对应的机器码记录入下表,掌握ORG伪指令及汇编的过程。
ORG的作用及相关注意事项:ORG表示之后的语句从哪里开始,有的单片机里面的固定区域是用来做堆栈或者是子程序跳转地址的入口。
PC表示:下一条要执行的指令PSW表示:程序状态字,其各位的含义为:cy进位标志位AC辅助进位标志位Ov溢出标志位p校验位SP表示:堆栈指针R0~R7的物理位置:0000H-0007H3、运行机器码,查看片内数据区、CPU内寄存器的变化情况,按要求将结果记录入下表。
实验三 数据串传送和查表程序
实验三数据串传送和查表程序实验三数据串传送和查表程序实验目的通过实验掌握下列知识:1、利用简化段定义方法实现程序结构定义;2、利用DOS的21H号中断调用完成输入输出;3、查表法和查表指令XLAT;4、数据串传送指令MOVS及重复前辍REP;5、掌握EQU和DUP伪指令的用法。
实验内容及步骤一、利用查表方法显示内存单元的内容1、编辑下列程序:.model small.stack.datastr1 db 'ABCDEFGHIJ' ;待显示的内存区内容str2 db 'Please input the number you will display:',10,13,'$'.code.startupmov ah,9mov dx,offset str2int 21h ;显示STR2字符串的内容,即提示信息mov ah,1int 21h ;输入待显示的字符序号(0-9)mov bx,offset str1sub al,30hxlat ;查STR1表,对应序号的字符ASCII码进入ALmov dl,almov ah,2int 21h ;显示对应字符.exit 0End2、程序汇编通过后,在运行过程中输入0-9的任意数字,显示STR1字符串中对应位置的字符。
3、在DEBUG环境中,用P命令调试执行该程序,察看AL寄存器的变化情况及结果的输出,分析其执行过程。
二、数据串传送程序1、编辑下列程序:.model small.stack.datastr1 db 'abcdefghijklmn' ;源串定义lengs equ $-str1str2 db lengs dup (?),'$' ;目标串.code.startupmov ax,dsmov es,ax ;使DS和ES为同一个段cldlea si,str1lea di,str2mov cx,lengsrep movsb ;串复制mov ah,9mov dx,offset str2int 21h ;显示目标串.exit 0End2、程序汇编通过后,运行程序察看输出结果3、在DEBUG环境中,用P命令调试执行该程序,察看SI、DI寄存器及相应内存单元的变化情况,分析其执行过程。
实验三数据串传送与查表程序
实验三数据串传送和查表程序实验目的通过实验掌握下列知识:1、利用简化段定义方法实现程序结构定义;2、利用DOS的21H号中断调用完成输入输出;3、查表法和查表指令XLAT;4、数据串传送指令MOVS及重复前辍REP;5、掌握EQU和DUP伪指令的用法。
实验内容及步骤一、利用查表方法显示内存单元的内容1、编辑下列程序:.model small.stack.datastr1 db 'ABCDEFGHIJ' ;待显示的内存区内容str2 db 'Please input the number you will display:',10,13,'$' .code.startupmov ah,9mov dx,offset str2int 21h ;显示STR2字符串的内容,即提示信息mov ah,1int 21h ;输入待显示的字符序号(0-9)mov bx,offset str1sub al,30hxlat ;查STR1表,对应序号的字符ASCII码进入ALmov dl,almov ah,2int 21h ;显示对应字符.exit 0End2、程序汇编通过后,在运行过程中输入0-9的任意数字,显示STR1字符串中对应位置的字符。
3、在DEBUG环境中,用P命令调试执行该程序,察看AL寄存器的变化情况及结果的输出,分析其执行过程。
二、数据串传送程序1、编辑下列程序:.model small.stack.datastr1 db 'abcdefghijklmn' ;源串定义lengs equ $-str1str2 db lengs dup (?),'$' ;目标串.code.startupmov ax,dsmov es,ax ;使DS和ES为同一个段cldlea si,str1lea di,str2mov cx,lengsrep movsb ;串复制mov ah,9mov dx,offset str2int 21h ;显示目标串.exit 0End2、程序汇编通过后,运行程序察看输出结果3、在DEBUG环境中,用P命令调试执行该程序,察看SI、DI寄存器及相应内存单元的变化情况,分析其执行过程。
串及其应用的实验报告
一、实验目的1. 理解串的概念及其基本操作。
2. 掌握串的创建、插入、删除、查找等操作。
3. 学习串在具体应用场景中的应用。
二、实验原理串(String)是一种特殊的线性表,它是由若干字符构成的有限序列。
串的基本操作包括创建、插入、删除、查找等。
在计算机科学中,串广泛应用于文本处理、字符串匹配、自然语言处理等领域。
三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019四、实验内容1. 串的创建2. 串的插入3. 串的删除4. 串的查找5. 串在文本处理中的应用五、实验步骤1. 串的创建(1)定义串的结构体```cppstruct String {char data; // 指向串中字符的指针int length; // 串的长度};```(2)创建串```cppString createString(const char str) {String s;s.data = new char[strlen(str) + 1]; // 为串分配内存strcpy(s.data, str); // 复制字符串到串中s.length = strlen(str); // 设置串的长度return s;}```2. 串的插入(1)在串的指定位置插入字符```cppvoid insertChar(String& s, int position, char ch) {if (position < 0 || position > s.length) {return; // 插入位置不合法}char newData = new char[s.length + 2]; // 为新串分配内存 strcpy(newData, s.data); // 复制原串到新串newData[position] = ch; // 在指定位置插入字符strcpy(s.data, newData); // 复制新串到原串s.length++; // 更新串的长度}```(2)在串的指定位置插入子串```cppvoid insertSubstring(String& s, int position, const char subStr) {if (position < 0 || position > s.length) {return; // 插入位置不合法}char newData = new char[s.length + strlen(subStr) + 1]; // 为新串分配内存strcpy(newData, s.data); // 复制原串到新串strcpy(newData + position, subStr); // 在指定位置插入子串strcpy(s.data, newData); // 复制新串到原串s.length += strlen(subStr); // 更新串的长度}```3. 串的删除(1)删除串中的单个字符```cppvoid deleteChar(String& s, int position) {if (position < 0 || position >= s.length) {return; // 删除位置不合法}char newData = new char[s.length]; // 为新串分配内存strcpy(newData, s.data); // 复制原串到新串strcpy(newData + position, newData + position + 1); // 删除指定位置的字符strcpy(s.data, newData); // 复制新串到原串s.length--; // 更新串的长度}```(2)删除串中的子串```cppvoid deleteSubstring(String& s, const char subStr) {int position = s.indexOf(subStr); // 查找子串的位置if (position == -1) {return; // 子串不存在}deleteChar(s, position); // 删除子串}```4. 串的查找(1)查找串中的单个字符```cppint indexOfChar(const String& s, char ch) {for (int i = 0; i < s.length; i++) {if (s.data[i] == ch) {return i; // 找到字符,返回位置}}return -1; // 未找到字符,返回-1}```(2)查找串中的子串```cppint indexOfSubstring(const String& s, const char subStr) {for (int i = 0; i <= s.length - strlen(subStr); i++) {if (strncmp(s.data + i, subStr, strlen(subStr)) == 0) {return i; // 找到子串,返回位置}}return -1; // 未找到子串,返回-1}```5. 串在文本处理中的应用(1)字符串替换```cppvoid replaceSubstring(String& s, const char oldStr, const char newStr) { int position = indexOfSubstring(s, oldStr);while (position != -1) {deleteSubstring(s, oldStr); // 删除旧子串insertSubstring(s, position, newStr); // 插入新子串position = indexOfSubstring(s, oldStr); // 继续查找旧子串}}```(2)字符串排序```cppvoid sortString(String& s) {char temp = new char[s.length + 1];strcpy(temp, s.data);qsort(temp, s.length, sizeof(char), [](const void a, const void b) { return (const char)a - (const char)b;});strcpy(s.data, temp);delete[] temp;}```六、实验结果与分析1. 创建串:通过创建一个包含“Hello, World!”的串,验证了串的创建功能。
串操作实验报告
一、实验目的1. 理解串操作的基本概念和原理。
2. 掌握串操作的常用方法和技巧。
3. 能够使用串操作解决实际问题。
二、实验原理串操作是指对字符串进行的一系列操作,包括字符串的创建、拼接、截取、查找、替换等。
在计算机编程中,字符串操作是常见的操作之一,掌握串操作对于编程开发具有重要意义。
三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019四、实验内容1. 创建字符串2. 字符串拼接3. 字符串截取4. 字符串查找5. 字符串替换6. 字符串长度计算7. 字符串比较五、实验步骤1. 创建字符串```cpp#include <iostream>using namespace std;int main() {string str1 = "Hello";string str2 = "World";return 0;}```2. 字符串拼接```cpp#include <iostream>#include <string>using namespace std;int main() {string str1 = "Hello";string str2 = "World";string str3 = str1 + str2; // 拼接字符串cout << str3 << endl; // 输出拼接后的字符串 return 0;}```3. 字符串截取```cpp#include <string>using namespace std;int main() {string str = "HelloWorld";string subStr = str.substr(0, 5); // 截取字符串cout << subStr << endl; // 输出截取后的字符串return 0;}```4. 字符串查找```cpp#include <iostream>#include <string>using namespace std;int main() {string str = "HelloWorld";size_t pos = str.find("World"); // 查找字符串cout << "Position: " << pos << endl; // 输出查找位置 return 0;}```5. 字符串替换```cpp#include <iostream>#include <string>using namespace std;int main() {string str = "HelloWorld";string newStr = str.replace(0, 5, "Hi"); // 替换字符串 cout << newStr << endl; // 输出替换后的字符串return 0;}```6. 字符串长度计算```cpp#include <iostream>#include <string>using namespace std;int main() {string str = "HelloWorld";int length = str.length(); // 计算字符串长度cout << "Length: " << length << endl; // 输出字符串长度 return 0;}```7. 字符串比较```cpp#include <iostream>#include <string>using namespace std;int main() {string str1 = "Hello";string str2 = "World";if (str1 == str2) {cout << "Strings are equal." << endl;} else {cout << "Strings are not equal." << endl;}return 0;}```六、实验结果与分析通过以上实验,我们掌握了字符串的基本操作,包括创建、拼接、截取、查找、替换、长度计算和比较。
实验三串基本操作的编程实现
实验三串基本操作的编程实现(共5页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--实验三串基本操作的编程实现【实验目的】内容:串基本操作的编程实现要求:串基本操作的编程实现(2学时,验证型),掌握串的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、合并、剪裁等操作,存储结构可以在顺序结构或链接结构、索引结构中任选,也可以全部实现。
也鼓励学生利用基本操作进行一些应用的程序设计。
【实验性质】验证性实验(学时数:2H)【实验内容】字符串用常规的顺序存储法来存储,实现常用的功能。
自己编程模式:开发一个程序,用来统计文件中各种信息,如字符个数,行数等。
修改程序模式:将下面程序空白的地方填空。
程序检查模式:将本文件夹中的程序运行后总结相关功能。
【思考问题】1.字符串的顺序存储和链表存储的差异C语言中是如何实现字符串的2.在字符串处理方面主要有什么操作3.字符串的操作的主要特点是什么4.举出几个字符串的应用范例【参考代码】立顺序串(仅限单行的字符串,建议不用汉字。
)"<<endl;cout<<"2.显示串"<<endl;cout<<"3.修改串"<<endl;cout<<"4.插入串"<<endl;cout<<"5.删除串"<<endl;cout<<"6.查找串"<<endl;cout<<"7.求串长度"<<endl;cout<<"8.结束程序"<<endl;cout<<"=========="<<endl;}int main(){int flag=0,returnvalue,position,beginposition,endposition,length;char choice,choose,newstr[maxsize];string newstring;menu();while(1){cout<<"请输入选择:";cin>>choice;switch(choice){case '1':if(flag){cout<<"数据已存在,是否覆盖(y/n)";cin>>choose;if(choose=='N'||choose=='n'){cout<<"数据没有发生更改!"<<endl;break;}if(choose=='Y'||choose=='y'){returnvalue=();if(returnvalue==success)cout<<"创建成功!"<<endl;flag=1;}elsecout<<"输入错误!"<<endl;}else{returnvalue=();if(returnvalue==success)cout<<"创建成功!"<<endl;flag=1;}break;case '2':if(flag==0)cout<<"请先建立串!"<<endl;else();break;case '3':if(flag==0)cout<<"请先建立串!"<<endl;else{();cout<<"请输入要修改的初始位置:";cin>>beginposition;cout<<"请输入要修改的终止位置:";cin>>endposition;cout<<"请输入修改后的字符串:";cin>>newstr;returnvalue=(beginposition,endposition,newstr);if(returnvalue==success){cout<<"修改成功!"<<endl;();}if(returnvalue==overflow){cout<<"字符串的最大长度为"<<maxsize<<endl;cout<<"发生溢出,操作失败!"<<endl;}if(returnvalue==range_error)cout<<"位置错误,操作失败!"<<endl;if(returnvalue==empty)cout<<"字符串为空,操作失败!"<<endl;}break;case '4':if(flag==0)cout<<"请先建立串!"<<endl;else{();cout<<"请输入要插入的位置:";cin>>position;cout<<"请输入要插入的字符串:";cin>>newstr;length=strlen(newstr);returnvalue=(position,newstr,length);if(returnvalue==success){cout<<"插入成功!"<<endl;();}if(returnvalue==overflow){cout<<"字符串的最大长度为"<<maxsize<<endl;cout<<"发生溢出,操作失败!"<<endl;}if(returnvalue==range_error)cout<<"位置错误,操作失败!"<<endl;}break;case '5':if(flag==0)cout<<"请先建立串!"<<endl;else{();cout<<"请输入要删除的初始位置:";cin>>beginposition;cout<<"请输入要删除的终止位置:";cin>>endposition;returnvalue=(beginposition,endposition);if(returnvalue==success){cout<<"删除成功!"<<endl;();}if(returnvalue==range_error)cout<<"位置错误,操作失败!"<<endl;if(returnvalue==empty)cout<<"字符串为空,操作失败!"<<endl;}break;case '6':if(flag==0)cout<<"请先建立串!"<<endl;else{();cout<<"请输入要查找的字符串:";cin>>newstr;position=(newstr);if(position>0){cout<<"已找到!"<<endl;cout<<"字符串出现的初始位置为:"<<position<<endl;}if(position==0)cout<<"您要查找的字符串不存在!"<<endl;if(position==-1)cout<<"字符串为空,操作失败!"<<endl;}break;case '7':if(flag==0)cout<<"请先建立串!"<<endl;else{();length=();cout<<"当前串的长度为:"<<length<<endl;}break;case '8':exit(0);break;default:cout<<"输入错误!\n";break;}cout<<"按任意键继续......"<<endl;getch();system("cls");menu();}getch();return 0; }。
[课程]单片机数据传送实验报告
实验三数据传送实验报告㈠实验目的1.进一步掌握程序的编辑、汇编及调试方法;2.掌握单片机内部RAM和外部RAM的数据操作;3.了解单片机系统地址分配概念。
㈡实验器材1.G6W仿真器一台2.MCS—51实验板一台3.PC机一台4.电源一台㈢实验内容及要求1.以数据表格形式在ROM中建立一个含有正数和负数的表格,数据长度为16个字节,要求放置八个正数、八个负数,正、负数应离散随机放置,不允许三个以上同类型数据连续放置,数据的具体内容自行确定;2.编制程序,将数据表格中的数据读出并按正、负数归类,正数送入首地址为40H的内部RAM中;负数送入首地址为0B000H的外部RAM中;3.将首地址为0B000H的外部RAM中的数据取出并求其绝对值,然后送入内部RAM的48H~4FH单元。
程序如下:ORG 0000HAJMP MAINORG 0060HMAIN:MOV A,#10H ;数据长度放入了累加器A中MOV R1,#0B0H ;负数所需送入的首地址高位放入R1MOV 20H,#00H ;负数所需送入的首地址低位放入20H单元中MOV R0,#40H ;正数所需送入的首地址40H放到R0中去MOV DPTR,#0A00H ;将表格开始的位置放入DPTR;以上为初始化的全部内容PUSH DPHPUSH DPLPUSH ASTART:POP APOP DPLPOP DPHPUSH A ;将A压栈,保护里面存储的数据长度10HMOV A,#00HMOVC A,@A+DPTR ;读表头地址MOV 20H,AINC DPTR ;DPTR指针加1,以读取表格中下一个数PUSH DPH ;为了保护DPTR中存储的表格地址,压栈以便于放入0B000H,存储负数PUSH DPLJUDGE:MOV A,20HRLC AJC NEGATIVE ;判断语句,标志位为1,转去N(负数);否则往下执行OPPOSITE:MOV A,20HMOV @R0,A ;正数放入到以40H为首地址的单元中去INC R0 ;进入下一个单元以存放下一个正数POP DPLPOP DPHPOP ADEC A ;数据长度减一,代表已经读取了一个数PUSH DPHPUSH DPLPUSH AJNZ START ;如果数据长度不为0,表格还未读取完毕,返回STARTSJMP END1 ;如果数据读取完毕,就跳去NEXT1NEGATIVE:MOV A,20HMOV DPH,R1MOV DPL,20HMOVX @DPTR,AINC DPTR ;0B000H加1,下一个负数存储单元MOV 20H,DPLMOV R1,DPHPOP DPLPOP DPHPOP ADEC APUSH DPHPUSH DPLPUSH AJNZ START ;和正数相同JMP NEXT1NEXT1: MOV A,#08H ;负数的数据长度放入A中MOV DPTR,#0B000H ;负数现在存储位置放入DPTRNEXT2: PUSH A ;将A压栈,保护其中负数的数据长度MOVX A,@DPTR ;读负数存储的首地址CPL A ;取反INC A ;加1MOV @R0,A ;将第一个绝对值入到48H单元(这里其实写的并不是很好,如果正数和负数的绝对值存储位置并不相连,就不可以用了)INC DPTR ;地址加1,下一个负数位置INC R0 ;进入下一个存储单元POP ADEC A ;数据长度减1JNZ NEXT2 ;负数还没读完,继续SJMP $ ;负数全部转成绝对值存储,程序结束ORG 0A00HTABLE:DB 0F0H,10H,80H,25HDB 0B2H,0A4H,30H,08HDB 0D6H,54H,01H,8FHDB 0C0H,27H,0CDH,09H运行结果:40H~47H中内容为10H,25H,30H,08H,54H,01H,27H,09H48H~4FH中内容为10H,80H,5EH,5CH,2AH,71H,50H,44H0B000H~0B007H中内容为0F0H,80H,0B2H,0A4H,0D6H,8FH,0C0H,0CDH硬件部分:A15~A12对应的选中芯片,因为B为1011,所以应该选中A14口连接到芯片CS,低电平有效,这样就成功选中芯片进行了扩展。
数据传送程序设计
数据传送程序设计一、实验目的:1)学习数据传送的用法以及与数据有关的不同寻址方式。
2)熟悉汇编语言程序的上机运行过程。
3)学会使用DEBUG命令调试程序。
二、实验仪器:1)仪器:英特尔586配置以上电脑一台,内存512MB以上,Windowsxp操作系统。
2)软件:MASM5.0汇编软件或者EMU8086三、实验内容:D将40个字母A的字符串从源缓冲区传送到目的缓冲区。
2)将26个小写英文字母存放到数据段1偏移地址为2000H单元开始的内存中,然后转换成大写字母并传送到数据段2以3000H单元开始的存储区。
四、实验步骤:1)点击电脑的“开始”一》“运行”,输入“CMD”,翻开DOS系统界面2)通过CD命令进入MASM软件目录3)使用edit命令编辑程序(程序清单见)C:\MASM>EDITfiIename.ASM(enter)(filename可以自己随意命名)4)使用masιn和Iink命令对程序进行汇编,连接。
C:∖MΛSM>MΛSMfilename,asm(enter)C:∖MASM>linkfilename,obj(enter)5)使用Debug命令调试程序,观察调试过程中数据传输指令执行后各存放器及数据区的内容。
CΛMASM>DEBUGfilename.EXE屏幕上出现一个短划线。
为了确定我们所要设定的断点地址,常常用到反汇编命令,反汇编命令格式如下:-U;从当前地址开始反汇编用G命令来设置断点。
比方想把断点设置在30ICH处,那么如下打入命令:-G301C ;程序在012OH处停下,并显示出所有存放器以及各标志位的当前值,在最后一行还给出下一条将要执行的指令的地址、机器语言和汇编语言,可以从显示的存放器的内容来了解程序运行是否正确。
对于某些程序段,单从存放器的内容看不到程序运行的结果,而需要观察数据段的内容,此时可用D命令,使用格式如下:-DDS100OO;从数据段的0单元开始显示128个字节-t单步执行-R查看存放器的值-Q;退出五、程序清单:程序1:datasegment;数据段的定义source,bufferdb40dup(,Λ,)dataends;**************extrasegment;附加段的定义dest_buffer db40dup(?)extraendscodesegmentorgOlOOh;程序首地址assumecs:code,ds:data,es:extrastart:pushdssubax,axpushaxmovax,datamovds,axmovax,extramoves,axleasi,source_bufferleadi,dest_bufferCldmovex,40repmovsbmovah,4chint21hcodeendsendstart程序2:datalsegment;定义数据org2000h;变量存放数据段2000h单元source_buffer db26dup(?);预留26个节单元datalendsdata2segmentorg3000hdest_bufferl db26dup(?)data2 endsextrasegment将附加段教据送入数据段2dest_buffer2db26dup(?)extraendscodese gmentorgOlOOhassumecs:code,ds:datal,ds:data2,es:extra start:movax,datalmovds,axxiao:leasi,source_buffermovax ,,a,movex,26mov[si],axdal:incsiincaxloopxiaoleadi,dest_buffer2cldmovex,26movax,extramoves,axleasi,source_bufferIodsb;源串DS:Sl中数据送ax subax,20h;将字符串转换为大写字stosb;ax内容送ES:DIda2:loopdalmovax,data2 movds,axleadi,dest_bufferl leasi,dest_buffer2 movex,26movax,es:[si]code mov[di],axincsiincdiloop da2movax,movah,4chint21h endsend start程序2流程图六、实验结果及分析:Sa C:\Windov/s\$y$tem32\cmd.exe∙debugxp.e×eSBC AWindows ∖syitem32∖cmd.exe-debug22.exe-g0148图2程序2实险结果实验结果分析:图1中字母送入数据段及附加段以OOOOH 为偏移段首址的同时,在以1459:0030段开始的数据段也送入了相同的数据,这是因为1459:0030与145C :OoOO 对应相同的物理地址,即14590H+0030H=145C0H+0000H=145C0H o图2中显示大写字母与小写字母存放在不同数据段,这是因为程序中先将小写字母送入以偏移地址为2000H 单元开始的数据段1,此时该数据段段基址为1461H,然后编写程序将小写字母转换成大写字母送入附加段中暂存,最后将附加段中的数据传送至偏移地址为300OH 开始的数据段2,此时的段基址为1663H 。
串操作实验报告
串操作实验报告串操作实验报告引言:串操作是计算机科学中的一项基本操作,它涉及到对字符串的处理和操作。
在本次实验中,我们将学习和掌握一些常见的串操作技术,并通过实际操作加深对这些技术的理解和应用。
实验目的:1. 掌握字符串的基本概念和表示方法;2. 学习串的初始化、赋值和销毁操作;3. 熟悉串的基本操作,如求串的长度、比较串、连接串等;4. 掌握串的模式匹配算法。
实验过程:1. 字符串的初始化和赋值在本次实验中,我们使用C语言来进行串操作的实现。
首先,我们需要初始化一个字符串,并为其分配内存空间。
然后,我们可以通过赋值操作将一个字符串赋给另一个字符串。
这样,我们就可以对这个字符串进行各种操作。
2. 求串的长度求串的长度是串操作中的一个基本操作。
我们可以通过遍历字符串中的每一个字符,并计数来得到字符串的长度。
在实际操作中,我们可以使用strlen()函数来实现这个功能。
3. 比较串比较串是判断两个字符串是否相等的操作。
我们可以逐个字符地比较两个字符串中的字符,如果所有字符都相等,则认为两个字符串相等。
在实际操作中,我们可以使用strcmp()函数来实现这个功能。
4. 连接串连接串是将两个字符串连接成一个新的字符串的操作。
我们可以先计算出新字符串的长度,然后将两个字符串中的字符逐个复制到新的字符串中。
在实际操作中,我们可以使用strcat()函数来实现这个功能。
5. 串的模式匹配串的模式匹配是在一个字符串中查找另一个字符串的操作。
我们可以通过遍历字符串中的每一个字符,并与目标字符串进行比较来实现这个功能。
在实际操作中,我们可以使用strstr()函数来实现这个功能。
实验结果:通过实验,我们成功地完成了串操作的各项任务。
我们学会了如何初始化和赋值字符串,如何求串的长度,如何比较和连接串,以及如何进行串的模式匹配。
这些技术对于我们在日后的编程工作中处理字符串将会非常有帮助。
结论:串操作是计算机科学中的一项基本操作,它对于我们处理字符串非常重要。
串的实验报告
实验名称:串的实验实验日期:2021年X月X日实验地点:XX实验室实验目的:1. 理解串的基本概念和性质。
2. 掌握串的运算方法。
3. 熟悉串的存储结构和实现方式。
实验原理:串(String)是一种特殊的线性表,它是由若干个字符组成的有限序列。
串的运算包括连接、求子串、求长度、判断子串等。
实验步骤:1. 初始化一个串s1,并为其赋值“Hello”。
2. 初始化一个串s2,并为其赋值“World”。
3. 将s1和s2连接,得到一个新的串s3。
4. 从s3中提取子串,得到子串s4。
5. 求s3的长度。
6. 判断s4是否为s3的子串。
实验代码:```python# 定义串的类class String:def __init__(self, data):self.data = data# 连接两个串def concatenate(self, other):return String(self.data + other.data) # 提取子串def substring(self, start, end):return String(self.data[start:end]) # 求长度def length(self):return len(self.data)# 判断子串def is_substring(self, other):return other.data in self.data# 初始化两个串s1 = String("Hello")s2 = String("World")# 连接两个串s3 = s1.concatenate(s2)# 提取子串s4 = s3.substring(0, 5)# 求长度length = s3.length()# 判断子串is_sub = s4.is_substring(s3)# 输出结果print("s1:", s1.data)print("s2:", s2.data)print("s3:", s3.data)print("s4:", s4.data)print("s3的长度:", length)print("s4是否为s3的子串:", is_sub)```实验结果:1. s1: Hello2. s2: World3. s3: HelloWorld4. s4: Hell5. s3的长度: 106. s4是否为s3的子串: True实验分析:1. 通过实验,我们成功实现了串的连接、提取子串、求长度和判断子串等基本运算。
串的操作实验报告
一、实验目的1. 理解串的概念及其在程序设计中的应用。
2. 掌握串的基本操作,如创建、插入、删除、查找等。
3. 提高对数据结构操作的理解和编程能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验内容1. 创建串2. 插入字符3. 删除字符4. 查找字符5. 合并串6. 判断串是否为空7. 获取串的长度8. 反转串四、实验步骤1. 创建串```cpp#include <iostream>#include <string>using namespace std;int main() {string str1 = "Hello";string str2 = "World";return 0;}```2. 插入字符```cppint main() {string str = "Hello";int position = 3;char ch = 'W';str.insert(position, 1, ch);cout << str << endl; // 输出:HWeHllo return 0;}```3. 删除字符```cppint main() {string str = "Hello";int position = 2;int length = 2;str.erase(position, length);cout << str << endl; // 输出:Hereturn 0;}```4. 查找字符```cppint main() {string str = "Hello";char ch = 'e';size_t position = str.find(ch);cout << position << endl; // 输出:1return 0;}```5. 合并串```cppint main() {string str1 = "Hello";string str2 = "World";string str3 = str1 + str2;cout << str3 << endl; // 输出:HelloWorld return 0;}```6. 判断串是否为空```cppint main() {string str1 = "Hello";string str2 = "";if (str1.empty()) {cout << "str1 is empty" << endl;} else {cout << "str1 is not empty" << endl; }if (str2.empty()) {cout << "str2 is empty" << endl;} else {cout << "str2 is not empty" << endl; }return 0;}```7. 获取串的长度```cppint main() {string str = "Hello";int length = str.length();cout << length << endl; // 输出:5return 0;}```8. 反转串```cppint main() {string str = "Hello";reverse(str.begin(), str.end());cout << str << endl; // 输出:olleHreturn 0;}```五、实验结果与分析通过以上实验,我们成功实现了串的基本操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号:xxx 班级:xxx 姓名:xxx
实验三数据串传送和查表程序
实验目的:
通过实验掌握下列知识:
1、堆栈。
堆栈指示器SP和堆栈操作指令PUSH。
POP。
2、段寄存器和物理地址计算。
3、查表法和查表指令XLAT。
4、数据串传送程序和数据串传送指令MOVS。
STOS及重复前辍REP。
5、循环指令ROL。
逻辑与指令AND和清方向位指令CLD。
6、伪操作指令DB。
实验内容及步骤:
一、利用查表方法把DX的内容(16进制数)转换成ASCII码:
1、用A命令键入下列程序:
MOV BX,1000
MOV DI,2000
MOV CX,4
LOP: PUSH CX
MOV CL,4
ROL DX,CL
POP CX
MOV AL,DL
AND AL,OF
XLAT
CLD
STOSB
LOOP LOP
INT 20
2、用A命令在1000H处键入下列ASCII码并用D命令检查之:
DB `0 1 2 3 4 5 6 7 8 9 A B C D E F'
用D命令检查时注意左边的ASCII码值和右边的字符。
3、用R命令给DX送一个四位的16进制数(例7F8E)。
4、用T命令逐条运行这程序到LOOP指令处,观察并记录每次运行结果,特别是SP和堆栈内容(用D命令检查)
5、用G命令将此程序运行到结束,并用D命令检查2000H处所转换的结果。
可注意屏幕右边的ASCII字符与DX是否一致。
二、数据串搬家程序:
1、用A命令键入下列程序:
MOV SI,1000
MOV DI,1500
MOV CX,0F
LOP: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP LOP
INT 20
2、用A命令DB伪指令在1000H键入下列字符串:
‘IBM_PC COMPUTER'
3、用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致。
4、若此程序中的目的地址改为1002H,再运行此程序,看能不能把1000H开始的
字符串搬到1002H开始的地方去?修改程序以做到这一点。
MOV SI,1000
MOV DI,1500
MOV CX,0F
LOP: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP LOP
MOV SI,1500
MOV DI,1002
MOV CX,0F
LOP: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP LOP
INT 20
三、段寄存器概念及字符串传送指令练习:
1、用A命令键入下列程序:
MOV SI,0
MOV DI,0
MOV AX,1000
MOV DS,AX
MOV AX,1500
MOV ES,AX
MOV CX,0F
CLD
REP MOVSB
INT 20
2、用A命令DB伪指令在1000:0000处键入字符串'IBM_PC COMPUTER',并用D命检查之
3、用D命令检查0F00:1000处内容,看是否一样。
为什么?
他们是同一个物理地址。
4、用G命令运行此程序,检查目的地址1500:0000处内容。
并记下DS与ES值。
5、修改此程序,使ES与DS为同一值,以减少一条指令,而源物理地址和目的物理地址(是多少?)仍和原来一样。
MOV SI,0
MOV DI,5000
MOV AX,1000
MOV DS,AX
MOV ES,AX
MOV CX,0F
CLD
REP MOVSB
INT 20
DS:SI 1000:0000
ES:DI 1000:5000
实验报告要求:
1、各项实验记录和思考题。
2、要求你修改的程序的清单(修改后)和调试记录。