前三次Java题目集总结

发布时间 2023-10-07 21:23:53作者: 不升级

前言

既然老师发布了作业做一次Java题目集总结并发Blog,那我就说说我的感受吧。关于第一次题目集给我的感觉似曾相识。回想这几年学过的编程 语言,我知道了是什么感觉了。是写C语言pta作业的感觉,,,尤其是在我室友用C写出一道题目之后,这种感觉就更强烈了。。。直到第二次第三次习题集发布。我真的没想到原来Java是这样的,原来Java能引用别的类,用来完成自己的代码需求,那是不是说明Java要记的东西特别的,用的东西也会不时的更新,好好好,我总算知道为什么说Java卷了。

  1. 第一次题目集
    7-1 身体质量指数(BMI)测算 10 118/588(20.07%)
      7-2 长度质量计量单位换算 5 126/767(16.43%)
      7-3 NCHU_奇数求和 9 121/329(36.78%)
      7-4 NCHU_房产税费计算 12 121/669(18.09%)
      7-5 游戏角色选择 14 107/276(38.77%)
      7-6 NCHU_学号识别 10 106/562(18.86%)
      7-8 NCHU_巴比伦法求平方根近似值 10 111/522(21.26%)
      7-9 二进制数值提取 10 106/565(18.76%)
      7-7 判断三角形类型 20 117/907(12.90%)
     
  2. 第二次题目集
    7-1 成绩计算-1-类、数组的基本运用 10 117/455(25.71%)
      7-2 成绩计算-2-关联类 10 71/569(12.48%)
      7-3 有重复的数据 10 116/1151(10.08%)
      7-4 去掉重复的数据 10 109/572(19.06%)
      7-5 面向对象编程(封装性) 10 116/245(47.35%)
      7-6 GPS测绘中度分秒转换 10 103/491(20.98%)
      7-7 菜单计价程序-1 30 116/428(27.10%)
      7-8 jmu-java-日期类的基本使用 10 61/1111(5.49%)
     
  3. 第三次题目集
    7-1 jmu-java-日期类的基本使用 10 89/742(11.99%)
      7-2 课程成绩统计程序-1 65 31/955(3.25%)
      7-3 面向对象编程(封装性) 10 118/205(57.56%)
      7-4 判断两个日期的先后,计算间隔天数、周数 15 103/583(17.67%)
     

这三次题目集难度逐步上升,多说无益,看上边的提交和通过率。

设计与分析

第二次题目集 7-1

7-1 成绩计算-1-类、数组的基本运用
分数 10
作者 蔡轲
单位 南昌航空大学

创建学生类,包含

属性:学号(String)、姓名(String)、语文成绩(int)、数学成绩(int)、物理成绩(int)

方法:计算总分、计算平均分

输入5个学生的信息,将每个学生的信息封装在一个学生对象中。

按输入顺序依次输出5个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。

浮点数保留小数的相关知识可参考:
https://blog.csdn.net/huaishuming/article/details/17752365


注意:未用学生类对象封装数据的,本题计0分

输入格式:

5个学生信息,每个学生信息格式:

学号+英文空格+姓名+英文空格+语文成绩+英文空格+数学成绩+英文空格+物理成绩
例如:
22201311 张琳 80 80 80

22201312 黄昊 66 82 81

22201313 李少辰 77 76 80

22201314 袁婷 62 79 90

22201315 朱哲一 74 98 94

输出格式:

5个学生信息,每个学生信息格式:

学号+英文空格+姓名+英文空格+总成绩+英文空格+平均分

例如:

22201311 张琳 240 80.00

22201312 黄昊 229 76.33

22201313 李少辰 233 77.67

22201314 袁婷 231 77.00

22201315 朱哲一 266 88.67

输入样例:

在这里给出一组输入。例如:

22201311 张琳 80 80 80
22201312 黄昊 66 82 81
22201313 李少辰 77 76 80
22201314 袁婷 62 79 90
22201315 朱哲一 74 98 94

输出样例:

在这里给出相应的输出。例如:

22201311 张琳 240 80.00
22201312 黄昊 229 76.33
22201313 李少辰 233 77.67
22201314 袁婷 231 77.00
22201315 朱哲一 266 88.67
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
import java .util.Scanner;
import java .util.List;
import java.text.DecimalFormat;

