前言
菜单类题目之外的其他的小题目都还好,差不多都做出来了,在做这些题目的同时我也学会了很多java语言的知识,明白了合理用JAVA中包含的自带的函数是一种便捷高效的方法 显而易见,此三次的PTA作业所考察的知识点以及难度呈现不断变大的趋势。PTA1作业难度简单,虽然题目量是最多的,但却是最简单的,是我三个题目里面唯一一次全对的,PTA2比PTA1难度有较大的提升,知识点从PTA1的循环结构直接变成了数组和面向对象,当然里面还有少量的循环语句。而PTA3难度是在PTA2上进一步提升了,尤其是第一题菜单类的题目,简直让人痛不欲生。几次PTA的作业着重练习类的构造方法、方法的调用、参数传递、对象的构造与使用;练习循环结构、控制结构;练习数据的输入与输出;学习编写结构清晰、逻辑正确、功能完善的java代码。学习使用工具对代码进行跟踪调试。理解抽象类与子类的关系,实现继承操作,构造类族;正确使用抽象类和子类实现多态操作;理解接口的意义,并实现行为的多态;理解了解抽象类、类以及接口三者的异同以及使用场合。掌握UML基本用法和画法,并能根据题目描述画出类、接口、类。整体题量适中,大部分的题目的难度适中,极个别题目有着鲜明的特点、特征
第一次pta
本次习题集共有9道题,题目量较多,第一道题考察的是身体质量指数测算,要运用if-else语句来解决问题,难度偏简单,第二题考察的是长度质量计量单位换算,考察了浮点型数,代码工作量较少,难度较易,第三题考察奇数求和,通过简单的遍历相加实现,难度比较简单,第四题考察房产税费计算,虽然代码工作量较前三题更多,但是通过一个简单的if-else语句便可实现,难度较简单,第五题考察的是游戏角色选择,通过输入相对应的数字来选择不同角色,通过if语句实现,难度较易,第六题是考察学号识别,比前几题要难度大一点,通过将输入的学号转化为字符串类型,在通过获取字符串中的内容来完成,但是也可用if语句实现,只是操作起来会更难一点,第七题考察巴比伦法求近似值,难度较易,通过题目所给的公式求解即可,使用了if语句还有while语句,此题目还需要注重一下细节,要注意一下非法输入,第八题考察二进制数值提取,难度适中,难度在于如何解决不满足情况,以及返回值,使用了字符串中的获取内容,以及遍历字符串来获取所需要的内容,第九题考察如何判断三角形类型,难度简单,通过判断不同三角形的特点,使用if语句实现判断不同三角形。
1.题目集一7-8:判断三角形类型
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
输出格式:
(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (4)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。
输入样例1:
在这里给出一组输入。例如:
50 50 50.0
输出样例1:
在这里给出相应的输出。例如:
Equilateral triangle
输入样例2:
在这里给出一组输入。例如:
60.2 60.2 80.56
输出样例2:
在这里给出相应的输出。例如:
Isosceles triangle
输入样例3:
在这里给出一组输入。例如:
0.5 20.5 80
输出样例3:
在这里给出相应的输出。例如:
Wrong Format
运行代码:
1.题目集一7-8:判断三角形类型
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
输出格式:
(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (4)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。
输入样例1:
在这里给出一组输入。例如:
50 50 50.0
输出样例1:
在这里给出相应的输出。例如:
Equilateral triangle
输入样例2:
在这里给出一组输入。例如:
60.2 60.2 80.56
输出样例2:
在这里给出相应的输出。例如:
Isosceles triangle
输入样例3:
在这里给出一组输入。例如:
0.5 20.5 80
输出样例3:
在这里给出相应的输出。例如:
Wrong Format
运行代码:
设计与分析:这道题主要分析三角形的类型,注意千万别考虑少了情况, 直角的分析就是分析一边的平方加上零一条边长的平方是否等于零一条边长的平方, 判断三角形成立的条件是两边之和大于第三边(需要判断任意两条边之和大于第三边),其他的三角形也是按照各自的特点进行判断。我就是先判断是否符合题目要求,然后判断是否属于三角形,若属于则继续判断是属于等边三角形还是等腰直角三角形还是等腰三角形还是直角三角形还是普通三角形,看是属于哪个就输出相应的输出结果。代码上使用的都是if-else语句。
第二次pta
知识点考察是 类和对象,Java程序的输入和输出,字符串以及数组基本处理;题目量适中,只有4道题目;难度对我来说偏难,第一题和第二题都是菜单类的设计,第一题是菜单计价程序1,需要建立多个类,比如menu类,record类,dish类,order类,然后设计主函数,将各种类联系起来,设计成一个菜单类的程序。第二题是菜单程序设计2,在第一题基础上难度提升了许多,增加了点菜记录以及删除记录以及错误输入菜名的返回。第三题是jmu-java-日期类的基本使用,判断一个日期是否为闰年,虽然比较复杂,但是难度不高,运用if-else循环语句便可以实现。第四题是小明推箱子,是第二次作业里面最简单的,运用数组便可解决问题。
我的代码:
import java.util.Scanner;
class Dish {
String name;
int unit_price;
Dish(String name, int unit_price) {
this.name = name;
this.unit_price = unit_price;
}
int getPrice(int portion) {
if (portion == 1) {
return unit_price;
} else if (portion == 2) {
return (int) Math.round(unit_price * 1.5);
} else if (portion == 3) {
return unit_price * 2;
} else {
return 0;
}
}
}
class Menu {
Dish[] dishs = new Dish[] {
new Dish("西红柿炒蛋", 15),
new Dish("清炒土豆丝", 12),
new Dish("麻婆豆腐", 12),
new Dish("油淋生菜", 9)
};
Dish searchDish(String dishName) {
for (Dish dish : dishs) {
if (dishName.equals(dish.name)) {
return dish;
}
}
return null;
}
}
class Record {
Dish d;
int portion;
int getPrice() {
if (portion != 1 && portion != 2 && portion != 3) {
return 0;
}
return d.getPrice(portion);
}
}
class Order {
Record[] records;
int numRecords;
Order() {
records = new Record[100];
}
Menu menu=new Menu();
Record addARecord(String dishName, int portion) {
Record record = new Record();
Dish dish = menu.searchDish(dishName);
if (dish == null) {
System.out.println(dishName + " does not exist");
return null;
} else {
record.d = dish;
record.portion = portion;
records[numRecords++] = record;
return record;
}
}
int getTotalPrice() {
int totalPrice = 0;
for (int i = 0; i < numRecords; i++) {
totalPrice += records[i].getPrice();
}
return totalPrice;
}
}
public class Main {
static Menu menu = new Menu();
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Order order = new Order();
String dishName;
int portion;
while (true) {
dishName = input.next();
if (dishName.equals("end")) {
break;
}
portion = input.nextInt();
Record record = order.addARecord(dishName, portion);
if (record != null && record.getPrice() == 0) {
System.out.println(dishName + " portion " + portion + " does not exist");
}
}
System.out.println(order.getTotalPrice());
}
}
这道题目要求我们设计一个点菜计价程序,根据输入的订单,计算并输出总价格。我们需要设计四个类:Dish类、Menu类、Record类和Order类。
第三次pta
习题量中上,知识点考察是类和对象,Java程序的输入和输出,字符串以及数组基本处理。第一题是菜单计价程序3,难度比第二次作业集上还提升了不少,在菜单计价程序2上还需要增加table类,代码工作量加大,叫人难以下手。第二次题目是有重复的数据,也需要建立类包和主函数,以及运用boolean型的变量,第三题是去掉重复的数据,也是需要建立boolean型的变量,以及运用if语句和for循环来解决题目,第四题是 单词统计与排序,运用if语句将单词排列好,较简单。第四题是面向对象编程(封装性),也是考察类和对象知识点。第五题是GPS测绘中度分秒转换,考察类型转换的知识点,代码较简单。第六题是判断两个日期的先后,计算间隔天数、周数,需要建立long类型以及运用if语句解决问题。
我的代码:
import java.util.Scanner;
class Dish {
// 菜品
String name; // 菜品名称
int unit_price; // 单价
int getPrice(int portion) {// 计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
switch (portion) {
case 1:
return Math.round(unit_price);
case 2:
return Math.round(unit_price * 1.5f);
case 3:
return Math.round(unit_price * 2f);
default:
return 0;
}
}
}
class Menu {
// 菜谱
// this.dishs = new Dish[0];
Dish[] dishs;// 菜品数组,保存所有菜品信息
public Menu() { // 构造函数初始化空数组
this.dishs = new Dish[0];
}
Dish searchDish(String dishName) {// 根据菜名在菜谱中查找菜品信息,返回Dish对象。
for (int i = dishs.length - 1; i >= 0; i--) {
if (dishs[i].name.equals(dishName)) {
return dishs[i];
}
}
return null;
}
Dish addDish(String dishName, int unit_price) {// 添加一道菜品信息
Dish dish = new Dish();
dish.name = dishName;
dish.unit_price = unit_price;
Dish[] newDishs = new Dish[dishs.length + 1];
System.arraycopy(dishs, 0, newDishs, 0, dishs.length);
newDishs[dishs.length] = dish;
dishs = newDishs;
return dish;
}
}
class Record {
// 点菜记录
int orderNum;// 序号
Dish d;// 菜品
int portion;// 份额(1/2/3代表小/中/大份)
int num;// 数量
int getPrice() {// 计价,计算本条记录的价格
return d.getPrice(portion) * num;
}
}
class Order {
// 订单
Record[] records = new Record[0];// 保存订单上每一道的记录
int getTotalPrice() {// 计算订单的总价
int total = 0;
for (Record r : records) {
total += r.getPrice();
}
return total;
}
Record addARecord(int orderNum, String dishName, int portion, int num) {// 添加一条菜品信息到订单中。
Record record = new Record();
record.orderNum = orderNum;
Menu menu = Main.menu;
Dish dish = menu.searchDish(dishName);
if (dish == null) {// 不能识别的菜名
System.out.println(dishName + " does not exist");
return null;
}
record.d = dish;
record.portion = portion;
record.num = num;
Record[] newRecords = new Record[records.length + 1];
System.arraycopy(records, 0, newRecords, 0, records.length);
newRecords[records.length] = record;
records = newRecords;
return record;
}
void delARecordByOrderNum(int orderNum) {// 根据序号删除一条记录
Record[] newRecords = new Record[records.length];
int i = 0;
for (Record r : records) {
if (r.orderNum != orderNum) {
newRecords[i++] = r;
}
}
if (i == records.length) {// 没有这个序号
System.out.println("delete error");
} else {
records = newRecords;
}
}
Record findRecordByNum(int orderNum) {// 根据序号查找一条记录
for (Record r : records) {
if (r.orderNum == orderNum) {
return r;
}
}
return null;
}
}
public class Main {
static Scanner sc = new Scanner(System.in);
static Menu menu = new Menu();
static Order order = new Order();
public static void main(String[] args) {
String input;
while (true) {
input = sc.nextLine();
if (input.equals("end")) {
break;
}
String[] parts = input.split(" ");
if (parts.length == 2&&parts[0].length()!=1) {// 菜单
String dishName = parts[0];
int unit_price = Integer.parseInt(parts[1]);
menu.addDish(dishName, unit_price);
} else {// 订单
int orderNum = Integer.parseInt(parts[0]);
if (parts[1].equals("delete")) {// 删除记录
order.delARecordByOrderNum(orderNum);
} else {// 点菜记录
String dishName = parts[1];
int portion = Integer.parseInt(parts[2]);
int num = Integer.parseInt(parts[3]);
order.addARecord(orderNum, dishName, portion, num);
}
}
}
for (Record r : order.records) {
System.out.print(r.orderNum + " " + r.d.name + " ");
if (r.d == null) {
continue;
}
System.out.println(r.getPrice());
}
System.out.println(order.getTotalPrice());
}
}
第三次pta
习题量中上,知识点考察是类和对象,Java程序的输入和输出,字符串以及数组基本处理。第一题是菜单计价程序3,难度比第二次作业集上还提升了不少,在菜单计价程序2上还需要增加table类,代码工作量加大,叫人难以下手。第二次题目是有重复的数据,也需要建立类包和主函数,以及运用boolean型的变量,第三题是去掉重复的数据,也是需要建立boolean型的变量,以及运用if语句和for循环来解决题目,第四题是 单词统计与排序,运用if语句将单词排列好,较简单。第四题是面向对象编程(封装性),也是考察类和对象知识点。第五题是GPS测绘中度分秒转换,考察类型转换的知识点,代码较简单。第六题是判断两个日期的先后,计算间隔天数、周数,需要建立long类型以及运用if语句解决问题。
此题是菜单类,包含菜品类,菜谱类,点菜记录类和订单类,菜品类主要是对应菜谱上一道菜的信息。菜谱类主要是对应菜谱,包含饭店提供的所有菜的信息。点菜记录类主要是保存订单上的一道菜品记录。订单类主要是保存用户点的所有菜的信息。一开始看到这个题目的时候,我是被吓了一跳的,因为这道题的文字量特别的大,而且在上次的pta上有加了许多别的功能,比如说删除和时间,还有特色菜,有这与普通菜不同的计算价格的方式和打折的方式。在得分上,得分点又被细化,导致不好拿到高分。
踩坑心得:
1,价格的算法出错,注意特色菜的价格算法以及打折的时间。
2,同一桌菜名、份额相同的点菜记录要合并成一条进行计算,否则可能会出现四舍五入的误差。
3,超出范围的返回值错误,导致返回date。
4,方法后没有带上(),导致报错,所以方法类函数后都要加上()。
5,大小写注意,java语言对输入的语言的精确度和精准度要去很高,很多时候报错是因为方法首字母没有大写。
6,“{}”没有对应上,很多时候只记得打“{”,不记得在后面打“}”。
主要困难
1,java语言不熟练,很多语言功能不会使用。
2,Java对代码语言的精准度和准确度要求十分的高,不能随意修改大小写,很多时候也在这犯错误。
3,对类的概念没有充分的掌握,很多时候不了解在类下面应该包含什么功能,用什么方法。面对题目,不知道如何分类,没有头绪。
4,对继承的方法使用不熟练,对传参的方法也不太熟练,会用但是容易出错。
四,改进建议:
1,pta部分题目运行时间超时,要优化代码的算法,很多时候不是你的方法不行,而是有优化的地方没有优化,导致程序运行的时间加长导致超时,现在争取把每个小步骤都优化,以后的大作业程序才能不断的节省时间。
2,pta部分题目非零返回,自己的代码有问题才会导致的,要检查自己的程序逻辑。
3,对继承的方法使用不熟练,对传参的方法也不太熟练,会用但是容易出错,要多使用,防止以后出错。
4,对类的设计要更细节和具体,每个类包含的属性和方法,以及不同类之间的关系。
五,总结:
这三次的作业总体来说对于刚学Java的人难度较大,题目量虽然也不多,但是有些题目还是需要静下心来思考才能做好。通过这数次的PTA作业,我也基本能够掌握java语言中类的作用。这段时间的作业,也让我发现了自己最大的问题,那就是思维比较固化,写的很多程序的思路大多都是按部就班的那种,所以我的思维能力还是很需要培养的。这几次的作业,也基本帮助我们搭建了一个最基本的java语言的框架,让我学会了java的基本语法和类的分类,掌握了面向对象的语言的基本思路,学会了部分菜单的设计,学会了类的调用和部分函数,学会了传参和继承。虽然我还有很多不足和错误,java的语法不够熟练,对类的概念没有充分的掌握,传参也容易出错。希望老师可以更多的讲一下部分有用的java方法,毕竟自己查资料学习的不够系统,通过老师的讲解可以更加深入,系统的学习。
标签:return,Record,blog1,int,portion,Dish,输入 From: https://www.cnblogs.com/wky1216/p/17426326.html