首页 > 编程语言 >JAVA学习第一次Blog

JAVA学习第一次Blog

时间:2024-04-21 14:11:56浏览次数:32  
标签:学习 JAVA String int private public Blog answer id

前段时间老师在PTA上发布了三次大作业,这几次大作业的难度都比较高,对我来说除了前面的题目,最后的大分数压轴题我每次都做不出来。
这与上个学期学的C语言作业难度简直不是一个等级的,不过JAVA老师也在上课期间一直强调,“我们JAVA课程一定要做出改变,不能说怕学生挂科就把难度设置的很低,这样是起不到学习的作用的“。
上个学期学的C语言感觉就是代码行数不多,逻辑就会比较清晰,流程很线性,一步步来,构建相应的函数,调用关系,就可以比较轻松的解决问题。
但是,这一套显然在JAVA身上不好用,JAVA是面向对象的语言,而C语言是面向过程的。这两种语言从根本上就有着天差地别的区别。也许就是这种思考问题的差异化,导致我做题目感到异常困难。
当然,毕竟是自己的专业课,再困难也要努力克服。
下面我会逐一分析前几次的大作业题目,分析自己学习过程中的错误并吸取经验教训。

第一次大作业:
1:设计一个风扇Fan类 这个比较简单,就是初步认识一下JAVA的题目,用到了get set 方法。没什么分析的。
2:创建一个类Student,和上面的题目同理。
3:创建学生类,包含
属性:学号(String)、姓名(String)、语文成绩(int)、数学成绩(int)、物理成绩(int) 同理。
4:成绩计算-2-关联类 这一题开始有一定的难度了,第一次出现了关联类,一道题目不止一个类了,并且各种类之间还有相互关系。这一题开始把我难住了一会儿,不过仔细想想,也就是一道题里多写几个类而已,然后搞清楚每个类里面有什么属性和方法就行了,也不算太难。
5:第五题,最难的一题来了,见到题目的第一眼,我就看到了长长的题目,很多要求,而且还要使用三个类。这一题我可以说是想了很久。
题目:设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
输入格式:
程序输入信息分三部分:
1、题目数量

格式:整数数值,若超过1位最高位不能为0,

样例:34

2、题目内容

一行为一道题,可以输入多行数据。

格式:"#N:"+题号+" "+"#Q:"+题目内容+" "#A:"+标准答案

格式约束:题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。

样例:#N:1 #Q:1+1= #A:2

     #N:2 #Q:2+2= #A:4

3、答题信息

答题信息按行输入,每一行为一组答案,每组答案包含第2部分所有题目的解题答案,答案的顺序号与题目题号相对应。

格式:"#A:"+答案内容

格式约束:答案数量与第2部分题目的数量相同,答案之间以英文空格分隔。

样例:#A:2 #A:78

  2是题号为1的题目的答案
  78是题号为2的题目的答案

答题信息以一行"end"标记结束,"end"之后的信息忽略。

输出格式:
1、题目数量

格式:整数数值,若超过1位最高位不能为0,

样例:34

2、答题信息

一行为一道题的答题信息,根据题目的数量输出多行数据。

格式:题目内容+" ~"+答案

样例:1+1=~2

      2+2= ~4

3、判题信息

判题信息为一行数据,一条答题记录每个答案的判断结果,答案的先后顺序与题目题号相对应。

格式:判题结果+" "+判题结果

格式约束:

 1、判题结果输出只能是true或者false,
 2、判题信息的顺序与输入答题信息中的顺序相同

样例:true false true

除此之外还需要用到三个类:
题目类(用于封装单个题目的信息):

属性:题目编号、题目内容、标准答案-standardAnswer
方法:数据读写set\get方法、
判题方法(答案-answer):判断答案-answer是否符合标准答案-standardAnswer
试卷类(用于封装整套题目的信息)

