<编译原理> 的一些体会

同样是鼎鼎大名的“龙书”,  打算花点力气研究一下编译过程中的一些细节问题, 而这些细节往往决定了你对整个工程的把握程度。
1. 其它 一、实验目的 通过本实验的学习,掌握串类型的实现方法,为灵活运用串结构奠定基础。 二、实验内容 【问题描述】 如果语言没有把串作为一个预先定义好的基本类型对待,又需要用该语言写一个涉及串操作的软件系统时,用户必须自己实现串类型。试实现串类型,并写一个串的基本操作的演示系统。 【基本要求】 在利用串的顺序存储实现串类型的最小操作子集的基础上,实现串抽象数据类型的其余基本操作(不使用C语言本身提供的串函数)。参数合法性检查必须严格。 利用上述基本操作函数构造以下系统:它是一个命令解释程序,循环往复地处理用户键入的每一条命令,直至终止程序的命令为止。命令定义如下: 判相等。格式:E <串1><串2><回车>若两串相等,则显示“EQUAL”,否则显示“UNEQUAL”。 联接。格式:C <串1><串2><回车>将两串拼接产生结果串并显示出来。 求长度。格式:L <串1><回车>显示串的长度。 求子串。格式:S <串1><位序><长度><回车>如果参数合法,则显示子串的串值。 子串定位。格式:I <串1><串2><回车>显示第二个串在第一个串中首次出现时的起始位置。 串替换。格式:R <串1><串2><串3><回车>将第一个串中所有出现的第二个串用第三个串替换,显示结果串的串值。【测试数据】 自定。 三、实验原理、方法和手段 1、根据实验内容编程,上机调试、得出正确的运行程序。 2、编译运行程序,观察运行情况和输出结果。 四、实验环境、条件 硬件:计算机一台。 软件:DEV C++, Visual C++。 五、实验组织运行要求 以学生自主训练为主的开放模式组织教学。 六、实验步骤 根据问题描述按照基本要求设计并编写程序,对程序进行调试,并使用测试数据对程序进行测试,将运行结果进行截图、对所得到的的结果分析。 七、实验报告 记录数据结构设计的过程及实验步骤、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。格式见学生实验报告。 提交
10-29
### 实现思路 在DEV C++或Visual C++环境下,不使用C语言自带串函数,基于串的顺序存储实现串抽象数据类型操作及命令解释程序,可按以下步骤进行: 1. **定义串类型**:使用数组来实现串的顺序存储。 2. **实现串的基本操作**:包括判相等、联接、求长度、求子串、子串定位、串替换等。 3. **构造命令解释程序**:循环处理用户输入的命令。 4. **调试与测试**:对程序进行调试和测试,记录实验报告。 ### 代码实现 ```cpp #include <iostream> using namespace std; // 定义串类型 const int MAX_LENGTH = 100; struct SeqString { char ch[MAX_LENGTH]; int length; }; // 初始化串 void initString(SeqString &s) { s.length = 0; } // 判相等 bool isEqual(SeqString s1, SeqString s2) { if (s1.length != s2.length) return false; for (int i = 0; i < s1.length; i++) { if (s1.ch[i] != s2.ch[i]) return false; } return true; } // 联接 SeqString concat(SeqString s1, SeqString s2) { SeqString result; initString(result); if (s1.length + s2.length > MAX_LENGTH) { cout << "Concat error: string length exceeds maximum." << endl; return result; } for (int i = 0; i < s1.length; i++) { result.ch[i] = s1.ch[i]; } for (int i = 0; i < s2.length; i++) { result.ch[s1.length + i] = s2.ch[i]; } result.length = s1.length + s2.length; return result; } // 求长度 int getLength(SeqString s) { return s.length; } // 求子串 SeqString substring(SeqString s, int pos, int len) { SeqString result; initString(result); if (pos < 0 || pos >= s.length || len < 0 || pos + len > s.length) { cout << "Substring error: invalid parameters." << endl; return result; } for (int i = 0; i < len; i++) { result.ch[i] = s.ch[pos + i]; } result.length = len; return result; } // 子串定位 int index(SeqString s, SeqString t) { for (int i = 0; i <= s.length - t.length; i++) { bool found = true; for (int j = 0; j < t.length; j++) { if (s.ch[i + j] != t.ch[j]) { found = false; break; } } if (found) return i; } return -1; } // 串替换 SeqString replace(SeqString s, SeqString oldStr, SeqString newStr) { SeqString result; initString(result); int pos = 0; while (pos < s.length) { int idx = index(substring(s, pos, s.length - pos), oldStr); if (idx == -1) { for (int i = pos; i < s.length; i++) { result.ch[result.length++] = s.ch[i]; } break; } for (int i = 0; i < idx; i++) { result.ch[result.length++] = s.ch[pos + i]; } for (int i = 0; i < newStr.length; i++) { result.ch[result.length++] = newStr.ch[i]; } pos += idx + oldStr.length; } return result; } // 输入串 SeqString inputString() { SeqString s; initString(s); char c; while ((c = cin.get()) != '\n') { if (s.length < MAX_LENGTH) { s.ch[s.length++] = c; } else { cout << "Input error: string length exceeds maximum." << endl; break; } } return s; } // 输出串 void outputString(SeqString s) { for (int i = 0; i < s.length; i++) { cout << s.ch[i]; } cout << endl; } // 命令解释程序 void commandInterpreter() { char cmd; while (cin >> cmd) { cin.ignore(); // 忽略换行符 switch (cmd) { case 'E': { SeqString s1 = inputString(); SeqString s2 = inputString(); if (isEqual(s1, s2)) { cout << "EQUAL" << endl; } else { cout << "UNEQUAL" << endl; } break; } case 'C': { SeqString s1 = inputString(); SeqString s2 = inputString(); SeqString result = concat(s1, s2); outputString(result); break; } case 'L': { SeqString s = inputString(); cout << getLength(s) << endl; break; } case 'S': { SeqString s = inputString(); int pos, len; cin >> pos >> len; SeqString result = substring(s, pos, len); outputString(result); break; } case 'I': { SeqString s1 = inputString(); SeqString s2 = inputString(); int idx = index(s1, s2); cout << idx << endl; break; } case 'R': { SeqString s1 = inputString(); SeqString s2 = inputString(); SeqString s3 = inputString(); SeqString result = replace(s1, s2, s3); outputString(result); break; } default: cout << "Invalid command." << endl; } } } int main() { commandInterpreter(); return 0; } ``` ### 调试与测试 - **调试**:在DEV C++或Visual C++中设置断点,逐步执行程序,检查变量的值和程序的执行流程。 - **测试**:使用不同的测试数据,包括边界情况,对程序进行测试,确保程序的正确性。 ### 实验报告记录 - **实验目的**:利用串的顺序存储实现串类型的最小操作子集的基础上,不使用C语言本身提供的串函数,实现串抽象数据类型的其余基本操作,并构造一个命令解释程序。 - **实验环境**:DEV C++或Visual C++。 - **实验步骤**:包括定义串类型、实现基本操作、构造命令解释程序、调试与测试等。 - **实验结果**:记录测试数据和程序的输出结果。 - **实验结论**:总结实验的收获和体会,分析程序的优缺点。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值