软工结对编程

团队

罗文达 M23385409
张涵瑞 M23385408
张涵瑞负责代码编写,及代码测试
罗文达负责代码修改,及文档撰写
代码仓库
lwd 和 zhr 的代码仓

psp

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1030
Estimate估计这个任务需要多少时间1020
Development开发200400
Analysis需求分析 (包括学习新技术)100200
Design Spec生成设计文档50100
Design Review设计复审3060
Coding Standard代码规范 (为目前的开发制定合适的规范)2030
Design具体设计40100
Coding具体编码100200
Code Review代码复审1020
Test测试(自我测试,修改代码,提交修改)3060
Reporting报告3060
Test Repor测试报告3060
Size Measurement计算工作量1020
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划1010
合计5801370
主要修改在代码的重新编写,具体编码的前置即了解cpp相关技术花费了许多时间。

每日任务

10.13 进行项目的具体的计划与分工,商量好彼此事务

10.14 需求分析以及相关设计文档,规范的制定及仓库的连接,调试。

10.15 10.16 基础知识的补齐及代码的编写

10.17 代码的查缺补漏以及测试用例的编写

10.20 发现代码的漏洞进行重新修改

10.21 编写文档

解题思路描述

在这里插入图片描述
主要设计了三个模块
生成算数题及可视化
用户结果比对
存入文件模块

程序实现过程

在这里插入图片描述

源代码介绍

初代代码因为覆盖所以丢失,以下为更新的代码,解决了初代代码通过分开两次运算未考虑乘除号优先进行运算的问题,及解决了除法四舍五入的相关问题。

#include<iostream>
#include<stdlib.h>
#include<fstream>
//类c++的结构化编程

using namespace std;
struct opeartion_number generate_number();//随机生成三个小于100,且计算结果小于100的数
void four_operation();					  //随机生成操作数,进行四则运算,并返回结果值
struct opeartion_number {				  //结构体存储随机产生的数
	int number0 = 0;
	int number1 = 0;
	int number2 = 0;
}method_number,get_number,test_number;
void write_txt(int score);                //将成绩写入txt文档
void read_txt();                          //读存储的所有成绩
void clean_txt();						  //清除文档内容

int fouroperation(int a, int b, int c) { //c代表运算类型,a和b代表传入的数据
	float temp;
	int result;
	switch (c) {
	case 0:
		result = a + b;
		break;
	case 1:
		result = a - b;
		break;
	case 2:
		result = a * b;
		break;
	case 3://除法四舍五入
		temp = (float)a / (float)b;
		result = a / b;
		if (temp - result >= 0.5) {
			result++;
		}
		break;
	}
	return result;
} 
int main() {
	four_operation();
}
struct opeartion_number generate_number() {
	srand((unsigned)time(NULL)); //生成一组随机数
	//生成操作数
	int number0 = 0;
	int number1 = 0;
	int number2 = 0;
	//number接受生成的随机数
	do {
		number0 = rand() % 100;
		number1 = rand() % 100;
		number2 = rand() % 100;
	} while ((number0 * number1 * number2 > 100) || (number0 == 0 || number1 == 0 || number2 == 0));
	method_number.number0 = number0;
	method_number.number1 = number1;
	method_number.number2 = number2;
	return method_number;
}
void four_operation() {
	int operator1 = 0; //操作符编号,0加,1减,2除,3乘;
	int operator2 = 0;
	int n = 0; //用户定义产生的题目数量。
	int result = 0;
	int temp = 0; 
	int input_result = 0;
	int score = 0;
	cout << "请自定义出题的数量\n";
	cin >> n;
	for (int i = 0; i < n; i++) {
		get_number = generate_number();
		//operation_number接收产生的随机数,随机数只在1-4之间产生
		operator1 = rand() % 4;
		operator2 = rand() % 4;
		//可视化模块
		switch (operator1) {
		case 0:
			cout << get_number.number0 << "+" << get_number.number1;
			break;
		case 1:
			cout << get_number.number0 << "-" << get_number.number1;
			break;
		case 2:
			cout << get_number.number0 << "*" << get_number.number1;
			break;
		case 3:
			cout << get_number.number0 << "/" << get_number.number1;
		}
		switch (operator2) {
		case 0:
			cout << "+" << get_number.number2 << "=" <<endl;
			break;
		case 1:
			cout << "-" << get_number.number2 << "=" <<endl;
			break;
		case 2:
			cout << "*" << get_number.number2 << "=" <<endl;
			break;
		case 3:
			cout << "/" << get_number.number2 << "=" <<endl;
		}
		if (operator1 < 2 && operator2 > 1) {
			temp = fouroperation(get_number.number1, get_number.number2, operator2);
			result = fouroperation(get_number.number0, temp, operator1);
		}
		else {
			temp = fouroperation(get_number.number0, get_number.number1, operator1);
			result = fouroperation(temp, get_number.number2, operator2);
		}
		cin >> input_result;
		if (input_result == result) {
			score++;
			cout << "答案正确" << endl;
		}
		else {
			cout << "答案错误!" << endl << "正确答案为:" << result << endl;
		}
	}
	score = score * (100 / n);
	cout << "本次得分为:" << score << endl;
	write_txt(score);
	read_txt();
}
void write_txt(int score) {
	//创建txt并将得分存入
	fstream f;
	f.open("score.txt", ios::app);
	f << "本次得分为:" << score << endl;
	f.close();
}
void read_txt() {
	fstream f;
	//让用户确认是否需要读取以往的成绩,1为查看,0为不查看
	cout << "您是否想要读取数据,是:1;否:0" << endl;
	int intent;
	cin >> intent;
	if (intent == 1) {
		f.open("score.txt", ios::in);
		string s;
		while (f >> s) {
			cout << s << endl;
		}
		f.close();
	}
}
void clean_txt() {
	//让用户确认是否要删除以往成绩,1为清除,2为保留
	fstream f;
	int intent;
	cout << "是否要清除以往的得分记录" << "是:1;否:0" << endl;
	cin >> intent;
	if (intent == 1) {
		f.open("score.txt", ios::out | ios::trunc);
		if (f.is_open()) {
			f.close();
		}
		else {
			cout << "文件打开失败" << endl;
		}
	}
}


