面向对象程序设计-前三次题目集博客作业

1.前言

   前三次题目集的难度比较适中,有一看到就知道该怎么写的题目,比如说求和,输入输出等,也有需要经过详细思考过后才能考虑到所有的情况的题目,如:判断闰年及星期几,求下一天等题目;要考虑闰年,12月,1月,2月特殊月份的情况。总的来说,只要愿意去思考,都会有一定的思路,通过不断提交测试点,最后的到满分。

  三次作业的知识点总结:1.输入计算并输出,2.if和else等基础判断符,3.字符及字符串的输入和输出,4.对多个数进行排序,5.数组的定义及合并,6.boolean函数的应用,7.类设计。因为是三次作业,且是刚开始接触java,在c语言上都有大同小异之处,所有知识点比较多,但也十分好掌握。

2.具体题目分析

第一次题目集

  7-1计算两个数的和

  最基本的输入输出,熟练运用import java.util.Scanner;以及Scanner sc = new Scanner(System.in);熟知输入的规则和格式,注意int类型则为nextInt()这种规则即可,没有什么难度。

 

 

 

  7-2电话键盘字母数字转换

  出现了基本的判断条件,以及字符的输入;输入的部分和题一没有多大的差别,判断条件遵循c语言的if和else的规则即可,没什么值得细说的部分。

  7-3成绩分级管理

  同7-2,只需注意判断条件不出差错即可

  7-4计算税率

  本题的难度主要体现在对题目的理解以及对数字的运算,不要被题目各种税率和计算方法的复炸给吓到,认真观察其实很容易发现他们的规律,在每个收入阶段加以修改即可。这里给出其中一种情况的判断情况,可以看出只要掌握方法,就变得十分简单

 

 

 7-5 计算钱币

  本题的难点在于算法,只要理清楚如何将一个float类型的数分解成我们所理解的n个十元,n个五元,n个一元等即可。

 

 7-6 使用一维数组求平均值

  本题开始使用数组,目的在于学会如何去定义数组

 

 除了这种方法外,还有另一种方法

 

不去定义大小,直接将数据导入。

 7-7 对多个整数进行排序

算法题,可以通过简单的冒泡排序来进行操作。

 7-8 判断三角形类型

  这道题是比较有难度的一道题,首先要按顺序去考虑其是否能构成一个三角形,这边我选择使用“两边之和大于第三边”的定理来进行判断,筛选出不能够构成三角形的数据。然后按顺序去判断其是否构成等边三角形,等腰直角三角形,直角三角形和等边三角形。

踩坑心得:按顺序来进行判断十分重要,当时我把判断直角三角形和等腰直角三角形的判断顺序给调换了,结果在测试点中,等腰三角形的测试点一直过不去,后来慢慢输入数据测试才发现,当程序进行到判断三角形时,等腰三角形已经满足条件并且输出了,不再进行下一步判断。

 

 第二次题目集

7-1 IP地址转换

由于输入中存在长字符,所以本题我选择了字符串输入的形式来存储数据。通过charAt()来进行选择,对每四位进行二进制变换,最后根据题目格式来进行输出。

 

 b=((int)a.charAt(0)-48)*128+((int)a.charAt(1)-48)*64+((int)a.charAt(2)-48)*32+((int)a.charAt(3)-48)*16+((int)a.charAt(4)-48)*8+((int)a.charAt(5)-48)*4+((int)a.charAt(6)-48)*2+((int)a.charAt(7)-48);
           c=((int)a.charAt(8)-48)*128+((int)a.charAt(9)-48)*64+((int)a.charAt(10)-48)*32+((int)a.charAt(11)-48)*16+((int)a.charAt(12)-48)*8+((int)a.charAt(13)-48)*4+((int)a.charAt(14)-48)*2+((int)a.charAt(15)-48);
           d=((int)a.charAt(16)-48)*128+((int)a.charAt(17)-48)*64+((int)a.charAt(18)-48)*32+((int)a.charAt(19)-48)*16+((int)a.charAt(20)-48)*8+((int)a.charAt(21)-48)*4+((int)a.charAt(22)-48)*2+((int)a.charAt(23)-48);
           e=((int)a.charAt(24)-48)*128+((int)a.charAt(25)-48)*64+((int)a.charAt(26)-48)*32+((int)a.charAt(27)-48)*16+((int)a.charAt(28)-48)*8+((int)a.charAt(29)-48)*4+((int)a.charAt(30)-48)*2+((int)a.charAt(31)-48);
           System.out.print(b+"."+c+"."+d+"."+e);

 

 

 

 

 

 这里我选择了最简单的二进制转换方法,抛砖引玉,希望各位有更好的方法可以介绍给我。

 