属性:题目列表(题目类的对象集合)、题目数量
方法:判题方法(题号-num、答案-answer):判断答案-answer是否符合对应题号的题目标准答案-standardAnswer
保存题目(题号-num、题目-question):将题目保存到题目列表中,保存位置与num要能对应
答卷类(用于封装答题信息)

属性:试卷(试卷类的对象)、答案列表(保存每一题的答案)、判题列表(保存每一题的判题结果true/false)
方法:判题方法(题号-num):判断答案列表中第num题的结果是否符合试卷中对应题号的题目标准答案
输出方法(题号-num):按照题目的格式要求,输出题号为num的题目的内容和答题结果。
保存一个答案(题号-num,答案-answer):保存题号为num的题目的答题结果answer。

我的答案:
我设计的题目类:
`class Question {
private int number;
private String content;
private String standardAnswer;

public Question(int number, String content, String standardAnswer) {  
    this.number = number;  
    this.content = content;  
    this.standardAnswer = standardAnswer;  
}  

public int getNumber() {  
    return number;  
}  

public String getContent() {  
    return content;  
}  

public String getStandardAnswer() {  
    return standardAnswer;  
}  

public boolean isCorrect(String answer) {  
    return standardAnswer.equals(answer);  
}  

}包含题目号,内容,答案属性。get set方法,判断方法。 然后是试卷类:class Exam {
private Map<Integer, Question> questions;
private int questionCount;

public Exam() {  
    questions = new HashMap<>();  
    questionCount = 0;  
}  

public void addQuestion(Question question) {  
    questions.put(question.getNumber(), question);  
    questionCount++;  
}  

public boolean checkAnswer(int number, String answer) {  
    Question question = questions.get(number);  
    if (question != null) {  
        return question.isCorrect(answer);  
    }  
    return false;  
}  

public int getQuestionCount() {  
    return questionCount;  
}  

public List<Question> getQuestions() {  
    return new ArrayList<>(questions.values());  
}  

}用到了HashMap,判读题号和答案,保存题目的方法。 然后是答卷类:class AnswerSheet {
private Exam exam;
private List answers;
private List results;

public AnswerSheet(Exam exam) {  
    this.exam = exam;  
    this.answers = new ArrayList<>();  
    this.results = new ArrayList<>();  
}  

public void addAnswer(String answer) {  
    answers.add(answer);  
}  

public void evaluateAnswers() {  
    for (int i = 0; i < answers.size(); i++) {  
        results.add(exam.checkAnswer(i + 1, answers.get(i)));  
    }  
}  

public void printAnswersAndResults() {  
    List<Question> questions = exam.getQuestions();  
    for (int i = 0; i < questions.size(); i++) {  
        System.out.println(questions.get(i).getContent() + " ~" + answers.get(i));  
    }  
    for (boolean result : results) {  
        System.out.print(result ? "true" : "false" + " ");  
    }  
    System.out.println();  
}  

}`
这里用到了List。
可能是因为对List和HashMap不够理解,导致在最后一题大作业卡了好久,程序一直报错,一直不能输出想要的结果。无奈提交时间已经到了,只能放弃。

第二次大作业:
前三题比较简单,在此就不分析了。
依然是来到大作业的最后一题,这一题是在第一次题目的基础上增加功能。比如:程序输入信息分三种,三种信息可能会打乱顺序混合输入;试卷总分警示该部分仅当一张试卷的总分分值不等于100分时作提示之用,试卷依然属于正常试卷,可用于后面的答题。如果总分等于100分,该部分忽略,不输出。因为第一次大作业最后一题没能做出来,导致第二次修改增加功能也没法做,再加上那段时间C语言的课设马上就要提交了,导致第二次大作业也没能完成。
但总体还是有一些修改的:class Question {
String id;
String content;
String answer;

public Question(String id, String content, String answer) {
    this.id = id;
    this.content = content;
    this.answer = answer;
}

}

