2021秋软工实践第一次个人编程作业

AnEweLamb AnEweLamb 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这个作业属于哪个课程 构建之法-2021秋-福州大学软件工程 https://bbs.csdn.net/forums/fzuSoftwareEngineering2021
这个作业要求在哪里 2021秋软工实践第一次个人编程作业 https://bbs.csdn.net/topics/600574694
这个作业的目标C \ C++ 代码关键字提取,git 使用,关键字组合结构的匹配
学号031902434

PSP表格

PSP2.1Personal Software Process Stage预估耗时(分钟)实际耗时(分钟)
Planning计划2030
Estimate估计这个任务需要多少时间105
Development开发
Analysis需求分析(包括学习新技术)300340
Design Spec生成设计文档
Design Review设计复审
Coding Standard代码规范(为目前的开发制订合适的规范)6090
Design具体设计120150
Coding具体编码150120
Code Review代码复审
Test测试(自动测试、修改代码、提交修改)120240
Reporting报告6080
Test Report测试报告
Size Measurement计算工作量2015
Postmortem&Process Improvement事后总结并提出过程改进计划
合计8601070

解题思路


  • 任务分解:
  1. 完成关键字的提取、匹配与统计
  2. 找到合适方法记录每个 switch 下的 case 数量
  3. 想 if-eles 和 if-elseif-else 条件判断语句的匹配方式
  • 由于本人所会语言的种数限制,本次作业将由 C 和 C++ 所完成。

  • 首先,个人第一反应是字符串匹配,于是草率暴力地以空格、回车分割从文件中提取字符串,再进行匹配,而后课程群之中的讨论使我恍然大悟,关键字提取和字符串匹配之间的不同还挺多。

  • 上述字符串匹配之中的字符串匹配还是能用,问题在于解决如注释、宏定义、独特的输出之中包含的假“关键字”等等。而后,本人随意搜索过程之中发现了词法分析这个玩意儿,于是借鉴了下其中的思维,修改文件读取方式为逐一单个字符读取(含空格、回车),加以条件即可去除我所想到的干扰项。

  • 由于 switch-case 暂时不考虑嵌套,此处较为简单暂且不表。而到了进行 if-else 匹配阶段时,个人感觉也得同时考虑 if-elseif-else 的匹配问题,所以关键来到将 elseif 识别出来。参考同学的一些作业以及询问朋友,最后选择暴力去除elseif之间的空格、制表符、回车以完成elseif的识别。

  • 做好分辨 if, else, else-if 的词项识别后,先是参考“括号匹配问题“用栈的思想对三个词项进行识别,遇到 else 则进行判断。这个方法可应对完整无缺的结构匹配。好笑的是如何做到对残缺的结构进行正确匹配?个人暂时没想到完整办法,可能需要再进行’{}’以及’;’的结合判断。

关于 Git


commit记录:

img

个人代码文件规范 https://github.com/huuu-code/rabbit#readme
完整代码所存仓库 https://github.com/huuu-code/rabbit

设计实现过程

  • 单个字符读取方式,每次进行判断,不同类型字符处理方式不同,直到文件读取完毕。

    img

  • 将 switch 的出现作为一种标记,以区分不同 switch 之中的 case 数量

    img

  • 操作 if, else , else-if 三种标志,出现 else 进行栈顶判断和出栈操作,其余两种则入栈

    img

