计算与软件工程 作业二
作业要求(https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10402)
作业1
预习
1.PSP(Personal Software Process)
特点:
• 不局限于某一种软件技术 (如编程语言), 而是着眼于软件开发的流程, 这样不同应用的工程师可以互相比较。
• 不依赖于考试, 而主要靠工程师自己收集数据, 然后统计提高。
• 在小型,初创的团队中, 高质量的项目需求很难找到,这意味着给程序员的输入质量不高,在这种情况下, 程序员的输出 (程序/软件) 往往质量不高, 然而这并不能全部由程序员负责。
• PSP 依赖于数据
• 需要工程师输入数据, 记录工程师的各项活动, 这本身就需要不小的代价。
• 如果数据不准确或有遗失, 怎么办? 让工程师编造一些?
• 如果一些数据不利于工程师本人 (例如: 花很多时间修改缺陷), 我们怎么能保证工程师能如实地记录这些数据呢?
• PSP的目的是记录工程师如何实现需求的效率, 而不是记录顾客对产品的满意度。
2.程序效能分析
分析方法:
(1)抽样(Sampling)
抽样就是当程序运行时,Visual Studio时不时看一看这个程序运行在哪一个函数内,并记录下来,程序结束后,Visual Studio就会得出一个关于程序运行时间分布的大致的印象。这种方法的优点是不需要改动程序,运行较快,可以很快地找到瓶颈。但是不能得出精确的数据,代码中的调用关系(CallTree)也不能准确表示。
(2)代码注入(Instrumentation)
代码注入就是将检测的代码加入到每一个函数中,这样程序的一举一动都被记录在案,程序的各个效能数据都可以被精准地测量。这一方法的缺点是程序的运行时间会大大加长,还会产生很大的数据文件,数据分析的时间也相应增加。同时,注入的代码也影响了程序真实的运行情况。
3.单元测试
创建的主要步骤
(1)设置数据(一个假想的正确的E-mail地址);
(2)使用被测试类型的功能(用E-mail地址来创建一个User类的实体);
(3)比较实际结果和预期的结果(Assert.IsTrue(target!= null);)。
好的单元测试的标准
(1)单元测试应该在最低的功能/参数上验证程序的正确性。
(2)单元测试必须由最熟悉代码的人(程序的作者)来写。
(3)单元测试过后,机器状态保持不变。
(4)单元测试要快(一个测试运行时间是几秒钟,而不是几分钟)。
(5)单元测试应该产生可重复、一致的结果。
(6)独立性,单元测试的运行/通过/失败不依赖于别的测试,可以人为构造数据,以保持单元测试的独立性。
(7)单元测试应该覆盖所有代码路径,包括错误处理路径,为了保证单元测试的代码覆盖率,单元测试必须测试公开的和私有的函数/方法。
(8)单元测试应该集成到自动测试的框架中。
(9)单元测试必须和产品代码一起保存和维护。
个人程序运行截图
作业二
1.使用 Gitee(码云)代码托管仓库(https://www.jianshu.com/p/2a03c225ea93)
配置本地的 Git 用户信息
本机生成SSH公钥
托管代码遇到一些困难,操作生疏,废了很长时间
git add . 将当前目录所有文件添加到git暂存区
git clone 把仓库克隆到本地会建一个文件夹(若是自己建立了文件夹就不必再clone)
git commit -m "initial commit" #提交并备注提交信息
(若出现错误:fatal: Not a git repository (or any of the parent directories): .git ,则输入git init)
git push origin master #将本地提交推送到远程仓库
2.gitee链接(https://gitee.com/tang_yuan-yuan/git-tang/blob/master/5.cpp)
3.代码
#include<iostream>
#include<time.h>
#include<math.h>
using namespace std;
int main()
{
cout<<"********************欢 迎 进 入 四 则 运 算 系 统*********************"<<endl;
Again:
double Ques1=1;
int Ques01;
int Ques2=1;
int Ques3=100;
char Ques4='y';
int Ques5=1;
char Ques6='n';
char Ques7='n';
double ans=0;
int right=0;
double alltime;
clock_t start, finish;
cout<<" 一.请输入题目数量:";
cin>>Ques1;
Ques01=floor(Ques1);
cout<<" 二.行间距(正整数):";
cin>>Ques5;
cout<<" 三.请输入算式中数值的最大值:";
cin>>Ques3;
while(1)
{
cout<<" 四.运算中需要乘除法吗?y:需要;n:不需要";
cin>>Ques4;
cout<<" 五.减法中需要有负数吗?y:需要;n:不需要";
cin>>Ques7;
cout<<"`````````````````````````````````````````````````````````````````````````"<<endl;
cout<<"开始答题:"<<endl;
srand(time(NULL));
if(Ques4=='y')
{
while(1)
{
if(Ques1<1)
{
cout<<"输入有误,请重新输入题目数量:";
cin>>Ques1;
Ques01=floor(Ques1);
}
else
{
start = clock();
for(int j=0;j<Ques01;j++)
{
if(j!=0&&j%Ques2==0)
{
for(int i=0;i<Ques5;i++)
{
cout<<endl;
}
}
int num1=rand()%Ques3;
int num2=rand()%Ques3;
int sign=rand()%4;
switch(sign)
{
case 0:
cout<<j+1<<":"<<" "<<num1<<"+"<<num2<<"="<<"\t";
cin>>ans;
if(ans==num1+num2)
{
cout<<"正确"<<endl;
right++;
}
else
{
cout<<"答错了!"<<endl;
cout<<"正确答案是:"<<num1+num2<<endl;
}
break;
case 1:
if(Ques7=='y')
{
cout<<j+1<<":"<<" "<<num1<<"-"<<num2<<"="<<"\t";
cin>>ans;
if(ans==num1-num2)
{
cout<<"正确"<<endl;
right++;
}
else
{
cout<<"答错了!"<<endl;
cout<<"正确答案是:"<<num1-num2<<endl;
}
}
else
{
if(num1>num2)
{
cout<<j+1<<":"<<" "<<num1<<"-"<<num2<<"="<<"\t";
cin>>ans;
if(ans==num1-num2)
{
cout<<"正确"<<endl;
right++;
}
else
{
cout<<"答错了!"<<endl;
cout<<"正确答案是:"<<num1-num2<<endl;
}
}
else
{
cout<<j+1<<":"<<" "<<num2<<"-"<<num1<<"="<<"\t";
cin>>ans;
if(ans==num2-num1)
{
cout<<"正确"<<endl;
right++;
}
else
{
cout<<"答错了!"<<endl;
cout<<"正确答案是:"<<num2-num1<<endl;
}
}
}
break;
case 2:
cout<<j+1<<":"<<" "<<num1<<"*"<<num2<<"="<<"\t";
cin>>ans;
if(ans==num1*num2)
{
cout<<"正确"<<endl;
right++;
}
else
{
cout<<"答错了!"<<endl;
cout<<"正确答案是:"<<num1*num2<<endl;
}
break;
case 3:
if(num2!=0)
{
cout<<j+1<<":"<<" "<<num1<<"/"<<num2<<"="<<"\t";
cin>>ans;
if(ans==num1/num2)
{
cout<<"正确"<<endl;
right++;
}
else
{
cout<<"答错了!"<<endl;
cout<<"正确答案是:"<<num1/num2<<endl;
}
}
else
{
j--;
}
break;
}
}
break;
}
}
finish = clock();
alltime = (double)(finish - start) / CLOCKS_PER_SEC;
cout<<"共答对"<<right<<"道题;"<<"答错"<<Ques01-right<<"道题。"<<"用时(秒):"<<alltime<<endl;
cout<<"继续努力!"<<endl;
break;
}
if(Ques4=='n')
{
while(1)
{
if(Ques01<1)
{
cout<<"输入有误,请重新输入题目数量:";
cin>>Ques1;
Ques01=floor(Ques1);
}
else
{
start = clock();
for(int j=0;j<Ques01;j++)
{
if(j!=0&&j%Ques2==0)
{
for(int i=0;i<=Ques5;i++)
{
cout<<endl;
}
}
int num1=rand()%Ques3;
int num2=rand()%Ques3;
int sign=rand()%2;
switch(sign)
{
case 0:
cout<<j+1<<":"<<" "<<num1<<"+"<<num2<<"="<<"\t";
cin>>ans;
if(ans==num1+num2)
{
cout<<"正确"<<endl;
right++;
}
else
{
cout<<"答错了!"<<endl;
cout<<"正确答案是:"<<num1+num2<<endl;
}
break;
case 1:
if(Ques7=='y')
{
cout<<j+1<<":"<<" "<<num1<<"-"<<num2<<"="<<"\t";
cin>>ans;
if(ans==num1-num2)
{
cout<<"正确"<<endl;
right++;
}
else
{
cout<<"答错了!"<<endl;
cout<<"正确答案是:"<<num1-num2<<endl;
}
break;
}
else
{
if(num1>num2)
{
cout<<j+1<<":"<<" "<<num1<<"-"<<num2<<"="<<"\t";
cin>>ans;
if(ans==num1-num2)
{
cout<<"正确"<<endl;
right++;
}
else
{
cout<<"答错了!"<<endl;
cout<<"正确答案是:"<<num1-num2<<endl;
}
break;
}
else
{
cout<<j+1<<":"<<" "<<num2<<"-"<<num1<<"="<<"\t";
cin>>ans;
if(ans==num2-num1)
{
cout<<"正确";
}
else
{
cout<<"答错了!"<<endl;
cout<<"正确答案是:"<<num2-num1<<endl;
}
break;
}
}
break;
}
}
}
break;
}
finish = clock();
alltime = (double)(finish - start) / CLOCKS_PER_SEC;
cout<<"共答对"<<right<<"道题;"<<"答错"<<Ques01-right<<"道题。"<<"用时(秒):"<<alltime<<endl;
cout<<"继续努力!"<<endl;
break;
}
else
{
cout<<"输入有误,请按要求输入!"<<endl;
}
}
cout<<endl;
while(1)
{
cout<<"还需要继续出题还是退出?(y:继续出题;n:退出)";
cin>>Ques6;
if(Ques6=='y')
{
goto Again;
}
if(Ques6=='n')
{
goto Exit;
}
else
{
cout<<"输入有误,请重新输入:";
}
}
Exit:
return 0;
}