class TestPaper {
String id;
Map<String, Integer> questionsAndScores = new HashMap<>();

public TestPaper(String id) {
    this.id = id;
}

public void addQuestion(String questionId, int score) {
    questionsAndScores.put(questionId, score);
}

}

class AnswerSheet {
String testPaperId;
List answers = new ArrayList<>();

public AnswerSheet(String testPaperId) {
    this.testPaperId = testPaperId;
}

public void addAnswer(String answer) {
    answers.add(answer);
}

}

这次是换了一种风格,将主要内容写在Main类的main方法里,想以此当作C语言写,但是老师说不能再以面向过程的方式写了,所以我只能收手。

第三次大作业:
前面两题略过,看到最后一题,发现又是前两次大作业的升级版。
题目相比之前的大作业增加了:学生信息、删除题目信息。
这一次我改进了代码:`import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

class Question {
private int id;
private String content;
private String answer;

public Question(int id, String content, String answer) {
    this.id = id;
    this.content = content;
    this.answer = answer;
}

public int getId() {
    return id;
}

public String getContent() {
    return content;
}

public String getAnswer() {
    return answer;
}

public String toString() {
    return "Question{" +
            "id=" + id +
            ", content='" + content + '\'' +
            ", answer='" + answer + '\'' +
            '}';
}

}

class TestPaper {
private int id;
private List questionScores;

public TestPaper(int id) {
    this.id = id;
    this.questionScores = new ArrayList<>();
}

public int getId() {
    return id;
}

public List<QuestionScore> getQuestionScores() {
    return questionScores;
}

public void addQuestionScore(QuestionScore questionScore) {
    questionScores.add(questionScore);
}

public String toString() {
    return "TestPaper{" +
            "id=" + id +
            ", questionScores=" + questionScores +
            '}';
}

}

class QuestionScore {
private int questionId;
private int score;

public QuestionScore(int questionId, int score) {
    this.questionId = questionId;
    this.score = score;
}

public int getQuestionId() {
    return questionId;
}

public int getScore() {
    return score;
}

public String toString() {
    return "QuestionScore{" +
            "questionId=" + questionId +
            ", score=" + score +
            '}';
}

}

class Student {
private String id;
private String name;

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

public String getId() {
    return id;
}

public String getName() {
    return name;
}

public String toString() {
    return "Student{" +
            "id='" + id + '\'' +
            ", name='" + name + '\'' +
            '}';
}

}

class AnswerSheet {
private int testPaperId;
private String studentId;
private List answers;

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

public int getTestPaperId() {
    return testPaperId;
}

public String getStudentId() {
    return studentId;
}

public List<Answer> getAnswers() {
    return answers;
}

public void addAnswer(Answer answer) {
    answers.add(answer);
}

public String toString() {
    return "AnswerSheet{" +
            "testPaperId=" + testPaperId +
            ", studentId='" + studentId + '\'' +
            ", answers=" + answers +
            '}';
}

}

class Answer {
private int questionOrder;
private String answer;

public Answer(int questionOrder, String answer) {
    this.questionOrder = questionOrder;
    this.answer = answer;
}

public int getQuestionOrder() {
    return questionOrder;
}

public String getAnswer() {
    return answer;
}

public String toString() {
    return "Answer{" +
            "questionOrder=" + questionOrder +
            ", answer='" + answer + '\'' +
            '}';
}

}

public class Main{
private List questions;
private List testPapers;
private List students;
private List answerSheets;
private Map<Integer, Question> questionMap;
private Map<Integer, TestPaper> testPaperMap;
private Map<String, Student> studentMap;

public Main() {
    questions = new ArrayList<>();
    testPapers = new ArrayList<>();
    students = new ArrayList<>();
    answerSheets = new ArrayList<>();
    questionMap = new HashMap<>();
    testPaperMap = new HashMap<>();
    studentMap = new HashMap<>();
}

public void start() {
    Scanner scanner = new Scanner(System.in);
    while (true) {
        String input = scanner.nextLine();
        if (input.equalsIgnoreCase("end")) {
            break;
        }
        handleInput(input);
    }
    scanner.close();
    outputResult();
}

private void handleInput(String input) {
    String[] parts = input.split("\\s+");
    String command = parts[0];
    switch (command) {
        case "#N:":
            handleQuestion(input);
            break;
        case "#T:":
            handleTestPaper(input);
            break;
        case "#X:":
            handleStudent(input);
            break;
        case "#S:":
            handleAnswerSheet(input);
            break;
        case "#D:":
            handleDeleteQuestion(input);
            break;
        default:
            System.out.println("wrong format: " + input);
    }
}

private void handleQuestion(String input) {
    String[] parts = input.split("\\s+");
    int id = Integer.parseInt(parts[1].substring(2));
    String content = parts[3].substring(1, parts[3].length() - 1);
    String answer = parts[5].substring(1, parts[5].length() - 1);
    Question question = new Question(id, content, answer);
    questions.add(question);
    questionMap.put(id, question);
}

private void handleTestPaper(String input) {
    String[] parts = input.split("\\s+");
    int id = Integer.parseInt(parts[1].substring(2));
    TestPaper testPaper = new TestPaper(id);
    for (int i = 3; i < parts.length; i += 2) {
        int questionId = Integer.parseInt(parts[i].substring(0, parts[i].length() - 1));
        int score = Integer.parseInt(parts[i + 1]);
        QuestionScore questionScore = new QuestionScore(questionId, score);
        testPaper.addQuestionScore(questionScore);
    }
    testPapers.add(testPaper);
    testPaperMap.put(id, testPaper);
}

private void handleStudent(String input) {
    String[] parts = input.split("\\s+");
    String id = parts[1];
    String name = parts[3];
    Student student = new Student(id, name);
    students.add(student);
    studentMap.put(id, student);
}

private void handleAnswerSheet(String input) {
    String[] parts = input.split("\\s+");
    int testPaperId = Integer.parseInt(parts[1].substring(2));
    String studentId = parts[3];
    AnswerSheet answerSheet = new AnswerSheet(testPaperId, studentId);
    for (int i = 5; i < parts.length; i += 2) {
        int questionOrder = Integer.parseInt(parts[i].substring(0, parts[i].length() - 1));
        String answer = parts[i + 1].substring(1, parts[i + 1].length() - 1);
        Answer answerObj = new Answer(questionOrder, answer);
        answerSheet.addAnswer(answerObj);
    }
    answerSheets.add(answerSheet);
}

private void handleDeleteQuestion(String input) {
    String[] parts = input.split("\\s+");
    int id = Integer.parseInt(parts[1].substring(2));
    questions.remove(questionMap.get(id));
    questionMap.remove(id);
}

}`
但是不知道为何报错:Main.java:208: error: cannot find symbol
outputResult();
^
symbol: method outputResult()
location: class Main
1 error

