面向对象程序设计-前三次题目集博客作业
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等用法都是一样的。对于正则表达式,我觉得这是一个值得钻研的地方,很多有关格式,都可以用比较简洁的语言来进行编写,十分地方便。

浙公网安备 33010602011771号