第一次博客作业

(1)前言:这只是一个普通大一学子的代码,无论成熟与否,不要抱有太高要求

(2)设计与分析:由于这几次大作业都是最后一题占大头,所以这次blog就专门针对每次作业的最后一题进行讨论,三次大作业的最后一题都是答题判断程序且逐渐完善之前的代码,所以代码我只会给第三次大作业的;
题目要求我们设计一个答题判断程序,包含了1、题目数量2、题目内容3、答题信息这几个主要部分,接下来我将给出我的代码,再为你进行分析代码如下:
import java.util.*;

class Question {
int number;
String question;
String answer;
boolean isActive;

public Question(int number, String question, String answer) {
    this.number = number;
    this.question = question;
    this.answer = answer;
    this.isActive = true;
}

}

class TestPaper {
int testId;
LinkedHashMap<Integer, Integer> questions; // Question Number, Score

public TestPaper(int testId) {
    this.testId = testId;
    this.questions = new LinkedHashMap<>();
}

void addQuestion(int questionNumber, int score) {
    questions.put(questionNumber, score);
}

}

class Student {
String id;
String name;

public Student(String id, String name) {
    this.id = id;
    this.name = name;
}

}

class AnswerSheet {
int testId;
String studentId;
LinkedHashMap<Integer, String> answers; // Question order in test, Answer

public AnswerSheet(int testId, String studentId) {
    this.testId = testId;
    this.studentId = studentId;
    this.answers = new LinkedHashMap<>();
}

void addAnswer(int questionOrder, String answer) {
    answers.put(questionOrder, answer);
}

}

public class TestSystem {
Map<Integer, Question> questions = new HashMap<>();
Map<Integer, TestPaper> testPapers = new HashMap<>();
Map<String, Student> students = new HashMap<>();
List answerSheets = new ArrayList<>();

public void addQuestion(int number, String content, String answer) {
    questions.put(number, new Question(number, content, answer));
}

public void addTestPaper(int id) {
    testPapers.put(id, new TestPaper(id));
}

public void addStudent(String id, String name) {
    students.put(id, new Student(id, name));
}

public void processAnswerSheet(int testId, String studentId, LinkedHashMap<Integer, String> answers) {
    AnswerSheet sheet = new AnswerSheet(testId, studentId);
    answers.forEach(sheet::addAnswer);
    answerSheets.add(sheet);
}

public void deleteQuestion(int number) {
    if (questions.containsKey(number)) {
        questions.get(number).isActive = false;
    }
}

public void evaluate() {
    for (AnswerSheet sheet : answerSheets) {
        TestPaper paper = testPapers.get(sheet.testId);
        int totalScore = 0;
        System.out.println("Answers for Test ID: " + sheet.testId);
        for (Map.Entry<Integer, Integer> entry : paper.questions.entrySet()) {
            int qNum = entry.getKey();
            int score = entry.getValue();
            Question q = questions.get(qNum);
            if (!q.isActive) {
                System.out.println("The question " + qNum + " is invalid.");
                continue;
            }
            String studentAnswer = sheet.answers.get(qNum);
            if (q.answer.trim().equals(studentAnswer.trim())) {
                System.out.println(q.question + " ~ " + studentAnswer + " ~ true");
                totalScore += score;
            } else {
                System.out.println(q.question + " ~ " + studentAnswer + " ~ false");
            }
        }
        Student student = students.get(sheet.studentId);
        System.out.println(student.id + " " + student.name + ": " + totalScore);
    }
}

public static void main(String[] args) {
    TestSystem system = new TestSystem();
    system.addQuestion(1, "1+1=", "2");
    system.addQuestion(2, "2+2=", "4");
    system.addTestPaper(1);
    system.testPapers.get(1).addQuestion(1, 5);
    system.testPapers.get(1).addQuestion(2, 10);
    system.addStudent("20201103", "Tom");
    
    LinkedHashMap<Integer, String> answers = new LinkedHashMap<>();
    answers.put(1, "2");
    answers.put(2, "5"); // Wrong answer for the second question
    
    system.processAnswerSheet(1, "20201103", answers);
    system.deleteQuestion(2); // Mark the second question as deleted
    system.evaluate();
}

}

  1. 理解题目需求
    首先,我们需要仔细阅读题目,理解其需求。这道题目要求我们设计一个程序,模拟一个小型的测试系统。系统需要处理以下五种输入信息:

题目信息:每道题目包括题目编号、题目内容和标准答案。
试卷信息:每张试卷包括试卷号、题目编号和题目分值。
学生信息:学生信息包括学号和姓名。
答卷信息:每张答卷包括试卷号、学号以及题目的答案。
删除题目信息:删除某道题目的信息。
系统需要根据输入的信息,判断学生的答题情况并进行评分,输出相应的结果。同时,需要处理异常情况,例如试卷总分不为100分、答题信息缺失、题目被删除等情况。

  1. 设计数据结构
    在开始编写代码之前,我们应该先考虑合适的数据结构来存储题目信息、试卷信息、学生信息和答题信息。这样有助于我们更好地组织数据和操作数据。

