武汉科技大学城市学院课程设计报告课程设计名称JAVA程序设计课程设计题目ACM院系信息工程学部专业软件工程班级15级3班姓名洪汉山指导教师于海平2017 年 6 月23 日课程设计评分表JA V A编程课程设计指导书学时:1周,学分:11.课程设计目的:JAVA编程课程设计属于软件开发类课程设计。
该课程设计培养学生熟练应用当前主流的JAVA软件开发语言,检验软件的设计、编码与测试,具备较强的JAVA语言软件开发能力。
2.课程设计方式:(1)JAVA编程课程设计方式采取ACM测试的方式,利用所学的面向对象程序设计(JAVA)知识,培养学生具有分析应用问题的能力,能够独立完成应用程序的编制与调试工作。
(3)每个同学必须完成8-12道题,每题写出解题报告,解题报告内容:○1.题目标题○2.题目描述○3.解题思路○4.源码○5.小结3.课程设计平台: eclipse或Myeclipse4.课程设计考核方式(1)学生独立提交软件设计作品和“课程设计报告书”,指导教师根据学生组提交的软件设计作品和“课程设计报告书”的质量,为学生组评定“优”“良”“中”“及格”或“不及格”;(2)根据各组学生所选题目的难易程度以及验收结果,为学生评定“优”“良”“中”“及格”或“不及格”。
“课程设计报告书”包括:课程设计项目名称,课程设计任务, 课程设计任务(功能)说明及功能模块图,数据库设计,各模块功能说明,使用的算法描述(如果需使用算法),各模块界面设计,各模块中关键代码段功能说明与代码行注释,测试说明,参考文献等。
5.参考文献[1] 张思民. Java语言程序设计(第2版)[M].北京:清华大学出版社,2012.1[2] 姜华. Java项目实战教程[M]. 北京:清华大学出版社,2012.9[3] 陈喧. Java程序设计教程[M]. 北京:清华大学出版社,2011.5[4] [美]Echel,B .Java编程思想(第四版)[M].北京:机械工业出版社,2007[5] Michael Main. 数据结构:Java语言描述(第二版)(国外经典计算机科学教材)[M].北京:中国电力出版社,2007目录1 星系炸弹 (1)1.1 问题描述 (1)1.2 解题思路 (1)1.3 代码 (2)1.4 小结 (2)2 求2个日期之间的天数 (3)2.1 问题描述 (3)2.2 解题思路 (3)2.3 代码 (4)2.4 小结 (4)3 再求多项式(含浮点) (5)3.1 问题描述 (5)3.2 解题思路 (5)3.3 代码 (6)3.4 小结 (6)4 3n+1问题 (7)4.1 问题描述 (7)4.2 解题思路 (8)4.3 代码 (9)4.4 小结 (9)5 输出四位完全平方数 (10)5.1 问题描述 (10)5.2 解题思路 (10)5.3 代码 (10)5.4 小结 (10)6 Huffuman树 (11)6.1 问题描述 (11)6.2 解题思路 (12)6.3 代码 (12)6.4 小结 (12)7 计算多项式 (13)7.1 问题描述 (13)7.2 解题思路 (13)7.3 代码 (13)7.4 小结 (14)总结 (15)1星系炸弹1.1问题描述在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,输入定时天数,例如定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为yyyy-mm-dd 即4位年份2位月份2位日期。
比如:2015-02-19输入:输入炸弹引爆延迟的天数。
输出:对于每个输入天数,输出符合题目要求的格式的日期。
样例输入:1000样例输出: 2017-08-051.2解题思路利用java里的时间日期类里的各种方法来完成这个代码,先定义一个容器,并键盘输入天数n。
设置一个起始日期,再用add(Calendar.DATE,n)的方法在这个起始日期上加上n天并打印输出。
已知当前日期为2014-11-09,定时为1000天,2015不是闰年,1000-365=635,日期为2015-11-09;2016年是闰年(能被4整除但不能被100整除),635-366=269,日期为2016-11-09;266不满一年,所以接下来按月做减法,11月30天,12月31天,1月31天,2月28天,3月31天,4月30天,5月31天,6月30天,7月31天,269-30-31-31-28-31-30-31-30=27,日期为2017-07-09;27-22=5,日期为2017-07-31;最后日期为2017-08-05。
1.3代码import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Scanner;public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);while (sc.hasNext()){int n=sc.nextInt();SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");Calendar c=Calendar.getInstance();c.set(2014,10,9);c.add(Calendar.DATE,n);System.out.println(df.format(c.getTime()));}}}1.4小结这题关键在于选择分支有点多,容易搞混,先减去年,年要区分闰年和普通年。
然后是月,月要区分大月小月,闰二月和普通二月,然后十二月要进年,同时月份归一。
最后是天数,天数进位要判断是大月、小月、闰二月、普通二月。
2求2个日期之间的天数2.1问题描述水题输入2个日期,日期按照年月日,年月日之间用符号-隔开(题目包含多组数据)输出求出这2个日期之间的天数(不包括自身),每组测试数据一行样例输入2011-1-12011-1-5样例输出3提示:为了简单之见,本题假设输入的是同年同月的2个日期,且第一个日期小于第2个日期。
2.2解题思路通过java.util.Date类的getTime()方法获得日期的毫秒数,然后相减date2.getTime() - date1.getTime(),得到毫秒数的差,除以1000,得到秒数的差;再除以60,得到分钟数的差;再除以60,得到小时数的差;再除以24小时,得到天数的差。
这就是计算两个日期之间相差天数的思路。
相差天数例子,开始日期为:2015-05-28 23:59:59,结束日期为:2015-05-29 00:00:00,相差为1秒,相差天数为0,开始日期为:2015-05-28 11:00:00,结束日期为:2015-05-29 10:59:59,相差天数也为0,差1秒,相差天数为1。
则由思路得以下代码。
2.3代码import java.util.*;import java.text.*;public class Main {public static void main(String[] args){try{Scanner scanner=new Scanner(System.in);while(scanner.hasNext()) {String date1=scanner.next();String date2=scanner.next();SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");Date date_1=dateFormat.parse(date1);Date date_2=dateFormat.parse(date2);longday=(date_2.getTime()-date_1.getTime())/(24*60*60*1000);System.out.println(day-1);}}catch (Exception e) {}}}2.4小结相隔并不是相差,只要是同一天,相隔就是0,不是同一天,相隔就不是0,但对于两日期相差的天数就不一样,不是同一天,相差天数也可以为0.如果用相差天数的思路求相隔天数必然是错的。
3再求多项式(含浮点)3.1问题描述输入一个整数n,计算1+1/(1-3)+1/(1-3+5)+...+1/(1-3+5-...+2n-1)的值输入输入一个整数n(多组数据)输出出1+1/(1-3)+1/(1-3+5)+...+1/(1-3+5-...+2n-1)的值,保留2位小数(每组数据一行)样例输入1样例输出1.003.2解题思路利用一个循环,从1到n,定义sum表示最终值。
由题意可知,在分母a中,当i为偶数时,a=a-(2*i+1);当分母a为奇数时,a=a+(2*i+1);然后只需要代码sum=sum+1/add即可得出最终值。
但这个题还要求保留2位小数所以要用format语句改变精度,而format又要用Double类来转换成数组才能用,所以要特别注意。
3.3代码import java.util.Scanner;public class Main {public static void main (String[] args){Scanner sc=new Scanner(System.in);while(sc.hasNext()){i nt n=sc.nextInt();double a=1;double sum=0;for( int i=1;i<=n;i++){ if(i%2!=0){a=a-(2*i+1);}else{a=a+(2*i+1);}sum=sum+1/a;}Double result=Double.valueOf(sum);Double d[]={result};System.out.println(String.format("%.2f", d));}}}3.4小结从这道题中得到一个很重要的教训,那就是做题之前一定要仔细看题,一定要明白题意了再做题,这样可以事半功倍。
当计算像这道题一样的算术题时,要先算分母,因为分母是多个数经过运算符组成的。
而且题目还要求要精确到2位小数,在JAVA里这个操作是比较麻烦的,这里需要注意。
43n+1问题4.1问题描述任给一个正整数n,如果n为偶数,就将它变为n/2,如果为奇数,则将它乘3加1(即3n+1)。