软件工程第一次个人编程作业

小茄77 小茄77 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

 

 

这个作业属于哪个课程构建之法-2021秋-福州大学软件工程
这个作业要求在哪里2021秋软工实践第一次个人编程作业
这个作业的目标实现一个程序功能,它可以对读入的C或C++代码文件进行不同等级的关键字提取。
学号031902334

GitHub仓库地址:CC仓库

PSP表格

PSP预估耗时(分钟)实际耗时(分钟)
计划1520
估计任务需要多长时间785950
开发----
需求分析(包括学习新技术)6070
生成设计文档3030
设计复审1010
代码规范2030
具体设计6080
具体编码300360
代码复审100100
测试80100
报告6050
测试报告2030
计算工作量1515
事后总结1525
合计785

950

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解题思路

  • 先进行文件的读取和分析
  • 将字符进行分割和保存
  • 与关键字进行比对
  • 统计switch及对应case数量

因为考虑到自己现有的能力,所以只进行到switch查找的任务,并不考虑有switch嵌套的复杂情况。

流程图如下:

代码说明

文件读取

在网上搜索了如何读取文件,并最终选用如下的方法逐行读取,运用getline()

有个小插曲是我不知道怎么在Mac上找到文件的地址,搜了半天才弄清楚是要拷贝文件然后在终端粘贴就可以得到地址。

std::fstream in("/Users/dongxiaoou/Documents/test.txt",std::fstream::in);
    //表示以只读方式打开文件

提取英文字符 识别到分隔符后进行保存 删除注释

因为关键字都是字母,所以我选择提取文件中所有的英文字母字符,并将' '、'<'、'>'、'='、'{'、'}'、'/n'、'.'视为分割符号,当字符串后有这些时,认为前面部分是一个整体,并保存在arr字符串数组中。同时识别连续两个'/'字符,认为改行其后语句为注释语句,将其删除。

while (getline(in, text))
    {
      for(int k=0;k<text.length();k++){
        int flag=0;
          sc=text[k];
        if(('a'<=sc&&sc<='z')||('A'<=sc&&sc<='Z'))//将字母存入字符数组中
              tra[i++]=sc;
        if(sc==' '||sc=='>'||sc=='<'||sc=='='||sc=='{'||sc=='('||sc=='\n'||sc=='.')
            //字母后有符号则存入字符串数组等待判断
        {
            arr[j]=tra;//存入字符串数组中
           memset(tra,'\0',sizeof(tra));//将字符数组清零
            i=0;
            j++;
        }
         if(sc=='/')//删除注释语句
         {
             if(flag==0)
                 flag=1;
             if(flag==1)
                 break;
         }
       }
     }

进行关键字的比对和记录 

将arr字符串依次与关键字字符串进行比较,运动了compare函数,如果相同,则将tol数量+1。

for(int x=0;x<j;x++)  //关键字判断
    {
        for(int y=0;y<=31;y++)
        {
            //看是否有关键字
            if(keyword[y].compare(arr[x])==0)
                tol++;
        }
    }

统计switch和case的数量

对switch进行识别,同样运用了compare函数,如果识别到switch,*则接下来开始识别case,如识别到case,对存放case数量的数组元素进行加1操作。如果接下来识别到了switch,则认为到达了下一组switch结构,对存放case数量数组ncase的下标进行加1操作,重复*后的操作。

//不考虑switch嵌套的复杂情况 统计switch和case的数量
    int nswitch=0,ncase[200];
    int nc=0;
    for(int x=0;x<j;x++)
    {
        if(arr[x].compare(keyword[0])==0){
            nswitch++;
            nc++;
        }
        if(arr[x].compare(keyword[3])==0){
            ncase[nc]++;
        }
    }

完整代码

