阿姨学java_Java初学者最近三次作业的心得体会

作为一个初学者,简单的谈一下自己的作业心得体会。如果你是完全没有接触过Java的学习,本篇博文可能会有些收获,如果你已经学习Java有一段时间了,那么可以放弃这篇文章了,因为这篇文章讲解的是基本的东西,甚至因为学习深度原因可能会有所错误,仅作为了解Java入门的浅显资料。

Java的基础结构我就不多赘述了,网络上有非常详细的资料,我平常最多使用的是菜鸟教程https://www.runoob.com/java/java-tutorial.html,可以简单了解非常基础。

直接进入正题

初学者的最近的三次作业例题:

(1)第一次作业例题:

(代码仅作参考)

统计最大数出现次数

编写程序读取一系列整数,找出它们的最大数,然后计算该数的出现次数,假定输入以0结束。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importjava.util.Scanner;2

3 public classMain {4

5 public static voidmain(String[] args) {6 Scanner input = newScanner(System.in);7 int[] complete;8 int max = 0;9 int i=0;10 int n=0;11 int count = 0;12 complete = new int[10];13 do{14

15 complete[i] =input.nextInt();16 i++;17 n++;18 }while(complete[i-1]!=0);19 for (i = 0; imax) {23 max=complete[i];24 count=1;25 }26 }27 System.out.println("The largest number is " +max);28 System.out.print("The occurrence count of the largest number is " +count);29 }30

31 }

第一次作业代码示例

(2)第二次作业例题

求下一天:

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[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) ; //求输入日期的下一天

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importjava.util.Scanner;2 public classMain {3

4 public static voidmain(String[] args) {5 Scanner input = newScanner(System.in);6 int year =input.nextInt();7 int month =input.nextInt();8 int day =input.nextInt();9 if(checkInputValidity(year,month,day)) {10 System.out.println("Wrong Format");11 }12 else{13 nextDate(year,month, day);14

15 }16

17

18 }19 public static boolean isLeapYear(intyear) {20 boolean a = false;21 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)22 a = true;23 returna;24 }25 public static boolean checkInputValidity(int year,int month,intday) {26 boolean a = false;27 if (year < 1820 || year > 2020 || month < 1 || month > 12 || day < 1 || day > 31||((!isLeapYear(year)&&month==2&&day>28)))28 a = true;29 returna;30 }31 public static void nextDate(int year,int month,intday) {32 int a[]= {31,29,31,30,31,30,31,31,30,31,30,31};//闰年日期

33 int b[]= {31,28,31,30,31,30,31,31,30,31,30,31};//非闰年日期

34 if(month==12&&day==31) {35 year++;36 month=1;37 day=1;38 }39 else if(isLeapYear(year)) {40 if(day==a[month-1]) {41 month++;42 day=1;43 }44 else

45 day++;46 }47 else{48 if(day==b[month-1]) {49 month++;50 day=1;51 }52 else

53 day++;54 }55 System.out.println("Next date is:"+year+"-"+month+"-"+day);56 }57

58 }

第二次作业代码示例

(3)第三次作业例题

日期类设计:

参考题目集二中和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:

public boolean checkInputValidity();//检测输入的年、月、日是否合法

public boolean isLeapYear(int year);//判断year是否为闰年

public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期

public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期

public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)

public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等

public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数

public String showDate();//以“year-month-day”格式返回日期值

应用程序共测试三个功能:

1.求下n天

2.求前n天

3.求两个日期相差的天数

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importjava.util.Scanner;2