7-2合并两个有序数组为新的有序数组

  算法题,注意考虑两个数组的大小,在其中一数组数据存储完毕后,将另一个数组剩余的数据插入至新的数组即可

7-3 判断闰年及星期几

  做这道题目前,首先要思考非合法输入的问题并撰写方法,然后去编写判断是否为闰年的方法,这两步是为下面进行操作而垫好的基石。

public static boolean checkInputValidity(int input_year,int input_month ,int input_day) {
        boolean checkInputValidity;
        int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
        if(!isLeapYear(input_year))
            a[2] = 28;
        checkInputValidity =(input_year>=1820&&input_year<=2020&&input_month>0&&input_month<=12&&input_day<=a[input_month]&&input_day>0);
        return checkInputValidity;
    }//判断是否输入错误的方法

public static boolean isLeapYear(int input_year) {
        boolean isLeapYear;
        isLeapYear = (input_year%4==0&&input_year%100!=0)||input_year%400==0;
        return isLeapYear;
}//判断是否为闰年的方法

 

    }//判断是否为闰年的方法

然后从1到输入的年份的前一年开始计算,每次都要判断是否为闰年;若为闰年则要加366天,否则则加365天,存储到总天数中。然后再去根据1到输入的月份的前一个月,计算每个月的天数,特别注意如果本年是闰年则2月份有29天,全部加起来后再加上输入的天数然后除以7就能得到最终的数字来进行判断是星期几。

public static int numOfDays(int input_year,int input_month ,int input_day) {
        int numofdays=input_day;
        for(int i=1;i<input_year;i++) {
            if(isLeapYear(i)) {
                numofdays=numofdays+366;
            }
            else {
                numofdays=numofdays+365;
            }
        }
         for(int i=1;i<input_month;i++) {
             switch (i) {
             case 1:
                 numofdays=numofdays+31;
                 break;
             case 2:
                 if (isLeapYear(input_year)) {
                     numofdays=numofdays+29;
                 } else {
                     numofdays=numofdays+28;
                 }
                 break;
             case 3:
                 numofdays=numofdays+31;
                 break;
             case 4:
                 numofdays=numofdays+30;
                 break;
             case 5:
                 numofdays=numofdays+31;
                 break;
             case 6:
                 numofdays=numofdays+30;
                 break;
             case 7:
                 numofdays=numofdays+31;
                 break;
             case 8:
                 numofdays=numofdays+31;
                 break;
             case 9:
                 numofdays=numofdays+30;
                 break;
             case 10:
                 numofdays=numofdays+31;
                 break;
             case 11:
                 numofdays=numofdays+30;
                 break;
             case 12:
                 numofdays=numofdays+31;
                 break;
        }
       }
         //System.out.println(numofdays);
        return numofdays;
    }
    public static String getWhatDay(int numofdays) {
        int number=numofdays%7;
         //System.out.println(number);
        String str="0";
        switch (number) {
        case 0:str="Sunday";
        break;
        case 1:str="Monday";
        break;
        case 2:str="Tuesday";
        break;
        case 3:str="Wednesday";
        break;
        case 4:str="Thursday";
        break;
        case 5:str="Friday";
        break;
        case 6:str="Saturday";
        break;
        }
        return str;
    }
}

 

 

 7-4 求下一天

  本题和7-3中的判断是否为闰年以及合法输入的方法无差别,算法上有差别。只要通过判断是否为12月份的最后一天,如果是则年份加1,月份和日变成1;然后判断是否为每一个月的最后一天,如果是则月份加1,日变1,年份不变;特别要注意是2月份的时候要判断是否为闰年,来区分28号为最后一天还是29号为最后一天。其他情况则只要日加1即可。