代码说明

  • 读取文件,单个字符逐一读取

    FILE *fin;
    fin = fopen(file,"r"); 
    if (fin == NULL) {
      cout << "error!" << endl;
    }
    char c;
    string str;
    c = fgetc(fin);
    
  • 剪切符合命名条件的字符串,进行关键字匹配

    else if (isalpha(c) || c=='_' || isalnum(c)) {//字符为字母或数字或下划线时 
      string str;
              while (isalpha(c) && c=='_' || isalnum(c)) {
                  str += c;
                  c = fgetc(fin);
              }
              index = KeySearch(str); //将拼接好的字符与关键字进行匹配查询
    
  • 匹配关键字,用结构体保存关键字以及其数量

    /*结构体数组
    struct key {
    string word;
    Int count;
    };*/
    int KeySearch(string str){
      int index = -1;
      for (int i = 0; i < 32; i++) {
          if(keytab[i].word == str){
              keytab[i].count++;
              index = i;
              break;
          }
      }
      return index; //返回关键字下标
    }
    
  • switch 和 case 的组合判断, index=2表明匹配到case,数组记录case数量

    if (keytab[25].count != 0) {
      if(index == 2)  casenum[keytab[25].count-1]++;
    }
    
  • if-else 和 if-elseif-else 漏洞版匹配,if 与 elseif 都无条件入栈,碰到 else 时需要判断栈中元素是否能与其形成组合。

                  if (index == 15){     //匹配到 if,将1入栈
                      s.push(1);
                  }
                  if (index == 9) { //匹配到else接下去判断是不是仅为else
                    int flag=0;
                    while(c==' ' || c=='\n' || c=='\t') c=fgetc(fin);
                      if(c=='i'){
                          if((c=fgetc(fin))=='f'){   //匹配到else if,将3入栈
                              if(!s.empty()&&(s.top()!=3)) s.push(3);
                              flag=1;
                              keytab[15].count++;
                          }
                      }
                      if(flag==0){ //匹配到else,检查栈顶并操作
                          if(!s.empty()&&(s.top()==1)){
                              ie_count++;  //if-else组合
                              s.pop();
                          }
                          else if(!s.empty()&&(s.top()==3)){
                              s.pop();
                              if(!s.empty()&&(s.top()==1)){
                                  iee_count++; //if-elseif-else组合
                                  s.pop();
                              }
                          }
                      }
                  }
    

    测试


单元测试由于个人代码函数的不规范以及个人能力不足,暂且用提供范例自写范例。

  1. 使用作业样例:此样例能支持通过 4 等级

    img

  2. 自己编写样例:此样例不支持 3,4 等级

    img

由于暂时没法下载VS,没做性能测试

总结


  • 个人困难与解决
    一开始选择哪一种读取文件的方式,就影响到后续写匹配细节。一开始用 string 类提取文件内容,走入了字符串匹配的误区。为了走出这个误区,借鉴了词法分析,开始使用单个字符提取内容,得以解决关键字匹配问题。
    在选择如何存储 case 信息,想的比较多且杂,最后也没巧妙且合适的方法,只好使用数组暂做存储,数组大小就成了麻烦之处。
    做到后面要求时,了解到了正则表达式,本想学习优化下自己的代码,结果个人原因学不进去,希望以后得空耐心学学。
    用栈的思想做 if else 匹配时,发现无法对残缺结构正确匹配,此处最大的困难个人无法解决。
    代码并不能做到将功能模块函数化,迫于无奈只能分出简单的输出函数、匹配函数以及一个杂糅的函数。非常不方便。

  • 任务总结
    由于个人能力与时间限制,最后提交的版本仍然存在未解决的问题以及一些未知的错误。且此次作业时间大多花费在寻找思路、寻找改进方法、查找资料等等地方,最后仍然无法对已知缺陷进行弥补属实遗憾与失败。

  • 个人感想
    算是费心费力的投入比较多时间的一个作业,但由于各种原因导致最后结果也不满意吧。有做出来点什么但是又没做出来什么的感觉,比较让我颓唐且焦虑。学海无涯,坚持才能学得下去也学得更好。编程确实需要投入很多,过程可能非常的崎岖坎坷但是每解决一个小问题的时候还是非常开心的。

...全文

相关推荐

【雷达信号处理】数字下变频(DDC)(Matlab代码实现)

内容概要:本文围绕雷达信号处理中的数字下变频(DDC)技术,详细阐述了其在Matlab环境下的实现方法与工作原理。DDC作为雷达接收机中的核心技术,主要用于将高频中频信号高效转换为低频基带信号,以便于后续的数字信号处理。文章系统介绍了DDC的三大核心步骤:混频实现频谱搬移、低通滤波抑制带外噪声与干扰、以及抽取降低采样率以减轻数据处理负担。文中提供了完整的Matlab代码实例,并通过仿真结果直观展示了信号在时域和频域的变化过程,有效验证了DDC设计的正确性与有效性。该资源对于理解现代雷达与通信系统前端处理机制具有重要价值。; 适合人群:具备一定Matlab编程基础和数字信号处理理论知识的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入学习和掌握数字下变频(DDC)的基本原理、数学模型及其实现流程;②利用Matlab对雷达或通信系统中的中频信号进行仿真处理与性能验证;③为信号检测、参数估计等后续高级处理算法提供高质量的基带信号预处理支持。; 阅读建议:在学习过程中,应结合提供的Matlab代码进行逐行调试与运行,重点观察混频、滤波和抽取每一环节对信号时域波形和频谱分布的影响。建议主动修改信号参数(如载频、带宽)和DDC系统参数(如滤波器截止频率、抽取因子),探究不同参数配置对信号保真度和处理效率的影响,从而深化对DDC技术细节的理解。

科研_研学社

基于数据挖掘的京东商城商品推荐系统设计与实现(代码+数据库+LW)

摘 要 随着电商行业竞争加剧,京东商城商品品类激增,用户“信息过载”问题突出——传统货架式展示难以匹配个性化需求,致使用户购物效率低、平台转化率与粘性下滑。在此背景下,依托SpringBoot框架的快速开发特性与MySQL数据库的稳定存储能力,设计实现商品推荐系统,成为解决京东用户体验痛点、提升核心竞争力的关键。研究意义在于以“SpringBoot+MySQL”技术组合打破“人找货”传统模式,转向“货找人”精准服务;核心问题聚焦于借该技术架构整合用户与商品信息,实现个性化推荐功能与系统高效管理的协同落地。 研究以京东用户核心行为与商品关键属性为对象,采用“SpringBoot开发+MySQL存储+模块化开发”综合方法。具体步骤为:先搭建技术架构,基于SpringBoot设计分层开发结构,依托MySQL实现用户与商品信息的稳定存储及交互;再划分功能模块,用户模块涵盖注册登录、个人中心、禅选商品、订单管理等,满足个性化操作需求;管理员模块包含数据看板分析、预测信息管理、禅选商品管理等,支撑推荐效果监控与运营决策;最后构建推荐逻辑,结合用户行为特征与商品属性关联关系,实现商品精准匹配与需求趋势预判。 系统落地应用后核心成果显著:个性化推荐精准度大幅提升,有效减少用户筛选商品的时间成本;系统管理效率升级,管理员借MySQL实现信息高效交互,通过数据看板实时掌握用户偏好与推荐转化动态,预测功能可提前辅助运营决策;用户全流程体验改善,地址同步、客服聊天、收藏管理等功能形成服务闭环,增强用户平台粘性。综上,该系统依托技术优势解决京东“信息过载”与推荐低效问题,实现“个性化推荐+高效管理”双重目标,为商品运营优化提供支撑。模块化设计具备可扩展性,后续可基于现有架构迭代功能,适配更多电商场景。 关键词:个性化推荐,推荐系统,Spring Boot,MySQL

小码学长计算机程序设计

wxhook_产物_20261009

包含 wxhook_产物_20261009.zip 的资源包

鱿鱼助手

海上水面目标检测数据集VOC+YOLO格式12316张10类别.md

亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: **本资源原本已设置为“0积分下载”**,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,**自动将部分资源的积分调整为非0数值**(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 **因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。** 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。**强烈建议:仅在页面显示为0积分时进行下载。** 另外,本资源描述中**并未直接提供具体的下载地址或外部链接**,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!

fl176831

毕业设计含文档和代码vb+access工资管理系统(系统+答辩PPT+论文+开题报告+外文翻译)

毕业设计含文档和代码vb+access工资管理系统(系统+答辩PPT+论文+开题报告+外文翻译)

zz_ll9023
评论
收藏 已收藏
分享
返回顶部