class Student{
	String name;
	String ID;
	int Chinese;
	int Mathscore;
	int Physics;
	
     public Student(String name,String ID, int Chinese,int Mathscore,int Physics) {
		this.name= name;
    	this.ID = ID;
    	this.Chinese=Chinese;
    	this.Physics=Physics;
    	this.Mathscore=Mathscore;
	}
	public int AggScore() {
		return Chinese + Mathscore + Physics;
	}
	
	public double AverageScore() {
		int sum = AggScore(); 
		return (double)Math.round(sum/3.0*100)/100;
	}
	public String formScore() {
		DecimalFormat df = new DecimalFormat("#.00");
        return df.format(AverageScore());
	}
	  public String toString() {
        return  ID + " " + name + " " + AggScore() + " " + formScore();
    }
    
}


public class Main {
	public static void main(String[] args) {
		   Scanner input = new Scanner(System.in);
		Student[] students = new Student[5];
		for(int i=0;i<5;i++){
		 
		   String line= input.nextLine();
		   String [] info = line.split(" ");
		   String iD = info[0];
		   String name=info[1];
		  int chinese=Integer.parseInt(info[2]); 
		  int Math= Integer.parseInt(info[3]);
		  int Physics=Integer.parseInt(info[4]);
		  students[i]=new Student(name,iD,chinese,Math,Physics);
		}
		
		for (int i = 0; i < 5; i++) {
         System.out.println(students[i]);
        }
}
}

  

这题其实还好,学习了怎么用空格分隔符合,然后将输入的字符串按自己的需求赋值。
 
第二次题目集7-2
7-2 成绩计算-2-关联类
分数 10
作者 蔡轲
单位 南昌航空大学

创建成绩类,包含:

属性:平时成绩(int)、期末成绩(int)

方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃)

创建学生类,包含:

属性:学号(String)、姓名(String)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类)

方法:计算总分、计算平均分

输入3个学生的信息,将每个学生的信息封装在一个学生对象中。

按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。

浮点数保留小数的相关知识可参考:https://blog.csdn.net/huaishuming/article/details/17752365


注意:未用学生类对象封装数据的,本题计0分

输入格式:

依次输入3个学生的每门课成绩,每个学生成绩信息格式:

学号+英文空格+姓名+英文空格+课程名+英文空格+平时成绩+英文空格+期末成绩
注:3个学生的课程顺序可能会不一致

例如:
22201311 张琳 语文 70 80

22201311 张琳 数学 85 89

22201311 张琳 物理 75 83

22201312 黄昊 语文 66 78

22201312 黄昊 数学 76 82

22201312 黄昊 物理 83 82

22201313 李少辰 语文 86 76

22201313 李少辰 数学 78 76

22201313 李少辰 物理 87 76

输出格式:

3个学生信息,每个学生信息格式:

学号+英文空格+姓名+英文空格+总成绩+英文空格+平均分

例如:


22201311 张琳 242 80.67

22201312 黄昊 234 78.00

22201313 李少辰 236 78.67

输入样例:

在这里给出一组输入。例如:

22201311 张琳 语文 70 80
22201311 张琳 数学 85 89
22201311 张琳 物理 75 83
22201312 黄昊 语文 66 78
22201312 黄昊 数学 76 82
22201312 黄昊 物理 83 82
22201313 李少辰 语文 86 76
22201313 李少辰 数学 78 76
22201313 李少辰 物理 87 76

输出样例:

在这里给出相应的输出。例如:

22201311 张琳 242 76.67 84.00 80.67
22201312 黄昊 234 75.00 80.67 78.00
22201313 李少辰 236 83.67 76.00 78.67

 

mport java.text.DecimalFormat;
import java.util.Scanner;

class Student{
	String name;
	String ID;
	Score Chinese;
	Score Mathscore;
	Score Physics;
	
     public Student(String name,String ID, Score Chinese,Score Mathscore,Score Physics) {
		this.name= name;
    	this.ID = ID;
    	this.Chinese=Chinese;
    	this.Physics=Physics;
    	this.Mathscore=Mathscore;
	}
	public int AggScore() {
		return Chinese.getScore() + Mathscore.getScore() + Physics.getScore();
	}
	
