2023《软件工程》第一次作业

 姓名:邵卓承                   学号:M23182705

个人情况介绍

  • 经历:我对编程的学习仅停留在本科阶段C语言基础与计算机二级考试的学习,在学习STM32入门时接触过一点工程软件,这也是我接触的最困难的编程。
  • 认识:计算机和软件开发对我的研究生阶段的研究有所帮助,但是我的基础比较差,希望通过这门课程对软件开发有一个基本的概念。
  • 规划:我的研究方向需要用到编程相关技能,希望通过学习课程至少能大致看懂代码作用,以及一个软件的大致形成过程,对软件工程有一个初步的认识。
  • 目标:在我的想象中,软件工程作为一个选修课,应该偏向科普与趣味性,可能是全过程教写一个最简单的软件,让我能大致了解一个软件的形成过程,但实际上与设想有些偏差,课程内容更偏向于专业性。由于这门课程与我的研究方向关联性不是很强,我的学习可能更多停留在浅层的了解,而不会花费太多时间。

理论学习

  • 理论学习:

  • 读后感:

《人月神话》的读后感

        在通过听书软件对整本书进行通篇阅读,并查询相关解读资料后,这本书给我留下了深刻的印象。通过深入浅出的方式,作者向我们展示了软件工程的复杂性和艺术性。虽然我本身不是从事程序相关的工作人员,对软件工程也接触尚浅,对于书中的一些案例无法感同身受,但是我认为这本书适合所有群体,对于我来说,这本书的价值就在于让我认识到程序员在一个软件工程项目中有哪些困难,对于一个程序初学者或者一个外行的领导者来说都是获益匪浅。

        这本书对程序员面临的困难以及会导致工期延误的原因概括起来有以下四项:

  1. 程序员本身对程序的质量过于乐观,认为程序总会根据自己的设想运行,而实际却总是在互相影响,而达不到想要的效果。
  2. 对人月的换算过于简单,编程的过程中不是简单的人越多工作越快的,而是有一定规律的,随着人数增加,效率会先上升后下降。
  3. 预留给代码质量审查以及排除错误的时间太少
  4. 与甲方沟通的过程中被甲方牵着鼻子走

        针对这些问题书中给出了以下的启示。

        首先是沟通和协调的重要性。在软件开发过程中,项目成员之间的相互理解和协作是至关重要的。无论是在需求分析、设计讨论、还是代码评审中,有效的沟通都是保证项目成功的关键。在与甲方沟通的过程中也要注意技巧,让他们理解工作的内容与流程,理解需求与工作的关系,帮助你制定合理的工作安排。

        其次正确预估软件项目的困难和挑战。在项目中,我们不仅要面对技术的难题,还要处理各种各样的人际关系问题。我们需要平衡客户的需求和技术实现,同时还要保证项目的进度和质量。不能对代码质量盲目乐观,也需要在进程安排中预留足够的时间给代码审查工作,保证规定时间内保质保量。

        最后,软件工程需要不断地学习和进步。随着技术的不断发展,我们需要不断地更新我们的知识和技能。只有这样,我们才能在竞争激烈的市场中保持竞争力。

        总的来说,《人月神话》是一本非常有价值的书。它不仅让我对软件工程有了初步的认识,还启发了我如何在未来的工作中更好地应用这些知识和经验。

        此外,我认为这本书的写作风格也非常适合初学者。作者使用了简洁明了的语言,使得读者可以轻松理解并投入到书中。同时,这本书也提供了很多生动的例子和实际案例,让读者可以更好地理解和应用书中的理论知识。

        在阅读这本书的过程中,我深深地感受到了软件工程的复杂性和挑战性。但同时,我也看到了软件工程在未来的学习研究中能对我产生很大帮助。我相信,通过不断的学习和实践,我们可以更好地应对软件工程中的各种技能,为我未来的研究提供新的思路和手段。

        总的来说,《人月神话》是一本理论与实践相结合的书。它不仅提供了对软件工程的深入理解,还提供了如何在实践中应用这些理论知识的建议和指导。我相信,这本书不仅会对我的学习和职业发展产生深远的影响,也会对所有对软件工程感兴趣的读者产生积极的影响。

