计算与软件工程
作业要求 | https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454 |
---|---|
课程目标 | 在学习过程中加强实践能力的培养与软件工程思想的思考 |
该次作业在程序效能方面实现我的目标 | 设计单元测试,运行单元测试 |
参考文献 | https://www.cnblogs.com/SivilTaram/p/software_pretraining_cpp.html https://www.cnblogs.com/winscoder/p/3373241.html https://jingyan.baidu.com/article/d8072ac47c6701ec95cefd82.html https://www.cnblogs.com/tianguook/p/3998135.html |
本次作业 | https:////www.cnblogs.com/Rachelee/p/12446846.html |
作业一
数组中最大子数组的和
用类/函数来实现
需求:希望返回 3 种信息
最大子数组的和
最大子数组开始的下标
最大子数组结束的下标
单元测试
a)创建单元测试函数的主要步骤:
(1)设置数据(一个假想的正确的E-mail地址);
(2)使用被测试类型的功能(用E-mail地址来创建一个User类的实体);
(3)比较实际结果和预期的结果(Assert.IsTrue(target!= null);)。
b)单元测试应该准确、快速地保证程序基本模块的正确性。下面是验证单元测试好坏的一系列标准:
单元测试应该在最低的功能/参数上验证程序的正确性。
单元测试必须由最熟悉代码的人(程序的作者)来写。
单元测试过后,机器状态保持不变。
单元测试要快(一个测试运行时间是几秒钟,而不是几分钟)。
单元测试应该产生可重复、一致的结果。
独立性,单元测试的运行/通过/失败不依赖于别的测试,可以人为构造数据,以保持单元测试的独立性。
单元测试应该覆盖所有代码路径,包括错误处理路径,为了保证单元测试的代码覆盖率,单元测试必须测试公开的和私有的函数/方法。
单元测试应该集成到自动测试的框架中。
单元测试必须和产品代码一起保存和维护。
//返回一个整数数组中最大子数组的和(数组首尾相连)
#include<iostream>
#include<cstdlib>
#define N 100
using namespace std;
//构造子数组结构
typedef struct SArray
{
int Sdata; //子数组中的数
int start; //子数组的起始位置
int end; //子数组的终止位置
}SArray;
//构造链表的存储结构
typedef struct LNode
{
int data; //数
int position; //数所在数组中的位置
struct LNode *next; //指针
}LNode, *LinkList;
//创建循环链表
void CreateList(LinkList &L, int Group[], int n)
{
L = new LNode;
L->next = NULL;
LNode *r;
r = L;
for (int i = 0; i < n - 1; i++)
{
LNode *p;
p = new LNode;
p->data = Group[i];
p->position = i + 1;
p->next = NULL;
r->next = p;
r = p;
}
LNode *p;
p = new LNode;
p->data = Group[n - 1];
p->position = n;
p->next = L->next;
r->next = p;
}
//返回最大子数组
SArray Compare(LinkList L, int Length)
{
SArray MaxSum[N][2];
//MaxSum[N][0].Sdata表示前N-1个数中,最大的子数组
//MaxSum[N][1].Sdata表示前N-1个数的最大的子数组和加第N个数的和与第N个数相比的最大值
LNode *r;
r = L->next;
MaxSum[0][0].Sdata = MaxSum[0][1].Sdata = r->data;
MaxSum[0][0].start = MaxSum[0][1].start = r->position;
MaxSum[0][0].end = MaxSum[0][1].end = r->position;
for (int i = 1; i < Length; i++)
{
if (MaxSum[i - 1][0].Sdata > MaxSum[i - 1][1].Sdata)
{
MaxSum[i][0].Sdata = MaxSum[i - 1][0].Sdata;
MaxSum[i][0].start = MaxSum[i - 1][0].start;
MaxSum[i][0].end = MaxSum[i - 1][0].end;
}
else
{
MaxSum[i][0].Sdata = MaxSum[i - 1][1].Sdata;
MaxSum[i][0].start = MaxSum[i - 1][1].start;
MaxSum[i][0].end = MaxSum[i - 1][1].end;
}
if (MaxSum[i - 1][1].Sdata + r->next->data > r->next->data)
{
MaxSum[i][1].Sdata = MaxSum[i - 1][1].Sdata + r->next->data;
MaxSum[i][1].start = MaxSum[i - 1][1].start;
MaxSum[i][1].end = r->next->position;
}
else
{
MaxSum[i][1].Sdata = r->next->data;
MaxSum[i][1].start = r->next->position;
MaxSum[i][1].end = r->next->position;
}
r = r->next;
}
if (MaxSum[Length - 1][0].Sdata > MaxSum[Length - 1][1].Sdata)
{
return MaxSum[Length - 1][0];
}
else
{
return MaxSum[Length - 1][1];
}
}
//将含n个数的循环数组依次从各个点断开,产生n个含n个数组的单链数组
SArray Divide(LinkList L, int length)
{
LinkList LGroup[N]; //头节点集合
LNode *r;
r = L;
for (int i = 0; i < length; i++)
{
LGroup[i] = r;
r = r->next;
}
SArray MaxGroup[N]; //分成的各个数组的最大子数组的集合
for (int i = 0; i < length; i++)
{
MaxGroup[i].Sdata = Compare(LGroup[i], length).Sdata;
MaxGroup[i].start = Compare(LGroup[i], length).start;
MaxGroup[i].end = Compare(LGroup[i], length).end;
}
SArray Max = MaxGroup[0]; //各个数组的最大子数组和的最大值
for (int i = 1; i < length; i++)
{
if (Max.Sdata < MaxGroup[i].Sdata)
{
Max.Sdata = MaxGroup[i].Sdata;
Max.start = MaxGroup[i].start;
Max.end = MaxGroup[i].end;
}
}
return Max;
}
int main()
{
int Number[N]; //整数数组
int length; //数组长度
cout << "请输入一个整型数组:" << endl;
cin >> Number[0];
length = 1;
while (getchar() != '
')
{
cin >> Number[length++];
}
LinkList L;
CreateList(L, Number, length);
cout << "该数组中的最大的子数组和为:";
cout << Divide(L, length).Sdata << endl;
cout << "该最大子数组的起始位置为:";
cout << Divide(L, length).start << endl;
cout << "该最大子数组的终止位置为:";
cout << Divide(L, length).end << endl;
system("pause");
return 0;
}
void TestMethod1()
{
//
// TODO: 在此处添加测试逻辑
//
int array[]={-32,16,-3,27,-1,4,12,11,10,-9,18};
Assert::AreEqual(85,Divide(L, length).Sdata);
Assert::AreEqual(2,Divide(L, length).start);
Assert::AreEqual(11,Divide(L, length).end);
};
运行结果截图
码云的链接
https://gitee.com/Rachelee/firstwarehouse
作业二
三年学习回顾
信息与计算科学专业主要课程包括数学分析、高等代数、几何、概率统计、数学模型、离散数学、实变函数、复变函数、微分方程、c/c++语言、java语言、数据库应用技术、软件系统、操作系统等。
作为一名大三的学生,已经大概熟悉了高等代数、数学分析、java语言等基础课程,学习到了数学学科的专业知识以及计算机学科的一些基础的小技能,深刻认识到数学思维的逻辑性、严密性、灵活性,能够简单地使用C++、JAVA以及Matlab等软件进行一些小程序的编写和基本的数学计算。
信息与计算科学专业要求能熟练的操作计算机并且有一定的数学基础,初步具备在信息与计算科学领域的某个方向上从事科学研究,具备设计开发有关软件的能力能解决实际问题。自身在程序设计和代码编写上下的功夫不够,花费的时间精力都较少,所以能力欠缺不足,有待提升。
日后学习方向主要是数学技能的学习,计算机为辅,与此同时不断重视自己解决科学计算,信息处理与编码、建立数学模型能力的培养。在教育教学的相关知识和实践能力上也要查漏补缺,不断去学习,抓住机会实践。
预习作业
代码规范与代码复审
-代码风格的原则是:简明,易读,无二义性。
(1)代码风格规范:可以从缩进、行宽、括号、断行和空白的{}行、分行、命名、下划线问题、大小写问题和注释方面来改进。
(2)代码设计规范:代码设计规范不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式等方方面面,这里有不少与具体程序设计语言息息相关的内容(如C、C++、Java、C#),但是也有通用的原则,这里主要讨论通用的原则。这里有函数、goto、错误处理、如何处理C++中的类。
(3)代码复审的正确定义:看代码是否在“代码规范”的框架内正确地解决了问题
目的:找出代码的错误;发现逻辑错误;发现算法错误;发现潜在的错误和回归性错误;发现可能改进的地方;教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。