(1)前言:近一个月来做的三次PTA大作业,第一次题量为九道题,难度较小,但只写出来七道题,剩余两道写出部分,第一次所考察的知识点是一些基础知识,了解Java的输入输出,一些基础的运算符与或非,一些简单的循环控制语句,ifelse ,for等,学习过c语言可以发现一些基础的语法都是差不多的,初学Java最深刻的印象就是Java的输入输出语句比较特殊,还要在头文件位置写一条import语句,Java在新建的时候第一句话里要与自己所新建的类名一致。第二次做的是8个题目,从这里开始就不会了,这里开始就需要类的定义还有一些方法,主要的有学生成绩类,菜单计价程序和日期类的运用,第三次作业是四道大题,更加不会了,第二道课程成绩统计程序啥也不会写。
(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)
//添加一条菜品信息到订单中。
}
以上是菜单计价程序的类的定义,首先定义一个数组保存四个菜品的信息,输入菜品名称当接收end时结束,再接收份额表示大中小分别对应不同的价格,通过switch语句计算每输入一次菜品的名字及份额计算价格,最后计算总的价格并输出。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String []menu =new String[]{"西红柿炒蛋","清炒土豆丝","麻婆豆腐","油淋生菜"};
String dish;
int portion;
int totalPrice = 0;
double price = 0;
int judge = 0;
while(true){
dish = input.next();
if(dish.equals("end")){
break;
}
portion = input.nextInt();
if(portion==1) price = 1;
if(portion==2) price = 1.5;
if(portion==3) price = 2;
if(dish.equals(menu[0])){
judge = 0;
}else if(dish.equals(menu[1])){
judge = 1;
}else if(dish.equals(menu[2])){
judge = 2;
}else if(dish.equals(menu[3])){
judge = 3;
}else{
System.out.println(dish+" does not exist");
continue;
}
switch(judge){
case 0:
totalPrice += Math.round(15 * price);
break;
case 1:
totalPrice += Math.round(12 * price);
break;
case 2:
totalPrice += Math.round(12 * price);
break;
case 3:
totalPrice += Math.round(9 * price);
break;
default:
System.out.println(input+" does not exist");
break;
}
}
System.out.println(totalPrice);
}
}
第二个分析的是日期类题目,要求是输入两个日期判断两个日期的先后并判断两个日期之间相隔多少天多少月多少周,计算日期类可以用Java中一些自带的方法,以下用的是getTime(),通过计算从1970-1-1起到现在的毫秒数来判断日期的先后,通过split可以将日期中的-符号分离从而得到年月日三个数据,throws ParseException,SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");通过这两个可以将输入的日期转为Date类型,这样便于后续的用Java的方法。
import java.util.Scanner;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws ParseException {
Scanner sc = new Scanner(System.in);
String date1 = sc.next();
String date2 = sc.next();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date d1=sdf.parse(date1);
Date d2=sdf.parse(date2);
long daysBetween=(d2.getTime()/(60*60*24*1000)-d1.getTime()/(60*60*24*1000));
//System.out.println(daysBetween);
Integer i = date1.compareTo(date2);
long between = Math.abs(daysBetween);
if(i<0)
{
long between1 = between;
int week1 = (int)between1/7;
System.out.println("第一个日期比第二个日期更早");
System.out.println("两个日期间隔"+between1+"天");
System.out.println("两个日期间隔"+week1+"周");
}
if(i>0)
{
//int between3 = ChronoUnit.DAYS.between(date1,date2);
long between2 = between;
int week2 = (int)(between2/7);
System.out.println("第一个日期比第二个日期更晚");
System.out.println("两个日期间隔"+between2+"天");
System.out.println("两个日期间隔"+week2+"周");
}
}
}
(3)踩坑心得:数据类型要匹配,占字节数少的可以转为字节数多的数据类型,占字节数多的数据类型转为少字节数据类型需要强制类型转换在前面加上()括号里写需要转换的数据类型,在最终结果时,注意不同类型的数据类型对结果的精度不同,也会导致结果的判断失误。在日期类转换时注意大小写格式应该为yyyy-MM-dd,当时写成了yyyy-mm-dd,代码没有问题可以运行,但最终结果计算时间毫秒数时会忽略月份所占的毫秒数,可能因为时间类型有时精确到分秒的格式yyyy-MM-dd hh-mm-ss,所以区分大小写。
(4)主要困难和改进建议:综合性题目还是不会,代码量多没有思路,无从下手,建议得多练吧从小开始一点点练起。
(5)总结:通过这三次作业学到了Java一些基础语法知识,了解了Java的输入输出一些基本的运算符,一些循环等,Java中的类包括了属性和方法,在大的题目中需要用的类,需要经常调用所写的类的属性和方法,同时还要更多了解Java中一些自带的方法可以简化我们工作。
标签:总结,题目,int,System,PTA,日期,println,Java,out From: https://www.cnblogs.com/GuazhuEastRoad/p/17743663.html