实践学习 

  • 编程环境:对于课程的学习,我选择的编程环境是Visual Studio2022,具有常用功能如下

源代码管理

单元测试

性能测试 

本课程着重讲解了这些功能,其他功能还在摸索中。

另外,本课程还利用VMware虚拟环境学习了C_C++ LDRA Testbed工具

 

具有代码规范检查的功能 

还学习了Purecoverag、Purify、Quantify等具有不同形式反映代码质量的软件 

  • 代码仓库:

 作业中所有操作针对的代码均Fork自代码仓库(见链接)Gitee2023年秋Nextday代码仓库

Fork后我的仓库以及Pull、Push记录见代码仓库(见链接)Gitee2023年秋我Fork的代码仓库 

 工作记录

工作总览表

搭建编程环境
编写Nextday代码
学习单元测试功能
学习代码质量测试
学习代码规范检测
注册和加入Gitee班级

学习Fork代码仓库
学习上传自己的代码
学习Pull Request
提交作业

实验报告

程序效能分析实验报告:

实验名称: 程序效能分析

学号 M23182705 姓名 邵卓承 班级: 23级 实验时间:  2023年  9 月  23  日

一、实验目的及要求

  1. 了解程序效能分析工具;
  2. 掌握效能分析工具的使用;

二、实验方法

   在虚拟环境中使用PurifyPlus的三个组件,掌握操作方法;将正常运行模式下的操作截屏记入实验报告表中,并进行分析与总结。 

三、实验注意事项

认真听讲,不漏操作 

按实验任务要求完成操作练习 

实验报告打包后提交 

认真完成实验报告

四、实验内容

1. 运行PurifyPlus的三个组件,使用示例程序熟悉软件功能

①PureCoverage

 

②Purify

③Quantify

2.对计算器程序进行效能分析

由分析报告可看出,代码未及时释放系统内存,导致内存泄漏

3. 扩展实验

写一个程序,分析一个文本中各词出现的频率,并把频率最高的10个词打印出来。分析程序执行性能,并改进程序。

程序下载自网络:

#include <iostream>
#include <stdio.h>
#include "stdlib.h"
using namespace std;
double number=0;
int d=0;
struct word_cunchu
{
        double pinlv;
    char *word;
    int num;

};
word_cunchu k[8666];
char g[86666];
void qianshi()
{
    cout<<"单词"<<'\t'<<"次数"<<'\t'<<"频率"<<endl;
    if(d-1<=10)
    {
        for(int i=0;i<d-1;i++)
    {
        cout<<k[i].word<<'\t'<<k[i].num<<'\t'<<k[i].pinlv<<endl;
    }
    }
    else{
    for(int i=0;i<10&&i<d-1;i++)
    {
        cout<<k[i].word<<'\t'<<k[i].num<<'\t'<<k[i].pinlv<<endl;
    }
    }
    cout<<"总类:"<<d-1<<endl;
    cout<<"总个数:"<<number<<endl;
}
void chuli(char b[])
{
    int i=0,j,y;
    char *p;
    char *t;
    int kk;
    while((b[i]==';'||b[i]=='.'||b[i]==':'||b[i]=='"'||b[i]==','||b[i]==' '||b[i]==10||b[i]==13||b[i]=='!'||b[i]=='('||b[i]==')')&&b[i]!='\0') i++;

    for(;b[i]!='\0';)
    {
        if((b[i]==';'||b[i]=='.'||b[i]==':'||b[i]=='"'||b[i]==','||b[i]==' '||b[i]==10||b[i]==13||b[i]=='!'||b[i]=='('||b[i]==')')&&b[i]!='\0') {i++;continue;}
        else
        {
            j=0;
            p=new char[20];
            while(b[i]!=';'&&b[i]!='.'&&b[i]!=':'&&b[i]!='"'&&b[i]!=','&&b[i]!=' '&&b[i]!='\0'&&b[i]!=10&&b[i]!=13&&b[i]!='!'&&b[i]!='('&&b[i]!=')')
            {
            p[j]=b[i];
            i++;
            j++;
            }
            p[j]='\0';
            for(y=0;y<d;y++)
            {
                if(strcmp(p,k[y].word)==0) {k[y].num++;break;}
            }
            if(y==d)
            {
            k[d].word=p;
            k[d].num=1;
            d++;
            }
        }
    }
    j=0;
    for(i=0;i<d-1;i++)
    {
        for(j=0;j<d-1;j++)
        {
            if(k[j].num<k[j+1].num) {t=k[j].word;k[j].word=k[j+1].word;k[j+1].word=t;kk=k[j].num;k[j].num=k[j+1].num;k[j+1].num=kk;}
        }
    }
        for( i=0;i<d-1;i++)
    {
        number=number+k[i].num;
    }
        for( i=0;i<d-1;i++)
    {
        k[i].pinlv=k[i].num/number;
    }
}
void wenjian_R()
{
    FILE *fp;
    char ch;
    int i=0;
    char a[20];
    cout<<"输入文件名:";
    cin>>a;
    if((fp=fopen(a,"r"))==NULL)
    {
        printf("无法打开文件\n");
        exit(0);
    }
    while(!feof(fp))
    {
        g[i]=fgetc(fp);
        i++;
    }
    g[i]='\0';
    fclose(fp);
}
void main(int argc, char *argv[])
{
    wenjian_R();
    chuli(g);
    qianshi();
}