7-5 求前N天

  本题和7-4大同小异,只需要再把前几天的情况考虑进去即可。判断合法输入和闰年自然不用说,1月前几天是否为12月?(即前一年)12月份的后几天是否为1月?(即下一年),2月份的后几天是否为3月?来进行考虑2月份是否为闰年,反之亦然,并无太多变化,只不过多了几个判断条件。

    public static void nextOfNDay(int input_year,int input_month,int input_day,int n) {
         int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
         int year,month,day;
         if(isLeapYear(input_year)) {
             if(input_month==12&&n>=0) {
                 if((input_day+n)>a[input_month]) {//超过12月的
                     year=input_year+1;
                     month=1;
                     day=input_day+n-a[input_month];
                 }
                 else {
                     year=input_year;
                     month=input_month;
                     day=input_day+n;
                 }
                 
             }
             else if(input_month==1&&n<0) {
                 if((input_day+n)<1){//小于1月的
                     year=input_year-1;
                     month=12;
                     day=a[12]+(input_day+n);
                 }
                 else {
                     year=input_year;
                     month=input_month;
                     day=input_day+n;
                 }
             }
             else if(n>=0) {
                 if((input_day+n)>a[input_month]) {
                     year=input_year;
                     month=input_month+1;
                     day=input_day+n-a[input_month];
             }
                 else {
                     year=input_year;
                     month=input_month;
                     day=input_day+n;
                 }
             }
             else {//n小于0
                 if((input_day+n)<1){
                     year=input_year;
                     month=input_month-1;
                     day=a[input_month-1]+(input_day+n);
                 }
                 else {
                     year=input_year;
                     month=input_month;
                     day=input_day+n;
                 }
             }
         }
         else{
             a[2]=28;
             if(input_month==12&&n>=0) {
                 if((input_day+n)>a[input_month]) {//超过12月的
                     year=input_year+1;
                     month=1;
                     day=input_day+n-a[input_month];
                 }
                 else {
                     year=input_year;
                     month=input_month;
                     day=input_day+n;
                 }
                 
             }
             else if(input_month==1&&n<0) {
                 if((input_day+n)<1){//小于1月的
                     year=input_year-1;
                     month=12;
                     day=a[12]+(input_day+n);
                 }
                 else {
                     year=input_year;
                     month=input_month;
                     day=input_day+n;
                 }
             }
             else if(n>=0) {
                 if((input_day+n)>a[input_month]) {
                     year=input_year;
                     month=input_month+1;
                     day=input_day+n-a[input_month];
             }
                 else {
                     year=input_year;
                     month=input_month;
                     day=input_day+n;
                 }
             }
             else {//n小于0
                 if((input_day+n)<1){
                     year=input_year;
                     month=input_month-1;
                     day=a[input_month-1]+(input_day+n);
                 }
                 else {
                     year=input_year;
                     month=input_month;
                     day=input_day+n;
                 }
             }
         }
         n=-n;
         System.out.print(n+" days ago is:"+year+"-"+month+"-"+day);
    }
}

 

 

  第三次题目集

7-2 定义日期类

