当前位置: 首页 > news >正文

数据结构课设——文章编辑系统

需求分析(菜单 输入文章 统计字符 童子字符串出现次数 删除某子串 查看文章 保存文章 加载文章)、概要设计(算法功能设计 软件环境)、详细设计(主要数据类型 变量 函数 算法流程图)、调试分析(非法合法测试数据、遇到问题解决方案解决结果)、总结、文献、附录(代码)

一、需求分析: 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

相关文章:

  • C#程序的递归方法调用
  • 项目启动 | 盘古信息助力鼎阳科技开启智能制造升级新征程
  • pytorch把图片打成patches
  • Linux下USB设备图像采集
  • mysql编程--从入门到入土
  • PPT的精细化优化与提升策略
  • Kubernetes中的Java微服务部署策略
  • 【深度学习】python之人工智能应用篇——图像生成技术(一)
  • 大数据面试-Hive
  • 用Java获取键盘输入数的个十百位数
  • 线代的学习(矩阵)
  • c语言回顾-结构体(2)
  • C++设计模式之适配器模式
  • Ubuntu配置ssh+vnc(完整版)
  • 数据结构:为什么说链表是顺序表的升级版(c语言实现)
  • 【391天】每日项目总结系列128(2018.03.03)
  • Akka系列(七):Actor持久化之Akka persistence
  • Java 多线程编程之:notify 和 wait 用法
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • select2 取值 遍历 设置默认值
  • SpringBoot几种定时任务的实现方式
  • Spring声明式事务管理之一:五大属性分析
  • Vue全家桶实现一个Web App
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 前端js -- this指向总结。
  • 如何编写一个可升级的智能合约
  • 如何设计一个微型分布式架构?
  • 试着探索高并发下的系统架构面貌
  • Python 之网络式编程
  • 阿里云ACE认证之理解CDN技术
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (阿里云万网)-域名注册购买实名流程
  • (二)Linux——Linux常用指令
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)ssm码农论坛 毕业设计 231126
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (一)WLAN定义和基本架构转
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)Unity3DUnity3D在android下调试
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .jks文件(JAVA KeyStore)
  • .NET CORE Aws S3 使用
  • .net framework 4.8 开发windows系统服务
  • .Net 基于IIS部署blazor webassembly或WebApi
  • .NET技术成长路线架构图
  • @Pointcut 使用