结对项目

结对项目

姓名 学号 项目地址
卢铭 3122007933 https://gitee.com/lipaya/paired-projects
陈翼 3122006207

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13137
这个作业的目标 通过实践项目开发,初步了解合作开发的流程

PSP表格

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

性能分析

在改进程序性能上花费了多少时间大约10分钟。

消耗最大函数:
如图。

设计

2个类:

  1. 分数类
  2. 表达式的类

3个函数:

  1. 化简分数的函数
  2. 读练习题,检查答案是否正确的函数
  3. 生成练习题和答案的函数

还有一个主函数,用来接受程序参数并调用相关功能。

代码说明

接下来展示主函数,主函数体现了程序的逻辑。

int main(int argc,char const* argv[]) {
    if( argc < 3){
        cout << "Using:main -e Exercises.txt -a Answers.txt -r 10 -n 100\n";
        cout << "Byebye~\n";
        return 0;
    }

    int num, limit=10;
    int op = 0;
    string output, outputAnswer;
    for (int i = 1; i < argc-1; i++)
    {
        if (strcmp(argv[i], "-n") == 0)
        {
            num = stoi(argv[i + 1]); //题目个数
            //cout << num << endl;
            i++; continue;
        }
        else if (strcmp(argv[i], "-r") == 0)
        {
            limit = stoi(argv[i + 1]); //限定结果大小
            //cout << limit << endl;
            i++; continue;
        }
        else if (strcmp(argv[i], "-e") == 0)
        {
            output = argv[i + 1]; //输出题目文件
            //cout << output << endl;
            op = 1;
            i++; continue;
        }
        else if (strcmp(argv[i], "-a") == 0)
        {
            outputAnswer = argv[i + 1]; //输出题目答案文件
            //cout << outputAnswer << endl;
            op = 1;
            i++; continue;
        }
    }  
    clock_t time_start, time_end;
    time_start = clock();

    if (op)readCheck(output, outputAnswer);
    else {
        writeIn(num, limit);//写入
    }

    time_end = clock();
    double time = (double)(time_end - time_start) / CLOCKS_PER_SEC;
    cout << "count time:" << time * 1000 << "ms" << endl;
    return 0;
}

思路:

这段代码是一个命令行程序的主函数 main。它通过命令行参数解析用户输入的指令来执行相应的功能:

  1. 检查命令行参数数量:
    • 如果参数数量小于3,程序输出使用说明,并返回 0,表示正常退出。
  2. 解析命令行参数:
    • 通过循环遍历命令行参数,每次检查当前参数和下一个参数的组合,以判断用户指定了哪些选项。
    • 如果当前参数是 -n,则下一个参数是题目个数,使用 stoi() 函数将其转换为整数,并将其赋值给 num 变量。
    • 如果当前参数是 -r,则下一个参数是结果大小限制,同样转换为整数并赋值给 limit 变量。
    • 如果当前参数是 -e,则下一个参数是输出题目文件名,将其赋值给 output 变量,同时设置 op 为 1,表示执行的是读取检查练习题的操作。
    • 如果当前参数是 -a,则下一个参数是输出答案文件名,将其赋值给 outputAnswer 变量,并同样设置 op 为 1。
  3. 记录程序运行时间:
    • 在解析完所有参数后,记录程序开始运行的时间,使用 clock() 函数获取当前时钟时间,存储在 time_start 变量中。
    • 如果 op 变量为真(即执行读取操作),则调用 readCheck() 函数读取并检查题目和答案。
    • 否则,调用 writeIn() 函数,写入题目。
    • 再次调用 clock() 函数记录程序结束时的时钟时间,存储在 time_end 变量中。
  4. 计算程序运行时间:
    • 计算程序运行时间,将结束时间减去开始时间,得到程序运行的时钟周期数,除以 CLOCKS_PER_SEC 得到秒数。
    • 将运行时间乘以 1000,得到以毫秒为单位的运行时间,输出到控制台。
  5. 返回 0:
    • 返回 0 表示程序正常退出。

这段代码的核心逻辑是根据命令行参数来执行不同的操作,并记录程序的运行时间。

测试运行

命令行输入 四则运算.exe -n 100000 -r 100

即生成一百道题目,每个表达式表示数的范围是1-100。

生成的文件:

图一

图二

项目小结

在我们的结对项目中,我们成功开发了一个命令行工具,用于生成和检查数学练习题和答案。项目的成功得益于以下因素:

成功因素:

  1. 明确目标和任务分工: 我们在项目开始时明确了目标,并合理分工,确保高效协作。

  2. 良好沟通和合作: 我们保持了密切的沟通,及时解决问题,确保了项目顺利进行。

  3. 灵活应对变化: 我们能够灵活调整计划,应对需求变更和技术挑战。

教训和收获:

  1. 时间规划不足: 我们在项目开始时未充分评估任务复杂性,导致了一些进度延误。
  2. 技术难题: 在实现项目时,往往会出现某些知识技术不会使用,我们一边学新知识技术一边实践应用。

结对感受和建议:

我们合作融洽,共同克服困难,取得了不错的成绩。建议未来结对合作时要保持良好沟通,相互支持和尊重,共同学习和成长。通过这次合作,我们收获了宝贵的经验,也建立了深厚的合作关系。

posted @ 2024-03-26 01:12  cyyi  阅读(20)  评论(0编辑  收藏  举报