上述展示为所有源代码。但是还有判断算式是否重复功能未实现,以及算术的难度未进行一个更加平稳的设计,只是单纯的进行了随机数设计算式。

代码运行结果

在这里插入图片描述
生成存储文件的txt文档。
在这里插入图片描述

代码效能分析

在这里插入图片描述
在这里插入图片描述

可以查看到gpu和cpu的使用情况。
加粗样式
可以看到函数cpu的使用情况

测试用例编写

在这里插入图片描述
该测试用例主要判断结果是否小于100。
在这里插入图片描述
该测试用例是判断是否存放进文件。

功能添加

			cout << "答案错误!" << endl << "正确答案为:" << result << endl;
			cout << "正确的答题步骤为:" << endl;
			if (operator1 < 2 && operator2 > 1) {
				cout << "first :" << get_number.number1 << opeChar[operator2] << get_number.number2 << "=" << temp << endl;
				cout << "second:" << get_number.number0 << opeChar[operator1] << temp << "=" << result <<endl;
			}
			else {
				cout << "first :" << get_number.number0 << opeChar[operator1] << get_number.number1 << "=" << temp << endl;
				cout << "second:" << temp << opeChar[operator2] << get_number.number2 << "=" << result <<endl;
			}
		}
	}

上述为代码功能所添加的片段,实现了对两次运算的分步进行
在这里插入图片描述
因为该代码功能的逻辑结构较为简单,实现的功能并不复杂,所以可拓展性较好,本质还是进行的面向过程的的编程,所以代码没有类,对象的特性。

心路历程

10.21

这次作业的完成情况很粗糙,很大一部分是错误的估计了代码的编写所需要花费的时间,中间一度钻了死胡同,对于如何解决先后运算的问题浪费了大量的时间,我们的问题是一直在空想讨论,而没有真正的实际结对编程过一次。也是到了21日的上午才把代码实现出来。,后续会把这个博客进行更新。
对于结对编程我们有了一个不太深刻的了解,是因为我和我的队友在软件工程上花费的时间远远不够,没有真正将软件工程开发视作一个严谨繁琐的过程。

10.28

增加了对错题的正确答题步骤的功能,主要实现了先加减后乘除的运算顺序发生变化的问腿,主要修改可视化模块的相关问题。并对完成的情况进行了测试。这次的增加给了冗余时间对作业进行补充,熟悉并使用了vs2022自带代码效能分析的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值