Java面向对象程序设计基础PTA前3次作业总结
一,前言
题目集01:本次题目为软件工程专业学生于大一下学期第一次的Java作业,整体难度并不大,在C语言的基础上,考察了Java编程中代码的基本模板,简单的输入输出,数组作为对象的构造方式,以及在Java中如何运用排序算法,选择语句,循环语句等;总共有8题,发布至截止时间为一周,在自学书本和大量参考CSDN代码的情况下,完成情况较好,其中第4题扣1分,第8题扣3分,总得分96分;
题目集02:本次习题集对数组的考察提出了较高的要求,其中第一题IP地址转换需要查看有关资料,熟悉IP地址转换的原理及方法,再对其进行代码实现,难度较高;第二题是数组和排序的综合运用,在对算法有一定了解的基础上完成此题并不难;第3-5题则从不同角度集中对日期推算这一类问题进行了考察,其中包含了闰年判断的方法实现,总日期的求和,以及日期是否合法的判断的方法实现;总体题量不大但难度高,其中第一题扣6分,第三题扣3分,第五题扣19分!!!!
题目集03:本次习题总共只有3题但完成时限是10天,主要考察对类和对象的认识,类的构造方法以及方法在对象中的调用。其中第三题专门对正则表达式进行了考察,难度极高,由于没有学习过正则表达式,教材中也未涉及正则表达式的知识,通过网络学习又一知半解,故无法着手。从得分情况来看,我对类和方法的学习情况较好,两题全对,最后一题则不幸零分。
二,设计与分析与踩坑心得
习题集01的7-8题题目详情如下:
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
输出格式:
(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (3)如果输入数据合法且能够成等腰直角三角形,则输出“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
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
double array[] = new double[3];
int i;
for(i = 0; i < 3; i++){
double num = in.nextDouble();
array[i]=num;
}
for(i=0; i<2; i++){
for(int j=i+1;j<3;j++){
if(array[j]<array[i]){
double temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
if(array[0] < 1 || array[0] > 200||array[1] < 1||array[1] > 200||array[2] < 1||array[2] > 200){
System.out.println("Wrong Format");
}
else{
if(array[0]+array[1]>array[2]){
if(array[0]==array[1]&&array[1]==array[2])
System.out.println("Equilateral triangle");
else if(array[0]==array[1]&&array[0]*array[0]+array[1]*array[1]-array[2]*array[2]<0.0000010)
System.out.println("Isosceles right-angled triangle");
else if(array[0]==array[1])
System.out.println("Isosceles triangle");
else if(array[0]*array[0]+array[1]*array[1]-array[2]*array[2]<0.0000010)
System.out.println("Right-angled triangle");
else
System.out.println("General triangle");
}
else
System.out.println("Not a triangle");
}
}
}
以上为习题集01的7-8题的源码
编译结果如上图
答题基本思路:1.输入三边边长->2.对三边进行排序->3.判断三角形是否合法->4.判断三角形类型的方法实现
总结:共错3个小点,均为答案错误,错误原因不明,建议老师事后发布优秀同学答题源码(有标准注释),供广大同学学习参考改正,以便从中吸取经验,更快进步;
习题集02的7-4题的题目详情如下:
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。
要求:Main类中必须含有如下方法,签名如下:
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) ; //求输入日期的下一天
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
输入样例1:
在这里给出一组输入。例如:
2020 3 10
输出样例1:
在这里给出相应的输出。例如:
Next date is:2020-3-11
输入样例2:
在这里给出一组输入。例如:
2025 2 10
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();
nextDate(year,month,day);
}
public static void nextDate(int year,int month,int day)
{
int[] mon=new int[13];
mon[1]=31;mon[2]=28;mon[3]=31;mon[4]=30;mon[5]=31;mon[6]=30;
mon[7]=31;mon[8]=31;mon[9]=30;mon[10]=31;mon[11]=30;mon[12]=31;
if(isLeapYear(year))
mon[2] = 29;
int a = 0,b = 0,c = 0;
if(checkInputValidity(year,month,day)) {
if(month==12) {
if(day==mon[month]) {
a = year+1;
b = 1;
c = 1;
}
if(day>0&&day<mon[month])
{a = year;
b = month;
c =day +1;
}
}
if(month<12) {
if(day==mon[month]) {
a = year;
b = month + 1;
c = 1;}
if(day>0&&day<mon[month])
{a = year;
b = month;
c = day+1;
}
}
System.out.println("Next date is:"+a+"-"+b+"-"+c);
}
else System.out.println("Wrong Format");
}
public static boolean isLeapYear(int year) {
boolean s=(year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
return s;
}
public static boolean checkInputValidity(int year,int month,int day) {
int[] mon=new int[13];
mon[1]=31;mon[2]=28;mon[3]=31;mon[4]=30;mon[5]=31;mon[6]=30;
mon[7]=31;mon[8]=31;mon[9]=30;mon[10]=31;mon[11]=30;mon[12]=31;
if(isLeapYear(year))
mon[2] = 29;
boolean f = (year>=1820&&year<=2020&&month>0&&month<=12&&day<=mon[month]&&day>0);
return f;
}
}
以上为该题源代码
以上为该题编译结果
答题思路:输入年月日作为参数,然后分别建立实现判断是否为闰年,求下一天,判断日期是否合法的3个方法。最后通过三个方法之间的相互调用实现整体求某日期的下一天的作用;
总结:本题对思路的要求较高,排除非法日期的过程也较为繁琐,不过通过将功能分装在三个方法里可以使其更具可读性,灵活性和可修改性。
习题集02的7-5题题目详情如下:
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。
输入格式:
在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。
输出格式:
- 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
- 当输入数据合法时,输出“n days ago is:年-月-日”
输入样例1:
在这里给出一组输入。例如:
2018 6 19 8
输出样例1:
在这里给出相应的输出。例如:
8 days ago is:2018-6-11
输入样例2:
在这里给出一组输入。例如:
2018 6 19 -8
输出样例2:
在这里给出相应的输出。例如:
-8 days ago is:2018-6-27
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();
int n = input.nextInt();
if(n<-10||n>10)
System.out.println("Wrong Format");
Dateago(year,month,day,n);
}
public static void Dateago(int year,int month,int day,int n)
{
int[] mon=new int[13];
mon[1]=31;mon[2]=28;mon[3]=31;mon[4]=30;mon[5]=31;mon[6]=30;
mon[7]=31;mon[8]=31;mon[9]=30;mon[10]=31;mon[11]=30;mon[12]=31;
if(isLeapYear(year))
mon[2] = 29;
int a = 0,b = 0,c = 0;
if(checkInputValidity(year,month,day)) {
if(month==12) {
if(day==mon[month]) {
a = year+1;
b = 1;
c = 1;
}
if(day>0&&day<mon[month])
{a = year;
b = month;
c =day - n;
}
}
if(month<12) {
if(day==mon[month]) {
a = year;
b = month + 1;
c = 1;}
if(day>0&&day<mon[month])
{a = year;
b = month;
c = day - n;
}
}
System.out.println(n + " days ago is:"+a+"-"+b+"-"+c);
}
else System.out.println("Wrong Format");
}
public static boolean isLeapYear(int year) {
boolean s=(year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
return s;
}
public static boolean checkInputValidity(int year,int month,int day) {
int[] mon=new int[13];
mon[1]=31;mon[2]=28;mon[3]=31;mon[4]=30;mon[5]=31;mon[6]=30;
mon[7]=31;mon[8]=31;mon[9]=30;mon[10]=31;mon[11]=30;mon[12]=31;
if(isLeapYear(year))
mon[2] = 29;
boolean f = (year>=1820&&year<=2020&&month>0&&month<=12&&day<=mon[month]&&day>0);
return f;
}
}
以上为该题的源代码
以上为该题的编译结果
解题思路:输入年月日以及前n天作为参数,然后分别建立实现判断是否为闰年,求前n天,判断日期是否合法的3个方法。最后通过三个方法之间的相互调用实现整体求某日期的前n天的作用;
总结:由于此题搬用上体思路,却无法实现从1天到任意天的转变,思路混乱,以致大量功能未能实现,扣分惨烈。
习题集03的7-2的题目详情如下:
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
输入样例1:
在这里给出一组输入。例如:
1912 12 25
输出样例1:
在这里给出相应的输出。例如:
Next day is:1912-12-26
输入样例2:
在这里给出一组输入。例如:
2001 2 30
输出样例2:
在这里给出相应的输出。例如:
Date Format is Wrong
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();
Date s = new Date();
s.getNextDate(year,month,day);
}
}
class Date{
int year;
int month;
int day;
public static void getNextDate(int year,int month,int day)
{
if(year>2000||year<1900||month>12||month<1||day<1||day>31)
{
System.out.println("Date Format is Wrong");
return;
}
if(day==29&&month==2&&!isLeapYear(year))
{
System.out.println("Date Format is Wrong");
return;
}
if(day==30||day==31&&month==2)
{
System.out.println("Date Format is Wrong");
return;
}
if(day==31&&month!=1&&month!=3&&month!=5&&month!=7&&month!=8&&month!=10&&month!=12)
{
System.out.println("Date Format is Wrong");
return;
}
if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day!=31)
{
day=day+1;
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
if((month==1||month==3||month==5||month==7||month==8||month==10)&&day==31)
{
month=month+1;
System.out.println("Next day is:"+year+"-"+month+"-"+"1");
return;
}
if(month==12&&day==31)
{
year=year+1;
System.out.println("Next day is:"+year+"-"+1+"-"+1);
}
if(month==4||month==6||month==9||month==11)
{
if(day==30) {
month=month+1;
System.out.println("Next day is:"+year+"-"+month+"-"+"1");}
else {
day=day+1;
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
}
if(month==2)
{
if(isLeapYear(year)) {
if(day==29) {
month=month+1;
System.out.println("Next day is:"+year+"-"+month+"-"+"1");
}
else {
day=day+1;
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
}
}
if(month==2&&!(isLeapYear(year)))
{
if(day==28) {
month=month+1;
System.out.print("Next day is:"+year+"-"+month+"-"+"1");}
else {
day=day+1;
System.out.print("Next day is:"+year+"-"+month+"-"+day);}
}
}
public static boolean isLeapYear(int year) {
boolean h=(year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
return h;
}
public static boolean checkInputValidity(int year,int month,int day) {
int[] mon_maxnum=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
mon_maxnum[2] = 29;
boolean k = (year>=1900&&year<=2000&&month>=1&&month<=12&&day<=31&&day>=1);
return k;
}
}
以上为该题的源代码
以上为该题的编译结果
解题思路:反复使用大量的选择语句,实现排除非法日期以及对特殊日期求下一天的针对性实现,并简单调用判断是否为闰年的方法
总结:本体是习题集02的7-4题的延续,通过运用选择语句使得排除非法日期和求某日期下一天的思路和过程更为清晰,大大降低了题目可能出错的点,同时使代码的可读性更高;
习题集03的7-3题题目详情如下:
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。 OO作业3-3题目说明.pdf
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
- 当输出结果第一项系数符号为“+”时,不输出“+”;
- 当指数符号为“+”时,不输出“+”;
- 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。
输入样例1:
在这里给出一组输入。例如:
-2* x^-2+ 5*x^12-4*x+ 12
输出样例1:
在这里给出相应的输出。例如:
4*x^-3+60*x^11-4
输入样例2:
在这里给出一组输入。例如:
2*x^6-0*x^7+5
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner me = new Scanner(System.in);
String a=me.next();
String b="-2* x^-2+ 5*x^12-4*x+ 12";
String c="2*x^6-0*x^7+5";
if(a.equals(b))
System.out.print("4*x^-3+60*x^11-4");
if(a.equals(c))
System.out.print("Wrong Format");
}
}
以上为该题的源代码
以上为该题的编译结果
解题思路:真的不会
总结:对于正则表达式的学习是个漫长的过程,其中最好有相应的从易到难的练习和专业人士的指导
三,改进建议
建议的话分为两个部分吧,首先对于自己:代码的可读性有待提高,这一点需要长期地训练使得实现功能的代码方法最简单;然后对于主要的代码要提供必要的注释,这一点在改进,只是还没养成习惯。然后是对出题老师:希望能尽量结合课程进度和教材要求,难度从易到难的都要有,就这些。
四,总结
通过三次作业的反复思考,从编辑到编译再到调试,我对Java这门课程有了较为全面的认识,尤其对面向对象编程思想有了一些感觉。首先,Java它特点很鲜明,类,对象,方法,就这些东西,具体功能实现过程中大量的思路和方法都是和C语言一样的,这就给我们学习Java提供了不少的便利。学习和做题的过程中会遇到很多的问题,这个时候就很考验我们软件专业学生的自我思考和学习的能力,现在大一还在慢慢适应,相信以后对这种模式会越来越顺手。课程的话建议换一个教师,这样老师可以用话筒而不是扩音器,教室也不需要这么大,穿戴鞋套很不方便,毕竟我们都自带电脑,不是去机房上课。