结对对对项目

news/2024/11/15 11:58:01/文章来源:https://www.cnblogs.com/crazylychee/p/18417720

结对对对项目

这个作业属于哪个课程 软件工程课程
这个作业要求在哪里 个人项目 - 作业 - 计科22级34班 - 班级博客 - 博客园 (cnblogs.com)
这个作业的目标 按照要求写一个四则运算生成器
成员一 3122004883许億驰

任务列表

    • 创建一个命令行程序,能够生成小学四则运算题目。
    • 使用 -n 参数控制生成题目的个数。
    • 使用 -r 参数控制题目中数值的范围。
    • 该参数必须给定,否则程序报错并给出帮助信息。
    • 生成的题目中计算过程不能产生负数。
    • 如果存在形如 e1 - e2 的子表达式,那么 e1 ≥ e2
    • 生成的题目中如果存在形如 e1 ÷ e2 的子表达式,那么其结果应是真分数。
    • 每道题目中出现的运算符个数不超过3个。
    • 程序一次运行生成的题目不能重复。
    • 任何两道题目不能通过有限次交换 +× 左右的算术表达式变换为同一道题目。
    • 生成的题目存入执行程序的当前目录下的 Exercises.txt 文件。
    • 真分数在输入输出时采用特定格式(如 3/52’3/8)。
    • 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的 Answers.txt 文件。
    • 真分数的运算结果应符合规范。
    • 程序应能支持一万道题目的生成。
    • 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计。
    • 输入参数为 -e <exercisefile>.txt -a <answerfile>.txt
    • 统计结果输出到文件 Grade.txt,格式如下:
      Correct: 5 (1, 3, 5, 7, 9)
      Wrong: 5 (2, 4, 6, 8, 10)
      

作业正文

作业仓库地址

效能分析

性能分析中,代码执行时间最长的是

