blog-1
BLOG1
以下是一份java题目集一二三的阶段性总结,时隔许久,我只能凭借题目顺序慢慢回忆。
出于对菜单计价程序的尊敬,也出于他的难度,我将前三次题目集中的菜单计价程序总结在最后。
首先是第一次题目集,也是题目最多但也是最简单的一次题目集,它的难度逐步上升。
7-1 身体质量指数(BMI)测算
这个算是比较简单的开始,唯一要注意的是数据类型应定义成double
7-2 长度质量计量单位换算
这个与前一题类似,不多赘述
7-3 奇数求和
该题要注意的是数组的使用,尤其是定义十个整数时,正确定义方式是int a[]={0,0,0,0,0,0,0,0,0,0};
7-4 房产税费计算2022
该题也是简单的数学运算
7-5 游戏角色选择
该题是在java中第一次使用选择,可以用switch语句,不过我用的是if语句进行选择
7-6 学号识别
该题第一次在java中使length函数,通过字符长度判断输入学号是否合法
7-8 巴比伦法求平方根近似值
该题也为根据题意进行数学运算
7-9 二进制数值提取
该题乍看让人云里雾里,细看题目便可做出,注意题目要求
输入格式:
一个由0、1构成的序列,以-1为结束符,非0、1字符视为正常输入,但忽略不计,未包含结束符的序列视为非法输入。例如:abc00aj014421-1
输出格式:
将输入的序列去掉非0、1字符以及结尾符的数据内容,
注:结束符-1之后的0\1字符忽略不计。
7-7 判断三角形类型
该题思路也算比较简单,多个出口稍显麻烦,也是第一次题目集中代码行数最多的,不过还是不敢与后文比较
接下来就是第二次题目集,回看往昔居然还没拿到及格分
菜单计价程序暂且按下不表,由于时间和心态原因虽然过程坎坷,还存在许多问题需要解决,所以我就先写了第三题,结果第三题一直显示非零返回,便去写第四题,结果第四题也一样存在非零返回的问题。