4.研究Visual Studio中效能分析工具使用。

由于基础薄弱,分析简单的第二天日期计算代码

代码如下:

#include <stdio.h>

#include<stdlib.h>



int main()

{

int year, month, day,yn=0;

int maxday[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

printf("请输入日期:");

scanf_s("%d%d%d", &year, &month, &day);

if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)

{

maxday[1] = 29;

}

if (year < 0) { yn=1; }

else {

if (month < 0 || month>12) { yn=1; }

else {

if (day <= 0 || day > maxday[month-1]) { yn=1; }

else {

day++;

if (day > maxday[month-1]) {

month++; day = 1;

if (month > 12) {

year++; month = 1;

}

}

}

}

}

if (yn == 1) { printf("error"); }

else { printf("第二天为%d年%d月%d日", year, month, day); }

return 0;

}

 

分析结果如下:

可以看出代码部分占用时间很少仅占11%

五、小结与建议

在一个软件的工程中,代码的效率是一个重要的指标,无论是程序的运行速度还是代码的安全性都跟程序的效能有关,删除无用的代码、错误的代码,优化反复运行的代码能够极大程度地提升代码的质量。

在我学习程序效能分析的过程中,能够直观地看出每行代码,每个函数的是否运行,运行占比大小,确定出死代码,由此来确定是否出现代码错误的情况,这些辅助软件对写代码有很大帮助。

而作为计算机编程的初学者,代码能否运行起来都有很大的问题,对于代码的效能不敢奢望,对于这门课程,由于基础差导致非常吃力,鉴于本课程选修课的本质,建议标注课程门槛,帮助选课学员做决定。

单元测试报告

姓名: 邵卓承 学号:M23182705

  • 测试对象

3.1 Testrian.c代码分析

代码用于三角形分类,输入三角形的三边长度,判断是不是三角形,如果是三角形则对三角形的形状进行分类

函数比较i、j和k的值,如果它们中有两个或三个值相等,那么将match的值相应地增加。match的值表示有几条边相等。

根据match的值来打印三角形的类型。如果match为0,则输出“not a triangle”;如果match为1,则输出“scalene”;如果match为2,则输出“isosceles”;如果match为3,则输出“equilateral”。

为表示异常数据流的函数

3.2 测试内容

使用Testbed的Tburn工具,对代码进行单元测试,设置测试样例并查看代码覆盖率。

  • 步骤
  1. 打开要测试的文件

  1. 选择单元测试

  1. 新建sequence

  1. 配置测试运行环境

(5) 新建测试用例

(6)运行测试

通过增加测试用例增加语句覆盖率与分支覆盖率

注意:配置环境前需安装编译环境,以MinGW为例:

下载MinGW(MinGW-w64 - for 32 and 64 bit Windows download | SourceForge.net)并配置环境变量

  • 总结与心得

