需求分析(菜单 输入文章 统计字符 童子字符串出现次数 删除某子串 查看文章 保存文章 加载文章)、概要设计(算法功能设计 软件环境)、详细设计(主要数据类型 变量 函数 算法流程图)、调试分析(非法合法测试数据、遇到问题解决方案解决结果)、总结、文献、附录(代码)
一、需求分析: 1.1 菜单:提示用户可选择“1.输入文章”、“2.统计字符”、“3.统计某字符串 出现次数”、“4.删除某子串”、“5.查看文章”、“6.保存文章”、“7. 加载文章”、“8.退出”并执行相应的操作。若用户输入非 1-8 的字符,提 示“无效操作!您只能选择操作 1-8!”。 1.2 用户选择 1——输入文章:用户可以输入大、小写英文字母、中文汉字、任何 数字及标点符号,直至用户输入空行结束文章输入。用户输入文章为空,提 示“文章不能为空!”;用户输入文章的任一行字符超过 80,在查看显示时 自动换行为每行不超过 80 字符;不违反以上两个规则,提示“文章输入成功!” 1.3 用户选择 2——统计字符:根据用户输入文章统计英文字母数、中文汉字数、 中文标点、英文标点数、数字数、空格数、总字数并换行输出“英文字母数”、 “中文汉字数”、“中文标点数”、“英文标点数”、“数字数”、“空格 数”、“总字数”。 1.4 用户选择 3——统计某字符串出现次数:用户选择操作 3 后,用户输入要统计 的字符串,输出其出现次数。若用户输入要统计字符串为空,提示“查找字 符串不能为空!”。 1.5 用户选择 4——删除某子串:用户选择操作 4 后,用户输入要删除的字符串, 删除文章中该字符串,该字符串后边字符前移补位。若用户输入要删除字符 串为空,提示“删除字符串不能为空!”。 1.6 用户选择 5——查看文章:用户选择操作 5 后,按每行少于 80 个字符输出, 每行多于 80 字符自动换行。 1.7 用户选择 6——保存文章:用户选择操作 6 后,用户将已经输入的文章内容命 名,成功保存后,提示用户保存成功,方便用户下次直接查找文件名进行操 作(选择 7 调用),若文件未为其命名,则提示用户出现错误。 1.8 用户选择 7——加载文章:用户选择操作 7 后,用户将已经成功保存后的文章, 用户通过输入文件名,进行调用,以便执行菜单中的其他操作,若文件名不 存在或输入为空,则提示用户出现错误。 1.9 用户选择 8——退出系统:用户选择操作 8,退出系统。 数据结构课程设计——文章编辑系统 2 / 35 二、概要设计 2.1 功能算法设计 2.1.1 输入文章 一维数组存储每行输入,结构体的长度成员记录行数。输入直至一维数组的第一 个元素为换行结束输入。 2.1.2 统计字符 使用库函数 isalpha、isdigit、isspace 统计英文字母、数字、空格。中文汉字、 中文标点使用 GBK 编码范围。英文标点使用库函数 ispunct。双重循环,外层循环遍历 文章行,内层循环遍历文章当前行的字符。每判断一个字符确定其所属字符类型,使 用计数器变量进行+1 计数操作。 2.1.3 统计某字符串出现次数——KMP 算法 根据要统计字符串(模式串)计算最长公共前后缀数组 lps。 对文章(主串)进行遍历至主串索引等于主串字符数:遇到不匹配字符,根据 lps 数组找到模式串中最长的相等前后缀的长度,然后将模式串向右移动这个长度后再进 行匹配;若字符匹配,比较下一个字符。 直至模式串索引与模式串字符数相同,表示找到一个匹配的字符串,匹配成功, 通过一个数组来记录匹配字符串的第一个字符的位置;若匹配失败,在该数组中存-1。 遍历该数组,每遇到不为-1 的值就对计数器变量进行++操作从而实现计数。 2.1.4 删除某字符串 首先,遍历文章的每一行,使用一个指针‘pos’来找到子字符串的位置,然后, 使用 `strstr` 函数(该方法能很高效的查找字符串)在当前行中查找子字符串的位 置,(`strstr` 函数返回一个指向第一个匹配子字符串位置的指针,如果未找到则返 回 `NULL`,如果找到子字符串,计算子字符串的长度 `len`)最后使用 `memmove` 函 数(该方法简单直接,更高效)将子字符串后面的内容覆盖到子字符串出现的位置,从 而删除子字符串。memmove(pos, pos + len, strlen(pos + len) + 1);在当前行中继 续查找并删除子字符串,直到当前行中不再包含子字符串,处理完当前行后,继续处理 下一行,直到所有行都处理完。 2.1.5 保存文章 首先,使用 fopen 函数以写模式(“w”)打开指定的文件。如果文件无法打开(如 无写权限或路径错误),打印错误信息并返回。然后遍历文章结构体中的每一行,使用 fprintf 函数将每一行的内容写入到文件中,并在行末加上换行符。然后使用 fclose 函数关闭文件,确保所有写入操作完成。最后打印提示信息,告知用户文章已成功保数据结构课程设计——文章编辑系统 3 / 35 存到指定文件。 2.1.6 加载文章 首先使用 fopen 函数以读模式(“r”)打开指定的文件,如果文件无法打开(如 文件不存在或无读权限),打印错误信息并返回。然后初始化文章结构体:将 article 结构体中的 line_count 初始化为 0,准备存储新读取的内容。接着读取文章内容: 定义一个缓冲区 buffer 用于存储每次读取的一行内容,使用 fgets 函数从文件中逐 行读取内容,直到文件结束,每读取一行,将行末的换行符去除,将读取的内容复制 到 article 结构体的相应位置,并增加 line_count。然后关闭文件:使用 fclose 函 数关闭文件,确保所有读取操作完成。最后需要提示用户:打印提示信息&#x