就这样,三次大作业最后一题都没能写出来,但是最后一题的分数又异常的高,导致我虽然写出了不少题目,但就是因为没能写出最后一题(最后一题爆错没分),导致分数异常的低,还是比较可惜的。
从前面三次大作业来看,我深刻认识到了大作业的难度,也明白了不能一上学期那种懒散的态度对待JAVA课程了。对于之后的大作业,我必须打起十二分的精神,抽出足够的时间认真研究最后一题。

对大作业机制的改进建议:(1)每一题的难度平均一些,现在的大作业前面的题目太简单但是最后一题又太难。(2)分数设置均匀一些,现在的大作业前面题目就算写出来了也就小几十分,最后一题没写出来就是直接七八十分没了。

标签:学习,JAVA,String,int,private,public,Blog,answer,id
From: https://www.cnblogs.com/Butcher666/p/18148882

相关文章

  • linux shell 编程学习总结
    1文件和数组1.1读文件并将文件内容保存到数组,遍历数组src.f文件内容./src/xxx_1.md./src/xxx_2.md./src/xxx_3.md./src/xxx_4.md./src/xxx_5.mdrun.sh#!/bin/bash###readflisttoarraysrc_array=()whilereadline;dosrc_array+=("$line")done<$1##......
  • 第一次blog总
    一、前言:第一次pta作业:1.知识点:简单的类的设计,类和对象的使用,类的数组类型的基本应用,类间的关联等基础的类间关系设计,实现对类的封装等操作。2.题量:4道简单题,1道迭代的难题。3.难度:前4道题比较简单;最后一道第一次写难度较大。第二次pta作业:1.知识点:考察类实现Comparable......
  • Java安全基础之Java序列化与反序列化
    目录ObjectInputStream和ObjectOutputStreamjava.io.Serializable自定义序列化和反序列化Java的序列化(Serialization)是指将对象转换为字节序列的过程,而反序列化(Deserialization)则是将字节序列转换回对象的过程。序列化和反序列化通常用于在网络上传输对象或者将对象持久化到......
  • Java基础
    基础语法注释、标识符、关键字注释:单行、多行、文档注释///*注释*//***/标识符字母$_关键字数据类型强类型语言:先定义后使用弱类型语言基本类型(primitive)数字类型整数类型byteshortintlong浮点类型floatdouble......
  • 三次答题判题程序练习让你入门Java。
    (1)前言本阶段三次题目集涵盖了从基础编程概念到较复杂算法设计等多个知识点。题量适中,难度呈梯度上升,从简单的数据结构与算法实现到复杂的问题求解,逐步挑战学生的编程能力。第一次题目集主要考察基本语法、数据类型和简单的控制结构;第二次题目集则增加了数组、链表等数据结构的应......
  • 第一次Blog
    前言第一次题目集是对类的设计,类与对象的使用和类与数组关联类的考察。第二次题目集是类与对象之间的创建以及运用的考察。第三次题目集是对类的封装性以及Java自带时间包的运用的考察。总而言之,三次题目集的题目量并不算大,题目集的难度也是比较中等。设计与分析这是答题......
  • Java设计模式-责任链模式,应用接口多个参数验证,订单多个费用的计算
    Java设计模式-责任链模式,应用接口多个参数验证,订单多个费用的计算1.定义请求和返回对象的上下文对象packagecom.example.core.mydemo.java.filter;importjava.time.LocalDateTime;publicclassOrderReqContext{/***租客会员号*/StringmemNo;......
  • Java面试题:请谈谈对ThreadLocal的理解?
    ThreadLocal是一种特殊的变量存储机制,它提供了一种方式,可以在每个线程中保存数据,而不会受到其他线程的影响。这种机制在多线程编程中非常有用,因为它允许每个线程拥有自己的数据副本,从而避免了数据竞争和线程之间的干扰,以空间换时间。在Java中,ThreadLocal的实现主要涉及到三个类:Th......
  • [转帖]十年拉锯战终结束,Google 赢得 Java API 版权诉讼
    https://www.oschina.net/news/136073/googles-wins-lawsuit Google和Oracle(甲骨文)在法庭上就Android操作系统中Java编程语言的使用问题争吵了十年。美国最高法院在周一以6比2的投票结果裁定,Google对Java代码的使用被归为"合理使用",没有违反联邦版权法......
  • [转帖]Oracle 败了、谷歌赢了:Java API 版权案最终裁决
    https://zhuanlan.zhihu.com/p/362496136 周一,最高法院在Oracle围绕移动操作系统Android中所用软件的一起旷日持久的版权诉讼中判谷歌胜诉。法院的判决为6比2。大法官AmyConeyBarrett没有参与此案。该案涉及谷歌用于构建Android的12000行代码,这些代码是从SunMicrosy......