	public double AverageScore() {
		int sum = AggScore(); 
		return (double)Math.round(sum/3*100)/100;
	}
	public String formScore() {
		DecimalFormat df = new DecimalFormat("#.00");
        return df.format(AverageScore());
	}
	 public void print() {
		    System.out.println(ID+" "+name+" "+AggScore()+" "+" "+AverageScore());
    }
}
class Score {
  int nomalscore;
  int finalscore;
  public Score(int nomalscore,int finalscore) {
	  this.nomalscore = nomalscore ;
	  this.finalscore = finalscore ;
  }

  public int totalscore(){
	  return (int)(nomalscore*0.4+finalscore *0.6);
  }
    public int getScore() {
	  return totalscore();
  }
}
public class Main {
	public static void main(String[] args) {
		Student[] students = new Student[3];
		Scanner input = new Scanner(System.in);
		    for(int i=0;i<3;i++){
		    String line1= input.nextLine();
		    String[] info1 = line1.split(" ");
		    String iD1 = info1[0];
		    String name1=info1[1];
		    String course1 =info1[2]; 
		    int nomalscore1= Integer.parseInt(info1[3]);
		    int finalscore1=Integer.parseInt(info1[4]);
		    Score chineseScore=new Score(nomalscore1, finalscore1);
		    
		    String line2= input.nextLine();
		    String[] info2 = line2.split(" ");
		    String iD2 = info2[0];
		    String name2=info2[1];
		    String course2 =info2[2]; 
		    int nomalscore2= Integer.parseInt(info2[3]);
		    int finalscore2=Integer.parseInt(info2[4]);
		    Score mathScore =new Score(nomalscore2, finalscore2);
		    
		    String line3= input.nextLine();
		    String[] info3 = line3.split(" ");
		    String iD3 = info3[0];
		    String name3=info3[1];
		    String course3 =info3[2]; 
		    int nomalscore3= Integer.parseInt(info3[3]);
		    int finalscore3=Integer.parseInt(info3[4]);
		    Score physics=new Score(nomalscore3, finalscore3);
		 
		    students[i]=new Student(name3, iD3, chineseScore, mathScore, physics);
		    }

		for (int i = 0; i < 3; i++) {
	          students[i].print();
	     }
}
}

  这题我给的代码其实不能实现需求,当时写这道题目的时候感觉题目有问题,用平时分和期末成绩算最后的总分总是算不对例子的输出,后来问了同学才知道他们是所有的平时分平均算的,而我是一次一次算的,所有当我用平时分和考试成绩算出87这个整数的时候,就已经走上了歧途了。。。

 

第二次题目集 7-7

7-7 菜单计价程序-1
分数 30
作者 蔡轲
单位 南昌航空大学

某饭店提供4种菜,每种菜品的基础价格如下:
西红柿炒蛋 15
清炒土豆丝 12
麻婆豆腐 12
油淋生菜 9

设计点菜计价程序,根据输入的订单,计算并输出总价格。
订单由一条或多条点菜记录组成,每条记录一行,最后以"end"结束
每条点菜记录包含:菜名、份额两个信息。
份额可选项包括:1、2、3,分别代表小、中、大份)

不同份额菜价的计算方法:
小份菜的价格=菜品的基础价格。
中份菜的价格=菜品的基础价格1.5。
小份菜的价格=菜品的基础价格
2。
如果计算出现小数,按四舍五入的规则进行处理。

参考以下类的模板进行设计:
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
}

菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
}

点菜记录类:保存订单上的一道菜品记录
Record {
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}

订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(String dishName,int portion)
//添加一条菜品信息到订单中。
}

输入格式:

每条点菜记录的格式:
菜名+空格(英文)+份额
注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
最后一条记录以“end”结束。

输出格式:

订单上所有菜品的总价(整数数值),每份菜
如果订单中包含不能识别的菜名,则在总价之前输出“** does not exist”,**是不能识别的菜名

输入样例:

在这里给出一组输入。例如:

麻婆豆腐 2
西红柿炒蛋 3
end

输出样例:

在这里给出相应的输出。例如:

48

输入样例1:

订单中包含不存在的菜品记录。例如:

麻婆豆腐 2
炒脆肚 2
西红柿炒蛋 3
end

输出样例1:

在这里给出相应的输出。例如:

