作业归属 |
软件工程 |
作业要求 |
要求链接 |
作业目标 通过两人合作制作项目,提高自己在软件工程中多人项目的处理细节能力和交流能力 |
|
姓名: 黄家祯
学号: 3119005372
(语言小众,未在本班找到合适的队友)
队友:网上一起学习Go语言的失望同学(网名)
项目GitHub链接
项目PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
10 |
10 |
Estimate |
估计这个任务需要多少时间 |
5 |
0 |
Development |
开发 |
360 |
420 |
Analysis |
需求分析 (包括学习新技术) |
120 |
60 |
Design Spec |
生成设计文档 |
10 |
0 |
Design Review |
设计复审 |
10 |
0 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
30 |
10 |
Design |
具体设计 |
60 |
30 |
Coding |
具体编码 |
180 |
150 |
Code Review |
代码复审 |
20 |
20 |
Test |
测试(自我测试,修改代码,提交修改) |
120 |
60 |
Reporting |
报告 |
30 |
30 |
Test Repor |
测试报告 |
30 |
30 |
Size Measurement |
计算工作量 |
30 |
30 |
Postmortem & Process Improvement Plan |
事后总结, 并提出过程改进计划 |
30 |
30 |
|
合计 |
1045 |
880 |
效能分析
原来编写函数的时候是使用生成一个四则运算式子就运行一次文件读写操作,后来发现可以等全部式子生成后再一口气进行文件的读写,这就大大的减少了文件的io操作,提高了程序的运行效率。
设计实现过程
如图(每个文件中有若干个函数,这里就不详细展示了)
数据流动关系
代码说明
主函数部分代码
// 名字,预设值,用法(-help,能够返回参数提示)
var n = flag.Int("n",10,"int类型")
var r = flag.Int("r",10,"int类型")
var e = flag.String("e","./exercisefile.txt","学生答案文件路径")
var a = flag.String("a","./answerfile.txt","正确答案文件路径")
func main() {
//友好的控制台提示,可以看到自己的输入参数
flag.Parse()
fmt.Println("-n:", *n)
fmt.Println("-r:", *r)
fmt.Println("-e:", *e)
fmt.Println("-a:", *a)
pkg.OperationGenerated(*n,*r) //生成n个文件,范围0~r-1
pkg.CompareDocuments(*e,*a) //学生答案文件路径n和正确答案文件路径e
}
CompareDocuments.go部分代码
func CompareDocuments(name1 string, name2 string) { //批改答案函数,就是普通的字符串处理和比较,我就不加赘述了
file , err :=os.Open(name1)
file2 , err :=os.Open(name2)
if err != nil{
fmt.Println("open file err=",err)
return
}
defer file.Close()
defer file2.Close()
reader := bufio.NewReader(file)
reader2 := bufio.NewReader(file2)
i := 0
j := 0
k := 0
var s1 string
var s2 string
for{
i++
str,err :=reader.ReadString('\n')
str2,err :=reader2.ReadString('\n')
if str==str2{
j++
s1 += fmt.Sprintf("%d, ",i)
}else{
k++
s2 += fmt.Sprintf("%d, ",i)
}
if err == io.EOF {
break
}
}
j1:=strconv.Itoa(j)
k1:=strconv.Itoa(k)
var s4 = "Correct: "+j1+" ("
var s5 = "Wrong: "+k1+" ("
s1 = s4+s1+")"+"\n"
s2 = s5+s2+")"
s3 := s1+s2
s3=strings.Replace(s3, ", )", ")", -1)
Output(s3,"./Grade.txt")
}
测试运行
用户可以使用Myapp -help获取参数帮助,如果直接运行,系统将执行预设参数
题目生成器常规测试
结果
题目生成器压力测试
结果(大概是2秒内生成)
答案批改功能
测试结果1
测试结果2
测试结果3
项目小结
黄家祯:在这个结对项目中我主要实现了函数内部的逻辑关系和文件操作这两个部分,在处理问题过程中我发现了结对项目中,两个人的交流是必不可分的,充分的进行交流能够提高开发的效率。
失望同学:嗯。。就是简单的实现了几个函数,优化了自己对字符串的处理细节,整体来说两个人开发确实比一个人开发思考的东西更加多一点,也许思维的碰撞更加能够夯实自己的知识体系。