function generateQuestions() {const numQuestions = parseInt(document.getElementById('numQuestions').value, 10);questions = [];answers = [];const questionsDiv = document.getElementById('questions');questionsDiv.innerHTML = '';for (let i = 0; i < numQuestions; i++) {let question, answer;// 随机选择是否包含括号const hasBrackets = Math.random() > 0.5;if (hasBrackets) {question = generateExpressionWithBrackets();} else {question = generateSimpleExpression();}questions.push(question);// 计算答案answer = calculateAnswer(question);answers.push(answer);const questionElement = document.createElement('p');questionElement.innerText = `${i + 1}. ${question} =`;questionsDiv.appendChild(questionElement);}}

设计思路

设计思路是通过一个前端网页来生成、下载、上传和校验小学四则运算题目。以下是对你设计思路的详细解释:

设计思路
用户界面:

创建一个包含输入框和按钮的网页界面,用户可以通过输入框设置生成题目的数量和数值范围。

提供文件上传功能,用户可以上传包含答案和题目的文本文件。

提供按钮用于生成题目、下载题目和答案、以及计算正确率。

生成题目:

用户输入生成题目的数量和数值范围。

程序根据用户输入生成指定数量的四则运算题目,并显示在页面上。

生成的题目可能包含括号和带分数。

下载题目和答案:

用户可以点击按钮下载生成的题目和答案,分别保存为 questions.txt 和 answers.txt 文件。

上传答案和题目文件:

用户可以上传包含答案和题目的文本文件。

程序解析上传的文件,提取题目和答案,并显示在页面上。

计算正确率:

用户上传答案文件后,程序可以计算上传答案的正确率。

程序将正确率和正确/错误的题目编号输出到 grade.txt 文件中。

具体实现步骤
生成题目:

使用 generateQuestions 函数生成题目,根据用户输入的数量和数值范围生成题目。

使用 generateSimpleExpression 和 generateExpressionWithBrackets 函数生成简单的和带括号的表达式。

使用 generateNumber 函数生成自然数或带分数。

计算答案:

使用 calculateAnswer 函数计算表达式的答案。

使用 convertToMathExpression 函数将带分数转换为浮点数以便计算。

下载题目和答案:

使用 downloadQuestions 和 downloadAnswers 函数将生成的题目和答案下载为文本文件。

上传答案和题目文件:

使用 parseAnswersFile 和 parseQuestionsFile 函数解析上传的答案和题目文件。

提取文件内容并显示在页面上。

计算正确率:

使用 calculateAccuracy 函数计算上传答案的正确率。

将正确率和正确/错误的题目编号输出到 grade.txt 文件中。

代码结构
HTML部分:

包含输入框和按钮,用于设置生成题目的数量和数值范围,以及上传和下载文件。

包含一个显示题目的容器。

JavaScript部分:

包含生成题目、计算答案、下载文件、上传文件和计算正确率的函数。

使用 document.getElementById 获取页面元素,使用 FileReader 读取上传的文件。

代码说明

let questions = [];let answers = [];let userAnswers = [];function generateQuestions() {const numQuestions = parseInt(document.getElementById('numQuestions').value, 10);questions = [];answers = [];const questionsDiv = document.getElementById('questions');questionsDiv.innerHTML = '';for (let i = 0; i < numQuestions; i++) {let question, answer;// 随机选择是否包含括号const hasBrackets = Math.random() > 0.5;if (hasBrackets) {question = generateExpressionWithBrackets();} else {question = generateSimpleExpression();}questions.push(question);// 计算答案answer = calculateAnswer(question);answers.push(answer);const questionElement = document.createElement('p');questionElement.innerText = `${i + 1}. ${question} =`;questionsDiv.appendChild(questionElement);}}function generateSimpleExpression() {const num1 = generateNumber();const num2 = generateNumber();const operator = ['+', '-', '*', '/'][Math.floor(Math.random() * 4)];return `${num1} ${operator} ${num2}`;}function generateExpressionWithBrackets() {const num1 = generateNumber();const num2 = generateNumber();const num3 = generateNumber();const operator1 = ['+', '-', '*', '/'][Math.floor(Math.random() * 4)];const operator2 = ['+', '-', '*', '/'][Math.floor(Math.random() * 4)];return `(${num1} ${operator1} ${num2}) ${operator2} ${num3}`;}function generateNumber() {const numSetUp = parseInt(document.getElementById('numSetUp').value, 10);const isFraction = Math.random() > 0.5;if (isFraction) {const numerator = Math.floor(Math.random() * 10) + 1;const denominator = Math.floor(Math.random() * 10) + 1;return convertToMixedNumber(`${numerator}/${denominator}`);} else {return Math.floor(Math.random() * numSetUp).toString();}}function convertToMixedNumber(fraction) {const [numerator, denominator] = fraction.split('/').map(Number);const integerPart = Math.floor(numerator / denominator);const remainder = numerator % denominator;if (integerPart === 0) {return fraction;}else if (remainder ===0){return integerPart;} else {return `${integerPart}'${remainder}/${denominator}`;}}function calculateAnswer(expression) {// 使用 eval 计算表达式,注意 eval 的安全性问题try {return eval(convertToMathExpression(expression));} catch (e) {return 'Error';}}function convertToMathExpression(expression) {// 将带分数转换为浮点数return expression.replace(/(\d+)'(\d+)\/(\d+)/g, (match, p1, p2, p3) => parseFloat(p1) + parseFloat(p2) / parseFloat(p3));}function downloadQuestions() {if (questions.length === 0) {alert('请先生成题目!');return;}const questionsText = questions.map((q, i) => `${i + 1}. ${q}`).join('\n');const allText = `题目:\n${questionsText}\n`;const blob = new Blob([allText], { type: 'text/plain' });const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'questions.txt';document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(url);}function downloadAnswers() {if (answers.length === 0) {alert('请先生成题目!');return;}const answersText = answers.map((a, i) => `${i + 1}. ${a}`).join('\n');const allText = `答案:\n${answersText}\n`;const blob = new Blob([allText], { type: 'text/plain' });const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'answers.txt';document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(url);}function parseAnswersFile(file) {userAnswers = [];const reader = new FileReader();reader.onload = function(event) {const content = event.target.result;const lines = content.split('\n').map(line => line.trim()).filter(line => line);const answersText = lines.join('\n');userAnswers = answersText.replace(/^答案:\n/, '').split('\n').map(line => line.trim().split('. ')[1]).filter(line => line);};reader.readAsText(file);}function parseQuestionsFile(file) {questions = [];const reader = new FileReader();reader.onload = function(event) {const content = event.target.result;const lines = content.split('\n').map(line => line.trim()).filter(line => line);const answersText = lines.join('\n');questions = answersText.replace(/^题目:\n/, '').split('\n').map(line => line.trim().split('. ')[1]).filter(line => line);const questionsDiv = document.getElementById('questions');questionsDiv.innerHTML = '';// 显示题目questions.forEach((question) => {const questionElement = document.createElement('p');questionElement.innerText = `${question}=`;questionsDiv.appendChild(questionElement);});// 计算答案questions.forEach((question) => {const answer = calculateAnswer(question);answers.push(answer);});};reader.readAsText(file);}function calculateAccuracy(userAnswers) {let rightGrade = [];let wrongGrade = [];if (userAnswers.length === 0) {alert('请先上传答案文件!');return;}if (answers.length === 0) {alert('请先生成题目!');return;}let correctCount = 0;for (let i = 0; i < answers.length; i++) {if (parseFloat(userAnswers[i]) === answers[i]) {rightGrade.push(i + 1);correctCount++;}else {wrongGrade.push(i + 1);}}const accuracy = (correctCount / answers.length) * 100;alert(`正确率: ${accuracy.toFixed(2)}%`);grade = `正确题目:${rightGrade.join(', ')}\n错误题目:${wrongGrade.join(', ')}\n正确率: ${accuracy.toFixed(2)}%\n`;const blob = new Blob([grade], { type: 'text/plain' });const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'grade.txt';document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(url);}

测试运行

运行效果

PSP表格如下

2.在PSP表格[附录2]记录下你估计在程序开发各个步骤上耗费的时间

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 70
· Estimate · 估计这个任务需要多少时间 30 35
Development 开发 240 260
· Analysis · 需求分析(包括学习新技术) 45 50
· Design Spec · 生成设计文档 40 45
· Design Review · 设计复审 30 35
· Coding Standard · 代码规范(为目前的开发制定合适的规范) 20 25
· Design · 具体设计 50 55
· Coding · 具体编码 100 110
· Code Review · 代码复审 25 30
· Test · 测试(自我测试,修改代码,提交修改) 30 40
Reporting 报告 60 65
· Test Report · 测试报告 20 25
· Size Measurement · 计算工作量 20 20
· Postmortem & Process Improvement Plan · 事后总结,并提出过程改进计划 20 30
合计 360 400

项目小结

  • 在本次结对编程项目中,我们共同开发了一个小学四则运算生成器。该程序能够生成指定数量和数值范围的四则运算题目,支持带分数和括号的表达式,并能够下载题目和答案文件,上传答案文件进行校验,计算正确率。

  • 结对编程能够提高代码质量,减少错误。两个人可以互相监督,及时发现和解决问题。

  • 结对编程能够提高开发效率,两个人可以分工合作,共同完成任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798843.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

闯关提交02

任务:Python实现wordcount1 import re2 from collections import defaultdict3 4 def wordcount(text):5 # 将文本转换为小写6 text = text.lower()7 8 # 使用正则表达式分割单词9 words = re.findall(r\b\w+\b, text) 10 11 # 使用 defaultdict…

M:接口耗时很短,页面数据回显慢?

1、页面卡顿,需要好长一段时间才能加载完成,可能是资源请求过多,再加上请求响应慢的原因。 每个浏览器都有资源请求并发数的限制,如何查看请求阻塞情况 到前端如何针对该限制进行优化? 先看问题: 1、设置服务端请求耗时(3S)客户端并发调用20个请求。(预留问题-见下方:…

中秋 -2024/9/17

今天是中秋假期最后一天,今天主要学习了动态规划算法,写了几个模板题 新算法学了迪杰斯特拉(Dijkstra)算法,只是过程了解了过程,还是不能用代码描述出来 寻找最短路径的算法

干盛辉的第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 介绍自己并进行评估,阐明自己的技能、薄弱点,表明期望的课程收获以及课程实践角色扮演姓名-学号 干盛辉-2022329301011一、自我介绍 (1)个人信息 大家好,我叫干盛辉,来自于浙江温州,是 22…

vscode配置java简易教程

java的新手快速配置一、下载jdk java官方地址:https://www.oracle.com/java/technologies/downloads/ 选择适合自己电脑的版本,并下载到一个自己喜欢的地方。二、配置环境变量 记住自己 jdk 的地址,例:我的 jdk 下载到了 D:\app\java 1、JAVA_HOME配置 点击 win 键后,搜索…

GitHub 配置 ssh key 的步骤及原理解释

原文:Github 配置 ssh key 的步骤(大白话+包含原理解释)本文涉及 SSH 相关知识,建议先阅读 SSH 原理与运用(一):远程登录 或者将其作为扩展资料。 前言 在 GitHub 上配置 ssh key 很容易,网上一大堆教程,但基本没有详细解释其原理的,为什么要配?每使用一台主机都要配…

贪吃蛇作业

贪吃蛇界面: 代码:import pygame import random import sys import tkinter as tk from tkinter import messagebox # 初始化pygame pygame.init() # 设置屏幕大小 screen_width = 640 screen_height = 480 screen = pygame.display.set_mode((screen_widt…

数据集的收集

我在这里找到了一个数据集的网站:https://www.kaggle.com/datasets 我这里找到了三个小数据集为例子分别如下: 我写的数据分析如下: 1.数据集名称房价回归数据集来源 https://www.kaggle.com/datasets/prokshitha/home-value-insights?resource=download数据集描述该数据集…

数字签名是什么?

原文:数字签名是什么?文中涉及的密码学基本知识,可以参见对称加密和非对称加密的区别。鲍勃有两把钥匙,一把是公钥,另一把是私钥。鲍勃把公钥送给他的朋友们——帕蒂、道格、苏珊——每人一把。苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效…

存储论——确定性存储模型模型精解

运筹学中的存储问题主要研究如何通过优化库存管理,确保在满足需求的同时,尽可能降低与库存相关的成本。这一问题在生产制造、物流运输、仓储等各个领域具有重要应用。核心目标是通过合理规划进货、存货和出货策略,实现成本最小化和资源的高效利用。在实际应用中,由于需求的…

软工实践第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253这个作业的目标 了解小型项目的设计学号 082100170github:完成情况因为对游戏设计没有多大兴趣,所以只是简单地完成了基本的消…

[MySQL]深分页优化

limit深分页为什么会变慢? 先看下表结构: CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键Id,name varchar(255) DEFAULT NULL COMMENT 账户名,balance int(11) DEFAULT NULL COMMENT 余额,create_time datetime NOT NULL COMMENT 创建时间,update_t…