团队
罗文达 M23385409
张涵瑞 M23385408
张涵瑞负责代码编写,及代码测试
罗文达负责代码修改,及文档撰写
代码仓库
psp
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 30 |
Estimate | 估计这个任务需要多少时间 | 10 | 20 |
Development | 开发 | 200 | 400 |
Analysis | 需求分析 (包括学习新技术) | 100 | 200 |
Design Spec | 生成设计文档 | 50 | 100 |
Design Review | 设计复审 | 30 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
Design | 具体设计 | 40 | 100 |
Coding | 具体编码 | 100 | 200 |
Code Review | 代码复审 | 10 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 30 | 60 |
Test Repor | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 10 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 580 | 1370 | |
主要修改在代码的重新编写,具体编码的前置即了解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自带代码效能分析的功能。