数据结构设计示例:
题目信息:可以用字典或自定义类来表示,每道题目对应一个对象,包括题目编号、题目内容和标准答案。
试卷信息:可以用字典或自定义类来表示,每张试卷对应一个对象,包括试卷号和题目信息(题目编号与分值的映射)。
学生信息:可以用字典或自定义类来表示,每个学生对应一个对象,包括学号和姓名。
答卷信息:可以用字典或自定义类来表示,每张答卷对应一个对象,包括试卷号、学号以及答题信息(题目编号与答案的映射)。
3. 解析输入信息
接下来,我们需要编写代码来解析输入的信息。对于每种类型的输入信息,我们需要编写相应的解析函数,从输入字符串中提取出关键信息,并存储到相应的数据结构中。

  1. 判断答题情况并评分
    对于每一张答卷,我们需要根据试卷信息和答题信息来判断学生的答题情况,并进行评分。具体步骤如下:

根据答卷中的试卷号,找到对应的试卷信息。
遍历答卷中的题目答案,比对每道题目的答案与标准答案,计算得分。
输出每道题目的答题情况以及总分。
5. 处理异常情况
在处理答题情况时,需要考虑各种异常情况,例如:

试卷总分不为100分。
答题信息缺失。
题目被删除。
针对每种异常情况,我们需要编写相应的处理逻辑,并输出相应的提示信息。

  1. 输出结果
    最后,我们需要根据题目要求,输出评分结果。具体包括:

试卷总分警示。
答题信息。
判分信息。
被删除的题目提示信息。
题目引用错误提示信息。
格式错误提示信息。
试卷号引用错误提示输出。
学号引用错误提示信息。
总结
综上所述,这道题目涉及了多个方面的知识和技巧,包括数据结构设计、信息解析、异常处理、结果输出等。在编写代码之前,我们需要充分理解题目要求,并设计合适的解决方案。在编写代码过程中,需要注重代码的模块化和可读性,以及考虑各种异常情况的处理。最终,通过测试和调试,确保程序能够正确运行并输出正确的结果。

(3)采坑心得:我在做这个题目时犯过以下几个错误,以下是错误以及如何避免它们:

数据结构设计不合理: 如果数据结构设计不合理,可能会导致程序难以维护和扩展。应该仔细考虑每个类的职责,确保它们之间的关系清晰明确。
输入处理不完整: 输入处理是整个程序的基础,如果处理不完整,可能会导致后续逻辑出错。应该考虑各种可能的输入情况,并进行相应的处理。
错误处理不到位: 程序应该能够处理各种异常情况,如试卷编号不存在、学生不存在等。应该在代码中添加适当的错误处理机制。
逻辑错误: 评分逻辑应该正确,确保每道题目的分数计算准确无误。
代码重复和冗余: 应该避免代码重复和冗余,可以尝试使用方法和循环来减少重复代码。
测试不充分: 在编写代码之后,应该进行充分的测试,覆盖各种情况,确保程序的稳定性和正确性。
避免这些错误的方法包括:

仔细设计数据结构,确保每个类的职责清晰明确。
对输入进行全面而严格的验证和处理。
添加足够的错误处理机制,处理各种异常情况。
仔细思考评分逻辑,确保正确性。
避免重复和冗余的代码,可以尝试重构代码以提高可读性和维护性。
进行充分的测试,包括单元测试和集成测试,确保程序的稳定性和正确性。
通过以上方法,可以有效避免新手在做这个题目时可能遇到的常见错误。

(4)改进建议:这个程序已经实现了基本功能,但仍有一些改进空间,可以使其更加健壮和易于使用。以下是一些可能的改进点:

异常处理: 添加更多的异常处理机制,以处理输入错误、数据不一致等异常情况。这将提高程序的稳定性和容错性。
代码重构: 可以考虑将代码进行重构,提高可读性和可维护性。可以将一些功能提取成方法或者类,减少重复代码。
数据存储: 考虑使用数据库或者文件来存储题目、试卷、学生和答卷信息,以便于持久化和管理。
界面优化: 如果是基于用户交互的程序,可以考虑优化界面,使其更加友好和直观。
功能扩展: 考虑添加更多功能,如查询学生成绩、导出成绩单等,以提高程序的实用性。
性能优化: 对程序进行性能优化,尤其是在处理大量数据时,以提高程序的运行效率。
单元测试: 编写更多的单元测试来确保程序的正确性和稳定性。
文档完善: 完善代码注释和文档,使其更易于理解和使用。
通过这些改进,可以使程序更加健壮、灵活和易于维护,提高用户体验和开发效率。

(5)总结:这道题目涉及了一个较为复杂的系统设计和实现,主要包括题目信息的输入、试卷信息的管理、学生信息的记录、答题信息的处理、删除题目的操作以及最终的评分和结果输出。我有以下收获:

系统设计能力: 通过设计这个答题和评分系统,做题人可以锻炼自己的系统设计能力,包括数据结构的设计、模块划分、异常处理等方面。
编程实践能力: 实现这个系统需要一定的编程实践能力,包括对面向对象编程的掌握、数据结构和算法的应用等。
问题解决能力: 在实现过程中可能会遇到各种问题,如数据不一致、输入错误等,需要做题人具备解决问题的能力。
团队协作能力: 如果是在团队中完成这个任务,做题人还可以锻炼团队协作能力,包括沟通、合作、分工等方面。
学习和积累经验: 通过这个实践项目,做题人可以学习到很多实际的编程技巧和经验,为以后的项目打下良好的基础。

posted @   有地将臣  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示