OOP 1-3次作业总结
22201303-范宇
前言
第一次BLOG,对第一阶段的学习总结。
前三次题目集总体上更偏向于JAVA语法上的训练,第二次与第三次题目集中的后两道需要一点逻辑思维。题量我个人认为适中,整体难度我认为恰到好处,就是那种需要一定时间思考,但又不至于难到完成不了。
设计与分析
题目集一:7-7 有重复的数据,读入数据,检查是否有重复的数据。如果有,输出“YES”这三个字母;如果没有,则输出“NO”。你的程序首先会读到一个正整数n,n∈[1,100000],然后是n个整数。
如果这些整数中存在重复的,就输出: 否则,就输出:- import java.util.Scanner;
- import java.util.Arrays;
- public class Main{
- public static void main(String[] args){
- Scanner input = new Scanner(System.in);
- int n=input.nextInt();
- int [] num=new int[n];
- for(int i=0;i<n;i++){
- num[i]=input.nextInt();
- }
- Arrays.sort(num);
- int i;
- for(i=0;i<n-1;i++){
- if(num[i]==num[i+1]){
- System.out.println("YES");
- break;
- }
- }
- i++;
- if(i==n)
- System.out.println("NO");
- // int i;
- // loop:
- // for(i=0;i<n;i++){
- // for(int j=n-1;j>i;j--){
- // if(num[i]==num[j]){
- // System.out.println("YES");
- // break loop;
- // }
- // }
- // }
- // if(i==n)
- // System.out.println("NO");
-
- }
- }
复制代码 这道题需要先根据题目给出的条件判断输入日期是否合法,然后再求下一天的日期,这里需要考虑到这一天是否达到这一月的最后一天,以及这一月共有多少天,如果是二月份还需要是否是闰年,如果是闰年则二月份有29天;否则有28天,考虑完了月份还需要考虑年份,要考虑这一天是否是这一年的最后一天,如果是,则下一天日期变为一月一日,年份加一;
当时写这道题的时候对JAVA语法方面的内容还不是很熟悉,现在看来完全可以用数组(int[] mon_maxnum={0,31,28,31,30,31,30,31,31,30,31,30,31})来取代冗长的if里的条件;
题目集三:7-3 定义日期类,要求我们定义一个类Date(Date类结构如下图所示)
- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日;
- 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<1||a>200||b<1||b>200||c<1||c>200)
- System.out.print("Wrong Format");
- else{
- double t;
- if(a<b){
- t=a;
- a=b;
- b=t;
- }
- if(a<c){
- t=a;
- a=c;
- c=t;
- }
- if(b<c){
- t=b;
- b=c;
- c=t;
- }
- if((b+c)<=a)
- System.out.print("Not a triangle");
- else if(a==b&&b==c)
- System.out.print("Equilateral triangle");
- else if(b==c&&(2*b*b-a*a)*(2*b*b-a*a)<0.00001*0.00001)
- System.out.print("Isosceles right-angled triangle");
- else if((b==c)||(b==a))
- System.out.print("Isosceles triangle");
- else if(b*b+c*c==a*a)
- System.out.print("Right-angled triangle");
- else
- System.out.print("General triangle");
- }
- }
- }
复制代码 这道题我是一遍过的,毕竟计算量不大,仅仅只是下一天,需要考虑到这一天是否是这个月的最后一天,如果是,则下一天为下个月的第一天,还需要考虑到这个月是否是12月,如果是既12月又是最后一天,则下一天为下一年的1月1日。然后就是细节上的考虑,这里主要体现在对闰年的判断,对这道题来讲,因为只求下一天,所以只需考虑是否有2月29日。
- 题目集三:7-4 日期类设计,要求参考7-3设计一个DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31],设计类图如下:
功能实现:
- 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();
- Main in=new Main();
- if(year<1820||year>2020||month<1||month>12||day<1||day>31)
- System.out.print("Wrong Format");
- else{
- if(checkInputValidity(year,month,day)){
- in.nextDate(year,month,day);
- }
- else
- System.out.print("Wrong Format");
- }
- }
- 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){
- if(isLeapYear(year)){
- if(month==2&&day>29)
- return false;
- }
- else{
- if(month==2&&day>28)
- return false;
- }
- if(month==4||month==6||month==9||month==11){
- if(day>30)
- return false;
- }
- return true;
- }
- public static void nextDate(int year,int month,int day){
- day++;
- if(month==4||month==6||month==9||month==11){
- if(day>30){
- month++;
- day=1;
-
- }
- }
- if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
- if(day>31){
- month++;
- day=1;
- if(month>12){
- year++;
- month=1;
- }
- }
- }
- if(month==2){
- if(isLeapYear(year)){
- if(day>29){
- month++;
- day=1;
-
- }
- }
- else{
- if(day>28){
- month++;
- day=1;
-
- }
- }
-
- }
- System.out.print("Next date is:"+year+"-"+month+"-"+day);
- }
- }
复制代码 在很多题目中,由于C语言习惯用System.out.printf()输出,可往往这样都通不过测试点,只能使用System.out.print()或System.out.println(),下面是三者的一些区别:print为一般输出,同样不能保留精度格式转化,也不能换行输出; printf常用于格式转换,但需要注意不是换行输出,只用于精度转换; println为换行输出,不能用于格式化输出;
基本类型转换,有时候题目规定只能是单精度型或者只能是双精度型的数据结果才能通过测试点float w1=(float)(w/0.45359237);
误差判断时,大部分情况下要加一个平方,因为误差不仅是一个向左或向右的区间,误差是一个既向左又向右的区间,如while((g-m)>=0.00001)while((g-m)>=0.00001||(m-g)>=0.00001);
在题目集一:7-7 有重复的数据中,遇到了超时的问题,当时与其他同学讨论发现,使用ArrayList类进行排序,再遍历依旧超时,而使用Arrays类进行排序则不会超时,后面在查阅资料时发现,ArrayList是Array的复杂版本,ArrayList比Arrays的方法更多,功能更丰富,可以理解为Arrays是静态数组,而ArrayList是动态数组,而Sort 方法是在内部数组的基础上直接调用 Array 的对应方法,所以通常情况下:ArrayList的排序会比Arrays的排序时间要长;
</ol>改进建议
- 善用数组,在题目集二:7-9 求下一天中,使用数组来存储12个月的最大天数,对m进行判断时再通过数组下标来找出月份对应的天数,这会更加方便,而且易懂;
- 规范命名,尽可能写出英文全称,增加代码可读性;
- 多了解一些类的使用,比如String类,Arrays类,ArrayList类;
- 学习JAVA异常处理的相关内容,取代if判断;
总结
三次题目集的训练,使我从零开始入门JAVA这门编程语言,使我对JAVA有了一个初步的了解,同时也对面对对象程序设计有了一个初步认识。面对对象程序设计与上学期的C语言(面向过程程序设计)不同,面向过程程序设计从逻辑上来看感觉更直接,而面向对象程序设计感觉更加抽象,更易于模块化。面向对象程序设计里,数据和数据上的操作是分离的,也就是对象和控制对象的方法,JAVA里的模块化主要体现在类上,类是一个抽象的模块,它包含了一系列对象及其方法,类的设计就是对现实世界的抽象化,所以面对对象程序设计也需要强大的抽象思维能力,在面对对象程序设计中,类的设计是重中之重,为了设计类,还需要探究类之间的关系,类之间的关系通常有关联、聚合、组合及继承,这也体现了面对对象程序设计的三大特点:封装性、继承性、多态性。
通过三次作业,能够感觉到JAVA这门语言的强大,同时也能感觉到JAVA里的世界之大,目前我只学习到了它最基础的语法部分以及少量的类,JAVA自带了大量的类可以使用,这能大大方便我们解决问题。老师在上课时也带我们接触了一些从未听过的东西,比如JAVA里的集合框架,这些内容需要我们自己花大量时间去探究学习。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |