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

031902622伍海南 2021-09-19 15:25:05
这个作业属于哪个课程构建之法-2021秋-福州大学软件工程
这个作业要求在哪里https://bbs.csdn.net/topics/600574694
这个作业的目标实现一个程序,对代码文档进行关键字提取与匹对
学号031902622

PSP表

 

PSP Stages
估计时间/h
完成时间/h
计划0.20.2
时间预估0.10.4
开发--
需求分析33
生成设计文档--
设计复审--
代码规范12
具体设计33
具体编码1514
代码复审--
test11
报告21
测试报告--
计算工作量0.10.1
总结与提高24
总计27.428.7

 

解题思路分析:

题目要求:


实现一个程序功能,它可以对读入的C或C++代码文件进行不同等级的关键字提取。

基础要求:输出关键字统计信息

进阶要求:输出有几组switch case结构,同时输出每组对应的case个数

拔高要求:输出有几组if else结构

终极要求:输出有几组if,else if,else结构

执行时,需向程序传入两个参数,第一个参数是代码文件的路径,第二个参数是完成等级(从低到高为1,2,3,4)
 

功能分析:

 

  • 文件地址规范功能与文件读取功能。
    • 文件地址规范:对用户输入的地址中的反斜杠进行复写
    • 文件读取:采用字符串一个一个读取。
    • 我的实现代码
      void BackslashSolve( string & file_name) 
      {
      	int s = file_name.length();
      	stack <char> temp;
      	while(s--)
      	{
      		temp.push(file_name[s]);
      	}
      	file_name ="";
      	while(!temp.empty())
      	{
      		file_name+=temp.top();
      		if(temp.top() == '\\')
      			file_name += '\\';
      		temp.pop();
      	}
      }

       

  • 关键字提取
    • 首先实现字符串转变为只包含英文字母的字符串
    • 然后对字符串进行关键字判断
    • 字符串转为只有英文字母的问题我参考了我们班一位同学的代码, https://github.com/fenriliuguang/031902217_psy/blob/master/code_1/src/main.cpp
    • 我的实现代码
      if( ( isalpha(file_word[i]) && !isalpha(file_word[i+1]) ) )
       				temp_string = file_word.substr(index,i+1-index);
       				
       else 
       				temp_string = file_word.substr(index,i+2-index);

       

  • switch-case的配对;
    • switch 的数目就是switch-case的数目
    • case 统计:switch 中包含了 case,break,default,在关键字队列中判断只要后续字符串不是这三词就退出 case 统计循环
    • 我的实现代码
      if(keyword_queue.front() == "switch")
      {
      			keyword_queue.pop();
      			
      			while((keyword_queue.front() == "case" || keyword_queue.front() == "break" || keyword_queue.front() == "default") && !keyword_queue.empty())
      			{
      				if(keyword_queue.front() == "case")
      					f.sum_case[f.case_number]++;
      
      				keyword_queue.pop();
      			}
      			f.case_number++;
      }

      这里可以将case数组改成case链表

  • if-else与if-else-if的判断
    • 用一个栈,在队列中判断是否是 if 与 elseif(else if  在分别将 else  与  if  的关键字数目 +1 后将其变成 elseif 存储在队列中),如果是就将其入栈
    • 在队列中判断 else ,然后判断前一个是 if 还是 elseif,是 if 将 if-else +1 并出栈 if ,是elseif将if-elseif-else +1 并一直出栈到第一个 if 出栈。
    • 我的实现代码
      if(keyword_queue.front() == "if")
      {	
      			temp.push(keyword_queue.front());
      			keyword_queue.pop();
      		}
      		else if(keyword_queue.front() == "elseif")
      		{
      			temp.push(keyword_queue.front());
      			keyword_queue.pop();
      		}
      		else if(keyword_queue.front() == "else")
      		{
      			if(temp.top() == "if")
      			{
      				i++;
      				f.sum_if_else++;
      				temp.pop();
      			 } 
      			else 
      			{
      				
      				while(temp.top() == "elseif" && !temp.empty())
      				{
      					temp.pop();
      				}
      				if(!temp.empty())
      				{
      					j++;
      					f.sum_if_elseif_else++;
      					temp.pop();
      				}
      			}
      			keyword_queue.pop();
      
      }

       

前置要求

 

源代码

test/Optimized_version.cpp at master · aharda/test (github.com)

 

代码性能分析

其中<istrream>占用时间最多

 

测试代码 :给的代码案例,另外对给的代码做了注释并测试。



总结:

  • 由于太久没写代码,出现了很多问题,折磨了很久。如下
    • 使用队列函数没有加(),报的错误,上网找找麻了,也没找到答案,后来重新打开代码,使用再次队列函数时发现了这个问题。
    • 很多库函数不会使用,在网上查询答案。
    • 还有那个性能分析,还是不太懂。

后续计划:

  • 继续学习正在学习的java
  • 准备学习微信小程序的开发
  • 继续熟悉git与github的使用

 

...全文
334 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
SoftwareTeacher 2021-09-22
  • 打赏
  • 举报
回复

还有那个性能分析,还是不太懂。

请花时间搞懂这个分析工具。

031902622伍海南 2021-09-24
  • 举报
回复
@SoftwareTeacher 后面查了资料,发现并不难,了解了这些专业术语并查了它们的具体含义就理解了大多了。

189

社区成员

发帖
与我相关
我的任务
社区描述
福州大学软件工程教学,推行邹欣老师“构建之法”。
软件工程 高校
社区管理员
  • Dawnfox
  • REP1USONE
  • 纪华裕
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