Blog作业01
目录
前言
设计与分析
踩坑心得
改进建议
总结
前言
这三次作业的知识点覆盖的很全面,从最开始的int赋值变量,循环,到Boolean值,sort等一些函数,到后来的对象,类的创建和声明,getter,setter的方法运用,正则表达式的使用,知识点涉及的比较广。题量和难度比较契合,题目难的时候,题量也会适当下调,题量也没有超过十道题,对于一个星期的期限来说还是很合理。对我来说也能及时完成,总之还是很合理。
题目集1
输入三角形三条边,判断该三角形为什么类型的三角形。
题量:8道
难度:适中
题目集2
题量:5道
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[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) ; //求输入日期的下一天
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。
难度:适中
题目集3
题量:3道
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
编写程序性,实现对简单多项式的导函数进行求解
要求:Date类结构如下图所示:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
- 当输出结果第一项系数符号为“+”时,不输出“+”;
- 当指数符号为“+”时,不输出“+”;
- 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
难度:较难
设计与分析





import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner input = new Scanner(System.in); double a = input.nextDouble(); double b = input.nextDouble(); double c = input.nextDouble(); if(a >200 || b > 200 || c >200 || a < 1 || b < 1 || c < 1) System.out.println("Wrong Format"); else{ if(a >= b + c || b >= a + c || c >= a + b) System.out.println("Not a triangle"); else if((a*a + b*b == c*c|| b*b + c*c == a*a|| a*a + c*c == b*b)&&a!=b&&b!=c&&a!=c) System.out.println("Right-angled triangle"); else if(a == b || b == c || a == c) {if(a*a + b*b - c*c<0.000001|| b*b + c*c -a*a<0.000001|| a*a + c*c- b*b<0.000001) System.out.println("Isosceles right-angled triangle"); else if(a == b && b == c)System.out.println("Equilateral triangle"); else System.out.println("Isosceles triangle"); } else System.out.println("General triangle"); } } }
import java.util.Scanner; public class Main { public static boolean isLeapYear(int 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[] arr=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year)==true) arr[2] = 29; if(year>=1820&&year<=2020&&month>0&&month<=12&&day<=arr[month]&&day>0) return true; else return false; } public static void nextDate(int year,int month,int day) { int[] arr=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year)==true) arr[2] = 29; int a = 0,b = 0,c = 0; if(checkInputValidity(year,month,day)==true) { if(month==12) { if(day==arr[month]) { a = year+1; b = 1; c = 1;} if(day>0&&day<arr[month]) {a = year; b = month; c =day +1; } } if(month<12) { if(day==arr[month]) { a = year; b = month + 1; c = 1;} if(day>0&&day<arr[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 void main(String[] args) { Scanner in = new Scanner(System.in); Main x = new Main(); int year = in.nextInt(); int month = in.nextInt(); int day = in.nextInt(); x.nextDate(year,month,day); } }
import java.util.Scanner; public class Main{ public static boolean checkInputValidity(int year,int month,int day,boolean r){ boolean p; p = true; if(year < 1820 || year > 2020 || month < 1 || month > 12 || day < 1 || day > 31 ){ p = false; } if(!r && day > 28){ p = false; } return p; } public static void nextDate(int year,int month,int day,boolean r,int n){ int i = month,x = day; day = x + n; if(!r&&i==2){ if(x + n>28){ day = x + n-28; month++; } } if(r&&i==2){ if(x + n>29){ day = x + n-29; month++; } } if(r&&i==3){ if(x + n<=0){ day =29+x+n; month--; } } if(!r&&i==3){ if(x + n<=0){ day = x + n + 28; month--; } } if(n + x <=0){ if(i == 1 ){ year--; day = 31 + (n + x); month = 12; } if(i == 2 || i == 4 || i == 6 || i == 9 || i == 8 || i == 11){ day = 31 + (n + x); month--; } if(i == 5 || i == 7 || i == 10 || i == 12 ){ year--; day = 30 + (n + x); month = 12; } } if(n + x >30){ if(i == 12){ if(n+x > 31){ day =(n+x)-31; year++; month=1; } else day = 31; } if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10){ if(n+x > 31){ day =(n+x)-31; month++; } else day = 31; } if(i == 4 || i==6 || i==9 || i==11){ day =(n+x)-30; month++; } } System.out.printf("%d days ago is:%d-%d-%d",-n,year,month,day); } 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(); boolean r = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); if(checkInputValidity(year,month,day,r)) nextDate(year,month,day,r,-n); else System.out.println("Wrong Format"); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Date date = new Date(); Scanner in = new Scanner(System.in); int year = in.nextInt(); int month = in.nextInt(); int day = in.nextInt(); date.setyear(year); date.setmonth(month); date.setday(day); date.nextDate(year,month,day); } } class Date{ private int year; private int month; private int day; private int[] arr = {0,31,28,31,30,31,30,31,31,30,31,30,31}; public int getyear() { return year; } public int getmonth() { return month; } public int getday() { return day; } public void setyear(int year) { this.year=year; } public void setmonth(int month) { this.month=month; } public void setday(int day) { this.day=day; } public static boolean isLeapYear(int 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[] arr=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year)==true) arr[2] = 29; if(year>=1900&&year<=2000&&month>0&&month<=12&&day<=arr[month]&&day>0) return true; else return false; } public static void nextDate(int year,int month,int day) { int[] arr=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year)==true) arr[2] = 29; int a = 0,b = 0,c = 0; if(checkInputValidity(year,month,day)==true) { if(month==12) { if(day==arr[month]) { a = year+1; b = 1; c = 1;} if(day>0&&day<arr[month]) {a = year; b = month; c =day +1; } } if(month<12) { if(day==arr[month]) { a = year; b = month + 1; c = 1;} if(day>0&&day<arr[month]) {a = year; b = month; c = day+1; } } System.out.println("Next day is:"+a+"-"+b+"-"+c); } else System.out.println("Date Format is Wrong"); } }
import java.util.Scanner; import java.util.regex.Pattern; public class Main{ public static void main(String[] args) { Scanner p = new Scanner(System.in); String totalRegex = "([-+]?([1-9]+[0-9]*(\\*)?)?x?(\\^[+-]?[1-9]+[0-9]*)?)+"; String sbuRegex = "[-+]?([1-9]+[0-9]*(\\*)?)?x?(\\^[+-]?[1-9]+[0-9]*)?"; String in = p.nextLine(); boolean bl=Pattern.matches(totalRegex, in); if(bl==true) { int i; int y=p.nextInt(); int x=p.nextInt(); int year = p.nextInt(); int month = p.nextInt(); int day = p.nextInt(); System.out.printf(" days ago is:%d-%d-%d",year,month,day); String a; String arr[]=new String[4]; a=p.nextLine(); if(a.length()!=32||a.length()==0) { System.out.print("Wrong Format"); return; } for(i=0;i<a.length();i++) { char s=a.charAt(i); if(s!='0'&&s!='1') { System.out.print("Wrong Format"); return; } } } else System.out.println("Wrong Format"); } }
踩坑心得
作业集1
7-8:最开始不知道如何判断直角三角形,最后用
a*a + b*b - c*c<0.000001|| b*b + c*c -a*a<0.000001|| a*a + c*c- b*b<0.000001
a*a + b*b == c*c|| b*b + c*c == a*a|| a*a + c*c == b*b)&&a!=b&&b!=c&&a!=c
判断是否为等腰或者直角三角形
作业集2
7-4
刚刚开始做的时候不知道如何把闰年作为返回值传送到主函数。后来在网上查到了Boolean值,然后使用
isLeapYear(int year)这个函数来判断是否为闰年在分情况讨论闰年2月,31天的月份,30天的月份等等情况,最后完成该题
7-5
第一次写这个题,原本最开始是没有什么别的想法的,就觉得只要多讨论几个情况就行,最后if else语句用的太多了,就把自己搞糊涂了,后来用
boolean checkInputValidity(int year,int month,int day,boolean r)这个函数,把Boolean放在函数里面,来判断是不是错误数据
下面就讨论六个情况就可以,直接就可以求出下一天是星期几
作业集3
7-2
这个题就可以直接照着那个题里面的图去做,什么时候用getter 什么时候用setter,题目里面都有涉及,再结合作业集2的7-4。
最开始我是这么做的,很想当然,连题目的那个年份限制变化了我都没看见,就导致了我连续提交了好几次都显示部分错误,看来以后还是要读好题
7-3
最开始和大家一样无从下手,但是学习了正则表达式还有参考了老师发的代码就能写出来,然后在网上差一些关于正则表达式的资料,知道了最基本的规则
改进建议
pta的作业的每一题希望可以多弄些样例,就是输出的例子,可以让做题者更好的理解题的意思,能更快的,更精准的做题
这三次作业的知识跨度比较大,如果能在题目上说明本题所用的知识点会更好
另外可以支持多种方法解决问题,不单单局限于一种方法
对齐下括号.
良好的编码格式和命名。
从语法和算法上精简代码,永远永远不要把同一个变量用于多个不同的目的。
使用自描述的变量名和方法名
方法名应该小写字母开头,其后用字母大写的单词连接(veryLongVariableName)
类名应该都使用首字母大写的单词连接而成常量名应该全部大写,
用下划线连接左大括号应该跟 if 语句在同一行
总结
第一单元作业花费时间:花费时间较短
第二单元作业花费时间:花费时间较长
最后一部分作业:花费时间较长。
通过这三次作业,我还是收获了很多知识的。
第一次作业:最基本的赋值,声明变量,for循环,while循环,
if语句,数组的声明,使及其创建。
第二次作业:学会了Boolean语句,知道了如何返回ture和false
以及如何把Boolean放在函数里使用;
判断闰年的方法,
第三次作业:学习了解了对象和类,对象,类的创建和声明,getter,setter的方法运用,正则表达式的使用
每次作业花费的时间较长,需要查阅大量的资料才能解决问题,作业的成功率不高,得到的分数不高。解决方法:遇到不懂的知识点上网查阅资料,请教他人,多看书记住一些基本的知识点。
作为Java的思维来说,
当你拿到一个问题时,你分析这个问题不再是第一步先做什么,
第二步再做什么,这是面向过程的思维,你应该分析这个问题里面有哪些类和对象,这是第一点,然后再分析这些类和对象应该具有哪些属性和方法。这是第二点。最后分析类和类之间具体有什么关系,
这是第三点。这些都是面向过程思想所不具备的,在解决一些问题的时候,运用面向对象的思想来编写程序解决问题才是最好的解决方式
作业量可以适当增多,多多给我们练习的机会,适当放慢一些课堂进度,给我们足够的时间去看书,去思考,实验课可以改成三周俩节,适当要宽恕留给我们写报告的时间。
对教师的意见:多多培养我们的动手能力,在课堂上,给我们多一些时间去写自己的代码,老师
浙公网安备 33010602011771号