由于虚拟机中Testbed版本不对无法操作,所以尝试了VS中的单元测试模块,测试代码如下:

#include <stdio.h>
#include<stdlib.h>

int main()
{
	int year, month, day,yn=0;
	int maxday[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	printf("请输入日期:");
	scanf_s("%d%d%d", &year, &month, &day);
	if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
	{
		maxday[1] = 29;
	}
	if (year < 0) { yn=1; }
	else {
		if (month < 0 || month>12) { yn=1; }
		else {
			if (day <= 0 || day > maxday[month-1]) { yn=1; }
			else {
				day++;
				if (day > maxday[month-1]) {
					month++; day = 1;
					if (month > 12) {
						year++; month = 1;
					}
				}
			}
		}
	}
	if (yn == 1) { printf("error"); }
	else { printf("第二天为%d年%d月%d日", year, month, day); }
	return 0;
}

操作步骤如下:

创建测试单元

选择新建项目

编辑测试代码

由于代码基础较差,代码是自己编写,但测试代码从网上复制,无法正确运行。

由此次实验,深感自己基础太差,对于专业的编程工具就算会用,不会编程也无济于事,希望在这门课结束前,我能通过自学、实践、上课逐渐掌握编程语言,能够顺利完成课业,并且将这门课的收获带到日后的学习研究中。

经过学习,学会了VS的单元测试功能。

代码如下:

#include "pch.h"
#include "CppUnitTest.h"
#include "..\Project5\FileName.cpp"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{
	TEST_CLASS(UnitTest1)
	{
	public:
		
		TEST_METHOD(TestMethod1)
		{
			int year = 2023, month = 2, day = 28;
			int nextYear, nextMonth, nextDay;
			getNextDay(year, month, day, nextYear, nextMonth, nextDay);
			std::cout << "下一天的日期是:" << nextYear << "年" << nextMonth << "月" << nextDay << "日" << std::endl;
			Assert::AreEqual(year, nextYear);
			Assert::AreEqual(month + 1, nextMonth);
			Assert::AreEqual(1, nextDay);
		}
	};
	TEST_CLASS(UnitTest2)
	{
	public:

		TEST_METHOD(TestMethod2)
		{
			int year = 2024, month = 2, day = 28;
			int nextYear, nextMonth, nextDay;
			getNextDay(year, month, day, nextYear, nextMonth, nextDay);
			std::cout << "下一天的日期是:" << nextYear << "年" << nextMonth << "月" << nextDay << "日" << std::endl;
			Assert::AreEqual(year, nextYear);
			Assert::AreEqual(month, nextMonth);
			Assert::AreEqual(29, nextDay);
		}
	};
	TEST_CLASS(UnitTest3)
	{
	public:

		TEST_METHOD(TestMethod3)
		{
			int year = 1900, month = 2, day = 28;
			int nextYear, nextMonth, nextDay;
			getNextDay(year, month, day, nextYear, nextMonth, nextDay);
			std::cout << "下一天的日期是:" << nextYear << "年" << nextMonth << "月" << nextDay << "日" << std::endl;
			Assert::AreEqual(year, nextYear);
			Assert::AreEqual(month + 1, nextMonth);
			Assert::AreEqual(1, nextDay);
		}
	};

}

代码审查报告

姓名: 邵卓承 学号:M23182705

  • 实验目的
  1. TestBed代码规范工具的使用(重点) 
  2. 通过工具找出代码问题并进行修改(难点) 
  • 测试对象

1代码分析

2 测试内容

使用Testbed,对代码进行代码审查。

  • 步骤

分析代码中典型问题,以及改进方法,可参考GJB8114

  1. 运行Testbed,使用示例程序熟悉软件功能 
  2. 对计算器程序进行代码规范分析。 
  3. 扩展实验 
    • 写一个程序,分析一个文本中各词出现的频率,并把频率最高的10个词打印出来。分析程序代码规范,并改进程序。 
  • 总结与心得

代码审查结果如下

码云的使用学习 

1.注册

2.加入班级

3.Fork代码

4.上传代码

5.Pull Request

(仓库链接见实践学习,过程截图见工作总览表)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值