(一)前言:
(总结三次题目集的知识点、题量、难度等情况)
1、知识点总结
第一次作业 7-1~7-8:
题型总结:数字运算、电话键盘模拟、成绩管理、货币计算、数组求值、数字排序、三角判断
涉及知识点:Scanner类的使用、if/else if的使用、switch语句的使用、for循环的使用、强制类型转换、求余计算、输出语句使用、条件判断
第二次作业 7-1~7-5:
题型总结:IP地址转换、数组合并、年份判断星期、年份日期计算
涉及知识点: Math类的使用、条件循环与判断、数组大小判断算法与排序算法、全局变量数组声明与使用、类的概念与调用、方法的声明与调用、闰年判断算法
第三次作业 7-1~7-3:
题型总结:创建账户类、定义日期类、一元多项式求导
涉及知识点:类的声明与使用、类中私有属性的设置与调用、无参构造、有参构造、月利率计算、方法的调用与参数返回、条件判定、求导计算、带符号函数的输入与还原、正则表达式的学习与使用
2、题量
第一次作业:适中
第二次作业:较少
第三次作业:较少
3、难度评估
第一次作业:简单
第二次作业:7-1、7-2、7-4、7-5简单,7-3一般
第三次作业:7-1、7-2简单、7-3困难
(二)算法设计与分析:
(重点对题目的提交源码进行分析,可参考SourceMonitor的生成报表内容以及PowerDesigner的相应类图,要有相应的解释和心得(做到有图有真相),本次Blog必须分析题目集1的7-8,题目集2的7-4、7-5以及题目集3的7-2、7-3)
1、算法设计思路
第一次作业:
7-2:
提交代码:
package struct; import java.util.Scanner; public class test2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str = scanner.nextLine(); if(str.equals("a")||str.equals("b")||str.equals("c")||str.equals("A")||str.equals("B")||str.equals("C")){ System.out.println("1"); }else if (str.equals("d")||str.equals("e")||str.equals("f")||str.equals("D")||str.equals("E")||str.equals("F")){ System.out.println("2"); }else if (str.equals("g")||str.equals("h")||str.equals("i")||str.equals("G")||str.equals("H")||str.equals("I")){ System.out.println("3"); }else if (str.equals("j")||str.equals("k")||str.equals("l")||str.equals("J")||str.equals("K")||str.equals("L")){ System.out.println("4"); }else if (str.equals("m")||str.equals("n")||str.equals("o")||str.equals("M")||str.equals("N")||str.equals("O")){ System.out.println("5"); }else if (str.equals("p")||str.equals("q")||str.equals("r")||str.equals("s")||str.equals("P")||str.equals("Q")||str.equals("R")||str.equals("S")){ System.out.println("6"); } } }
7-3:
提交代码:
package struct; import java.util.Scanner; public class test3 { public static void main(String[] args) { int num; Scanner scanner = new Scanner(System.in); num = scanner.nextInt(); num = num/10; switch (num){ case 10: System.out.print("A"); break; case 9: System.out.print("A"); break; case 8: System.out.print("B"); break; case 7: System.out.print("C"); break; case 6: System.out.print("D"); break; default: System.out.print("E"); } } }
7-4:
提交代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); int a = input.nextInt(); double b = input.nextDouble(); double s; if(a!=1&&a!=2&&a!=3&&a!=0||b<0) System.out.print("Wrong Format"); else if(a==0)//Single { if(b>=0&&b<=8350) { s=b*0.1; System.out.print(s); } else if(b>8350&&b<=33950) { s=8350*0.1+(b-8350)*0.15; System.out.print(s); } else if(b>33950&&b<=82250) { s=8350*0.1+(33950-8350)*0.15+(b-33950)*0.25; System.out.print(s); } else if(b>82250&&b<=171550) { s=8350*0.1+(33950-8350)*0.15+(82250-33950)*0.25+(b-82250)*0.28; System.out.print(s); } else if(b>171550&&b<=372950) { s=8350*0.1+(33950-8350)*0.15+(82250-33950)*0.25+(171550-82250)*0.28+(b-171550)*0.33; System.out.print(s); } else if(b>372950) { s=835+(33950-8350)*0.15+(82250-33950)*0.25+(171550-82250)*0.28+(372950-171550)*0.33+(b-372950)*0.35; System.out.print(s); } } else if(a==1) { if(b>=0&&b<=16700) { s=b*0.1; System.out.print(s); } else if(b>16700&&b<=67900) { s=16700*0.1+(b-16700)*0.15; System.out.print(s); } else if(b>67900&&b<=137050) { s=16700*0.1+(67900-16700)*0.15+(b-67900)*0.25; System.out.print(s); } else if(b>137050&&b<=208850) { s=16700*0.1+(67900-16700)*0.15+(137050-67900)*0.25+(b-137050)*0.28; System.out.print(s); } else if(b>208850&&b<=372950) { s=16700*0.1+(67900-16700)*0.15+(137050-67900)*0.25+(208850-137050)*0.28+(b-208850)*0.33; System.out.print(s); } else if(b>372950) { s=1670+(67900-16700)*0.15+(137050-67900)*0.25+(208850-137050)*0.28+(372950-208850)*0.33+(b-372950)*0.35; System.out.print(s); } } else if(a==2) { if(b>=0&&b<=8350) { s=b*0.1; System.out.print(s); } else if(b>8350&&b<=33950) { s=8350*0.1+(b-8350)*0.15; System.out.print(s); } else if(b>33950&&b<=68525) { s=8350*0.1+(33950-8350)*0.15+(b-33950)*0.25; System.out.print(s); } else if(b>=68525&&b<=104425) { s=8350*0.1+(33950-8350)*0.15+(68525-33950)*0.25+(b-68525)*0.28; System.out.print(s); } else if(b>104425&&b<=186475) { s=8350*0.1+(33950-8350)*0.15+(68525-33950)*0.25+(104425-68525)*0.28+(b-104425)*0.33; System.out.print(s); } else if(b>186475) { s=835+(33950-8350)*0.15+(68525-33950)*0.25+(104425-68525)*0.28+(186475-104425)*0.33+(b-186475)*0.35; System.out.print(s); } } else if(a==3) { if(b>=0&&b<=11950) { s=b*0.1; System.out.print(s); } else if(b>11950&&b<=45500) { s=11950*0.1+(b-11950)*0.15; System.out.print(s); } else if(b>45500&&b<=117450) { s=11950*0.1+(45500-11950)*0.15+(b-45500)*0.25; System.out.print(s); } else if(b>117450&&b<=190200) { s=11950*0.1+(45500-11950)*0.15+(117450-45500)*0.25+(b-117450)*0.28; System.out.print(s); } else if(b>190200&&b<=372950) { s=11950*0.1+(45500-11950)*0.15+(117450-45500)*0.25+(190200-117450)*0.28+(b-190200)*0.33; System.out.print(s); } else if(b>372950) { s=1195+(45500-11950)*0.15+(117450-45500)*0.25+(190200-117450)*0.28+(372950-190200)*0.33+(b-372950)*0.35; System.out.print(s); } } } }
7-8:
提交代码:
package struct; import java.util.Scanner; public class text8 { public static void main(String[] args) { double a, b, c; Scanner scanner = new Scanner(System.in); a = scanner.nextDouble(); b = scanner.nextDouble(); c = scanner.nextDouble(); if ((a >= 1 && a <= 200) && (b >= 1 && b <= 200) && (c >= 1 && c <= 200)) { if ((a + b > c) && (b + c > a) && (a + c > b)) { if (a == b || a == c || b == c) { if (((a * a + b * b-c*c) <0.1) || ((c * c + b * b-a*a) < 0.1) || ((a * a + c * c-b*b) <0.1)) { System.out.println("Isosceles right-angled triangle"); } else if (a == b && b == c && c==a ) { System.out.println("Equilateral triangle"); } else { System.out.println("Isosceles triangle"); } } else if (((a * a + b * b) == c * c) || ((c * c + b * b) == a * a) || ((a * a + c * c) == b * b)) { System.out.println("Right-angled triangle"); } else { System.out.println("General triangle"); } } else { System.out.println("Not a triangle"); } }else { System.out.println("Wrong Format"); } } }
第二次作业:
7-2:
package Test2; import java.util.Scanner; public class t2 { public static void main(String[] args) { int i,j=0,k=0,num; int[] a1 = new int[100]; int[] a2 = new int[100]; int[] a3 = new int[100]; Scanner scanner = new Scanner(System.in); int n1 = scanner.nextInt(); for(i=0;i<n1;i++){ a1[i] = scanner.nextInt(); } int n2 = scanner.nextInt(); for(i=0;i<n2;i++){ a2[i] = scanner.nextInt(); } i=0; while (i<n1&&j<n2){ if (a1[i]<=a2[j]){ a3[k] = a1[i]; i++; }else if (a1[i]>a2[j]){ a3[k] = a2[j]; j++; } k++; } while (i!=n1){ a3[k] = a1[i]; i++; k++; } while (j!=n2){ a3[k] = a2[j]; j++; k++; } for (i=0;i<k;i++){ System.out.print (a3[i]+" "); } } }
7-3
package Test2; import java.util.Scanner; public class t3 { public static int[] months1 = new int[]{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; public static int[] months2 = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int year = scanner.nextInt(); int mon = scanner.nextInt(); int day = scanner.nextInt(); int days; if (judge(year, mon, day) == 1) { days=numOfDays(year,mon,day); if (isLeapYear(year)) { System.out.println(year + " is a leap year."); System.out.print(year+"-"+mon+"-"+day+" is "+getWhatDay(days)+"."); } else { System.out.println(year + " is not a leap year."); System.out.print(year+"-"+mon+"-"+day+" is "+getWhatDay(days)+"."); } } else { System.out.print("Wrong Format"); } } public static boolean isLeapYear(int year) { boolean leapyear = ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0); return leapyear; }//判断year是否为闰年,返回boolean类型; public static int numOfDays(int year, int month, int day) { int i; int days = 0; for (i = 1; i < year; i++) { if (isLeapYear(i)) { days = days + 366; } else { days = days + 365; } } if (isLeapYear(year)) { for (i = 1; i < month; i++) { days = days + months1[i]; } } else { for (i = 1; i < month; i++) { days = days + months2[i]; } } days = days + day; return days; } public static String getWhatDay ( int days){ int flag = days%7; switch (flag){ case 0: return "Sunday"; case 1: return "Monday"; case 2: return "Tuesday"; case 3: return "Wednesday"; case 4: return "Thursday"; case 5: return "Friday"; default: return "Saturday"; } } public static int judge ( int year, int month, int day){ int flag = 0; if ((year <= 2020 && year >= 1820) && (month > 0 && month <= 12)) { if (isLeapYear(year)) { if (day > 0 && day <= months1[month]) { flag = 1; } } else { if (day > 0 && day <= months2[month]) { flag = 1; } } } return flag; } }
第三次作业:
7-2
package Test2; import java.util.Scanner; public class ClassT3_2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Date today = new Date(); int year = scanner.nextInt(); int month = scanner.nextInt(); int day = scanner.nextInt(); today.setYear(year); today.setMonth(month); today.setDay(day); if (today.checklnputValidity()) { today.getNextDate(); } else { System.out.print("Date Format is Wrong"); } } static class Date { private int year; private int month; private int day; int[] mon_maxnum = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; public Date() { } public Date(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } public int getYear() { return this.year; } public int getMonth() { return this.month; } public int getDay() { return this.day; } public void setDay(int day) { this.day = day; } public void setMonth(int month) { this.month = month; } public void setYear(int year) { this.year = year; } public boolean isLeapYear(int year) { boolean leapyear = ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0); return leapyear; } public boolean checklnputValidity() { boolean flag = false; if ((this.year <= 2000 && this.year >= 1900) && (this.month > 0 && this.month <= 12)) { if (isLeapYear(this.year)) { mon_maxnum[2] = 29; if (this.day > 0 && this.day <= mon_maxnum[month]) { flag = true; } } else { if (day > 0 && day <= mon_maxnum[month]) { flag = true; } } } return flag; } public void getNextDate() { int day2 = this.day; int mon2 = this.month; int year2 = this.year; if (this.month == 12 && this.day == 31) {//最后一天,换年 year2 = this.year + 1; System.out.print("Next day is:" + year2 + "-1-1"); } else { if (isLeapYear(this.year)) {//是闰年 mon_maxnum[2] = 29; if (this.day < mon_maxnum[this.month]) {//换日 day2 = this.day + 1; System.out.print("Next day is:" + year2 + "-" + mon2 + "-" + day2); } else { mon2 = this.month + 1; System.out.print("Next day is:" + year2 + "-" + mon2 + "-1"); } } else {//不是闰年 if (this.day < mon_maxnum[this.month]) { day2 = this.day + 1; System.out.print("Next day is:" + year2 + "-" + mon2 + "-" + day2); } else { mon2 = this.month + 1; System.out.print("Next day is:" + year2 + "-" + mon2 + "-1"); } } } } } }
7-3
package Test2; import java.math.BigInteger; import java.util.Scanner; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Class3_3 { static String input; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()) { input = scanner.nextLine(); StrCut str = new StrCut(input); boolean flag = str.check(); if (flag){ str.strCut(); }else { System.out.println("Wrong Format"); } } } public static class StrCut { public StrCut() { } final String ADDORDE = "[-+]?"; final String POLINT = "([0-9]*)?\\*?"; final String POLEXP = "(x(\\^[+-]?[0-9]+)?)?"; final String POLPART = ADDORDE + POLINT + POLEXP; final String POLPARTA = "[-+]?" + "([0-9]*)?\\s*\\*?\\s*" + "(x\\s*(\\^\\s*[+-]?[0-9]+)?)?"; final String POLPARTB = "([0-9]*)?\\s*\\*?\\s*" + "(x\\s*(\\^\\s*[+-]?[0-9]+)?)?"; final String OPER1 = "(\\+\\+)|(\\-\\-)"; final String OPER2 = "(\\+\\-)|(\\-\\+)"; final String POL = "x(\\^[+-]?[0-9]+)?"; final String EXP = "[+-]?[0-9]+"; final String NUM = "[0-9]+"; final String CONX = "x\\s*(\\^\\s*[+-]?[0-9]+)?"; final String ERRORA = "[0-9]+\\s+[0-9]+"; final String ERRORB = "([+-][+-]\\s*[+-]\\s+[0-9]+)" + "|" + "([+-]\\s*[+-]\\s*[+-]x)"; final String ERRORC = "[0-9]+[a-z]"; final String ERRORD = "[^xsincos\\(\\)\\d\\s\\^\\*+-]";//sincos final String ERRORE = "(\\*\\s*[+-])|(\\^[+-]+\\s+[0-9]+)"; final String ERRORF = "(\\+oo)|([+-][+-][+-][+-]+)"; final String ERLEF1 = "[sincos\\(\\)]"; final String ERLEF2 = "\\s"; final String ERLEF = ERLEF1 + "|" + ERLEF2; String polStr; Vector polFull; Vector ratFull; BigInteger aX; BigInteger xExp; BigInteger sExp; BigInteger cExp; String part[] = new String[1000]; int len; StrCut(String str1) { this.polStr = str1; len = 0; this.sExp = BigInteger.valueOf(0); this.cExp = BigInteger.valueOf(0); this.aX = BigInteger.valueOf(1); this.xExp = BigInteger.valueOf(0); this.polFull = new Vector(); this.ratFull = new Vector(); } boolean check() { boolean ynTrue = false; String str = this.polStr; boolean yn1 = false, yn2 = false; if (str.equals("")) {//不是空格 yn1 = true; } if (this.standard(str).equals("")) { yn2 = true; } // ------------------------------------------------- String er[] = {ERRORA, ERRORB, ERRORC, ERRORD, ERRORE, ERRORF}; boolean yn[] = new boolean[er.length]; for (int i = 0; i < er.length; i++) { yn[i] = false; Pattern p = Pattern.compile(er[i]); Matcher m = p.matcher(polStr); yn[i] = m.find(); } str = this.standard(str); // ------------------------------------------------- boolean yn3 = false; Pattern p1 = Pattern.compile(ERLEF); Matcher m1 = p1.matcher(str); yn3 = m1.find(); // ------------------------------------------------- boolean qw = false; for (int i = 0; i < yn.length; i++) { if (yn[i]) { qw = true; } } if (!yn1 && !yn2 && !yn3 && !qw) ynTrue = true; return ynTrue; } String standard(String str) { String be = new String(); for (int i = 0; i < str.length(); i++) { if (str.charAt(i) != ' ' && str.charAt(i) != '\t') be += str.charAt(i); } be = be.replaceAll(OPER1, "+"); be = be.replaceAll(OPER2, "-"); return be; } void strCut() { String aStr = this.standard(this.polStr); String patt[] = {POLPARTA}; for (int i = 0; i < patt.length; i++) { Pattern p = Pattern.compile(patt[i]); Matcher m = p.matcher(aStr); while (m.find()) { this.part[this.len] = m.group(); this.len++; } aStr = aStr.replaceAll(patt[i], ""); } this.len--; for (int i = 0; i < this.len; i++) { this.ratFull.add(this.part[i]); } } } }
(三)调试心得:
(对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空)
第一次作业主要问题与心得:
①一些特殊类的调用与使用并不熟悉,需要现查资料
②PTA版本过低,不识别两次Scanner导致多次报错,但是Scanner的使用过多也确实会增加系统负担,改掉了多次创建Scanner的习惯。
③部分题目的代码明显过于复杂有更精简的算法没有考虑到,比如键盘题可以精简为ASCII码的查询完成结果
第二次作业主要问题与心得:
①闰年的算法不会,通过阅读CSDN文献了解了闰年的计算方法
②将计算方法整理成单独的方法函数去调用大大增加了程序的可读性,降低了程序的改进难度。
③运用全局函数存放月份,可以巧妙的直接按照月份查找对应天数
第三次作业主要问题与心得:
①第一次整体使用对象的编程方法,思考的顺序难以转变,仍然经常按照过程进行设计
②前两道题整体难度较低,主要是适应面向对象的编程方法,在熟练之后没有出现编程逻辑上或结果上的问题
③吃到了将部分功能汇聚成一个方法的红利,7-2题中主要的算法是直接复制了第二次作业中相应题型的闰年判断与部分声明,只需稍加修改就可以应用到新的题目中,大大缩短了编程的时间,减少了不必要的重复思考与代码重写
④虽然通过自学,完成了7-3中要求的正则表达式的使用,但是未能完成相应的功能,不会求导的运算,仅完成了函数的还原与异常输出,算法设计方面有待加强。
(四)改进建议:
(对相应题目的编码改进给出自己的见解,做到可持续改进)
第一次作业
7-2算法改进:对输入的字符进行强制转换,转换为int型,利用数字判断输出内容,减少圈复杂度
7-4、7-5算法改进:原先设计的代码中有大量重复的计算过程,影响了代码的可读性与后续功能的增加或改建。可以创建一个计算类,整理总结出税率或金钱计算公式并声明为不同的方法,通过对输入数字的判断完成方式的选择、通过带入参数的形式完成金额的计算。
7-8算法改进:圈复杂度过高,应该将三角判断算法单独整理为一个三角类,再进行计算,但好像也没有减少太多,需要继续进行实践练习
第二次作业
7-1圈复杂度过高,在if语句中运用了大量的条件判断,应该可以通过一个计算方法,找出相应数字的特性,通过计算得出一个数字再进行判断
7-3等闰年算法,可以只存一个数组,但判断出来是闰年的时候,通过更改数组完成后续计算,这样就减少了一个数组存放
(五)总结:
(对本阶段三次题目集的综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见。)
三次作业循序渐进的进行了编程习惯的转变,从原先C语言的面相过程转换为现在JAVA的面相对象,初步的了解了面相对象的思考方式。但是对于每个对象究竟应该有什么属性,以及属性的公共或私有形式、每个对象的具体方法的考量都不完善,后续应该加强思考如何使设计的对象有更强的可塑性,可以更方便快捷的在下次使用时完成修改。在对于JAVA庞大的类库以及相关功能还需要进一步的了解与学习,方便后续功能更好更快捷的实现。
对于老师还是希望能更多的简单讲解一下除c语言相关的基础使用语句以外的JAVA的特有的部分的相关知识与使用,对于一些声明还是有不理解的地方
相关的课程、作业与实验现下的难度与题量都处于能够完成的阶段(除去上次7-3),没有大片的不会写的现象产生
希望老师可以针对函数求导的这道题目进行更详细的讲解,或者有一份标准答案参考学习
课上进行代码交流的方式很好,能够直观的看到很多大佬的思路与想法,希望能够保持