JAVA前三次PTA作业总结
⼀、关于java&⾯向对象
这学期是我第⼀次接触Java,这门课的学习对我⽽⾔极具挑战性,因为⾃⼰的C语⾔学的很⼀般,所以学习Java之前还有着相对来说畏惧的情绪,但是这个阶段的学习,我并没有感觉到特别吃⼒反⽽感觉⾃⼰学的还可以,并且有很⾼的兴趣,可能是它相较于C语⾔来说有些地⽅相对⽅便,并且编辑软件IDEA极其好⽤,这门课是⾯向对象的程序设计思想,相对之前的学习有很⼤的不同之处。
此阶段是我的Java⼊门学习,以下均为个⼈感受,共分为作业概况,设计与分析,踩坑⼼得,改进建议以及作业总结,也是对⾃⼰这个阶段的学习做⼀个⼩总结。
⼆、前⾔
第⼀次作业
第⼀次作业的题⽬分别是:
7-1 计算两个数的和
7-2 电话键盘字母数字转换
7-3 成绩分级管理
7-4 计算税率
7-5 计算钱币
7-6 使⽤⼀维数组求平均值
7-7 对多个整数进⾏排序
7-8 判断三⾓形类型
运⽤知识点:
应⽤Scanner类完成输⼊,import java.util.Scanner。
在PTA中包含main函数的核⼼类都是Main,例如public class Main。
main函数的声明格式为public static void main(String[] args)。
应该⽤System.out.println()和System.out.print()完成输出。
运⽤nextInt()等等通过键盘输⼊变量。
charAt()获取字符位置。
数组的运⽤。
例如⽤import java.util.Arrays和Arrays.sort(a)使⽤内置排序函数。
⼤部分命令语句和C没有太⼤区别。
题⽬难度:
这个是我我的Java第⼀次作业,尽管是最基本的基本语法内容,但是处理起来仍然花费了不少的时间去应对,包括对软件的调试以及⼀些基本操作语句的了解。
总⽽⾔之,前⼏题了解基本输⼊输出最后后⾯写题过程还是相对流畅许多的。
第⼆次作业
第⼆次作业的题⽬分别是:
7-1 IP地址转换
7-2 合并两个有序数组为新的有序数组
7-3 判断闰年及星期⼏
7-4 求下⼀天
7-5 求前N天
运⽤知识点:
除了基础知识点之外,对象的建⽴和⽅法的调⽤。
利⽤boolean进⾏判断。
⽤数组存储⽉份天数。
题⽬难度:
难度不⾼,但是if语句确实不能写太多,不然改起来头昏眼花,使⽤数组处理问题很好⽤。
第三次作业
第三次作业的题⽬分别是:
7-1 创建账户类Account
7-2 定义⽇期类
7-3 ⼀元多项式求导(类设计)
运⽤知识点:
对象的创建。
对象属性与⽅法的调⽤。
涉及到了类的封装性,多个类的写法。
运⽤正则表达式。
字符串截取的表达⽅式。
题⽬难度:
7-1 初次处理有点不知所措,但是稍微了解之后处理起来较为轻松;7-2 和第⼆次作业类似,创建类对象属性⽅法调⽤等处理起来也⼗分轻松;7-3 是真的坐牢,就感觉难度跨度还是⽐较⼤的,正则表达式学习了很久以及import Matcher 和 import Pattern 的使⽤现在也没搞的太明⽩,判断到后⾯⾃⼰都感觉有点乱的不知所措,是⾮常有挑战性的题,但是最后⼀个测试点还存在bug,对指数为1的x的单项式求导后的正数结果前⾯本来应该输出+号与其它单项式连接,但测试例⼦却没这个问题。
三、作业分析(包括设计分析,踩坑⼼得和改进建议)
第⼀次题⽬集:7-8:
1、设计与分析
(1)设计:
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
double Double();
double Double();
double Double();
if(a>=1&&a<=200&&b>=1&&b<=200&&c>=1&&c<=200){
if((a+b)>c&&(a+c)>b&&(b+c)>a&&(a-b)<c&&(a-c)<b&&(b-c)<a&&(b-a)<c&&(c-a)<b&&(c-b)<a){
if(a==b&&b==c){System.out.print("Equilateral triangle");}
if(a==b&&a!=c){
if(a*a+b*b-c*c<0.1) //不要⽤a*a+b*b==c*c
System.out.print("Isosceles right-angled triangle");
else
System.out.print("Isosceles triangle");
}
if(a==c&&a!=b){
if(a*a+c*c-b*b<0.1)
System.out.print("Isosceles right-angled triangle");
else
System.out.print("Isosceles triangle");
}
if(b==c&&b!=a){
if(b*b+c*c-a*a<0.1)
System.out.print("Isosceles right-angled triangle");
else
System.out.print("Isosceles triangle");
}
else if(a!=b&&b!=c&&a!=c){
if(a*a+b*b==c*c || a*a+c*c==b*b || c*c+b*b==a*a){System.out.print("Right-angled triangle"); }
else
System.out.print("General triangle");
}
}
else
System.out.print("Not a triangle");
}
else
System.out.print("Wrong Format");
}
}
我⾸先判断了三⾓形的合法性,如何根据边的关系去进⼀步判断三⾓形的类型。
(2)分析:
这道题要求根据输⼊的三⾓形的三条边判断所能构成的三⾓形的类型,如果输⼊数据⾮法,则输出“Wrong Format”;如果输⼊数据合法,但三条边不能构成三⾓形,则输出“Not a
triangle”;如果输⼊数据合法且能够成等边三⾓形,则输出“Equilateral triangle”;如果输⼊数据合法且能够成等腰直⾓三⾓形,则输出“Isosceles right-angled triangle”;如果输⼊数据合法且能够成等腰三
⾓形,则输出“Isosceles triangle”;如果输⼊数据合法且能够成直⾓三⾓形,则输出“Right-angled triangle”;如果输⼊数据合法且能够成⼀般三⾓形,则输出“General triangle”。
因此我只⽤判断是否合法进⾏下⼀步的判断类型,如果⾮法直接输出“Wrong Format”。
SourceMonitor 复杂度分析
2、踩坑⼼得:if语句使⽤过多导致报错时⾃⼰判断括号匹配及其吃⼒痛苦;然后是 double的精度问题,由于Java中的⼩数计算不是那么准确,会出现精度丢失的问题,导致⼀开始在判断直⾓三⾓形
的时候采⽤相减得0得⽅法并不可⽤,⽆法过测试点,不要⽤a*a+b*b==c*c去判断直⾓三⾓形,应当⽤a*a+b*b-c*c<0.1去进⾏判断。
3、改进建议:因为这次代码写的时间较早,因此⼤量使⽤了if else语句判断,没有将判断内容⽅法化所以如 SourceMonitor所⽰的这样圈复杂度较⾼。并且三⾓形的类型合法性可以把三条边放
到⼀个数组⾥通过⼀个排序函数去判断。
第⼆次题⽬集:7-4:
1、设计与分析
(1)设计:
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int year= Int();
int month= Int();
int day= Int();
if(checkInputValidity( year, month, day)==false)
System.out.print("Wrong Format");
else
nextDate ( year, month, day);
}
public static boolean isLeapYear(int year) {//判断year是否为闰年,返回boolean类型
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
return true;
}
else{
return false;
}
}
//判断输⼊⽇期是否合法,返回布尔值
public static boolean checkInputValidity(int year,int month,int day){
if(year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31) {
if(isLeapYear(year)==false&&month==2&&day>28) {
return false;
}
if(month==4||month==6||month==9||month==11) {
if(day==31)
return false;
}
if(isLeapYear(year)==true) {
if(month==2&&day>29)
{
return false;
}
}
else if(isLeapYear(year)==false) {
if(month==2&&day>28)
return false;
}
return true;
}
else
return false;
}
public static void nextDate (int year,int month,int day) {//求输⼊⽇期的下⼀天
if(month==1||month==3||month==5||month==7||month==8||month==10) {
if(day==31) {
System.out.println("Next date is:"+year+"-"+(month+1)+"-"+1);
}
else
System.out.println("Next date is:"+year+"-"+month+"-"+(day+1));
}
else if(month==12) {
if(day==31) {
System.out.println("Next date is:"+(year+1)+"-"+1+"-"+1);
}
else
System.out.println("Next date is:"+year+"-"+month+"-"+(day+1));
}
if(isLeapYear(year)==false) {
if(month==2) {
if(day==28) {
System.out.println("Next date is:"+year+"-"+(month+1)+"-"+1);
}
else
System.out.println("Next date is:"+year+"-"+month+"-"+(day+1));
}
}
else if(isLeapYear(year)==true) {
if(month==2) {
if(day==29) {
System.out.println("Next date is:"+year+"-"+(month+1)+"-"+1);
}
else
System.out.println("Next date is:"+year+"-"+month+"-"+(day+1));
}
}
if(month==4||month==6||month==9||month==11) {
if(day==30) {
System.out.println("Next date is:"+year+"-"+(month+1)+"-"+1);
}
else
System.out.println("Next date is:"+year+"-"+month+"-"+(day+1));
}
}
}
该作业的要求输⼊年⽉⽇的值(均为整型数),输出该⽇期的下⼀天;⾸先设计⾮法输⼊,令boolean checkInputValidity = true;如果输⼊范围不在题⽬要求的范围内,在此注意闰年1⽉,2⽉,7 ⽉,8⽉和每⽉的边界情况以及闰年的最后⼀天,返回false,则输出("Wrong Format")
(2)分析:
三个⽅法依次判断了⽇期的合法性,闰年以及⽇期的下⼀天,使⽤了多个if语句进⾏分类判断。
根据PowerDesigner的类图显⽰,该题只有⼀个类,但利⽤了三个⽅法:
public static void main(String[] args);//主⽅法
public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day);//判断输⼊⽇期是否合法,返回布尔值
public static void nextDate(int year,int month,int day) ; //求输⼊⽇期的下⼀天
SourceMonitor 复杂度分析
2、踩坑⼼得:特殊⽉份的特殊情况没有想到;多个if语句的判断及其容易产⽣错误,并且报错进⾏调试时⼗分头⼤,但是⾜够细⼼的话问题还是不⼤的。
3、改进建议:if以及else的语句完全没必要,可以写⼀个数组存放每个⽉的天数int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};再做⼀个判断去修改闰年⼆⽉份的天数
if(isLeapYear(year)==false) a[2] = 28;过程可以简便很多,我通过此题的踩坑在下⼀题对⾃⼰的代码进⾏了优化。
第⼆次题⽬集:7-5:
1、设计与分析
(1)设计:
源代码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int year= Int();
int month= Int();
int day= Int();
int n= Int();
if(checkInputValidity(year,month,day,n)==true)
{
lastDate(year,month,day,n);
}
else
System.out.print("Wrong Format");
}
public static boolean isLeapYear(int year) {//判断year是否为闰年,返回boolean类型
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
return true;
}
else{
return false;
}
}
//判断输⼊⽇期是否合法,返回布尔值
public static boolean checkInputValidity(int year,int month,int day,int n){
if(n>=-10&&n<=10) {
if(year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31) {
if(isLeapYear(year)==false&&month==2&&day>28) {
return false;
}
if(month==4||month==6||month==9||month==11) {
if(day==31)
return false;
}
if(isLeapYear(year)==true) {
if(month==2&&day>29)
{
return false;
}
}
else if(isLeapYear(year)==false) {
if(month==2&&day>28)
return false;
}
return true;
}
else
return false;
}
else
return false;
}
public static void lastDate(int year,int month,int day,int n){
int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year)==false)
a[2] = 28;
day=day-n;
if(n>0) {
while(day<=0) {
month--;
if (month==0){
year--;
month=12;
}
day=day+a[month];
}
}
else if (n<0){
while (day>a[month]) {
day=day-a[month];
month++;
if (month==13){
month=1;
year++;
}
}
}
时间正则表达式javaSystem.out.print( n + " days ago is:"+year+"-"+month+"-"+day);
}
}
这道题基本与上题⼀致,同样先合法性的判断,再判断闰年以及求前n天。
(2)分析:
根据PowerDesigner的类图显⽰,该题只有⼀个类,但利⽤了三个⽅法:
public static void main(String[] args);//主⽅法
public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day);//判断输⼊⽇期是否合法,返回布尔值
public static void lastDate(int year,int month,int day,int n) ; //求输⼊⽇期的前n天
SourceMonitor 复杂度分析
2、踩坑⼼得:吸取了上⼀题的教训,将if和else语句替换成了数组表⽰,并且利⽤了while循环进⾏了天数的加减,感触良多,数组真好⽤啊,特别清晰简洁。
3、改进建议:感觉合法性以及前n天的求解应该还有更简单⽅便的表⽰⽅法但是之前偷懒没有再去进⾏思考,以后类似的题还可以做的更简洁⼀些。
第三次题⽬集:7-2:
1、设计与分析
(1)设计:
源代码
import java.util.Scanner;
public class Main {
//主函数
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Date date = new Date();
date.day = Int();
}
//Date类
public static class Date {
private int year;
private int month;
private int day;
int[] mon_maxnum = new int[]{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public Date(int year, int month, int day) {
this.day = day;
}
public Date() {
int year, month, day;
}
public int getYear() {//getter
return year;
}
public int getMonth() {
return month;
}
public int getDay() {
return day;
}
public void setYear(int year) {//setter
}
public void setMonth(int month) {
}
public void setDay(int day) {
this.day = day;
}
public static boolean isLeapYear(int year) {//判断year是否为闰年
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return true;
else
return false;
}
public static boolean checkInputValidity(int year, int month, int day) {//判断输⼊⽇期是否合法
int[] mon_maxnum = new int[]{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (!isLeapYear(year))
mon_maxnum[2] = 28;
if (year >= 1900 && year <= 2000 && month > 0 && month <= 12 && day <= mon_maxnum[month] && day > 0)
return true;
else
return false;
}
public static void getnextDate(int year, int month, int day) { //得到下⼀天
int[] mon_maxnum = new int[]{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论