炒脆肚 does not exist
48

 

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Dish {
    String name; // 菜品名称
    int unit_price; // 单价

    int getPrice(int portion) {
        if(portion==1)
                return unit_price;
        if(portion==2)
                return (int)Math.round(unit_price * 1.5f);
        if(portion==3)
                return unit_price * 2;
        return 0;
        }
    }

class Menu {
    Dish[] dishes; // 菜品数组,保存所有菜品信息

    Dish searchDish(String dishName) {
        for (Dish dish : dishes) {
            if (dish.name.compareTo(dishName)==0) {
                return dish;
            }
        }
        return null;
    }
}

class Record {
    Dish d; // 菜品
    int portion; // 份额(1/2/3代表小/中/大份)

    int getPrice() {
        return d.getPrice(portion);
    }
}

class Order {
    Record[] records; // 保存订单上每一道的记录

    int getTotalPrice() {
        int totalPrice = 0;
        for (Record record : records) {
            totalPrice += record.getPrice();
        }
        return totalPrice;
    }

    Record addARecord(Menu menu ,String dishName, int portion) {
        
        Dish dish = menu.searchDish(dishName);
        if (dish == null) {
            System.out.println(dishName + " does not exist");
            return null;
        } else {
            Record record = new Record();
            record.d = dish;
            record.portion = portion;
            return record;
        }
    }
}


public class Main {
    public static void main(String[] args) {
	        Scanner scanner = new Scanner(System.in);

	        // 创建菜单
	        Menu menu = new Menu();
	        menu.dishes = new Dish[4];
	        menu.dishes[0] = new Dish();
	        menu.dishes[0].name = "西红柿炒蛋";
	        menu.dishes[0].unit_price = 15;
	        menu.dishes[1] = new Dish();
	        menu.dishes[1].name = "清炒土豆丝";
	        menu.dishes[1].unit_price = 12;
	        menu.dishes[2] = new Dish();
	        menu.dishes[2].name = "麻婆豆腐";
	        menu.dishes[2].unit_price = 12;
	        menu.dishes[3] = new Dish();
	        menu.dishes[3].name = "油淋生菜";
	        menu.dishes[3].unit_price = 9;

	        // 创建订单
	        Order order = new Order();
	        List<Record> recordList = new ArrayList<>();

	        // 处理输入的点菜记录
	        while (true) {
	            String line = scanner.nextLine();
	            if (line.equals("end")) {
	                break;
	            }
	            String[] parts = line.split(" ");
	            String dishName = parts[0];
	            int portion = Integer.parseInt(parts[1]);
	            Record record = order.addARecord(menu, dishName, portion); // 将menu作为参数传递
	            if (record != null) {
	                recordList.add(record);
	            }
	        }

	        // 将点菜记录添加到订单中
	        order.records = recordList.toArray(new Record[0]);

	        // 计算并输出总价格
	        int totalPrice = order.getTotalPrice();
	        System.out.println(totalPrice);

	        scanner.close();
	    }
}

  这道题说实话,其实我到现在都不是很能理解功能是如何实现的,创建了很多类,还把这些类串联了起来,达到了菜单的效果。

至于第三次题目集的7-2就是这题的升级版,在网上找了类似的例子程序,发现给的例子并没有用到很多类,而是使用了哈希表来实现的,给我看的一愣一愣的的,加上当时正值国庆放假第二天,就没写QWQ。

采坑心得

编译的过程中其实一直会遇到Index 1 out of bounds for length 1,用split没法识别空格将字符串赋值,但东改西改就搞定了也不知道为啥。

还有pta是真的让人心累啊,格式要求真的很奇葩,有的输出明明看起来一模一样,符合都一样,但硬是要复制参考输出的符号输出,才能通过测试点,有的测试点也是莫名其妙,明明输出结果是正常的,就是过不了测试点。。。

总结

题目集给的很好,有简单有难题,虽然难题(我目前觉得难)写不出来,但我还是觉得很好,因为让我看出来今后代码应用的方向,就比如菜单程序。但同时有的题目确实容易引起歧义,让人摸不着头脑。这里我感觉很对不起第三次题目集,因为我真的做不出来那第二道题QWQ希望下次题目集还有类似的题目出现,我能够把题目搞定吧。