#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main()
{
    int tol=0;
    int i=0,j=0;
    char sc;
    std::fstream in("/Users/dongxiaoou/Documents/test.txt",std::fstream::in);
    //表示以只读方式打开文件
    string arr[100005];  //建立字符串数组
    string text;         //读取到的一行字符串
    char tra[250];      //作为临时存储的字符数组
    while (getline(in, text))
    {
      for(int k=0;k<text.length();k++){
        int flag=0;
          sc=text[k];
        if(('a'<=sc&&sc<='z')||('A'<=sc&&sc<='Z'))//将字母存入字符数组中
              tra[i++]=sc;
        if(sc==' '||sc=='>'||sc=='<'||sc=='='||sc=='{'||sc=='('||sc=='\n'||sc=='.')
            //字母后有符号则存入字符串数组等待判断
        {
            arr[j]=tra;//存入字符串数组中
           memset(tra,'\0',sizeof(tra));//将字符数组清零
            i=0;
            j++;
        }
         if(sc=='/')//删除注释语句
         {
             if(flag==0)
                 flag=1;
             if(flag==1)
                 break;
         }
       }
     }
    string keyword[] = {"switch","auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","register","return","short","signed","sizeof","static","struct","typedef","union","unsigned","void","volatile","while"};
    //将关键字输入keyword字符串数组
    for(int x=0;x<j;x++)  //关键字判断
    {
        for(int y=0;y<=31;y++)
        {
            //看是否有关键字
            if(keyword[y].compare(arr[x])==0)
                tol++;
        }
    }
    //不考虑switch嵌套的复杂情况 统计switch和case的数量
    int nswitch=0,ncase[200];
    int nc=0;
    for(int x=0;x<j;x++)
    {
        if(arr[x].compare(keyword[0])==0){
            nswitch++;
            nc++;
        }
        if(arr[x].compare(keyword[3])==0){
            ncase[nc]++;
        }
    }
    cout<<"total num: ";
    cout<<tol<<endl;
    cout<<"switch num: ";
    cout<<nswitch<<endl;
    cout<<"case num: ";
    for(int i=1;i<=nc;i++)
        cout<<' '<<ncase[i];
    cout<<endl;
    in.close();
    return 0;
}

单元测试

结果与预期一致 但仅对简单样例进行测试 复杂代码可能会出现错误 当前能力还不足以解决更复杂情况 会通过之后的学习努力提高

性能测试

自己电脑没有搞清楚怎么做,所以把自己的代码发给同学帮忙进行了测试。。

作业总结

  •     在一开始的github使用中就遇到了一些问题,因为是之前从未接触过的东西,还是全英文,所以感到使用起来有一些吃力,在自己查阅资料和寻求同学帮助之后创建了仓库并学会了上传文件,也初步熟悉了GitHub的界面。
  •    由于编程能力的欠缺,所以很多想法在脑子里却不能通过代码表达出来,所以还要通过之后的不断学习、练习来弥补。
  •    基本了解了c++中文件读取的方法,算是掌握了一个小小的新技能。
  •    之前就对字符串的掌握不够熟练,通过这次作业复习了一些之前学习过的对字符串处理的函数,也学习到了对字符串整体进行清空操作的memset函数。
  •    本次作业实现使用的都是最基本的循环结构和字符串的运用,没能用到栈的知识,因为自己对其掌握非常欠缺,导致代码处理复杂问题可能会出现错误。会吸取这次的经验教训,在之后的时间里花费更多时间去学习知识和完善自己。

 

 

...全文

相关推荐

高校技术转移办公室人员如何高效开展技术需求挖掘工作?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

科技中介服务机构如何提升服务的专业性与用户粘性?.docx

科技中介服务机构如何提升服务的专业性与用户粘性?

BIZKEEN

高校技术转移办公室人员在组织科研成果展示时,如何提升推介材料的专业性与吸引力?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

三相并网逆变器无功功率扰动+孤岛检测控制算法仿真【参考文献+仿真】

内容概要:本文系统梳理了一套面向电力电子与新能源并网领域的仿真研究资源,聚焦三相并网逆变器的关键控制技术,涵盖无功功率扰动、孤岛检测算法、低电压穿越(LVRT)、中点电位平衡、虚拟同步发电机(VSG)、下垂控制、模型预测控制(MPC)、准PR控制及LCL滤波器设计等核心技术。资源包含多种逆变器拓扑结构(如T型三电平、Z源、ANPC、四桥臂等)的Simulink仿真模型,并结合扫频法进行正负序阻抗建模与稳定性分析,强调通过复现经典科研案例提升实际科研能力,适用于电力系统稳定性、微电网运行与可再生能源并网等方向的研究与验证。; 适合人群:电力电子、电气工程及其自动化、新能源科学与工程等相关专业的高校研究生、科研人员及从事光伏、储能逆变器开发的工程技术人员,需具备MATLAB/Simulink仿真基础和一定的电力系统控制理论知识。; 使用场景及目标:① 掌握三相并网逆变器在孤岛检测、无功调节、不平衡电网等复杂工况下的先进控制策略设计与仿真方法;② 借助提供的仿真模型与参考文献快速搭建科研平台,用于论文复现、课题开发或项目验证;③ 深入理解VSG、MPC、阻抗建模与下垂控制等关键技术的实现机制与工程应用路径。; 阅读建议:建议结合文中提供的网盘链接与公众号“荔枝科研社”获取完整仿真模型与参考资料,按照目录顺序循序渐进学习,注重理论推导与仿真实践相结合,优先复现基础模型再进行参数优化与创新拓展。

程序辅导帮

香橙派5-uefi-edk2-spi-flash镜像

香橙派5-uefi-edk2-spi-flash镜像

星际海的蜗牛
评论
收藏 已收藏
分享
返回顶部