本题开始创建类,其实方法相对与第二次作业集并没有太大的不同,所以思路请参考上面,我详细说说为什么创建类吧。java相对于c语言更容易发现错误和调试主要归功与类的形式十分好找,写代码的人也能很清晰地发现问题或者寻找自己需要的算法内容。在主类中只进行步骤上的操作,而具体的精华则分为其他几个类来进行。虽然我这题只用了一个类..但不影响他的作用。分享一下我的类代码

 

class Data{
    int year;
    int month;
    int day;
    int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
    void nextDate(int input_year,int input_month ,int input_day) {
        int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
        int year,month,day;
        if(isLeapYear(input_year)) {
            if(input_month==12) {
                if(input_day==31) {
                    day=1;
                    month=1;
                    year=input_year+1;        
                }
                else {
                    day=input_day+1;
                    month=input_month;
                    year=input_year;
                }
            }
            else if(input_month==2) {
                if(input_day==29) {
                    day=1;
                    month=3;
                    year=input_year;        
                }
                else {
                    day=input_day+1;
                    month=input_month;
                    year=input_year;
                }
            }
            else {
                if(input_day==a[input_month]){
                    day=1;
                    month=input_month+1;
                    year=input_year;
                }
                else {
                    day=input_day+1;
                    month=input_month;
                    year=input_year;
                }
            }
        }
        else {
            if(input_month==12) {
                if(input_day==31) {
                    day=1;
                    month=1;
                    year=input_year+1;        
                }
                else {
                    day=input_day+1;
                    month=input_month;
                    year=input_year;
                }
            }
            else if(input_month==2) {
                if(input_day==28) {
                    day=1;
                    month=3;
                    year=input_year;        
                }
                else {
                    day=input_day+1;
                    month=input_month;
                    year=input_year;
                }
            }
            else {
                if(input_day==a[input_month]){
                    day=1;
                    month=input_month+1;
                    year=input_year;
                }
                else {
                    day=input_day+1;
                    month=input_month;
                    year=input_year;
                }
            }
        }
        System.out.print("Next day is:"+year+"-"+month+"-"+day);
    }
    void operation(int year,int month,int day) {
        if(!checkInputValidity(year,month,day)) {
            System.out.print("Date Format is Wrong");
        }
        else {
            nextDate(year,month,day);
        }
    }
}

 

 

 

7-3 一元多项式求导(类设计)

本题的难度是这几题中最高的,一元多项式求导,这道题有点复杂,当时没有做出来,参考了一下网上一些资料,创建一个DvForString()类,将一元多项式分类进行分析,如全是常数项、x只有系数、x只有指数、x指数和系数都有、还有每一项前面的符号。本题我没有拿到满分,因为我只能考虑到几个比较好判断的情况,所以就只能拿到一点点分,希望能抛砖引玉,能有更多人向我分享你们的方法。

 

 

 3.踩坑心得

  这几次作业集中没有太多困难的点,要仔细检查判断条件是否满足题目的要求,是否要注意判断的循序,多考虑每种情况并善于用调试功能来进行修改。调用定义的类要先new一个新对象,除非有static时可以直接调用类里面的函数。当对输出有要求如保留几位小数时输出才会用到printf,由于写C语言写习惯了,经常会下意识地写printf导致出错。遇到自己不太会写的题可以请教一下别人,通过自己的理解来写出自己的代码。

4.改进建议

  在写类的时候可以画一个存储结构图,具体什么类负责什么工作,这样写代码的时候目的性就会比较强。在二进制转换的题目上可以掌握更好的方法来进行转换,简洁代码。

5.总结

学习Java的过程中,我发现这个语言除了有些语法和c语言有些不同,大多数用法还是相同的。不同点:输入输出要声明,特别要注意int或者char等格式,相同点:if和else,switch,while等用法都是一样的。对于正则表达式,我觉得这是一个值得钻研的地方,很多有关格式,都可以用比较简洁的语言来进行编写,十分地方便。

 

posted @ 2021-10-15 15:32  海星sensei  阅读(104)  评论(0)    收藏  举报