代码仓库地址:
王宇霄陈峰第二次任务安排: 按照课上分组,完成程序需求分析和设计,完成基本功能的编码工作。
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 45 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 200 | 144 |
Development | 开发 | 150 | 200 |
· Analysis | · 需求分析 (包括学习新技术) | 1000 | 680 |
· Design Spec | · 生成设计文档 | 10 | 15 |
· Design Review | · 设计复审 | 30 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 30 | 60 |
· Coding | · 具体编码 | 200 | 260 |
· Code Review | · 代码复审 | 20 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 15 | 30 |
Reporting | 报告 | 60 | 60 |
· Test Repor | · 测试报告 | 20 | 30 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 50 |
合计 |
二、学习日志
学习日期 | 学习时间 | 学习内容 |
2023年10月15日 | 1小时 | 学习编程相关知识,并对题目进行计划 |
2023年10月16日 | 3小时 | 学习编程相关知识,对代码进行初步设计 |
2023年10月17日 | 6小时 | 学习编程相关知识,根据要求添加相关代码 |
2023年10月18日 | 5小时 | 学习编程相关知识,根据要求添加相关代码 |
2023年10月19日 | 3小时 | 学习编程相关知识,对代码进行检查,修改错误 |
2023年10月20日 | 4小时 | 学习编程相关知识,对编写代码进行测试 |
2023年10月21日 | 3小时 | 整理相关资料,编写博客,事后总结 |
提交记录
里程碑截图
收获体会:
对于不是计算机专业的我来说,在这次编程实践确实是一次巨大的挑战,在这次四则运算出题程序的编写过程中,我和我的同伴遇到了很多困难,但通过不断努力和探索,最终成功地解决了这些问题,并取得了一定的成果,这对于我们来说是一次非常宝贵的经历,我认为自己在这次编程实践中提高了解决问题的能力,在编写程序时,我遇到了很多技术难题,比如如何判断输入数据的合理性、如何处理除数为零的情况等。面对这些问题,我和我的同伴能够在bilibili和博客上,积极查阅相关资料和教程,并结合自己的思考和分析,最终找到了解决问题的方案。同时,我也提高了利用编程工具和调试技巧,学会了如何去找到和解决问题。
我们在这次编程实践中也提高了自己的学习能力和适应能力。虽然我们对于一些编程技术和工具还不够熟悉,但通过自学和实践,我和我的同伴能够去努力掌握并应用这些例子。在编写四则运算程序时,我和我的同伴学会了使用函数和条件语句等编程基础知识,同时也熟悉了一些常用的编程软件如何使用,这些技能对于我未来的编程工作和生活上的问题具有很大的帮助。在这次结对任务中,让我最满意的是,我和我的同伴在这次编程实践中也表现出了很好的小组合作的能力。在编写程序的过程中,我们发现了一些可以改进的地方,例如在用户输入错误数据时能够给出更明确的提示信息否则提醒错误等等,同时,我也能够积极地与我的伙伴进行交流和分享,不断完善和提高我们的程序。
虽然我们在这个过程中遇到了很多困难和挑战,但通过努力和探索,我们还是成功地解决了这些问题并取得了一定的成果。在未来的编程实践中,我们将继续努力提高自己的效率和能力水平,来更好地应对各种困难和挑战。
自我效率评价:
对于我们来说,在这次的编程任务中,我认为编程的时间并不是很多,最主要的时间是学习相关的编程知识,在学习这些知识时我们有很多问题需要解决,这个过程对于我们来说是比较艰难的,因为我们并非计算机专业,之前很少接触编程的工作,所以这件事对我们来说是一次不小的挑战,但是我们还是按时完成了,我认为我们这次不仅仅是完成了一次作业,同时也是对自己能力的一次提升。
三、解题思路
刚刚拿到题目时,我的第一感受是这个题目对我和我的伙伴来说是有难度的,首先我们要查找相关资料,学习如何去用C语言完成数学计算,并学习相关的代码函数,根据题目的要求,与合作伙伴进行商量后,我们要做到的是编写的程序要依次满足以下条件:
首先要支持加减乘除4种运算并且能够包含两个运算符,因为这是数学运算的基础,然后在基础上做到能够输入指定的题目数量,然后在其基础上能够使三个随机数在100以内,这样就能完成初步的编写,然后在此基础之上,再对输入的答案进行判断对错,并给出成绩,最后,将分数进行储存。
参考资料:
201571030116 实验二——小学四则运算练习-CSDN博客
https://www.cnblogs.com/brilliant2016/p/5847383.html
四、设计程序过程
struct Question {
int num1; // 第一个数字
char operator1; // 第一个操作符
int num2; // 第二个数字
char operator2; // 第二个操作符
int num3; // 第三个数字
double answer; // 计算结果
};
因为我们所设计的数学出题器是三个数字并含有两个运算符,所以我们先定义三个数字,然后定义两个运算符。
Question generateQuestion() {
Question question;
srand(time(NULL));
question.num1 = rand() % 10 + 1; // 修改数值范围为1到10
question.num2 = rand() % 10 + 1;
question.num3 = rand() % 10 + 1;
char operators[4] = { '+', '-', '*', '/' };
question.operator1 = operators[rand() % 4];
question.operator2 = operators[rand() % 4];
return question;
然后用rand函数我们随机生成三个数的值(在1到10以内),之后定义一下加减乘除,并随即赋予到两个运算符上。
double calculateAnswer(int num1, char oper1, int num2, char oper2, int num3) {
double result = 0.0;
switch (oper1) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = static_cast<double>(num1) / num2;
break;
}
switch (oper2) {
case '+':
result += num3;
break;
case '-':
result -= num3;
break;
case '*':
result *= num3;
break;
case '/':
result /= num3;
break;
}
return result;
}
之后我们根据switch语句进行判断,首先根据第一个运算符,对第一个数和第二个数进行运算,然后根据第二个运算符,对前面结果和第三个数进行运算,这样我们就完成了对程序的初步设计。
void printQuestion(const Question& question, int index) {
cout << "Question " << index << ": ";
cout << question.num1 << " " << question.operator1 << " " << question.num2 << " " << question.operator2 << " " << question.num3 << " = ?" << endl;
}
在显示器上打出所出题目(三个数字,两个运算符,一个=和?)
int main() {
int numQuestions;
cout << "Enter the number of questions: ";
cin >> numQuestions;
vector<Question> questions;
for (int i = 0; i < numQuestions; i++) {
Question question;
do {
question = generateQuestion();
} while (find(questions.begin(), questions.end(), question) != questions.end());
questions.push_back(question);
printQuestion(question, i + 1);
}
double totalScore = 0.0;
for (const Question& question : questions) {
double userAnswer;
cout << "Enter your answer: ";
cin >> userAnswer;
}
return 0;
}
完善主函数,首先根据我们输入的题目数量,判断应该出几道题,然后根据数目随机生成计算题。然后写出答案。
当然,这只是程序的初步设计,之后我们发现,我们所写的初步程序并没有计算答案,所以,我们因该添加相应代码,计算所出题目的答案,作为标准答案
answer = calculateAnswer(question.num1, question.operator1, question.num2, question.operator2, question.num3);
第三次提交,我们添加了相关函数,比较所出题目是否相同
bool operator==(const Question& other) const { // 重载运算符,用于比较题目是否相同
return num1 == other.num1 && operator1 == other.operator1 && num2 == other.num2 && operator2 == other.operator2 && num3 == other.num3;
}
第四次提交,我们添加了相关函数,比较所出题目答案与做题者给出的答案是否相同(能够在允许的误差之内)并提交代码
bool checkAnswer(double userAnswer, double correctAnswer) {
const double EPSILON = 0.00001;
return abs(userAnswer - correctAnswer) < EPSILON;
}
并且能够打印出题目的对错
if (checkAnswer(userAnswer, question.answer)) {
cout << "Correct!" << endl;
totalScore += 1.0;
}
else {
cout << "Incorrect!" << endl;
}
第五次修改,我们添加了计算总成绩的功能,并能够将所得到的成绩进行保存,并进行显示历史成绩
void saveScore(double score) {
ofstream file("scores.txt", ios::app);
if (file.is_open()) {
file << fixed << setprecision(2) << score << endl;
file.close();
cout << "Score saved successfully!" << endl;
}
else {
cout << "Failed to save score." << endl;
}
}//保存文件
vector<double> readScores() {
vector<double> scores;
ifstream file("scores.txt");
if (file.is_open()) {
double score;
while (file >> score) {
scores.push_back(score);
}
file.close();
}
return scores;
}
void printScores(const vector<double>& scores) {
cout << "Scores:" << endl;
for (const double& score : scores) {
cout << fixed << setprecision(2) << score << endl;
}
}
第六次修改,我们对代码进行了最终的检查,测试代码能不能完好的运行。
五、性能分析
使用Visual Studio 2022中内置的性能探测器对四则运算的总程序进行性能分析,分析CPU使用率。
程序调试运行
生成性能探测报告
内存使用率情况
从上图中可以看出,程序中CPU消耗最大的函数为main函数,其具体代码如下
由图中可得,因为本次设计的程序仅有两个函数,运行所耗费的时间太短短导致无法统计时间,从而无法再在原有基础上进行优化。
六、单元测试
(1)测试Question generateQuestion()函数判断是否能够随机生成题目
(2)测试checkAnswer函数是否能够判断答案的对错
(3)测试saveScore函数是否能够保存文件
右键函数的解决方案,在“添加(D)”选项中选择“新建项目(N)”,在其中选择本机测试单元项目
创建unit test1项目
右键测试项目,添加现有项
找到obj文件进行添加
编写写测试代码
编写头文件
点击测试,点击测试资源管理器
查看结果
2023年10月27日新增选择题功能,以上更新为最新的单元测试