3 public classMain {4 public static voidmain(String[] args) {5 Scanner input = newScanner(System.in);6 int year = 0;7 int month = 0;8 int day = 0;9

10 int choice =input.nextInt();11

12 if (choice == 1) { //test getNextNDays method

13 int m = 0;14 year =Integer.parseInt(input.next());15 month =Integer.parseInt(input.next());16 day =Integer.parseInt(input.next());17

18 DateUtil date = newDateUtil(year, month, day);19

20 if (!date.checkInputValidity()) {21 System.out.println("Wrong Format");22 System.exit(0);23 }24

25 m =input.nextInt();26

27 if (m < 0) {28 System.out.println("Wrong Format");29 System.exit(0);30 }31

32 System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");33 System.out.println(date.getNextNDays(m).showDate());34 } else if (choice == 2) { //test getPreviousNDays method

35 int n = 0;36 year =Integer.parseInt(input.next());37 month =Integer.parseInt(input.next());38 day =Integer.parseInt(input.next());39

40 DateUtil date = newDateUtil(year, month, day);41

42 if (!date.checkInputValidity()) {43 System.out.println("Wrong Format");44 System.exit(0);45 }46

47 n =input.nextInt();48

49 if (n < 0) {50 System.out.println("Wrong Format");51 System.exit(0);52 }53

54 System.out.print(55 date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");56 System.out.println(date.getPreviousNDays(n).showDate());57 } else if (choice == 3) { //test getDaysofDates method

58 year =Integer.parseInt(input.next());59 month =Integer.parseInt(input.next());60 day =Integer.parseInt(input.next());61

62 int anotherYear =Integer.parseInt(input.next());63 int anotherMonth =Integer.parseInt(input.next());64 int anotherDay =Integer.parseInt(input.next());65

66 DateUtil fromDate = newDateUtil(year, month, day);67 DateUtil toDate = newDateUtil(anotherYear, anotherMonth, anotherDay);68

69 if (fromDate.checkInputValidity() &&toDate.checkInputValidity()) {70 System.out.println("The days between " + fromDate.showDate() +

71 " and " + toDate.showDate() + " are:"

72 +fromDate.getDaysofDates(toDate));73 } else{74 System.out.println("Wrong Format");75 System.exit(0);76 }77 }78 else{79 System.out.println("Wrong Format");80 System.exit(0);81 }82 }83 }84 classDateUtil {85 private static final DateUtil DateUtil = null;86 int a[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//闰年日期

87 int b[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//非闰年日期

88 private intyear;89 private intmonth;90 private intday;91 public intgetYear() {92 returnyear;93 }94 public void setYear(intyear) {95 this.year =year;96 }97 public intgetMonth() {98 returnmonth;99 }100 public void setMonth(intmonth) {101 this.month =month;102 }103 public intgetDay() {104 returnday;105 }106 public void setDay(intday) {107 this.day =day;108 }109 public DateUtil(int year2, int month2, intday2) {110 year =year2;111 month =month2;112 day =day2;113 }114 public boolean checkInputValidity() {//检测输入的年、月、日是否合法

115 boolean a = true;116 if (year < 1820 || year > 2020 || month < 1 || month > 12 || day < 1 || day > 31||((!isLeapYear(year)&&month==2&&day>28))||((isLeapYear(year)&&month==2&&day>29)))117 a = false;118 returna;119 }120 public boolean isLeapYear(int year) {//判断year是否为闰年

121 boolean a = false;122 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)123 a = true;124 returna;125 }126 public DateUtil getNextNDays(int n) {//取得year-month-day的下n天日期

127 DateUtil date = newDateUtil(year, month, day);128 long c = (long) n;129 long d = (long) date.day;130 long sum = c +d;131 while(sum>a[date.month-1]||sum>b[date.month-1]) {132 if(isLeapYear(date.year)) {//瑞年

133 while(sum>a[date.month-1]) {//计算瑞年天

134 sum = sum -a[date.month -1];135 if(date.month == 12) {136 date.year++;137 date.month=1;138 if(!isLeapYear(date.year)) {139 break;140 }141 }else{142 date.month++;143 }144 }145

146 } else{//非瑞年

147 while(sum>b[date.month-1]) {//计算非瑞年天

148 sum = sum -b[date.month -1];149 if(date.month == 12) {150 date.year++;151 date.month=1;152 if(isLeapYear(date.year)) {153 break;154 }155 }else{156 date.month++;157 }158 }159

160 }161 }162 int Sum = newLong(sum).intValue();163 date.day =Sum;164 returndate;165

166 }167 public DateUtil getPreviousNDays(int n) {//取得year-month-day的前n天日期

168 DateUtil date = newDateUtil(year, month, day);169 int sum =n;170 if(n!=0) {171 date.day--;172 }173

174 if(sum>date.day) {//减去原始天数

175 sum = sum -date.day;176 date.month--;177 if(isLeapYear(date.year)) {178 date.day = a[date.month-1];179 }else{180 date.day = b[date.month-1];181 }182 }else if(sum==date.day) {183 sum=0;184 if(date.month==1) {185 date.year--;186 date.month=12;187 if(isLeapYear(date.year)) {188 date.day = a[date.month-1];189 }else{190 date.day = b[date.month-1];191 }192 }193 date.month--;194 if(isLeapYear(date.year)) {195 date.day = a[date.month-1];196 }else{197 date.day = b[date.month-1];198 }199

200 }201 while(sum>=date.day) {202 if(isLeapYear(date.year)) {//瑞年

203 while(sum>=date.day) {204 if(date.month==1) {205 date.year--;206 date.month=12;207 if(sum>=b[date.month-1]) {208 date.day = b[date.month-1];209 sum = sum-date.day;210 }else{211 date.day = b[date.month-1];212 sum = date.day-sum;213 }214 }215 else if(sum>=a[date.month-1]) {216 date.day = a[date.month-1];217 sum = sum-date.day;218 date.month--;219 }220 else{221 date.day = a[date.month-1];222 sum = date.day-sum;223 date.month--;224 }225

226 if(!isLeapYear(date.year)) {227 break;228 }229 }230 }else {//非瑞年

231 while(sum>=date.day) {232 if(date.month==1) {233 date.year--;234 date.month=12;235 if(sum>=b[date.month-1]) {236 date.day = b[date.month-1];237 sum = sum-date.day;238 }else{239 date.day = b[date.month-1];240 sum = date.day-sum;241 }242 }243 else if(sum>=b[date.month-1]) {244 date.day = b[date.month-1];245 sum = sum-date.day;246 date.month--;247 }248 else{249 date.day = b[date.month-1];250 sum = date.day-sum;251 date.month--;252 }253

254 if(isLeapYear(date.year)) {255 break;256 }257 }258 }259 }260 date.day =date.day-sum;261 returndate;262 }263 public boolean compareDates(DateUtil date) {//比较当前日期与date的大小(先后)

264 boolean a = false;265 if(year>date.year||year==date.year&&month>date.month||year==date.year&&month==date.month&&date.day>day) {266 a = true;267 }268 returna;269 }270 public boolean equalTwoDates(DateUtil date) {//判断两个日期是否相等

271 boolean a = false;272 if(year==date.year&&month==date.month&&date.day==day) {273 a = true;274 }275 returna;276 }277 public int getDaysofDates(DateUtil date) {//求当前日期与date之间相差的天数

278 int sum = 0;279 if(!equalTwoDates(date)) {280 if(!compareDates(date)) {//date.year>year

281 while(date.year>year) {282 if(isLeapYear(year)) {283 year++;284 sum+=366;285 }else{286 year++;287 sum+=365;288 }289

290 }291 if(isLeapYear(year)) {292 while(date.month>month) {293 sum+=a[month-1];294 month++;295 }296 }else{297 while(date.month>month) {298 sum+=b[month-1];299 month++;300 }301 }if(day>date.day) {302 sum+=day-date.day;303 }else{304 sum+=date.day-day;305 }306 }else {//year>date.year

307 while(year>date.year) {308 if(isLeapYear(date.year)) {309 date.year++;310 sum+=366;311 }312 else{313 date.year++;314 sum+=365;315 }316 }317 if(isLeapYear(date.year)) {318 while(month>date.month) {319 sum+=a[date.month-1];320 date.month++;321 }322 }else{323 while(month>date.month) {324 sum+=b[date.month-1];325 date.month++;326 }327 }328 if(day>date.day) {329 sum+=day-date.day;330 }else{331 sum+=date.day-day;332 }333 }334 }335 returnsum;336 }337 public String showDate() {//以“year-month-day”格式返回日期值

338 return year+"-"+month+"-"+day;339 }340

341

342 }

第三次作业代码示例

初学者第一次学习Java的时候,最懵的是类与对象,而Java是面向对象的语言,什么是类,什么是对象?

对象:对象是类的一个实例,有状态和行为。

类:类是一个模板,它描述一类对象的行为和状态。

这是一般的说法,刚接触java时有些看不懂,但如果你学习过一段时间的Java回头去看这两句话却会有种恍然大悟的感觉,发现这两句话描述的十分准确,不过对于初学者来说理解这两句话就有些困难了。

举个例子让我们来理解一下面向对象与面向过程的区别:

就像人走路

面向过程可能是这样实现的,大脑中枢一级一级的传递信息,再传递给肌肉,你的左脚或者你的右脚动了动了,让后再一级一级的传递信息,你的另一只脚动了,你便实现了走路。

而面向对象可能是这样实现的,大脑告诉左脚:动,然后告诉另一只脚:动,你就实现了走路。

你的脚就可以创建一个类,它有温度等其他状态,也有内部神经传递的行为。而类是虚的抽象的,可以想象一下3D打印机,类是在电脑中创建的模型,你需要打印出来才能成为对象,它才能实现各种功能,不同对象可以根据状态区分,不仅能打印出来41码的脚,还能打印出来42码的脚。

我们可以清晰的看到,作业代码的长度是逐渐增加的,代码的难度也是逐渐增加的,但我们关注的重点是代码的演变,这是一个从面向过程到面向对象的演变过程。因为刚接触java时,第一次作业难度并不高,因为所有功能都能在Main类里快速实现,把Main类当成C语言的main函数一样使用,实现方法更像是面向过程的语言;第二次作业根据作业要求,让人有意识地在Main类中添加了方法,但思想上还是停留在函数上,思想上觉得方法类似于C语言函数调用;第三次作业在Main类之外又写了新类DateUtil,之后又在DateUtil的基础上写了Year、Month、Day、等类,一次次作业让我们将面向过程的思想过渡为面向对象的思想,这时候就渐渐的感觉到了两者的不同。

其实,面向过程与面向对象都是只是一种思维方式,根据第一次作业,我们能够用面向过程的思维方式实现代码功能,但假如后两次作业没有前置条件,我们也能用面向过程的思维方式实现代码共能,相对而言面向对象的思维方式更像是我们平常的思考方式,就好像走路,我们只要给左右脚下达命令,我们就能实现走路的目标。

当你理解了面向对象的思想,剩余需要注意的就是代码的严谨性。例如求日期的上N天日期,你要考虑月份减一,年份减一,瑞年与非瑞年的情况等等,常常会因为代码结构或者逻辑算法不够严谨而付出代价,这个代价往往是大量检验与修改的时间。当谈到检验呢,就不得不说代码测试的重要性,当我们的代码出现了问题。对于新手来说一般会遇到两个问题,一个是不知道自己错在哪,一个是知道哪错了不会改,前者的问题往往比后者更严重;知道了错误方式网络上有大量的教程,可不知道自己哪错了便无从下手。拥有一个好的测试方式可以快速准确的找到自己的错误点,以“上N天”为例,我检测的方式往往是特殊值,边界值,由小及大,但还是浪费了大量的时间,因为往往是屡改屡错,让人抓狂。但是如果不进行测试,单单凭借自己的思考:代码哪里出现了错误?略短的代码可能稍加思考便可找出,但随着代码复杂程度的增加,这种方式变得越来越不可能。

再说回代码的严谨性,如果你最开始的时候便进行了严谨的考虑,那么你后续的工作会轻松不少;如若不是,那你可能就要万里长征了。

在文章的最后,感谢各位可以看到这里。在Java学习中,实践大于理论,更多的实际操作,往往会得到更好的学习效果。鄙人初学四周,一些心得体会,也是希望自己未来在Java学习方面取得更好的成果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值