以下是第四道题
7-4 小明走格子
从A点到B点有n个格子,小明现在要从A点到B点,小明吃了些东西,补充了一下体力,他可以一步迈一个格子,也可以一步迈两个格子,也可以一步迈3个格子,也可以一步迈4个格子。请编写程序计算小明从A点到B点一共有多少种走法。
结果又是非零返回,于是我去网上搜到以下结果
非零返回是什么?
# 非零返回是指的一些语法,在PTA执行的过程中,抛出了异常,导致没有运行到最后一步return,所以导致非零返回。而这些语法通常在pycharm上是通过的,PYcharm运行不会出任何错误
# 例如:li是一个列表
# for i in li:
# if i % 2 == 0:
# list3.append(i)
#
# for i in range(0,n+1):
# if i % 2 == 0:
# list3.append(li[i])
#
# 这句是通过两种方式,一种是利用下标索引,一种是直接的
# 在pycharm上运行都是对的,但是在PTA的平台上会抛出异常,导致非零返回
# 也许是PTA的语法规范有些地方很严格,或者包容性太差,又或许是PYcharm很智能,或者很不规范
在我的理解来说,就是pta无法正常识别个别语句,将代码简化为最简单的模式便可,但又依旧因为时间紧迫,多次修改后没有得到分数,便投机取巧使用c编程语言进行答题,所幸这次得到了分,虽然也不是满分,但相较于前次提交已经算的上让我欣慰了。
再就是最后一份题目集,也就是第三次题目集
7-1 菜单计价程序-3
(这个虽然应该放在后文再仔细提,但我发现经过一二次菜单的折磨,我的菜单三根本就是空空如也)
7-2 有重复的数据
这个主要是读入整数和循环的使用
7-3 去掉重复的数
这个与前一题相似
7-4 单词统计与排序
该题主要考察相关函数的使用
7-5 面向对象编程(封装性)
该题开始真正使用面向对象进行编程构造
7-6 GPS测绘中度分秒转换
这道题因为时间原因,我以为我写了,就没再打开pta,结果过了提交截止时间我才发现原来这道题没写完,后续尝试补写,以下是代码。
import java.util.Scanner;
public class Main {
public static void main(String []args){
Scanner input = new Scanner(System.in);
int degree = input.nextInt();
int degree = input.nextInt();
int minute = input.nextInt();
double second = input.nextDouble();
double get;
get = degree +(minute/60.0) + (second/3600.0);
System.out.print(degree + "°"+mintue +" ′"+second+" ″"+" = ");
System.put.printf("%.6f",get);
}
}
7-7 判断两个日期的先后,计算间隔天数、周数
正如该题提示一般,通过查询Java API文档,了解Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。
以下就是重头戏
三次菜单计价程序
7-1 菜单计价程序-1
这里是一切痛苦的开始,往后的三四五对我这个废物来说,算得上崩溃,也就一二勉强拿分。()
某饭店提供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
该题在开始动笔的时候也是让我受尽折磨,尤其是第一次利用java中实际学的内容,以前的题目或多或少都有着c的大部分基础,这题算是让我的心态从c转换为java
该题包含多个类,菜品dish,菜谱menu,点菜记录record,订单order,其实相较于后文已经简单的多了,当然是时隔许久后的回头看才敢这么说。
以下是仍存在问题的第一次代码
import java.util.Scanner; class Dish { String name; int unit_price; public Dish(String name,int unit_price) { this.name = name; this.unit_price = unit_price; } public int getPrice(int portion) { double price=unit_price; if(portion==2)price=1.5*price; if(portion==3)price=2*price; return (int) Math.round(price); } } class Menu { Dish[] dishs ; Menu(Dish[] dishs) {this.dishs = dishs;} public void addDish(Dish dish) { int c=0; if(dishs!=null)c=dishs.length; Dish[] temp = new Dish[c+1]; if(c>0)System.arraycopy(dishs,0,temp,0,c); temp[c]=dish;//新增一个菜品 dishs=temp; } Dish searchDish(String dishN) { if(dishs==null)return null; for(int i=0;i<dishs.length;i++) { if(dishs[i].name.equals(dishN)) return dishs[i]; } System.out.println(dishN+" "+"does not exist"); return null; } } class Record { Dish d; int portion; public Record(Dish d,int portion) { this.d = d; this.portion = portion; } int getP() { return d.getPrice(portion); } } class Order { Record[] records; Menu menu; public Order(Menu menu){this.menu = menu;} int getTotalPrice() { int total=0; if(records==null)return 0; for(int i=0;i<records.length;i++) { total+=records[i].getP(); } return total; } Record addRecord(String dishN,int portion) { Dish dish=menu.searchDish(dishN); if (dish == null) { System.out.println(dishN + "does not exist"); return null; } Record record=null; if(dish!=null) { record = new Record(dish,portion); int count=0; if(records!=null)count=records.length; Record temp[] = new Record[count+1]; if(count>0)System.arraycopy(records,0,temp,0,count); temp[count]=record; records=temp; } return record; } } public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); Dish[] dishs = { new Dish("西红柿炒蛋", 15), new Dish("清炒土豆丝", 12), new Dish("麻婆豆腐", 12), new Dish("油淋生菜", 9) }; Menu menu = new Menu(dishs); Order order = new Order(menu); while (true) { String line = in.nextLine(); if (line.equals("end")) break; String[] parts = line.split(" "); String dishN= parts[0]; int portion = Integer.parseInt(parts[1]); order.addRecord(dishN,portion); } System.out.println(order.getTotalPrice()); } }

菜单计价程序二是我唯一一个拿满分的菜单程序,相较于第一次,该次在订单上添加了删除记录选项,而且是通过序号将点菜记录删除的,所以只要处理好点菜序号即可。并且菜品价格开始发现差别,出现大中小三份情况,所以可根据题意调整价格。

且需要注意的是,虽然过程中出现了小数,但题目明确要求按照四舍五入的规则进行处理,输出格式也明确表示最后输出订单上所有菜品的总价是整数数值。
同时需要注意特别强调不考虑其他错误,(包括菜单订单顺序颠倒,不符合格式的输入,序号错误等),只考虑当删除记录的序号不存在时输出 delete error ,订单中如果包括不能识别的菜名,则输出“** does not exist ”,其中**是不能识别的菜名。
以上整数和小数过程中我忘了转换,导致过错误,也因为未识别错误菜名而导致整个程序没法正常运行,但索性后续都修改过来了。以下是正确的代码。
import java.util.List;
import java.util.Scanner;
import java.util.ArrayList;
class Menu {
private List<Dish> dishes = new ArrayList<>();
void addD(Dish dish) {
}
Menu() {
}
Dish searchDish(String dishN) {
for (Dish dish : dishes) {
if (dish.getN().equals(dishN)) {
return dish;
}
}
return null;
}
Dish addD(String dishN, int unit_price) {
for (Dish dish : dishes) {
if (dish.getN().equals(dishN)) {
dish.setUnit_price(unit_price);
return dish;
}
}
Dish dish = new Dish(dishN, unit_price);
dishes.add(dish);
return dish;
}
}
class Dish {
String name;
int unit_price;
public String getN() {
return name;
}
public void setN(String name) {
this.name = name;
}
public int getUnit_price() {
return unit_price;
}
public void setUnit_price(int unit_price) {
this.unit_price = unit_price;
}
public Dish(String name, int unit_price) {
this.name = name;
this.unit_price = unit_price;
}
public Dish() {
}
int getPrice(int portion) {
float b[] = {1, 1.5f, 2};
return Math.round((unit_price * b[portion - 1]));
}
}
class Record {
private int orderN;
private Dish d;
private int portion;
private int num;
private boolean isDelete = false;
public boolean isNotFound() {
return notFound;
}
public void setNotFound(boolean notFound) {
this.notFound = notFound;
}
private boolean notFound = false;
public Record(Dish d, int portion) {
this.d = d;
this.portion = portion;
}
public Record(int orderN, Dish d, int portion, int num) {
this.orderN = orderN;
this.d = d;
this.portion = portion;
this.num = num;
}
int getP() {
return d.getPrice(portion)*this.num;
}
public int getOrderNum() {
return orderN;
}
public void setOrderNum(int orderN) {
this.orderN = orderN;
}
public Dish getD() {
return d;
}
public void setD(Dish d) {
this.d = d;
}
public int getPortion() {
return portion;
}
public void setPortion(int portion) {
this.portion = portion;
}
public boolean isDelete() {
return isDelete;
}
public void setDelete(boolean delete) {
isDelete = delete;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
class Order {
private Menu menu;
private static List<Record> records = new ArrayList<>();
public Order(Menu menu) {
this.menu = menu;
}
int getTotalPrice() {
int sum = 0;
for (Record record : records) {
int price = record.getP();
if (!record.isDelete()) {
sum = sum + price;
}
}
return sum;
}
Record addRecord(int orderN, String dishN, int portion, int num) {
Dish dish = menu.searchDish(dishN);
if (dish == null) {
System.out.println(dishN + " does not exist");
return null;
}
Record record = new Record(orderN, dish, portion, num);
records.add(record);
int price = record.getP();
System.out.println(record.getOrderNum() + " " + record.getD().getN() + " " + price);
return record;
}
public boolean delARecordByOrderNum(int orderN) {
for (Record record : records) {
if (!record.isNotFound() && !record.isDelete() && record.getOrderNum() == orderN) {
record.setDelete(true);
return true;
}
}
System.out.println("delete error;");
return false;
}
}
public class Main {
public static void main(String[] args) {
Menu menu = new Menu();
Order order = new Order(menu);
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
while (!line.equals("end")) {
String[] lineArray = line.split(" ");
if (lineArray.length > 2) {
int orderN = Integer.parseInt(lineArray[0]);
String dishN = lineArray[1];
int portion = Integer.parseInt(lineArray[2]);
int num = Integer.parseInt(lineArray[3]);
order.addRecord(orderN, dishN, portion, num);
} else if ("delete".equals(lineArray[1])) {
order.delARecordByOrderNum(Integer.parseInt(lineArray[0]));
} else {
menu.addD(lineArray[0], Integer.parseInt(lineArray[1]));
}
line = scanner.nextLine();
}
System.out.println(order.getTotalPrice());
}
}
第三次菜单计价程序已经把我唬住了,所以我第三次菜单是完全空白,但还是根据题意浅做一些分析。
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。
桌号标识独占一行,包含两个信息:桌号、时间。
桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。
不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
如果序号不对,输出"delete error"
代点菜信息包含:桌号 序号 菜品名称 份额 分数
代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。
程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。
每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。
折扣的计算方法(注:以下时间段均按闭区间计算):
周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。
周末全价,营业时间:9:30-21:30
如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"
参考以下类的模板进行设计:菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish\[\] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号\\
Dish d;//菜品\\
int portion;//份额(1/2/3代表小/中/大份)\\
int getPrice()//计价,计算本条记录的价格\\
}
订单类:保存用户点的所有菜的信息。
Order {
Record\[\] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
### 输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
### 输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+”:”
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。
输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+“:”+英文空格
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。
输入样例:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 12/2/3
1 麻婆豆腐 2 2
2 油淋生菜 1 3
end
输出样例:
在这里给出相应的输出。例如:
table 1:
1 麻婆豆腐 36
2 油淋生菜 27
table 1: 38
输入样例1:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 17/0/0
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end
输出样例1:
在这里给出相应的输出。例如:
table 1:
1 麻婆豆腐 36
2 油淋生菜 27
table 1: 22
输入样例2:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 16/59/59
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end
输出样例2:
在这里给出相应的输出。例如:
table 1:
1 麻婆豆腐 36
2 油淋生菜 27
table 1 out of opening hours
输入样例3:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9
table 1 2022/12/5 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
5 delete
7 delete
table 2 2022/12/3 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
7 delete
end
输出样例3:
在这里给出相应的输出。例如:
table 1:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
delete error;
table 2:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
table 1 out of opening hours
table 2: 63
输入样例4:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9
table 1 2022/12/3 19/5/12
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
table 2 2022/12/3 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
1 4 麻婆豆腐 1 1
7 delete
end
输出样例4:
在这里给出相应的输出。例如:
table 1:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
table 2:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
4 table 2 pay for table 1 12
delete error;
table 1: 63
table 2: 75
第三次相较于第二次菜单加入了代点菜信息,且加入桌号识别,这些都还好,关键是出现了根据时间计算折扣和代点菜记录的结合,这太让我头疼了,虽然现在回头看跟菜单四五比较,顶多算是小巫见大巫,但时过境迁的东西怎么说呢,只能说以后更加努力吧。
总结:在以上三次的题目集中,从第一次的温柔一击开始,我便有些懈怠,第二次题目集就出现了菜单计价程序,对于那时候的我出现吃力情况很正常,第三次题目我出现了破罐子破摔的心态,也在这三次题目集中,我都没有从一开始就全力以赴,都是只留了一两天才开始动笔,最后都是被ddl逼的交答案,没办法的焦虑。
希望自己能够接下来的每一次题目集都能有进步,哪怕不要求满分,能拿的分尽力去拿,不能抱着写不来就彻底放弃的心态,直面困难与挑战,希望能在接下来的java学习中收获更多。

浙公网安备 33010602011771号